Ver Fonte

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

cs há 2 anos atrás
pai
commit
e3ae22afe4
64 ficheiros alterados com 24313 adições e 2921 exclusões
  1. 2 2
      fhKeeper/formulahousekeeper/inva_4_tivo/about.html
  2. 50 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/WebMvcConfig.java
  3. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LocaleInformationController.java
  4. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  5. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  6. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  7. 25 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  8. 4 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  9. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  10. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LocaleInformation.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LocaleInformationMapper.java
  12. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  13. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LocaleInformationService.java
  15. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  16. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  17. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  18. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LocaleInformationServiceImpl.java
  19. 219 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  20. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  21. 26 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  22. 106 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  23. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/MessageUtils.java
  24. 146 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SpringUtils.java
  25. 27 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TimeZoneUtil.java
  26. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  27. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  28. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  29. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  30. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_zh_CN.properties
  31. 10 11
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/logback.xml
  32. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  33. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LocaleInformationMapper.xml
  34. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  35. 33 10
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  36. 8529 0
      fhKeeper/formulahousekeeper/management-platform/workTime.2022-09-13.log
  37. 10200 0
      fhKeeper/formulahousekeeper/management-platform/workTime.log
  38. BIN
      fhKeeper/formulahousekeeper/management-platform/项目导入模板.xlsx
  39. 10 2
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  40. 952 3
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  41. 952 3
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  42. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  43. 200 200
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  44. 42 41
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  45. 179 180
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  46. 58 58
      fhKeeper/formulahousekeeper/timesheet/src/views/customer/list.vue
  47. 165 164
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  48. 164 164
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  49. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue
  50. 91 91
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  51. 19 19
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  52. 196 195
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  53. 406 402
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  54. 238 237
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  55. 86 85
      fhKeeper/formulahousekeeper/timesheet/src/views/provider/provider.vue
  56. 34 34
      fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue
  57. 161 160
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  58. 127 204
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  59. 289 291
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  60. 6 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  61. 39 39
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_import.vue
  62. 23 23
      fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue
  63. 257 246
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  64. 4 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

+ 2 - 2
fhKeeper/formulahousekeeper/inva_4_tivo/about.html

@@ -47,9 +47,9 @@
                         <ul class="navigationUl fonsColorBai aus">
                             <li class="til" id="productHov"><a href="./index.html">网站首页</a></li>
                             <li class="til"><a href="./index.html#customer"> 客户案例</a></li>
-                            <li class="til ons"><a href="./mobile.html">手机版</a></li>
+                            <li class="til"><a href="./mobile.html">手机版</a></li>
                             <li class="til"><a href="./index.html#pricing">产品定价</a></li>
-                            <li class="til"><a href="./about.html">关于我们</a></li>
+                            <li class="til ons"><a href="./about.html">关于我们</a></li>
                         </ul>
                     </div>
                 </div>

+ 50 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/WebMvcConfig.java

@@ -0,0 +1,50 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.CookieLocaleResolver;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+import java.util.Locale;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    /**
+     * 国际化配置
+     */
+    @Bean
+    public LocaleResolver localeResolver(){
+//		SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
+//		sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
+//		return sessionLocaleResolver;
+        //使用CookieLocaleResolver,也可使用SessionLocaleResolver,区别在于一个使用Cookie存储Locale信息,一个使用Session
+        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
+        localeResolver.setCookieName("localeCookie");
+        //设置默认区域
+        localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
+        localeResolver.setCookieMaxAge(3600);//设置cookie有效期.
+        return localeResolver;
+    }
+
+    /**
+     *
+     * 添加Locale 拦截器,从请求参数lang中获取参数值,这样我们可以通过lang RequestParam来切换Locale信息
+     */
+    @Bean
+    public LocaleChangeInterceptor localeChangeInterceptor(){
+        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
+        localeChangeInterceptor.setParamName("lang");
+        return localeChangeInterceptor;
+    }
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //添加locale拦截器
+        registry.addInterceptor(localeChangeInterceptor());
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LocaleInformationController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-15
+ */
+@RestController
+@RequestMapping("/locale-information")
+public class LocaleInformationController {
+
+}
+

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

@@ -1006,5 +1006,11 @@ public class ProjectController {
     public HttpRespMsg removeDuplicateParticipators(Integer companyId, HttpServletRequest request){
         return projectService.removeDuplicateParticipators(companyId,request);
     }
+
+    //todo 同步项目相关数据
+    @RequestMapping("/synchronizationProject")
+    public HttpRespMsg synchronizationProject(String dataJson){
+        return projectService.synchronizationProject(dataJson);
+    }
 }
 

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

@@ -1036,6 +1036,14 @@ public class ReportController {
                 e.printStackTrace();
             }
         }
+        //锁定工作时长的情况下, 如果当前是非工作日,要自动变成加班时长
+        if (comTimeType.getLockWorktime() == 1) {
+            if (!WorkDayCalculateUtils.isWorkDay(report.getCreateDate())) {
+                report.setIsOvertime(1);
+                report.setOvertimeHours(report.getWorkingTime());
+            }
+        }
+
         //如果设置了加班有工资并且当前存在加班的勾选,需要计算一下
         if (report.getIsOvertime() != null && report.getIsOvertime() == 1 && comTimeType.getPayOvertime()) {
             BigDecimal overtimeCost = hourCost.multiply(new BigDecimal(report.getOvertimeHours())).multiply(new BigDecimal(comTimeType.getOvertimeRatio()));
@@ -1319,5 +1327,9 @@ public class ReportController {
         return msg;
     }
 
+    @GetMapping("/getProcessErrorData")
+    public HttpRespMsg getProcessErrorData() {
+        return reportService.getProcessErrorData();
+    }
 }
 

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -190,6 +190,9 @@ public class TaskController {
             if(task.getEndDate()==null){
                 taskMapper.updateEndDate(task.getId());
             }
+            if(task.getFinishDate()==null){
+                taskMapper.updateFinishDate(task.getId());
+            }
         }
         System.out.println(task.getStartDate());
         System.out.println(task.getEndDate());
@@ -298,9 +301,13 @@ public class TaskController {
         if (task.getTaskStatus() == 0) {
             task.setTaskStatus(1);
             isFinishTask = true;
-            task.setFinishDate(LocalDate.now());
             //计算排序,需要移动到最后
             Task old = taskService.getById(task.getId());
+            if (old.getFinishDate() == null) {
+                //仅对没有完成日期的任务设置完成日期
+                task.setFinishDate(LocalDate.now());
+            }
+
             if (task.getParentTid() == null) {
                 QueryWrapper<Task> queryWrapper = new QueryWrapper<>();
                 queryWrapper.eq("stages_id", old.getStagesId()).isNull("parent_tid").orderByDesc("seq").last("limit 1");

+ 25 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -14,6 +14,7 @@ import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -60,6 +61,28 @@ public class TaskGroupController {
     @RequestMapping("/save")
     public HttpRespMsg save(TaskGroup item) {
         HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        //全公司唯一的分组编码
+        if (!StringUtils.isEmpty(item.getTaskGroupCode())) {
+            boolean hasSameGroupCode = false;
+            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id").eq("company_id", user.getCompanyId()));
+            List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
+            if (item.getId() == null) {
+                item.setNew(true);
+                int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>().eq("task_group_code", item.getTaskGroupCode()).in("project_id", collect));
+                hasSameGroupCode = cnt>0;
+            } else {
+                int cnt = taskGroupService.count(new QueryWrapper<TaskGroup>()
+                        .in("project_id", collect).eq("task_group_code", item.getTaskGroupCode())
+                        .ne("id", item.getId()));
+                hasSameGroupCode = cnt>0;
+            }
+            if (hasSameGroupCode) {
+                msg.setError("分组存在重名");
+                return msg;
+            }
+        }
         boolean hasSameName = false;
         if (item.getId() == null) {
             item.setNew(true);
@@ -126,7 +149,7 @@ public class TaskGroupController {
      * @return
      */
     @RequestMapping("/listMyJoinGroup")
-    public HttpRespMsg listMyJoinGroup(TaskGroup item) {
+    public HttpRespMsg listMyJoinGroup(TaskGroup item, @RequestParam(required = false, defaultValue = "0") Integer isSubstitude) {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         Integer projectId = item.getProjectId();
@@ -134,7 +157,7 @@ public class TaskGroupController {
         QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
         queryWrapper.eq("project_id", projectId);
         TimeType timeType = timeTypeMapper.selectById(project.getCompanyId());
-        if (timeType.getReportAuditType() == 0) {
+        if (timeType.getReportAuditType() == 0 || isSubstitude == 1) {
             msg.data = taskGroupService.list(queryWrapper);
         } else {
             List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("user_id", token));

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

@@ -374,7 +374,7 @@ public class WeiXinCorpController {
                     String corpId = jsonObject.getString("AuthCorpId");
                     String corpWxUserId = jsonObject.getString("UserID");
                     WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
                         Integer companyId = wxCorpInfo.getCompanyId();
                         SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
                         //通过通讯录secret获取到员工姓名
@@ -420,7 +420,7 @@ public class WeiXinCorpController {
                     WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
                     Integer companyId = wxCorpInfo.getCompanyId();
                     //只有授权通讯录同步的,才有机会更新部门或者上级
-                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                    if (!StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
                         String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
                         String curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
                         Integer curUserWXDeptid = 0;
@@ -480,7 +480,7 @@ public class WeiXinCorpController {
                     Integer deptId = jsonObject.getInt("Id");
                     Integer parentDeptId = jsonObject.getInt("ParentId");
                     WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-                    if (wxCorpInfo != null && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                    if (wxCorpInfo != null && !StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
                         String remoteCorpConcactAccessToken = getRemoteCorpConcactAccessToken(wxCorpInfo);
                         Integer companyId = wxCorpInfo.getCompanyId();
                         Department department = new Department();
@@ -505,7 +505,7 @@ public class WeiXinCorpController {
                     Integer deptId = jsonObject.getInt("Id");
                     Integer parentDeptId = jsonObject.getInt("ParentId");
                     WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-                    if (wxCorpInfo != null && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
+                    if (wxCorpInfo != null && !StringUtils.isEmpty(wxCorpInfo.getContactSecret()) && !StringUtils.isEmpty(wxCorpInfo.getContactSecret())) {
                         if (parentDeptId != null) {
                             //发生父部门的结构变化了
                             Department department = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_deptid", deptId));
@@ -535,13 +535,10 @@ public class WeiXinCorpController {
                                 System.err.println("同步获取部门详情报错:"+resultObj.toString());
                             }
                         }
-
                     }
-
                 }
             }
         } catch (Exception e) {
-            // TODO
             // 解密失败,失败原因请查看异常
             e.printStackTrace();
         }

+ 8 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-07-07
+ * @since 2022-09-15
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -50,7 +50,7 @@ public class Company extends Model<Company> {
     private LocalDateTime expirationDate;
 
     /**
-     * 选择的套餐(单位:/年)
+     * 是否签约
      */
     @TableField("set_meal")
     private Integer setMeal;
@@ -115,13 +115,18 @@ public class Company extends Model<Company> {
     @TableField("package_finance")
     private Integer packageFinance;
 
-
     /**
      * 供应商模块
      */
     @TableField("package_provider")
     private Integer packageProvider;
 
+    /**
+     * 是否是国际化版本
+     */
+    @TableField("is_international")
+    private Integer isInternational;
+
 
     @Override
     protected Serializable pkVal() {

+ 41 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LocaleInformation.java

@@ -0,0 +1,41 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class LocaleInformation extends Model<LocaleInformation> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("company_id")
+    private Integer companyId;
+
+    @TableField("language")
+    private String language;
+
+    @TableField("timezone")
+    private String timezone;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LocaleInformationMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.LocaleInformation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-15
+ */
+public interface LocaleInformationMapper extends BaseMapper<LocaleInformation> {
+
+}

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -137,5 +137,12 @@ public interface ReportMapper extends BaseMapper<Report> {
             "AND EXISTS(SELECT 1 FROM report r WHERE report.`creator_id` = r.creator_id AND report.`create_date` = r.create_date AND report.id <> r.id AND r.state = 0)\n" +
             "AND report.audit_dept_managerid IS NULL AND report.`company_id` = #{companyId}\n")
     List<Map<String, Object>> getErrorData(Integer companyId);
-
+    //获取审批流程中卡住的数据,项目审核过了,但是没有进入到部门审核,也没最终审核
+    @Select("SELECT report.id, user.name, create_date, creator_id, state, report.create_time, project_audit_time,u.name AS auditorName FROM report\n" +
+            "LEFT JOIN `user` ON user.id = report.`creator_id` \n" +
+            "LEFT JOIN `user` u ON u.id = report.`project_auditor_id`\n" +
+            "WHERE state = 0 AND project_audit_state = 1 AND is_dept_audit=0 AND is_final_audit=0 \n" +
+            "AND NOT EXISTS(SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date` AND r.project_audit_state = 0)\n" +
+            "AND EXISTS (SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date`)\n")
+    List<Map<String, Object>> getProcessErrorData();
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -49,4 +49,6 @@ public interface TaskMapper extends BaseMapper<Task> {
     void updateStartDate(Integer id);
     @Update("update task set end_date =null where id=#{id}")
     void updateEndDate(Integer id);
+    @Update("update task set finish_date =null where id=#{id}")
+    void updateFinishDate(Integer id);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LocaleInformationService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.LocaleInformation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-15
+ */
+public interface LocaleInformationService extends IService<LocaleInformation> {
+
+}

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

@@ -190,4 +190,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg fixParticipators(Integer companyId, HttpServletRequest request);
 
     HttpRespMsg removeDuplicateParticipators(Integer companyId, HttpServletRequest request);
+
+    HttpRespMsg synchronizationProject(String dataJson);
 }

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

@@ -90,4 +90,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg getWeeklyCardTime(String dateStr, HttpServletRequest request);
 
     HttpRespMsg getWeeklyWorkTime(String dateStr, HttpServletRequest request);
+
+    HttpRespMsg getProcessErrorData();
 }

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

@@ -578,6 +578,14 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
                         List<Integer> otherCollect = departmentOtherManagerList.stream().distinct().map(dom -> dom.getDepartmentId()).collect(Collectors.toList());
                         collect.addAll(otherCollect);
                         deptIds.addAll(collect);
+                        //获取子部门
+                        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                        List<Integer> allSubDepts = new ArrayList<>();
+                        for (Integer deptId : deptIds) {
+                            List<Integer> ids = getBranchDepartment(deptId, allDeptList);
+                            allSubDepts.addAll(ids);
+                        }
+                        deptIds.addAll(allSubDepts);
                     }
                 }
             }

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LocaleInformationServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.LocaleInformation;
+import com.management.platform.mapper.LocaleInformationMapper;
+import com.management.platform.service.LocaleInformationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-15
+ */
+@Service
+public class LocaleInformationServiceImpl extends ServiceImpl<LocaleInformationMapper, LocaleInformation> implements LocaleInformationService {
+
+}

+ 219 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1,16 +1,27 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.*;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
@@ -164,6 +175,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     OperationRecordService operationRecordService;
     @Resource
     ProjectBasecostService projectBasecostService;
+    @Resource
+    ThirdPartyInterfaceService thirdPartyInterfaceService;
+    @Resource
+    ProjectSeparateService projectSeparateService;
 
 
     @Resource
@@ -973,11 +988,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return m;
     }
 
-    public static void main(String[] args) {
-        String startDate = "2020-12-01";
-        String endDate = "2021-01-31";
-    }
-
     private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         list.add(departmentId);
@@ -2740,11 +2750,130 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             allList.add(sumRow);
             //生成excel文件导出
             String fileName = "加班统计报表_"+System.currentTimeMillis();
-            String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
+
+            //按照项目统计
+            List<List<String>> groupByProjectList = new ArrayList<>();
+            headList = new ArrayList<String>();
+            headList.add("序号");
+            headList.add("项目编号");
+            headList.add("项目名称");;
+            headList.add("工作时长(h)");
+            headList.add("加班工时(h)");
+            if (hasViewSalary) {
+                headList.add("加班成本(元)");
+            }
+            groupByProjectList.add(headList);
+            List<Map<String, Object>> byProjectList = new ArrayList<>();
+            for (Map<String, Object> map : list) {
+                Integer curProId = (Integer) map.get("projectId");
+                Optional<Map<String, Object>> find = byProjectList.stream().filter(pro -> pro.get("projectId").equals(curProId)).findFirst();
+                if (find.isPresent()) {
+                    //项目已存储,叠加工时数据
+                    Map oldItem = find.get();
+                    double workingTime = ((Double)map.get("workingTime"));
+                    double overtimeHours = ((Double)map.get("overtimeHours"));
+                    BigDecimal cost = (BigDecimal)map.get("cost");
+                    oldItem.put("workingTime", (Double)oldItem.get("workingTime") + workingTime);
+                    oldItem.put("overtimeHours", (Double)oldItem.get("overtimeHours") + overtimeHours);
+                    oldItem.put("cost", ((BigDecimal)oldItem.get("cost")).add(cost));
+                } else {
+                    Map<String, Object> itemMap = new HashMap<>();
+                    itemMap.putAll(map);
+                    byProjectList.add(itemMap);
+                }
+            }
+            seq = 1;
+            for (Map<String, Object> map : byProjectList) {
+                List<String> rowData = new ArrayList<String>();
+                rowData.add(""+seq);
+                rowData.add((String)map.get("projectCode"));
+                rowData.add((String)map.get("projectName"));
+                rowData.add(((Double)map.get("workingTime")).toString());
+                rowData.add(((Double)map.get("overtimeHours")).toString());
+                if (hasViewSalary) {
+                    rowData.add(((BigDecimal)map.get("cost")).toString());
+                }
+                groupByProjectList.add(rowData);
+                seq++;
+            }
+            //合计
+            List<String> sumRowProject = new ArrayList<String>();
+            sumRowProject.add("合计");
+            sumRowProject.add("");
+            sumRowProject.add("");
+            sumRowProject.add(""+df.format(totalWorkTime));
+            sumRowProject.add(""+df.format(totalCostTime));
+            if (hasViewSalary) {
+                sumRowProject.add(total);
+            }
+            groupByProjectList.add(sumRowProject);
+            //按照人员统计
+            List<List<String>> groupByMembList = new ArrayList<>();
+            headList = new ArrayList<String>();
+            headList.add("序号");
+            headList.add("姓名");
+            headList.add("工作时长(h)");
+            headList.add("加班工时(h)");
+            if (hasViewSalary) {
+                headList.add("加班成本(元)");
+            }
+            groupByMembList.add(headList);
+            List<Map<String, Object>> byMembList = new ArrayList<>();
+            for (Map<String, Object> map : list) {
+                String curUserId = (String) map.get("userId");
+                Optional<Map<String, Object>> find = byMembList.stream().filter(memb -> memb.get("userId").equals(curUserId)).findFirst();
+                if (find.isPresent()) {
+                    //人员已存储,叠加工时数据
+                    Map oldItem = find.get();
+                    double workingTime = ((Double)map.get("workingTime"));
+                    double overtimeHours = ((Double)map.get("overtimeHours"));
+                    BigDecimal cost = (BigDecimal)map.get("cost");
+                    oldItem.put("workingTime", (Double)oldItem.get("workingTime") + workingTime);
+                    oldItem.put("overtimeHours", (Double)oldItem.get("overtimeHours") + overtimeHours);
+                    oldItem.put("cost", ((BigDecimal)oldItem.get("cost")).add(cost));
+                } else {
+                    Map<String, Object> itemMap = new HashMap<>();
+                    itemMap.putAll(map);
+                    byMembList.add(map);
+                }
+            }
+            seq = 1;
+            for (Map<String, Object> map : byMembList) {
+                List<String> rowData = new ArrayList<String>();
+                rowData.add(""+seq);
+                rowData.add((String)map.get("username"));
+                rowData.add(((Double)map.get("workingTime")).toString());
+                rowData.add(((Double)map.get("overtimeHours")).toString());
+                if (hasViewSalary) {
+                    rowData.add(((BigDecimal)map.get("cost")).toString());
+                }
+                groupByMembList.add(rowData);
+                seq++;
+            }
+            //合计
+            List<String> sumRowMemb = new ArrayList<String>();
+            sumRowMemb.add("合计");
+            sumRowMemb.add("");
+            sumRowMemb.add(""+df.format(totalWorkTime));
+            sumRowMemb.add(""+df.format(totalCostTime));
+            if (hasViewSalary) {
+                sumRowMemb.add(total);
+            }
+            groupByMembList.add(sumRowMemb);
+            List[] totalList = new ArrayList[3];
+            totalList[0] = allList;
+            totalList[1] = groupByProjectList;
+            totalList[2] = groupByMembList;
+            String[] sheetNames = new String[3];
+            sheetNames[0] = "加班情况明细表";
+            sheetNames[1] = "按项目统计";
+            sheetNames[2] = "按人员统计";
+            String resp = ExcelUtil.exportMultiSheetGeneralExcelByTitleAndList(fileName , totalList, path, sheetNames);
 
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {
-            httpRespMsg.setError("验证失败");
+            httpRespMsg.setError("验证失败"+e.getMessage());
+            e.printStackTrace();
             return httpRespMsg;
         }
         return httpRespMsg;
@@ -2983,7 +3112,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (participationList.size() > 0) {
                         //批量保存
                         List<Participation> finalOldPartList = oldPartList;
-                        List<Participation> addPartList = participationList.stream().filter(newP-> finalOldPartList.stream().anyMatch(oldP->oldP.getUserId().equals(newP.getUserId()))).collect(Collectors.toList());
+                        List<Participation> addPartList = participationList.stream().filter(newP-> !finalOldPartList.stream().anyMatch(oldP->oldP.getUserId().equals(newP.getUserId()))).collect(Collectors.toList());
                         if (addPartList.size() > 0) {
                             participationService.saveBatch(addPartList);
                         }
@@ -5298,6 +5427,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }else{
                     divide=new BigDecimal(0);
                 }
+                if(divide.compareTo(new BigDecimal(1))==1){
+                    divide=new BigDecimal(1);
+                    log.error("填报及时率数据异常:==="+user.getName());
+                }
                 String number = dft.format(divide);
                 timelinessRateVO.setTimelinessRate(String.valueOf(number));
             }
@@ -6333,6 +6466,84 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg synchronizationProject(String dataJson) {
+        JSONObject jsonObject = JSON.parseObject(dataJson);
+        JSONObject header = (JSONObject) jsonObject.get("header");
+        String token = String.valueOf(header.get("token"));
+        List<Project> projectList = JSON.parseArray(String.valueOf(jsonObject.get("projectArrays")), Project.class);
+        List<ProjectSeparate> projectSeparateList = JSON.parseArray(String.valueOf(jsonObject.get("projectSeparateArrays")), ProjectSeparate.class);
+        HttpRespMsg msg=new HttpRespMsg();
+        List<ThirdPartyInterface> thirdPartyInterfaceList = thirdPartyInterfaceService.list(new QueryWrapper<ThirdPartyInterface>().eq("token", token));
+        if(thirdPartyInterfaceList.size()==0){
+            msg.setError("token错误");
+            return msg;
+        }
+        ThirdPartyInterface thirdPartyInterface = thirdPartyInterfaceList.get(0);
+        if(LocalDateTime.now().isAfter(thirdPartyInterface.getExpireTime())){
+            msg.setError("token过期失效");
+            return msg;
+        }
+        List<Project> allProject = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", thirdPartyInterface.getCompanyId()));
+        String message="";
+        if(projectList!=null &&projectList.size()>0){
+            List<Project> changeProjectList=new ArrayList<>();
+            for (Project project : projectList) {
+                Optional<Project> first = allProject.stream().filter(ap -> ap.getProjectCode().equals(project.getProjectCode())).findFirst();
+                if(first.isPresent()){
+                    project.setId(first.get().getId());
+                    changeProjectList.add(project);
+                }
+            }
+            if(updateBatchById(changeProjectList)){
+                message+="成功更新"+changeProjectList.size()+"条项目数据";
+            }
+        }
+        if(projectSeparateList!=null&&projectSeparateList.size()>0){
+            if(projectSeparateService.updateBatchById(projectSeparateList)){
+                message+="成功更新"+projectSeparateList.size()+"条项目子表数据";
+            }
+        }
+        msg.data=message;
+        return msg;
+    }
+
+    public static void main(String[] args) {
+        Map params = new HashMap<>();
+        Map paramDataJson = new HashMap<>();
+        JSONArray projectArrays= new JSONArray();
+        Map header=new HashMap();
+        header.put("token","123456789");
+        paramDataJson.put("header",header);
+        JSONObject project=new JSONObject();
+        project.put("id",246);
+        project.put("projectName",1000);
+        projectArrays.add(project);
+        paramDataJson.put("projectArrays",projectArrays);
+        params.put("dataJson",paramDataJson);
+        //装填参数
+        List nvps = new ArrayList();
+        if(params!=null){
+            params.forEach((key, value) -> nvps.add(new BasicNameValuePair((String) key, JSONObject.toJSONString(value))));
+        }
+        System.out.println(nvps);
+        CloseableHttpResponse response;// 响应类
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost=new HttpPost("http://localhost:10010/project/synchronizationProject");
+        httpPost.addHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
+        try {
+            httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
+            response = httpClient.execute(httpPost);
+            if (response != null && response.getEntity() != null) {
+                //返回信息
+                String resulString = EntityUtils.toString(response.getEntity());
+                //todo 这里处理返回信息
+                System.out.println("成功"+ resulString);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
     private List<Department> getSubDepts(Department dp, List<Department> list) {
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());

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

@@ -4190,6 +4190,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg getProcessErrorData() {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = reportMapper.getProcessErrorData();
+        return msg;
+    }
+
     private void selfUpdateToNextWorkFlow(Integer companyId, User auditTargetUser, List<Integer> targetRids, List<Department> allDepts) {
         List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(
                 new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId)

+ 26 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -137,6 +137,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private ExpenseTypeService expenseTypeService;
     @Resource
     private DepartmentOtherManagerMapper departmentOtherManagerMapper;
+    @Resource
+    private LocaleInformationMapper localeInformationMapper;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -145,12 +147,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("phone", username));
         if (userList.size() == 0) {
             //未检索到账号时
-            httpRespMsg.setError("账号未注册");
+            String noUser = MessageUtils.message("user.notExists");
+            System.out.println(noUser);
+            httpRespMsg.setError(noUser);
         } else if (userList.size() > 1) {
             //检索到两个及以上账号时
-            httpRespMsg.setError("账号重名");
+            httpRespMsg.setError(MessageUtils.message("user.duplicate"));
         } else if (userList.get(0).getIsActive() == 0) {
-            httpRespMsg.setError("该账户已停用,无法登陆。请联系管理员");
+            httpRespMsg.setError(MessageUtils.message("user.inactive"));
         } else if (MD5Util.getPassword(password).equals(userList.get(0).getPassword())) {
             //查看该公司非会员公司,只能允许试用三天,超时不可登录
             Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", userList.get(0).getCompanyId()));
@@ -159,12 +163,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 if (0 == company.getSetMeal()) {
                     //未办理会员
                     if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
-                        httpRespMsg.setError("账号试用已到期,请联系客服。");
+                        httpRespMsg.setError(MessageUtils.message("user.accountExpired"));
                         return httpRespMsg;
                     }
                 } else {
                     if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
-                        httpRespMsg.setError("账号会员已到期,请联系客服。");
+                        httpRespMsg.setError(MessageUtils.message("user.accountExpired"));
                         return httpRespMsg;
                     }
                 }
@@ -174,7 +178,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             userVO.setCompany(company);
             BeanUtils.copyProperties(userList.get(0), userVO);
             if (userVO.getRoleId() == null || userVO.getRoleId() == 0) {
-                httpRespMsg.setError("请先联系管理员为您分配角色");
+                httpRespMsg.setError(MessageUtils.message("user.noRole"));
                 return httpRespMsg;
             }
             //还要多返回一个公司名字
@@ -198,7 +202,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
             httpRespMsg.data = userVO;
         } else {
-            httpRespMsg.setError("密码错误");
+            httpRespMsg.setError(MessageUtils.message("user.pwdError"));
         }
         return httpRespMsg;
     }
@@ -367,7 +371,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(id);
         if (user == null) {
-            httpRespMsg.setError("未查询到用户信息");
+            httpRespMsg.setError(MessageUtils.message("user.notExists"));
         } else {
             Department dp = departmentMapper.selectById(user.getDepartmentId());
             if (dp != null) {
@@ -450,6 +454,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     u.put("plateMap",map);
                 }
             }
+            if (companyMapper.selectById(companyId).getIsInternational() == 1) {
+                //国际化版本
+                LocaleInformation locale = localeInformationMapper.selectById(companyId);
+                TimeZone curZone = TimeZone.getTimeZone(locale.getTimezone());
+                int offsetSeconds = (curZone.getRawOffset() - TimeZone.getTimeZone("GMT+8").getRawOffset())/1000;
+                //时区转换,默认数据库存的是GMT+8
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.CHINA);
+                for (Map user : list) {
+                    String createTime = (String)user.get("createTime");
+                    LocalDateTime time = LocalDateTime.parse(createTime, dtf);
+                    time = time.plusSeconds(offsetSeconds);
+                    user.put("createTime", dtf.format(time));
+                }
+            }
             resultMap.put("records", list);
             resultMap.put("total", total);
             httpRespMsg.data = resultMap;

+ 106 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -154,13 +154,6 @@ public class ExcelUtil {
         String result="系统提示:Excel文件导出成功!";
         String fileName= title+".xls";
         try {
-//            response.reset();
-//            response.setHeader("Content-disposition",
-//                "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
-//            //设置文件头编码格式
-//            response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");//设置类型
-//            response.setHeader("Cache-Control","no-cache");//设置头
-//            response.setDateHeader("Expires", 0);//设置日期头
             // 创建工作簿
             HSSFWorkbook workBook = new HSSFWorkbook();
             // 创建工作类
@@ -280,15 +273,8 @@ public class ExcelUtil {
                     start++;
                 }
             }
-            //用于非传统ajax;
-//            String headStr = "attachment; filename=\"" + fileName + "\"";
-//            response.setContentType("APPLICATION/OCTET-STREAM");//返回格式为流
-//            response.setHeader("Content-Disposition", headStr);
-//            //普通下载不需要以上三行,注掉即可
-//            OutputStream os = response.getOutputStream();//在线下载
             File dir = null;
             dir = new File(downloadPath);
-            // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
             if (!dir.exists()) {
                 dir.mkdirs();
             }
@@ -301,7 +287,112 @@ public class ExcelUtil {
             e.printStackTrace();
         }
         return "/upload/"+fileName;
-//        return "";
+    }
+
+    public static String exportMultiSheetGeneralExcelByTitleAndList(String title, List<List<String>>[] multiSheetList, String downloadPath,String[] sheetsName) {
+        String result="系统提示:Excel文件导出成功!";
+        String fileName= title+".xls";
+        try {
+            // 创建工作簿
+            HSSFWorkbook workBook = new HSSFWorkbook();
+            // 创建工作类
+            for (int sheetIndex=0;sheetIndex<multiSheetList.length; sheetIndex++) {
+                HSSFSheet sheetOne = workBook.createSheet();
+                workBook.setSheetName(sheetIndex,sheetsName[sheetIndex]);
+                sheetOne.setDefaultColumnWidth(16);
+
+                //设置字体样式
+                HSSFFont headFont = workBook.createFont();
+                headFont.setBold(true);
+                headFont.setFontHeightInPoints((short) 10);
+                headFont.setFontName("黑体");
+
+                HSSFFont titleFont = workBook.createFont();
+                titleFont.setBold(true);
+                titleFont.setFontHeightInPoints((short) 10);
+                titleFont.setFontName("黑体");
+
+                HSSFFont font = workBook.createFont();
+                font.setFontHeightInPoints((short) 10);
+                font.setFontName("宋体");
+
+                //设置单元格样式
+                CellStyle headStyle = workBook.createCellStyle();
+                headStyle.setFont(headFont);
+                headStyle.setAlignment(HorizontalAlignment.CENTER);
+                headStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+                headStyle.setWrapText(true);
+                headStyle.setBorderBottom(BorderStyle.THIN); //下边框
+                headStyle.setBorderLeft(BorderStyle.THIN);//左边框
+                headStyle.setBorderTop(BorderStyle.THIN);//上边框
+                headStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+                String color = "c0c0c0";    //此处得到的color为16进制的字符串
+                //转为RGB码
+                int r = Integer.parseInt((color.substring(0,2)),16);   //转为16进制
+                int g = Integer.parseInt((color.substring(2,4)),16);
+                int b = Integer.parseInt((color.substring(4,6)),16);
+
+                //自定义cell颜色
+                HSSFPalette palette = workBook.getCustomPalette();
+                //这里的9是索引
+                palette.setColorAtIndex((short)9, (byte) r, (byte) g, (byte) b);
+
+                CellStyle titleStyle = workBook.createCellStyle();
+                titleStyle.setFont(titleFont);
+                titleStyle.setAlignment(HorizontalAlignment.CENTER);
+                titleStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+                titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);  //填充单元格
+                titleStyle.setFillForegroundColor((short)9);    //填色
+                titleStyle.setWrapText(true);
+                titleStyle.setBorderBottom(BorderStyle.THIN); //下边框
+                titleStyle.setBorderLeft(BorderStyle.THIN);//左边框
+                titleStyle.setBorderTop(BorderStyle.THIN);//上边框
+                titleStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+                CellStyle cellStyle = workBook.createCellStyle();
+                cellStyle.setFont(font);
+                cellStyle.setAlignment(HorizontalAlignment.CENTER);
+                cellStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+                cellStyle.setWrapText(true);
+                cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
+                cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
+                cellStyle.setBorderTop(BorderStyle.THIN);//上边框
+                cellStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+                if(multiSheetList[sheetIndex].size() > 0) {
+                    int start = 0;
+                    for(List<String> rowList : multiSheetList[sheetIndex]) {
+                        HSSFRow row = sheetOne.createRow(start);
+                        row.setHeightInPoints(24);
+                        for(int i = 0; i < rowList.size(); i++) {
+                            HSSFCell cell = row.createCell(i);
+                            if(start == 0) {
+                                cell.setCellStyle(titleStyle);
+                            }else {
+                                cell.setCellStyle(cellStyle);
+                            }
+                            cell.setCellValue(rowList.get(i));
+                        }
+                        start++;
+                    }
+                }
+            }
+
+
+            File dir = new File(downloadPath);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            FileOutputStream os = new FileOutputStream(downloadPath+fileName);//保存到本地
+            workBook.write(os);
+            os.flush();
+            os.close();
+        }catch(Exception e) {
+            System.out.println(result);
+            e.printStackTrace();
+        }
+        return "/upload/"+fileName;
     }
 
     public static boolean isRowEmpty(Row row){

+ 24 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/MessageUtils.java

@@ -0,0 +1,24 @@
+package com.management.platform.util;
+
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+/**
+ * 获取i18n资源文件
+ *
+ */
+public class MessageUtils {
+
+    /**
+     * 根据消息键和参数 获取消息 委托给spring messageSource
+     * @param code 消息键
+     * @param args 参数
+     * @return 获取国际化翻译值
+     */
+    public static String message(String code, Object... args) {
+        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
+        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+    }
+
+}

+ 146 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SpringUtils.java

@@ -0,0 +1,146 @@
+package com.management.platform.util;
+
+import io.micrometer.core.instrument.util.StringUtils;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring工具类 方便在非spring管理环境中获取bean
+ *
+ * @author xq0136
+ */
+@Component
+public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
+{
+    /** Spring应用上下文环境 */
+    private static ConfigurableListableBeanFactory beanFactory;
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
+    {
+        SpringUtils.beanFactory = beanFactory;
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
+    {
+        SpringUtils.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取对象
+     *
+     * @param name
+     * @return Object 一个以所给名字注册的bean的实例
+     * @throws BeansException
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException
+    {
+        return (T) beanFactory.getBean(name);
+    }
+
+    /**
+     * 获取类型为requiredType的对象
+     *
+     * @param clz
+     * @return
+     * @throws BeansException
+     *
+     */
+    public static <T> T getBean(Class<T> clz) throws BeansException
+    {
+        T result = (T) beanFactory.getBean(clz);
+        return result;
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name)
+    {
+        return beanFactory.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name
+     * @return
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getAliases(name);
+    }
+
+    /**
+     * 获取aop代理对象
+     *
+     * @param invoker
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getAopProxy(T invoker)
+    {
+        return (T) AopContext.currentProxy();
+    }
+
+    /**
+     * 获取当前的环境配置,无配置返回null
+     *
+     * @return 当前的环境配置
+     */
+    public static String[] getActiveProfiles()
+    {
+        return applicationContext.getEnvironment().getActiveProfiles();
+    }
+
+    /**
+     * 获取当前的环境配置,当有多个环境配置时,只获取第一个
+     *
+     * @return 当前的环境配置
+     */
+    public static String getActiveProfile()
+    {
+        final String[] activeProfiles = getActiveProfiles();
+        return (activeProfiles != null && activeProfiles.length > 0) ? activeProfiles[0] : null;
+    }
+}

+ 27 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TimeZoneUtil.java

@@ -0,0 +1,27 @@
+package com.management.platform.util;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class TimeZoneUtil {
+
+    public static void main(String[] args) {
+        System.out.println(Arrays.toString(TimeZone.getAvailableIDs()));
+        System.out.println(TimeZone.getDefault());
+        System.out.println(TimeZone.getTimeZone("GMT+08:00"));
+
+        TimeZone timeZone = TimeZone.getTimeZone("Europe/London");
+        System.out.println(1.0*timeZone.getRawOffset()/3600/1000);
+        double timeValue = 1.0*timeZone.getRawOffset()/3600/1000;
+        String hourValue = (timeValue>0?"+":"")+(int)timeValue;
+        int minInt = Math.abs((int)((timeValue - (int)timeValue)*60));
+        String minValue = (minInt<10?"0":"")+minInt;
+        System.out.println("GMT"+hourValue + ":"+ minValue);
+        System.out.println(timeZone.getDisplayName()); // 中国标准时间
+        System.out.println(timeZone.getDisplayName(Locale.ENGLISH)); // China Standard Time
+    }
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java

@@ -69,7 +69,7 @@ public class WorkDayCalculateUtils {
                 "2022-04-04","2022-04-05",//清明节
                 "2022-05-02","2022-05-03","2022-05-04",//劳动节
                 "2022-06-03",//端午节
-                "2022-09-20","2022-09-21",//中秋节
+                "2022-09-12",//中秋节
                 "2022-10-01", "2022-10-02","2022-10-03","2022-10-04","2022-10-05","2022-10-06","2022-10-07",//国庆节
         });
         YEAR_DEFINE.put("2022", map2022);

+ 5 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:3306/man_bk?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: HuoshiDB@2022
     hikari:
@@ -47,7 +47,9 @@ spring:
     default-property-inclusion: ALWAYS
     time-zone: GMT+8
     date-format: yyyy-MM-dd HH:mm:ss
-
+  messages:
+    basename: i18n.messages #配置国际化资源文件路径
+    encoding: UTF-8
 ##########日志配置
 logging:
   level:
@@ -129,7 +131,7 @@ referer:
     - mldworktime.ttkuaiban.com
     - gs.farben.com.cn
     - 47.101.180.183
-excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/report/getReportListByToken
+excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/report/getReportListByToken,/report/getProcessErrorData
 
 #企业微信相关参数
 suitId: ww4e237fd6abb635af

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -0,0 +1,7 @@
+# 用户相关信息
+user.notExists=用户不存在
+user.duplicate=账号重名
+user.inactive=该账户已停用,无法登陆。请联系管理员
+user.accountExpired=账号试用已到期,请联系客服。
+user.noRole=请先联系管理员为您分配角色
+user.pwdError=密码错误

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -0,0 +1 @@
+user.notExists=user does not exist

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_zh_CN.properties

@@ -0,0 +1 @@
+user.notExists=用户不存在

+ 10 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/resources/logback.xml

@@ -3,7 +3,7 @@
     <!-- 日志存放路径 ./表示当前运行目录-->
 	<property name="log.path" value="./" />
     <!-- 日志输出格式 -->
-	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+	<property name="log.pattern" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
 	<!-- 控制台输出 -->
 	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
@@ -18,21 +18,21 @@
         <!-- 循环政策:基于时间创建日志文件 -->
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-			<fileNamePattern>${log.path}/workTime.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>2</maxHistory>
+			<fileNamePattern>${log.path}/workTime.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+			<!-- 日志最大的历史 2天 -->
+			<maxHistory>7</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
 		</encoder>
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <!-- 过滤的级别 -->
+<!--	<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            &lt;!&ndash; 过滤的级别 &ndash;&gt;
             <level>DEBUG</level>
-            <!-- 匹配时的操作:接收(记录) -->
+            &lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;
             <onMatch>ACCEPT</onMatch>
-            <!-- 不匹配时的操作:拒绝(不记录) -->
+            &lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;
             <onMismatch>DENY</onMismatch>
-        </filter>
+        </filter>-->
 	</appender>
 	
 	<!--<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -49,7 +49,7 @@
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             &lt;!&ndash; 过滤的级别 &ndash;&gt;
-            <level>ERROR</level>
+            <level>DEBUG</level>
 			&lt;!&ndash; 匹配时的操作:接收(记录) &ndash;&gt;
             <onMatch>ACCEPT</onMatch>
 			&lt;!&ndash; 不匹配时的操作:拒绝(不记录) &ndash;&gt;
@@ -83,7 +83,6 @@
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="file_info" />
-        <!--<appender-ref ref="file_error" />-->
     </root>
 	
 	<!--系统用户操作日志-->

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

@@ -20,11 +20,12 @@
         <result column="package_simple" property="packageSimple" />
         <result column="package_finance" property="packageFinance" />
         <result column="package_provider" property="packageProvider" />
+        <result column="is_international" property="isInternational" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, is_international
     </sql>
 
 </mapper>

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LocaleInformationMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.LocaleInformationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.LocaleInformation">
+        <id column="company_id" property="companyId" />
+        <result column="language" property="language" />
+        <result column="timezone" property="timezone" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, language, timezone
+    </sql>
+
+</mapper>

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

@@ -644,7 +644,7 @@
     <select id="getOvertimeDetail" resultType="java.util.Map">
         SELECT date_format(report.`create_date`, '%Y-%m-%d') AS createDate,
         report.`creator_id` AS userId, user.`name` AS username, report.`working_time` AS workingTime,
-        IFNULL(report.`overtime_hours`, 0) AS overtimeHours,
+        IFNULL(report.`overtime_hours`, 0) AS overtimeHours,project.id as projectId,
         project.project_name as projectName,project.project_code as projectCode,
         IFNULL(report.overtime_cost, 0) AS cost,
         IFNULL(report_extra_degree.name,'') as degreeName, department.department_name as departmentName FROM report LEFT JOIN user ON user.id = report.`creator_id`

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

@@ -73,9 +73,16 @@
         left join user u on u.id = a.project_auditor_id
         left join department on department.department_id = c.department_id
         left join project_main on b.project_main_id=project_main.id
-        WHERE (a.state = 1
-        <if test="stateKey!=null and stateKey==1">
-            or a.state =0
+        WHERE (<if test="stateKey == null or stateKey == 0">
+        a.state = 1
+    </if>
+        <if test="stateKey!=null">
+            <if test="stateKey==1">
+                a.state = 1 or a.state=0
+            </if>
+            <if test="stateKey==2">
+                a.state=0
+            </if>
         </if>)
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -148,9 +155,16 @@
         left join department on department.department_id = c.department_id
         left join project_main on project_main.id=b.project_main_id
         WHERE
-        (a.state = 1
-        <if test="stateKey!=null and stateKey==1">
-            or a.state=0
+        (<if test="stateKey == null or stateKey == 0">
+        a.state = 1
+    </if>
+        <if test="stateKey!=null">
+            <if test="stateKey==1">
+                a.state = 1 or a.state=0
+            </if>
+            <if test="stateKey==2">
+                a.state=0
+            </if>
         </if>)
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
@@ -187,10 +201,19 @@
         left join user u on u.id = a.project_auditor_id
         left join department on department.department_id = c.department_id
         left join project_main on project_main.id=b.project_main_id
-        WHERE (a.state = 1
-        <if test="stateKey!=null and stateKey==1">
-            or a.state=0
-        </if>)
+        WHERE (
+        <if test="stateKey == null or stateKey == 0">
+        a.state = 1
+        </if>
+        <if test="stateKey!=null">
+            <if test="stateKey==1">
+                a.state = 1 or a.state=0
+            </if>
+            <if test="stateKey==2">
+                a.state=0
+            </if>
+        </if>
+        )
         <if test="startDate != null and startDate != ''">
             AND a.create_date between #{startDate} and #{endDate}
         </if>

Diff do ficheiro suprimidas por serem muito extensas
+ 8529 - 0
fhKeeper/formulahousekeeper/management-platform/workTime.2022-09-13.log


Diff do ficheiro suprimidas por serem muito extensas
+ 10200 - 0
fhKeeper/formulahousekeeper/management-platform/workTime.log


BIN
fhKeeper/formulahousekeeper/management-platform/项目导入模板.xlsx


+ 10 - 2
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -65,7 +65,7 @@
                 <template slot-scope="scope">
                     <el-button size="mini"  @click="editClick('A', scope.row)">增加人数</el-button>
                     <el-button size="mini"  @click="editClick('B', scope.row)">修改有效期</el-button>
-                    <el-button size="mini"  @click="editClick('F', scope.row)" :disabled="!(scope.row.dingdingCorpid || scope.row.wxCorpid)">考勤同步</el-button>
+                    <el-button size="mini"  @click="editClick('F', scope.row)" :disabled="!(scope.row.dingdingCorpid || scope.row.wxCorpid)">考勤同步设置</el-button>
                     <el-button size="mini"  @click="editClick('C', scope.row)">修改版本</el-button>
                     <el-button size="mini"  @click="editClick('D', scope.row)" :disabled="scope.row.setMeal">设为已签约</el-button>
                     <el-button size="mini"  @click="editClick('G', scope.row)">其他设置</el-button>
@@ -675,7 +675,15 @@
                 for(let m in this.roleIdArr){
                     roleIds += this.roleIdArr[m] + ','
                 }
-                if(roleIds){roleIds = roleIds.substring(0,roleIds.length - 1)}
+                if(roleIds){
+                    roleIds = roleIds.substring(0,roleIds.length - 1)
+                }else{
+                    this.$message({
+                        message: '请选择要开通的角色',
+                        type: 'error'
+                    })
+                    return
+                }
                 this.http.post('/company-report/update',{
                     companyId: this.dialogData.id,
                     formIds: ids,

+ 952 - 3
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -52,7 +52,10 @@
     "completed": "completed",
     "tried": "tried",
     "untrial": "untrial",
-    "undone": "undone"
+    "undone": "undone",
+    "yes": "yes",
+    "no": "no",
+    "alreadyPassedAndWaitingAudit": "already passed and Waiting audit"
   },
   "time": {
     "dueDate": "Due date",
@@ -239,7 +242,7 @@
     "allProject": "All project",
     "selectdepartment": "Select department",
     "allDepartments": "All departments",
-    "doesItContain": "Does it contain",
+    "doesItContain": "Status of Report",
     "doesNotIncludeUnreviewed": "Does not include unreviewed",
     "containsUnreviewed": "contains unreviewed",
     "laborStatisticsExport": "Labor Statistics Export",
@@ -362,5 +365,951 @@
   "details": "Details",
   "yourdecisiontorevoke": "Please enter the reason for your decision to withdraw",
   "enterapassrating": "Please enter a pass rating",
-  "Revocationofsuccess": "Undo succeeded"
+  "Revocationofsuccess": "Undo succeeded",
+  "Selectmonth": "select month",
+  "projectworker": "Personnel without project hours",
+  "Apportionmentratesetting": "Apportionment ratio settings",
+  "Downloadthetemplate": "Template download",
+  "Dataupload": "data upload",
+  "Exportdata": "Data output",
+  "Customizesalaryitems": "custom salary item",
+  "Setupauditor": "Set up moderators",
+  "Salaryuploadrecord": "Salary upload record",
+  "BelongsIn": "month",
+  "filename": "file name",
+  "Whetherdailycostiscovered": "Whether to cover daily costs",
+  "Whethermonthlypersonnelcostiscovered": "Whether to cover the monthly cost of personnel",
+  "Uploadtime": "Upload time",
+  "SelectionofAuditor": "Select reviewer",
+  "reviewercannotbeempty": "Reviewer cannot be empty",
+  "Exportoffinancialdata": "Financial data export",
+  "Intheexport": "export month",
+  "Worknumber": "Job number",
+  "totalcost": "total cost",
+  "Batchdelete": "batch deletion",
+  "Apportionmentofpersonnelcosts": "Allocate staff costs for hours filled",
+  "Spreadallpersonnelcosts": "Allocate all personnel costs",
+  "ExportingtheAllocationData": "Export apportionment data",
+  "Itemno": "Item Number",
+  "Pleaseentertheprojectnumber": "Please enter item number",
+  "Pleaseenteraprojectname": "Please enter a project name",
+  "Allparticipants": "all participants",
+  "Pleaseselectparticipants": "Please select a participant",
+  "Principalpersoninharge": "main in-charge",
+  "Pleaseselectthepersonincharge": "Please select the person in charge",
+  "Checkthedetails": "check the details",
+  "Yuananhour": "RMB/hour",
+  "costof": "cost",
+  "Financialdataimport": "Financial data import",
+  "Itheimport": "import month",
+  "Recalculatereportedcostsforthemonth": "Recalculate the filled daily cost for the month",
+  "Synchronizeemployeemonthlycosttorganizationalstructure": "Synchronized to the employee monthly salary cost in the organizational structure",
+  "Viewtheimporthistory": "View import history",
+  "Selectthefilendstartimporting": "Select file and start importing",
+  "Pleaseenteracustomsalaryitemname": "Please enter a custom salary item name",
+  "Addttotalcost": "Included in total cost",
+  "Pleaseenterthenameofcustomsalaryitem1": "Please enter a custom salary item 1 name",
+  "Pleaseenterthenameofcustomsalaryitem2": "Please enter a custom salary item 2 name",
+  "Pleaseenterthenameofcustomsalaryitem3": "Please enter a custom salary item 3 name",
+  "Shutdown": "closure",
+  "save": "save",
+  "Noallocationratioofprojectworkinghoursisset": "No project working hours staff apportionment ratio setting",
+  "BatchSettingProportion": "Batch setting ratio",
+  "UselastmonthscaleSettings": "Use previous month scale settings",
+  "Importallocationratio": "Import apportionment ratio",
+  "Monthlyprojecttobeapportioned": "Monthly apportionment project settings",
+  "Settheproportion": "set scale",
+  "setup": "set up",
+  "projectstobe assessed": "Monthly to be apportioned item selection",
+  "allocationdata": "Import apportionment ratio data",
+  "Deselectallitems": "deselect all items",
+  "Selectallitems": "Check all items",
+  "allocationImporttemplates": "Employee Project Apportionment Proportion Import Template",
+  "eachitemofemployeecost": "Set the proportion of each item of employee cost",
+  "Accountedfor": "proportion",
+  "Automaticallocation": "automatic apportionment",
+  "Selecttheemployee": "select employee",
+  "totalpercentage": "total proportion",
+  "importingtheallocationratio": "Apportionment ratio import result",
+  "AmortizedDataExport": "Apportionment data export",
+  "Exportbprojectcategory": "Export by item",
+  "Exportbyproject": "Export by project",
+  "doyouwanttodeleteit": "Are you sure to delete?",
+  "thedeletionhasbeencancelled": "Undeleted",
+  "financialdata": "financial data",
+  "operationissuccessful": "Successful operation",
+  "operationfailure": "operation failed",
+  "importtheaudits": "Import audit",
+  "proportionofassignedpersonnelisnot ": "There is a staff distribution ratio that is not",
+  "erroroccurred": "An error occurred",
+  "savesuccess": "Successfully saved",
+  "sumoftheallocationsmustbe": "The sum of the allocation percentages must be 100%",
+  "choosewhethertoincludethetotalcost": "Please select whether to include in the total cost",
+  "financialcoststatement": "Financial Cost Statement",
+  "costintotal": "total cost",
+  "projectpersonnelcostincluded": "With or without project personnel costs",
+  "yuan": "Yuan",
+  "workcost": "work cost",
+  "financialcoststatisticss": "Financial cost statistics",
+  "waiforverification": "Import successful, please wait for review",
+  "zongjia": "total price",
+  "apportionmentratiodata": "Piece of Apportionment Proportion Data",
+  "tasklist": "task list",
+  "ongoing": "processing",
+  "risk": "risk",
+  "subordinatedepartments": "Department",
+  "types": "type",
+  "deadline": "deadline",
+  "starttimes": "Starting time",
+  "alltaskss": "all tasks",
+  "created": "I created",
+  "interval": "interval",
+  "perform": "I execute",
+  "addsubitems": "Add subproject",
+  "bian-ji": "edit",
+  "listofsubitems": "list of subprojects",
+  "nameofthetask": "mission name",
+  "names": "name",
+  "taskstage": "mission phase",
+  "wan-cheng": "Finish",
+  "zhi-hang-ren": "executor",
+  "zhong-qi": "reboot",
+  "enterthetaskcontent": "Please enter the task content",
+  "plantime": "Scheduled hours",
+  "pleaseselectadate": "Please select a date",
+  "pleaseselectanexecutor": "Please select an executor",
+  "taskdefinition": "Task content",
+  "addinganexecutor": "Add executor",
+  "addtaskprogress": "Add mission progress",
+  "atrisk": "There is a risk",
+  "deleteList ": "delete list",
+  "detaileddescription": "Detailed Description",
+  "detailedprogressdescription": "Please enter detailed progress description",
+  "fa-bu": "release",
+  "normals": "normal state",
+  "pleaseentertheplannedworking": "Please enter the planned working hours, in hours",
+  "priority": "priority",
+  "taskprogress": "Mission progress",
+  "viewingHistory": "View history",
+  "whotoremindtocheck": "remind who to view",
+  "withinthetimelimit": "Progress overdue",
+  "geng-xin-yu": "updated on",
+  "nodata": "No data",
+  "parenttask": "Return to parent task",
+  "participantin": "participant",
+  "alldynamic": "All updates",
+  "managerQucompletedthedependencytask": "Manager Qu completed the dependent task",
+  "onApril20": "April 20",
+  "pleaseenteragroupname": "Please enter a group name",
+  "pleaseentercontent": "Please enter content",
+  "hoursago": "7 hours ago",
+  "pleaseenteratasklistname": "Please enter a task list name",
+  "pleaseentethetext": "Please enter text...",
+  "hoursago8": "eight hours ago",
+  "missionscompleted": "completed tasks",
+  "taskinprogress": "task in progress",
+  "taskscheduled": "pending tasks",
+  "createdthetask": "Tasks I created",
+  "missionIwason": "tasks I perform",
+  "taskthatisoverdue": "overdue tasks",
+  "todaytask": "today's task",
+  "jin-ji": "urgent",
+  "yi-ban": "generally",
+  "zhong-yao": "important",
+  "makesuretodeletethesubproject": "Are you sure you want to delete the subproject",
+  "ma": "?",
+  "deletesubproject": "delete subproject",
+  "addWork": "add task",
+  "modifytheproject": "Modify an item",
+  "identifytheproject": "sure you want the project",
+  "deletetheproject": "delete item",
+  "editingtasks": "Edit tasks",
+  "releasesuccess": "Published successfully",
+  "createtask ": "Create a task",
+  "imageexceeds2MBpleaseuploaditagain": "The image exceeds 2MB, please re-upload",
+  "currenttaskanditssubtasks": "Are you sure you want to delete the current task and its subtasks?",
+  "executorhasduplication": "Executors are duplicated",
+  "pictureistoolargepleaseuploaditagain": "The image is too large, please re-upload",
+  "wanttodeletethecurrent task": "Are you sure you want to delete the current task?",
+  "projectreport": "Project report",
+  "customerprojectincomestatement": "Customer Project Income Statement",
+  "dailyreporttobereviewedstatistics": "Daily statistics to be reviewed",
+  "employeereporttimelinessrate": "Timely rate of employee reporting",
+  "personneltimeallocationtable": "staff time allocation table",
+  "projectTaskReport": "Project Task Report",
+  "projectbalancesheet": "project balance sheet",
+  "projectcostbaselinetable": "Project Cost Baseline Table",
+  "projectcoststatement": "Project Cost Report",
+  "projectphasetimesheet": "Project Phase Timesheet",
+  "statisticsofovertimework": "Overtime Statistics",
+  "statisticsofpersonnelhours": "Staff hour statistics",
+  "taskgrouptimesheet": "Task Group Timesheet",
+  "timecostearlywarningtable": "Labor cost warning form",
+  "pleaseelectcustomers": "Please select a customer",
+  "selectstartdate": "Choose a start date",
+  "pleaseselectpersonnel": "Please select a person",
+  "pleaseselecttype": "Please choose the type",
+  "projectbereviewed": "Project pending review",
+  "departmentobereviewed": "Department pending review",
+  "pleaseselectstage": "Please select a stage",
+  "reporderived": "report export",
+  "projectmanager": "project manager",
+  "he-tong-jine-yuan": "Contract amount (yuan)",
+  "schedulestarttime": "plan start time",
+  "completeness": "Completeness",
+  "scheduleendtime": "planned end time",
+  "artificialcost": "Labor cost",
+  "expirationdate": "expiration date",
+  "shi-ji-gong-shi": "Actual working hours",
+  "generalcost": "general fee",
+  "outsourcingcost": "Outsourcing fee",
+  "travelexpenses": "business trip budget",
+  "contractamount": "Contract amount",
+  "costdetail": "Charge Details",
+  "profits": "profit",
+  "reimbursementdetail": "Reimbursement details",
+  "totalcostos": "Total cost",
+  "customername": "client's name",
+  "profitmargin": "profit margin",
+  "relatedprojects": "Related items",
+  "groupname": "Group Name",
+  "statisticsarecollectedbytaskgroup": "Statistics by task group",
+  "statisticsbyproject": "Statistics by project",
+  "jia-ban-shi-chang": "Overtime hours",
+  "overtimecost": "Overtime cost",
+  "ordinaryprojecthours": "Normal project hours",
+  "publicprojecthours": "public project hours",
+  "currentsurplusbudget": "current remaining budget",
+  "currenttotalbudget": "current total budget",
+  "publicprojecthourszan": "Proportion of working hours on public projects",
+  "totalsurplusbudget": "total remaining budget",
+  "workinghourshasbeenreported": "Filled out labor cost",
+  "coshasbeenreported": "Filled in cost",
+  "costbudget": "cost budget",
+  "proportionreported": "Filled out percentage",
+  "timelyreportingrate": "Fill in time rate",
+  "numberitemstobereviewed": "Number of items to be reviewed",
+  "percentageofactualtimespent": "Actual time usage ratio",
+  "detailsofreimbursementexpenses": "Reimbursement Expense Details",
+  "projectoutput": "Project output value",
+  "costtype": "types of fee",
+  "departmentsuod": "Department",
+  "forthedate": "Fee date",
+  "amountof": "amount",
+  "notax": "Excluding tax",
+  "ppertype": "ticket type",
+  "tax": "tax included",
+  "taxs": "tax",
+  "workovertimedetails": "Overtime Details",
+  "workinghoursoftheday": "Working hours of the day",
+  "workovertimedate": "overtime date",
+  "fillincase": "Fill in the situation",
+  "zheng-chang": "normal",
+  "zhong-yao-qie-jin-ji": "important and urgent",
+  "pojectbalancesheetincomestatement": "Project Balance of Payments (Income Statement)",
+  "customerprojectprofitstatement": "Customer Project Profit Statement",
+  "ke-hu": "client",
+  "statisticsofstafffillingintimerate": "Employee fill-in and report on-time rate statistics",
+  "projectphasetimereport": "Project Phase Time Report",
+  "personnelfillingtimelyratestatistics": "Statistics on the timely rate of personnel filling and reporting",
+  "statisticalreportofovertimework": "Statistical report on overtime",
+  "personnelhourstatistics": "Staff hour statistics",
+  "timestatisticsofaskgroups": "Task group work statistics",
+  "clientlist": "Customer List",
+  "importingCustomersinBatches": "Import customers in bulk",
+  "newcustomer": "Add customer",
+  "pleaseenterthecustomernamekeyword": "Please enter customer name keyword",
+  "address": "address",
+  "clientcode": "Customer code",
+  "contact": "contact",
+  "contactphonenumber": "contact number",
+  "email": "Mail",
+  "peaseenterthe": "please enter",
+  "ustomernumber": "Customer Number",
+  "importingCustomerData": "Import customer data",
+  "customerimporttemplatisadded": "New customer import template",
+  "pleaseenterthecustomername": "Please enter customer name",
+  "determinethatyouwantodelete": "Are you sure you want to delete customers in bulk",
+  "selecttheustomerdatayouwanttodelete": "Please select customer data to delete",
+  "customerdata": "pieces of customer data.",
+  "deleteCustomer": "delete customer",
+  "importedupdatedsuccessfully": "Successfully imported/updated",
+  "modifythecustomer": "modify customer",
+  "makeuretodeletethecustomer": "Are you sure you want to delete the customer",
+  "expensereimbursementmodule": "expense reimbursement module",
+  "fillinthestaffexpenses": "Employee expense report",
+  "generalexpenses": "Fill in the general fee",
+  "listofreimbursementvouchers": "List of reimbursement vouchers",
+  "myexpensevoucher": "my reimbursement voucher",
+  "outsourcingcostshouldbereported": "Fill out outsourcing expenses",
+  "travelexpensess": "Fill in the travel expenses",
+  "documentlist": "Document list",
+  "documentreview": "Document review",
+  "batchupload": "Bulk upload",
+  "expensetypemanagement": "Expense Type Management",
+  "peopleconcerned": "reimbursement person",
+  "pleaseselecttheapplicant": "Please select a reimburser",
+  "fillinthedate": "Fill in the date",
+  "bei-zhu": "Remark",
+  "cha-lv": "travel",
+  "invoicenumber": "Number of invoices",
+  "newinvoice": "Add an invoice",
+  "optiondate": "select date",
+  "wai-bao": "outsourcing",
+  "subordinatetotheproject": "It's not played",
+  "amountoffees": "Fee amount (tax included)",
+  "invoices": "Invoice Type",
+  "pleaseselectthetypeoffee": "Please select a fee type",
+  "vATgeneralinvoice": "VAT ordinary invoice",
+  "vATspecialinvoice": "VAT special invoice",
+  "expensereimbursementvoucher": "Reimbursement voucher",
+  "invoiceno": "receipt number",
+  "shui-shuai": "tax rate%",
+  "clickupload": "Click to upload",
+  "receiptnumber": "Document Number",
+  "selecttheapplicant": "Choose a payer",
+  "find": "find",
+  "ticketnumber": "ticket number",
+  "dismissreason": "Reason for rejection",
+  "cha-kan": "Check",
+  "detailsofReimbursementvoucher": "Reimbursement voucher details",
+  "nodocuments": "No documents yet",
+  "exceltemplateanduploadit": "Fill out the excel template and upload it",
+  "expensereimbursementimporttemplate": "Expense Reimbursement Import Template",
+  "selecthefile": "select file",
+  "toupload": "Start upload",
+  "clears": "empty",
+  "costofname": "fee name",
+  "newtype": "new type",
+  "addeditfeetypes": "Add/Edit Fee Types",
+  "belongstype": "Type",
+  "typename ": "type name",
+  "customizethfeetypename": "Custom fee type name",
+  "pleaseentercustomfeetypename": "Please enter a custom fee type name",
+  "operationmaycausedatalossAreyousuredeletethedata": "This operation may cause the loss of existing data. Are you sure you want to delete it?",
+  "confirmtoupload": "Confirm upload?",
+  "editsuccess": "Edited successfully",
+  "uploadedsuccessfully": "Uploaded successfully",
+  "pleaseaddtheinvoice": "Please add an invoice",
+  "pleaseselectpictures": "Please select an image",
+  "yousureyouwanttodelete": "Are you sure you want to delete",
+  "approvalprocesssetting": "Approval Process Settings",
+  "timeApprovalProcess": "Working hours approval process",
+  "workinghoursapprovalprocessofdirectstaff": "Immediate staff approval process",
+  "approvaltocomplete": "Approval completed",
+  "employeeisallowed": "Employee fills in the report",
+  "selectheapprovingdepartment": "Please select an approval department",
+  "departmenthead": "Department heads",
+  "dministrator": "designated administrator",
+  "electanapprovaladministrator": "Please select an approval administrator",
+  "personnelAdministrator": "Personnel administrator",
+  "setupthesuccess": "set successfully",
+  "onlyapplicabletotheimmediatestaffofthecurrentdepartment": "Applicable only to the direct staff of the current department, the approval process of the staff of the sub-department needs to be set separately",
+  "add": "new",
+  "bulkimport": "Batch Import",
+  "guan-li": "manage",
+  "ge": "indivual",
+  "numberofrelatedprojects": "Number of related projects",
+  "addedormodifiedthemaintenancedata": "Add/Modify Maintenance Data",
+  "dao-ru": "import",
+  "importtheresults": "Import results",
+  "shu-ju": "data",
+  "importTemplate": "import template",
+  "makesuretodeleteinbatches": "Are you sure you want to delete in bulk",
+  "pleaseentername": "Please enter a name",
+  "pleaseselectheonesyouwanttodelete": "Please select to delete",
+  "customersdata": "pieces of customer data",
+  "makesuretodeletethisone": "Are you sure you want to delete this",
+  "peaseselectmonth": "Please select a month",
+  "throughwithoneclick": "Pass all by one key",
+  "monany": "month",
+  "confirmapprovalofpendingdataforalldepartmentsanddates": "Are you confirmed to pass pending data for all departments and dates?",
+  "classificationmanagement": "Classification management",
+  "exportSupplier": "export supplier",
+  "importsuppliersinbatches": "Import suppliers in bulk",
+  "listofSuppliers": "Supplier list",
+  "newsuppliers": "Add supplier",
+  "pleaseenterthevendornamekeyword": "Please enter supplier name keyword",
+  "classificationSuppliers": "Supplier classification",
+  "namsupplier": "Supplier name",
+  "supplierNo": "supplier code",
+  "importsupplierdata": "Import supplier data",
+  "supplierimporttemplate": "Supplier Import Template",
+  "supplierclassificationentrymanagement": "Supplier Category Item Management",
+  "newCategoryItem": "Add category item",
+  "addmodifycategoryentry": "Add/Modify Category Items",
+  "gong-ying-shang-dao-chu": "Supplier export",
+  "determinethatyouwanttodeletevendorsinbulk": "Are you sure you want to delete suppliers in bulk",
+  "selectthevendordatyouwanttodelete": "Please select the supplier data to delete",
+  "deletesupplier": "delete supplier",
+  "barsupplierdata": "pieces of supplier data",
+  "makesuretoremovethevendor": "Are you sure you want to delete the supplier",
+  "modifysupplier": "Modify supplier",
+  "aketimeoffto": "Fill out the leave",
+  "all": "all",
+  "annualleavemanagement": "Annual leave management",
+  "for": "leave statistics",
+  "leaveApprovalProcess": "Leave approval process",
+  "myleaveform": "my leave form",
+  "scheduleofremainingLeave": "Holiday Remaining Table",
+  "singlelistofleave": "List of leave requests",
+  "staffleavetofillin": "Employee leave application",
+  "leavetype": "Type of leave",
+  "overtimhourscabeusedforoffsetting": "Overtime hours can be used to deduct time off",
+  "restcanbeadjusted": "Remaining adjustable time off",
+  "leavepeople": "ask for leave",
+  "phone": "Telephone",
+  "lengthunit": "Duration unit",
+  "accordingdays": "day off",
+  "leavehour": "leave by the hour",
+  "approver": "Approver",
+  "leavedays": "number of days off",
+  "leavetime": "Length of leave",
+  "pleaseselectthepersonaskingforleave": "Please select a leaver",
+  "offstate": "leave status",
+  "pleaseselectthetypeofleave": "Please select the type of leave",
+  "leaveendtime": "Leave end time",
+  "leavestarttime": "Leave start time",
+  "norequestforleaveatpresent": "No leave request",
+  "biao-ti": "title",
+  "pleaseenterstaffsearch": "Please enter a person to search",
+  "Nstatisticpresent": "No leave statistics",
+  "totaldaysleave": "Total number of days off",
+  "totallengthofleave": "Total time off",
+  "approvalprocessforleaveofdirect staff": "Immediate staff leave approval process",
+  "pleaseselectapprover": "Please select an approver",
+  "selectdepartmentsdesignatepersonnel": "Select a department/designate",
+  "annualleaveperyear": "Annual leave days",
+  "numberofannualleavedays": "Modify annual leave days",
+  "pleaseenterhepersonnamesearch": "Please enter person name to search",
+  "remainingdaysofannualleave": "Remaining annual leave days",
+  "screeningDepartment": "Filter by department",
+  "volumeset": "Batch settings",
+  "pleasesetthetimelimitforannualleave": "Please set the time limit for annual leave",
+  "setthenumberofannualleavedaysperyear": "Set the number of annual leave days",
+  "pleaseenterdays": "Please enter the number of days",
+  "departmentofscreening": "Department screening",
+  "personnelselection": "Personnel screening",
+  "synchronizefromStaple": "Sync from DingTalk",
+  "beenused": "Used",
+  "combination": "total amount",
+  "leaveForm": "Details of leave request",
+  "periodofvalidity": "Validity period",
+  "remainingamount": "Remaining quota",
+  "phonenumbercannotbeempty": "Mobile number cannot be empty",
+  "pleaseenterthecorrectcellphonenumber": "please enter a valid phone number",
+  "daysbeyondthecurrentlyselecteddat": "Days past the currently selected date",
+  "leavedayscannotbeempty": "The number of days of leave cannot be empty",
+  "annualleaveisallowed": "Annual leave report",
+  "leaveisallowed": "Sick leave",
+  "maternityleaveisallowed": "maternity leave",
+  "personalleaveisallowed": "personal leave report",
+  "configureanapprover": "There is currently no approver, please contact the administrator to configure the approver",
+  "synchronoussuccess": "Sync succeeded",
+  "selecttheitemsyouwanttobatchset": "Please select items to set in bulk",
+  "designatedpersonnel": "designated person",
+  "deleteit": "Are you sure you want to delete?",
+  "chartY": "Chart Y axis:",
+  "accordingtothecost": "show cost",
+  "accordingtoworkinghours": "Show hours",
+  "projectclassification": "Types of section",
+  "zhu-xiang-mu": "main project",
+  "returnsuperior": "Return to the upper level",
+  "timeReportExport": "Time report export",
+  "departmentchoice": "Department selection",
+  "classificationitems": "All project categories",
+  "choosethestyle": "Choose a style",
+  "Itemontheline": "item on line",
+  "classifiedcolumns": "Items are categorized on columns",
+  "classifiedontheline": "Items are categorized on the line",
+  "itemisonthecolumn": "item on column",
+  "individualprojectdata": "Data summary with a single project",
+  "departmenthourscoststatistics": "Departmental labor cost statistics",
+  "labortimecoststatistics": "Staff hourly cost statistics",
+  "otalhourscost": "Total labor cost",
+  "projectclassificationlaborosttatistics": "Project classification labor cost statistics",
+  "projectmanhourcoststatistics": "Project labor cost statistics",
+  "statistical": "statistics",
+  "zong-ji": "total",
+  "businesstriisallowed": "business trip report",
+  "businesstriplist": "business trip list",
+  "businessstatistics": "travel statistics",
+  "mbusinesstrip": "my business trip",
+  "businesstriApprovalProcess": "Travel approval process",
+  "travelreason": "business trip",
+  "car": "car",
+  "departurecity": "departure city",
+  "destinationcity": "destination city",
+  "plane": "airplane",
+  "ship": "ship",
+  "traffictools": "Transportation",
+  "train": "train",
+  "roundtrip": "One way round trip",
+  "backandforth": "round trip",
+  "oneway": "One Way",
+  "automaticcalculation": "Automatic calculation",
+  "businessstate": "business trip status",
+  "morethantendays": "more than 10 days",
+  "pleaseselectbusinesstraveler": "Please select a traveler",
+  "traveldays": "business trip days",
+  "travelnote": "business trip notes",
+  "businesspersonnel": "Traveler",
+  "detailsbusinessrip": "Business trip details",
+  "trip": "journey",
+  "applytime": "application time",
+  "endtimeofbusinesstrip": "business trip end time",
+  "starttimeofbusinessrip": "business trip start time",
+  "nostatisticsonbusinesstripsatpresent": "No travel statistics",
+  "approvalprocessforbusiness": "Business trip approval process for direct staff",
+  "cumulativebusinesstripdays": "Cumulative travel days",
+  "projectLeader": "Project manager",
+  "onewayroundtrip": "One way round trip",
+  "projectAssociationInformation": "Project related information",
+  "rselatedprojects": "Associated project",
+  "addinganAssociatedItem": "Add related items",
+  "addedormodifiedassociateditems": "Add/Modify Associated Items",
+  "synchronizationperiodfromstaplecannotexceedsevendays": "Sync from DingTalk The time period cannot exceed seven days",
+  "saelectdestinationcity": "Please select destination city",
+  "selectanendtime": "Please select an end time",
+  "selectastarttime": "Please select a start time",
+  "selectyourdeparturecity": "Please select the departure city",
+  "synchronous": "Synchronize",
+  "yourbusinesstrip": "Please enter the reason for your business trip",
+  "projectassociate": "Please select an item to link",
+  "selectaenddate": "Please select an end date",
+  "selectastartdate": "Please select a start date",
+  "cannotbesynchronized": "The time period for synchronizing messages from DingTalk cannot exceed seven days",
+  "tripStatistics": "Business trip statistics export",
+  "applicationissuccessful": "Successful application",
+  "Immediatelyadd": "Add it now",
+  "addingroles": "Add role",
+  "pleaseenterakeyworforquery": "Please enter a keyword query",
+  "roleauthorization": "Role Permissions",
+  "jiao-se": "Role",
+  "mo-ren-jiao-se": "- (default role)",
+  "modifyingDefaultRole": "Modify the default role",
+  "Immediatelychange": "Edit now",
+  "assignpermissions": "assign permissions",
+  "editingtherole": "edit role",
+  "exportpermission": "export permission",
+  "administratorcannotbeedited": "The super administrator is a fixed default role and cannot be edited",
+  "charactername": "Role Name",
+  "defaultrole": "default role",
+  "defaultroleforimportingpeople": "* Set default roles when importing people",
+  "gong-neng": "Function",
+  "operationwilldelete": "This action will delete",
+  "quanxianshuju": "Permissions Data Sheet",
+  "shifujuxu": "role, continue?",
+  "employeehourlywage": "Employee hourly wage entry method settings",
+  "methodsa": "Method 1: Enter the monthly cost and automatically calculate the hourly salary",
+  "suitableforfulltimeemployees": "(Suitable for full-time corporate employees)",
+  "dailyworkinghours": "Normal working hours per day",
+  "workingdayspermonth": "Average working days per month",
+  "hoursreporteperday": "Lock the upper limit of daily reporting hours",
+  "imitillingtime": "Fill in the time limit",
+  "lockingworkinghours": "Lock working hours",
+  "chargedtocost": "Overtime hours charged to cost",
+  "hourscanbereported": "Reportable overtime hours",
+  "workSettings": "Overtime settings",
+  "bei-gong-zi": "double salary",
+  "employeeworkinghours": "Employee working hours reporting method settings",
+  "reportintheafternoon": "All day/morning/afternoon convenient reporting",
+  "settheduration": "Please set the duration",
+  "timeemployees": "(Suitable for hourly workers and part-time workers who are paid on time)",
+  "visittwo": "Method 2: Enter the hourly salary directly",
+  "addTian": "Add to",
+  "afternoontime": "afternoon time",
+  "chooseyourownhours": "Choose your own working hours",
+  "daylong": "full day",
+  "filledinadvance": "Can be filled in in advance",
+  "filltime": "fill time",
+  "instructions": "(Note: The system administrator is not limited by the filling time when filling out the daily report for the employee)",
+  "missingfill": "Daily reminder missed filling on the day",
+  "missingfills": "Daily reminder missed yesterday",
+  "morningtime": "morning time",
+  "owntimeframe": "Choose your own time frame",
+  "personneltoset": "Don't remind people settings",
+  "pointintime": "any point in time",
+  "reminderSettings": "Fill in the reminder settings",
+  "remindermethod": "Please select a reminder method",
+  "remindertext": "reminder text",
+  "remindertime": "reminder time",
+  "settingrestPeriod": "Set a break time period",
+  "showthesample": "Show example",
+  "timeproportionally": "Prorated time",
+  "timesetting": "Employee fill in daily report time setting",
+  "dailyreview": "Daily automatic review time limit:",
+  "dang-tian": "the day",
+  "dyas": "diva",
+  "oneday": "the next day",
+  "shreeday": "day three",
+  "timelydate": "Employee fills out the date and time",
+  "afteritisenabled": "After opening, the system can classify the labor cost according to the field data.",
+  "dailyfilling": "Custom Daily Filling List",
+  "datamaintenance": "data maintenance",
+  "fieldnames": "Field Name",
+  "parametermandatory": "Is it required",
+  "dailyfillingvalue": "Custom daily report value",
+  "afterthisunctionisenabled": "After opening, the value can be counted by project, department and person",
+  "additionalinformation": "After opening, employees can fill in additional information",
+  "eachdepartment": "The reviewer is the direct leader of each department",
+  "fillingtext": "Custom daily report text",
+  "importauditing": "Whether to enable import auditing",
+  "maintenanceDatalist": "Maintain data list",
+  "maximum": "maximum value",
+  "maximumvaluelimit": "Whether to enable the maximum limit",
+  "addData": "Add data",
+  "xin-zeng-shi-jian-duan": "Add time period",
+  "xiu-gai": "Revise",
+  "keywordfiltering": "Enter keywords to filter",
+  "canbefilled": "Only fill in the current month",
+  "donlimit": "not limited",
+  "lastlastmonth": "Can be filled up to the previous month",
+  "lastmonth": "Can be filled up to last month",
+  "newspaperwithin": "Daily newspapers can be filled within 7 days",
+  "previousdaydaily": "You can fill in the daily newspaper 1 day before",
+  "afternoonworkinghours": "Please enter the working hours in the afternoon",
+  "dayworkinghours": "Please select full working hours",
+  "morningworkinghours": "Please enter the working hours in the morning",
+  "addsuccessful": "Added successfully",
+  "cannotbedeleted": "This data is in use and cannot be deleted",
+  "customDailyFillingList": "Please enter the field name of [Custom Daily Filling List]",
+  "customDailyFillingLists": "Please enter the field name of [Custom Daily Report Value]",
+  "customDailyFillingListss": "Please enter the field name of [Custom Daily Filling Text]",
+  "overtimepay": "Please set several times the salary for overtime",
+  "qing-xuan-ze-shi-jian-duan": "Please select a time period",
+  "shu-ju-ma": "data?",
+  "takethisone": "sure you want this",
+  "wu-fa-shan-chu-1": "Can't delete 1",
+  "create": "create",
+  "gong": "common",
+  "addpersonnel": "Add people",
+  "associateenterprisemicroidentity": "Affiliated Enterprise and Micro Identity",
+  "customConfiguration": "custom configuration",
+  "exportpersonnel": "Export people",
+  "shangxian": "Upper limit:",
+  "synchronizetheaddressbook": "Sync DingTalk Contacts",
+  "synchronizetheenterprisemicrodirectory": "Synchronize enterprise and micro address book",
+  "nameoftheperson": "Please enter the person's name",
+  "creationtime": "creation time",
+  "directstaff": "direct employees",
+  "hourlywage": "hourly rate",
+  "monthcost": "monthly cost",
+  "shou-ji": "cell phone",
+  "ting-yong": "Disable",
+  "zai-zhi": "on-the-job",
+  "enable": "enable",
+  "modifyingDepartments": "Bulk edit department",
+  "modifyingRoles": "Bulk edit roles",
+  "reset": "reset",
+  "transfer": "transfer",
+  "changes": "Batch Edit",
+  "setupdepartment": "set department",
+  "settherole": "set role",
+  "departmentname": "Department name",
+  "leadership": "Direct leadership",
+  "responsiblepersons": "Other responsible persons",
+  "fixedmonthlycost": "Fixed monthly cost",
+  "hourlywages": "hourly wage",
+  "payway": "Salary",
+  "meitian": "every day",
+  "xiaoshi": "Estimated hourly salary",
+  "yuechengben": "Please enter the monthly cost, unit: yuan",
+  "yuegongzuoo": "Work per month",
+  "modifyworkinghours": "Modify working hours",
+  "yuechengbenxiaoshi": "Please enter the cost Unit: RMB/hour",
+  "effectivedate": "effective date",
+  "immediatesuperior": "direct superior",
+  "entrytime": "Entry Time",
+  "postrank": "Job rank",
+  "addprofessionalcertificate": "Add more certificates",
+  "joblevel": "Please enter job level",
+  "professionalcertificate": "Professional Certificate",
+  "professionalCertificate inManagement": "Management Professional Certificate",
+  "certificate": "certificate date",
+  "certificatedate": "Select certificate date",
+  "editorialstaff": "editorial staff",
+  "historicalpersonnelcost": "historical cost of personnel",
+  "monthlysalary": "Fixed monthly salary",
+  "monthlysalarys": "monthly salary",
+  "updatetime": "update time",
+  "exportingpeople": "Export people list",
+  "permissiontotransfer": "Permission transfer",
+  "serviceonly": "Incumbents only",
+  "administratorroleto": "Transfer the super administrator role to",
+  "transferoftheirrole": "own role after transfer",
+  "employeedeparture": "employee departure date",
+  "terminationstaff": "Resignation and deactivation of employees",
+  "addededitedmanagement": "Add/Edit Management Professional Certificate",
+  "professionalCertificateName": "Professional certificate name",
+  "dropdown": "drop down",
+  "enteranameforacustomconfigurationitem": "Please enter a custom configuration item name",
+  "input": "enter",
+  "managecustomconfigurationitems": "Custom configuration item management",
+  "addededitedconfigurationoptions": "Add/edit configuration options",
+  "batchimportofpersonnel": "Import people in batches",
+  "canconfiguretheoptions": "Configurable options after saving",
+  "configurationoptions": "configuration options",
+  "newConfigurationOptions": "Added configuration options",
+  "personnelimporttemplate": "Person Import Template",
+  "oneWeix": "1. Fill in the corporate WeChat address book Secret",
+  "synchronizetheenterprisewechataddressbook": "Synchronize corporate WeChat address book",
+  "firststep": "Step 1: Enter the management background",
+  "secondstep": "Step 2: Enter the address book synchronization",
+  "thirdstep": "Step 3: Check the Secret",
+  "correlationresults": "Correlation results",
+  "startsynchronization": "start sync",
+  "twoWei": "2. Contact customer service to configure the synchronization server",
+  "eportandarticipate": "Fill in the daily report and participate in project collaboration",
+  "systemadministrators": "Has full functionality except creating sysadmins",
+  "createandmanageprojects": "Create and manage projects",
+  "financial": "Financial accounting cost, expense reimbursement review, responsible for organizational structure management",
+  "viewdailyreports": "View daily reports, labor cost statistics, financial accounting, projects and reports",
+  "monthlycost": "Please enter monthly cost",
+  "pleaseenterprofessionalcertificate": "Please enter professional certificate",
+  "pleaseenterthedepartmentname": "Please enter department name",
+  "pleaseinputcost": "Please enter cost",
+  "pleaseselectroles": "Please select a role",
+  "areyousuretosynchronize ": "Are you sure to sync address book from Dingding? \n(It may take some time to load, please be patient)",
+  "booksecret": "Please enter address book secret",
+  "synchronizingtheassociation": "Syncing associations, please wait...",
+  "synchronoussuccesss": "Sync complete",
+  "deletthisemployee": "Are you sure you want to delete this employee?",
+  "namecannotbeempty": "Name is required",
+  "operationcancelled": "Operation cancelled",
+  "pleaseselectaftertransfer": "Please select your own role after transfer",
+  "stopsuccess": "Deactivated successfully",
+  "superadministratorrole": "You will lose your super administrator role and will need to log in again. \nAre you sure you want to transfer?",
+  "wanttotransfer": "Please select the person to transfer",
+  "linglingling": "The password has been reset to 000000, please notify the staff to modify it in time",
+  "listofallemployees": "List of all employees",
+  "resetyourpassword": "Reset password?",
+  "saresetyourpassword": "reset Password",
+  "wanttoor": "sure to be",
+  "addorialstaff": "Add staff",
+  "certificateisincomplete": "Certificate is incomplete",
+  "repeat": "Duplicate certificate",
+  "sureyouwantto": "sure you want",
+  "switchingroles": "Switch roles successfully",
+  "zhang-hao": "account",
+  "addsubdepartment": "add department",
+  "deletethedepartment": "Are you sure you want to delete the department",
+  "deletethedepartmentdsa": "delete department",
+  "editorialdepartment": "Editorial department",
+  "newsuccess": "added successfully",
+  "subdepartment": "Add a sub-department",
+  "deletionofprofessionalcertificate": "Remove Professional Certificate",
+  "itemnumberkeyword": "Please enter item number keyword",
+  "listofitems": "project list",
+  "paused": "Paused",
+  "projectnamekeyword": "Please enter project name keyword",
+  "baselinecostitem": "Baseline cost item",
+  "exportProject": "export project",
+  "exportingTaskGroups": "export task grouping",
+  "fen-lei": "Classification",
+  "importproject": "import project",
+  "importtemplateproject": "Project import template",
+  "viewmore": "see more",
+  "contractno": "Contract Number",
+  "masterprojectmanagement": "Master Project Management",
+  "newproject": "Add item",
+  "projectlevelmanagement": "project level management",
+  "projectstagemanagement": "Project Phase Management",
+  "resourceallocation": "Resource allocation",
+  "projectphase": "Stage of project",
+  "nostage": "No stage yet",
+  "pleaseselecttheprojectphase": "Please select a project stage",
+  "ji-bie": "level",
+  "participants": "participant",
+  "zan-ting": "pause",
+  "groupparticipantsinbatches": "Add group participants in batches",
+  "pi-liang-tian-jia": "Bulk add",
+  "projectmanagersinbatches": "Set up project managers in bulk",
+  "projectparticipantsinbatches": "Add project participants in bulk",
+  "commonproject": "Ordinary item",
+  "projecttype": "project type",
+  "publicprojects": "public project",
+  "ordinaryprojectsareopen": "Common projects are only open to participants, and public projects are open to all members",
+  "supplier": "supplier",
+  "newspaperauditor": "Daily Reviewer",
+  "defaultistheprojectleader": "Defaults to project leader",
+  "modifythereason": "Modify reason",
+  "zheng-shu": "integer",
+  "contractamountasd": "Reason for modification of contract amount",
+  "ji-hua-jie-shu-ri-qi": "Program end date",
+  "ommencementDate": "Program start date",
+  "warrantystartime": "Warranty start time",
+  "warrantyexpirationtime": "Warranty deadline",
+  "IndependentProject": "Autonomous project category",
+  "hardwareproject": "pure hardware project",
+  "integrationproject": "Integration project",
+  "region": "Region",
+  "softwareproject": "pure software project",
+  "subordinateBU": "Affiliated BU",
+  "actualcompletiontime": "The actual completion time",
+  "costbaseline": "cost baseline",
+  "keynodes": "key node",
+  "nameofthenode": "node name",
+  "plannedcompletiontime": "Scheduled completion time",
+  "projectgroup": "Project grouping",
+  "engineering": "Engineering",
+  "nameprofessional": "professional title",
+  "yan-qi": "postpone",
+  "zhan-bi": "Proportion (%)",
+  "head": "principal",
+  "personnelproportion": "Relevant personnel and proportion",
+  "professionalparticipants": "Set up professional participants",
+  "subprojectno": "sub-item number",
+  "baselinecostitemmanagement": "Project Baseline Cost Item Management",
+  "modifysubproject": "Add/Modify sub-items",
+  "hourscostwarning": "Labor cost warning",
+  "wu-yu-jing": "no warning",
+  "yu-jing": "early warning",
+  "keyprojectnodes": "Project key node management",
+  "newcostitem": "Add cost item",
+  "addingKeyNodes": "Add key points",
+  "addzhuxiang": "Add main item",
+  "bian-hao": "Numbering",
+  "fen-lei-ming-cheng": "Category Name",
+  "phasename": "stage name",
+  "projectclassificationqwe": "Project classification entry management",
+  "levelnames": "level name",
+  "modifyingtheprojectLevel": "Add/Modify item level",
+  "newProjectLevel": "Add item level",
+  "newprojectstage": "Add project stage",
+  "mainProjectName": "main project name",
+  "modifythemainproject": "Add/Modify Main Item",
+  "projectLevelName": "Project level name",
+  "mainProjectNo": "main item number",
+  "modificationcostitem": "Add/Modify Cost Items",
+  "modifyingtheprojectphase": "Add/Modify Project Phase",
+  "projectStageName": "Project stage name",
+  "keyNodeNames": "key node name",
+  "modifyingKeyNodesn": "Add/Modify key nodes",
+  "nameofcostitem": "Cost item name",
+  "professionaladdsparticipant": "Please select a professional participant",
+  "professionals": "professional",
+  "selectingParticipants": "Choose Participants",
+  "setupprojectprofessionals": "Set up project professionals",
+  "selectagroup": "Please select a group",
+  "setupprojectmanager": "Set up a project manager",
+  "xuan-ze-fen-zu": "select group",
+  "projectimportresult": "Project import result",
+  "di-feng-xian": "low risk",
+  "gao-feng-xian": "high risk",
+  "zhong-feng-xian": "medium risk",
+  "deletingprojectlevels": "delete project level",
+  "qing-shu-ru-bian-hao": "Please enter a number",
+  "pleaseselectpersonnelasd": "Please select a person/group",
+  "pleaseselecttheprojectmanager": "Please select a project manager",
+  "restartthesuccess": "restarted successfully",
+  "professionalscannotbeempty": "Professionals cannot be empty",
+  "professionalscannotrepeat": "Professionals can't repeat",
+  "projectcompletion": "Project completion",
+  "projectexport": "project export",
+  "projecttaskgroupexport": "Project task grouping export",
+  "suspensionofsuccess": "Paused successfully",
+  "totalproportionmust": "The total must be 100%",
+  "leadercannotbeblank": "Professional leader cannot be empty",
+  "majorcannotbeempty": "Major cannot be empty",
+  "numberomajorsmust": "The total professional proportion must be 100%",
+  "personnelcannotbeleftblank": "Professional related personnel cannot be empty",
+  "shouldnotberepeated": "Professional can not be repeated",
+  "deletingCategoryEntry": "delete category entry",
+  "deletethemainproject": "delete main project",
+  "deletingprojectphases": "Delete project stage",
+  "deletethecostbaselineitem": "Delete cost baseline items",
+  "deletingKeyNode": "delete key nodes",
+  "makesuretodeletetheitem": "Are you sure you want to delete the item",
+  "cancelproject": "undo project",
+  "completeproject": "Complete the project",
+  "maincontent": "main content",
+  "aparticipant": "set participants",
+  "changegroups": "Modify grouping",
+  "deletethegroup": "delete group",
+  "groupdetails": "Group Details",
+  "replicationgroup": "copy group",
+  "restarttheproject": "restart the project",
+  "searchgroup": "search group",
+  "sethead": "person in charge",
+  "settemplate": "set as template",
+  "shi-tu": "view",
+  "taskkanban": "Task Kanban",
+  "costmanagement": "cost management",
+  "creatingTaskList": "New task list",
+  "dai-fen-pei": "To be assigned",
+  "danweitian": "Please enter the planned working time, unit day",
+  "datastatistics": "Statistics",
+  "fileCenter": "file center",
+  "jie-zhi": "deadline",
+  "jie-zhi-shi-jian": "Deadline",
+  "overviewoftheproject": "Project overview",
+  "parentsstask": "parent task",
+  "ren-ling": "claim",
+  "ren-wu-lei-xing": "task type",
+  "renamingalist": "rename list",
+  "taskstatus": "task status",
+  "valueanalysis": "Earned Value Analysis",
+  "wan-cheng-shi-jian": "Complete time",
+  "tixiang": "Who to remind to view:",
+  "associatedTask": "Add associated tasks",
+  "guanlian": "Associated tasks",
+  "zirwu": "Subtasks",
+  "addingsubtask": "Add subtask",
+  "associatedfiles": "associated file",
+  "dissociated": "Disassociate",
+  "jiafuchengguo": "Relevant documents/deliverables",
+  "uoloadFiles": "upload files",
+  "founder": "founder",
+  "selecttask": "select task",
+  "wenjian1guanli": "Select an existing file from the file center to associate",
+  "xuanzwenjian": "Select the file",
+  "filenames": "file name",
+  "filesize": "File size",
+  "cha-kan-guan-lian-ren-wu": "View associated tasks",
+  "cha-kan-zi-ren-wu": "View subtasks",
+  "returnmilestone": "Back to Milestones",
+  "creatintemplate": "Create from template",
+  "newgrouping": "New group",
+  "addtemplate": "add as template",
+  "entertemplatename": "Please enter a template name",
+  "modifyingTaskGroup": "Modify task grouping",
+  "taskgroupleader": "Set task group leader",
+  "sametimetosave": "save at the same time",
+  "savetemplate": "save as template",
+  "choosetype": "select type",
+  "modifyingtheTaskList": "Add/modify task list",
+  "typesof": "All types",
+  "workplanexport": "Work plan export",
+  "projectTaskTemplate": "Project Task Template",
+  "projecttasktemplatedownload": "Project task template download",
+  "qing-xian-xia-zai-mo-ban-bing-tian-xie-hou-shang-chuan": "Please download the template and fill it out before uploading",
+  "wdorkplanimport": "Import work plan",
+  "faoesgfavsbxjs": "If the imported task belongs to multiple lists, you can drag and drop after importing to change the list to which it belongs",
+  "creationtimeisthelatest": "Last created",
+  "deadlineisthelatest": "latest deadline",
+  "highestpriority": "highest priority",
+  "manuallydragthesequence": "Manual drag order",
+  "addTemplateSuccessfully": "Add template successfully",
+  "changethegroupname": "Please modify the group name and try again.",
+  "deletingTemplateSuccessfully": "Template deleted successfully",
+  "detelecesTask": "Confirm delete?",
+  "guan-lian-cheng-gong": "The association is successful",
+  "jie-chu-cheng-gong": "Unsuccessful",
+  "projectalreadyhasgroup": "A group already exists for the current project",
+  "qngxuanz": "Please select a template",
+  "que-ren-yao-shan-chu": "confirm to delete",
+  "quxiaoguanlan": "Are you sure you want to unlink this file?",
+  "tasksgroupsDetalses": "The tasks under the group will also be deleted. Are you sure you want to delete this group?",
+  "xuanzguanlianwenjian": "Please select an associated file",
+  "yi-shang-chuan": "uploaded",
+  "createafolder": "Create folder",
+  "creator": "creator",
+  "da-xiao": "size",
+  "fileupload": "File Upload",
+  "library": "file library",
+  "modifyingFolder": "Add/Modify Folder",
+  "pleaseenterfoldername": "Please enter a folder name",
+  "recentdocuments": "recent documents",
+  "wanttomove": "Are you sure you want to move to trash?"
 }

+ 952 - 3
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -52,7 +52,10 @@
     "completed": "已完成",
     "tried": "已审",
     "untrial": "未审",
-    "undone": "已撤销"
+    "undone": "已撤销",
+    "yes": "是",
+    "no": "否",
+    "alreadyPassedAndWaitingAudit": "已通过和待审核"
   },
   "time": {
     "dueDate": "到期日期",
@@ -239,7 +242,7 @@
     "allProject": "全部项目",
     "selectdepartment": "选择部门",
     "allDepartments": "全部部门",
-    "doesItContain": "是否包含",
+    "doesItContain": "日报状态",
     "doesNotIncludeUnreviewed": "不包含未审核",
     "containsUnreviewed": "包含未审核",
     "laborStatisticsExport": "工时统计导出",
@@ -362,5 +365,951 @@
   "details": "详情",
   "yourdecisiontorevoke": "请输入您决定撤销的原因",
   "enterapassrating": "请输入通过评价",
-  "Revocationofsuccess": "撤销成功"
+  "Revocationofsuccess": "撤销成功",
+  "Selectmonth": "选择月份",
+  "projectworker": "无项目工时人员",
+  "Apportionmentratesetting": "分摊比例设置",
+  "Downloadthetemplate": "模板下载",
+  "Dataupload": "数据上传",
+  "Exportdata": "数据导出",
+  "Customizesalaryitems": "自定义薪资项",
+  "Setupauditor": "设置审核人",
+  "Salaryuploadrecord": "薪资上传记录",
+  "BelongsIn": "所属月份",
+  "filename": "文件名",
+  "Whetherdailycostiscovered": "是否覆盖日报成本",
+  "Whethermonthlypersonnelcostiscovered": "是否覆盖人员月成本",
+  "Uploadtime": "上传时间",
+  "SelectionofAuditor": "选择审核人",
+  "reviewercannotbeempty": "审核人不能为空",
+  "Exportoffinancialdata": "财务数据导出",
+  "Intheexport": "导出月份",
+  "Worknumber": "工号",
+  "totalcost": "总成本",
+  "Batchdelete": "批量删除",
+  "Apportionmentofpersonnelcosts": "分摊已填工时人员成本",
+  "Spreadallpersonnelcosts": "分摊全部人员成本",
+  "ExportingtheAllocationData": "导出分摊数据",
+  "Itemno": "项目编号",
+  "Pleaseentertheprojectnumber": "请输入项目编号",
+  "Pleaseenteraprojectname": "请输入项目名称",
+  "Allparticipants": "全部参与者",
+  "Pleaseselectparticipants": "请选择参与者",
+  "Principalpersoninharge": "主要负责人",
+  "Pleaseselectthepersonincharge": "请选择负责人",
+  "Checkthedetails": "查看详情",
+  "costof": "成本",
+  "Yuananhour": "元/小时",
+  "Financialdataimport": "财务数据导入",
+  "Itheimport": "导入月份",
+  "Recalculatereportedcostsforthemonth": "重新计算该月已填日报成本",
+  "Synchronizeemployeemonthlycosttorganizationalstructure": "同步到组织架构中员工月薪成本",
+  "Viewtheimporthistory": "查看导入历史记录",
+  "Selectthefilendstartimporting": "选择文件并开始导入",
+  "Pleaseenteracustomsalaryitemname": "请输入自定义薪资项名称",
+  "Addttotalcost": "计入总成本",
+  "Pleaseenterthenameofcustomsalaryitem1": "请输入自定义薪资项1名称",
+  "Pleaseenterthenameofcustomsalaryitem2": "请输入自定义薪资项2名称",
+  "Pleaseenterthenameofcustomsalaryitem3": "请输入自定义薪资项3名称",
+  "Shutdown": "关闭",
+  "save": "保存",
+  "Noallocationratioofprojectworkinghoursisset": "无项目工时人员分摊比例设置",
+  "BatchSettingProportion": "批量设置比例",
+  "UselastmonthscaleSettings": "使用上月比例设置",
+  "Monthlyprojecttobeapportioned": "月待分摊项目设置",
+  "Importallocationratio": "导入分摊比例",
+  "Settheproportion": "设置比例",
+  "setup": "设置",
+  "projectstobe assessed": "月待分摊项目选择",
+  "allocationdata": "导入分摊比例数据",
+  "Deselectallitems": "取消选择全部项目",
+  "Selectallitems": "选中全部项目",
+  "allocationImporttemplates": "员工项目分摊比例导入模板",
+  "eachitemofemployeecost": "设置员工成本各项目占比",
+  "Selecttheemployee": "选择员工",
+  "Automaticallocation": "自动分摊",
+  "Accountedfor": "占比",
+  "totalpercentage": "总比例",
+  "importingtheallocationratio": "分摊比例导入结果",
+  "AmortizedDataExport": "分摊数据导出",
+  "Exportbyproject": "按项目导出",
+  "Exportbprojectcategory": "按项目分类导出",
+  "doyouwanttodeleteit": "是否确认删除?",
+  "thedeletionhasbeencancelled": "已取消删除",
+  "financialdata": "财务数据",
+  "operationissuccessful": "操作成功",
+  "operationfailure": "操作失败",
+  "importtheaudits": "导入审核",
+  "proportionofassignedpersonnelisnot ": "存在人员分配比例非",
+  "savesuccess": "保存成功",
+  "erroroccurred": "发生错误",
+  "sumoftheallocationsmustbe": "分配比例之和必须是100%",
+  "financialcoststatement": "财务成本报表",
+  "choosewhethertoincludethetotalcost": "请选择是否计入总成本",
+  "costintotal": "成本总计",
+  "yuan": "元",
+  "projectpersonnelcostincluded": "含无项目人员成本",
+  "workcost": "工作成本",
+  "financialcoststatisticss": "财务成本统计",
+  "zongjia": "总价",
+  "waiforverification": "导入成功,请等待审核",
+  "apportionmentratiodata": "条分摊比例数据",
+  "tasklist": "任务列表",
+  "ongoing": "进行中",
+  "subordinatedepartments": "所属部门",
+  "types": "类型",
+  "risk": "风险",
+  "starttimes": "开始时间",
+  "deadline": "截止时间",
+  "interval": "区间",
+  "alltaskss": "全部任务",
+  "perform": "我执行的",
+  "created": "我创建的",
+  "taskstage": "任务阶段",
+  "nameofthetask": "任务名称",
+  "zhi-hang-ren": "执行人",
+  "wan-cheng": "完成",
+  "zhong-qi": "重启",
+  "listofsubitems": "子项目列表",
+  "names": "名称",
+  "bian-ji": "编辑",
+  "addsubitems": "新增子项目",
+  "taskdefinition": "任务内容",
+  "enterthetaskcontent": "请输入任务内容",
+  "pleaseselectadate": "请选择日期",
+  "pleaseselectanexecutor": "请选择执行人",
+  "plantime": "计划工时",
+  "pleaseentertheplannedworking": "请输入计划工作时长,单位小时",
+  "addinganexecutor": "添加执行人",
+  "priority": "优先级",
+  "detaileddescription": "详细描述",
+  "taskprogress": "任务进展",
+  "addtaskprogress": "添加任务进展",
+  "normals": "状态正常",
+  "atrisk": "存在风险",
+  "withinthetimelimit": "进展逾期",
+  "detailedprogressdescription": "请输入详细进展描述",
+  "whotoremindtocheck": "提醒谁查看",
+  "fa-bu": "发布",
+  "deleteList ": "删除列表",
+  "viewingHistory": "查看历史记录",
+  "geng-xin-yu": "更新于",
+  "nodata": "暂无数据",
+  "parenttask": "返回父任务",
+  "participantin": "参与人",
+  "alldynamic": "所有动态",
+  "managerQucompletedthedependencytask": "屈经理完成了依赖任务",
+  "onApril20": "4月20日",
+  "pleaseentercontent": "请输入内容",
+  "pleaseenteragroupname": "请输入分组名称",
+  "pleaseenteratasklistname": "请输入任务列表名称",
+  "pleaseentethetext": "请输入文本...",
+  "hoursago": "7小时前",
+  "hoursago8": "八小时前",
+  "taskinprogress": "进行中的任务",
+  "missionscompleted": "已完成的任务",
+  "taskscheduled": "待安排任务",
+  "createdthetask": "我创建的任务",
+  "missionIwason": "我执行的任务",
+  "todaytask": "今天的任务",
+  "taskthatisoverdue": "已超期的任务",
+  "yi-ban": "一般",
+  "zhong-yao": "重要",
+  "jin-ji": "紧急",
+  "makesuretodeletethesubproject": "确定要删除子项目",
+  "ma": "吗?",
+  "deletesubproject": "删除子项目",
+  "addWork": "新增任务",
+  "modifytheproject": "修改项目",
+  "identifytheproject": "确定要项目",
+  "deletetheproject": "删除项目",
+  "editingtasks": "编辑任务",
+  "releasesuccess": "发布成功",
+  "createtask ": "创建任务",
+  "imageexceeds2MBpleaseuploaditagain": "图片超过了2MB,请重新上传",
+  "pictureistoolargepleaseuploaditagain": "图片太大,请重新上传",
+  "executorhasduplication": "执行人存在重复",
+  "currenttaskanditssubtasks": "您确定要删除当前任务及其子任务吗?",
+  "wanttodeletethecurrent task": "您确定要删除当前任务吗?",
+  "projectreport": "项目报表",
+  "projectTaskReport": "项目任务报表",
+  "projectcoststatement": "项目成本报表",
+  "projectcostbaselinetable": "项目成本基线表",
+  "personneltimeallocationtable": "人员工时分配表",
+  "timecostearlywarningtable": "工时成本预警表",
+  "projectbalancesheet": "项目收支平衡表",
+  "customerprojectincomestatement": "客户项目利润表",
+  "projectphasetimesheet": "项目阶段工时表",
+  "taskgrouptimesheet": "任务分组工时表",
+  "statisticsofovertimework": "加班情况统计表",
+  "employeereporttimelinessrate": "员工填报及时率",
+  "dailyreporttobereviewedstatistics": "日报待审核统计",
+  "statisticsofpersonnelhours": "人员工时统计表",
+  "pleaseelectcustomers": "请选择客户",
+  "selectstartdate": "选择开始日期",
+  "pleaseselecttype": "请选择类型",
+  "pleaseselectpersonnel": "请选择人员",
+  "projectbereviewed": "项目待审核",
+  "departmentobereviewed": "部门待审核",
+  "pleaseselectstage": "请选择阶段",
+  "reporderived": "报表导出",
+  "projectmanager": "项目经理",
+  "he-tong-jine-yuan": "合同金额(元)",
+  "schedulestarttime": "计划开始时间",
+  "scheduleendtime": "计划结束时间",
+  "completeness": "完成度",
+  "shi-ji-gong-shi": "实际工时",
+  "expirationdate": "截止日期",
+  "artificialcost": "人工成本",
+  "generalcost": "一般费用",
+  "travelexpenses": "差旅费用",
+  "outsourcingcost": "外包费用",
+  "totalcostos": "总费用",
+  "costdetail": "费用明细",
+  "reimbursementdetail": "报销明细",
+  "contractamount": "合同金额",
+  "profits": "利润",
+  "profitmargin": "利润率",
+  "customername": "客户名称",
+  "relatedprojects": "相关项目",
+  "statisticsarecollectedbytaskgroup": "按任务分组统计",
+  "groupname": "分组名称",
+  "statisticsbyproject": "按项目统计",
+  "jia-ban-shi-chang": "加班时长",
+  "overtimecost": "加班成本",
+  "ordinaryprojecthours": "普通项目工时",
+  "publicprojecthours": "公共项目工时",
+  "publicprojecthourszan": "公共项目工时占比",
+  "currenttotalbudget": "当前总预算",
+  "currentsurplusbudget": "当前剩余预算",
+  "totalsurplusbudget": "总剩余预算",
+  "workinghourshasbeenreported": "已填报工时成本",
+  "costbudget": "成本预算",
+  "coshasbeenreported": "已填报成本",
+  "proportionreported": "已填报占比",
+  "timelyreportingrate": "填报及时率",
+  "numberitemstobereviewed": "待审核条数",
+  "percentageofactualtimespent": "实际用时占比",
+  "projectoutput": "项目产值",
+  "detailsofreimbursementexpenses": "报销费用明细",
+  "departmentsuod": "所在部门",
+  "forthedate": "费用日期",
+  "costtype": "费用类型",
+  "ppertype": "票据类型",
+  "amountof": "金额",
+  "tax": "含税",
+  "notax": "不含税",
+  "taxs": "税额",
+  "workovertimedetails": "加班详情",
+  "workovertimedate": "加班日期",
+  "workinghoursoftheday": "当天工作时长",
+  "fillincase": "填报情况",
+  "zheng-chang": "正常",
+  "zhong-yao-qie-jin-ji": "重要且紧急",
+  "pojectbalancesheetincomestatement": "项目收支平衡表(利润表)",
+  "customerprojectprofitstatement": "客户项目利润报表",
+  "statisticsofstafffillingintimerate": "员工填报及时率统计",
+  "ke-hu": "客户",
+  "projectphasetimereport": "项目阶段工时报表",
+  "statisticalreportofovertimework": "加班情况统计报表",
+  "personnelfillingtimelyratestatistics": "人员填报及时率统计",
+  "personnelhourstatistics": "人员工时统计",
+  "timestatisticsofaskgroups": "任务分组工时统计",
+  "clientlist": "客户列表",
+  "pleaseenterthecustomernamekeyword": "请输入客户名称关键字",
+  "newcustomer": "新增客户",
+  "importingCustomersinBatches": "批量导入客户",
+  "clientcode": "客户编码",
+  "contact": "联系人",
+  "contactphonenumber": "联系电话",
+  "email": "邮箱",
+  "address": "地址",
+  "ustomernumber": "客户编号",
+  "peaseenterthe": "请输入",
+  "importingCustomerData": "导入客户数据",
+  "customerimporttemplatisadded": "新增客户导入模板",
+  "pleaseenterthecustomername": "请输入客户名称",
+  "selecttheustomerdatayouwanttodelete": "请选择要删除的客户数据",
+  "determinethatyouwantodelete": "确定要批量删除客户",
+  "deleteCustomer": "删除客户",
+  "importedupdatedsuccessfully": "成功导入/更新",
+  "customerdata": "条客户数据。",
+  "modifythecustomer": "修改客户",
+  "makeuretodeletethecustomer": "确定要删除客户",
+  "expensereimbursementmodule": "费用报销模块",
+  "fillinthestaffexpenses": "员工费用填报",
+  "generalexpenses": "一般费用填报",
+  "travelexpensess": "差旅费用填报",
+  "outsourcingcostshouldbereported": "外包费用填报",
+  "listofreimbursementvouchers": "报销凭证列表",
+  "myexpensevoucher": "我的报销凭证",
+  "documentlist": "单据列表",
+  "documentreview": "单据审核",
+  "batchupload": "批量上传",
+  "expensetypemanagement": "费用类型管理",
+  "peopleconcerned": "报销人",
+  "pleaseselecttheapplicant": "请选择报销人",
+  "fillinthedate": "填报日期",
+  "optiondate": "选择日期",
+  "invoicenumber": "发票张数",
+  "cha-lv": "差旅",
+  "wai-bao": "外包",
+  "bei-zhu": "备注",
+  "newinvoice": "新增发票",
+  "subordinatetotheproject": "所属项目",
+  "invoices": "发票种类",
+  "pleaseselectthetypeoffee": "请选择费用类型",
+  "vATspecialinvoice": "增值税专用发票",
+  "vATgeneralinvoice": "增值税普通发票",
+  "amountoffees": "费用金额(含税)",
+  "invoiceno": "发票号",
+  "shui-shuai": "税率%",
+  "expensereimbursementvoucher": "报销凭证",
+  "clickupload": "点击上传",
+  "selecttheapplicant": "选择报销人",
+  "receiptnumber": "单据编号",
+  "find": "查找",
+  "ticketnumber": "票据编号",
+  "dismissreason": "驳回原因",
+  "cha-kan": "查看",
+  "detailsofReimbursementvoucher": "报销凭证详情",
+  "nodocuments": "暂无单据",
+  "expensereimbursementimporttemplate": "费用报销导入模板",
+  "exceltemplateanduploadit": "填写excel模板,并上传",
+  "selecthefile": "选取文件",
+  "toupload": "开始上传",
+  "clears": "清空",
+  "costofname": "费用名称",
+  "newtype": "新增类型",
+  "addeditfeetypes": "新增/编辑费用类型",
+  "belongstype": "所属类型",
+  "typename ": "类型名称",
+  "customizethfeetypename": "自定义费用类型名称",
+  "pleaseentercustomfeetypename": "请输入自定义费用类型名称",
+  "operationmaycausedatalossAreyousuredeletethedata": "该操作可能造成已有数据丢失,确定要删除吗?",
+  "confirmtoupload": "确认上传?",
+  "uploadedsuccessfully": "上传成功",
+  "editsuccess": "编辑成功",
+  "pleaseaddtheinvoice": "请添加发票",
+  "yousureyouwanttodelete": "确认要删除吗",
+  "pleaseselectpictures": "请选择图片",
+  "approvalprocesssetting": "审批流程设置",
+  "timeApprovalProcess": "工时审批流程",
+  "workinghoursapprovalprocessofdirectstaff": "直属人员工时审批流程",
+  "employeeisallowed": "员工填报",
+  "approvaltocomplete": "审批完成",
+  "selectheapprovingdepartment": "请选择审批部门",
+  "electanapprovaladministrator": "请选择审批管理员",
+  "dministrator": "指定管理员",
+  "departmenthead": "部门主管",
+  "personnelAdministrator": "人事管理员",
+  "setupthesuccess": "设置成功",
+  "onlyapplicabletotheimmediatestaffofthecurrentdepartment": "仅适用于当前部门的直属人员,子部门人员的审批流程需要单独设置",
+  "guan-li": "管理",
+  "bulkimport": "批量导入",
+  "add": "新增",
+  "numberofrelatedprojects": "相关项目数量",
+  "ge": "个",
+  "addedormodifiedthemaintenancedata": "新增/修改维护数据",
+  "importtheresults": "导入结果",
+  "dao-ru": "导入",
+  "shu-ju": "数据",
+  "importTemplate": "导入模板",
+  "pleaseentername": "请输入名称",
+  "pleaseselectheonesyouwanttodelete": "请选择要删除的",
+  "makesuretodeleteinbatches": "确定要批量删除",
+  "customersdata": "条客户数据",
+  "makesuretodeletethisone": "确定要删除这条",
+  "peaseselectmonth": "请选择月份",
+  "throughwithoneclick": "一键全部通过",
+  "monany": "月份",
+  "confirmapprovalofpendingdataforalldepartmentsanddates": "是否确认通过全部部门和日期的待审核数据?",
+  "listofSuppliers": "供应商列表",
+  "pleaseenterthevendornamekeyword": "请输入供应商名称关键字",
+  "newsuppliers": "新增供应商",
+  "importsuppliersinbatches": "批量导入供应商",
+  "exportSupplier": "导出供应商",
+  "classificationmanagement": "分类管理",
+  "supplierNo": "供应商编号",
+  "namsupplier": "供应商名称",
+  "classificationSuppliers": "供应商分类",
+  "importsupplierdata": "导入供应商数据",
+  "supplierimporttemplate": "供应商导入模板",
+  "supplierclassificationentrymanagement": "供应商分类条目管理",
+  "newCategoryItem": "新增分类项",
+  "addmodifycategoryentry": "新增/修改分类条目",
+  "gong-ying-shang-dao-chu": "供应商导出",
+  "selectthevendordatyouwanttodelete": "请选择要删除的供应商数据",
+  "determinethatyouwanttodeletevendorsinbulk": "确定要批量删除供应商",
+  "deletesupplier": "删除供应商",
+  "barsupplierdata": "条供应商数据",
+  "modifysupplier": "修改供应商",
+  "makesuretoremovethevendor": "确定要删除供应商",
+  "staffleavetofillin": "员工请假填报",
+  "all": "全部",
+  "singlelistofleave": "请假单列表",
+  "myleaveform": "我的请假单",
+  "for": "请假统计",
+  "leaveApprovalProcess": "请假审批流程",
+  "annualleavemanagement": "年假管理",
+  "scheduleofremainingLeave": "假期剩余表",
+  "aketimeoffto": "请假填报",
+  "leavetype": "请假类型",
+  "restcanbeadjusted": "剩余可调休",
+  "overtimhourscabeusedforoffsetting": "加班时长可用于调休抵扣",
+  "leavepeople": "请假人",
+  "phone": "电话",
+  "lengthunit": "时长单位",
+  "accordingdays": "按天请假",
+  "leavehour": "按小时请假",
+  "approver": "审批人",
+  "leavedays": "请假天数",
+  "leavetime": "请假时长",
+  "pleaseselectthepersonaskingforleave": "请选择请假人",
+  "offstate": "请假状态",
+  "pleaseselectthetypeofleave": "请选择请假类型",
+  "leavestarttime": "请假开始时间",
+  "leaveendtime": "请假结束时间",
+  "norequestforleaveatpresent": "暂无请假单",
+  "biao-ti": "标题",
+  "pleaseenterstaffsearch": "请输入人员搜索",
+  "Nstatisticpresent": "暂无请假统计",
+  "totaldaysleave": "请假总天数",
+  "totallengthofleave": "请假总时长",
+  "approvalprocessforleaveofdirect staff": "直属人员请假审批流程",
+  "pleaseselectapprover": "请选择审批人",
+  "selectdepartmentsdesignatepersonnel": "选择部门/指定人员",
+  "volumeset": "批量设置",
+  "pleaseenterhepersonnamesearch": "请输入人员姓名搜索",
+  "screeningDepartment": "按部门筛选",
+  "annualleaveperyear": "每年年假天数",
+  "remainingdaysofannualleave": "剩余年假天数",
+  "numberofannualleavedays": "修改年假天数",
+  "pleasesetthetimelimitforannualleave": "请设置年假时限",
+  "setthenumberofannualleavedaysperyear": "设置每年年假天数",
+  "pleaseenterdays": "请输入天数",
+  "departmentofscreening": "部门筛选",
+  "personnelselection": "人员筛选",
+  "synchronizefromStaple": "从钉钉同步",
+  "periodofvalidity": "有效期",
+  "combination": "总额度",
+  "beenused": "已使用",
+  "remainingamount": "剩余额度",
+  "leaveForm": "请假单详情",
+  "phonenumbercannotbeempty": "手机号不能为空",
+  "pleaseenterthecorrectcellphonenumber": "请输入正确的手机号",
+  "leavedayscannotbeempty": "请假天数不能为空",
+  "daysbeyondthecurrentlyselecteddat": "超过当前选择日期的天数",
+  "personalleaveisallowed": "事假填报",
+  "leaveisallowed": "病假填报",
+  "annualleaveisallowed": "年假填报",
+  "maternityleaveisallowed": "产假填报",
+  "synchronoussuccess": "同步成功",
+  "configureanapprover": "当前无审批人,请联系管理员配置审批人",
+  "selecttheitemsyouwanttobatchset": "请选择要批量设置的项",
+  "designatedpersonnel": "指定人员",
+  "deleteit": "确认要删除吗?",
+  "chartY": "图表Y轴:",
+  "accordingtothecost": "显示成本",
+  "accordingtoworkinghours": "显示工时",
+  "zhu-xiang-mu": "主项目",
+  "projectclassification": "项目分类",
+  "returnsuperior": "返回上级",
+  "timeReportExport": "工时报表导出",
+  "departmentchoice": "部门选择",
+  "classificationitems": "全部项目分类",
+  "choosethestyle": "选择样式",
+  "classifiedontheline": "项目分类在行上",
+  "Itemontheline": "项目在行上",
+  "classifiedcolumns": "项目分类在列上",
+  "itemisonthecolumn": "项目在列上",
+  "individualprojectdata": "含单个项目数据汇总",
+  "projectmanhourcoststatistics": "项目工时成本统计",
+  "labortimecoststatistics": "人员工时成本统计",
+  "projectclassificationlaborosttatistics": "项目分类工时成本统计",
+  "departmenthourscoststatistics": "部门工时成本统计",
+  "statistical": "统计",
+  "otalhourscost": "工时成本总计",
+  "zong-ji": "总计",
+  "businesstriisallowed": "出差填报",
+  "businesstriplist": "出差列表",
+  "mbusinesstrip": "我的出差",
+  "businessstatistics": "出差统计",
+  "businesstriApprovalProcess": "出差审批流程",
+  "travelreason": "出差事由",
+  "traffictools": "交通工具",
+  "plane": "飞机",
+  "train": "火车",
+  "car": "汽车",
+  "ship": "轮船",
+  "departurecity": "出发城市",
+  "destinationcity": "目的城市",
+  "roundtrip": "单程往返",
+  "oneway": "单程",
+  "backandforth": "往返",
+  "traveldays": "出差天数",
+  "automaticcalculation": "自动计算",
+  "travelnote": "出差备注",
+  "pleaseselectbusinesstraveler": "请选择出差人员",
+  "businessstate": "出差状态",
+  "morethantendays": "10天以上",
+  "businesspersonnel": "出差人员",
+  "detailsbusinessrip": "出差详情",
+  "trip": "行程",
+  "applytime": "申请时间",
+  "starttimeofbusinessrip": "出差开始时间",
+  "endtimeofbusinesstrip": "出差结束时间",
+  "nostatisticsonbusinesstripsatpresent": "暂无出差统计",
+  "cumulativebusinesstripdays": "累计出差天数",
+  "approvalprocessforbusiness": "直属人员出差审批流程",
+  "projectLeader": "项目负责人",
+  "onewayroundtrip": "单程/往返",
+  "projectAssociationInformation": "项目关联信息",
+  "rselatedprojects": "关联项目",
+  "addinganAssociatedItem": "新增关联项目",
+  "addedormodifiedassociateditems": "新增/修改关联项目",
+  "synchronizationperiodfromstaplecannotexceedsevendays": "从钉钉同步 时间段不能超过七天",
+  "synchronous": "同步",
+  "yourbusinesstrip": "请输入出差事由",
+  "selectyourdeparturecity": "请选择出发城市",
+  "saelectdestinationcity": "请选择目的城市",
+  "selectastarttime": "请选择开始时间",
+  "selectanendtime": "请选择结束时间",
+  "selectastartdate": "请选择开始日期",
+  "selectaenddate": "请选择结束日期",
+  "projectassociate": "请选择要关联的项目",
+  "tripStatistics": "出差统计导出",
+  "cannotbesynchronized": "从钉钉同步消息时间段不能超过七天",
+  "applicationissuccessful": "申请成功",
+  "roleauthorization": "角色权限",
+  "pleaseenterakeyworforquery": "请输入关键字查询",
+  "addingroles": "添加角色",
+  "Immediatelyadd": "立即添加",
+  "modifyingDefaultRole": "修改默认角色",
+  "jiao-se": "角色",
+  "mo-ren-jiao-se": "- (默认角色)",
+  "editingtherole": "编辑角色",
+  "Immediatelychange": "立即修改",
+  "assignpermissions": "分配权限",
+  "exportpermission": "导出权限",
+  "gong-neng": "功能",
+  "charactername": "角色名称",
+  "defaultrole": "默认角色",
+  "defaultroleforimportingpeople": "*设置导入人员时的默认角色",
+  "administratorcannotbeedited": "超级管理员为固定的默认角色无法编辑",
+  "operationwilldelete": "此操作将删除",
+  "shifujuxu": "角色, 是否继续?",
+  "quanxianshuju": "权限数据表",
+  "employeehourlywage": "员工时薪录入方式设置",
+  "methodsa": "方式一: 录入月成本,自动计算时薪",
+  "suitableforfulltimeemployees": "(适合企业全职员工)",
+  "workingdayspermonth": "平均每月工作天数",
+  "dailyworkinghours": "每日正常工作时长",
+  "lockingworkinghours": "锁定工作时长",
+  "hoursreporteperday": "锁定每日填报工时的上限",
+  "imitillingtime": "填报时长上限",
+  "workSettings": "加班设置",
+  "hourscanbereported": "可填报加班时长",
+  "chargedtocost": "加班工时记入成本",
+  "bei-gong-zi": "倍工资",
+  "visittwo": "方式二:直接录入时薪",
+  "timeemployees": "(适合计时发放酬劳的小时工,兼职员工)",
+  "employeeworkinghours": "员工工作时长上报方式设置",
+  "reportintheafternoon": "全天/上午/下午便捷上报",
+  "settheduration": "请设置时长",
+  "daylong": "全天时长",
+  "morningtime": "上午时长",
+  "afternoontime": "下午时长",
+  "chooseyourownhours": "自行选择工作时长",
+  "showthesample": "展示样例",
+  "owntimeframe": "自行选择时间范围",
+  "pointintime": "任意时间点",
+  "settingrestPeriod": "设置休息时间段",
+  "timeproportionally": "按比例分配时间",
+  "reminderSettings": "填报提醒设置",
+  "remindertime": "提醒时间",
+  "remindermethod": "请选择提醒方式",
+  "missingfill": "每日提醒当天漏填",
+  "missingfills": "每日提醒昨天漏填",
+  "remindertext": "提醒文本",
+  "personneltoset": "不提醒人员设置",
+  "addTian": "添加",
+  "timesetting": "员工填报日报时间设置",
+  "filltime": "补填时间",
+  "instructions": "(说明:系统管理员为员工代填日报时不受补填时间的限制)",
+  "filledinadvance": "可提前填报",
+  "timelydate": "员工填报及时日",
+  "dang-tian": "当天",
+  "oneday": "第二天",
+  "shreeday": "第三天",
+  "dailyreview": "日报自动审核时限:",
+  "dyas": "天后",
+  "dailyfilling": "自定义日报填报列表",
+  "afteritisenabled": "开启后系统可按该字段数据进行分类统计工时成本",
+  "parametermandatory": "是否为必填项",
+  "fieldnames": "字段名称",
+  "datamaintenance": "数据维护",
+  "dailyfillingvalue": "自定义日报填报数值",
+  "afterthisunctionisenabled": "开启后可按项目,部门和人员统计该数值",
+  "maximumvaluelimit": "是否开启最大值限制",
+  "maximum": "最大值",
+  "fillingtext": "自定义日报填报文本",
+  "additionalinformation": "开启后可员工可额外填写该信息",
+  "importauditing": "是否开启导入审核",
+  "eachdepartment": "审核人为各部门直属领导",
+  "maintenanceDatalist": "维护数据列表",
+  "addData": "新增数据",
+  "xin-zeng-shi-jian-duan": "新增时间段",
+  "xiu-gai": "修改",
+  "keywordfiltering": "输入关键字进行过滤",
+  "donlimit": "不限制",
+  "canbefilled": "仅可补填当月",
+  "lastmonth": "可补填到上个月",
+  "lastlastmonth": "可补填到上上月",
+  "newspaperwithin": "可补填7天内日报",
+  "previousdaydaily": "可补填前1天日报",
+  "dayworkinghours": "请选择全天工作时长",
+  "morningworkinghours": "请输入上午工作时长",
+  "afternoonworkinghours": "请输入下午工作时长",
+  "qing-xuan-ze-shi-jian-duan": "请选择时间段",
+  "takethisone": "确定要这条",
+  "shu-ju-ma": "数据吗?",
+  "wu-fa-shan-chu-1": "无法删除1",
+  "cannotbedeleted": "该数据正在使用,无法删除",
+  "addsuccessful": "添加成功",
+  "customDailyFillingList": "请输入[自定义日报填报列表]的字段名称",
+  "customDailyFillingLists": "请输入[自定义日报填报数值]的字段名称",
+  "customDailyFillingListss": "请输入[自定义日报填报文本]的字段名称",
+  "overtimepay": "请设置加班几倍工资",
+  "create": "创建",
+  "gong": "共",
+  "shangxian": "上限:",
+  "customConfiguration": "自定义配置",
+  "exportpersonnel": "导出人员",
+  "addpersonnel": "添加人员",
+  "associateenterprisemicroidentity": "关联企微身份",
+  "synchronizetheenterprisemicrodirectory": "同步企微通讯录",
+  "synchronizetheaddressbook": "同步钉钉通讯录",
+  "nameoftheperson": "请输入人员名字",
+  "directstaff": "直属员工",
+  "shou-ji": "手机",
+  "monthcost": "月成本",
+  "hourlywage": "时薪",
+  "ting-yong": "停用",
+  "zai-zhi": "在职",
+  "creationtime": "创建时间",
+  "transfer": "转让",
+  "reset": "重置",
+  "enable": "启用",
+  "modifyingDepartments": "批量修改部门",
+  "modifyingRoles": "批量修改角色",
+  "changes": "批量修改",
+  "setupdepartment": "设置部门",
+  "settherole": "设置角色",
+  "departmentname": "部门名称",
+  "responsiblepersons": "其他负责人",
+  "leadership": "直属领导",
+  "payway": "薪酬方式",
+  "fixedmonthlycost": "固定月成本",
+  "hourlywages": "计时工资",
+  "yuechengben": "请输入月成本,单位:元",
+  "yuegongzuoo": "按照每个月工作",
+  "xiaoshi": "小时预估时薪",
+  "meitian": "每天",
+  "modifyworkinghours": "修改工作时长",
+  "yuechengbenxiaoshi": "请输入成本 单位:元/小时",
+  "effectivedate": "生效日期",
+  "immediatesuperior": "直属上级",
+  "entrytime": "入职时间",
+  "postrank": "岗位职级",
+  "joblevel": "请输入岗位职级别",
+  "professionalcertificate": "专业证书",
+  "addprofessionalcertificate": "添加更多证书",
+  "professionalCertificate inManagement": "管理专业证书",
+  "certificate": "证书日期",
+  "certificatedate": "选择证书日期",
+  "editorialstaff": "编辑人员",
+  "historicalpersonnelcost": "人员历史成本",
+  "updatetime": "更新时间",
+  "monthlysalary": "固定月薪",
+  "monthlysalarys": "月薪",
+  "exportingpeople": "导出人员列表",
+  "serviceonly": "仅在职人员",
+  "permissiontotransfer": "权限转让",
+  "administratorroleto": "转让超级管理员角色至",
+  "transferoftheirrole": "转让后自己的角色",
+  "terminationstaff": "离职停用员工",
+  "employeedeparture": "员工离职日期",
+  "addededitedmanagement": "新增/编辑管理专业证书",
+  "professionalCertificateName": "专业证书名称",
+  "managecustomconfigurationitems": "自定义配置项管理",
+  "enteranameforacustomconfigurationitem": "请输入自定义配置项名称",
+  "dropdown": "下拉",
+  "input": "输入",
+  "configurationoptions": "配置选项",
+  "canconfiguretheoptions": "保存后可配置选项",
+  "newConfigurationOptions": "新增配置选项",
+  "addededitedconfigurationoptions": "新增/编辑配置选项",
+  "batchimportofpersonnel": "人员批量导入",
+  "personnelimporttemplate": "人员导入模板",
+  "synchronizetheenterprisewechataddressbook": "同步企业微信通讯录",
+  "oneWeix": "1. 填写企业微信通讯录Secret",
+  "firststep": "第一步:进入管理后台",
+  "secondstep": "第二步:进入通讯录同步",
+  "thirdstep": "第三步:查看Secret",
+  "twoWei": "2. 联系客服配置同步服务器",
+  "startsynchronization": "开始同步",
+  "correlationresults": "关联结果",
+  "eportandarticipate": "填报日报,参与项目协作",
+  "systemadministrators": "具有除了创建系统管理员之外的全部功能",
+  "financial": "财务核算成本,费用报销审核,负责组织架构管理",
+  "createandmanageprojects": "创建和管理项目",
+  "viewdailyreports": "查看日报、工时成本统计、财务核算、项目和报表",
+  "pleaseselectroles": "请选择角色",
+  "pleaseinputcost": "请输入成本",
+  "monthlycost": "请输入月成本",
+  "pleaseenterprofessionalcertificate": "请输入专业证书",
+  "pleaseenterthedepartmentname": "请输入部门名称",
+  "synchronizingtheassociation": "正在同步关联,请稍等...",
+  "booksecret": "请输入通讯录secret",
+  "synchronoussuccesss": "同步完成",
+  "areyousuretosynchronize ": "确认从钉钉同步通讯录吗?(可能需要一定的加载时间,请耐心等待)",
+  "operationcancelled": "已取消操作",
+  "namecannotbeempty": "名称不能为空",
+  "deletthisemployee": "确定要删除该员工吗?",
+  "stopsuccess": "停用成功",
+  "wanttotransfer": "请选择要转让的人员",
+  "pleaseselectaftertransfer": "请选择转让后您自己的角色",
+  "superadministratorrole": "您将失去超级管理员角色,需要重新登录。确定要转让吗?",
+  "listofallemployees": "全部员工列表",
+  "wanttoor": "确定要为",
+  "resetyourpassword": "重置密码吗?",
+  "saresetyourpassword": "重置密码",
+  "linglingling": "密码已重置为000000,请通知员工及时修改",
+  "addorialstaff": "新增人员",
+  "repeat": "重复证书",
+  "certificateisincomplete": "证书未填写完整",
+  "switchingroles": "切换角色成功",
+  "sureyouwantto": "确定要",
+  "zhang-hao": "账号",
+  "subdepartment": "新增子部门",
+  "addsubdepartment": "新增部门",
+  "editorialdepartment": "编辑部门",
+  "newsuccess": "新增成功",
+  "deletethedepartment": "确定要删除部门",
+  "deletethedepartmentdsa": "删除部门",
+  "deletionofprofessionalcertificate": "删除专业证书",
+  "listofitems": "项目列表",
+  "projectnamekeyword": "请输入项目名称关键字",
+  "itemnumberkeyword": "请输入项目编号关键字",
+  "paused": "已暂停",
+  "fen-lei": "分类",
+  "viewmore": "查看更多",
+  "importproject": "导入项目",
+  "importtemplateproject": "项目导入模板",
+  "exportProject": "导出项目",
+  "exportingTaskGroups": "导出任务分组",
+  "baselinecostitem": "基线成本项",
+  "masterprojectmanagement": "主项目管理",
+  "projectstagemanagement": "项目阶段管理",
+  "projectlevelmanagement": "项目级别管理",
+  "newproject": "新增项目",
+  "resourceallocation": "资源分配",
+  "contractno": "合同编号",
+  "projectphase": "项目阶段",
+  "nostage": "暂无阶段",
+  "pleaseselecttheprojectphase": "请选择项目阶段",
+  "participants": "参与者",
+  "ji-bie": "级别",
+  "zan-ting": "暂停",
+  "pi-liang-tian-jia": "批量添加",
+  "groupparticipantsinbatches": "批量添加分组参与人",
+  "projectparticipantsinbatches": "批量添加项目参与人",
+  "projectmanagersinbatches": "批量设置项目经理",
+  "projecttype": "项目类型",
+  "commonproject": "普通项目",
+  "publicprojects": "公共项目",
+  "ordinaryprojectsareopen": "普通项目只对参与人员开放,公共项目对所有成员开放",
+  "supplier": "供应商",
+  "newspaperauditor": "日报审核人",
+  "defaultistheprojectleader": "默认为项目负责人",
+  "zheng-shu": "整数",
+  "modifythereason": "修改原因",
+  "contractamountasd": "合同金额修改原因",
+  "ommencementDate": "计划开始日期",
+  "ji-hua-jie-shu-ri-qi": "计划结束日期",
+  "warrantystartime": "质保开始时间",
+  "warrantyexpirationtime": "质保截止时间",
+  "IndependentProject": "自主项目类别",
+  "softwareproject": "纯软件项目",
+  "hardwareproject": "纯硬件项目",
+  "integrationproject": "集成项目",
+  "region": "所属大区",
+  "subordinateBU": "所属BU",
+  "projectgroup": "项目分组",
+  "costbaseline": "成本基线",
+  "keynodes": "关键节点",
+  "nameofthenode": "节点名称",
+  "plannedcompletiontime": "计划完成时间",
+  "actualcompletiontime": "实际完成时间",
+  "yan-qi": "延期",
+  "engineering": "工程专业",
+  "nameprofessional": "专业名称",
+  "zhan-bi": "占比(%)",
+  "personnelproportion": "相关人员及占比",
+  "professionalparticipants": "设置专业参与人员",
+  "head": "负责人",
+  "subprojectno": "子项目编号",
+  "modifysubproject": "新增/修改子项目",
+  "baselinecostitemmanagement": "项目基线成本项管理",
+  "yu-jing": "预警",
+  "hourscostwarning": "工时成本预警",
+  "wu-yu-jing": "无预警",
+  "newcostitem": "新增成本项",
+  "keyprojectnodes": "项目关键节点管理",
+  "addingKeyNodes": "新增关键节点",
+  "projectclassificationqwe": "项目分类条目管理",
+  "bian-hao": "编号",
+  "fen-lei-ming-cheng": "分类名称",
+  "addzhuxiang": "新增主项目",
+  "phasename": "阶段名称",
+  "newprojectstage": "新增项目阶段",
+  "levelnames": "级别名称",
+  "newProjectLevel": "新增项目级别",
+  "modifyingtheprojectLevel": "新增/修改项目级别",
+  "projectLevelName": "项目级别名称",
+  "mainProjectName": "主项目名称",
+  "modifythemainproject": "新增/修改主项目",
+  "mainProjectNo": "主项目编号",
+  "modifyingtheprojectphase": "新增/修改项目阶段",
+  "projectStageName": "项目阶段名称",
+  "modificationcostitem": "新增/修改成本项",
+  "nameofcostitem": "成本项名称",
+  "modifyingKeyNodesn": "新增/修改关键节点",
+  "keyNodeNames": "关键节点名称",
+  "selectingParticipants": "选择参与人员",
+  "setupprojectprofessionals": "设置项目专业人员",
+  "professionals": "专业人员",
+  "professionaladdsparticipant": "请选择专业参与人",
+  "xuan-ze-fen-zu": "选择分组",
+  "selectagroup": "请选择分组",
+  "setupprojectmanager": "设置项目经理",
+  "projectimportresult": "项目导入结果",
+  "di-feng-xian": "低风险",
+  "zhong-feng-xian": "中风险",
+  "gao-feng-xian": "高风险",
+  "qing-shu-ru-bian-hao": "请输入编号",
+  "deletingprojectlevels": "删除项目级别",
+  "pleaseselectpersonnelasd": "请选择人员/分组",
+  "pleaseselecttheprojectmanager": "请选择项目经理",
+  "restartthesuccess": "重启成功",
+  "suspensionofsuccess": "暂停成功",
+  "projectcompletion": "项目完成",
+  "projectexport": "项目导出",
+  "projecttaskgroupexport": "项目任务分组导出",
+  "professionalscannotbeempty": "专业人员不能为空",
+  "professionalscannotrepeat": "专业人员不能重复",
+  "totalproportionmust": "占比合计必须是100%",
+  "majorcannotbeempty": "专业不能为空",
+  "personnelcannotbeleftblank": "专业相关人员不能为空",
+  "leadercannotbeblank": "专业负责人不能为空",
+  "shouldnotberepeated": "专业不能重复",
+  "numberomajorsmust": "专业占比合计必须是100%",
+  "deletingCategoryEntry": "删除分类条目",
+  "deletethemainproject": "删除主项目",
+  "deletingprojectphases": "删除项目阶段",
+  "deletingKeyNode": "删除关键节点",
+  "deletethecostbaselineitem": "删除成本基线项",
+  "makesuretodeletetheitem": "确定要删除项目",
+  "maincontent": "主要内容",
+  "completeproject": "完成项目",
+  "cancelproject": "撤销项目",
+  "restarttheproject": "重启项目",
+  "taskkanban": "任务看板",
+  "searchgroup": "搜索分组",
+  "replicationgroup": "复制分组",
+  "changegroups": "修改分组",
+  "settemplate": "设为模板",
+  "sethead": "设负责人",
+  "aparticipant": "设参与人",
+  "deletethegroup": "删除分组",
+  "groupdetails": "分组详情",
+  "shi-tu": "视图",
+  "renamingalist": "重命名列表",
+  "jie-zhi": "截止",
+  "ren-ling": "认领",
+  "creatingTaskList": "新建任务列表",
+  "ren-wu-lei-xing": "任务类型",
+  "taskstatus": "任务状态",
+  "parentsstask": "父任务",
+  "dai-fen-pei": "待分配",
+  "fileCenter": "文件中心",
+  "overviewoftheproject": "项目概览",
+  "datastatistics": "数据统计",
+  "costmanagement": "成本管理",
+  "valueanalysis": "挣值分析",
+  "jie-zhi-shi-jian": "截至时间",
+  "wan-cheng-shi-jian": "完成时间",
+  "danweitian": "请输入计划工作时长,单位天",
+  "tixiang": "提醒谁查看:",
+  "guanlian": "关联任务",
+  "zirwu": "子任务",
+  "associatedTask": "添加关联任务",
+  "addingsubtask": "添加子任务",
+  "dissociated": "解除关联",
+  "jiafuchengguo": "相关文件/交付成果",
+  "associatedfiles": "关联文件",
+  "uoloadFiles": "上传文件",
+  "filenames": "文件名称",
+  "filesize": "文件大小",
+  "founder": "创建人",
+  "wenjian1guanli": "从文件中心选择已有文件进行关联",
+  "xuanzwenjian": "选择文件",
+  "selecttask": "选择任务",
+  "returnmilestone": "返回里程碑",
+  "cha-kan-guan-lian-ren-wu": "查看关联任务",
+  "cha-kan-zi-ren-wu": "查看子任务",
+  "newgrouping": "新建分组",
+  "creatintemplate": "从模板创建",
+  "taskgroupleader": "设置任务分组负责人",
+  "modifyingTaskGroup": "修改任务分组",
+  "addtemplate": "添加为模板",
+  "entertemplatename": "请输入模板名称",
+  "sametimetosave": "同时保存",
+  "savetemplate": "存为模板",
+  "modifyingtheTaskList": "新增/修改任务列表",
+  "workplanexport": "工作计划导出",
+  "choosetype": "选择类型",
+  "typesof": "全部类型",
+  "wdorkplanimport": "工作计划导入",
+  "qing-xian-xia-zai-mo-ban-bing-tian-xie-hou-shang-chuan": "请先下载模板并填写后上传",
+  "projectTaskTemplate": "项目任务模板",
+  "projecttasktemplatedownload": "项目任务模板下载",
+  "faoesgfavsbxjs": "如导入的任务属于多个列表,可在导入后拖拽来更改所属列表",
+  "manuallydragthesequence": "手动拖拽顺序",
+  "creationtimeisthelatest": "创建时间最晚",
+  "deadlineisthelatest": "截止时间最晚",
+  "highestpriority": "优先级最高",
+  "xuanzguanlianwenjian": "请选择关联文件",
+  "guan-lian-cheng-gong": "关联成功",
+  "quxiaoguanlan": "是否确定取消关联此文件?",
+  "yi-shang-chuan": "已上传",
+  "jie-chu-cheng-gong": "解除成功",
+  "que-ren-yao-shan-chu": "确认要删除",
+  "deletingTemplateSuccessfully": "删除模板成功",
+  "addTemplateSuccessfully": "添加模板成功",
+  "detelecesTask": "确认删除吗?",
+  "tasksgroupsDetalses": "分组下的任务也将一同删除,您确认删除该分组吗?",
+  "qngxuanz": "请选择模板",
+  "projectalreadyhasgroup": "当前项目已存在分组",
+  "changethegroupname": "请修改组名后重试。",
+  "library": "文件库",
+  "createafolder": "创建文件夹",
+  "fileupload": "文件上传",
+  "recentdocuments": "近期文件",
+  "da-xiao": "大小",
+  "creator": "创建者",
+  "modifyingFolder": "新增/修改文件夹",
+  "pleaseenterfoldername": "请输入文件夹名称",
+  "wanttomove": "确认要移到回收站吗?"
 }

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

@@ -170,7 +170,7 @@
                 </el-dialog>
 
                 <!--修改信息-->
-                <el-dialog :title="$t('lable.modifyTheInformation')" width='450px' v-if="editInformation" :visible.sync="editInformation" :close-on-click-modal="false" customClass="customWidth">
+                <el-dialog :title="$t('title.modifyTheInformation')" width='450px' v-if="editInformation" :visible.sync="editInformation" :close-on-click-modal="false" customClass="customWidth">
                     <el-form :model="editInfoForm" label-width="auto" :rules="passRule" ref="editInfoForm">
                         <el-form-item :label="$t('lable.name')" prop="username">
                             <el-input v-model="editInfoForm.username" autocomplete="off" :placeholder="$t('defaultText.PleaseEnterYourName')"></el-input>

+ 200 - 200
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -1,37 +1,37 @@
 <template>
 <section>
     <div class="sidebars" ref="sidebars" style="width: 200px;display: block;background: #fff" v-if="!isDingding">
-        <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>出差管理</h3>
+        <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>{{ $t('navigation.evectionManagement') }}</h3>
         <el-divider ></el-divider>
         <el-col :span="12">
             <el-menu default-active="1" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" active-text-color="#20A0FF" style="width:100%">
                 <el-menu-item index="1" v-if="permissions.awayOfficeFil">
                     <i class="iconfont firerock-icontianbao"></i>
-                    <span slot="title">出差填报</span>
+                    <span slot="title">{{ $t('businesstriisallowed') }}</span>
                 </el-menu-item>
                 <el-submenu index="2" v-if="permissions.awayOfficeAll">
                     <template slot="title">
                         <i class="iconfont firerock-iconbaoxiaodan"></i>
-                        <span>{{"出差列表"}}</span>
+                        <span>{{ $t('businesstriplist') }}</span>
                     </template>
                     <!-- 导航切换 -->
-                    <el-menu-item index="2-1" v-if="permissions.awayOfficeAll"><p @click="bills(false, 2)">全部</p></el-menu-item>
-                    <el-menu-item index="2-2" v-if="permissions.awayOfficeAudit && !isDingding"><p @click="bills(true, 1)">待审核</p></el-menu-item>
+                    <el-menu-item index="2-1" v-if="permissions.awayOfficeAll"><p @click="bills(false, 2)">{{ $t('all') }}</p></el-menu-item>
+                    <el-menu-item index="2-2" v-if="permissions.awayOfficeAudit && !isDingding"><p @click="bills(true, 1)">{{ $t('state.WaitingAudit') }}</p></el-menu-item>
                 </el-submenu>
                 <el-menu-item index="3" @click="bills(false, 2)" v-if="!permissions.awayOfficeAll">
                     <i class="iconfont firerock-iconbaoxiaodan"></i>
-                    <span slot="title">我的出差</span>
+                    <span slot="title">{{ $t('mbusinesstrip') }}</span>
                 </el-menu-item>
                 <el-menu-item index="4" v-if="permissions.awayOfficeStatistical">
                     <template slot="title">
                         <i class="iconfont firerock-icontianbao"></i>
-                        <span slot="title">出差统计</span>
+                        <span slot="title">{{ $t('businessstatistics') }}</span>
                     </template>
                 </el-menu-item>
                 <el-menu-item index="5" v-if="permissions.awayOfficeProcess">
                     <template slot="title">
                         <i class="iconfont firerock-iconliucheng"></i>
-                        <span slot="title">出差审批流程</span>
+                        <span slot="title">{{ $t('businesstriApprovalProcess') }}</span>
                     </template>
                 </el-menu-item>
             </el-menu>
@@ -40,19 +40,19 @@
 
     <div class="contents">
         <div ref="headine" class="headine" v-if="!displayTable">
-        <h3 ref="headHe" style="padding-left: 220px">出差填报</h3>
+        <h3 ref="headHe" style="padding-left: 220px">{{ $t('businesstriisallowed') }}</h3>
         </div>
         <!-- 出差填报 -->
         <div class="tops" v-if="!displayTable && apk == 0">
             <div class="ctons">
                 <el-form ref="addformAO" v-loading="formloading" :model="addform" label-width="80px" :rules="formrules" style="width:700px">
                     <!-- 出差事由 -->
-                    <el-form-item label="出差事由" prop="reason" style="width:100%">
+                    <el-form-item :label="$t('travelreason')" prop="reason" style="width:100%">
                         <el-input v-model="addform.reason" style="width: 555px" maxlength="25" type="text" show-word-limit></el-input>
                     </el-form-item>
                     <!-- 维度选择添加 -->
-                        <el-form-item label="投入项目" style="width:300px;margin-right:30px" prop="projectId">
-                            <el-select style="width:100%" @change="getwuduList(1)" v-model="addform.projectId" filterable clearable placeholder="请选择投入项目" >
+                        <el-form-item :label="$t('screening.inputProject')" style="width:300px;margin-right:30px" prop="projectId">
+                            <el-select style="width:100%" @change="getwuduList(1)" v-model="addform.projectId" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                                 <el-option
                                 v-for="item in projectList"
                                 :key="item.id"
@@ -65,7 +65,7 @@
                         v-if="addform.projectId != null && wuduData.customDegreeActive == 1"
                         style="width:300px;margin-right:30px"
                         prop="degreeId">
-                            <el-select style="width:100%" v-model="addform.degreeId" filterable clearable placeholder="请选择" >
+                            <el-select style="width:100%" v-model="addform.degreeId" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                                 <el-option
                                 v-for="item in wuduList"
                                 :key="item.id"
@@ -76,18 +76,18 @@
                         </el-form-item>
                         <!-- <span>行程</span> -->
                         <!-- 交通工具 -->
-                        <el-form-item label="交通工具" style="width:100%">
+                        <el-form-item :label="$t('traffictools')" style="width:100%">
                             <el-radio-group v-model="addform.way">
-                                <el-radio :label="0">飞机</el-radio>
-                                <el-radio :label="1">火车</el-radio>
-                                <el-radio :label="2">汽车</el-radio>
-                                <el-radio :label="3">轮船</el-radio>
-                                <el-radio :label="4">其他</el-radio>
+                                <el-radio :label="0">{{ $t('plane') }}</el-radio>
+                                <el-radio :label="1">{{ $t('train') }}</el-radio>
+                                <el-radio :label="2">{{ $t('car') }}</el-radio>
+                                <el-radio :label="3">{{ $t('ship') }}</el-radio>
+                                <el-radio :label="4">{{ $t('leave.other') }}</el-radio>
                             </el-radio-group>
                         </el-form-item>
                         <!-- 出发城市 -->
-                        <el-form-item label="出发城市" style="width:300px;margin-right:30px" prop="cityFrom">
-                            <el-select style="width:100%" v-model="addform.cityFrom" filterable clearable placeholder="请选择出发城市" >
+                        <el-form-item :label="$t('departurecity')" style="width:300px;margin-right:30px" prop="cityFrom">
+                            <el-select style="width:100%" v-model="addform.cityFrom" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                                 <el-option
                                 v-for="item in cityList"
                                 :key="item.value"
@@ -97,8 +97,8 @@
                             </el-select>
                         </el-form-item>
                         <!-- 目的城市 -->
-                        <el-form-item label="目的城市" style="width:300px" prop="cityTo">
-                            <el-select style="width:100%" v-model="addform.cityTo" filterable clearable placeholder="请选择目的城市">
+                        <el-form-item :label="$t('destinationcity')" style="width:300px" prop="cityTo">
+                            <el-select style="width:100%" v-model="addform.cityTo" filterable clearable :placeholder="$t('defaultText.pleaseChoose')">
                                 <el-option
                                 v-for="item in cityList"
                                 :key="item.value"
@@ -108,10 +108,10 @@
                             </el-select>
                         </el-form-item>
                         <!-- 开始时间 -->
-                        <el-form-item label="开始时间" style="width:300px;margin-right:30px" prop="startDate">
+                        <el-form-item :label="$t('starttimes')" style="width:300px;margin-right:30px" prop="startDate">
                             <el-date-picker
                             type="date"
-                            placeholder="开始日期"
+                            :placeholder="$t('time.startDate')"
                             value-format="yyyy-MM-dd"
                             v-model="addform.startDate"
                             style="width:100%"
@@ -119,10 +119,10 @@
                             </el-date-picker>
                         </el-form-item>
                         <!-- 结束时间 -->
-                        <el-form-item label="结束时间" style="width:300px" prop="endDate">
+                        <el-form-item :label="$t('time.endTime')" style="width:300px" prop="endDate">
                             <el-date-picker
                             type="date"
-                            placeholder="结束日期"
+                            :placeholder="$t('time.endDate')"
                             value-format="yyyy-MM-dd"
                             v-model="addform.endDate"
                             style="width:100%"
@@ -130,24 +130,24 @@
                             </el-date-picker>
                         </el-form-item>
                         <!-- 单程/往返 -->
-                        <el-form-item label="单程往返" style="width:300px;margin-right:30px">
+                        <el-form-item :label="$t('roundtrip')" style="width:300px;margin-right:30px">
                             <el-radio-group v-model="addform.goBack">
-                                <el-radio :label="0">单程</el-radio>
-                                <el-radio :label="1">往返</el-radio>
+                                <el-radio :label="0">{{ $t('oneway') }}</el-radio>
+                                <el-radio :label="1">{{ $t('backandforth') }}</el-radio>
                             </el-radio-group>
                         </el-form-item>
                         <!-- 出差天数 -->
-                        <el-form-item label="出差天数" style="width:300px">
-                            <el-input type="number" placeholder="自动计算" v-model="addform.dayCount" min="0" style="width:100%"></el-input>
+                        <el-form-item :label="$t('traveldays')" style="width:300px">
+                            <el-input type="number" :placeholder="$t('automaticcalculation')" v-model="addform.dayCount" min="0" style="width:100%"></el-input>
                         </el-form-item>
                         <!-- 出差备注 -->
-                        <el-form-item label="出差备注" style="width:635px">
+                        <el-form-item :label="$t('travelnote')" style="width:635px">
                             <el-input type="textarea" v-model="addform.remark" :rows="3" style="width: 100%" maxlength="100" show-word-limit></el-input>
                         </el-form-item>
                 </el-form>
                 <div>
                     <p style="width:635px;text-align:center;">
-                        <el-button type="primary" @click="formsubmit('formrules')" size="mini">提交</el-button>
+                        <el-button type="primary" @click="formsubmit('formrules')" size="mini">{{ $t('btn.submit') }}</el-button>
                     </p>
                 </div>
             </div>
@@ -157,7 +157,7 @@
             <div class="ctons">
         <!-- 出差列表筛选 -->
                 <div class="flex">
-                    <div><el-select v-model="ownerIds" placeholder="请选择出差人员" clearable @change="billss(1)" style="width: 140px" size="small" filterable="true">
+                    <div><el-select v-model="ownerIds" :placeholder="$t('pleaseselectbusinesstraveler')" clearable @change="billss(1)" style="width: 140px" size="small" filterable="true">
                             <el-option
                             v-for="item in users"
                             :key="item.id"
@@ -165,55 +165,55 @@
                             :value="item.id">
                             </el-option>
                     </el-select></div>
-                    <div><span style="color: #606266">交通工具</span>
-                        <el-select v-model="type" placeholder="请选择交通工具" clearable @change="billss(1)" style="width: 140px;" size="small" filterable="true">
-                            <el-option label="飞机" :value="0"></el-option>
-                            <el-option label="火车" :value="1"></el-option>
-                            <el-option label="汽车" :value="2"></el-option>
-                            <el-option label="轮船" :value="3"></el-option>
-                            <el-option label="其他" :value="4"></el-option>
+                    <div><span style="color: #606266">{{ $t('traffictools') }}</span>
+                        <el-select v-model="type" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="billss(1)" style="width: 140px;" size="small" filterable="true">
+                            <el-option :label="$t('plane')" :value="0"></el-option>
+                            <el-option :label="$t('train')" :value="1"></el-option>
+                            <el-option :label="$t('car')" :value="2"></el-option>
+                            <el-option :label="$t('ship')" :value="3"></el-option>
+                            <el-option :label="$t('leave.other')" :value="4"></el-option>
                         </el-select>
                     </div>
-                    <div><span style="color: #606266">出差状态</span>
-                        <el-select :disabled="falg" v-model="code" placeholder="请选择出差状态" clearable @change="billss(1)" size="small" style="width: 140px" filterable="true">
-                            <el-option label="审核通过" :value="0"></el-option>
-                            <el-option label="待审核" :value="1"></el-option>
-                            <el-option label="驳回" :value="2"></el-option>
-                            <el-option label="已撤销" :value="3"></el-option>
+                    <div><span style="color: #606266">{{ $t('businessstate') }}</span>
+                        <el-select :disabled="falg" v-model="code" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="billss(1)" size="small" style="width: 140px" filterable="true">
+                            <el-option :label="$t('state.approved')" :value="0"></el-option>
+                            <el-option :label="$t('state.WaitingAudit')" :value="1"></el-option>
+                            <el-option :label="$t('btn.rejected')" :value="2"></el-option>
+                            <el-option :label="$t('state.undone')" :value="3"></el-option>
                         </el-select>
                         
                     </div>
-                    <div><span style="color: #606266">时间段</span>
-                        <el-date-picker v-model="createDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="billss(1)" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable style="width:280px"></el-date-picker>
+                    <div><span style="color: #606266">{{ $t('message.period') }}</span>
+                        <el-date-picker v-model="createDate" type="daterange" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" @change="billss(1)" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')" size="small" clearable style="width:280px"></el-date-picker>
                     </div>
                     <div style="line-height: 32px;margin: 0 20px;">
-                        <el-checkbox v-model="isOverTendays" @change="checkboxChange">10天以上</el-checkbox>
+                        <el-checkbox v-model="isOverTendays" @change="checkboxChange">{{ $t('morethantendays') }}</el-checkbox>
                     </div>
                     <!-- 从钉钉同步按钮,只有钉钉的用户并且有查看全部权限的管理员才有同步按钮 -->
                     <div style="margin: 0 0 0 20px" v-if="userComLis.dingdingUserid != null && permissions.awayOfficeAll">
-                        <el-button size="small" type="primary" @click="dingdingClick()" >从钉钉同步</el-button>
+                        <el-button size="small" type="primary" @click="dingdingClick()" >{{ $t('synchronizefromStaple') }}</el-button>
                     </div>
                     <div style="margin: 0 0 0 20px" v-if="userComLis.dingdingUserid != null">
-                        <el-button size="small" type="primary" @click="dingdingListExport()" >导出</el-button>
+                        <el-button size="small" type="primary" @click="dingdingListExport()" >{{ $t('export.export') }}</el-button>
                     </div>
                 </div>
         <!-- 出差列表 -->
                 <el-table :data="tableList" style="width: 100%" height="90%" :loading="tableListLoading">
-                    <el-table-column prop="ownerName" label="出差人员" width="100" fixed="left" align="center">
+                    <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left" align="center">
                         <template slot-scope="scope">
                             <span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">{{scope.row.ownerName}}</span>
                         </template>
                     </el-table-column>
                     <!-- <el-table-column prop="reason" label="出差事由" width="150" header-align="center"></el-table-column> -->
-                    <el-table-column label="出差天数" width="120" align="center">
+                    <el-table-column :label="$t('traveldays')" width="120" align="center">
                         <template slot-scope="scope">
-                            <div><span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">{{scope.row.dayCount}}</span></div>
+                            <div><span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">{{scope.row.dayCount}}{{ $t('time.day') }}</span></div>
                         </template>
                     </el-table-column>
-                    <el-table-column label="出差详情" width="600" align="center">
+                    <el-table-column :label="$t('detailsbusinessrip')" width="600" align="center">
                         <template slot-scope="scope">
                             <div v-for="item in scope.row.projectList" :key="item.projectId" class="detailsScope">
-                                <span>{{item.startDate + '至' + item.endDate}}</span><span>{{item.projectName}}</span><span>{{item.degreeName}}</span>
+                                <span>{{item.startDate + $t('other.to') + item.endDate}}</span><span>{{item.projectName}}</span><span>{{item.degreeName}}</span>
                             </div>
                         </template>
                     </el-table-column>
@@ -222,38 +222,38 @@
                             <span v-for="item in scope.row.projectList" :key="item.projectId">{{item.degreeName == null ? '' : item.degreeName + '\u3000'}}</span>
                         </template>
                     </el-table-column> -->
-                    <el-table-column label="交通工具" width="120" align="center">
+                    <el-table-column :label="$t('traffictools')" width="120" align="center">
                         <template slot-scope="scope">
-                            <span v-if="scope.row.way == 0">飞机</span>
-                            <span v-if="scope.row.way == 1">火车</span>
-                            <span v-if="scope.row.way == 2">汽车</span>
-                            <span v-if="scope.row.way == 3">轮船</span>
-                            <span v-if="scope.row.way == 4">其他</span>
+                            <span v-if="scope.row.way == 0">{{ $t('plane') }}</span>
+                            <span v-if="scope.row.way == 1">{{ $t('train') }}</span>
+                            <span v-if="scope.row.way == 2">{{ $t('car') }}</span>
+                            <span v-if="scope.row.way == 3">{{ $t('ship') }}</span>
+                            <span v-if="scope.row.way == 4">{{ $t('leave.other') }}</span>
                         </template>
                     </el-table-column>
-                    <el-table-column label="行程" width="120" align="center" v-if="!isDingding">
+                    <el-table-column :label="$t('trip')" width="120" align="center" v-if="!isDingding">
                         <template slot-scope="scope">{{scope.row.cityFrom + '-' + scope.row.cityTo}}</template>
                     </el-table-column>
-                    <el-table-column prop="indate" label="申请时间" width="150" align="center" v-if="!isDingding"></el-table-column>
+                    <el-table-column prop="indate" :label="$t('applytime')" width="150" align="center" v-if="!isDingding"></el-table-column>
                     
-                    <el-table-column prop="startDate" label="出差开始时间" width="150"></el-table-column>
-                    <el-table-column prop="endDate" label="出差结束时间" width="150"></el-table-column>
-                    <el-table-column prop="status" label="状态" width="100">
+                    <el-table-column prop="startDate" :label="$t('starttimeofbusinessrip')" width="150"></el-table-column>
+                    <el-table-column prop="endDate" :label="$t('endtimeofbusinesstrip')" width="150"></el-table-column>
+                    <el-table-column prop="status" :label="$t('state.states')" width="100">
                         <template slot-scope="scope">
-                            <span v-if="scope.row.status == 0">审核通过</span>
-                            <span v-if="scope.row.status == 1" style="color: orange">待审核</span>
-                            <span v-if="scope.row.status == 2" style="color: red">驳回</span>
-                            <span v-if="scope.row.status == 3" style="color: #666666">撤销</span>
+                            <span v-if="scope.row.status == 0">{{ $t('state.approved') }}</span>
+                            <span v-if="scope.row.status == 1" style="color: orange">{{ $t('state.WaitingAudit') }}</span>
+                            <span v-if="scope.row.status == 2" style="color: red">{{ $t('btn.rejected') }}</span>
+                            <span v-if="scope.row.status == 3" style="color: #666666">{{ $t('btn.undo') }}</span>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="remark" label="备注" width="200">
+                    <el-table-column prop="remark" :label="$t('bei-zhu')" width="200">
                         <template slot-scope="scope">
-                            <el-popover placement="top-start" title="标题" width="200" trigger="hover" :content="scope.row.remark">
+                            <el-popover placement="top-start" :title="$t('biao-ti')" width="200" trigger="hover" :content="scope.row.remark">
                                 <div slot="reference" class="apls">{{scope.row.remark}}</div>
                             </el-popover>
                         </template>
                     </el-table-column>
-                    <el-table-column v-if="!isDingding" :label="isAuditList ? '审核' : '操作'" width="180" fixed="right" >
+                    <el-table-column v-if="!isDingding" :label="isAuditList ? $t('other.audit') : $t('operation')" width="180" fixed="right" >
                         <template slot-scope="scope">
                             <div v-if="isAuditList">
                                 <el-button icon="el-icon-check" circle size="mini" @click="approve(scope.row)"></el-button>
@@ -265,7 +265,7 @@
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column v-if="isDingding" label="操作" width="150" fixed="right">
+                    <el-table-column v-if="isDingding" :label="$t('operation')" width="150" fixed="right">
                         <template slot-scope="scope">
                             <el-button icon="iconfont firerock-iconguanlian" circle size="mini" @click="DingdingEditor(scope.row)"></el-button>
                             <el-button v-if="permissions.awayOfficeDelete" icon="el-icon-delete" circle size="mini" @click="deleteOfDingding(scope.row)"></el-button>
@@ -291,19 +291,19 @@
             <div class="ctons">
             <div style="display: flex;align-items: center;padding-bottom: 20px;border-bottom: 1px solid #f2f2f2">
                 <div style="display: inline-block;width: 350px">
-                    <el-input style="float:left;" v-model="searchWord" class="input-with-select" placeholder="请输入人员搜索" clearable="true" size="small">
+                    <el-input style="float:left;" v-model="searchWord" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
                         <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
                     </el-input>
                 </div>
                 <div style="display: inline-block;width: 700px;margin-left: 100px">
-                    <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">时间段</span>
+                    <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('message.period') }}</span>
                     <el-date-picker
                         size="small"
                         v-model="searchDates"
                         type="daterange"
-                        range-separator="至"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
+                        :range-separator="$t('other.to')"
+                        :start-placeholder="$t('time.startDate')"
+                        :end-placeholder="$t('time.endDate')"
                         @change="statistical()"
                         :clearable="false"
                         value-format="yyyy-MM-dd">
@@ -314,30 +314,30 @@
             <!-- <div style="margin-top: 30px"> -->
             <div>
                 <el-table key="apk2is4" v-loading="loading" :data="statisticalList" height="780px" style="width: 99%">
-                    <el-table-column prop="ownerName" label="姓名" width="300">
+                    <el-table-column prop="ownerName" :label="$t('lable.name')" width="300">
                         <template slot-scope="scope">
                             <div v-if="scope.row.ownerName">
                             {{scope.row.ownerName}}
                             </div>
                             <div v-else>
-                            <span>暂无出差统计</span>
+                            <span>{{ $t('nostatisticsonbusinesstripsatpresent') }}</span>
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="departmentName" label="部门" width="300">
+                    <el-table-column prop="departmentName" :label="$t('lable.department')" width="300">
                         <!-- <template slot-scope="scope">
                             {{scope.row.departmentName}}/天
                         </template> -->
                     </el-table-column>
-                    <el-table-column prop="dayCount" label="累计出差天数" width="300">
+                    <el-table-column prop="dayCount" :label="$t('cumulativebusinesstripdays')" width="300">
                         <template slot-scope="scope">
-                            {{scope.row.dayCount}}
+                            {{scope.row.dayCount}}{{ $t('time.day') }}
                         </template>
                     </el-table-column>
-                    <el-table-column label="详情" width="300">
+                    <el-table-column :label="$t('details')" width="300">
                         <template slot-scope="scope">
                             <!-- {{scope.row.timeDays}} -->
-                            <el-button size="mini" @click="viewDetails(1,scope.row)">查看详情</el-button>
+                            <el-button size="mini" @click="viewDetails(1,scope.row)">{{ $t('Checkthedetails') }}</el-button>
                         </template>
                     </el-table-column>
                 </el-table>
@@ -357,73 +357,73 @@
                 <el-col :span="18" >
                     <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
                         <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                            <div style="padding:5px;color:#333;" v-if="depData != null">设置 &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> 直属人员出差审批流程
-                                <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" content="仅适用于当前部门的直属人员,子部门人员的审批流程需要单独设置" placement="top-start">
+                            <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> {{ $t('approvalprocessforbusiness') }}
+                                <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                                     <i class="el-icon-question"></i>
                                 </el-tooltip>
                             </div>
-                            <div style="padding:5px;" v-if="depData == null">请选择部门</div>
+                            <div style="padding:5px;" v-if="depData == null">{{ $t('qing-xuan-ze-bu-men') }}</div>
                             <div style="width:100%;margin:0 auto;text-align: center; margin-top:50px;" v-if="depData != null">
-                                <span>员工填报</span>
+                                <span>{{ $t('employeeisallowed') }}</span>
                                 <icon class="iconfont firerock-iconright"></icon>
                                 <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
                                 <icon class="iconfont firerock-iconright"></icon>
                                 <span v-for="(item, index) in dataArray" :key="item.seq" >
                                     <el-button type="primary" v-if="item.auditorType == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
-                                    <el-button type="primary" v-if="item.auditorType == 0" >项目负责人</el-button>
+                                    <el-button type="primary" v-if="item.auditorType == 0" >{{ $t('projectLeader') }}</el-button>
                                     <el-button type="primary" v-if="item.auditorType == 2" @click="editNodeDialog(index, item)">{{item.userName}}</el-button>
                                     <icon class="iconfont firerock-iconright"></icon>
                                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                                     <icon class="iconfont firerock-iconright"></icon>
                                 </span>
                                 <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
-                                审批完成
+                                {{ $t('approvaltocomplete') }} 
                             </div>
                             <div style="width:100%;margin:0 auto;margin-bottom:30px;position: absolute;bottom: 0px;text-align: center; ">
-                                <el-button type="primary" @click="submitInsert">保存</el-button>
+                                <el-button type="primary" @click="submitInsert">{{ $t('save') }}</el-button>
                             </div>
                         </div>
                     </el-scrollbar>
                 </el-col>
             </div>
-            <el-dialog  title="请选择审批人" v-if="dialogVisible" :visible.sync="dialogVisible"  width="460px">
+            <el-dialog  :title="$t('pleaseselectapprover')" v-if="dialogVisible" :visible.sync="dialogVisible"  width="460px">
                 <el-form label-width="140px">
-                    <el-form-item label="选择部门/指定人员" >
-                        <el-cascader filterable ref="deptCascader" v-model="curDeptId" placeholder="请选择部门/指定人员" style="width: 100%" @change="chooseDept" :options="soption" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
+                    <el-form-item :label="$t('selectdepartmentsdesignatepersonnel')" >
+                        <el-cascader filterable ref="deptCascader" v-model="curDeptId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 100%" @change="chooseDept" :options="soption" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
                     </el-form-item>
                 </el-form>
                 <div slot="footer" class="dialog-footer">
-                    <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">删除</el-button>
-                    <el-button type="primary" @click="addNode" >确定</el-button>
+                    <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">{{ $t('btn.delete') }}</el-button>
+                    <el-button type="primary" @click="addNode" >{{ $t('btn.determine') }}</el-button>
                 </div>
             </el-dialog>
         </div>
     </div>
     <!-- 编辑框 -->
-    <el-dialog title="出差详情" v-if="editDialog" :visible.sync="editDialog" width="1000px">
+    <el-dialog :title="$t('detailsbusinessrip')" v-if="editDialog" :visible.sync="editDialog" width="1000px">
         <!-- <el-form ref="editItemForm" :model="editItemForm" label-width="80px" :rules="editItemFormRules"> -->
         <el-form ref="editItemForm" :model="editItemForm" label-width="80px" :rules="editItemRules">
-            <el-form-item label="出差人员" prop="ownerName"  style="width: 300px;display: inline-block;">
+            <el-form-item :label="$t('businesspersonnel')" prop="ownerName"  style="width: 300px;display: inline-block;">
                 <span>{{editItemForm.ownerName}}</span>
             </el-form-item>
-            <el-form-item label="单程/往返" prop="goBack" style="width: 300px;display: inline-block;">
+            <el-form-item :label="$t('onewayroundtrip')" prop="goBack" style="width: 300px;display: inline-block;">
                 <el-radio-group v-model="editItemForm.goBack">
-                    <el-radio :label="0">单程</el-radio>
-                    <el-radio :label="1">往返</el-radio>
+                    <el-radio :label="0">{{ $t('oneway') }}</el-radio>
+                    <el-radio :label="1">{{ $t('backandforth') }}</el-radio>
                 </el-radio-group>
             </el-form-item>
             <!-- 交通工具 -->
-            <el-form-item label="交通工具" style="width:100%">
+            <el-form-item :label="$t('traffictools')" style="width:100%">
                 <el-radio-group v-model="editItemForm.way">
-                    <el-radio :label="0">飞机</el-radio>
-                    <el-radio :label="1">火车</el-radio>
-                    <el-radio :label="2">汽车</el-radio>
-                    <el-radio :label="3">轮船</el-radio>
-                    <el-radio :label="4">其他</el-radio>
+                    <el-radio :label="0">{{ $t('plane') }}</el-radio>
+                    <el-radio :label="1">{{ $t('train') }}</el-radio>
+                    <el-radio :label="2">{{ $t('car') }}</el-radio>
+                    <el-radio :label="3">{{ $t('ship') }}</el-radio>
+                    <el-radio :label="4">{{ $t('leave.other') }}</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="投入项目" style="width:300px;margin-right:30px;display:inline-block;" prop="projectId">
-                <el-select style="width:100%" @change="getwuduList(0)" v-model="editItemForm.projectId" filterable clearable placeholder="请选择投入项目" >
+            <el-form-item :label="$t('screening.inputProject')" style="width:300px;margin-right:30px;display:inline-block;" prop="projectId">
+                <el-select style="width:100%" @change="getwuduList(0)" v-model="editItemForm.projectId" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                     <el-option
                     v-for="item in projectList"
                     :key="item.id"
@@ -436,7 +436,7 @@
             v-if="editItemForm.projectId != null && wuduData.customDegreeActive == 1"
             style="width:300px;margin-right:30px;display:inline-block;"
             prop="degreeName">
-                <el-select style="width:100%" v-model="editItemForm.degreeId" filterable clearable placeholder="请选择" >
+                <el-select style="width:100%" v-model="editItemForm.degreeId" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                     <el-option
                     v-for="item in wuduList"
                     :key="item.id"
@@ -445,8 +445,8 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item label="出发城市" style="width:300px;margin-right:30px;display: inline-block;" prop="cityFrom">
-                <el-select style="width:100%" v-model="editItemForm.cityFrom" filterable clearable placeholder="请选择出发城市" >
+            <el-form-item :label="$t('departurecity')" style="width:300px;margin-right:30px;display: inline-block;" prop="cityFrom">
+                <el-select style="width:100%" v-model="editItemForm.cityFrom" filterable clearable :placeholder="$t('defaultText.pleaseChoose')" >
                     <el-option
                     v-for="item in cityList"
                     :key="item.value"
@@ -456,8 +456,8 @@
                 </el-select>
             </el-form-item>
             <!-- 目的城市 -->
-            <el-form-item label="目的城市" style="width:300px;display: inline-block;" prop="cityTo">
-                <el-select style="width:100%" v-model="editItemForm.cityTo" filterable clearable placeholder="请选择目的城市">
+            <el-form-item label="$t('destinationcity')" style="width:300px;display: inline-block;" prop="cityTo">
+                <el-select style="width:100%" v-model="editItemForm.cityTo" filterable clearable :placeholder="$t('defaultText.pleaseChoose')">
                     <el-option
                     v-for="item in cityList"
                     :key="item.value"
@@ -466,10 +466,10 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item label="开始时间" style="width:300px;margin-right:30px;display:inline-block;" prop="startDate">
+            <el-form-item :label="$t('starttimes')" style="width:300px;margin-right:30px;display:inline-block;" prop="startDate">
                 <el-date-picker
                 type="date"
-                placeholder="开始日期"
+                :placeholder="$t('time.startDate')"
                 value-format="yyyy-MM-dd"
                 v-model="editItemForm.startDate"
                 style="width:100%"
@@ -477,59 +477,59 @@
                 </el-date-picker>
             </el-form-item>
             <!-- 结束时间 -->
-            <el-form-item label="结束时间" style="width:300px;display:inline-block;" prop="endDate">
+            <el-form-item :label="$t('time.endTime')" style="width:300px;display:inline-block;" prop="endDate">
                 <el-date-picker
                 type="date"
-                placeholder="结束日期"
+                :placeholder="$t('time.endDate')"
                 value-format="yyyy-MM-dd"
                 v-model="editItemForm.endDate"
                 style="width:100%"
                 @change="datechg2(0)">
                 </el-date-picker>
             </el-form-item>
-            <el-form-item label="出差天数" style="width:300px">
-                <el-input type="number" placeholder="自动计算" v-model="editItemForm.dayCount" min="0" style="width:100%"></el-input>
+            <el-form-item :label="$t('traveldays')" style="width:300px">
+                <el-input type="number" :placeholder="$t('automaticcalculation')" v-model="editItemForm.dayCount" min="0" style="width:100%"></el-input>
             </el-form-item>
-            <el-form-item label="备注" style="width: 100%">
+            <el-form-item :label="$t('bei-zhu')" style="width: 100%">
                 <el-input type="textarea" v-model="editItemForm.remark" :rows="3" style="width: 62%" maxlength="100" show-word-limit></el-input>
             </el-form-item>
         </el-form>
         <span slot="footer" class="dialog-footer">
-            <el-button @click="editDialog = false">取 消</el-button>
-            <el-button type="primary" @click="determine()">确 定</el-button>
+            <el-button @click="editDialog = false">{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="determine()">{{ $t('btn.determine') }}</el-button>
         </span>
     </el-dialog>
 
     <!-- 出差统计查看详情 -->
-    <el-dialog title="出差详情" :visible.sync="seeDialog" width="1000px">
+    <el-dialog :title="$t('detailsbusinessrip')" :visible.sync="seeDialog" width="1000px">
         <el-table :data="detailsData" style="width:100%" height="400" v-loading="detailsloading">
             <!-- <el-table-column prop="date" label="日期" width="150"></el-table-column>
             <el-table-column prop="name" label="姓名" width="200"></el-table-column>
             <el-table-column prop="address" label="地址"></el-table-column> -->
-            <el-table-column prop="ownerName" label="出差人员" width="100" fixed="left"></el-table-column>
-            <el-table-column prop="reason" label="出差事由" width="150" header-align="center"></el-table-column>
-            <el-table-column prop="projectName" label="投入项目" width="150" align="center"></el-table-column>
-            <el-table-column label="交通工具" width="120" align="center">
+            <el-table-column prop="ownerName" :label="$t('businesspersonnel')" width="100" fixed="left"></el-table-column>
+            <el-table-column prop="reason" :label="$t('travelreason')" width="150" header-align="center"></el-table-column>
+            <el-table-column prop="projectName" :label="$t('screening.inputProject')" width="150" align="center"></el-table-column>
+            <el-table-column :label="$t('traffictools')" width="120" align="center">
                 <template slot-scope="scope">
-                    <span v-if="scope.row.way == 0">飞机</span>
-                    <span v-if="scope.row.way == 1">火车</span>
-                    <span v-if="scope.row.way == 2">汽车</span>
-                    <span v-if="scope.row.way == 3">轮船</span>
-                    <span v-if="scope.row.way == 4">其他</span>
+                    <span v-if="scope.row.way == 0">{{ $t('plane') }}</span>
+                    <span v-if="scope.row.way == 1">{{ $t('train') }}</span>
+                    <span v-if="scope.row.way == 2">{{ $t('car') }}</span>
+                    <span v-if="scope.row.way == 3">{{ $t('ship') }}</span>
+                    <span v-if="scope.row.way == 4">{{ $t('leave.other') }}</span>
                 </template>
             </el-table-column>
-            <el-table-column label="行程" width="120" align="center">
+            <el-table-column :label="$t('trip')" width="120" align="center">
                 <template slot-scope="scope">{{scope.row.cityFrom + '-' + scope.row.cityTo}}</template>
             </el-table-column>
-            <el-table-column prop="indate" label="申请时间" width="150" align="center"></el-table-column>
-            <el-table-column label="出差天数" width="80" align="center">
-                <template slot-scope="scope"><div>{{scope.row.dayCount}}</div></template>
+            <el-table-column prop="indate" :label="$t('applytime')" width="150" align="center"></el-table-column>
+            <el-table-column :label="$t('traveldays')" width="80" align="center">
+                <template slot-scope="scope"><div>{{scope.row.dayCount}}{{ $t('time.day') }}</div></template>
             </el-table-column>
-            <el-table-column prop="startDate" label="出差开始时间" width="150" align="center"></el-table-column>
-            <el-table-column prop="endDate" label="出差结束时间" width="150" align="center"></el-table-column>
-            <el-table-column prop="remark" label="备注" width="200">
+            <el-table-column prop="startDate" :label="$t('starttimeofbusinessrip')" width="150" align="center"></el-table-column>
+            <el-table-column prop="endDate" :label="$t('endtimeofbusinesstrip')" width="150" align="center"></el-table-column>
+            <el-table-column prop="remark" :label="$t('bei-zhu')" width="200">
                 <template slot-scope="scope">
-                    <el-popover placement="top-start" title="标题" width="200" trigger="hover" :content="scope.row.remark">
+                    <el-popover placement="top-start" title="$t('biao-ti')" width="200" trigger="hover" :content="scope.row.remark">
                         <div slot="reference" class="apls">{{scope.row.remark}}</div>
                     </el-popover>
                 </template>
@@ -549,50 +549,50 @@
     </el-dialog>
 
     <!-- 钉钉环境交互效果切换 -->
-    <el-dialog title="项目关联信息" v-if="DingdingEditDialog" :close-on-click-modal="false" :visible.sync="DingdingEditDialog" width="800px" customClass="customWidth">
+    <el-dialog :title="$t('projectAssociationInformation')" v-if="DingdingEditDialog" :close-on-click-modal="false" :visible.sync="DingdingEditDialog" width="800px" customClass="customWidth">
         
         <el-table :data="relationList" :loading="DingdingTableLoading">
-            <el-table-column label="时间段">
+            <el-table-column :label="$t('message.period')">
                 <template slot-scope="scope">
-                    <span>{{scope.row.startDate + '至' + scope.row.endDate}}</span>
+                    <span>{{scope.row.startDate + $t('other.to') + scope.row.endDate}}</span>
                 </template>
             </el-table-column>
-            <el-table-column label="关联项目" prop="projectName" show-overflow-tooltip></el-table-column>
+            <el-table-column :label="$t('rselatedprojects')" prop="projectName" show-overflow-tooltip></el-table-column>
             <el-table-column :label="wuduData.customDegreeName" prop="degreeName" show-overflow-tooltip></el-table-column>
-            <el-table-column label="操作" width="150">
+            <el-table-column :label="$t('operation')" width="150">
                 <template slot-scope="scope">
-                    <el-button size="small" type="primary" @click="DingdingAddorMod(scope.row)">编辑</el-button>
-                    <el-button size="small" type="danger" @click="DingdingDelete(scope.row)">删除</el-button>
+                    <el-button size="small" type="primary" @click="DingdingAddorMod(scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="small" type="danger" @click="DingdingDelete(scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
         <div slot="footer" class="dialog-footer">
-            <el-button type="primary" @click="DingdingEditDialog = false">关闭</el-button>
-            <el-button type="primary" @click="DingdingAddorMod()">新增关联项目</el-button>
+            <el-button type="primary" @click="DingdingEditDialog = false">{{ $t('Shutdown') }}</el-button>
+            <el-button type="primary" @click="DingdingAddorMod()">{{ $t('addinganAssociatedItem') }}</el-button>
         </div>
 
-        <el-dialog append-to-body title="新增/修改关联项目" v-if="appendAddorModDialog" :visible.sync="appendAddorModDialog" width="700px" customClass="customWidth">
+        <el-dialog append-to-body :title="$t('addedormodifiedassociateditems')" v-if="appendAddorModDialog" :visible.sync="appendAddorModDialog" width="700px" customClass="customWidth">
             <el-form label-width="100" :inline="true" style="margin-top:20px" :model="relationItem" :rules="relationItemRules" ref="relationItemForm">
-                <el-form-item label="开始日期" prop="startDate">
+                <el-form-item :label="$t('time.startDate')" prop="startDate">
                     <el-date-picker
                     style="width:220px"
                     v-model="relationItem.startDate"
                     value-format="yyyy-MM-dd"
                     type="date"
                     @change="datechg3(1)"
-                    placeholder="请选择日期"></el-date-picker>
+                    :placeholder="$t('defaultText.pleaseChoose')"></el-date-picker>
                 </el-form-item>
-                <el-form-item label="结束日期" prop="endDate" style="margin-left:35px">
+                <el-form-item :label="$t('time.endDate')" prop="endDate" style="margin-left:35px">
                     <el-date-picker
                     style="width:220px"
                     v-model="relationItem.endDate"
                     value-format="yyyy-MM-dd"
                     type="date"
                     @change="datechg3(0)"
-                    placeholder="请选择日期"></el-date-picker>
+                    :placeholder="$t('defaultText.pleaseChoose')"></el-date-picker>
                 </el-form-item><br>
-                <el-form-item label="关联项目" prop="projectId">
-                    <el-select v-model="relationItem.projectId" placeholder="请选择项目" @change="getwuduList(2)" style="width:220px" filterable >
+                <el-form-item :label="$t('rselatedprojects')" prop="projectId">
+                    <el-select v-model="relationItem.projectId" :placeholder="$t('defaultText.pleaseChoose')" @change="getwuduList(2)" style="width:220px" filterable >
                         <el-option
                         v-for="item in projectList"
                         :key="item.id"
@@ -601,7 +601,7 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item :label="wuduData.customDegreeName" prop="degreeId" style="margin-left:44.5px">
-                    <el-select v-model="relationItem.degreeId" :placeholder="'请选择' + wuduData.customDegreeName" style="width:220px">
+                    <el-select v-model="relationItem.degreeId" :placeholder="$t('defaultText.pleaseChoose') + wuduData.customDegreeName" style="width:220px">
                         <el-option
                         v-for="item in wuduList"
                         :key="item.id"
@@ -611,30 +611,30 @@
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click="appendAddorModDialog = false">取消</el-button>
-                <el-button type="primary" @click="appendAddorModSure('relationItemForm')">提交</el-button>
+                <el-button @click="appendAddorModDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="appendAddorModSure('relationItemForm')">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
     </el-dialog>
     <!-- 点击钉钉同步弹窗 -->
-    <el-dialog title="从钉钉同步" :visible.sync="synchronizationDaying" width="480px" :before-close="handleClose">
+    <el-dialog :title="$t('synchronizefromStaple')" :visible.sync="synchronizationDaying" width="480px" :before-close="handleClose">
         <div>
             <div class="dingdingtongbu">
-                <span>选择人员</span>
-                <el-select v-model="ownerIdsId" placeholder="请选择人员" style="width:280px" size="small" filterable="true">
+                <span>{{ $t('screening.selectPeople') }}</span>
+                <el-select v-model="ownerIdsId" :placeholder="$t('pleaseselectpersonnel')" style="width:280px" size="small" filterable="true">
                     <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                     </el-option>
                 </el-select>
             </div>
             <div class="dingdingtongbu" style="margin-top: 20px">
-                <span>时间段</span>
-                <el-date-picker v-model="createDateList" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable style="width:280px"></el-date-picker>
-                <span style="width: 300px;color: #E6A23C;font-size: 10px;padding-left: 105px;margin-top: 10px"> <i class="el-icon-warning-outline"></i> 从钉钉同步 时间段不能超过七天</span>
+                <span>{{ $t('message.period') }}</span>
+                <el-date-picker v-model="createDateList" type="daterange" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')" size="small" clearable style="width:280px"></el-date-picker>
+                <span style="width: 300px;color: #E6A23C;font-size: 10px;padding-left: 105px;margin-top: 10px"> <i class="el-icon-warning-outline"></i> {{ $t('synchronizationperiodfromstaplecannotexceedsevendays') }}</span>
             </div>
         </div>
         <span slot="footer" class="dialog-footer">
-            <el-button @click="synchronizationDaying = false">取 消</el-button>
-            <el-button type="primary" @click="listSynchronize()" :loading="synchronizeLoading">同 步</el-button>
+            <el-button @click="synchronizationDaying = false">{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="listSynchronize()" :loading="synchronizeLoading">{{ $t('synchronous') }}</el-button>
         </span>
     </el-dialog>
 </section>
@@ -678,17 +678,17 @@ export default {
                 wuduId:null      //维度id
             },
             formrules:{
-                reason:[{ required: true, message: "请输入出差事由", trigger: "blur" }],
-                cityFrom:[{ required: true, message: "请选择出发城市", trigger: "blur" }],
-                cityTo:[{ required: true, message: "请选择目的城市", trigger: "blur" }],
-                startDate:[{ required: true, message: "请选择开始时间", trigger: "blur" }],
-                endDate:[{ required: true, message: "请选择结束时间", trigger: "blur" }]
+                reason:[{ required: true, message: this.$t('yourbusinesstrip'), trigger: "blur" }],
+                cityFrom:[{ required: true, message: this.$t('selectyourdeparturecity'), trigger: "blur" }],
+                cityTo:[{ required: true, message: this.$t('saelectdestinationcity'), trigger: "blur" }],
+                startDate:[{ required: true, message: this.$t('selectastarttime'), trigger: "blur" }],
+                endDate:[{ required: true, message: this.$t('selectanendtime'), trigger: "blur" }]
             },
             editItemRules:{
-                cityFrom:[{ required: true, message: "请选择出发城市", trigger: "blur" }],
-                cityTo:[{ required: true, message: "请选择目的城市", trigger: "blur" }],
-                startDate:[{ required: true, message: "请选择开始时间", trigger: "blur" }],
-                endDate:[{ required: true, message: "请选择结束时间", trigger: "blur" }]
+                cityFrom:[{ required: true, message: this.$t('selectyourdeparturecity'), trigger: "blur" }],
+                cityTo:[{ required: true, message: this.$t('saelectdestinationcity'), trigger: "blur" }],
+                startDate:[{ required: true, message: this.$t('selectastarttime'), trigger: "blur" }],
+                endDate:[{ required: true, message: this.$t('selectanendtime'), trigger: "blur" }]
             },
             cityList:[],
             cityList2:[],
@@ -762,9 +762,9 @@ export default {
                 degreeId: null
             },
             relationItemRules: {
-                startDate:[{required: true,message: '请选择开始日期',trigger: 'change'}],
-                endDate:[{required: true,message: '请选择结束日期',trigger: 'change'}],
-                projectId:[{required: true,message: '请选择要关联的项目',trigger: 'change'}],
+                startDate:[{required: true,message: this.$t('selectastartdate'),trigger: 'change'}],
+                endDate:[{required: true,message: this.$t('selectaenddate'),trigger: 'change'}],
+                projectId:[{required: true,message: this.$t('projectassociate'),trigger: 'change'}],
             },
             relationItemTemporaryDate: {},
             synchronizeLoading: false,
@@ -813,7 +813,7 @@ export default {
                 if(res.code == 'ok'){
                     var filePath = res.data;
                     const a = document.createElement('a'); // 创建a标签
-                    a.setAttribute('download', '出差统计导出.xls');// download属性
+                    a.setAttribute('download', this.$t('tripStatistics')+'.xls');// download属性
                     a.setAttribute('href', filePath);// href链接
                     a.click(); //自执行点击事件
                     a.remove();
@@ -837,13 +837,13 @@ export default {
             this.billss(1)
         },
         deleteOfDingding(e) {
-            this.$confirm("确认要删除吗?", "提示", {}).then(() => {
+            this.$confirm(this.$t('deleteit'), this.$t('other.prompts'), {}).then(() => {
                 this.http.post('/business-trip/delete', {id:e.id},
                 res => {
                     if (res.code == "ok") {
                         this.billss();
                         this.$message({
-                            message: '删除成功',
+                            message: this.$t('message.successfullyDeleted'),
                             type: "success"
                         });
                     } else {
@@ -909,7 +909,7 @@ export default {
                         this.synchronizeLoading = false
                         this.synchronizationDaying = false
                         this.$message({
-                            message: '同步成功',
+                            message: this.$t('synchronoussuccess'),
                             type: 'success'
                         })
                         // this.ownerIdsId = ''
@@ -931,7 +931,7 @@ export default {
                 })
             } else {
                 this.$message({
-                    message: '从钉钉同步消息时间段不能超过七天',
+                    message: this.$t('cannotbesynchronized'),
                     type: 'warning'
                 });
             }
@@ -1018,9 +1018,9 @@ export default {
         },
         DingdingDelete(row){
             console.log('row',this.relationItem);
-            this.$confirm('是否确认删除?','提示',{
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
+            this.$confirm(this.$t('doyouwanttodeleteit'),this.$t('other.prompts'),{
+                confirmButtonText: this.$t('btn.determine'),
+                cancelButtonText: this.$t('btn.cancel'),
                 type: 'warning'
             }).then(()=>{
                 this.http.post('/bustrip-project/delete',{
@@ -1164,7 +1164,7 @@ export default {
                         if (res.code == "ok") {
                             this.formloading = false
                             this.$message({
-                                message: "申请成功",
+                                message: this.$t('applicationissuccessful'),
                                 type: "success"
                             })
                             this.addform = {
@@ -1328,13 +1328,13 @@ export default {
 
         // 操作 - 删除
         deletes(e) {
-            this.$confirm("确认要删除吗?", "提示", {}).then(() => {
+            this.$confirm(this.$t('deleteit'), this.$t('other.prompts'), {}).then(() => {
                 this.http.post('/business-trip/delete', {id:e.id},
                 res => {
                     if (res.code == "ok") {
                         this.getTableList();
                         this.$message({
-                            message: '删除成功',
+                            message: this.$t('message.successfullyDeleted'),
                             type: "success"
                         });
                     } else {
@@ -1392,7 +1392,7 @@ export default {
                             this.editDialog = false
                             this.billss()
                             this.$message({
-                                message: '修改成功',
+                                message: this.$t('message.modifyTheSuccess'),
                                 type: 'success'
                             })
                         } else {
@@ -1513,8 +1513,8 @@ export default {
                     var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
                     this.sdata = list;
                     this.soption = [
-                        {value: 1 , label : "部门" , children : this.changeArr(list1)},
-                        {value: 2 , label : "指定人员",children : this.susers}
+                        {value: 1 , label : this.$t('lable.department') , children : this.changeArr(list1)},
+                        {value: 2 , label : this.$t('designatedpersonnel'),children : this.susers}
                     ]
                 } else {
                     this.$message({
@@ -1615,7 +1615,7 @@ export default {
                 this.listLoading = false;
                 if (res.code == "ok") {
                     this.$message({
-                        message: '保存成功',
+                        message: this.$t('savesuccess'),
                         type: "success"
                     });
                 } else {

+ 42 - 41
fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue

@@ -2,70 +2,71 @@
     <section >
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
-                <el-form-item :label="user.timeType.customDegreeName + '管理'">
+                <el-form-item :label="user.timeType.customDegreeName + $t('guan-li')">
                 </el-form-item>
                 <!-- <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">批量导入{{user.timeType.customDegreeName}}</el-link>
                 <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">添加{{user.timeType.customDegreeName}}</el-link>
                 <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">批量删除{{user.timeType.customDegreeName}}</el-link> -->
-                <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">批量删除</el-link>
-                <el-link type="primary" :underline="false" @click="outoCenterRatio" class="tanjia">数据导出</el-link>
-                <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">批量导入</el-link>
-                <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">新增</el-link>
+                <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">{{ $t('Batchdelete') }}</el-link>
+                <el-link type="primary" :underline="false" @click="outoCenterRatio" class="tanjia">{{ $t('Exportdata') }}</el-link>
+                <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">{{ $t('bulkimport') }}</el-link>
+                <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">{{ $t('add') }}</el-link>
 
             </el-form>
         </el-col>
         <el-table :data="subProjectList" highlight-current-row v-loading="listLoading" :height="heightDoms" style="width: 100%;" @selection-change="selectionChange">
             <el-table-column type="selection"></el-table-column>
-            <el-table-column prop="id" width="200" label="序号" align="center">
+            <el-table-column prop="id" width="200" :label="$t('headerTop.serialNumber')" align="center">
                 <template slot-scope="scope" >
                     {{scope.$index + 1}}
                 </template>
             </el-table-column>
-            <el-table-column prop="name" label="名称" width="160" show-overflow-tooltip></el-table-column>
-            <el-table-column prop="projectNum" label="相关项目数量" width="160">
-                <template slot-scope="scope">{{scope.row.projectNum + '个'}}</template>
+            <el-table-column prop="name" :label="$t('names')" width="160" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="projectNum" :label="$t('numberofrelatedprojects')" width="160">
+                <template slot-scope="scope">{{scope.row.projectNum +  $t('ge')}}</template>
             </el-table-column>
-            <el-table-column prop="projects" label="相关项目" min-width="180" show-overflow-tooltip></el-table-column>
-            <el-table-column prop="rmark" label="备注" min-width="180" show-overflow-tooltip></el-table-column>
-            <el-table-column label="操作" width="170">
+            <el-table-column prop="projects" :label="$t('relatedprojects')" min-width="180" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="rmark" :label="$t('bei-zhu')" min-width="180" show-overflow-tooltip></el-table-column>
+            <el-table-column :label="$t('operation')" width="170">
                 <template slot-scope="scope" >
-                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">编辑</el-button>
-                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">删除</el-button>
+                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
-        <el-dialog title="新增/修改维护数据" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('addedormodifiedthemaintenancedata')" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="form2" :model="addfm" :rules="ruless" label-width="100px">
-                <el-form-item label="名称" prop="name">
-                    <el-input v-model="addfm.name" placeholder="请输入名称" clearable></el-input>
+                <el-form-item :label="$t('names')" prop="name">
+                    <el-input v-model="addfm.name" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="备注">
-                    <el-input type="textarea" :rows="4" placeholder="请输入备注" v-model="addfm.rmark" clearable  maxlength="150" show-word-limit> </el-input>
+                <el-form-item :label="$t('bei-zhu')">
+                    <el-input type="textarea" :rows="4" :placeholder="$t('peaseenterthe')" v-model="addfm.rmark" clearable  maxlength="150" show-word-limit> </el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addSubProject = false">取消</el-button>
-                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addSubProject = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
         <!-- 导入结果说明 -->
-        <el-dialog title="导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('importtheresults')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
             <div>
                 <span>{{importResultMsg}}</span>
                 
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+                <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
             </span> 
         </el-dialog>
-        <el-dialog :title="`导入${user.timeType.customDegreeName}数据`" v-if="intoCenterDialog" :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
-            <p>1. 下载
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx" :download="`${user.timeType.customDegreeName}导入模板.xlsx`">{{user.timeType.customDegreeName}}导入模板.xlsx</el-link>
+        <span>{{ $t('importTemplate') }}</span>
+        <el-dialog :title="$t('dao-ru') + user.timeType.customDegreeName + $t('shu-ju')" v-if="intoCenterDialog" :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
+            <p>1. {{ $t('other.download') }}
+            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx" :download="user.timeType.customDegreeName+ $t('importTemplate') +'.xlsx'">{{user.timeType.customDegreeName + $t('importTemplate')}}.xlsx</el-link>
             </p>
             <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
             <p style="display: flex;justify-content: center;padding:1em 0">
                 <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+                <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting') }}</el-button>
             </el-upload>
             </p>
         </el-dialog>
@@ -84,7 +85,7 @@
                 },
                 addSubProject: false,
                 ruless: {
-                    name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
                 },
                 heightDoms: document.documentElement.clientHeight - 140,
                 intoCenterDialog:false,
@@ -102,7 +103,7 @@
             },
             batchDelete(){
                 if(this.selectionArr.length == 0){
-                    this.$message('请选择要删除的' + this.user.timeType.customDegreeName + '数据')
+                    this.$message(this.$t('pleaseselectheonesyouwanttodelete') + this.user.timeType.customDegreeName + this.$t('shu-ju'))
                     return
                 }else{
                     let nametext = ''
@@ -110,9 +111,9 @@
                         nametext += this.selectionArr[i].name + '、'
                     }
                     nametext = nametext.substring(0,nametext.length - 1)
-                    this.$confirm('确定要批量删除' + this.user.timeType.customDegreeName + '数据:' + nametext + '\u3000吗?','删除',{
-                        confirmButtonText: '确定',
-                        cancelButtonText: '取消',
+                    this.$confirm(this.$t('makesuretodeleteinbatches') + this.user.timeType.customDegreeName + this.$t('shu-ju') +':' + nametext + '\u3000' + $t('ma'),this.$t('btn.delete'),{
+                        confirmButtonText: this.$t('btn.determine'),
+                        cancelButtonText: this.$t('btn.cancel'),
                         type: 'warning'
                     }).then(()=>{
                         let batchIds = ''
@@ -125,7 +126,7 @@
                         },res => {
                             if(res.code == 'ok'){
                                 this.$message({
-                                    message: '删除成功',
+                                    message: this.$t('message.successfullyDeleted'),
                                     type: 'success'
                                 })
                                 this.getSub()
@@ -179,7 +180,7 @@
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -193,10 +194,10 @@
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "成功导入/更新"+res.data+"条客户数据。"+(res.msg?res.msg:"");
+                            this.importResultMsg = this.$t('importedupdatedsuccessfully')+res.data+this.$t('customersdata')+"。"+(res.msg?res.msg:"");
                             this.getSub();
                         } else {
-                            this.importResultMsg = "导入失败:"+res.msg;
+                            this.importResultMsg = this.$t('export.Importfailure') + ":"+res.msg;
                         }
                     },
                     error => {
@@ -251,9 +252,9 @@
                 this.addSubProject = true;
             },
             deleteSubPro(subProject) {
-                this.$confirm("确定要删除这条" + subProject.name + "数据吗?","删除", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makesuretodeletethisone') + subProject.name + this.$t('shu-ju'),this.$t('btn.delete'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -265,7 +266,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.getSub();
@@ -298,7 +299,7 @@
                             this.listLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: '成功',
+                                    message: this.$t('other.successful'),
                                     type: "success"
                                 });
                                 this.addfm = {name: '',rmark: ''}

+ 179 - 180
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -10,30 +10,30 @@
               :default-active="defaultActive"
               class="el-menu-vertical-demo"
               @select="staffs"
-              background-color="#ffffff"
+              background-color="#ffffff" 
               text-color="#666666"
               active-text-color="#20A0FF"
               style="width:200px">
               <el-submenu index="1">
                 <template slot="title">
                   <i class="iconfont firerock-iconbaobiao"></i>
-                  <span>项目报表服务</span>
+                  <span>{{ $t('navigation.projectReportingService') }}</span>
                 </template>
-                  <el-menu-item index="1-1" v-if="permissions.reportProject || permissions.reportAllProject"><p @click="ssl(0)">项目报表</p></el-menu-item>
-                  <el-menu-item index="1-2" v-if="permissions.reportTask || permissions.reportAllTask"><p @click="ssl(1)">项目任务报表</p></el-menu-item>
-                  <el-menu-item index="1-3" v-if="permissions.reportCostOf || permissions.reportAllCostOf"><p @click="ssl(2)">项目成本报表</p></el-menu-item>
-                  <el-menu-item index="1-14" v-if="permissions.reportAllOutputValue || permissions.reportOutputValue"><p @click="ssl(13)">项目成本基线表</p></el-menu-item>
-                  <el-menu-item index="1-9" v-if="permissions.reportAllTimeDivide || permissions.reportTimeDivide"><p @click="ssl(8)">人员工时分配表</p></el-menu-item>
-                  <el-menu-item index="1-4" v-if="permissions.reportCostWarning"><p @click="ssl(7)">工时成本预警表</p></el-menu-item>
-                  <el-menu-item index="1-5" v-if="permissions.reportBalance || permissions.reportAllBalance"><p @click="ssl(3)">项目收支平衡表</p></el-menu-item>
-                  <el-menu-item index="1-6" v-if="user.company.packageCustomer == 1 && permissions.reportProfits"><p @click="ssl(4)">客户项目利润表</p></el-menu-item>
-                  <el-menu-item index="1-7" v-if="permissions.reportPhase || permissions.reportAllPhase"><p @click="ssl(5)">项目阶段工时表</p></el-menu-item>
-                  <el-menu-item index="1-13" v-if="permissions.reportAllGroup || permissions.reportGroup"><p @click="ssl(12)">任务分组工时表</p></el-menu-item>
-                  <el-menu-item index="1-8" v-if="permissions.reportAllOvertime || permissions.reportOvertime"><p @click="ssl(6)">加班情况统计表</p></el-menu-item>
+                  <el-menu-item index="1-1" v-if="permissions.reportProject || permissions.reportAllProject"><p @click="ssl(0)">{{ $t('projectreport') }}</p></el-menu-item>
+                  <el-menu-item index="1-2" v-if="permissions.reportTask || permissions.reportAllTask"><p @click="ssl(1)">{{ $t('projectTaskReport') }}</p></el-menu-item>
+                  <el-menu-item index="1-3" v-if="permissions.reportCostOf || permissions.reportAllCostOf"><p @click="ssl(2)">{{ $t('projectcoststatement') }}</p></el-menu-item>
+                  <el-menu-item index="1-14" v-if="permissions.reportAllOutputValue || permissions.reportOutputValue"><p @click="ssl(13)">{{ $t('projectcostbaselinetable') }}</p></el-menu-item>
+                  <el-menu-item index="1-9" v-if="permissions.reportAllTimeDivide || permissions.reportTimeDivide"><p @click="ssl(8)">{{ $t('personneltimeallocationtable') }}</p></el-menu-item>
+                  <el-menu-item index="1-4" v-if="permissions.reportCostWarning"><p @click="ssl(7)">{{ $t('timecostearlywarningtable') }}</p></el-menu-item>
+                  <el-menu-item index="1-5" v-if="permissions.reportBalance || permissions.reportAllBalance"><p @click="ssl(3)">{{ $t('projectbalancesheet') }}</p></el-menu-item>
+                  <el-menu-item index="1-6" v-if="user.company.packageCustomer == 1 && permissions.reportProfits"><p @click="ssl(4)">{{ $t('customerprojectincomestatement') }}</p></el-menu-item>
+                  <el-menu-item index="1-7" v-if="permissions.reportPhase || permissions.reportAllPhase"><p @click="ssl(5)">{{ $t('projectphasetimesheet') }}</p></el-menu-item>
+                  <el-menu-item index="1-13" v-if="permissions.reportAllGroup || permissions.reportGroup"><p @click="ssl(12)">{{ $t('taskgrouptimesheet') }}</p></el-menu-item>
+                  <el-menu-item index="1-8" v-if="permissions.reportAllOvertime || permissions.reportOvertime"><p @click="ssl(6)">{{ $t('statisticsofovertimework') }}</p></el-menu-item>
 
-                  <el-menu-item index="1-10" v-if="permissions.reportAllTimely || permissions.reportTimely"><p @click="ssl(9)">员工填报及时率</p></el-menu-item>
-                  <el-menu-item index="1-11" v-if="permissions.reportAuditRate"><p @click="ssl(10)">日报待审核统计</p></el-menu-item>
-                  <el-menu-item index="1-12" v-if="permissions.reportPersonnel || permissions.reportResponsible"><p @click="ssl(11)">人员工时统计表</p></el-menu-item>
+                  <el-menu-item index="1-10" v-if="permissions.reportAllTimely || permissions.reportTimely"><p @click="ssl(9)">{{ $t('employeereporttimelinessrate') }}</p></el-menu-item>
+                  <el-menu-item index="1-11" v-if="permissions.reportAuditRate"><p @click="ssl(10)">{{ $t('dailyreporttobereviewedstatistics') }}</p></el-menu-item>
+                  <el-menu-item index="1-12" v-if="permissions.reportPersonnel || permissions.reportResponsible"><p @click="ssl(11)">{{ $t('statisticsofpersonnelhours') }}</p></el-menu-item>
                   <!-- <el-menu-item index="1-12"><p @click="ssl(11)">人员工时统计表</p></el-menu-item> -->
                 </el-submenu>
               </el-menu>
@@ -55,11 +55,11 @@
       <div class="headScreen" style="width:70%">
       <!-- 客户项目利润表的筛选 -->
         <template v-if="ins == 4">
-          <el-select v-model="customerId" placeholder="请选择客户" clearable filterable size="small" @change="selcts(4)" style="margin-right:20px">
+          <el-select v-model="customerId" :placeholder="$t('pleaseelectcustomers')" clearable filterable size="small" @change="selcts(4)" style="margin-right:20px">
             <el-option v-for="(item) in customerList" :key="item.id" :label="item.customerName" :value="item.id">
             </el-option>
           </el-select>
-          <el-select v-model="cusProJuctId" placeholder="请选择项目" clearable filterable size="small" @change="selcts()" popper-class="projectSelectPopperClass">
+          <el-select v-model="cusProJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" popper-class="projectSelectPopperClass">
             <el-option v-for="(item) in cusProListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
               <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
               <span style="float: right;font-size: 13px;">{{ item.projectName }}</span>
@@ -68,8 +68,8 @@
         </template>
         <!-- 时间段筛选 -->
           <template v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11 || ins == 12">
-            <span class="demonstration" style="color:#999;padding:0 10px">时间段</span>
-            <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" placeholder="选择开始日期" @change="picks()" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" style="width:300px" :clearable="false" size="small"> </el-date-picker>
+            <span class="demonstration" style="color:#999;padding:0 10px">{{ $t('message.period') }}</span>
+            <el-date-picker v-model="rangeDatas" type="daterange" value-format="yyyy-MM-dd" :placeholder="$t('selectstartdate')" @change="picks()" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" style="width:300px" :clearable="false" size="small"> </el-date-picker>
           </template>
 
         <!-- 按部门/项目筛选 -->
@@ -78,7 +78,7 @@
           <el-option label="查看部门审核人" :value="0"></el-option>
         </el-select> -->
         <!-- 项目筛选 -->
-        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11" v-model="proJuctId" placeholder="请选择项目" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+        <el-select v-if="ins != 4 && ins != 8 && ins != 9 && ins != 10 && ins != 11" v-model="proJuctId" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
           <el-option v-for="(item) in proListOvertime" :key="item.id" :label="item.projectName + (item.projectCode ? item.projectCode : '')" :value="item.id">
             <span style="float: left;color: #8492a6;">{{ item.projectCode }}</span>
             <span style="float: right;font-size: 13px;margin-left: 20px">{{ item.projectName }}</span>
@@ -86,70 +86,70 @@
         </el-select>
           
           <!-- 部门筛选 -->
-          <el-cascader v-if="(ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)" v-model="departmentIdArray" :options="departmentList" placeholder="请选择部门"
+          <el-cascader v-if="(ins == 9 && permissions.reportAllTimely) || (ins == 8 && permissions.reportAllTimeDivide) || (ins == 6 && permissions.reportAllOvertime) || (ins == 11 && permissions.reportPersonnel)" v-model="departmentIdArray" :options="departmentList" :placeholder="$t('qing-xuan-ze-bu-men')"
             :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable
             @change="selcts(9)" size="small" style="margin-left:10px"
           ></el-cascader>
 
           <!-- 任务筛选 -->
-          <el-select v-if="ins == 1" v-model="taskTypeId" placeholder="请选择类型" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
+          <el-select v-if="ins == 1" v-model="taskTypeId" :placeholder="$t('pleaseselecttype')" clearable filterable size="small" @change="selcts()" style="margin-left:10px">
             <el-option v-for="(item) in taskTypeObj" :key="item.id" :label="item.value" :value="item.id">
             </el-option>
           </el-select>
 
           <!-- 人员筛选 -->
-          <el-select v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11" v-model="userId" placeholder="请选择人员" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
+          <el-select v-if="ins == 6 || ins == 8 || ins == 9 || ins == 10 || ins == 11" v-model="userId" :placeholder="$t('pleaseselectpersonnel')" @change="selcts()" clearable filterable size="small" style="margin-left:10px;width:150px">
             <el-option v-for="(item, index) in selUserList" :key="index" :label="item.name" :value="item.id"></el-option>
           </el-select>
 
           <!-- 待审核筛选切换 -->
           <el-radio-group v-model="stateKey" size="small" v-if="ins == 10 && user.timeType.reportWorkflow == 1" style="margin-left:10px;margin-top:-3.33px" @change="stateKeySel">
-            <el-radio-button :label="1">项目待审核</el-radio-button>
-            <el-radio-button :label="0">部门待审核</el-radio-button>
+            <el-radio-button :label="1">{{ $t('projectbereviewed') }}</el-radio-button>
+            <el-radio-button :label="0">{{ $t('departmentobereviewed') }}</el-radio-button>
           </el-radio-group>
           <!-- 项目阶段筛选 -->
-          <el-select v-if="ins == 5" multiple v-model="stageNames" @visible-change="visibleSelcts" @clear="visibleSelcts(false)" clearable size="small" filterable collapse-tags placeholder="请选择阶段" style="margin-left:10px;">
+          <el-select v-if="ins == 5" multiple v-model="stageNames" @visible-change="visibleSelcts" @clear="visibleSelcts(false)" clearable size="small" filterable collapse-tags :placeholder="$t('pleaseselectstage')" style="margin-left:10px;">
             <el-option v-for="item in firstStages" :key="item" :label="item" :value="item"></el-option>
           </el-select>
       </div>
-      <p style="float: right;margin-right: 25px;width:10%" ><el-button type="primary" @click="exportExcel" size="mini">报表导出</el-button></p>
+      <p style="float: right;margin-right: 25px;width:10%" ><el-button type="primary" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button></p>
     </div>
     <div ref="staff" style="margin: 5px 0px 0px 10px; width: 98%">
-        <div class="staff" ref="tabless" :style="'width:'+(windowWidth - 410)+'px'">
+        <div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
             <!--项目报表 -->
             <el-table v-if="ins == 0" key="0" border :data="list0" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column  prop="projectCode" label="项目编号"  width="120"></el-table-column>
-                <el-table-column  prop="projectName" label="项目名称" width="200">
+                <el-table-column  prop="projectCode" :label="$t('Itemno')"  width="120"></el-table-column>
+                <el-table-column  prop="projectName" :label="$t('headerTop.projectName')" width="200">
                   <template slot-scope="scope" >
                     {{scope.row.projectName}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="inchargerName" label="项目经理"  width="130">
+                <el-table-column prop="inchargerName" :label="$t('projectmanager')"  width="130">
                   <template slot-scope="scope" >
                     {{scope.row.inchargerName}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="contractAmount" label="合同金额(元)" align="right">
+                <el-table-column prop="contractAmount" :label="$t('he-tong-jine-yuan')" align="right">
                   <template slot-scope="scope">
                         {{scope.row.contractAmount.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="status" label="状态" >
+                <el-table-column prop="status" :label="$t('state.states')" >
                     <template slot-scope="scope">
                         {{scope.row.status == null?"-":statusTxt[scope.row.status]}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="planStartDate" label="计划开始时间" >
+                <el-table-column prop="planStartDate" :label="$t('schedulestarttime')" >
                     <template slot-scope="scope">
                         {{scope.row.planStartDate}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="planEndDate" label="计划结束时间">
+                <el-table-column prop="planEndDate" :label="$t('scheduleendtime')">
                     <template slot-scope="scope">
                         {{scope.row.planEndDate}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="progress" label="完成度">
+                <el-table-column prop="progress" :label="$t('completeness')">
                     <template slot-scope="scope">
                         {{scope.row.progress==null?"-":scope.row.progress}}%
                     </template>
@@ -158,41 +158,41 @@
 
             <!-- 项目任务报表 -->
             <el-table v-if="ins == 1" key="1" border :data="list1" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" :span-method="objectSpanMethod">
-                <el-table-column  prop="project_code" label="项目编号"  width="120"></el-table-column>
-                <el-table-column  prop="project_name" label="项目名称" width="200">
+                <el-table-column  prop="project_code" :label="$t('Itemno')"  width="120"></el-table-column>
+                <el-table-column  prop="project_name" :label="$t('headerTop.projectName')" width="200">
                   <template slot-scope="scope" >
                     <!-- {{scope.row.project_name}} -->
                     <span style="color: #cacaca" v-if="scope.row.customName == '——'">{{scope.row.customName}}</span>
                     <span v-else>{{scope.row.customName}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="name" label="任务名称"  width="300">
+                <el-table-column prop="name" :label="$t('nameofthetask')"  width="300">
                   <template slot-scope="scope" >
                     {{scope.row.name}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="executor_name" label="执行人"  width="200"></el-table-column>
-                <el-table-column prop="plan_hours" label="计划工时(h)"  width="150">
+                <el-table-column prop="executor_name" :label="$t('zhi-hang-ren')"  width="200"></el-table-column>
+                <el-table-column prop="plan_hours" :label="$t('plantime')+'(h)'"  width="150">
                   <template slot-scope="scope">
                         {{scope.row.plan_hours == null? 0:scope.row.plan_hours.toFixed(1)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="real_hours" label="实际工时(h)"  width="150">
+                <el-table-column prop="real_hours" :label="$t('shi-ji-gong-shi')+'(h)'"  width="150">
                    <template slot-scope="scope">
                         <font :style="'color:'+(scope.row.real_hours > scope.row.plan_hours?'red':'')">{{scope.row.real_hours == null? 0:scope.row.real_hours.toFixed(1)}}</font>
                     </template>
                 </el-table-column>
-                <el-table-column prop="task_status" label="状态" width="80" >
+                <el-table-column prop="task_status" :label="$t('state.states')" width="80" >
                     <template slot-scope="scope">
                         {{taskStatusTxt[scope.row.task_status]}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="task_type" label="类型"  width="120">
+                <el-table-column prop="task_type" :label="$t('types')"  width="120">
                     <template slot-scope="scope">
                         {{taskTypeTxt[scope.row.task_type]}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="end_date" label="截止日期"  width="120">
+                <el-table-column prop="end_date" :label="$t('expirationdate')"  width="120">
                     <template slot-scope="scope">
                         {{scope.row.end_date}}
                     </template>
@@ -201,88 +201,88 @@
 
             <!--项目成本报表 -->
             <el-table v-if="ins == 2"  key="2" border :data="list2" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column  prop="projectCode" label="项目编号"  width="120"></el-table-column>
-                <el-table-column  prop="projectName" label="项目名称" >
+                <el-table-column  prop="projectCode" :label="$t('Itemno')"  width="120"></el-table-column>
+                <el-table-column  prop="projectName" :label="$t('headerTop.projectName')" >
                   <template slot-scope="scope" >
                     {{scope.row.projectName}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="feeMan" label="人工成本"  width="100"  align="right">
+                <el-table-column prop="feeMan" :label="$t('artificialcost')"  width="100"  align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan==null?0:scope.row.feeMan.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeNormal" label="一般费用"  width="100" align="right">
+                <el-table-column prop="feeNormal" :label="$t('generalcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeNormal==null?0:scope.row.feeNormal.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeTravel" label="差旅费用"  width="100" align="right">
+                <el-table-column prop="feeTravel" :label="$t('travelexpenses')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeTravel==null?0:scope.row.feeTravel.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeOutsourcing" label="外包费用"  width="100" align="right">
+                <el-table-column prop="feeOutsourcing" :label="$t('outsourcingcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeOutsourcing==null?0:scope.row.feeOutsourcing.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="总费用"  width="100" align="right">
+                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="费用明细"  width="100" align="right">
+                <el-table-column  :label="$t('costdetail')"  width="100" align="right">
                   <template slot-scope="scope">
-                        <el-link type="primary" :underline="false" @click="showDetail(scope.row)">报销明细</el-link>
+                        <el-link type="primary" :underline="false" @click="showDetail(scope.row)">{{ $t('reimbursementdetail') }}</el-link>
                     </template>
                 </el-table-column>
             </el-table>
 
             <!--项目收支平衡表 -->
             <el-table v-if="ins == 3"  key="3" border :data="list3" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="projectCode" label="项目编号"  width="120"></el-table-column>
-                <el-table-column prop="projectName" label="项目名称" >
+                <el-table-column prop="projectCode" :label="$t('Itemno')"  width="120"></el-table-column>
+                <el-table-column prop="projectName" :label="$t('headerTop.projectName')" >
                   <template slot-scope="scope" >
                     {{scope.row.projectName}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="contractAmount" label="合同金额" width="100" align="right">
+                <el-table-column prop="contractAmount" :label="$t('contractamount')" width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.contractAmount.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeMan" label="人工成本"   width="100" align="right">
+                <el-table-column prop="feeMan" :label="$t('artificialcost')"   width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeNormal" label="一般费用"  width="100" align="right">
+                <el-table-column prop="feeNormal" :label="$t('generalcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeNormal.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeTravel" label="差旅费用"  width="100" align="right">
+                <el-table-column prop="feeTravel" :label="$t('travelexpenses')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeTravel.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeOutsourcing" label="外包费用"  width="100" align="right">
+                <el-table-column prop="feeOutsourcing" :label="$t('outsourcingcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeOutsourcing.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="总费用"  width="100" align="right">
+                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润"  width="100" align="right">
+                <el-table-column  :label="$t('profits')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{((scope.row.contractAmount==null?0:scope.row.contractAmount) - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing)).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润率"  width="100" align="right">
+                <el-table-column  :label="$t('profitmargin')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.contractAmount==null||scope.row.contractAmount==0)?'-':((scope.row.contractAmount - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing))*100/scope.row.contractAmount).toFixed(1)+"%"}}
                     </template>
@@ -292,48 +292,48 @@
             <el-table v-if="ins == 4" border :data="list4"  key="4"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 100%;">
-                <el-table-column prop="customerName" label="客户名称" ></el-table-column>
-                <el-table-column prop="projectNames" label="相关项目">
+                <el-table-column prop="customerName" :label="$t('customername')" ></el-table-column>
+                <el-table-column prop="projectNames" :label="$t('relatedprojects')">
                   <template slot-scope="scope" >
                     <el-Link @click="expandRow(scope.row, scope.$index)">{{scope.row.projectNames}}</el-Link>
                   </template>
                 </el-table-column>
-                <el-table-column prop="contractAmount" label="合同金额" width="100" align="right">
+                <el-table-column prop="contractAmount" :label="$t('contractamount')" width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.contractAmount.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeMan" label="人工成本"   width="100" align="right">
+                <el-table-column prop="feeMan" :label="$t('artificialcost')"   width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeNormal" label="一般费用"  width="100" align="right">
+                <el-table-column prop="feeNormal" :label="$t('generalcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeNormal.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeTravel" label="差旅费用"  width="100" align="right">
+                <el-table-column prop="feeTravel" :label="$t('travelexpenses')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeTravel.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeOutsourcing" label="外包费用"  width="100" align="right">
+                <el-table-column prop="feeOutsourcing" :label="$t('outsourcingcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeOutsourcing.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="总费用"  width="100" align="right">
+                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润"  width="100" align="right">
+                <el-table-column  :label="$t('profits')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{((scope.row.contractAmount==null?0:scope.row.contractAmount) - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing)).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润率"  width="100" align="right">
+                <el-table-column  :label="$t('profitmargin')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.contractAmount==null||scope.row.contractAmount==0)?'-':((scope.row.contractAmount - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing))*100/scope.row.contractAmount).toFixed(1)+"%"}}
                     </template>
@@ -343,8 +343,8 @@
             <el-table v-if="ins == 5" border :data="list5" key="5"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 100%;" ref="table">
-                <el-table-column prop="projectCode" label="项目编号"  width="120" fixed ></el-table-column>
-                <el-table-column prop="projectName" label="项目名称" width="240" fixed  >
+                <el-table-column prop="projectCode" :label="$t('Itemno')"  width="120" fixed ></el-table-column>
+                <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="240" fixed  >
                   <template slot-scope="scope" >
                     {{scope.row.projectName}}
                   </template>
@@ -359,9 +359,9 @@
 
             <!-- 任务分组工时表 -->
             <el-table v-if="ins == 12" border :data="groupWorktimeList.left" key="12_2" highlight-current-row :height="tableHeight" v-loading="groupListLoading" style="width:33%;float:left;">
-              <el-table-column label="按任务分组统计" header-align="center">
-                  <el-table-column prop="groupName" label="分组名称" min-width="100"></el-table-column>
-                  <el-table-column prop="workingTime" label="工时(h)" min-width="50" align="right" header-align="center">
+              <el-table-column :label="$t('statisticsarecollectedbytaskgroup')" header-align="center">
+                  <el-table-column prop="groupName" :label="$t('groupname')" min-width="100"></el-table-column>
+                  <el-table-column prop="workingTime" :label="$t('time.workingHours')+'(h)'" min-width="50" align="right" header-align="center">
                     <template slot-scope="scope">
                       <span style="margin-right:20px">{{scope.row.workingTime ? scope.row.workingTime.toFixed(1) : ''}}</span>
                     </template>
@@ -371,11 +371,11 @@
             <el-table v-if="ins == 12" border :data="groupWorktimeList.right" key="12"
             highlight-current-row v-loading="listLoading" :height="tableHeight" 
              style="width: 66%;float:right;" ref="grouptable">
-                <el-table-column label="按项目统计" header-align="center">
-                  <el-table-column prop="projectCode" label="项目编号" min-width="75"></el-table-column>
-                  <el-table-column prop="projectName" label="项目名称" min-width="125"></el-table-column>
-                  <el-table-column prop="groupName" label="分组名称" min-width="100"></el-table-column>
-                  <el-table-column prop="workingTime" label="工时(h)" min-width="50" align="right" header-align="center">
+                <el-table-column :label="$t('statisticsbyproject')" header-align="center">
+                  <el-table-column prop="projectCode" :label="$t('Itemno')" min-width="75"></el-table-column>
+                  <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="125"></el-table-column>
+                  <el-table-column prop="groupName" :label="$t('groupname')" min-width="100"></el-table-column>
+                  <el-table-column prop="workingTime" :label="$t('time.workingHours')+ '(h)'" min-width="50" align="right" header-align="center">
                     <template slot-scope="scope">
                       <span style="margin-right:20px">{{scope.row.workingTime ? scope.row.workingTime.toFixed(1) : ''}}</span>
                     </template>
@@ -389,30 +389,30 @@
             <div v-if="ins == 6 || ins == 8">
               
               <el-table v-if="ins == 6" key="6" border :data="overTimeList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="projectCode" label="序号" width="80">
+                <el-table-column prop="projectCode" :label="$t('headerTop.serialNumber')" width="80">
                   <template slot-scope="scope">
                     <div>
                       {{scope.$index + 1}}
                     </div>
                   </template>
                 </el-table-column>
-                <el-table-column prop="projectCode" label="项目编号" width="220"></el-table-column>
-                <el-table-column prop="projectName" label="项目名称" width="220"></el-table-column>
+                <el-table-column prop="projectCode" :label="$t('Itemno')" width="220"></el-table-column>
+                <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="220"></el-table-column>
                 <el-table-column prop="degreeName" :label="user.timeType.customDegreeName" width="180" v-if="user.timeType.customDegreeActive == 1"></el-table-column>
-                <el-table-column prop="username" label="姓名" width="120"></el-table-column>
-                <el-table-column prop="departmentName" label="部门" width="140"></el-table-column>
-                <el-table-column prop="createDate" label="工作日期" width="120"></el-table-column>
-                <el-table-column prop="workingTime" label="工作时长(h)" width="100" align="right">
+                <el-table-column prop="username" :label="$t('lable.name')" width="120"></el-table-column>
+                <el-table-column prop="departmentName" :label="$t('lable.department')" width="140"></el-table-column>
+                <el-table-column prop="createDate" :label="$t('screening.workingDate')" width="120"></el-table-column>
+                <el-table-column prop="workingTime" :label="$t('screening.workTime')+ '(h)'" width="100" align="right">
                   <template slot-scope="scope">
                     <span style="padding-right: 15px;">{{scope.row.workingTime.toFixed(1)}}h</span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="overtimeHours" label="加班时长(h)" width="100" fixed="right" align="right">
+                <el-table-column prop="overtimeHours" :label="$t('jia-ban-shi-chang')+'(h)'" width="100" fixed="right" align="right">
                   <template slot-scope="scope">
                     <span style="padding-right: 15px;">{{scope.row.overtimeHours.toFixed(1)}}h</span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="cost" label="加班成本" width="100" v-if="permissions.reportCost" fixed="right" align="right">
+                <el-table-column prop="cost" :label="$t('overtimecost')" width="100" v-if="permissions.reportCost" fixed="right" align="right">
                   <template slot-scope="scope">
                     <span>¥{{scope.row.cost | numberToCurrency}}</span>
                   </template>
@@ -421,23 +421,23 @@
 
               <!-- 人员工时分配表 -->
             <el-table v-if="ins == 8" key="8" border :data="userWorkHoursList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-              <el-table-column prop="username" label="人员" width="150"></el-table-column>
-              <el-table-column prop="unPublic" label="普通项目工时" min-width="160" align="right">
+              <el-table-column prop="username" :label="$t('ren-yuan')" width="150"></el-table-column>
+              <el-table-column prop="unPublic" :label="$t('ordinaryprojecthours')" min-width="160" align="right">
                 <template slot-scope="scope">
                   <span>{{scope.row.unPublic == null? 0 + 'h' : scope.row.unPublic.toFixed(1) + 'h'}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="isPublic" label="公共项目工时" min-width="160" align="right">
+              <el-table-column prop="isPublic" :label="$t('publicprojecthours')" min-width="160" align="right">
                 <template slot-scope="scope">
                   <span>{{scope.row.isPublic == null? 0 + 'h' : scope.row.isPublic.toFixed(1) + 'h'}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="workingTime" label="总工时" min-width="160" align="right">
+              <el-table-column prop="workingTime" :label="$t('other.totalworkinghours')" min-width="160" align="right">
                 <template slot-scope="scope">
                   <span>{{scope.row.workingTime == null? 0 + 'h' : scope.row.workingTime.toFixed(1) + 'h'}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="proportion" label="公共项目工时占比" min-width="130" align="right">
+              <el-table-column prop="proportion" :label="$t('publicprojecthourszan')" min-width="130" align="right">
                 
               </el-table-column>
             </el-table>
@@ -446,41 +446,41 @@
             <!-- 工时成本预警表 -->
             <el-table v-if="ins == 7" key="7" border :data="baseCostList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
             <!-- 当前总预算,已发生工时成本,xxx成本预算,xxx已发生成本,xxx已发生占比, yyy成本预算,yyy已发生成本,yyy已发生占比。 -->
-                <el-table-column  prop="projectCode" label="项目编号"  width="120" fixed></el-table-column>
-                <el-table-column  prop="projectName" label="项目名称" min-width="200" fixed></el-table-column>
-                <el-table-column prop="baseCurcost" label="当前总预算" min-width="160" align="right">
+                <el-table-column  prop="projectCode" :label="$t('Itemno')"  width="120" fixed></el-table-column>
+                <el-table-column  prop="projectName" :label="$t('headerTop.projectName')" min-width="200" fixed></el-table-column>
+                <el-table-column prop="baseCurcost" :label="$t('currenttotalbudget')" min-width="160" align="right">
                   <template slot-scope="scope">
                     <span>¥{{scope.row.baseCurcost | numberToCurrency}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column  prop="currentRemainingBudget" label="当前剩余预算" min-width="200"  align="right">
+                <el-table-column  prop="currentRemainingBudget" :label="$t('currentsurplusbudget')" min-width="200"  align="right">
                   <template slot-scope="scope">
                     <span>¥{{scope.row.currentRemainingBudget | numberToCurrency}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column  prop="remainingBudget" label="总剩余预算" min-width="200"  align="right">
+                <el-table-column  prop="remainingBudget" :label="$t('totalsurplusbudget')" min-width="200"  align="right">
                   <template slot-scope="scope">
                     <span>¥{{scope.row.remainingBudget | numberToCurrency}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="feeMan" label="已填报工时成本" min-width="160" align="right">
+                <el-table-column prop="feeMan" :label="$t('workinghourshasbeenreported')" min-width="160" align="right">
                   <template slot-scope="scope">
                     <span :class="scope.row.baseCurcost * 0.9 < scope.row.feeMan ? 'warntext' : ''">¥{{scope.row.feeMan | numberToCurrency}}</span>
                   </template>
                 </el-table-column>
                 <template v-for="item in baseCostColumns">
-                  <el-table-column :label="item.name + '成本预算'" min-width="200" align="right">
+                  <el-table-column :label="item.name + $t('costbudget')" min-width="200" align="right">
                     <template slot-scope="scope">
                       <span>¥{{budgetFilter(scope.row.curcostList,item.id) | numberToCurrency}}</span>
                     </template>
                   </el-table-column>
-                  <el-table-column :label="item.name + '已填报成本'" min-width="200" align="right">
+                  <el-table-column :label="item.name + $t('coshasbeenreported')" min-width="200" align="right">
                     <template slot-scope="scope">
                       <span :class="percentageFilter(scope.row,item.id) > 90 ? 'warntext' : ''"
                       >¥{{AlreadyFilter(scope.row.realcostList,item.id) | numberToCurrency}}</span>
                     </template>
                   </el-table-column>
-                  <el-table-column :label="item.name + '已填报占比'" min-width="200" align="right">
+                  <el-table-column :label="item.name + $t('proportionreported')" min-width="200" align="right">
                     <template slot-scope="scope">
                       <span :class="percentageFilter(scope.row,item.id) > 90 ? 'warntext' : ''"
                       >{{percentageFilter(scope.row,item.id) == 'NaN' ? '-' : percentageFilter(scope.row,item.id) + '%'}}</span>
@@ -492,9 +492,9 @@
 
             <!-- 员工填报及时率 -->
             <el-table v-if="ins == 9" key="9" border :data="reportTimelyList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="userName" label="人员" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="departmentName" label="所属部门" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="timelinessRate" label="填报及时率" min-width="200" align="center">
+                <el-table-column prop="userName" :label="$t('ren-yuan')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="departmentName" :label="$t('subordinatedepartments')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="timelinessRate" :label="$t('timelyreportingrate')" min-width="200" align="center">
                   <template slot-scope="scope">
                     <el-link v-if="scope.row.dataList != null" style="color:#409eff;" @click="timelyDetail(scope.row.dataList)">{{scope.row.timelinessRate}}</el-link>
                     <span v-else>{{scope.row.timelinessRate}}</span>
@@ -509,42 +509,42 @@
 
             <!-- 日报待审核统计 -->
             <el-table v-if="ins == 10" key="10" border :data="auditRateList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="userName" label="审核人" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="departmentName" label="所属部门" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="num" label="待审核条数" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="userName" :label="$t('other.reviewer')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="departmentName" :label="$t('subordinatedepartments')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="num" :label="$t('numberitemstobereviewed')" min-width="200" align="center"></el-table-column>
             </el-table>
 
             <!-- 人员工时统计表 -->
             <el-table v-if="ins == 11" key="11" border :data="personnelList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="name" label="姓名" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="departmentName" label="部门" min-width="200" align="center"></el-table-column>
-                <el-table-column prop="planHours" label="计划工时" min-width="200" align="center">
+                <el-table-column prop="name" :label="$t('lable.name')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="departmentName" :label="$t('lable.department')" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="planHours" :label="$t('plantime')" min-width="200" align="center">
                   <template slot-scope="scope">
                     <div v-if="scope.row.planHours">
                       {{scope.row.planHours == null ? 0 : scope.row.planHours.toFixed(1)}}h
                     </div>
                   </template>
                 </el-table-column>
-                <el-table-column prop="workingTime" label="实际工时" min-width="200" align="center">
+                <el-table-column prop="workingTime" :label="$t('shi-ji-gong-shi')" min-width="200" align="center">
                   <template slot-scope="scope">
                     <div v-if="scope.row.workingTime">
                       {{scope.row.workingTime == null ? 0 : scope.row.workingTime.toFixed(1)}}h
                     </div>
                   </template>
                 </el-table-column>
-                <el-table-column prop="proportion" label="实际用时占比" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="proportion" :label="$t('percentageofactualtimespent')" min-width="200" align="center"></el-table-column>
             </el-table>
 
             <!-- 项目成本基线表 -->
             <el-table v-if="ins == 13" key="13" border :data="outputValueList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
-                <el-table-column prop="projectCode" label="项目编号" min-width="150"></el-table-column>
-                <el-table-column prop="projectName" label="项目名称" min-width="250"></el-table-column>
+                <el-table-column prop="projectCode" :label="$t('Itemno')" min-width="150"></el-table-column>
+                <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250"></el-table-column>
                 <el-table-column v-for="item in outputValueTitle" :key="item" :label="item" min-width="150" align="right">
                   <template slot-scope="scope">
                     <span>{{scope.row.projectBasecostList.filter(li => li.baseName == item).length > 0 ? scope.row.projectBasecostList.filter(li => li.baseName == item)[0].baseAmount.toFixed(2) : '-'}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column label="项目产值" min-width="150" align="right" v-if="user.timeType.outputValueStatus == 1">
+                <el-table-column :label="$t('projectoutput')" min-width="150" align="right" v-if="user.timeType.outputValueStatus == 1">
                   <template slot-scope="scope">
                     <span>{{scope.row.outputValue ? scope.row.outputValue.toFixed(2) : '-'}}</span>
                   </template>
@@ -587,78 +587,77 @@
             <el-table border :data="childrenList" 
             highlight-current-row v-loading="listLoading" height="400"
              style="width: 100%;">
-                <el-table-column prop="projectNames" label="相关项目">
+                <el-table-column prop="projectNames" :label="$t('relatedprojects')">
                 </el-table-column>
-                <el-table-column prop="contractAmount" label="合同金额" width="100" align="right">
+                <el-table-column prop="contractAmount" :label="$t('contractamount')" width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.contractAmount.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeMan" label="人工成本"   width="100" align="right">
+                <el-table-column prop="feeMan" :label="$t('artificialcost')"   width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeNormal" label="一般费用"  width="100" align="right">
+                <el-table-column prop="feeNormal" :label="$t('generalcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeNormal.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeTravel" label="差旅费用"  width="100" align="right">
+                <el-table-column prop="feeTravel" :label="$t('travelexpenses')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeTravel.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeOutsourcing" label="外包费用"  width="100" align="right">
+                <el-table-column prop="feeOutsourcing" :label="$t('outsourcingcost')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeOutsourcing.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="总费用"  width="100" align="right">
+                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润"  width="100" align="right">
+                <el-table-column  :label="$t('profits')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.contractAmount==null?0:scope.row.contractAmount) - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing)}}
                     </template>
                 </el-table-column>
-                <el-table-column  label="利润率"  width="100" align="right">
+                <el-table-column  :label="$t('profitmargin')"  width="100" align="right">
                   <template slot-scope="scope">
                         {{(scope.row.contractAmount==null||scope.row.contractAmount==0)?'-':((scope.row.contractAmount - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing))*100/scope.row.contractAmount).toFixed(1)+"%"}}
                     </template>
                 </el-table-column>
             </el-table>
             <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="addFormVisible = false">关闭</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('Shutdown') }}</el-button>
             </div>
         </el-dialog>
-
-        <el-dialog :title="curProject.projectName+'-报销费用明细'" show-summary=true v-if="detailVisible" :summary-method="getSummaries" :visible.sync="detailVisible" :close-on-click-modal="false" customClass="customWidth" width="1000px">
+        <el-dialog :title="curProject.projectName+'-'+$t('detailsofreimbursementexpenses')" show-summary=true v-if="detailVisible" :summary-method="getSummaries" :visible.sync="detailVisible" :close-on-click-modal="false" customClass="customWidth" width="1000px">
         <el-table  :key="ins" border :data="detailList" highlight-current-row v-loading="detailListLoading" :height="500" style="width: 100%;">
-                <el-table-column  prop="username" label="员工姓名"  ></el-table-column>
-                <el-table-column  prop="departmentName" label="所在部门" ></el-table-column>
-                <el-table-column  prop="happenDate" label="费用日期" ></el-table-column>
-                <el-table-column prop="invoiceType" label="费用类型"    >
+                <el-table-column  prop="username" :label="$t('screening.employeename')"  ></el-table-column>
+                <el-table-column  prop="departmentName" :label="$t('departmentsuod')" ></el-table-column>
+                <el-table-column  prop="happenDate" :label="$t('forthedate')" ></el-table-column>
+                <el-table-column prop="invoiceType" :label="$t('costtype')"    >
                   <template slot-scope="scope">
                         {{feeType[scope.row.invoiceType]}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="expenseType" label="票据类型"  >
+                <el-table-column prop="expenseType" :label="$t('ppertype')"  >
                   
                 </el-table-column>
-                <el-table-column prop="amount" label="金额(含税)"   align="right">
+                <el-table-column prop="amount" :label="$t('amountof')+'('+ $t('tax') +')'"   align="right">
                   <template slot-scope="scope">
                         {{scope.row.amount.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="amount" label="税额"   align="right">
+                <el-table-column prop="amount" :label="$t('taxs')"   align="right">
                   <template slot-scope="scope">
                         {{scope.row.taxValue == null?'0.00':scope.row.taxValue.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="amount" label="金额(不含税)"   align="right">
+                <el-table-column prop="amount" :label="$t('amountof')+'('+ $t('notax') +')'"   align="right">
                   <template slot-scope="scope">
                         {{(scope.row.amount-scope.row.taxValue).toFixed(2)}}
                     </template>
@@ -680,25 +679,25 @@
         </el-dialog>
 
         <!-- 加班详情 -->
-        <el-dialog title="加班详情" :visible.sync="dialogVisibleDetails" width="800px" v-loading="listLoading" :before-close="handleClose">
+        <el-dialog :title="$t('workovertimedetails')" :visible.sync="dialogVisibleDetails" width="800px" v-loading="listLoading" :before-close="handleClose">
           <div>
              <el-table :data="detailsList" style="width: 100%" height="400px">
-                <el-table-column prop="username" label="姓名" width="120"></el-table-column>
-                <el-table-column prop="projectName" label="项目名称" width="200"></el-table-column>
-                <el-table-column prop="projectCode" label="项目编号" width="200"></el-table-column>
-                <el-table-column prop="createDate" label="加班日期" width="120"></el-table-column>
-                <el-table-column prop="workingTime" label="当天工作时长(h)" width="160"></el-table-column>
-                <el-table-column prop="overtimeHours" label="加班时长(h)" width="130"></el-table-column>
-                <el-table-column prop="cost" label="加班成本" width="120" v-if="permissions.reportCost"></el-table-column>
+                <el-table-column prop="username" :label="$t('lable.name')" width="120"></el-table-column>
+                <el-table-column prop="projectName" :label="$t('headerTop.projectName')" width="200"></el-table-column>
+                <el-table-column prop="projectCode" :label="$t('Itemno')" width="200"></el-table-column>
+                <el-table-column prop="createDate" :label="$t('workovertimedate')" width="120"></el-table-column>
+                <el-table-column prop="workingTime" :label="$t('workinghoursoftheday')+ '(h)'" width="160"></el-table-column>
+                <el-table-column prop="overtimeHours" :label="$t('jia-ban-shi-chang')+ '(h)'" width="130"></el-table-column>
+                <el-table-column prop="cost" :label="$t('overtimecost')" width="120" v-if="permissions.reportCost"></el-table-column>
              </el-table>
           </div>
         </el-dialog>
 
         <!-- 员工填报及时率详情 -->
-        <el-dialog title="详情" :visible.sync="timelyDetailDialog" width="600px">
+        <el-dialog :title="$t('details')" :visible.sync="timelyDetailDialog" width="600px">
           <el-table :data="timelyDetailList">
-            <el-table-column prop="date" label="日期"></el-table-column>
-            <el-table-column prop="detail" label="填报情况"></el-table-column>
+            <el-table-column :prop="date" :label="$t('weekDay.date')"></el-table-column>
+            <el-table-column prop="detail" :label="$t('fillincase')"></el-table-column>
           </el-table>
         </el-dialog>
   </section>
@@ -713,7 +712,7 @@ export default {
     return {
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
       curProject:{},
-      feeType:['一般费用', '差旅费用', '外包费用'],
+      feeType:[this.$t('generalcost'), this.$t('travelexpenses'), this.$t('outsourcingcost')],
       detailListLoading: false,
       detailList:[],
       detailVisible: false,
@@ -723,12 +722,12 @@ export default {
       addFormVisible:false,
       title:'',
       childrenList:[],
-      taskTypeTxt:["任务", "里程碑", "风险"],
-      taskTypeObj: [{id: '0',value: '任务'},{id: '1',value: '里程碑'},{id: '2',value: '风险'}],
+      taskTypeTxt:[this.$t('other.task'), this.$t('other.milestone'), this.$t('risk')],
+      taskTypeObj: [{id: '0',value: this.$t('other.task')},{id: '1',value: this.$t('other.milestone')},{id: '2',value: this.$t('risk')}],
       taskTypeId: null,
-      taskStatusTxt:["进行中","已完成","已撤销"],
-      statusTxt:["-","进行中","已完成","已撤销"],
-      importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
+      taskStatusTxt:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
+      statusTxt:["-",this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
+      importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
       listLoading:false,
       tableHeight:0,
       list1:[],
@@ -754,10 +753,10 @@ export default {
       z   : null,
       value: null,
       dialog: false, // 单据查看展示
-      shuz: ["项目报表","项目任务报表","项目成本报表",
-      "项目收支平衡表(利润表)","客户项目利润报表","项目阶段工时表",
-      "加班情况统计表","工时成本预警表","人员工时分配表",
-      "员工填报及时率统计","日报待审核统计","人员工时统计表","任务分组工时表","项目成本基线表"],
+      shuz: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
+      this.$t('pojectbalancesheetincomestatement'),this.$t('customerprojectprofitstatement'),this.$t('projectphasetimesheet'),
+      this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
+      this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable')],
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
       overTimeList: [], // 项目加班情况统计列表
@@ -964,7 +963,7 @@ export default {
         const sums = [];
         columns.forEach((column, index) => {
           if (index === 0) {
-            sums[index] = '合计';
+            sums[index] = this.$t('other.totals');
             return;
           }
           if(index === 5) {
@@ -980,7 +979,7 @@ export default {
               }, 0);
               var zhi = +sums[index] + 0
               var sl = zhi.toFixed(2)
-              sl += ' 元';
+              sl += this.$t('yuan');
             } else {
               sums[index] = 'N/A';
             }
@@ -1016,7 +1015,7 @@ export default {
             });
     },
     expandRow(row, index) {
-      this.title = '客户:'+row.customerName;
+      this.title = this.$t('ke-hu')+':'+row.customerName;
         this.childrenList = row.children;
         this.addFormVisible = true;
       },
@@ -1095,25 +1094,25 @@ export default {
         var fName = "";
         var sl = {}
         if (this.ins == 0) {  
-          fName = "项目报表.xls";
+          fName = this.$t('projectreport') + '.xls';
           url += "/exportProject";
         } else if (this.ins == 1) {
-          fName = "项目任务报表.xls";
+          fName = this.$t('projectTaskReport') + '.xls';
           url += "/exportProjectTask";
           if(this.taskTypeId != 'null' && this.taskTypeId != null && this.taskTypeId != '') {
             sl.taskType = this.taskTypeId
           }
         } else if (this.ins == 2) {
-          fName = "项目成本报表.xls";
+          fName = this.$t('projectcoststatement') + '.xls';
           url += "/exportAllProjectCost";
         } else if (this.ins == 3) {
-          fName = "项目收支平衡表.xls";
+          fName = this.$t('projectbalancesheet') + '.xls';
           url += "/exportProjectInAndOut";
         } else if (this.ins == 4) {
-          fName = "客户项目利润报表.xls";
+          fName = this.$t('customerprojectprofitstatement') + '.xls';
           url += "/exportCustomerProjectInAndOut";
         } else if (this.ins == 5) {
-          fName = "项目阶段工时报表.xls";
+          fName = this.$t('projectphasetimereport') + '.xls';
           url += "/exportProjectStagesCost";
           if(this.stageNames.length){
             let stagestr = ''
@@ -1124,26 +1123,26 @@ export default {
             sl.stageNames = stagestr
           }
         } else if (this.ins == 6) {
-          fName = "加班情况统计报表.xls";
+          fName = this.$t('statisticalreportofovertimework')  + '.xls';
           url += "/exportOvertimeList";
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
           sl.projectId = this.proJuctId
         } else if (this.ins == 7) {
-          fName = "工时成本预警表.xls";
+          fName = this.$t('timecostearlywarningtable')  + '.xls';
           url += "/exportBaseCostAndRealCost";
         } else if (this.ins == 8) {
-          fName = "人员工时分配表.xls"
+          fName = this.$t('personneltimeallocationtable')  + '.xls'
           url += "/exportUserWorkingTimeList"
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
         } else if (this.ins == 9) {
-          fName = "人员填报及时率统计.xls"
+          fName = this.$t('personnelfillingtimelyratestatistics')  + '.xls'
           url += "/exportReportTimelinessRate"
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
         } else if (this.ins == 10) {
-          fName = "日报待审核统计.xls"
+          fName = this.$t('dailyreporttobereviewedstatistics')  + '.xls'
           url += "/exportWaitingReviewList"
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
@@ -1152,7 +1151,7 @@ export default {
             sl.userId = this.userId
           }
         } else if(this.ins == 11){
-          fName = "人员工时统计.xls"
+          fName = this.$t('personnelhourstatistics')  + '.xls'
           url += "/exportUserWorkingTimeStatic"
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
@@ -1163,12 +1162,12 @@ export default {
             sl.departmentId = this.departmentIdArray[this.departmentIdArray.length - 1]
           }
         }else if(this.ins == 12){
-          fName = "任务分组工时统计.xls"
+          fName = this.$t('timestatisticsofaskgroups') + '.xls'
           url += "/exportGroupWithProjectTimeCost"
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
         }else if(this.ins == 13){
-          fName = "项目成本基线表.xls"
+          fName = this.$t('projectcostbaselinetable') + '.xls'
           url += "/exportProjectBaseCost"
         }
           this.http.post(url, sl,

+ 58 - 58
fhKeeper/formulahousekeeper/timesheet/src/views/customer/list.vue

@@ -3,19 +3,19 @@
         <!--工具条-->
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
-                <el-form-item label="客户列表">
+                <el-form-item :label="$t('clientlist')">
                     
                 </el-form-item>
                 <el-form-item >
                     <div>
-                    <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入客户名称关键字" clearable="true">
+                    <el-input style="float:left;" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterthecustomernamekeyword')" clearable="true">
                         <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button>
                     </el-input>
                     </div>
                 </el-form-item>
                 <el-form-item style="float:right;">
-                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">新增客户</el-link>
-                    <el-link type="primary" :underline="false" @click="intocustomerRatio">批量导入客户</el-link>
+                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">{{ $t('newcustomer') }}</el-link>
+                    <el-link type="primary" :underline="false" @click="intocustomerRatio">{{ $t('importingCustomersinBatches') }}</el-link>
                 </el-form-item>
             </el-form>
         </el-col>
@@ -27,29 +27,29 @@
                         {{scope.$index+1+(page-1)*size}}
                     </template> -->
             </el-table-column>
-            <el-table-column prop="customerCode" label="客户编码"  width="120" sortable="custom"></el-table-column>
-            <el-table-column prop="customerName" label="客户名称" >
+            <el-table-column prop="customerCode" :label="$t('clientcode')"  width="160" sortable="custom"></el-table-column>
+            <el-table-column prop="customerName" :label="$t('customername')" >
             </el-table-column>
-            <el-table-column prop="contactName" label="联系人"  width="120">
+            <el-table-column prop="contactName" :label="$t('contact')"  width="120">
             </el-table-column>
-            <el-table-column prop="contactPhone" label="联系电话"  width="150">
+            <el-table-column prop="contactPhone" :label="$t('contactphonenumber')"  width="150">
             </el-table-column>
-            <el-table-column prop="email" label="邮箱"  width="180">
+            <el-table-column prop="email" :label="$t('email')"  width="180">
             </el-table-column>
-            <el-table-column prop="address" label="地址" sortable="custom">
+            <el-table-column prop="address" :label="$t('address')" sortable="custom">
             </el-table-column>
             
-            <el-table-column label="操作" width="150">
+            <el-table-column :label="$t('operation')" width="150">
                 <template slot-scope="scope">
-                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">编辑</el-button>
-                    <el-button size="mini"  @click="deletePro(scope.$index, scope.row)">删除</el-button>
+                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="mini"  @click="deletePro(scope.$index, scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
 
         <!--工具条-->
         <el-col :span="24" class="toolbar">
-            <el-button type="primary" size="small" @click="batchDelete" :loading="delLoading">批量删除</el-button>
+            <el-button type="primary" size="small" @click="batchDelete" :loading="delLoading">{{ $t('Batchdelete') }}</el-button>
             <el-pagination
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
@@ -64,49 +64,49 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="800px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item label="客户编号" >
-                    <el-input v-model="addForm.customerCode" :max="20" placeholder="请输入客户编号" clearable></el-input>
+                <el-form-item label="$t('ustomernumber')" >
+                    <el-input v-model="addForm.customerCode" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="客户名称" prop="customerName">
-                    <el-input v-model="addForm.customerName" :max="20" placeholder="请输入客户名称" clearable></el-input>
+                <el-form-item label="$t('customername')" prop="customerName">
+                    <el-input v-model="addForm.customerName" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="联系人" prop="contactName">
-                    <el-input v-model="addForm.contactName" :max="20" placeholder="请输入客户联系人" clearable></el-input>
+                <el-form-item label="$t('contact')" prop="contactName">
+                    <el-input v-model="addForm.contactName" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="联系电话" prop="contactPhone">
-                    <el-input v-model="addForm.contactPhone" :max="20" placeholder="请输入客户联系电话" clearable></el-input>
+                <el-form-item label="$t('contactphonenumber')" prop="contactPhone">
+                    <el-input v-model="addForm.contactPhone" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="邮箱" prop="email">
-                    <el-input v-model="addForm.email" :max="25" placeholder="请输入客户邮箱" clearable></el-input>
+                <el-form-item label="$t('email')" prop="email">
+                    <el-input v-model="addForm.email" :max="25" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="地址" prop="address">
-                    <el-input v-model="addForm.address" :max="50"  placeholder="请输入客户联系地址" clearable></el-input>
+                <el-form-item label="$t('address')" prop="address">
+                    <el-input v-model="addForm.address" :max="50"  :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
 
             </el-form>
             <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
          <!-- 导入结果说明 -->
-        <el-dialog title="分摊比例导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('importingtheallocationratio')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
             <div>
                 <span>{{importResultMsg}}</span>
                 
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+                <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
-         <el-dialog title="导入客户数据" v-if="intocustomerDialog" :visible.sync="intocustomerDialog" customClass="customWidth" width="500px">
-            <p>1. 下载
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/新增客户导入模板.xlsx" download="新增客户导入模板.xlsx">新增客户导入模板.xlsx</el-link>
+         <el-dialog :title="$t('importingCustomerData')" v-if="intocustomerDialog" :visible.sync="intocustomerDialog" customClass="customWidth" width="500px">
+            <p>1. {{ $t('other.download') }}
+            <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/'+$t('customerimporttemplatisadded')+'.xlsx'" :download="$t('customerimporttemplatisadded')+'.xlsx'">{{$t('customerimporttemplatisadded')}}.xlsx</el-link>
             </p>
             <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
             <p style="display: flex;justify-content: center;padding:1em 0">
                 <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+                <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting') }}</el-button>
             </el-upload>
             </p>
         </el-dialog>
@@ -131,10 +131,10 @@
     export default {
         data() {
             return {
-                roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员"],
+                roleArray:[this.$t('role.ordinaryEmployees'),this.$t('role.superAdministrator'), this.$t('role.systemAdministrator'), this.$t('role.companyTop'),this.$t('role.financialAdministrator'), this.$t('role.projectManager')],
                 status:null,
-                statusTxt:["-","进行中","已完成","已撤销"],
-                importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
+                statusTxt:["-",this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
+                importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
                 searchField:null,
                 keyword:null,
                 user: JSON.parse(sessionStorage.getItem("user")),
@@ -163,7 +163,7 @@
                     level:1,
                 },
                 rules: {
-                    customerName: [{ required: true, message: "请输入客户名称", trigger: "blur" }],
+                    customerName: [{ required: true, message: this.$t('pleaseenterthecustomername'), trigger: "blur" }],
                 },
                 intocustomerDialog:false,
                 importingData: false,
@@ -204,7 +204,7 @@
             },
             batchDelete(){
                 if(this.selectArr.length == 0){
-                    this.$message('请选择要删除的客户数据')
+                    this.$message(this.$t('selecttheustomerdatayouwanttodelete'))
                     return
                 }else{
                     let nametext = ''
@@ -212,9 +212,9 @@
                         nametext += this.selectArr[i].customerName + '、'
                     }
                     nametext = nametext.substring(0,nametext.length - 1)
-                    this.$confirm("确定要批量删除客户:" + nametext + "\u3000吗?","删除客户", {
-                        confirmButtonText: "确定",
-                        cancelButtonText: "取消",
+                    this.$confirm(this.$t('determinethatyouwantodelete') +":" + nametext + "\u3000"+this.$t('ma')+"?",this.$t('deleteCustomer'), {
+                        confirmButtonText: this.$t('btn.determine'),
+                        cancelButtonText: this.$t('btn.cancel'),
                         type: "warning"
                     }).then(()=>{
                         this.delLoading = true
@@ -229,7 +229,7 @@
                             this.delLoading = false
                             if(res.code == 'ok'){
                                 this.$message({
-                                    message: '删除成功',
+                                    message: this.$t('message.successfullyDeleted'),
                                     type: 'success'
                                 })
                                 this.getList()
@@ -259,7 +259,7 @@
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -273,10 +273,10 @@
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "成功导入/更新"+res.data+"条客户数据。"+(res.msg?res.msg:"");
+                            this.importResultMsg = this.$t('importedupdatedsuccessfully')+res.data+this.$t('customerdata')+(res.msg?res.msg:"");
                             this.getList();
                         } else {
-                            this.importResultMsg = "导入失败:"+res.msg;
+                            this.importResultMsg = this.$t('export.Importfailure')+":"+res.msg;
                         }
                     },
                     error => {
@@ -295,7 +295,7 @@
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -309,7 +309,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "导入成功",
+                                message: this.$t('other.importSuccess'),
                                 type: "success"
                             });
                             this.getList();
@@ -335,9 +335,9 @@
         //         this.addForm.budget = this.addForm.budget.replace('.','');
             },
             deleteSubPro(subProject) {
-                this.$confirm("确定要删除子项目" + subProject.name + "吗?","删除子项目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makesuretodeletethesubproject') + subProject.name + this.$t('ma'),this.$t('deletesubproject'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -349,7 +349,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.subProject(this.currentProject);
@@ -499,11 +499,11 @@
             //显示新增界面
             handleAdd(i, item) {
                 if(i == -1) {
-                    this.title = "新增客户";
+                    this.title = this.$t('newcustomer');
                     this.addForm = {
                     }
                 } else {
-                    this.title = "修改客户";
+                    this.title = this.$t('modifythecustomer');
                     this.addForm = JSON.parse(JSON.stringify(item));
                 }
                 this.addFormVisible = true;
@@ -539,9 +539,9 @@
 
             // 删除
             deletePro(i, item) {
-                this.$confirm("确定要删除客户" + item.customerName + "吗?","删除客户", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makeuretodeletethecustomer') + item.customerName + this.$t('ma'),this.$t('deleteCustomer'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -553,7 +553,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.getList();

+ 165 - 164
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -2,7 +2,7 @@
   <section>
       <div class="sidebars" ref="sidebars" style="width: 200px;display: block;background: #fff;">
         <div ref="abbisd" style="width: 100%;overflow: hidden;">
-          <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>费用报销模块</h3>
+          <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>{{ $t('expensereimbursementmodule') }}</h3>
           <el-divider ></el-divider>
           <el-col :span="12">
             <el-menu
@@ -16,19 +16,19 @@
               <el-submenu index="1">
                 <template slot="title">
                   <i class="iconfont firerock-icontianbao"></i>
-                  <span>员工费用填报</span>
+                  <span>{{ $t('fillinthestaffexpenses') }}</span>
                 </template>
-                  <el-menu-item index="1-1"><p @click="ssl(0)"> 一般费用填报</p></el-menu-item>
-                  <el-menu-item index="1-2"><p @click="ssl(1)">差旅费用填报</p></el-menu-item>
-                  <el-menu-item index="1-3"><p @click="ssl(2)">外包费用填报</p></el-menu-item>
+                  <el-menu-item index="1-1"><p @click="ssl(0)"> {{ $t('generalexpenses') }}</p></el-menu-item>
+                  <el-menu-item index="1-2"><p @click="ssl(1)">{{ $t('travelexpensess') }}</p></el-menu-item>
+                  <el-menu-item index="1-3"><p @click="ssl(2)">{{ $t('outsourcingcostshouldbereported') }}</p></el-menu-item>
               </el-submenu>
               <el-submenu index="2">
                 <template slot="title">
                   <i class="iconfont firerock-iconbaoxiaodan"></i>
-                  <span>{{permissions.costAll?"报销凭证列表":"我的报销凭证"}}</span>
+                  <span>{{permissions.costAll?$t('listofreimbursementvouchers'):$t('myexpensevoucher')}}</span>
                 </template>
-                <el-menu-item index="2-1" ><p @click="bills(false)" >单据列表</p></el-menu-item>
-                <el-menu-item index="2-2" v-if="permissions.costAudit"><p @click="bills(true)">单据审核</p></el-menu-item>
+                <el-menu-item index="2-1" ><p @click="bills(false)" >{{ $t('documentlist') }}</p></el-menu-item>
+                <el-menu-item index="2-2" v-if="permissions.costAudit"><p @click="bills(true)">{{ $t('documentreview') }}</p></el-menu-item>
               </el-submenu>
                 <!-- <el-menu-item index="3" @select="bills" @click="bills(false)" v-if="user.role == 0">
                   <i class="iconfont firerock-iconbaoxiaodan"></i>
@@ -49,9 +49,9 @@
   <div class="contents">
     <div v-if="!displayTable" class="headine" ref="headine">
       <h3 ref="headHe" style="padding-left: 220px">{{shuz[ins]}}</h3>
-      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submits" size="mini">提交</el-button></p>
-      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submitUpload" size="mini">批量上传</el-button></p>
-      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="customTypeOp" size="mini" v-if="permissions.costAll">费用类型管理</el-button></p>
+      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submits" size="mini">{{ $t('btn.submit') }}</el-button></p>
+      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submitUpload" size="mini">{{ $t('batchupload') }}</el-button></p>
+      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="customTypeOp" size="mini" v-if="permissions.costAll">{{ $t('expensetypemanagement') }}</el-button></p>
     </div>
     <!-- 上面部分 -->
     <div ref="staff" style="margin: 20px 20px 0 220px; width: 81.5%" >
@@ -61,35 +61,35 @@
           <el-form :model="addForm" ref="mainAddForm" label-width="80px" :rules="addFormRules">
             <!-- <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> -->
             <!-- 报销人 -->
-            <el-form-item label="报销人" prop="ownerId">
+            <el-form-item :label="$t('peopleconcerned')" prop="ownerId">
               <!--普通员工只能自己填报自己的 -->
-              <el-select v-model="addForm.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="!permissions.costAudit" filterable="true">
+              <el-select v-model="addForm.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
               </el-select>
             </el-form-item>
             <!-- 填报日期 -->
-            <el-form-item label="填报日期" style="position: relative;top: 38px;" prop="createDate">
+            <el-form-item :label="$t('fillinthedate')" style="position: relative;top: 38px;" prop="createDate">
               <el-col :span="11">
-                <el-date-picker type="date" placeholder="选择日期" v-model="addForm.createDate" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
+                <el-date-picker type="date" :placeholder="$t('optiondate')" v-model="addForm.createDate" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
               </el-col>
             </el-form-item>
             <!-- 发票张数 -->
-            <el-form-item label="发票张数">
+            <el-form-item :label="$t('invoicenumber')">
               <el-input v-model="addForm.ticketNum" style="width: 150px"></el-input>
             </el-form-item>
             <!-- 费用类型 -->
-            <el-form-item label="费用类型">
+            <el-form-item :label="$t('costtype')">
               <el-select v-model="addForm.type" disabled style="width: 150px" >
-                <el-option label="一般" :value="0"></el-option>
-                <el-option label="差旅" :value="1"></el-option>
-                <el-option label="外包" :value="2"></el-option>
+                <el-option :label="$t('yi-ban')" :value="0"></el-option>
+                <el-option :label="$t('cha-lv')" :value="1"></el-option>
+                <el-option :label="$t('wai-bao')" :value="2"></el-option>
               </el-select>
             </el-form-item>
             
             <!-- 备注 -->
-            <el-form-item label="备注" style="display: block; width: 70%; float: left;">
+            <el-form-item :label="$t('bei-zhu')" style="display: block; width: 70%; float: left;">
               <el-input type="textarea" v-model="addForm.remark" :autosize="{minRows: 2, maxRows: 2}"></el-input>
             </el-form-item>
             <!-- 总费用 -->
@@ -99,9 +99,9 @@
         <!-- 按钮 -->
         
         <div class="pu_button">
-          <span v-if="totalCost <= 0" style="color:#606266;">总费用 {{totalCost}} 元</span>
-          <span v-else style="color:#606266;">总费用 ¥{{totalCost | numberToCurrency}} 元</span>
-          <span class="pu_bu_x" style="margin-left:10px;" @click="addxz"> <i class="el-icon-circle-plus-outline"></i> 新增发票</span>
+          <span v-if="totalCost <= 0" style="color:#606266;">{{ $t('totalcostos') }} {{totalCost}} {{ $t('yuan') }}</span>
+          <span v-else style="color:#606266;">{{ $t('totalcostos') }} ¥{{totalCost | numberToCurrency}} {{ $t('yuan') }}</span>
+          <span class="pu_bu_x" style="margin-left:10px;" @click="addxz"> <i class="el-icon-circle-plus-outline"></i> {{ $t('newinvoice') }}</span>
         </div>
   
         <!-- 表格 -->
@@ -112,9 +112,9 @@
             style="width: 100%;height:100%"
             height="386px"
             @row-dblclick="dbclick">
-            <el-table-column prop="projectName" label="所属项目" width="180">
+            <el-table-column prop="projectName" :label="$t('subordinatetotheproject')" width="180">
               <template slot-scope="scope">
-                <el-select size="small" v-model="scope.row.projectId" placeholder="项目" style="width: 150px" filterable popper-class="projectSelectPopperClass">
+                <el-select size="small" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 150px" filterable popper-class="projectSelectPopperClass">
                   <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
                     <span style="float: left;color: #8492a6; font-size: 13px">{{ item.projectCode }}</span>
                     <span style="float: right;">{{ item.projectName }}</span>
@@ -122,65 +122,65 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column prop="happenDate" label="费用日期" width="170px">
+            <el-table-column prop="happenDate" :label="$t('forthedate')" width="170px">
               <template slot-scope="scope">
-                <el-date-picker size="small" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" placeholder="选择日期">
+                <el-date-picker size="small" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')">
                 </el-date-picker>
               </template>
             </el-table-column>
-            <el-table-column label="发票种类" width="175px">
+            <el-table-column :label="$t('invoices')" width="175px">
               <template slot-scope="scope">
-                <el-select size="small" v-model="scope.row.invoiceType" placeholder="请选择费用类型" style="width: 150px;">
-                  <el-option label="增值税专用发票" value="0"></el-option>
-                  <el-option label="增值税普通发票" value="1"></el-option>
+                <el-select size="small" v-model="scope.row.invoiceType" :placeholder="$t('pleaseselectthetypeoffee')" style="width: 150px;">
+                  <el-option :label="$t('vATspecialinvoice')" value="0"></el-option>
+                  <el-option :label="$t('vATgeneralinvoice')" value="1"></el-option>
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column label="费用类型" width="175px">
+            <el-table-column :label="$t('costtype')" width="175px">
               <template slot-scope="scope">
-                <el-select size="small" v-model="scope.row.expenseType" placeholder="费用类型" style="width: 150px" >
+                <el-select size="small" v-model="scope.row.expenseType" :placeholder="$t('costtype')" style="width: 150px" >
                   <el-option v-for="(item, index) in expenseTypeList" :key="index" :label="item.typeName" :value="item.typeName" ></el-option>
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column label="费用金额(含税)" width="135px">
+            <el-table-column :label="$t('amountoffees')" width="135px">
               <template slot-scope="scope">
                 <el-input size="small" :id="'upam'+scope.$index" v-model="scope.row.amount" @input="zhi(scope.$index)" @change="shiqu(scope.row.amount)" @keyup.native="restrictNumber('upam'+scope.$index)"></el-input>
               </template>
             </el-table-column>
-            <el-table-column prop="invoiceNo" label="发票号" width="135px">
+            <el-table-column prop="invoiceNo" :label="$t('invoiceno')" width="135px">
               <template slot-scope="scope">
                 <el-input size="small" v-model.number="scope.row.invoiceNo"></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="税率%" width="135px">
+            <el-table-column :label="$t('shui-shuai')" width="135px">
               <template slot-scope="scope">
                 <el-input size="small" type= "number"  v-model="scope.row.taxPercent" @input="zhi(scope.$index)"></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="税额" width="135px">
+            <el-table-column :label="$t('taxs')" width="135px">
               <template slot-scope="scope">
                 <el-input size="small" v-model="scope.row.taxValue" @input="zhis(scope.$index)"></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="备注" width="135px">
+            <el-table-column :label="$t('bei-zhu')" width="135px">
               <template slot-scope="scope">
                 <el-input size="small" v-model="scope.row.remark"></el-input>
               </template>
             </el-table-column>
-            <el-table-column label="报销凭证" width="135px">
+            <el-table-column :label="$t('expensereimbursementvoucher')" width="135px">
               <template slot-scope="scope">
                 <div @click="abl(scope.$index)">
                   <el-upload :class="!scope.row.pic ? 'upload-demo' : 'upload-demo icl'" :before-remove="beforeRemove" :http-request="fileonLoad" limit="1" name="multipartFile">
-                    <el-button size="small" type="primary" v-if="!scope.row.pic">点击上传</el-button>
+                    <el-button size="small" type="primary" v-if="!scope.row.pic">{{ $t('clickupload') }}</el-button>
                   </el-upload>
                 </div>
               </template>
             </el-table-column>
             <el-table-column fixed="right"
-              label="操作">
+              :label="$t('operation')">
               <template slot-scope="scope">
-                <el-button  type="default" size="mini" style="display: inline-block;margin-left:0;margin-top: 3px" @click="chanc(scope.$index)">删除</el-button>
+                <el-button  type="default" size="mini" style="display: inline-block;margin-left:0;margin-top: 3px" @click="chanc(scope.$index)">{{ $t('btn.delete') }}</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -197,78 +197,78 @@
           <div>
           <el-form label-width="70px" inline >
             <!-- 报销人 -->
-            <el-form-item label="报销人">
-              <el-select v-model="ownerId" size="small" clearable placeholder="选择报销人" style="width: 120px" :disabled="!permissions.costAudit" filterable="true">
+            <el-form-item :label="$t('peopleconcerned')">
+              <el-select v-model="ownerId" size="small" clearable :placeholder="$t('selecttheapplicant')" style="width: 120px" :disabled="!permissions.costAudit" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span> 
               </el-select>
             </el-form-item>
             <!-- 单据编号 -->
-            <el-form-item label="单据编号" >
-              <el-input v-model="code" size="small" placeholder="单据编号" clearable="true" style="width: 120px"></el-input>
+            <el-form-item :label="$t('receiptnumber')" >
+              <el-input v-model="code" size="small" :placeholder="$t('receiptnumber')" clearable="true" style="width: 120px"></el-input>
             </el-form-item>
             <!-- 费用类型 -->
-            <el-form-item label="费用类型">
-              <el-select v-model="type" size="small" placeholder="请选择费用类型" clearable="true" style="width: 150px">
-                <el-option label="一般费用" value="0"></el-option>
-                <el-option label="差旅费用" value="1"></el-option>
-                <el-option label="外包费用" value="2"></el-option>
+            <el-form-item :label="$t('costtype')">
+              <el-select v-model="type" size="small" :placeholder="$t('pleaseselectthetypeoffee')" clearable="true" style="width: 150px">
+                <el-option :label="$t('generalcost')" value="0"></el-option>
+                <el-option :label="$t('travelexpenses')" value="1"></el-option>
+                <el-option :label="$t('outsourcingcost')" value="2"></el-option>
               </el-select>
             </el-form-item>
             <!-- 填报日期 -->
-            <el-form-item label="填报日期" >
+            <el-form-item label="$t('fillinthedate')" >
               <el-date-picker
                 v-model="date"
                 type="daterange"
                 value-format="yyyy-MM-dd"
                 size="small"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
+                :range-separator="$t('other.to')"
+                :start-placeholder="$t('time.startDate')"
+                :end-placeholder="$t('time.endDate')"
                 style="width: 280px">
               </el-date-picker>
             </el-form-item>
             <el-form-item>
-              <el-button @click="getList" size="small">查找</el-button>
+              <el-button @click="getList" size="small">{{ $t('find') }}</el-button>
             </el-form-item>
           </el-form>
         </div>
         <el-divider ></el-divider>
         <!--列表-->
           <el-table ref="tab" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" :summary-method="getSummaries" show-summary>
-              <el-table-column prop="code" label="票据编号"></el-table-column>
-              <el-table-column prop="totalAmount" label="金额(元)" align="center">
+              <el-table-column prop="code" :label="$t('ticketnumber')"></el-table-column>
+              <el-table-column prop="totalAmount" :label="$t('amountof')+ '('+$t('yuan')+')'" align="center">
                 <template slot-scope="scope" >
                   <span style="float:right;margin-right:20px">{{scope.row.totalAmount ? scope.row.totalAmount.toFixed(2) : '0'}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="ownerName" label="报销人" ></el-table-column>
-              <el-table-column prop="createDate" label="填报日期" ></el-table-column>
-              <el-table-column prop="ticketNum" label="发票张数" ></el-table-column>
-              <el-table-column prop="type" label="票据类型" >
+              <el-table-column prop="ownerName" :label="$t('peopleconcerned')" ></el-table-column>
+              <el-table-column prop="createDate" :label="$t('fillinthedate')" ></el-table-column>
+              <el-table-column prop="ticketNum" :label="$t('invoicenumber')" ></el-table-column>
+              <el-table-column prop="type" :label="$t('ppertype')" >
                 <template slot-scope="scope">
                   {{feeType[scope.row.type]}}
                 </template>
               </el-table-column>
-              <el-table-column prop="remark" label="备注" width="180">
+              <el-table-column prop="remark" :label="$t('bei-zhu')" width="180">
                 <template slot-scope="scope">
                   <span style="font-size:12px;">{{scope.row.remark}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="status" label="状态" width="80">
+              <el-table-column prop="status" :label="$t('state.states')" width="80">
                 <template slot-scope="scope">
                   <span v-if="scope.row.status == 1" class="waiting">{{statusTxt[scope.row.status]}}</span>
                   <span v-if="scope.row.status == 2" class="rejected">{{statusTxt[scope.row.status]}}</span>
                   <span v-if="scope.row.status == 0 || scope.row.status == 3" >{{statusTxt[scope.row.status]}}</span>
                 </template>
               </el-table-column>
-              <el-table-column prop="denyReason" label="驳回原因" width="180">
+              <el-table-column prop="denyReason" :label="$t('dismissreason')" width="180">
                 <template slot-scope="scope">
                   <span style="font-size:12px;">{{scope.row.denyReason}}</span>
                 </template>
               </el-table-column>
-              <el-table-column fixed="right" label="操作" :width="isAuditList?220:160">
+              <el-table-column fixed="right" :label="$t('operation')" :width="isAuditList?220:160">
                   <template slot-scope="scope" >
                       <div v-if="!isAuditList">
                       <el-button icon="el-icon-view"  circle size="mini"  @click.stop.native="downloadByA(scope.row)" ></el-button>
@@ -276,9 +276,9 @@
                       <el-button icon="el-icon-delete"  circle size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.row)" v-show="permissions.costAudit || scope.row.status == 1 || scope.row.status == 2 "></el-button>
                       </div>
                       <div v-if="isAuditList">
-                        <el-button  size="mini"  @click.stop.native="downloadByA(scope.row)" >查看</el-button>
-                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="approve(scope.row)" >通过</el-button>
-                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="denyReason(scope.row)" >驳回</el-button>
+                        <el-button  size="mini"  @click.stop.native="downloadByA(scope.row)" >{{ $t('cha-kan') }}</el-button>
+                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="approve(scope.row)" >{{ $t('btn.through') }}</el-button>
+                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="denyReason(scope.row)" >{{ $t('btn.rejected') }}</el-button>
                       </div>
                   </template>
               </el-table-column>
@@ -300,37 +300,37 @@
       </div>
   </div>
     <!-- 我的单据报销展示 -->
-      <el-dialog title="报销凭证详情" :visible.sync="dialog" width="1000px">
+      <el-dialog :title="$t('detailsofReimbursementvoucher')" :visible.sync="dialog" width="1000px">
         <!-- 内容主体 -->
         <div class="informant"><!--  报销人 -->
           <el-form :model="ParticularsList" label-width="80px">
-            <el-form-item label="报销人" style="width: 270px" :rules="{ required: true, message: '请选择报销人', trigger: 'blur' }">
+            <el-form-item :label="$t('peopleconcerned')" style="width: 270px" :rules="{ required: true, message: $t('pleaseselecttheapplicant'), trigger: 'blur' }">
               <!-- <el-input v-show="flg" v-model="ParticularsList.ownerName" disabled ></el-input> -->
-              <el-select v-model="ParticularsList.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId">
+              <el-select v-model="ParticularsList.ownerId" :placeholder="$t('pleaseselecttheapplicant')" style="width: 150px" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
               </el-select>
             </el-form-item>
-            <el-form-item label="填报日期">
+            <el-form-item :label="$t('fillinthedate')">
               <!-- <el-input v-model="ParticularsList.createDate" :disabled="flg"></el-input> -->
-              <el-date-picker type="date" :disabled="flg" placeholder="选择日期" v-model="ParticularsList.createDate" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
+              <el-date-picker type="date" :disabled="flg" :placeholder="$t('optiondate')" v-model="ParticularsList.createDate" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
             </el-form-item>
-            <el-form-item label="发票张数">
+            <el-form-item :label="$t('invoicenumber')">
               <el-input v-enter-number v-model="ParticularsList.ticketNum" :disabled="flg"></el-input>
             </el-form-item>
-            <el-form-item label="费用类型" style="width: 270px"> 
-                <el-select v-model="ParticularsList.type" placeholder="请选择" :disabled="flg">
-                  <el-option label="一般" :value="0"></el-option>
-                  <el-option label="差旅" :value="1"></el-option>
-                  <el-option label="外包" :value="2"></el-option>
+            <el-form-item :label="$t('costtype')" style="width: 270px"> 
+                <el-select v-model="ParticularsList.type" :placeholder="$t('defaultText.pleaseChoose')" :disabled="flg">
+                  <el-option :label="$t('yi-ban')" :value="0"></el-option>
+                  <el-option :label="$t('cha-lv')" :value="1"></el-option>
+                  <el-option :label="$t('wai-bao')" :value="2"></el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item label="备注" style="width: 280px">
+            <el-form-item :label="$t('bei-zhu')" style="width: 280px">
               <el-input v-model="ParticularsList.remark" :disabled="flg"></el-input>
             </el-form-item>
-            <el-form-item label="总费用">
-              ¥{{ParticularsList.totalAmount | numberToCurrency}}&nbsp;&nbsp;
+            <el-form-item :label="$t('totalcostos')">
+              ¥{{ParticularsList.totalAmount | numberToCurrency}}&nbsp;&nbsp;{{$t('yuan')}}
             </el-form-item>
 
             <!-- <template slot-scope="scope">
@@ -339,9 +339,9 @@
               </template> -->
           </el-form>
           <el-table :data="ParticularsList.invoiceList" border style="width: 100%">
-            <el-table-column prop="projectId" label="项目" width="155">
+            <el-table-column prop="projectId" :label="$t('other.project')" width="155">
                 <template slot-scope="scope">
-                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" placeholder="项目" style="width: 130px">
+                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 130px">
                     <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
                       <span style="float: left;color: #8492a6; font-size: 13px">{{ item.projectCode }}</span>
                       <span style="float: right;margin-left: 20px">{{ item.projectName }}</span>
@@ -355,66 +355,66 @@
                   </div>
                 </template>
             </el-table-column>
-            <el-table-column prop="happenDate" label="费用日期" width="172">
+            <el-table-column prop="happenDate" :label="$t('forthedate')" width="172">
               <template slot-scope="scope">
-                <el-date-picker size="small" v-if="!flg" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" placeholder="选择日期">
+                <el-date-picker size="small" v-if="!flg" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')">
                 </el-date-picker>
                 <span v-else>{{scope.row.happenDate}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="invoiceType" label="发票种类" width="172">
+            <el-table-column prop="invoiceType" :label="$t('invoices')" width="172">
               <template slot-scope="scope">
-                <el-select size="small" v-if="!flg" v-model="scope.row.invoiceType" placeholder="请选择费用类型" style="width: 150px;">
-                  <el-option label="增值税专用发票" :value="0"></el-option>
-                  <el-option label="增值税普通发票" :value="1"></el-option>
+                <el-select size="small" v-if="!flg" v-model="scope.row.invoiceType" :placeholder="$t('pleaseselectthetypeoffee')" style="width: 150px;">
+                  <el-option :label="$t('vATspecialinvoice')" :value="0"></el-option>
+                  <el-option :label="$t('vATgeneralinvoice')" :value="1"></el-option>
                 </el-select>
                 <span v-else>{{typeInvoic[scope.row.invoiceType]}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="invoiceType" label="费用类型" width="172">
+            <el-table-column prop="invoiceType" :label="$t('costtype')" width="172">
               <template slot-scope="scope">
-                <el-select v-if="!flg" size="small" v-model="scope.row.expenseType" placeholder="请选择费用类型" style="width: 150px" >
+                <el-select v-if="!flg" size="small" v-model="scope.row.expenseType" :placeholder="$t('pleaseselectthetypeoffee')" style="width: 150px" >
                   <el-option v-for="(item, index) in expenseTypeList" :key="index" :label="item.typeName" :value="item.typeName" ></el-option>
                 </el-select>
                 <span v-else>{{scope.row.expenseType}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="amount" label="费用金额(含税:元)" width="172">
+            <el-table-column prop="amount" :label="$t('amountoffees')" width="172">
               <template slot-scope="scope">
                 <el-input size="small"  v-if="!flg" :id="'am'+scope.$index" v-model="scope.row.amount" @input="zhiNum(scope.$index, scope)" @change="kan" @keyup.native="restrictNumber('am'+scope.$index)"></el-input>
                 <span v-else>¥{{scope.row.amount}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="invoiceNo" label="发票号" width="172">
+            <el-table-column prop="invoiceNo" :label="$t('invoiceno')" width="172">
               <template slot-scope="scope">
                 <el-input size="small" v-if="!flg" v-model.number="scope.row.invoiceNo"></el-input>
                 <span v-else>{{scope.row.invoiceNo}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="taxPercent" label="税率%" width="172">
+            <el-table-column prop="taxPercent" :label="$t('shui-shuai')" width="172">
               <template slot-scope="scope">
                 <el-input size="small"  v-if="!flg" v-model="scope.row.taxPercent" @input="zhiNum(scope.$index, scope)"></el-input>
                 <span v-else>{{scope.row.taxPercent}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="taxValue" label="税额(元)" width="172">
+            <el-table-column prop="taxValue" :label="$t('taxs')+'('+$t('yuan')+')'" width="172">
               <template slot-scope="scope">
                 <el-input size="small"  v-if="!flg" v-model="scope.row.taxValue"></el-input>
                 <span v-else>¥{{scope.row.taxValue}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="remark" label="备注" width="300">
+            <el-table-column prop="remark" :label="$t('bei-zhu')" width="300">
               <template slot-scope="scope"> 
                 <el-input size="small" v-if="!flg" v-model="scope.row.remark"></el-input>
                 <span v-else>{{scope.row.remark}}</span>
               </template>
             </el-table-column>
-            <el-table-column prop="pic" label="报销凭证" width="300">
+            <el-table-column prop="pic" :label="$t('expensereimbursementvoucher')" width="300">
               <template slot-scope="scope">
                 <div v-if="!flg">
                   <div @click="abl(scope.$index)" style="height: 35px;overflow: hidden;">
                     <el-upload :class="!scope.row.pic ? 'upload-demo' : 'upload-demo icl'" :file-list="scope.row.pic" :before-remove="beforeRemoves" :http-request="fileonLoads" limit="1" name="multipartFile">
-                      <el-button size="small" type="primary" v-if="!scope.row.pic">点击上传</el-button>
+                      <el-button size="small" type="primary" v-if="!scope.row.pic">{{ $t('clickupload') }}</el-button>
                     </el-upload>
                   </div>
                 </div>
@@ -426,15 +426,15 @@
                     </viewer>
                     </div>
                   </span>
-                  <span v-else>暂无单据</span>    
+                  <span v-else>{{ $t('nodocuments') }}</span>    
                 </div>
               </template>
             </el-table-column>
             <!-- 删除 -->
             <el-table-column fixed="right"
-              label="操作" v-if="!flg">
+              :label="$t('operation')" v-if="!flg">
               <template slot-scope="scope">
-                <el-button  type="default" size="mini" style="display: inline-block;margin-left:0;margin-top: 3px" @click="delec(scope.$index)">删除</el-button>
+                <el-button  type="default" size="mini" style="display: inline-block;margin-left:0;margin-top: 3px" @click="delec(scope.$index)">{{ $t('btn.delete') }}</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -444,79 +444,80 @@
         </viewer> -->
         <!-- 取消和确定 -->
         <span slot="footer" class="dialog-footer">
-          <el-button @click="dialog = false">取 消</el-button>
-          <el-button v-if="!flg" type="primary" @click="present()">确 定</el-button>
-          <el-button v-else type="primary" @click="dialog = false">确 定</el-button>
+          <el-button @click="dialog = false">{{ $t('btn.cancel') }}</el-button>
+          <el-button v-if="!flg" type="primary" @click="present()">{{ $t('btn.determine') }}</el-button>
+          <el-button v-else type="primary" @click="dialog = false">{{ $t('btn.determine') }}</el-button>
         </span>
       </el-dialog>
 
       <!-- 批量上传 -->
-      <el-dialog title="批量上传" v-if="importDialog" :visible.sync="importDialog" customClass="customWidth" width="500px">
-            <p>1. 下载
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/费用报销导入模板.xlsx" download="费用报销导入模板.xlsx">费用报销导入模板.xlsx</el-link>
+      <el-dialog :title="$t('batchupload')" v-if="importDialog" :visible.sync="importDialog" customClass="customWidth" width="500px">
+            <p>1. {{ $t('other.download') }}
+              <span>{{ $t('expensereimbursementimporttemplate') }}</span>
+            <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/'+$t('expensereimbursementimporttemplate')+'.xlsx'" :download="$t('expensereimbursementimporttemplate')+'.xlsx'">{{$t('expensereimbursementimporttemplate')}}.xlsx</el-link>
             </p>
-            <p>2. 填写excel模板,并上传。</p>
+            <p>2. {{ $t('exceltemplateanduploadit') }}。</p>
             <div style="padding-bottom:1em;">
               <div style="width:300px;margin:0 auto">
               <el-upload ref="upload" action="#" :auto-upload="false" multiple :on-change="fileListAdd" :on-remove="fileListDel">
-                <el-button slot="trigger" size="small" type="primary" style="">选取文件</el-button>
-                <el-button type="primary" size="small" style="margin-left:30px" :underline="false" :loading="importingData" @click="submitUploadSure" :disabled="fileList.length == 0">开始上传</el-button>
-                <el-button size="small" style="margin-left:30px" @click="fileListClear">清空</el-button>
+                <el-button slot="trigger" size="small" type="primary" style="">{{ $t('selecthefile') }}</el-button>
+                <el-button type="primary" size="small" style="margin-left:30px" :underline="false" :loading="importingData" @click="submitUploadSure" :disabled="fileList.length == 0">{{ $t('toupload') }}</el-button>
+                <el-button size="small" style="margin-left:30px" @click="fileListClear">{{ $t('clears') }}</el-button>
               </el-upload>
               </div>
             </div>
         </el-dialog>
 
         <!-- 费用类型自定义 -->
-        <el-dialog title="费用类型管理" v-if="customTypeDialog" :visible.sync="customTypeDialog" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('expensetypemanagement')" v-if="customTypeDialog" :visible.sync="customTypeDialog" customClass="customWidth" width="600px">
           <el-table :data="customTypeList" style="width:100%" height="400" :loading="customTypeListLoading">
-            <el-table-column prop="typeName" label="费用名称" min-width="150"></el-table-column>
-            <el-table-column label="费用类型" min-width="150">
+            <el-table-column prop="typeName" :label="$t('costofname')" min-width="150"></el-table-column>
+            <el-table-column :label="$t('costtype')" min-width="150">
               <template slot-scope="scope">
-                <span>{{scope.row.mainType == 0 ? '一般费用' : (scope.row.mainType == 1 ? '差旅费用' : '外包费用')}}</span>
+                <span>{{scope.row.mainType == 0 ? $t('generalcost') : (scope.row.mainType == 1 ? $t('travelexpenses') : $t('outsourcingcost'))}}</span>
               </template>
             </el-table-column>
-            <el-table-column label="操作" width="150">
+            <el-table-column :label="$t('operation')" width="150">
               <template slot-scope="scope">
-                <el-button @click="customTypeEditOp(scope.row)" size="small" type="primary">编辑</el-button>
-                <el-button @click="customTypeEditDelete(scope.row)" size="small" type="danger">删除</el-button>
+                <el-button @click="customTypeEditOp(scope.row)" size="small" type="primary">{{ $t('bian-ji') }}</el-button>
+                <el-button @click="customTypeEditDelete(scope.row)" size="small" type="danger">{{ $t('btn.delete') }}</el-button>
               </template>
             </el-table-column>
           </el-table>
           <span slot="footer" class="dialog-footer">
-            <el-button @click="customTypeDialog = false" size="medium">取消</el-button>
-            <el-button type="primary" @click="customTypeEditOp()" size="medium">新增类型</el-button>
+            <el-button @click="customTypeDialog = false" size="medium">{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="customTypeEditOp()" size="medium">{{ $t('newtype') }}</el-button>
           </span>
 
           <!-- 新增/编辑费用类型 -->
-          <el-dialog title="新增/编辑费用类型" v-if="customTypeEditDialog" :visible.sync="customTypeEditDialog" customClass="customWidth" width="400px" append-to-body>
+          <el-dialog :title="$t('addeditfeetypes')" v-if="customTypeEditDialog" :visible.sync="customTypeEditDialog" customClass="customWidth" width="400px" append-to-body>
             <el-form label-width="80px" :rules="editTypeDataRules" ref="editTypeDataForm" :model="editTypeData">
-              <el-form-item label="所属类型" style="margin:30px 0">
+              <el-form-item :label="$t('belongstype')" style="margin:30px 0">
                 <el-select v-model="editTypeData.mainType" size="medium" style="width:90%">
-                  <el-option label="一般费用" :value="0"></el-option>
-                  <el-option label="差旅费用" :value="1"></el-option>
-                  <el-option label="外包费用" :value="2"></el-option>
+                  <el-option :label="$t('generalcost')" :value="0"></el-option>
+                  <el-option :label="$t('travelexpenses')" :value="1"></el-option>
+                  <el-option :label="$t('outsourcingcost')" :value="2"></el-option>
                 </el-select>
               </el-form-item>
-              <el-form-item label="类型名称" style="margin:30px 0" prop="typeName">
-                <el-input id="editTypeDataInput" size="medium" v-model="editTypeData.typeName" placeholder="自定义费用类型名称" style="width:90%" @keyup.native="editTypeDataInput('editTypeDataInput')"></el-input>
+              <el-form-item :label="$t('typename ')" style="margin:30px 0" prop="typeName">
+                <el-input id="editTypeDataInput" size="medium" v-model="editTypeData.typeName" :placeholder="$t('customizethfeetypename')" style="width:90%" @keyup.native="editTypeDataInput('editTypeDataInput')"></el-input>
               </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
-              <el-button @click="customTypeEditDialog = false" size="medium">取消</el-button>
-              <el-button type="primary" @click="customTypeEditSure" size="medium">确认</el-button>
+              <el-button @click="customTypeEditDialog = false" size="medium">{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="customTypeEditSure" size="medium">{{ $t('btn.determine') }}</el-button>
             </span>
           </el-dialog>
         </el-dialog>
 
         <!-- 驳回弹出框 -->
-        <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>
-                <el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="'请输入您决定驳回的原因'" />
+                <el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="$t('reasonforyourdecisiontoreject')" />
             </div>
             <div slot="footer" class="dialog-footer">
-                <el-button  @click="denyReasonDialog = false" >取消</el-button>
-                <el-button type="primary" @click="deny()" >确定</el-button>
+                <el-button  @click="denyReasonDialog = false" >{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="deny()" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
   </section>
@@ -541,18 +542,18 @@ export default {
       xiamianWidth: document.documentElement.clientWidth || document.body.clientWidth,
       imgs: [],
       addFormRules: {
-        ownerId: [{ required: true, message: "请选择报销人", trigger: "blur" }],
-        createDate: [{ required: true, message: "请选择日期", trigger: "blur" }],
+        ownerId: [{ required: true, message: this.$t('pleaseselecttheapplicant'), trigger: "blur" }],
+        createDate: [{ required: true, message: this.$t('pleaseselectadate'), trigger: "blur" }],
       },      
       isAuditList: false,
-      statusTxt:["审核通过","待审核", "已驳回", "已撤销"],
+      statusTxt:[this.$t('state.approved'),this.$t('state.WaitingAudit'), this.$t('state.rejected'), this.$t('state.undone')],
       user: JSON.parse(sessionStorage.getItem("user")),
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
       allExpList:[],
       expenseTypeList:[],
       tian:{a: null,b: null,c: null,d: null,e: null,f: null,g: null,h: null,},
-      feeType:["一般费用","差旅费用","外包费用"],
-      typeInvoic: ['增值税专用发票', '增值税普通发票'],
+      feeType:[this.$t('generalcost'),this.$t('travelexpenses'),this.$t('outsourcingcost')],
+      typeInvoic: [this.$t('vATspecialinvoice'), this.$t('vATgeneralinvoice')],
       listLoading:false,
       tableHeight:0,
       list:[],
@@ -583,7 +584,7 @@ export default {
       ParticularsList: [],
       projectIdName: [], // 点击查看的项目名
       flg: false, // 是否禁用
-      shuz: ['一般费用填报', '差旅费用填报', '外包费用填报'],
+      shuz: [this.$t('generalexpenses'), this.$t('travelexpensess'), this.$t('outsourcingcostshouldbereported')],
       ins: 0,
       apl: '',
       diz: 'http://worktime.ttkuaiban.com',
@@ -597,7 +598,7 @@ export default {
       customTypeEditDialog: false,
       editTypeData: {},
       editTypeDataRules:{
-        typeName: [{ required: true, message: "请输入自定义费用类型名称", trigger: "blur" }],
+        typeName: [{ required: true, message: this.$t('pleaseentercustomfeetypename'), trigger: "blur" }],
       },
     };
   },
@@ -687,9 +688,9 @@ export default {
         }})
     },
     customTypeEditDelete(row){
-      this.$confirm('该操作可能造成已有数据丢失,确定要删除吗?','提示',{
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+      this.$confirm(this.$t('operationmaycausedatalossAreyousuredeletethedata'),this.$t('other.prompts'),{
+        confirmButtonText: this.$t('btn.determine'),
+        cancelButtonText: this.$t('btn.cancel'),
         type: 'warning'
       }).then(()=>{
         this.http.post('/expense-type/delete',{
@@ -714,7 +715,7 @@ export default {
       }).catch(()=>{
         this.$message({
           type: 'info',
-          message: '已取消删除'
+          message: this.$t('thedeletionhasbeencancelled')
         })
       })
     },
@@ -733,7 +734,7 @@ export default {
       let format = str[str.length - 1];
       if (format != "xls" && format != "xlsx") {
         this.$message({
-          message: "请选择.xls或.xlsx文件",
+          message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
           type: "error"
         });
         fileList.splice(fileList.length-1)
@@ -748,9 +749,9 @@ export default {
       this.fileList = []
     },
     submitUploadSure(){
-        this.$confirm('确认上传?','提示',{
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
+        this.$confirm(this.$t('confirmtoupload'),this.$t('other.prompts'),{
+          confirmButtonText: this.$t('btn.determine'),
+          cancelButtonText: this.$t('btn.cancel'),
           type: 'success'
         }).then(()=>{
           let formData = new FormData();
@@ -767,7 +768,7 @@ export default {
                   this.$refs.upload.clearFiles();
                   this.fileList = []
                   this.$message({
-                      message: "上传成功",
+                      message: this.$t('uploadedsuccessfully'),
                       type: "success"
                   });
               } else {
@@ -937,7 +938,7 @@ export default {
             if (res.code == "ok") {
                 this.bills(this.isAuditList);
                 this.$message({
-                message: '编辑成功',
+                message: this.$t('editsuccess'),
                 type: "success"
                 });
             } else {
@@ -993,7 +994,7 @@ export default {
             if (valid) {
               if (this.invoiceList.length == 0) {
                 this.$message({
-                    message: '请添加发票',
+                    message: this.$t('pleaseaddtheinvoice'),
                     type: "error"
                 });
                 return;
@@ -1080,7 +1081,7 @@ export default {
             if (res.code == "ok") {
               this.getList()
                 this.$message({
-                message: '删除成功',
+                message: this.$t('message.successfullyDeleted'),
                 type: "success"
                 });
             } else {
@@ -1106,7 +1107,7 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.$message({
-                message: '填报成功',
+                message: this.$t('message.fillinsuccessfully'),
                 type: "success"
                 });
             } else {
@@ -1160,7 +1161,7 @@ export default {
                     var j = {}
                     var img = this.diz + '/upload/' + res.data.invoiceList[i].pic
                     j.url = img
-                    j.title = '报销凭证',
+                    j.title = this.$t('expensereimbursementvoucher'),
                     j.name = res.data.invoiceList[i].pic
                     b.push(j)
                     res.data.invoiceList[i].pic = b
@@ -1201,7 +1202,7 @@ export default {
         this.getList();
     },
     deleteItem(item) {
-      this.$confirm("确认要删除吗?", "提示", {
+      this.$confirm(this.$t('yousureyouwanttodelete'), this.$t('other.prompts'), {
                     //type: 'warning'
                 }).then(() => {
                     this.http.post('/expense-sheet/delete', {id:item.id},
@@ -1310,7 +1311,7 @@ export default {
         let format = str[str.length - 1];
         if (format != "jpg" && format != "png") {
             this.$message({
-                message: "请选择图片",
+                message: this.$t('pleaseselectpictures'),
                 type: "error"
             });
         } else {
@@ -1322,7 +1323,7 @@ export default {
                 this.listLoading = false;
                 if (res.code == "ok") {
                     this.$message({
-                        message: "上传成功",
+                        message: this.$t('uploadedsuccessfully'),
                         type: "success"
                     });
                     // this.getList();
@@ -1359,7 +1360,7 @@ export default {
         let format = str[str.length - 1];
         if (format != "jpg" && format != "png") {
             this.$message({
-                message: "请选择图片",
+                message: this.$t('pleaseselectpictures'),
                 type: "error"
             });
         } else {
@@ -1371,7 +1372,7 @@ export default {
                 this.listLoading = false;
                 if (res.code == "ok") {
                     this.$message({
-                        message: "上传成功",
+                        message: this.$t('uploadedsuccessfully'),
                         type: "success"
                     });
                     // this.getList();
@@ -1420,7 +1421,7 @@ export default {
         const sums = [];
         columns.forEach((column, index) => {
           if (index === 0) {
-            sums[index] = '合计';
+            sums[index] = this.$t('other.totals');
             return;
           }
           if(index === 1) {
@@ -1436,7 +1437,7 @@ export default {
               }, 0);
               var zhi = +sums[index] + 0
               var sl = zhi.toFixed(2)
-              sl += ' 元';
+              sl += this.$t('yuan');
             } else {
               sums[index] = '';
             }

+ 164 - 164
fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

@@ -1,7 +1,7 @@
 <template>
   <section id="section">
     <div class="sidebars" ref="sidebars" :style="'width: 180px;display: block;overflow:hidden;background: #fff;height:'+hubs+ 'px'">
-      <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>请假管理</h3>
+      <h3><i class="iconfont firerock-iconbaoxiao" style="padding-right: 10px"></i>{{ $t('navigation.askForLeaveManagement') }}</h3>
       <el-divider ></el-divider>
       <el-col :span="12">
         <el-menu :default-active="isDingding ? '7' : '1'" class="el-menu-vertical-demo" @select="staffs" background-color="#ffffff" text-color="#666666" active-text-color="#20A0FF" style="width:100%">
@@ -18,38 +18,38 @@
           <template v-if="!isDingding">
           <el-menu-item index="1" v-if="permissions.leaveFil">
             <i class="iconfont firerock-icontianbao"></i>
-            <span slot="title">员工请假填报</span>
+            <span slot="title">{{ $t('staffleavetofillin') }}</span>
           </el-menu-item>
           <el-submenu index="2" v-if="permissions.leaveAll">
             <template slot="title">
               <i class="iconfont firerock-iconbaoxiaodan"></i>
-              <span>{{"请假单列表"}}</span>
+              <span>{{ $t('singlelistofleave') }}</span>
             </template>
-            <el-menu-item index="2-1" ><p @click="bills(false, 2)" v-if="permissions.leaveAll">全部</p></el-menu-item>
-            <el-menu-item index="2-2" ><p @click="bills(true, 1)" v-if="permissions.leaveAudit">待审核</p></el-menu-item>
+            <el-menu-item index="2-1" ><p @click="bills(false, 2)" v-if="permissions.leaveAll">{{ $t('all') }}</p></el-menu-item>
+            <el-menu-item index="2-2" ><p @click="bills(true, 1)" v-if="permissions.leaveAudit">{{ $t('state.WaitingAudit') }}</p></el-menu-item>
           </el-submenu>
             <el-menu-item index="3" @select="bills" @click="bills(false, 2)" v-if="!permissions.leaveAll">
               <i class="iconfont firerock-iconbaoxiaodan"></i>
-              <span slot="title">我的请假单</span>
+              <span slot="title">{{ $t('myleaveform') }}</span>
             </el-menu-item>
             <el-menu-item index="4" v-if="permissions.leaveStatistical">
               <template slot="title">
                 <i class="iconfont firerock-icontianbao"></i>
-                <span slot="title">请假统计</span>
+                <span slot="title">{{ $t('for') }}</span>
               </template>
           </el-menu-item>
 
           <el-menu-item index="5" v-if="permissions.leaveProcess">
               <template slot="title">
                 <i class="iconfont firerock-iconliucheng"></i>
-                <span slot="title">请假审批流程</span>
+                <span slot="title">{{ $t('leaveApprovalProcess') }}</span>
               </template>
           </el-menu-item>
 
           <el-menu-item index="6" v-if="permissions.leaveAnnual">
               <template slot="title">
                 <i class="iconfont firerock-icontianbao"></i>
-                <span slot="title">年假管理</span>
+                <span slot="title">{{ $t('annualleavemanagement') }}</span>
               </template>
           </el-menu-item>
           </template>
@@ -59,13 +59,13 @@
             <el-menu-item index="7">
                 <template slot="title">
                   <i class="iconfont firerock-iconbaoxiaodan"></i>
-                  <span slot="title">请假单列表</span>
+                  <span slot="title">{{ $t('singlelistofleave') }}</span>
                 </template>
             </el-menu-item>
             <el-menu-item index="8">
                 <template slot="title">
                   <i class="iconfont firerock-iconbaoxiaodan"></i>
-                  <span slot="title">假期剩余表</span>
+                  <span slot="title">{{ $t('scheduleofremainingLeave') }}</span>
                 </template>
             </el-menu-item>
           </template>
@@ -81,7 +81,7 @@
     <!-- 内容主体区域 -->
   <div class="contents">
     <div v-if="!displayTable && !isDingding" class="headine" ref="headine">
-      <h3 ref="headHe" style="padding-left: 220px">请假填报</h3>
+      <h3 ref="headHe" style="padding-left: 220px">{{ $t('aketimeoffto') }}</h3>
       <!-- <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submits('addFormRules')" size="mini">提交</el-button></p> -->
     </div>
     <!-- 上面部分 -->
@@ -91,41 +91,41 @@
             <!-- 表单 -->
             <el-form ref="addForm" :model="addForm" label-width="80px" :rules="addFormRules">
                 <!-- 请假类型 -->
-                <el-form-item label="请假类型" prop="leaveType" style="width: 100%">
+                <el-form-item :label="$t('leavetype')" prop="leaveType" style="width: 100%">
                     <!--普通员工只能自己填报自己的 -->
-                    <el-select v-model="addForm.leaveType" @change="txselts(addForm.leaveType,addForm.ownerId)" placeholder="请选择请假类型" style="width: 240px">
+                    <el-select v-model="addForm.leaveType" @change="txselts(addForm.leaveType,addForm.ownerId)" :placeholder="$t('defaultText.pleaseChoose')" style="width: 240px">
                           <el-option v-for="item in qjType" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                     <template  v-if="addForm.leaveType == 6">
-                      <span style="margin-left:18px;color:#777;">剩余可调休 {{addForm.ownerId != '' ? txselnum : '~'}} 天</span>
-                      <el-tooltip effect="dark" content="加班时长可用于调休抵扣" placement="top-start">
+                      <span style="margin-left:18px;color:#777;">{{ $t('restcanbeadjusted') }} {{addForm.ownerId != '' ? txselnum : '~'}} {{ $t('time.day') }}</span>
+                      <el-tooltip effect="dark" :content="$t('overtimhourscabeusedforoffsetting')" placement="top-start">
                         <i class="el-icon-question" style="color:#606266;"></i>
                       </el-tooltip>
                     </template>
                 </el-form-item>
                 <!-- 请假人 -->
-                <el-form-item label="请假人" prop="ownerId"  style="width: 300px">
+                <el-form-item :label="$t('leavepeople')" prop="ownerId"  style="width: 300px">
                     <!--普通员工只能自己填报自己的 -->
-                    <el-select v-model="addForm.ownerId" @change="txselts(addForm.leaveType,addForm.ownerId)" placeholder="请选择请假人" style="width: 240px" :disabled="true" filterable="true">
+                    <el-select v-model="addForm.ownerId" @change="txselts(addForm.leaveType,addForm.ownerId)" :placeholder="$t('defaultText.pleaseChoose')" style="width: 240px" :disabled="true" filterable="true">
                         <span v-for="(item, index) in users" :key="index">
                         <el-option :label="item.name" :value="item.id"></el-option>
                         </span> 
                     </el-select>
                 </el-form-item>
                 <!-- 电话 -->
-                <el-form-item label="电话" prop="tel" style="margin-right:300px">
-                    <el-input ref="ipts" v-model="addForm.tel" placeholder="请输入手机号" style="width: 250px"></el-input>
+                <el-form-item :label="$t('phone')" prop="tel" style="margin-right:300px">
+                    <el-input ref="ipts" v-model="addForm.tel" :placeholder="$t('peaseenterthe')" style="width: 250px"></el-input>
                 </el-form-item>
                 <!-- 单选 -->
-                <el-form-item style="display: inline-block;width:300px" label="时长单位">
+                <el-form-item style="display: inline-block;width:300px" :label="$t('lengthunit')">
                     <el-radio-group v-model="addForm.timeType" @change="chanRadio()" style="display:inline-block;width:240px">
-                        <el-radio label="0">按天请假</el-radio>
-                        <el-radio label="1" v-if="addForm.leaveType != 6">按小时请假</el-radio>
+                        <el-radio label="0">{{ $t('accordingdays') }}</el-radio>
+                        <el-radio label="1" v-if="addForm.leaveType != 6">{{ $t('leavehour') }}</el-radio>
                     </el-radio-group>
                 </el-form-item>
                 <!-- 选择审批人 -->
-                <el-form-item label="审批人" style="width:300px" prop="projectAuditorJson">
-                    <el-select style="display:inline-block;width:250px;" multiple v-model="addForm.projectAuditorJson" placeholder="请选择">
+                <el-form-item :label="$t('approver')" style="width:300px" prop="projectAuditorJson">
+                    <el-select style="display:inline-block;width:250px;" multiple v-model="addForm.projectAuditorJson" :placeholder="$t('defaultText.pleaseChoose')">
                       <el-option
                       v-for="item in approverList"
                       :key="item.id"
@@ -135,36 +135,36 @@
                     </el-select>
                 </el-form-item>
                 <!-- 时间选择 -->
-                <el-form-item :label="flg ? '选择日期' : '选择时间'" style="width: 100%;">
+                <el-form-item :label="flg ? $t('optiondate') : $t('other.timeSelection')" style="width: 100%;">
                     <el-col style="display: inline-block; width: 240px">
-                        <el-date-picker v-if="flg" type="date" placeholder="开始日期" value-format="yyyy-MM-dd"  v-model="addForm.startDate" style="width: 240px;" @blur="datas()"></el-date-picker>
-                        <el-date-picker v-else type="date" placeholder="开始日期" value-format="yyyy-MM-dd" v-model="addForm.startDate" style="width: 240px;" @change="datasss()"></el-date-picker>
+                        <el-date-picker v-if="flg" type="date" :placeholder="$t('time.startDate')" value-format="yyyy-MM-dd"  v-model="addForm.startDate" style="width: 240px;" @blur="datas()"></el-date-picker>
+                        <el-date-picker v-else type="date" :placeholder="$t('time.startDate')" value-format="yyyy-MM-dd" v-model="addForm.startDate" style="width: 240px;" @change="datasss()"></el-date-picker>
                     </el-col>
                     <el-col class="line" v-if="flg" style="display: inline-block; width: 50px">-</el-col>
                     <el-col style="display: inline-block; width: 240px">
-                        <el-date-picker v-if="flg" type="date" placeholder="结束日期" value-format="yyyy-MM-dd" :picker-options="pickerOptionsEnd" v-model="addForm.endDate" style="width: 250px;" @blur="datas()"></el-date-picker>
+                        <el-date-picker v-if="flg" type="date" :placeholder="$t('time.endDate')" value-format="yyyy-MM-dd" :picker-options="pickerOptionsEnd" v-model="addForm.endDate" style="width: 250px;" @blur="datas()"></el-date-picker>
                         <!-- <el-select v-else v-model="addForm.timeHours" placeholder="请假时长" @change="chanSele()">
                             <el-option v-for="(item, index) in options" :key="index" :label="item" :value="item"></el-option>
                         </el-select> -->
                     </el-col>
                 </el-form-item>
                 <!-- 请假天数 -->
-                <el-form-item :label="flg ? '请假天数' : '请假时长'" prop="timeDays" style="margin-right: 500px">
+                <el-form-item :label="flg ? $t('leavedays') : $t('leavetime')" prop="timeDays" style="margin-right: 500px">
                    <!-- {{flg ? addForm.timeDays : addForm.timeHours}}{{flg ? '天' : '小时'}} -->
                    <!-- <div v-if="flg">{{addForm.timeDays}} 天</div> -->
-                   <div v-if="flg"> <el-input v-model="addForm.timeDays" @blur="inputs()" @input="addForm.timeDays=addForm.timeDays.replace(/[^\d.]/g,'')" style="width: 120px; margin-right: 20px;" type="number" :step="0.5"></el-input> </div>
+                   <div v-if="flg"> <el-input v-model="addForm.timeDays" @blur="inputs()" @input="addForm.timeDays=addForm.timeDays.replace(/[^\d.]/g,'')" style="width: 120px; margin-right: 20px;" type="number" :step="0.5"></el-input> {{ $t('time.day') }}</div>
                    <div v-else>
-                      <el-input v-model="addForm.timeHours" @blur="inputss()" @input="addForm.timeHours=addForm.timeHours.replace(/[^\d.]/g,'')" style="width: 120px; margin-right: 20px;"></el-input> 小时
+                      <el-input v-model="addForm.timeHours" @blur="inputss()" @input="addForm.timeHours=addForm.timeHours.replace(/[^\d.]/g,'')" style="width: 120px; margin-right: 20px;"></el-input> {{ $t('time.hour') }}
                    </div>
                 </el-form-item>
                 <!-- 备注 -->
-                <el-form-item label="备注" style="width: 100%">
+                <el-form-item :label="$t('bei-zhu')" style="width: 100%">
                     <el-input type="textarea" v-model="addForm.remark" :rows="5" style="width: 550px" maxlength="100" show-word-limit></el-input>
                 </el-form-item>
             </el-form>
 
             <div>
-              <p style="margin-left: 20%"><el-button type="primary" @click="submits('addFormRules')" size="mini" :disabled="txselnum == 0 && addForm.leaveType == 6 && addForm.ownerId != '' ? true : false">提交</el-button></p>
+              <p style="margin-left: 20%"><el-button type="primary" @click="submits('addFormRules')" size="mini" :disabled="txselnum == 0 && addForm.leaveType == 6 && addForm.ownerId != '' ? true : false">{{ $t('btn.submit') }}</el-button></p>
             </div>
         </div>
     </div>
@@ -175,28 +175,28 @@
         <div class="ctons" style="width: 98%;">
           <div class="flex">
             <div>
-              <el-select v-model="ownerIds" placeholder="请选择请假人" clearable @change="chufas()" style="width: 160px" size="small" v-show="permissions.leaveAll" filterable="true">
+              <el-select v-model="ownerIds" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="chufas()" style="width: 160px" size="small" v-show="permissions.leaveAll" filterable="true">
                   <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
             </div>
             <div>
-              <span style="color: #606266">请假类型</span>
-              <el-select v-model="type" placeholder="请选择请假类型" clearable @change="chufas()" style="width: 160px;" size="small" filterable="true">
+              <span style="color: #606266">{{ $t('leavetype') }}</span>
+              <el-select v-model="type" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" style="width: 160px;" size="small" filterable="true">
                   <span v-for="(item, index) in typess" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
             </div>
             <div>
-              <span style="color: #606266">请假状态</span>
-              <el-select v-if="falg == 0" v-model="code" placeholder="请选择请假状态" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
+              <span style="color: #606266">{{$t('offstate')}}</span>
+              <el-select v-if="falg == 0" v-model="code" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
                   <span v-for="(item, index) in statuss" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
               </el-select>
-              <el-select v-if="falg == 1" disabled v-model="code" placeholder="请选择请假类型" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
+              <el-select v-if="falg == 1" disabled v-model="code" :placeholder="$t('pleaseselectthetypeofleave')" clearable @change="chufas()" size="small" style="width: 160px" filterable="true">
                   <span v-for="(item, index) in statuss" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                   </span> 
@@ -205,14 +205,14 @@
             <div>
               <!-- <span style="color: #606266">请假时间</span>
               <el-date-picker v-model="createDate" type="date" @change="chufas()" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable="false"> </el-date-picker> -->
-                <span style="color: #606266">时间段</span>
-                <el-date-picker v-model="createDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="chufas()" value-format="yyyy-MM-dd" placeholder="选择日期" size="small" clearable style="width:280px"></el-date-picker>
+                <span style="color: #606266">{{ $t('message.period') }}</span>
+                <el-date-picker v-model="createDate" type="daterange" :range-separator="$t('other.to')" :start-placeholder="$t('time.startDate')" :end-placeholder="$t('time.endDate')" @change="chufas()" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')" size="small" clearable style="width:280px"></el-date-picker>
             </div>
           </div>
             <el-table v-loading="loading" :data="tableData" style="width: 100%" height="94%">
-                <el-table-column prop="ownerName" :label="'请假人'" min-width="120" fixed="left"></el-table-column>
-                <el-table-column prop="tel" label="电话" min-width="120"></el-table-column>
-                <el-table-column prop="leaveType" label="请假类型" min-width="120">
+                <el-table-column prop="ownerName" :label="$t('leavepeople')" min-width="120" fixed="left"></el-table-column>
+                <el-table-column prop="tel" :label="$t('phone')" min-width="120"></el-table-column>
+                <el-table-column prop="leaveType" :label="$t('leavetype')" min-width="120">
                   <template slot-scope="scope">
                     <!-- <div v-if="scope.row.leaveType == 0">事假</div>
                     <div v-if="scope.row.leaveType == 1">病假</div>
@@ -221,41 +221,41 @@
                     {{qjType[scope.row.leaveType].name}}
                   </template>
                 </el-table-column>
-                <el-table-column prop="startDate" label="请假开始时间" min-width="150"></el-table-column>
-                <el-table-column prop="endDate" label="请假结束时间" min-width="150"></el-table-column>
-                <el-table-column label="请假天数" min-width="120">
+                <el-table-column prop="startDate" :label="$t('leavestarttime')" min-width="150"></el-table-column>
+                <el-table-column prop="endDate" :label="$t('leaveendtime')" min-width="150"></el-table-column>
+                <el-table-column :label="$t('leavedays')" min-width="120">
                   <template slot-scope="scope">
                     <div v-if="scope.row.timeType == '1'">/</div>
-                    <div v-else>{{scope.row.timeDays}}</div>
+                    <div v-else>{{scope.row.timeDays}} {{ $t('time.day') }}</div>
                   </template>
                 </el-table-column>
-                <el-table-column label="请假时长" min-width="120" v-if="!user.timeType.syncDingding">
+                <el-table-column :label="$t('leavetime')" min-width="120" v-if="!user.timeType.syncDingding">
                   <template slot-scope="scope">
-                    <div>{{scope.row.timeHours}}小时</div>
+                    <div>{{scope.row.timeHours}} {{ $t('time.hour') }}</div>
                   </template>
                 </el-table-column>
-                <el-table-column prop="status" label="状态" min-width="100">
+                <el-table-column prop="status" :label="$t('state.states')" min-width="100">
                   <template slot-scope="scope">
                     <div v-if="scope.row.status == 0 || scope.row.status == 1 || scope.row.status == 2 || scope.row.status == 3 || scope.row.status == 4">
-                      <div v-if="scope.row.status == 0" >审核通过</div>
-                      <div v-if="scope.row.status == 1" style="color: orange">待审核</div>
-                      <div v-if="scope.row.status == 2" style="color: red">驳回</div>
-                      <div v-if="scope.row.status == 3" style="color: #666666">撤销</div>
+                      <div v-if="scope.row.status == 0" >{{ $t('state.approved') }}</div>
+                      <div v-if="scope.row.status == 1" style="color: orange">{{ $t('state.WaitingAudit') }}</div>
+                      <div v-if="scope.row.status == 2" style="color: red">{{ $t('btn.rejected') }}</div>
+                      <div v-if="scope.row.status == 3" style="color: #666666">{{ $t('btn.undo') }}</div>
                     </div>
                     <div v-else>
-                      <span>暂无请假单</span>
+                      <span>{{ $t('norequestforleaveatpresent') }}</span>
                     </div>
                   </template>
                 </el-table-column>
-                <el-table-column prop="remark" label="备注" min-width="200" header-align="center">
+                <el-table-column prop="remark" :label="$t('bei-zhu')" min-width="200" header-align="center">
                   <template slot-scope="scope">
                     <!-- <div class="apls">{{scope.row.remark}}</div> -->
-                    <el-popover placement="top-start" title="标题" width="200" trigger="hover" :content="scope.row.remark">
+                    <el-popover placement="top-start" :title="$t('biao-ti')" width="200" trigger="hover" :content="scope.row.remark">
                       <div slot="reference" class="apls">{{scope.row.remark}}</div>
                     </el-popover>
                   </template>
                 </el-table-column>
-                <el-table-column label="操作" min-width="180" fixed="right" v-if="isAuditList && !isDingding">
+                <el-table-column :label="$t('operation')" min-width="180" fixed="right" v-if="isAuditList && !isDingding">
                     <template slot-scope="scope">
                       <div>
                         <el-button icon="el-icon-check" circle size="mini" @click.stop.native="approve(scope.row)"></el-button>
@@ -263,7 +263,7 @@
                       </div>
                     </template>
                 </el-table-column>
-                <el-table-column label="操作" min-width="180" fixed="right" v-if="!isAuditList && !isDingding">
+                <el-table-column :label="$t('operation')" min-width="180" fixed="right" v-if="!isAuditList && !isDingding">
                     <template slot-scope="scope">
                       <div v-if="(scope.row.status != 0 && scope.row.ownerId == user.id) || permissions.leaveAll">
                         <el-button icon="el-icon-delete" circle size="mini"  @click.stop.native="deletes(scope.row)" ></el-button>
@@ -305,16 +305,16 @@
         <div class="ctons" style="width: 98%;">
           <div style="display: flex;align-items: center;padding-bottom: 20px;border-bottom: 1px solid #f2f2f2">
             <div style="display: inline-block;width: 350px">
-              <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入人员搜索" clearable="true" size="small">
+              <el-input style="float:left;" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterstaffsearch')" clearable="true" size="small">
                   <el-button slot="append" @click="statistical()" icon="el-icon-search"></el-button>
               </el-input>
             </div>
             <div style="display: inline-block;width: 340px">
-              <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">开始日期</span>
+              <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('time.startDate') }}</span>
               <el-date-picker
                 v-model="statData"
                 type="date"
-                placeholder="选择日期"
+                :placeholder="$t('optiondate')"
                 size="small"
                 @change="statistical()"
                 clearable="false"
@@ -323,11 +323,11 @@
               </el-date-picker>
             </div>
             <div style="display: inline-block;width: 350px">
-              <span style="display: inline-block;margin: 0 15px 0 0;color: rgb(96, 98, 102);">结束日期</span>
+              <span style="display: inline-block;margin: 0 15px 0 0;color: rgb(96, 98, 102);">{{ $t('time.endDate') }}</span>
               <el-date-picker
                 v-model="endData"
                 type="date"
-                placeholder="选择日期"
+                :placeholder="$t('optiondate')"
                 size="small"
                 @change="statistical()"
                 clearable="fasle"
@@ -339,24 +339,24 @@
           <!-- <div style="margin-top: 30px"> -->
           <div>
             <el-table key="apk2is4" v-loading="loading" :data="statisticalList" height="780px" style="width: 99%">
-              <el-table-column prop="ownerName" label="姓名" width="300">
+              <el-table-column prop="ownerName" :label="$t('lable.name')" width="300">
                 <template slot-scope="scope">
                     <div v-if="scope.row.ownerName">
                       {{scope.row.ownerName}}
                     </div>
                     <div v-else>
-                      <span>暂无请假统计</span>
+                      <span>{{ $t('Nstatisticpresent') }}</span>
                     </div>
                   </template>
               </el-table-column>
-              <el-table-column prop="timeDays" label="请假总天数" width="300">
+              <el-table-column prop="timeDays" :label="$t('totaldaysleave')" width="300">
                 <template slot-scope="scope">
-                    {{scope.row.timeDays}}/天
+                    {{scope.row.timeDays}} / {{ $t('time.day') }}
                   </template>
               </el-table-column>
-              <el-table-column prop="timeHours" label="请假总时长">
+              <el-table-column prop="timeHours" :label="$t('totallengthofleave')">
                 <template slot-scope="scope">
-                    {{scope.row.timeHours}}/小时
+                    {{scope.row.timeHours}}/{{ $t('time.hour') }}
                   </template>
               </el-table-column>
             </el-table>
@@ -378,14 +378,14 @@
         <el-col :span="18" >
             <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
             <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                <div style="padding:5px;color:#333;" v-if="depData != null">设置 &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> 直属人员请假审批流程
+                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> {{ $t('approvalprocessforleaveofdirect staff') }}
                     <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" content="仅适用于当前部门的直属人员,子部门人员的审批流程需要单独设置" placement="top-start">
                     <i class="el-icon-question"></i>
                     </el-tooltip>
                 </div>
-                <div style="padding:5px;" v-if="depData == null">请选择部门</div>
+                <div style="padding:5px;" v-if="depData == null">{{ $t('qing-xuan-ze-bu-men') }}</div>
                 <div style="width:100%;margin:0 auto;text-align: center; margin-top:50px;" v-if="depData != null">
-                    <span>员工填报</span>
+                    <span>{{ $t('employeeisallowed') }}</span>
                     <icon class="iconfont firerock-iconright"></icon>
                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
                     <icon class="iconfont firerock-iconright"></icon>
@@ -402,11 +402,11 @@
 
                     <!--结束点 -->
                     <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
-                    审批完成
-                </div>
+                    {{ $t('approvaltocomplete') }} 
+                  </div>
 
                 <div style="width:100%;margin:0 auto;margin-bottom:30px;position: absolute;bottom: 0px;text-align: center; ">
-                    <el-button type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                    <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
                 </div>
             </div>
             </el-scrollbar>
@@ -415,16 +415,16 @@
         </div>
 
         <!--部门选择列表 -->
-        <el-dialog  title="请选择审批人" v-if="dialogVisible" :visible.sync="dialogVisible"  width="460px">
+        <el-dialog  :title="$t('pleaseselectapprover')" v-if="dialogVisible" :visible.sync="dialogVisible"  width="460px">
               <el-form label-width="140px">
-              <el-form-item label="选择部门/指定人员" >
-                  <el-cascader filterable ref="deptCascader"  v-model="curDeptId" placeholder="请选择部门/指定人员" style="width: 100%" @change="chooseDept"
+              <el-form-item :label="$t('selectdepartmentsdesignatepersonnel')" >
+                  <el-cascader filterable ref="deptCascader"  v-model="curDeptId" :placeholder="$t('defaultText.pleaseChoose')" style="width: 100%" @change="chooseDept"
                     :options="soption" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
               </el-form-item>
               </el-form>
             <div slot="footer" class="dialog-footer">
-              <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">删除</el-button>
-                <el-button type="primary" @click="addNode" >确定</el-button>
+              <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">{{ $t('btn.delete') }}</el-button>
+                <el-button type="primary" @click="addNode" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
 
@@ -434,20 +434,20 @@
       <div class="ctons" style="width: 98%;">
         <div style="display: flex;align-items: center;padding-bottom: 20px;border-bottom: 1px solid #f2f2f2">
             <div style="display: inline-block;width: 18%;margin-left:1%">
-              <el-button size="small" @click="changeAltime(0)">批量设置</el-button>
+              <el-button size="small" @click="changeAltime(0)">{{ $t('volumeset') }}</el-button>
             </div>
             <div style="display: inline-block;width: 26%">
-              <el-input style="float:left;" v-model="keywordAl" class="input-with-select" placeholder="请输入人员姓名搜索" clearable="true" size="small" @clear="clearsearchAl()">
+              <el-input style="float:left;" v-model="keywordAl" class="input-with-select" :placeholder="$t('pleaseenterhepersonnamesearch')" clearable="true" size="small" @clear="clearsearchAl()">
                   <el-button slot="append" @click="searchAl()" icon="el-icon-search"></el-button>
               </el-input>
             </div>
             <div style="display: inline-block;width: 32%;margin-left:12%">
-              <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">按部门筛选</span>
+              <span style="display: inline-block;margin: 0 15px 0 20px;color: rgb(96, 98, 102);">{{ $t('screeningDepartment') }}</span>
               <el-cascader
                 ref="selectAl"
                 filterable
                 v-model="NcurDeptId"
-                placeholder="请选择部门"
+                :placeholder="$t('defaultText.pleaseChoose')"
                 size="small"
                 style="width: 60%"
                 @change="selAl()"
@@ -462,45 +462,45 @@
         <div>
           <el-table key="apk2is6" v-loading="loading" :data="iAlDataS" height="480" style="width: 99%;" @selection-change="selPchg">
             <el-table-column type="selection"></el-table-column>
-              <el-table-column prop="userName" label="姓名" width="200">
+              <el-table-column prop="userName" :label="$t('lable.name')" width="200">
                 <template slot-scope="scope">
                   <div v-if="scope.row.userName">
                     {{scope.row.userName}}
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column prop="department" label="所在部门" width="200">
+              <el-table-column prop="department" :label="$t('departmentsuod')" width="200">
                 <template slot-scope="scope">
                   {{scope.row.department}}
                 </template>
               </el-table-column>
-              <el-table-column prop="yearDays" label="每年年假天数" width="200">
+              <el-table-column prop="yearDays" :label="$t('annualleaveperyear')" width="200">
                 <template slot-scope="scope">
-                  {{scope.row.yearDays != null ? scope.row.yearDays + "天" : "-"}}
+                  {{scope.row.yearDays != null ? scope.row.yearDays + $t('time.day') : "-"}}
                 </template>
               </el-table-column>
-              <el-table-column prop="leftdays" label="剩余年假天数" width="200">
+              <el-table-column prop="leftdays" :label="$t('remainingdaysofannualleave')" width="200">
                 <template slot-scope="scope">
-                  {{scope.row.yearDays != null ? scope.row.yearDays - scope.row.alreadyDays + "天" : "-"}}
+                  {{scope.row.yearDays != null ? scope.row.yearDays - scope.row.alreadyDays + $t('time.day') : "-"}}
                 </template>
               </el-table-column>
-              <el-table-column prop="id" label="修改年假天数">
+              <el-table-column prop="id" :label="$t('numberofannualleavedays')">
                 <template slot-scope="scope">
-                  <el-button size="small" @click="changeAltime(scope.row)">设置</el-button>
+                  <el-button size="small" @click="changeAltime(scope.row)">{{ $t('setup') }}</el-button>
                 </template>
               </el-table-column>
           </el-table>
         </div>
       </div>
-      <el-dialog title="请设置年假时限" v-if="Alshow" :visible.sync="Alshow" @close="delAltime()" width="500px">
+      <el-dialog :title="$t('pleasesetthetimelimitforannualleave')" v-if="Alshow" :visible.sync="Alshow" @close="delAltime()" width="500px">
         <el-form label-width="8rem">
-          <el-form-item label="设置每年年假天数" >
-            <el-input v-model="Alchange.yearDays" type="number" min="0" placeholder="请输入天数"></el-input>
+          <el-form-item :label="$t('setthenumberofannualleavedaysperyear')" >
+            <el-input v-model="Alchange.yearDays" type="number" min="0" :placeholder="$t('pleaseenterdays')"></el-input>
           </el-form-item>
         </el-form>
         <div slot="footer" class="dialog-footer">
-          <el-button type="default" @click="delAltime()">取消</el-button>
-          <el-button type="primary" @click="chgAltime()">确定</el-button>
+          <el-button type="default" @click="delAltime()">{{ $t('btn.cancel') }}</el-button>
+          <el-button type="primary" @click="chgAltime()">{{ $t('btn.determine') }}</el-button>
         </div>
       </el-dialog>
     </div>
@@ -510,8 +510,8 @@
         <div class="ctons" style="width: 98%;">
           <div class="flex">
             <div>
-              <span>请假类型</span>
-              <el-select v-model="leaveTypeItem" placeholder="请选择请假类型" @change="leaveTypeChange()" style="width: 180px" size="small"  filterable="true">
+              <span>{{ $t('leavetype') }}</span>
+              <el-select v-model="leaveTypeItem" :placeholder="$t('pleaseselectthetypeofleave')" @change="leaveTypeChange()" style="width: 180px" size="small"  filterable="true">
                   <span v-for="item in leaveTypeList" :key="item.leaveCode">
                   <el-option :label="item.leaveName" :value="item.leaveCode"></el-option>
                   </span> 
@@ -519,51 +519,51 @@
             </div>
             <template v-if="permissions.leaveAll">
               <div>
-                <span>部门筛选</span>
+                <span>{{ $t('departmentofscreening') }}</span>
                 <el-cascader
                 size="small"
                 @change="departmentOptionsChg"
                 v-model="departmentSel"
                 :options="departmentOptions"
-                placeholder="请选择部门"
+                :placeholder="$t('qing-xuan-ze-bu-men')"
                 :show-all-levels="false"
                 :props="{ checkStrictly: true }"
                 clearable></el-cascader>
               </div>
               <div>
-                <span>人员筛选</span>
-                <el-select v-model="userSelId" placeholder="请选择请假人" clearable @change="userChg()" style="width: 180px" size="small" v-show="permissions.leaveAll" filterable="true">
+                <span>{{ $t('personnelselection') }}</span>
+                <el-select v-model="userSelId" :placeholder="$t('pleaseselectthepersonaskingforleave')" clearable @change="userChg()" style="width: 180px" size="small" v-show="permissions.leaveAll" filterable="true">
                     <span v-for="(item, index) in users" :key="index">
                     <el-option :label="item.name" :value="item.id"></el-option>
                     </span> 
                 </el-select>
               </div>
               <div style="margin:0 10px 0 40px">
-                <el-button size="small" type="primary" @click="listSynchronize" :loading="synchronizeLoading">从钉钉同步</el-button>
+                <el-button size="small" type="primary" @click="listSynchronize" :loading="synchronizeLoading">{{ $t('synchronizefromStaple') }}</el-button>
               </div>
             </template>
             
           </div>
             <el-table key="apk2is8" v-loading="loading" :data="vacationList" style="width: 100%" height="94%">
-                <el-table-column prop="name" label="员工姓名" min-width="120" fixed="left"></el-table-column>
-                <el-table-column label="有效期" min-width="250" align="center">
+                <el-table-column prop="name" :label="$t('screening.employeename')" min-width="120" fixed="left"></el-table-column>
+                <el-table-column :label="$t('periodofvalidity')" min-width="250" align="center">
                   <template slot-scope="scope">
                     <span>{{scope.row.startTime == null && scope.row.endTime == null ? '~ ~' : (scope.row.startTime + '\u3000~\u3000' + scope.row.endTime)}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column label="总额度" min-width="100" align="center">
+                <el-table-column :label="$t('combination')" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.quotaInDays == null && scope.row.quotaInHours == null ? '-' : (scope.row.quotaInDays == null ? scope.row.quotaInHours + '小时' : scope.row.quotaInDays + '天')}}</span>
+                    <span>{{scope.row.quotaInDays == null && scope.row.quotaInHours == null ? '-' : (scope.row.quotaInDays == null ? scope.row.quotaInHours + $t('time.hour') : scope.row.quotaInDays + $t('time.day'))}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column label="已使用" min-width="100" align="center">
+                <el-table-column :label="$t('beenused')" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.usedInDays == null && scope.row.usedInHours == null ? '-' : (scope.row.usedInDays == null ? scope.row.usedInHours + '小时' : scope.row.usedInDays + '天')}}</span>
+                    <span>{{scope.row.usedInDays == null && scope.row.usedInHours == null ? '-' : (scope.row.usedInDays == null ? scope.row.usedInHours + $t('time.hour') : scope.row.usedInDays + $t('time.day'))}}</span>
                   </template>
                 </el-table-column>
-                <el-table-column label="剩余额度" min-width="100" align="center">
+                <el-table-column :label="$t('remainingamount')" min-width="100" align="center">
                   <template slot-scope="scope">
-                    <span>{{scope.row.leftInDays == null && scope.row.leftInHours == null ? '-' : (scope.row.leftInDays == null ? scope.row.leftInHours + '小时' : scope.row.leftInDays + '天')}}</span>
+                    <span>{{scope.row.leftInDays == null && scope.row.leftInHours == null ? '-' : (scope.row.leftInDays == null ? scope.row.leftInHours + $t('time.hour') : scope.row.leftInDays + $t('time.day'))}}</span>
                   </template>
                 </el-table-column>
             </el-table>
@@ -583,60 +583,60 @@
 <!-- --------- -->
   </div>
   <!-- 请假单详情 -->
-  <el-dialog title="请假单详情" :visible.sync="dialog" width="1000px" @close="bangd()">
+  <el-dialog :title="$t('leaveForm')" :visible.sync="dialog" width="1000px" @close="bangd()">
     <!-- 表单 -->
     <el-form ref="addForm" :model="addForm" label-width="80px" :rules="addFormRules">
         <!-- 请假人 -->
-        <el-form-item label="请假人" prop="ownerId"  style="width: 300px;display: inline-block;">
+        <el-form-item :label="$t('leavepeople')" prop="ownerId"  style="width: 300px;display: inline-block;">
             <!--普通员工只能自己填报自己的 -->
-            <el-select v-model="addForm.ownerId" @change="selts()" placeholder="请选择请假人" style="width: 240px" :disabled="true" filterable="true">
+            <el-select v-model="addForm.ownerId" @change="selts()" :placeholder="$t('pleaseselectthepersonaskingforleave')" style="width: 240px" :disabled="true" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                 <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
             </el-select>
         </el-form-item>
         <!-- 电话 -->
-        <el-form-item label="电话" prop="tel" style="width: 300px;display: inline-block;">
-            <el-input ref="ipts" v-model="addForm.tel" placeholder="请输入手机号" style="width: 250px;"></el-input>
+        <el-form-item :label="$t('phone')" prop="tel" style="width: 300px;display: inline-block;">
+            <el-input ref="ipts" v-model="addForm.tel" :placeholder="$t('defaultText.PleaseEnterYourPhone')" style="width: 250px;"></el-input>
         </el-form-item>
         <!-- 单选 -->
-        <el-form-item style="display: block" label="时长单位">
+        <el-form-item style="display: block" :label="$t('lengthunit')">
             <el-radio-group v-model="addForm.timeType" @change="chanRadio()">
-                <el-radio label="0">按天请假</el-radio>
-                <el-radio label="1">按小时请假</el-radio>
+                <el-radio label="0">{{ $t('accordingdays') }}</el-radio>
+                <el-radio label="1">{{ $t('leavehour') }}</el-radio>
             </el-radio-group>
         </el-form-item>
         <!-- 时间选择 -->
-        <el-form-item :label="flg ? '选择日期' : '选择时间'" style="width: 74%;margin-right:500px">
+        <el-form-item :label="flg ? $t('optiondate') : $t('other.timeSelection')" style="width: 74%;margin-right:500px">
             <el-col :span="9">
-                <el-date-picker v-if="flg" type="date" placeholder="开始日期" value-format="yyyy-MM-dd"  v-model="addForm.startDate" style="width: 240px;" @blur="datas()"></el-date-picker>
-                <el-date-picker v-else type="date" placeholder="开始日期" value-format="yyyy-MM-dd" v-model="addForm.startDate" style="width: 240px;" @change="datasss()"></el-date-picker>
+                <el-date-picker v-if="flg" type="date" :placeholder="$t('time.startDate')" value-format="yyyy-MM-dd"  v-model="addForm.startDate" style="width: 240px;" @blur="datas()"></el-date-picker>
+                <el-date-picker v-else type="date" :placeholder="$t('time.startDate')" value-format="yyyy-MM-dd" v-model="addForm.startDate" style="width: 240px;" @change="datasss()"></el-date-picker>
             </el-col>
             <el-col class="line" v-if="flg" :span="2">-</el-col>
             <el-col :span="9">
-                <el-date-picker v-if="flg" type="date" placeholder="结束日期" value-format="yyyy-MM-dd" :picker-options="pickerOptionsEnd" v-model="addForm.endDate" style="width: 250px;" @blur="datas()"></el-date-picker>
+                <el-date-picker v-if="flg" type="date" :placeholder="$t('time.endDate')" value-format="yyyy-MM-dd" :picker-options="pickerOptionsEnd" v-model="addForm.endDate" style="width: 250px;" @blur="datas()"></el-date-picker>
                 <!-- <el-select v-else v-model="addForm.timeHours" placeholder="请假时长" @change="chanSele()">
                     <el-option v-for="(item, index) in options" :key="index" :label="item" :value="item"></el-option>
                 </el-select> -->
             </el-col>
         </el-form-item>
         <!-- 请假天数 -->
-        <el-form-item :label="flg ? '请假天数' : '请假时长'" prop="timeDays" style="margin-right: 500px">
+        <el-form-item :label="flg ? $t('leavedays') : $t('leavetime')" prop="timeDays" style="margin-right: 500px">
            <!-- {{flg ? addForm.timeDays : addForm.timeHours}}{{flg ? '天' : '小时'}} -->
            <!-- <div v-if="flg">{{addForm.timeDays}} 天</div> -->
-           <div v-if="flg"> <el-input v-model="addForm.timeDays" @blur="inputs()" @input="addForm.timeDays=addForm.timeDays.replace(/[^\d.]/g,'')" style="width: 100px; margin-right: 20px;"></el-input> </div>
+           <div v-if="flg"> <el-input v-model="addForm.timeDays" @blur="inputs()" @input="addForm.timeDays=addForm.timeDays.replace(/[^\d.]/g,'')" style="width: 100px; margin-right: 20px;"></el-input> {{ $t('time.day') }}</div>
            <div v-else>
-              <el-input v-model="addForm.timeHours" @blur="inputss()" @input="addForm.timeHours=addForm.timeHours.replace(/[^\d.]/g,'')" style="width: 100px; margin-right: 20px;"></el-input> 小时
+              <el-input v-model="addForm.timeHours" @blur="inputss()" @input="addForm.timeHours=addForm.timeHours.replace(/[^\d.]/g,'')" style="width: 100px; margin-right: 20px;"></el-input> {{ $t('time.hour') }}
            </div>
         </el-form-item>
         <!-- 备注 -->
-        <el-form-item label="备注" style="width: 100%">
+        <el-form-item :label="$t('bei-zhu')" style="width: 100%">
             <el-input type="textarea" v-model="addForm.remark" :rows="5" style="width: 62%" maxlength="100" show-word-limit></el-input>
         </el-form-item>
     </el-form>
     <span slot="footer" class="dialog-footer">
-      <el-button @click="dialog = false">取 消</el-button>
-      <el-button type="primary" @click="determine()">确 定</el-button>
+      <el-button @click="dialog = false">{{ $t('btn.cancel') }}</el-button>
+      <el-button type="primary" @click="determine()">{{ $t('btn.determine') }}</el-button>
     </span>
   </el-dialog>
  
@@ -653,22 +653,22 @@ export default {
     //验证手机号
     var checkTel = (rule, value, callback) =>{
         if (!value) {
-            return callback(new Error('手机号不能为空'));
+            return callback(new Error(this.$t('phonenumbercannotbeempty')));
         } else {
             const reg = /^1[3|4|5|7|8|9][0-9]\d{8}$/
             if (reg.test(value)) {
                 callback();
             } else {
-                return callback(new Error('请输入正确的手机号'));
+                return callback(new Error(this.$t('pleaseenterthecorrectcellphonenumber')));
             }
         }
     };
     var checks = (rule, value, callback) => {
       if (!value) {
-            return callback(new Error('请假天数不能为空'));
+            return callback(new Error(this.$t('leavedayscannotbeempty')));
         } else {
             if (value > this.timeChoose) {
-              return callback(new Error('超过当前选择日期的天数'));
+              return callback(new Error(this.$t('daysbeyondthecurrentlyselecteddat')));
             } else {
               callback();
             }
@@ -676,14 +676,14 @@ export default {
     };
     return {
       addFormRules: {
-        ownerId: [{ required: true, message: "请选择请假人", trigger: "blur" }],
+        ownerId: [{ required: true, message: this.$t('pleaseselectthepersonaskingforleave'), trigger: "blur" }],
         tel: [{required: true, validator: checkTel, trigger: 'blur'}],
         timeDays: [{required: true, validator: checks, trigger: 'blur'}],
-        leaveType: [{ required: true, message: "请选择请假类型", trigger: "blur" }],
-        projectAuditorJson: [{ required: true, message: "请选择审批人", trigger: "blur" }]
+        leaveType: [{ required: true, message: this.$t('pleaseselectthetypeofleave'), trigger: "blur" }],
+        projectAuditorJson: [{ required: true, message: this.$t('pleaseselectapprover'), trigger: "blur" }]
       },
       user: JSON.parse(sessionStorage.getItem("user")),
-      shuz: ['事假填报', '病假填报', '年假填报', '产假填报'],
+      shuz: [this.$t('personalleaveisallowed'), this.$t('leaveisallowed'), this.$t('annualleaveisallowed'), this.$t('maternityleaveisallowed')],
       ins: 0,
       addForm: {
         timeType: '0',
@@ -732,18 +732,18 @@ export default {
       loading: false,
       timeChoose: 1,
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
-      typess: [{name: '事假',id: 0},{name: '病假',id: 1},{name: '年假',id: 2},{name: '产假',id: 3},{name: '婚假',id: 4},{name: '丧假',id: 5},{name: '调休假',id: 6},{name: '陪产假',id: 7},{name: '其他', id: 8}],
+      typess: [{name: this.$t('leave.personalLeave'),id: 0},{name: this.$t('leave.sickLeave'),id: 1},{name: this.$t('leave.annualLeave'),id: 2},{name: this.$t('leave.maternityLeave'),id: 3},{name: this.$t('leave.marriageLeave'),id: 4},{name: this.$t('leave.bereavementLeave'),id: 5},{name: this.$t('leave.leave'),id: 6},{name: this.$t('leave.paternityLeave'),id: 7},{name: this.$t('leave.other'), id: 8}],
       statuss: [{
-        name: '审核通过',
+        name: this.$t('state.approved'),
         id: 0
       },{
-        name: '待审核',
+        name: this.$t('state.WaitingAudit'),
         id: 1
       },{
-        name: '驳回',
+        name: this.$t('btn.rejected'),
         id: 2
       },{
-        name: '已撤销',
+        name: this.$t('state.undone'),
         id: 3
       }],
       createDatelis: '',
@@ -755,15 +755,15 @@ export default {
       adform: {},
       affId: '',
       qjType: [
-        {name: '事假', id: 0},
-        {name: '病假', id: 1},
-        {name: '年假', id: 2},
-        {name: '产假', id: 3},
-        {name: '婚假', id: 4},
-        {name: '丧假', id: 5},
-        {name: '调休假', id: 6},
-        {name: '陪产假', id: 7},
-        {name: '其他', id: 8}
+        {name: this.$t('leave.personalLeave'), id: 0},
+        {name: this.$t('leave.sickLeave'), id: 1},
+        {name: this.$t('leave.annualLeave'), id: 2},
+        {name: this.$t('leave.maternityLeave'), id: 3},
+        {name: this.$t('leave.marriageLeave'), id: 4},
+        {name: this.$t('leave.bereavementLeave'), id: 5},
+        {name: this.$t('leave.leave'), id: 6},
+        {name: this.$t('leave.paternityLeave'), id: 7},
+        {name: this.$t('leave.other'), id: 8}
       ],
       // 
       apk2: false,
@@ -847,7 +847,7 @@ export default {
         if(res.code == 'ok'){
           this.synchronizeLoading = false
           this.$message({
-            message: '同步成功',
+            message: this.$t('synchronoussuccess'),
             type: 'success'
           })
           this.getVacationList()
@@ -971,7 +971,7 @@ export default {
           this.approverList = res.data
           if(this.approverList.length == 0){
             this.$message({
-              message: '当前无审批人,请联系管理员配置审批人',
+              message: this.$t('configureanapprover'),
               type: 'warning'
             })
           }
@@ -992,7 +992,7 @@ export default {
 
     changeAltime(e){
       if(e == 0 && this.AlchangeP.length == 0){
-          this.$message('请选择要批量设置的项')
+          this.$message(this.$t('selecttheitemsyouwanttobatchset'))
           return
       }else if(e != 0){
         this.Alchange = JSON.parse(JSON.stringify(e))
@@ -1134,8 +1134,8 @@ export default {
                         var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
                         this.sdata = list;
                         this.soption = [
-                          {value: 1 , label : "部门" , children : this.changeArr(list1)},
-                          {value: 2 , label : "指定人员",children : this.susers}
+                          {value: 1 , label : this.$t('lable.department') , children : this.changeArr(list1)},
+                          {value: 2 , label : this.$t('designatedpersonnel'),children : this.susers}
                         ]
                         this.Nsdata = list1
                     } else {
@@ -1235,7 +1235,7 @@ export default {
                                 this.listLoading = false;
                                 if (res.code == "ok") {
                                     this.$message({
-                                        message: '保存成功',
+                                        message: this.$t('savesuccess'),
                                         type: "success"
                                     });
                                 } else {
@@ -1486,7 +1486,7 @@ export default {
             res => {
                 if (res.code == "ok") {
                     this.$message({
-                      message: '填报成功',
+                      message: this.$t('message.fillinsuccessfully'),
                       type: "success"
                     });
                     this.addForm.timeType = '0'
@@ -1723,7 +1723,7 @@ export default {
       // console.log(this.addForm)
     },
     deletes(e) {
-      this.$confirm("确认要删除吗?", "提示", {
+      this.$confirm(this.$t('deleteit'), this.$t('other.prompts'), {
           //type: 'warning'
       }).then(() => {
           this.http.post('/leave-sheet/delete', {id:e.id},
@@ -1731,7 +1731,7 @@ export default {
               if (res.code == "ok") {
                   this.bills();
                   this.$message({
-                      message: '删除成功',
+                      message: this.$t('message.successfullyDeleted'),
                       type: "success"
                   });
               } else {

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

@@ -52,7 +52,7 @@
                             <el-table-column label="下拨时间" prop="indate" align="center" min-width="200"></el-table-column>
                             <el-table-column label="操作人员" prop="userName" align="center" min-width="120"></el-table-column>
                             <el-table-column label="备注" prop="remark" align="left" header-align="left" show-overflow-tooltip min-width="200"></el-table-column>
-                            <el-table-column label="" align="center" fixed="right">
+                            <el-table-column label="" align="center" fixed="right" v-if="permissions.projectAllocate">
                                 <template slot-scope="scope">
                                     <el-button size="small" @click="revert(scope.row.id)" v-if="scope.$index == 0">撤销</el-button>
                                 </template>

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

@@ -2,10 +2,10 @@
     <section>
         <el-row style="padding-bottom: 0px;text-align:center;margin-top:20px;z-index: 999;">
         <el-col :span="6" >
-            <div ><span style="color:#999;">图表Y轴: </span>
+            <div ><span style="color:#999;">{{ $t('chartY') }} </span>
             <el-radio-group v-model="yAxisValue" @change="onYAxisChange" size="small">
-            <el-radio-button label="0" v-if="permissions.countCost">显示成本</el-radio-button>
-            <el-radio-button label="1" v-if="permissions.countHours">显示工时</el-radio-button>
+            <el-radio-button label="0" v-if="permissions.countCost">{{ $t('accordingtothecost') }}</el-radio-button>
+            <el-radio-button label="1" v-if="permissions.countHours">{{ $t('accordingtoworkinghours') }}</el-radio-button>
             </el-radio-group></div>
         </el-col>
         <el-col :span="14" style="display: flex;flex-wrap: wrap;">
@@ -14,10 +14,10 @@
             format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
             @change="getEchart" 
             :clearable="true" 
-            range-separator="至"
+            :range-separator="$t('other.to')"
             type="daterange" 
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
+            :start-placeholder="$t('time.startDate')"
+            :end-placeholder="$t('time.endDate')"
             ></el-date-picker>
 
             <el-date-picker v-show="user.timeType.fixMonthcost==1"
@@ -29,11 +29,11 @@
             ></el-date-picker>
 
             <el-radio-group v-model="radio" @change="getEchart" style="margin-left:10px;"  size="small">
-                <el-radio-button label="项目"></el-radio-button>
-                <el-radio-button label="主项目" v-if="user.timeType.mainProjectState"></el-radio-button>
-                <el-radio-button label="项目分类"></el-radio-button>
-                <el-radio-button label="部门"></el-radio-button>
-                <el-radio-button label="人员" v-if="permissions.countPersonnel"></el-radio-button>
+                <el-radio-button :label="$t('other.project')"></el-radio-button>
+                <el-radio-button :label="$t('zhu-xiang-mu')" v-if="user.timeType.mainProjectState"></el-radio-button>
+                <el-radio-button :label="$t('projectclassification')"></el-radio-button>
+                <el-radio-button :label="$t('lable.department')"></el-radio-button>
+                <el-radio-button :label="$t('ren-yuan')" v-if="permissions.countPersonnel"></el-radio-button>
                 <el-radio-button :label="namess" v-if="jichu.customDegreeActive == 1"></el-radio-button>
                 <el-radio-button v-for="item in theCustomList" :key="item.id" :label="item.name"></el-radio-button>
             </el-radio-group>
@@ -42,33 +42,33 @@
                 <el-option v-for="item in customList" :key="item.id" :label="item.name" :value="item.name"></el-option>
             </el-select> -->
 
-            <el-select v-model="personnelValue" filterable clearable placeholder="请选择人员"  size="small" style="margin-top: 10px;width: 350px" v-if="radio == '人员'" @change="personnel()">
+            <el-select v-model="personnelValue" filterable clearable :placeholder="$t('pleaseselectpersonnel')"  size="small" style="margin-top: 10px;width: 350px" v-if="radio == $t('ren-yuan')" @change="personnel()">
                 <el-option v-for="item in hasReportUserList" :key="item.id" :label="item.name" :value="item.name"></el-option>
             </el-select>
         </el-col>
         <el-col :span="4">
-            <el-button @click="exportProjectData" v-if="theCustomListFlg"  size="small">报表导出</el-button>
-            <el-button @click="showExportDialog" v-else  size="small">报表导出</el-button>
+            <el-button @click="exportProjectData" v-if="theCustomListFlg"  size="small">{{ $t('reporderived') }}</el-button>
+            <el-button @click="showExportDialog" v-else  size="small">{{ $t('reporderived') }}</el-button>
         </el-col>
         </el-row>
         <!-- <div id="clearfix" :style="'width:'+widthHtval+'px;position: relative; height:'+containerHeight+'px;'">
              <div id="container" :style="'height:'+containerHeight+'px;width:100%'"></div>
         </div> -->
-        <div id="clearfix" :class="radio == '人员' ? 'ryuans' : ''" :style="'overflow-x: auto;width:100%;padding-bottom: 100px; position: relative; height:'+containerHeight+'px;'">
+        <div id="clearfix" :class="radio == $t('ren-yuan') ? 'ryuans' : ''" :style="'overflow-x: auto;width:100%;padding-bottom: 100px; position: relative; height:'+containerHeight+'px;'">
              <div id="container" :style="'height:'+containerHeight+'px;width:100%'"></div>
         </div>
         <!-- <div>
              <div id="container" :style="'height:'+containerHeight+'px;width:100%'"></div>
         </div> -->
-        <div style="position:fixed;top:170px;left:600px;" v-show="radio=='部门' && parentDeptId != null">
-            <el-button @click="backToParentDept">返回上级</el-button>
+        <div style="position:fixed;top:170px;left:600px;" v-show="radio==$t('lable.department') && parentDeptId != null">
+            <el-button @click="backToParentDept">{{ $t('returnsuperior') }}</el-button>
         </div>
 
         <!--导出报表条件选择 -->
-        <el-dialog title="工时报表导出" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('timeReportExport')" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="form3" :model="exportParam" >
-                <el-form-item prop="projectId" label="选择项目" v-if="radio != '人员' && radio != '项目分类'">
-                    <el-select v-model="exportParam.projectId" placeholder="全部项目"  clearable style="width:350px;" filterable="true" popper-class="projectSelectPopperClass">
+                <el-form-item prop="projectId" :label="$t('defaultText.selectProject')" v-if="radio != $t('ren-yuan') && radio != $t('projectclassification')">
+                    <el-select v-model="exportParam.projectId" :placeholder="$t('other.allProject')"  clearable style="width:350px;" filterable="true" 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>
@@ -76,32 +76,32 @@
                     </el-select>
                 </el-form-item>
 
-                <el-form-item label="部门选择" v-if="radio == '项目'">
-                    <el-cascader v-model="exportParam.deptId" :options="departmentList" placeholder="请选择部门"
+                <el-form-item :label="$t('departmentchoice')" v-if="radio == $t('other.project')">
+                    <el-cascader v-model="exportParam.deptId" :options="departmentList" :placeholder="$t('defaultText.pleaseChoose')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" clearable filterable style="width:350px;"
                     ></el-cascader>
                 </el-form-item>
 
-                <el-form-item prop="projectCategoryId" label="项目分类" v-if="radio == '项目分类'">
-                    <el-select v-model="exportParam.projectCategoryId" placeholder="全部项目分类"  clearable style="width:350px;" filterable="true">
+                <el-form-item prop="projectCategoryId" :label="$t('projectclassification')" v-if="radio == $t('projectclassification')">
+                    <el-select v-model="exportParam.projectCategoryId" :placeholder="$t('classificationitems')"  clearable style="width:350px;" filterable="true">
                         <el-option v-for="item in categoryList"  :key="item.id" :label="item.name" :value="item.id">
                         </el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item prop="userIds" label="选择人员" v-if="radio == '人员'">
-                    <el-select v-model="exportParam.userIds" placeholder="全部人员" multiple="true"  clearable style="width:350px;" filterable="true">
+                <el-form-item prop="userIds" :label="$t('screening.selectPeople')" v-if="radio == $t('ren-yuan')">
+                    <el-select v-model="exportParam.userIds" :placeholder="$t('lable.allStaff')" multiple="true"  clearable style="width:350px;" filterable="true">
                         <el-option v-for="item in hasReportUserList"  :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item prop="projectId" :label="user.timeType.fixMonthcost==0?'日期范围':'选择月份'">
+                <el-form-item prop="projectId" :label="user.timeType.fixMonthcost==0?$t('time.dateRange'):$t('Selectmonth')">
                     <el-date-picker v-show="user.timeType.fixMonthcost==0"
                         v-model="exportParam.dateRange" :editable="false" 
                         format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                         :clearable="false" 
-                        range-separator="至"
+                        :range-separator="$t('other.to')"
                         type="daterange" 
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
+                        :start-placeholder="$t('time.startDate')"
+                        :end-placeholder="$t('time.endDate')"
                     ></el-date-picker>
 
                     
@@ -114,33 +114,33 @@
                     ></el-date-picker>
                 </el-form-item>
                 
-                <el-form-item label="选择人员" v-if="radio == '项目' || radio == '部门' || radio == '项目分类'">
-                    <el-select v-model="exportParam.userId"  placeholder="全部人员" style="width: 350px" filterable="true" clearable="true">
+                <el-form-item :label="$t('screening.selectPeople')" v-if="radio == $t('other.project') || radio == $t('lable.department') || radio == $t('projectclassification')">
+                    <el-select v-model="exportParam.userId"  :placeholder="$t('lable.allStaff')" style="width: 350px" filterable="true" clearable="true">
                         <span v-for="(item, index) in users" :key="index">
                         <el-option :label="item.name" :value="item.id"></el-option>
                         </span> 
                     </el-select>
                 </el-form-item>
-                <el-form-item prop="type" label="选择样式" v-if="radio == '项目' || radio == '部门' || radio == '项目分类'">
-                    <el-select v-model="exportParam.type" placeholder="选择样式" style="width:350px;" >
-                        <el-option :label="radio == '项目分类' ? '项目分类在行上' : '项目在行上'" value="0"></el-option>
-                        <el-option :label="radio == '项目分类' ? '项目分类在列上' : '项目在列上'" value="1"></el-option>
+                <el-form-item prop="type" :label="$t('choosethestyle')" v-if="radio == $t('other.project') || radio == $t('lable.department') || radio == $t('projectclassification')">
+                    <el-select v-model="exportParam.type" :placeholder="$t('choosethestyle')" style="width:350px;" >
+                        <el-option :label="radio == $t('projectclassification') ? $t('classifiedontheline') : $t('Itemontheline')" value="0"></el-option>
+                        <el-option :label="radio == $t('projectclassification') ? $t('classifiedcolumns') : $t('itemisonthecolumn')" value="1"></el-option>
                     </el-select>
                     <div class="prompt">
                         <el-popover placement="top" width="1200" trigger="hover">
-                            <img src="../../assets/image/hanglie.png" alt="" width="100%" v-if="this.radio != '项目分类'">
+                            <img src="../../assets/image/hanglie.png" alt="" width="100%" v-if="this.radio != $t('projectclassification')">
                             <img src="../../assets/image/hanglie_corp.png" alt="" width="100%" v-else>
                             <i class="el-icon-question" slot="reference" />
                         </el-popover>
                     </div>
                 </el-form-item>
-                <el-form-item v-if="(radio == '项目' || radio == '部门' || radio == '项目分类') && exportParam.type == '0'">
-                    <el-checkbox v-model="exportParam.projectSum" >含单个项目数据汇总</el-checkbox>
+                <el-form-item v-if="($t('other.project') || radio == $t('lable.department') || radio == $t('projectclassification')) && exportParam.type == '0'">
+                    <el-checkbox v-model="exportParam.projectSum" >{{ $t('individualprojectdata') }}</el-checkbox>
                 </el-form-item>
 
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="exportProjectData" style="width:100%;" >导出</el-button>
+                <el-button type="primary" @click="exportProjectData" style="width:100%;" >{{ $t('export.export') }}</el-button>
             </div>
         </el-dialog>
     </section>
@@ -164,7 +164,7 @@
                 dateRange:[],
                 user: JSON.parse(sessionStorage.getItem("user")),
                 permissions: JSON.parse(sessionStorage.getItem("permissions")),
-                radio: sessionStorage.radio!=null?sessionStorage.radio:'项目',
+                radio: sessionStorage.radio!=null?sessionStorage.radio:this.$t('other.project'),
                 containerHeight: 0,    
                 // myChart: null,
                 params: null,
@@ -247,10 +247,10 @@
                 this.exportDialog = true;
                 this.exportParam.dateRange = this.dateRange;
                 console.log(this.hasReportUserList)
-                if (this.radio == '人员') {
+                if (this.radio == this.$t('ren-yuan')) {
                     // this.exportParam.userIds = [];
                 }
-                if (this.radio == '项目') {
+                if (this.radio == this.$t('other.project')) {
                     this.exportParam.deptId = []
                 }
             },
@@ -281,10 +281,10 @@
                     param = {startDate:this.exportParam.dateRange[0], endDate: this.exportParam.dateRange[1],stateKey: 1};
                  }
                  var url = "/project/exportTimeCost";
-                 var fileName = '项目工时成本统计.xls';
-                 if (this.radio == '人员' ) {
+                 var fileName = this.$t('projectmanhourcoststatistics')+ '.xls';
+                 if (this.radio == this.$t('ren-yuan') ) {
                      console.log(this.exportParam.userIds);
-                     fileName = '人员工时成本统计.xls';
+                     fileName = this.$t('labortimecoststatistics')+ '.xls';
                      url = '/department/exportUserStatistic';
                      if (this.exportParam.userIds != null && this.exportParam.userIds.length > 0) {
                          var ids = '';
@@ -294,23 +294,23 @@
                         param.userIds = ids;
                      }
                  } 
-                if(this.radio == '项目分类'){
-                    fileName = '项目分类工时成本统计.xls';
+                if(this.radio == this.$t('projectclassification')){
+                    fileName = this.$t('projectclassificationlaborosttatistics')+ '.xls';
                     url = '/project/exportTimeCostByCategory'
                     if(this.exportParam.projectCategoryId){
                         param.projectCategoryId = this.exportParam.projectCategoryId
                     }
                 }
-                if(this.radio == '部门'){
-                    fileName = '部门工时成本统计.xls'
+                if(this.radio == this.$t('lable.department')){
+                    fileName = this.$t('departmenthourscoststatistics')+ '.xls'
                     url = '/department/exportDeptStatistic'
                 }
                 
-                if (this.exportParam.projectId && this.radio != '人员' && this.radio != '项目分类') {
+                if (this.exportParam.projectId && this.radio != this.$t('ren-yuan') && this.radio != this.$t('projectclassification')) {
                     param.projectId = this.exportParam.projectId;
                 }
                 if (this.exportParam.userId) {
-                    if(this.radio == '项目' || this.radio == '部门' || this.radio == '人员' || this.radio == '项目分类'){
+                    if(this.radio == this.$t('other.project') || this.radio == this.$t('lable.department') || this.radio == this.$t('ren-yuan') || this.radio == this.$t('projectclassification')){
                         param.userId = this.exportParam.userId;
                     }
                 }
@@ -318,7 +318,7 @@
                     this.exportParam.projectSum = null
                 }
                 if (this.exportParam.projectSum != null) {
-                    if(this.radio == '项目' || this.radio == '部门' || this.radio == '项目分类'){
+                    if(this.radio == this.$t('other.project') || this.radio == this.$t('lable.department') || this.radio == this.$t('projectclassification')){
                         param.projectSum = this.exportParam.projectSum;
                     }
                 }
@@ -327,7 +327,7 @@
                 } 
                 if(this.theCustomListFlg) {
                     url = '/project/exportTimeCostByUserCustom'
-                    fileName = this.radio + '统计.xls'
+                    fileName = this.radio + this.$t('statistical') + '.xls'
                     // param.subCustomName = this.customName
                     param.customId = this.theCustomListId
                     param.fieldName = this.theCustomListPlant
@@ -660,9 +660,9 @@
                         //总成本
                         title: {
                             // text: '工时成本总计' + totalMoneyCost.toFixed(2) + '元, 时长'+totalHours+'小时',
-                            text: '工时成本总计:' + 
-                            ((this.permissions.countCost) ? '成本' + totalMoneyCost.toFixed(2) + '元,' : '') + 
-                            ((this.permissions.countHours) ? '时长' + totalHours + '小时' : ''),
+                            text: this.$t('otalhourscost')+ ':' + 
+                            ((this.permissions.countCost) ? this.$t('costof') + totalMoneyCost.toFixed(2) + this.$t('yuan') + ',' : '') + 
+                            ((this.permissions.countHours) ? this.$t('time.duration') + totalHours + this.$t('time.hour') : ''),
                             left:'left',
                         },
                         // 工具箱
@@ -708,17 +708,17 @@
                                 var res = "";
                                 for(var i in params) {
                                     if (params[i].data.value > 0) {
-                                        res += "<div style='margin-top:3px;font-size:12px;'><font color='#ddd'>项目名称:" + params[i].seriesName 
+                                        res += "<div style='margin-top:3px;font-size:12px;'><font color='#ddd'>" + this.$t('headerTop.projectName') + ":" + params[i].seriesName 
                                             + "</font><br/>" + 
-                                            ((_this.permissions.countCost) ? "工作成本 : " + params[i].data.money + "元<br/>" : '') + 
-                                            ((_this.permissions.countHours) ? "工作时长 : " + params[i].data.cost + "小时</br>" : '') + "</div>";
+                                            ((_this.permissions.countCost) ? this.$t('workcost')+ ":" + params[i].data.money + this.$t('yuan') + "</br>" : '') + 
+                                            ((_this.permissions.countHours) ? this.$t('screening.workTime') + ":" + params[i].data.cost + this.$t('time.hour') + "</br>" : '') + "</div>";
                                         totalTime += Number(params[i].data.cost);
                                         totalCost += Number(params[i].data.money);
                                     }
                                 }
-                                res = res +'<br/>'+ params[0].name+ '<br/>总计: ' + 
-                                ((_this.permissions.countHours) ? totalTime.toFixed(1) + '小时 ' : '') + 
-                                ((_this.permissions.countCost) ? totalCost.toFixed(2) + "元" : '') + 
+                                res = res +'<br/>'+ params[0].name+ '<br/>' +this.$t('zong-ji') + ':' + 
+                                ((_this.permissions.countHours) ? totalTime.toFixed(1) + this.$t('time.hour') : '') + 
+                                ((_this.permissions.countCost) ? totalCost.toFixed(2) + this.$t('yuan') : '') + 
                                 "<br/>";
                                 return res;
                             }
@@ -732,7 +732,7 @@
                         yAxis: [{
                             type : 'value',
                             axisLabel: {
-                                formatter:this.yAxisValue==0?'{value} (元)':'{value} (小时)'
+                                formatter:this.yAxisValue==0?'{value} ('+this.$t('yuan')+')':'{value} ('+this.$t('time.hour')+')'
                             }
                         }],
                         series: series,
@@ -801,7 +801,7 @@
                 })
             },
             backToParentDept() {
-                if (this.radio == '部门') {
+                if (this.radio == this.$t('lable.department')) {
                     if (this.parentDeptStack.length > 0) {
                         this.parentDeptStack.pop();
                         if (this.parentDeptStack.length > 0) {
@@ -826,19 +826,19 @@
                     // console.log(param);
                 }
                 var url = '';
-                if (this.radio=='项目') {
+                if (this.radio==this.$t('other.project')) {
                     url = this.port.project.listCost;
-                }else if(this.radio == '主项目'){
+                }else if(this.radio == this.$t('zhu-xiang-mu')){
                     url = '/project/getTimeCostByMainProject'
                     // param.userId = this.user.id
-                }else if (this.radio=='项目分类') {
+                }else if (this.radio==this.$t('projectclassification')) {
                     url = '/project/getTimeCostByCategory';
                     // param.parentDeptId = this.parentDeptId;
                     // param.userId = this.user.id
-                } else if (this.radio=='部门') {
+                } else if (this.radio==this.$t('lable.department')) {
                     url = this.port.project.depCost;
                     param.parentDeptId = this.parentDeptId;
-                } else if (this.radio=='人员') {
+                } else if (this.radio==this.$t('ren-yuan')) {
                     this.getUserCostList();
                     return;
                 } else if (this.radio == this.namess) {
@@ -875,13 +875,13 @@
                         var list
                         var totalMoneyCost;
                         var totalHours = 0.0;
-                        if(this.radio == '项目' || this.radio == '项目分类' || this.radio=='部门' || this.radio == '主项目') {
+                        if(this.radio == this.$t('other.project') || this.radio == this.$t('projectclassification') || this.radio==this.$t('lable.department') || this.radio == this.$t('zhu-xiang-mu')) {
                             list = res.data.costList
-                            totalMoneyCost = ((this.radio=='项目' || this.radio == '项目分类')?res.data.totalMoneyCost:res.data.totalCostMoney);
+                            totalMoneyCost = ((this.radio==this.$t('other.project') || this.radio == this.$t('projectclassification'))?res.data.totalMoneyCost:res.data.totalCostMoney);
 
                             for(var i in list) {
-                                if(this.radio=='项目' || this.radio == '主项目') {
-                                    if(this.radio == '项目'){
+                                if(this.radio==this.$t('other.project') || this.radio == this.$t('zhu-xiang-mu')) {
+                                    if(this.radio == this.$t('other.project')){
                                         xList.push(list[i].project);
                                     }else{
                                         xList.push(list[i].mainProjectName);
@@ -901,7 +901,7 @@
                                     }
                                     yList.push(item);
                                     
-                                } else if(this.radio == '部门'){
+                                } else if(this.radio == this.$t('lable.department')){
                                     xList.push(list[i].departmentName);
                                     let item = {
                                         // "value": this.yAxisValue==0 ? list[i].costMoney.toFixed(2) || list[i].costMoney: list[i].costTime.toFixed(1),
@@ -997,10 +997,10 @@
                             this.zhishin = totalMoneyCost.toFixed(2)
                         } 
 
-                        if(this.radio == '项目' || this.radio == '主项目' || this.radio == '人员' || this.radio == '项目分类' || this.radio=='部门') {
+                        if(this.radio == this.$t('other.project') || this.radio == this.$t('zhu-xiang-mu') || this.radio == this.$t('ren-yuan') || this.radio == this.$t('projectclassification') || this.radio==this.$t('lable.department')) {
                             var option = {
                                 title: {
-                                    text: '工时成本总计:' + ((this.permissions.countCost) ? '成本' + this.zhishin + '元,' : '') + ((this.permissions.countHours) ? '时长' + totalHours + '小时' : ''),
+                                    text: this.$t('otalhourscost') + ':' + ((this.permissions.countCost) ? this.$t('costof') + this.zhishin + this.$t('yuan') + ',' : '') + ((this.permissions.countHours) ? this.$t('time.duration') + totalHours + this.$t('time.hour') : ''),
                                     left:'left',
                                 },
                                 // 工具箱
@@ -1017,9 +1017,9 @@
                                         // + "元 <br/>工作时长"+" : " + params[0].data.cost + "小时";
                                         _this.params = params;
                                         var res = params[0].name + "<br/>" + 
-                                        ((_this.permissions.countCost) ? "工作成本"+" : " + params[0].data.money 
-                                        + "<br/>" : '') + 
-                                        ((_this.permissions.countHours) ? "工作时长"+" : " + params[0].data.cost + "小时" : '');
+                                        ((_this.permissions.countCost) ? this.$t('workcost')+" : " + params[0].data.money 
+                                        + this.$t('yuan')+"<br/>" : '') + 
+                                        ((_this.permissions.countHours) ? this.$t('screening.workTime')+" : " + params[0].data.cost + this.$t('time.hour') : '');
                                         return res;
                                     }
                                 },
@@ -1032,11 +1032,11 @@
                                 yAxis: [{
                                     type : 'value',
                                     axisLabel: {
-                                        formatter:this.yAxisValue==0?'{value} (元)':'{value}小时'
+                                        formatter:this.yAxisValue==0?'{value} ('+this.$t('yuan')+')':'{value}'+this.$t('time.hour')
                                     }
                                 }],
                                 series: [{
-                                    name: this.yAxisValue==0?'工作成本(元)':'工作时长(小时)',
+                                    name: this.yAxisValue==0?this.$t('workcost')+'('+this.$t('yuan')+')':this.$t('screening.workTime')+'('+this.$t('time.hour')+')',
                                     type: 'bar',
                                     barMaxWidth: 30,
                                     data: yList,
@@ -1049,7 +1049,7 @@
                             var option = {
                                 title: {
                                     // text: '工时成本总计' + this.zhishin + '元, 时长'+totalHours+'小时',
-                                    text: '工时成本总计:' + ((this.permissions.countCost) ? '成本' + this.zhishin + '元,' : '') + ((this.permissions.countHours) ? '时长' + totalHours + '小时' : ''),
+                                    text: this.$t('otalhourscost')+ ':' + ((this.permissions.countCost) ? this.$t('costof') + this.zhishin + this.$t('yuan')+ ',' : '') + ((this.permissions.countHours) ? this.$t('time.duration') + totalHours + this.$t('time.hour') : ''),
                                     left:'left',
                                 },
                                 // 工具箱
@@ -1063,9 +1063,9 @@
                                     trigger:'axis',
                                     formatter: function (params,ticket,callback) {
                                         var res = params[0].name + "<br/>" + 
-                                        ((_this.permissions.countCost) ? "工作成本"+" : " + params[0].data.money 
-                                        + "<br/>" : '') + 
-                                        ((_this.permissions.countHours) ? "工作时长"+" : " + params[0].data.cost + "小时" : '');
+                                        ((_this.permissions.countCost) ? this.$t('workcost')+" : " + params[0].data.money 
+                                        + this.$t('yuan')+"<br/>" : '') + 
+                                        ((_this.permissions.countHours) ? this.$t('screening.workTime')+" : " + params[0].data.cost + this.$t('time.hour') : '');
                                         _this.params = params;
                                         return res;
                                     }
@@ -1079,11 +1079,11 @@
                                 yAxis: [{
                                     type : 'value',
                                     axisLabel: {
-                                        formatter:this.yAxisValue==0?'{value} (元)':'{value}小时'
+                                        formatter:this.yAxisValue==0?'{value} ('+this.$t('yuan')+')':'{value}'+this.$t('time.hour')
                                     }
                                 }],
                                 series: [{
-                                    name: this.yAxisValue==0?'工作成本(元)':'工作时长(小时)',
+                                    name: this.yAxisValue==0?this.$t('workcost')+'('+this.$t('yuan')+')':this.$t('screening.workTime')+'('+this.$t('time.hour')+')',
                                     type: 'bar',
                                     barMaxWidth: 30,
                                     data: yList,
@@ -1099,7 +1099,7 @@
                             const pointInPixel = [params.offsetX, params.offsetY];
                             if (myChart.containPixel('grid', pointInPixel)) {
                                 console.log(_this.params)
-                                if(_this.radio=='项目') {
+                                if(_this.radio==this.$t('other.project')) {
                                     if (_this.dateRange != null) {
                                         if (this.user.timeType.fixMonthcost == 0) {
                                             _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name
@@ -1111,7 +1111,7 @@
                                     } else {
                                         _this.$router.push("/cost/" + _this.params[0].data.id + "/" + _this.params[0].name);
                                     }
-                                } else if (_this.radio=='部门') {
+                                } else if (_this.radio==this.$t('lable.department')) {
                                     if (_this.params[0].data.hasSubDept) {
                                         if (_this.parentDeptId != _this.params[0].data.id) {
                                             _this.parentDeptId = _this.params[0].data.id;
@@ -1261,7 +1261,7 @@
                 }
                 this.exportParam.dateRange = this.dateRange;
             }
-            this.radio = '项目'
+            this.radio = this.$t('other.project')
             this.getEchart();
             var _this = this;
             window.addEventListener("resize", function() {

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

@@ -15,19 +15,19 @@
             </el-form>
         </el-col> -->
         <div style="padding: 20px;background:#fff;border-bottom:1px solid #ddd;font-weight:500;font-size:15px;">
-            <span @click="viewFolder(null)" style="color: #409EFF;cursor: pointer;">文件库</span>
+            <span @click="viewFolder(null)" style="color: #409EFF;cursor: pointer;">{{ $t('library') }}</span>
             <span v-for="path in pathList" :key="path.id" @click="viewFolder(path)" class="mianbaoxie"> <i class="el-icon-arrow-right jianto"></i> {{path.documentName}}</span>
             <span style="float:right;">
-                    <el-link type="primary" :underline="false" @click="createFolder"><i class="el-icon-folder-add"></i><span style="margin-left:5px;">创建文件夹</span></el-link>
+                    <el-link type="primary" :underline="false" @click="createFolder"><i class="el-icon-folder-add"></i><span style="margin-left:5px;">{{ $t('createafolder') }}</span></el-link>
                     <el-upload ref="upload" action="#" :http-request="uploadFile" :show-file-list="false" :limit="1" style="display:inline-block;">
-                        <el-link type="primary" :underline="false" style="margin-left:10px;"><i class="iconfont firerock-iconshangchuan"></i><span style="margin-left:5px;">文件上传</span></el-link>
+                        <el-link type="primary" :underline="false" style="margin-left:10px;"><i class="iconfont firerock-iconshangchuan"></i><span style="margin-left:5px;">{{ $t('fileupload') }}</span></el-link>
                     </el-upload>
             </span>
         </div>
         <div>
         <el-col :span="6" style="border-right: 1px solid #EBEEF5;">
             <el-table :data="recentFiles" highlight-current-row :height="tableHeight">
-                <el-table-column prop="documentName" label="近期文件" sortable="true">
+                <el-table-column prop="documentName" :label="$t('recentdocuments')" sortable="true">
                     <template slot-scope="scope">
                         <!-- <el-link @click.stop.native="viewOnline(scope.row)"> -->
                         <i v-if="scope.row.documentType == -1" class="iconfont firerock-iconfile fileTypeIcon"></i>
@@ -47,7 +47,7 @@
         <el-col :span="18" >
             <el-table :data="list" highlight-current-row :height="tableHeight" style="width: 100%;"  @row-click="rowClick" @cell-mouse-enter="cursorOver" >
                 <!-- <el-table-column prop="folder" ></el-table-column> -->
-                <el-table-column prop="documentName" label="名称" >
+                <el-table-column prop="documentName" :label="$t('names')" >
                     <template slot-scope="scope" >
                         <div v-if="scope.row.isFolder==1">
                             <i class="el-icon-folder fileTypeIcon"></i><span style="margin-left:8px;color:#262626;" >{{scope.row.documentName}}</span>
@@ -61,13 +61,13 @@
                         </div>
                     </template>
                 </el-table-column>
-                <el-table-column prop="size" label="大小" width="100">
+                <el-table-column prop="size" :label="$t('da-xiao')" width="100">
                     <template slot-scope="scope">
                         {{scope.row.isFolder==0?scope.row.size:"-"}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="creatorName" label="创建者" width="100"></el-table-column>
-                <el-table-column prop="indate" label="创建时间" sortable="true" width="100"></el-table-column>
+                <el-table-column prop="creatorName" :label="$t('creator')" width="100"></el-table-column>
+                <el-table-column prop="indate" :label="$t('creationtime')" sortable="true" width="100"></el-table-column>
                 <el-table-column width="140">
                     <template slot-scope="scope" >
                     <div v-show="currentDataId == scope.row.id">
@@ -82,33 +82,33 @@
         </div>
         
         <!--新增界面-->
-        <el-dialog title="文件上传" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('fileupload')" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item label="截止日期" prop="planEndDate">
+                <el-form-item :label="$t('expirationdate')" prop="planEndDate">
                     <el-date-picker v-model="addForm.planEndDate" v-if="user.company.packageProject==1" 
                      :editable="false" 
                      format="yyyy-MM-dd" 
                      value-format="yyyy-MM-dd"
                      :clearable="false" type="date" 
-                     placeholder="选择日期"></el-date-picker>
+                     :placeholder="$t('optiondate')"></el-date-picker>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
          <!-- 文件夹弹出框 -->
-        <el-dialog title="新增/修改文件夹" v-if="addFolderDialog" :visible.sync="addFolderDialog" :close-on-click-modal="false" customClass="customWidth" width="300px">
+        <el-dialog :title="$t('modifyingFolder')" v-if="addFolderDialog" :visible.sync="addFolderDialog" :close-on-click-modal="false" customClass="customWidth" width="300px">
             <el-form ref="form2" :model="folderForm" :rules="rules" >
                 <el-form-item prop="documentName">
-                    <el-input v-model="folderForm.documentName" placeholder="请输入文件夹名称" maxlength="25"
+                    <el-input v-model="folderForm.documentName" :placeholder="$t('pleaseenterfoldername')" maxlength="25"
                         show-word-limit clearable></el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="addFolder" style="width:100%;" >保存</el-button>
+                <el-button type="primary" @click="addFolder" style="width:100%;" >{{ $t('save') }}</el-button>
             </div>
         </el-dialog>
         </div>
@@ -141,7 +141,7 @@
                 ,"iconfont firerock-iconex","iconfont firerock-iconZip","iconfont firerock-iconvideo"
                 ,"iconfont firerock-iconaudio","iconfont firerock-iconPDF"],
                 rules: {
-                    documentName: [{ required: true, message: "请输入文件夹名称", trigger: "blur" }],
+                    documentName: [{ required: true, message: this.$t('pleaseenterfoldername'), trigger: "blur" }],
                 },
                 folderForm:{},
                 addFolderDialog: false,
@@ -192,7 +192,7 @@
                 })
             },
             deleteItem(row) {
-                this.$confirm("确认要移到回收站吗?", "提示", {
+                this.$confirm(this.$t('wanttomove'), this.$t('other.prompts'), {
                     //type: 'warning'
                 }).then(() => {
                     this.http.post('/document/delete', row,
@@ -312,7 +312,7 @@
                     this.$refs.upload.clearFiles();
                     if (res.code == "ok") {
                         this.$message({
-                            message: "上传成功",
+                            message: this.$t('uploadedsuccessfully'),
                             type: 'success'
                         });
                         this.getList();

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

@@ -4,21 +4,21 @@
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <!-- <el-form-item label="财务核算成本 | 月份选择" style="margin-top:5px;"> -->
-                <el-form-item label="月份选择" >
-                <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonth" :clearable="false" type="month" placeholder="选择月份" style="margin-right: 20px"></el-date-picker>
+                <el-form-item :label="this.$t('Selectmonth')" >
+                <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonth" :clearable="false" type="month" :placeholder="$t('Selectmonth')" style="margin-right: 20px"></el-date-picker>
                 <el-link type="primary" :underline="false" @click="audits()" v-if="user.timeType.financeAudit == '1'">{{revaelse}}</el-link>
             </el-form-item>
             <!-- <el-radio-group v-model="radio" @change="switchList" style="margin-left:160px;margin-top:5px;"> -->
             <el-radio-group size="small" v-model="radio" @change="switchList" style="margin-left:150px;margin-top:5px;">
-                <el-radio-button label="全部人员" >全部人员({{allFinanceList.length}})</el-radio-button>
-                <el-radio-button label="无项目工时人员">无项目工时人员({{noReportUserList.length}})</el-radio-button>
+                <el-radio-button :label="$t('lable.allStaff')" >{{$t('lable.allStaff')}}({{allFinanceList.length}})</el-radio-button>
+                <el-radio-button :label="$t('projectworker')">{{$t('projectworker')}}({{noReportUserList.length}})</el-radio-button>
             </el-radio-group>
             <el-form-item v-if="permissions.financialProportion" style="margin-left:5px;">
-                <el-link type="primary" :underline="false" @click="showSettingDialog()" >分摊比例设置</el-link>
+                <el-link type="primary" :underline="false" @click="showSettingDialog()" >{{ $t('Apportionmentratesetting') }}</el-link>
             </el-form-item>
 
             <el-form-item style="float:right;" v-if="permissions.financialUpload">
-                <el-link type="primary" :underline="false" @click="getTemplate()" >模板下载</el-link>
+                <el-link type="primary" :underline="false" @click="getTemplate()" >{{ $t('Downloadthetemplate') }}</el-link>
             </el-form-item>
             <!-- <el-form-item style="float:right;">
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false">
@@ -26,48 +26,48 @@
                     </el-upload>
             </el-form-item> -->
             <el-form-item style="float:right;" v-if="permissions.financialUpload">
-                <el-link type="primary" :underline="false" @click="importDialog = true;isUploading=false;">数据上传</el-link>
+                <el-link type="primary" :underline="false" @click="importDialog = true;isUploading=false;">{{ $t('Dataupload') }}</el-link>
             </el-form-item>
             <el-form-item style="float:right;" v-if="permissions.financialExport">
-                <el-link type="primary" :underline="false" @click="exportDialog = true;exportMonth = date;">数据导出</el-link>
+                <el-link type="primary" :underline="false" @click="exportDialog = true;exportMonth = date;">{{ $t('Exportdata') }}</el-link>
             </el-form-item>
             <el-form-item style="float:right;" v-if="permissions.financialCustom">
-                <el-link type="primary" :underline="false" @click="showItemDialog()">自定义薪资项</el-link>
+                <el-link type="primary" :underline="false" @click="showItemDialog()">{{ $t('Customizesalaryitems') }}</el-link>
             </el-form-item>
             <el-form-item style="float:right;" v-if="user.timeType.financeAudit == '1' && permissions.setFinanceAuditor">
-                <el-link type="primary" :underline="false" @click="reviewerVisible = true">设置审核人</el-link>
+                <el-link type="primary" :underline="false" @click="reviewerVisible = true">{{ $t('Setupauditor') }}</el-link>
             </el-form-item>
             
             </el-form>
         </el-col>
         <!-- 上传记录 -->
-        <el-dialog title="薪资上传记录" :visible.sync="xzImportVisible" width="1100px" :before-close="handleClose">
+        <el-dialog :title="$t('Salaryuploadrecord')" :visible.sync="xzImportVisible" width="1100px" :before-close="handleClose">
             <div>
                 <el-table :data="xzList" style="width: 100%" :height="400">
-                    <el-table-column prop="userName" label="操作人"></el-table-column>
-                    <el-table-column prop="ymonth" label="所属月份"></el-table-column>
-                    <el-table-column prop="fileName" label="文件名">
+                    <el-table-column prop="userName" :label="$t('other.operator')"></el-table-column>
+                    <el-table-column prop="ymonth" :label="$t('BelongsIn')"></el-table-column>
+                    <el-table-column prop="fileName" :label="$t('filename')">
                         <template slot-scope="scope">
                             <div>
                                 <el-link type="primary" @click="downloadByA({name:scope.row.fileName,url:scope.row.serverName})"> {{scope.row.fileName}}</el-link>
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="recoverReport" label="是否覆盖日报成本" width="150">
+                    <el-table-column prop="recoverReport" :label="$t('Whetherdailycostiscovered')" width="150">
                         <template slot-scope="scope">
                             <div>
-                                {{scope.row.recoverReport == 1? '是' : '否'}}
+                                {{scope.row.recoverReport == 1? $t('state.yes') : $t('state.no')}}
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="recoverMonthcost" label="是否覆盖人员月成本" width="150">
+                    <el-table-column prop="recoverMonthcost" :label="$t('Whethermonthlypersonnelcostiscovered')" width="150">
                         <template slot-scope="scope">
                             <div>
-                                {{scope.row.recoverMonthcost == 1? '是' : '否'}}
+                                {{scope.row.recoverMonthcost == 1? $t('state.yes') : $t('state.no')}}
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="indate" label="上传时间"></el-table-column>
+                    <el-table-column prop="indate" :label="$t('Uploadtime')"></el-table-column>
                     <!-- <el-table-column prop="date" label="操作" v-if="(tabPosition == 1 || tabPosition == 0) && (reviewerRuleForm.auditorId == user.id || user.role == 1 || user.role == 2)">
                         <template slot-scope="scope">
                             <div>
@@ -84,43 +84,43 @@
         <el-dialog :title="shenhe" :visible.sync="importVisible" width="1100px" :before-close="handleClose">
             <div>
                  <el-radio-group v-model="tabPosition" style="margin-bottom: 20px;" @change="operationalData()">
-                    <el-radio-button label="1">已通过</el-radio-button>
-                    <el-radio-button label="0">待审核</el-radio-button>
-                    <el-radio-button label="2">已驳回</el-radio-button>
-                    <el-radio-button label="-1">已撤销</el-radio-button>
+                    <el-radio-button label="1">{{ $t('state.alreadyPassed') }}</el-radio-button>
+                    <el-radio-button label="0">{{ $t('state.WaitingAudit') }}</el-radio-button>
+                    <el-radio-button label="2">{{ $t('state.rejected') }}</el-radio-button>
+                    <el-radio-button label="-1">{{ $t('state.undone') }}</el-radio-button>
                 </el-radio-group>
                 
                 <el-table :data="reviewLis" style="width: 100%" :height="400">
-                    <el-table-column prop="userName" label="操作人"></el-table-column>
-                    <el-table-column prop="ymonth" label="所属月份"></el-table-column>
-                    <el-table-column prop="fileName" label="文件名">
+                    <el-table-column prop="userName" :label="$t('other.operator')"></el-table-column>
+                    <el-table-column prop="ymonth" :label="$t('BelongsIn')"></el-table-column>
+                    <el-table-column prop="fileName" :label="$t('filename')">
                         <template slot-scope="scope">
                             <div>
                                 <el-link type="primary" @click="downloadByA({name:scope.row.fileName,url:scope.row.serverName})"> {{scope.row.fileName}}</el-link>
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="recoverReport" label="是否覆盖日报成本" width="150">
+                    <el-table-column prop="recoverReport" :label="$t('Whetherdailycostiscovered')" width="150">
                         <template slot-scope="scope">
                             <div>
-                                {{scope.row.recoverReport == 1? '是' : '否'}}
+                                {{scope.row.recoverReport == 1? $t('state.yes') : $t('state.no')}}
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="recoverMonthcost" label="是否覆盖人员月成本" width="150">
+                    <el-table-column prop="recoverMonthcost" :label="$t('Whethermonthlypersonnelcostiscovered')" width="150">
                         <template slot-scope="scope">
                             <div>
-                                {{scope.row.recoverMonthcost == 1? '是' : '否'}}
+                                {{scope.row.recoverMonthcost == 1? $t('state.yes') : $t('state.no')}}
                             </div>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="indate" label="上传时间"></el-table-column>
-                    <el-table-column prop="date" label="操作" v-if="(tabPosition == 1 || tabPosition == 0) && (reviewerRuleForm.auditorId == user.id)">
+                    <el-table-column prop="indate" :label="$t('Uploadtime')"></el-table-column>
+                    <el-table-column prop="date" :label="$t('operation')" v-if="(tabPosition == 1 || tabPosition == 0) && (reviewerRuleForm.auditorId == user.id)">
                         <template slot-scope="scope">
                             <div>
-                                <el-button type="primary" size="small" v-if="tabPosition == 0" @click="operationList(0, scope.row.id)">通过</el-button>
-                                <el-button type="warning" size="small" v-if="tabPosition == 0" @click="operationList(1, scope.row.id)">驳回</el-button>
-                                <el-button type="warning" size="small" v-if="tabPosition == 1" @click="operationList(2, scope.row.id)">撤销</el-button>
+                                <el-button type="primary" size="small" v-if="tabPosition == 0" @click="operationList(0, scope.row.id)">{{ $t('btn.through') }}</el-button>
+                                <el-button type="warning" size="small" v-if="tabPosition == 0" @click="operationList(1, scope.row.id)">{{ $t('btn.rejected') }}</el-button>
+                                <el-button type="warning" size="small" v-if="tabPosition == 1" @click="operationList(2, scope.row.id)">{{ $t('btn.undo') }}</el-button>
                             </div>
                         </template>
                     </el-table-column>
@@ -129,29 +129,29 @@
         </el-dialog>
 
         <!-- 设置审核人弹窗 -->
-        <el-dialog title="设置审核人" :visible.sync="reviewerVisible" width="350px" :before-close="handleCloses">
+        <el-dialog :title="$t('Setupauditor')" :visible.sync="reviewerVisible" width="350px" :before-close="handleCloses">
             <el-form :model="reviewerRuleForm" ref="reviewerRuleForm" label-width="100px" class="demo-ruleForm">
-                <el-form-item label="选择审核人" prop="auditorId" :rules="{required: true, message: '审核人不能为空', trigger: 'blur'}">
-                    <el-select v-model="reviewerRuleForm.auditorId" clearable placeholder="请选择审核人" >
+                <el-form-item :label="$t('SelectionofAuditor')" prop="auditorId" :rules="{required: true, message: $t('reviewercannotbeempty'), trigger: 'blur'}">
+                    <el-select v-model="reviewerRuleForm.auditorId" clearable :placeholder="$t('SelectionofAuditor')" >
                         <el-option v-for="(item, index) in people" :key="index" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
                 <el-form-item>
-                    <el-button type="primary" @click="submitreviewerRuleForm('reviewerRuleForm')">提交</el-button>
+                    <el-button type="primary" @click="submitreviewerRuleForm('reviewerRuleForm')">{{ $t('btn.submit') }}</el-button>
                 </el-form-item>
             </el-form>
         </el-dialog>
 
 
-        <el-dialog title="财务数据导出" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="400px">
+        <el-dialog :title="$t('Exportoffinancialdata')" v-if="exportDialog" :visible.sync="exportDialog" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <el-form ref="form3" >
-                <el-form-item label="导出月份" >
+                <el-form-item :label="$t('Intheexport')" >
                     <!-- <div style="color:orange;">{{date}}</div> -->
-                    <el-date-picker v-model="exportMonth" type="month" placeholder="选择月份" format="yyyy-MM" value-format="yyyy-MM" style="width:280px;"></el-date-picker>
+                    <el-date-picker v-model="exportMonth" type="month" :placeholder="$t('Selectmonth')" format="yyyy-MM" value-format="yyyy-MM" style="width:280px;"></el-date-picker>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" style="width:100%;" :loading="isUploading" @click="exportFinance">导出</el-button>
+                <el-button type="primary" style="width:100%;" :loading="isUploading" @click="exportFinance">{{ $t('export.export') }}</el-button>
             </div>
         </el-dialog>
 
@@ -166,8 +166,8 @@
         @selection-change="deleteSel"
         :height="300" style="width: 100%;">
             <el-table-column type="selection" width="80" fixed="left"></el-table-column>
-            <el-table-column prop="jobNumber" v-if="user.timeType.financeJobnumEnabled==1" label="工号" sortable width="100" fixed="left"></el-table-column>
-            <el-table-column prop="name" label="姓名" sortable width="150" fixed="left"></el-table-column>
+            <el-table-column prop="jobNumber" v-if="user.timeType.financeJobnumEnabled==1" :label="$t('Worknumber')" sortable width="100" fixed="left"></el-table-column>
+            <el-table-column prop="name" :label="$t('lable.name')" sortable width="150" fixed="left"></el-table-column>
             <template v-if="user.timeType.isSecretSalary==0">
                 <el-table-column :prop="headerCols[index]" :label="item" sortable show-overflow-tooltip v-for="(item, index) in tblCols" :key="index" width="130px" align="right">
                 <template slot-scope="scope">
@@ -182,14 +182,14 @@
                 </template>
                 </el-table-column>
             </template>
-            <el-table-column prop="totalCost" width="150" align="right" label="总成本" fixed="right">
+            <el-table-column prop="totalCost" width="150" align="right" :label="$t('totalcost')" fixed="right">
                 <template slot-scope="scope" >
                     <div style="padding-right:5px;">{{user.timeType.isSecretSalary==0?scope.row.totalCost:'*'}}</div>
                 </template>
             </el-table-column>
         </el-table>
         <div style="padding:5px 0 0 10px" v-if="permissions.financialUpload">
-            <el-button @click="deleteUsers" size="mini" type="primary" :disabled="deleteSelList.length == 0">批量删除</el-button>
+            <el-button @click="deleteUsers" size="mini" type="primary" :disabled="deleteSelList.length == 0">{{ $t('Batchdelete') }}</el-button>
         </div>
          
         <el-form :inline="true" >
@@ -198,14 +198,14 @@
                 <!-- <el-button type="primary" :underline="false" size="small" @click="assignNoProUser=false;assignToProject();" style="margin-left:10px;">分摊已填工时人员成本</el-button>
                 <el-button type="primary" :underline="false" size="small" @click="assignNoProUser=true;assignToProject();" style="margin-left:10px;">分摊全部人员成本</el-button> -->
                 <el-radio-group size="small" v-model="costListRadio" @change="switchCostList" style="margin-left:5px;margin-top:5px;">
-                    <el-radio-button label="1" >分摊已填工时人员成本</el-radio-button>
-                    <el-radio-button label="2">分摊全部人员成本</el-radio-button>
+                    <el-radio-button label="1" >{{ $t('Apportionmentofpersonnelcosts') }}</el-radio-button>
+                    <el-radio-button label="2">{{ $t('Spreadallpersonnelcosts') }}</el-radio-button>
                 </el-radio-group>
 
             </el-form-item>
 
             <el-form-item style="float:right;margin-right:20px;" v-if="permissions.financialShare">
-                <el-link type="primary" :underline="false" @click="exportFinanceDialog=true">导出分摊数据</el-link>
+                <el-link type="primary" :underline="false" @click="exportFinanceDialog=true">{{ $t('ExportingtheAllocationData') }}</el-link>
             </el-form-item>
             
             <!-- <el-form-item style="float:right;margin-right:30px;" v-if="hasNoProjectUsers">
@@ -220,63 +220,63 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="100px">
-                <el-form-item label="项目编号" >
-                    <el-input v-model="addForm.code" placeholder="请输入项目编号" clearable></el-input>
+                <el-form-item :label="$t('Itemno')" >
+                    <el-input v-model="addForm.code" :placeholder="$t('Pleaseentertheprojectnumber')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="项目名称" prop="name">
-                    <el-input v-model="addForm.name" placeholder="请输入项目名称" clearable></el-input>
+                <el-form-item :label="$t('headerTop.projectName')" prop="name">
+                    <el-input v-model="addForm.name" :placeholder="$t('Pleaseenteraprojectname')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="全部参与者">
-                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
+                <el-form-item :label="$t('Allparticipants')">
+                    <el-select v-model="addForm.userId" multiple filterable :placeholder="$t('Pleaseselectparticipants')" style="width:100%;" @change="changeParticipator">
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="主要负责人" >
-                    <el-select v-model="addForm.inchargerId" :disabled="addForm.userId.length==0" filterable placeholder="请选择负责人" style="width:100%;" @change="changeIncharger">
+                <el-form-item :label="$t('Principalpersoninharge')" >
+                    <el-select v-model="addForm.inchargerId" :disabled="addForm.userId.length==0" filterable :placeholder="$t('Pleaseselectthepersonincharge')" style="width:100%;" @change="changeIncharger">
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
                 
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!--用户详细信息弹出框-->
-        <el-dialog title="查看详情" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
-            <div class="line"><span>姓名</span><span>{{userDetail.name}}</span></div>
-            <div class="line"><span>工号</span><span>{{userDetail.jobNumber}}</span></div>
-            <div class="line"><span>手机号码</span><span>{{userDetail.phone}}</span></div>
-            <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
-            <div class="line"><span>成本</span><span>{{userDetail.cost}}元/小时</span></div>
+        <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+            <div class="line"><span>{{ $t('lable.name') }}</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
+            <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{$t('Yuananhour')}}</span></div>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
+                <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
          
          <!--导入时的设置界面 -->
-         <el-dialog title="财务数据导入" v-if="importDialog" :visible.sync="importDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+         <el-dialog :title="$t('Financialdataimport')" v-if="importDialog" :visible.sync="importDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="form3" :model="importParam" >
-                <el-form-item label="导入月份" >
+                <el-form-item :label="$t('Itheimport')" >
                     <!-- <div style="color:orange;">{{date}}</div> -->
-                    <el-date-picker v-model="date" type="month" placeholder="选择月份" format="yyyy-MM" value-format="yyyy-MM"></el-date-picker>
+                    <el-date-picker v-model="date" type="month" placeholder="$t('Selectmonth')" format="yyyy-MM" value-format="yyyy-MM"></el-date-picker>
                 </el-form-item>
                 <el-form-item prop="syncHistoryReport"  >
-                    <el-checkbox label="重新计算该月已填日报成本" v-model="importParam.syncHistoryReport"></el-checkbox>
+                    <el-checkbox :label="$t('Recalculatereportedcostsforthemonth')" v-model="importParam.syncHistoryReport"></el-checkbox>
                 </el-form-item>
                 <el-form-item prop="syncUserCost"  >
-                    <el-checkbox label="同步到组织架构中员工月薪成本" v-model="importParam.syncUserCost" ></el-checkbox>
+                    <el-checkbox :label="$t('Synchronizeemployeemonthlycosttorganizationalstructure')" v-model="importParam.syncUserCost" ></el-checkbox>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-link v-if="user.timeType.financeAudit == '0'"
                 style="float:left;"
-                    type="primary" :underline="false" @click="xzjl(),xzImportVisible = true">查看导入历史记录</el-link>
+                    type="primary" :underline="false" @click="xzjl(),xzImportVisible = true">{{ $t('Viewtheimporthistory') }}</el-link>
             
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false" >
-                        <el-button type="primary" style="width:100%;" :loading="isUploading" >选择文件并开始导入</el-button>
+                        <el-button type="primary" style="width:100%;" :loading="isUploading" >{{ $t('Selectthefilendstartimporting') }}</el-button>
                     </el-upload>
             </div>
         </el-dialog>
@@ -310,107 +310,108 @@
             </div>
         </el-dialog> -->
 
-        <el-dialog title="自定义薪资项" show-header="false" v-if="itemDialog" :visible.sync="itemDialog" :close-on-click-modal="false" customClass="customWidth" width="500px" top="20px">
+        <el-dialog :title="$t('Customizesalaryitems')" show-header="false" v-if="itemDialog" :visible.sync="itemDialog" :close-on-click-modal="false" customClass="customWidth" width="500px" top="20px">
             <div style="margin-left:30px;">
                 <!-- 111 -->
-            <p><el-input size="medium" v-model.trim="customCols.monthCost" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.monthCost" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.monthCost != null && customCols.monthCost != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.monthCostCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.monthCostCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.monthCostCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.monthCostCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.bonus" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.bonus" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.bonus != null && customCols.bonus != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.bonusCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.bonusCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.bonusCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.bonusCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.allowance" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.allowance" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.allowance != null && customCols.allowance != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.allowanceCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.allowanceCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.allowanceCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.allowanceCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.insuranceOld" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.insuranceOld" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.insuranceOld != null && customCols.insuranceOld != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.insuranceOldCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.insuranceOldCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.insuranceOldCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.insuranceOldCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.insuranceMedical" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.insuranceMedical" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.insuranceMedical != null && customCols.insuranceMedical != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.insuranceMedicalCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.insuranceMedicalCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.insuranceMedicalCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.insuranceMedicalCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.insuranceLosejob" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.insuranceLosejob" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.insuranceLosejob != null && customCols.insuranceLosejob != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.insuranceLosejobCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.insuranceLosejobCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.insuranceLosejobCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.insuranceLosejobCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.insuranceInjury" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.insuranceInjury" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.insuranceInjury != null && customCols.insuranceInjury != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.insuranceInjuryCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.insuranceInjuryCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.insuranceInjuryCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.insuranceInjuryCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.houseFund" placeholder="请输入自定义薪资项名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.houseFund" :placeholder="$t('Pleaseenteracustomsalaryitemname')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.houseFund != null && customCols.houseFund != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.houseFundCalculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.houseFundCalculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.houseFundCalculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.houseFundCalculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.field1" placeholder="请输入自定义薪资项1名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.field1" :placeholder="$t('Pleaseenterthenameofcustomsalaryitem1')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.field1 != null && customCols.field1 != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.field1Calculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.field1Calculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.field1Calculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.field1Calculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.field2" placeholder="请输入自定义薪资项2名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.field2" :placeholder="$t('Pleaseenterthenameofcustomsalaryitem2')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.field2 != null && customCols.field2 != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.field2Calculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.field2Calculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.field2Calculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.field2Calculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
-            <p><el-input size="medium" v-model.trim="customCols.field3" placeholder="请输入自定义薪资项3名称" style="width:200px;margin-right:20px" maxlength="8"></el-input>
+            <p><el-input size="medium" v-model.trim="customCols.field3" :placeholder="$t('Pleaseenterthenameofcustomsalaryitem3')" style="width:200px;margin-right:20px" maxlength="8"></el-input>
                 <template v-if="customCols.field3 != null && customCols.field3 != ''">
-                计入总成本
-                <el-radio size="medium" v-model="customCols.field3Calculate" :label="1" style="margin-right:10px;margin-left:10px"></el-radio>
-                <el-radio size="medium" v-model="customCols.field3Calculate" :label="0"></el-radio>
+                {{ $t('Addttotalcost') }} 
+                <el-radio size="medium" v-model="customCols.field3Calculate" :label="1" style="margin-right:10px;margin-left:10px">{{ $t('state.yes') }}</el-radio>
+                <el-radio size="medium" v-model="customCols.field3Calculate" :label="0">{{ $t('state.no') }}</el-radio>
                 </template>
             </p>
             </div>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="itemDialog = false" >关闭</el-button>
-                <el-button type="primary" @click="saveItems()" >保存</el-button>
+                <el-button type="primary" @click="itemDialog = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="saveItems()" >{{ $t('save') }}</el-button>
             </div>
         </el-dialog>
 
-        <el-dialog :title="date+'月 无项目工时人员分摊比例设置'" show-header="false" v-if="settingDialog" :visible.sync="settingDialog" 
+        <el-dialog :title="date+$t('weekDay.month')+' ' + $t('Noallocationratioofprojectworkinghoursisset')" show-header="false" v-if="settingDialog" :visible.sync="settingDialog" 
         :close-on-click-modal="false" customClass="customWidth" width="1200px">
             <div>
                 <div>
-                    <el-button :disabled="multipleSelection.length==0" @click="setPercent(true, null)">批量设置比例</el-button>
-                    <el-button :disabled="projectCols.length==0 || userCostSettingList.length == 0" @click="getLastMonthSetting">使用上月比例设置</el-button>
-                    <el-button @click="showSelectProjectDialog">{{date}} 月待分摊项目设置</el-button>
-                    <el-button @click="intoAmortizationRatio">导入分摊比例</el-button>
+                    <el-button :disabled="multipleSelection.length==0" @click="setPercent(true, null)">{{ $t('BatchSettingProportion') }}</el-button>
+                    <el-button :disabled="projectCols.length==0 || userCostSettingList.length == 0" @click="getLastMonthSetting">{{ $t('UselastmonthscaleSettings') }}</el-button>
+                    <!-- <el-button @click="showSelectProjectDialog">{{date}} 月待分摊项目设置</el-button> -->
+                    <el-button @click="showSelectProjectDialog">{{date}}{{ $t('Monthlyprojecttobeapportioned') }}</el-button>
+                    <el-button @click="intoAmortizationRatio">{{ $t('Importallocationratio') }}</el-button>
                 </div>
                 <el-table :data="userCostSettingList" highlight-current-row v-loading="costSettingLoading" 
                      ref="settingTable"  @selection-change="handleSelectionChange" 
                     :height="400" style="width: 100%;">
                     <el-table-column type="selection" width="55"></el-table-column>
-                    <el-table-column prop="name" label="姓名" sortable width="90" fixed="left"></el-table-column>
+                    <el-table-column prop="name" :label="$t('lable.name')" sortable width="90" fixed="left"></el-table-column>
                     
                     <el-table-column :label="item.projectName" v-for="(item) in projectCols" width="180" size="small"
                         :key="item.id" align="center">
@@ -418,88 +419,88 @@
                             <span>{{scope.row[item.projectId]}}</span>%
                         </template>
                     </el-table-column>
-                    <el-table-column label="设置比例"  width="80" fixed="right">
+                    <el-table-column :label="$t('Settheproportion')"  width="80" fixed="right">
                         <template slot-scope="scope">
-                            <el-button size="small" @click="setPercent(false,scope.row)">设置</el-button>
+                            <el-button size="small" @click="setPercent(false,scope.row)">{{ $t('setup') }}</el-button>
                         </template>
                     </el-table-column>
                 </el-table>
             </div>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="settingDialog = false" >关闭</el-button>
-                <el-button type="primary" @click="saveMonthSetting()" >保存</el-button>
+                <el-button type="primary" @click="settingDialog = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="saveMonthSetting()" >{{ $t('save') }}</el-button>
             </div>
         </el-dialog>
 
-        <el-dialog :title="date + '月待分摊项目选择'" show-header="false" v-if="projectsDialog" :visible.sync="projectsDialog" 
+        <el-dialog :title="date + $t('projectstobe assessed')" show-header="false" v-if="projectsDialog" :visible.sync="projectsDialog" 
             :close-on-click-modal="false" customClass="customWidth" width="1000px">
             <el-select v-model="chosenProjects" multiple filterable clearable style="width:100%">
                 <el-option v-for="item in allProjectList" :label="item.projectName" :key="item.id" :value="item.id"></el-option>
             </el-select>
-            <el-checkbox v-model="chosenProjectsChecked" @change="chosenProjectsCheckedClick" style="margin: 20px 0;">{{chosenProjectsChecked ? '取消选择全部项目' : '选中全部项目'}}</el-checkbox>
+            <el-checkbox v-model="chosenProjectsChecked" @change="chosenProjectsCheckedClick" style="margin: 20px 0;">{{chosenProjectsChecked ? $t('Deselectallitems') : $t('Selectallitems')}}</el-checkbox>
             <div slot="footer" class="dialog-footer">
-                <el-button type="default" @click="projectsDialog = false" >关闭</el-button>
-                <el-button type="primary" @click="saveProjectSetting()" >确定</el-button>
+                <el-button type="default" @click="projectsDialog = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="saveProjectSetting()" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
-        <el-dialog title="导入分摊比例数据" v-if="intoAmortizationDialog" :visible.sync="intoAmortizationDialog" customClass="customWidth" width="500px">
-            <p>1. 下载
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/员工项目分摊比例导入模板.xlsx" download="员工项目分摊比例导入模板.xlsx">员工项目分摊比例导入模板.xlsx</el-link>
+        <el-dialog title="$t('allocationdata')" v-if="intoAmortizationDialog" :visible.sync="intoAmortizationDialog" customClass="customWidth" width="500px">
+            <p>{{'1.' + $t('other.download')}}
+            <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/'+$t('allocationImporttemplates')+'.xlsx'" :download="$t('allocationImporttemplates') + '.xlsx'">{{$t('allocationImporttemplates')+'.xlsx'}}</el-link>
             </p>
-            <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p>
+            <p>{{'2.' + $t('other.projectsAndPeopleInThetemplate') }}</p>
             <p style="display: flex;justify-content: center;padding:1em 0">
                 <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+                <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting') }}</el-button>
             </el-upload>
             </p>
         </el-dialog>
-        <el-dialog title="设置员工成本各项目占比" show-header="false" v-if="setPercentDialog" :visible.sync="setPercentDialog" 
+        <el-dialog :title="$t('eachitemofemployeecost')" show-header="false" v-if="setPercentDialog" :visible.sync="setPercentDialog" 
             :close-on-click-modal="false" customClass="customWidth" width="600px" >
             <div style="margin:0px 10px 10px 10px;">
-                <span>选择员工</span>
+                <span>{{ $t('Selecttheemployee') }}</span>
                 <el-select v-model="chosenNoReportUserIds" multiple filterable clearable style="width:330px;" collapse-tags>
                         <el-option v-for="item in noReportUserList" :label="item.name" :key="item.id" :value="item.userId"></el-option>
                     </el-select>
-                    <el-button @click="averageCost" >自动分摊</el-button>
+                    <el-button @click="averageCost" >{{ $t('Automaticallocation') }}</el-button>
             </div>
             <el-divider ></el-divider>
             <!--项目列表 -->
             <el-form v-model="curPercentVal" label-width="365px" style="margin-top:10px;">
                 <div class="nameList">
                     <el-form-item v-for="item in projectCols" :label="item.projectName" :key="item.projectId" >
-                        占比: <el-input v-model="curPercentVal[item.projectId]" style="width:100px;" @input="updatePercentValue"></el-input>&nbsp;%
+                        {{ $t('Accountedfor') + ':' }}<el-input v-model="curPercentVal[item.projectId]" style="width:100px;" @input="updatePercentValue"></el-input>&nbsp;%
                     </el-form-item>
                 </div>
                 <el-form-item >
-                    总比例: {{totalPercent}}&nbsp;%
+                    {{ $t('totalpercentage') + ':' }}{{totalPercent}}&nbsp;%
                 </el-form-item>
             </el-form>
             
             <div slot="footer" class="dialog-footer">
-                <el-button type="default" @click="setPercentDialog = false" >关闭</el-button>
-                <el-button type="primary" @click="setPercentSetting()" >确定</el-button>
+                <el-button type="default" @click="setPercentDialog = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="setPercentSetting()" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
         <!-- 导入结果说明 -->
-        <el-dialog title="分摊比例导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('importingtheallocationratio')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
             <div>
                 <span>{{importResultMsg}}</span>
                 
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+                <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
 
-        <el-dialog title="分摊数据导出" v-if="exportFinanceDialog" :visible.sync="exportFinanceDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('AmortizedDataExport')" v-if="exportFinanceDialog" :visible.sync="exportFinanceDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div style="margin:30px;">
             <el-radio-group v-model="groupByCategory" >
-                <el-radio :label="0">按项目导出</el-radio>
-                <el-radio :label="1">按项目分类导出</el-radio>
+                <el-radio :label="0">{{ $t('Exportbyproject') }}</el-radio>
+                <el-radio :label="1">{{ $t('Exportbprojectcategory') }}</el-radio>
             </el-radio-group>
             </div>
             <div slot="footer" class="dialog-footer">
-                <el-button @click="exportData" :loading="exportDataProcessing" type="primary">导出</el-button>
+                <el-button @click="exportData" :loading="exportDataProcessing" type="primary">{{ $t('export.export') }}</el-button>
             </div>
         </el-dialog>
     </section>
@@ -546,7 +547,7 @@ import { error } from 'dingtalk-jsapi';
                 multipleSelection:[],
                 userCostSettingList: [],
                 settingDialog: false,
-                radio:"全部人员",
+                radio:this.$t('lable.allStaff'),
                 noReportUserList:[],
                 allFinanceList:[],
                 assignNoProUser: false,
@@ -614,9 +615,9 @@ import { error } from 'dingtalk-jsapi';
                 // console.log(sel);
             },
             deleteUsers(){
-                this.$confirm('是否确认删除?','提示',{
-                    confirmButtonText: '确认',
-                    cancelButtonText: '取消',
+                this.$confirm(this.$t(this.$t('doyouwanttodeleteit')),this.$t('other.prompts'),{
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: 'warning'
                 }).then(()=>{
                     let ids = ''
@@ -630,7 +631,7 @@ import { error } from 'dingtalk-jsapi';
                         if(res.code == 'ok'){
                             this.getList()
                             this.$message({
-                                message: '删除成功',
+                                message: this.$t('message.successfullyDeleted'),
                                 type: 'success'
                             })
                             
@@ -649,7 +650,7 @@ import { error } from 'dingtalk-jsapi';
                 }).catch(()=>{
                     this.$message({
                         type: 'info',
-                        message: '已取消删除'
+                        message: this.$t('thedeletionhasbeencancelled')
                     })
                 })
                 
@@ -661,7 +662,7 @@ import { error } from 'dingtalk-jsapi';
                 },res =>{
                     this.isUploading = false;
                     if(res.code == 'ok') {
-                        this.downloadByA({name:this.exportMonth+'财务数据.xls', url: res.data});
+                        this.downloadByA({name:this.exportMonth+this.$t('financialdata') + '.xls', url: res.data});
                     }
                 },error => {
                     this.$message({
@@ -717,13 +718,13 @@ import { error } from 'dingtalk-jsapi';
                         res =>{
                             if(res.code == 'ok') {
                                 this.$message({
-                                    message: '操作成功',
+                                    message: this.$t('operationissuccessful'),
                                     type: "success"
                                 });
                                 this.addreviewer()
                             } else {
                                 this.$message({
-                                    message: '操作失败',
+                                    message: this.$t('operationfailure'),
                                     type: "error"
                                 });
                             }
@@ -746,7 +747,7 @@ import { error } from 'dingtalk-jsapi';
             },
             // 审核
             audits() {
-                this.shenhe = '导入审核'
+                this.shenhe = this.$t('importtheaudits')
                 this.importVisible = true
             },
             switchCostList() {
@@ -844,17 +845,17 @@ import { error } from 'dingtalk-jsapi';
                 });
                 if (errorList.length > 0) {
                     var nameList = errorList.map(e=>e.name);
-                    this.$message({type:'error', message:'存在人员分配比例非100%: '+nameList});
+                    this.$message({type:'error', message:this.$t('proportionofassignedpersonnelisnot ')+'100%:'+nameList});
                     return;
                 }
                 this.http.post('/project-percentage/saveMonthSetting', {projectCols: JSON.stringify(this.projectCols),
                             ymonth: this.date, userSettings: JSON.stringify(this.userCostSettingList)},
                     res => {
                         if (res.code == "ok") {
-                            this.$message({type:'success', message:'保存成功'});
+                            this.$message({type:'success', message:this.$t('savesuccess')});
                             this.settingDialog = false;
                         } else {
-                            this.$message({type:'error', message:'发生错误:'+res.msg});
+                            this.$message({type:'error', message:this.$t('erroroccurred')+':'+res.msg});
                         }});
             },
             updatePercentValue() {
@@ -928,7 +929,7 @@ import { error } from 'dingtalk-jsapi';
                 //检测是否填写的情况下,是否达到100%
                 if (this.totalPercent != 100) {
                     this.$message({
-                            message: '分配比例之和必须是100%',
+                            message: this.$t('sumoftheallocationsmustbe'),
                             type: "error"
                             });
                     return;
@@ -954,7 +955,7 @@ import { error } from 'dingtalk-jsapi';
                 this.multipleSelection = val;
             },
             switchList() {
-                if (this.radio == '全部人员') {
+                if (this.radio == this.$t('lable.allStaff')) {
                     this.list = this.allFinanceList;
                 } else {
                     this.list = this.noReportUserList;
@@ -973,9 +974,9 @@ import { error } from 'dingtalk-jsapi';
                     res => {
                         if (res.code == "ok") {
                             if (res.data.indexOf('xlsx') > 0) {
-                                this.downloadByA({name:'财务成本报表.xlsx', url:res.data});
+                                this.downloadByA({name:this.$t('financialcoststatement')+ '.xlsx', url:res.data});
                             } else {
-                                this.downloadByA({name:'财务成本报表.xls', url:res.data});
+                                this.downloadByA({name:this.$t('financialcoststatement')+ '.xls', url:res.data});
                             }
                         }});
                
@@ -997,7 +998,7 @@ import { error } from 'dingtalk-jsapi';
             if(this.customCols.field1 != null && this.customCols.field1 != ''){
                 if(this.customCols.field1Calculate == null){
                     this.$message({
-                        message: '请选择是否计入总成本',
+                        message: this.$t('choosewhethertoincludethetotalcost'),
                         type: 'warning'
                     })
                     return
@@ -1006,7 +1007,7 @@ import { error } from 'dingtalk-jsapi';
             if(this.customCols.field2 != null && this.customCols.field2 != ''){
                 if(this.customCols.field1Calculate == null){
                     this.$message({
-                        message: '请选择是否计入总成本',
+                        message: this.$t('choosewhethertoincludethetotalcost'),
                         type: 'warning'
                     })
                     return
@@ -1015,7 +1016,7 @@ import { error } from 'dingtalk-jsapi';
             if(this.customCols.field3 != null && this.customCols.field3 != ''){
                 if(this.customCols.field1Calculate == null){
                     this.$message({
-                        message: '请选择是否计入总成本',
+                        message: this.$t('choosewhethertoincludethetotalcost'),
                         type: 'warning'
                     })
                     return
@@ -1148,9 +1149,9 @@ import { error } from 'dingtalk-jsapi';
                         _this.myChart = myChart;
                         var option = {
                             title: {
-                                text: this.assignNoProUser?'成本总计 ' + totalMoneyCost + '元'
-                                    +(this.hasNoProjectUsers?",含无项目人员成本 " + nopCost+"元 ":"")
-                                    :'成本总计 ' + totalMoneyCost + '元',
+                                text: this.assignNoProUser?this.$t('costintotal') + totalMoneyCost + this.$t('yuan')
+                                    +(this.hasNoProjectUsers?","+$t('projectpersonnelcostincluded') + nopCost+this.$t('yuan'):"")
+                                    :this.$t('costintotal') + totalMoneyCost + this.$t('yuan'),
                                 left:'left',
                             },
                             grid : {
@@ -1179,8 +1180,8 @@ import { error } from 'dingtalk-jsapi';
                             tooltip:{
                                 trigger:'axis',
                                 formatter: function (params,ticket,callback) {
-                                    var res = params[0].name + "<br/>工作成本"+" : " + params[0].data.value 
-                                    + "元 <br/>工作时长"+" : " + params[0].data.time + "小时";
+                                    var res = params[0].name + "<br/>"+this.$t('workcost')+" : " + params[0].data.value 
+                                    + this.$t('yuan')+"<br/>"+this.$t('screening.workTime')+" : " + params[0].data.time + this.$t('time.hour');
                                     _this.params = params;
                                     return res;
                                 }
@@ -1194,11 +1195,11 @@ import { error } from 'dingtalk-jsapi';
                             yAxis: [{
                                 type : 'value',
                                 axisLabel: {
-                                    formatter:'{value} ()'
+                                    formatter:'{value} ('+this.$t('yuan')+')'
                                 }
                             }],
                             series: [{
-                                name: '工作时长(h)',
+                                name: this.$t('screening.workTime')+'(h)',
                                 type: 'bar',
                                 barMaxWidth: 30,
                                 data: yList,
@@ -1239,7 +1240,7 @@ import { error } from 'dingtalk-jsapi';
                     if (res.code == "ok") {
                         this.exportFinanceDialog = false;
                         var aTag = document.createElement('a');
-                        aTag.download = "财务成本统计.xls";
+                        aTag.download = this.$t('financialcoststatisticss')+".xls";
                         aTag.href = res.data;
                         aTag.click();
                     } else {
@@ -1262,7 +1263,7 @@ import { error } from 'dingtalk-jsapi';
                 const sums = [];
                 columns.forEach((column, index) => {
                 if (index === 0) {
-                    sums[index] = '总价';
+                    sums[index] = this.$t('zongjia');
                     return;
                 }
                 if (index === 1 || index === 2){
@@ -1279,7 +1280,7 @@ import { error } from 'dingtalk-jsapi';
                         return prev;
                     }
                     }, 0);
-                    sums[index] += ' 元';
+                    sums[index] += this.$t('yuan');
                 } else {
                     sums[index] = 'N/A';
                 }
@@ -1300,7 +1301,7 @@ import { error } from 'dingtalk-jsapi';
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -1328,13 +1329,13 @@ import { error } from 'dingtalk-jsapi';
                         if (res.code == "ok") {
                             if (this.user.timeType.financeAudit == 1 ) {
                                 this.$message({
-                                    message: '导入成功,请等待审核',
+                                    message: this.$t('waiforverification'),
                                     type: "warning"
                                 });
                                 this.getMonths();
                             } else {
                                 this.$message({
-                                    message: '导入成功',
+                                    message: this.$t('other.importSuccess'),
                                     type: "success"
                                 });
                             }
@@ -1397,7 +1398,7 @@ import { error } from 'dingtalk-jsapi';
                         this.allFinanceList = list;
                         
                         this.noReportUserList = list.filter(r=>r.hasReport == 0);
-                        if(this.radio == '全部人员'){
+                        if(this.radio == this.$t('lable.allStaff')){
                             this.list = this.allFinanceList;
                         }else{
                             this.list = this.noReportUserList
@@ -1431,16 +1432,16 @@ import { error } from 'dingtalk-jsapi';
                         // console.log(res.data, '审核状态')
                         if(res.data) {
                             if(res.data.state == '0') {
-                                this.revaelse = '待审核'
+                                this.revaelse = this.$t('state.WaitingAudit')
                                 this.tabPosition = '0'
                             } else if(res.data.state == '1') {
-                                this.revaelse = '审核记录'
+                                this.revaelse = this.$t('Auditrecords')
                                 this.tabPosition = '1'
                             }else if (res.data.state == '2') {
-                                this.revaelse = '已驳回'
+                                this.revaelse = this.$t('state.rejected')
                                 this.tabPosition = '2'
                             } else if (res.data.state == '3') {
-                                this.revaelse = '已撤销'
+                                this.revaelse = this.$t('state.undone')
                                 this.tabPosition = '-1'
                             }
                             this.getReviewList()
@@ -1526,7 +1527,7 @@ import { error } from 'dingtalk-jsapi';
                 res => {
                     if (res.code == "ok") {
                        this.$message({
-                            message: '操作成功',
+                            message: this.$t('operationissuccessful'),
                             type: "success"
                         });
                         this.getReviewList()
@@ -1579,7 +1580,7 @@ import { error } from 'dingtalk-jsapi';
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -1595,10 +1596,10 @@ import { error } from 'dingtalk-jsapi';
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "成功导入"+res.data+"条分摊比例数据。"+(res.msg?res.msg:"");
+                            this.importResultMsg = this.$t('other.importSuccess')+res.data+this.$t('apportionmentratiodata')+'。'+(res.msg?res.msg:"");
                             this.showSettingDialog();
                         } else {
-                            this.importResultMsg = "导入失败:"+res.msg;
+                            this.importResultMsg = this.$t('export.Importfailure')+":"+res.msg;
                         }
                     },
                     error => {

Diff do ficheiro suprimidas por serem muito extensas
+ 406 - 402
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue


Diff do ficheiro suprimidas por serem muito extensas
+ 238 - 237
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue


+ 86 - 85
fhKeeper/formulahousekeeper/timesheet/src/views/provider/provider.vue

@@ -3,21 +3,21 @@
         <!--工具条-->
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
-                <el-form-item label="供应商列表">
+                <el-form-item :label="$t('listofSuppliers')">
                     
                 </el-form-item>
                 <el-form-item >
                     <div>
-                    <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入供应商名称关键字" clearable="true" @clear="getList()">
+                    <el-input style="float:left;" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterthevendornamekeyword')" clearable="true" @clear="getList()">
                         <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button>
                     </el-input>
                     </div>
                 </el-form-item>
                 <el-form-item style="float:right;">
-                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)" style="margin-right: 10px">新增供应商</el-link>
-                    <el-link type="primary" :underline="false" @click="intocustomerRatio" style="margin-right: 10px">批量导入供应商</el-link>
-                    <el-link type="primary" :underline="false" @click="exportProjectData" style="margin-right: 10px">导出供应商</el-link>
-                    <el-link type="primary" :underline="false" @click="showClfDialog = true">分类管理</el-link>
+                    <el-link type="primary" :underline="false" @click="handleAdd(-1,null)" style="margin-right: 10px">{{ $t('newsuppliers') }}</el-link>
+                    <el-link type="primary" :underline="false" @click="intocustomerRatio" style="margin-right: 10px">{{ $t('importsuppliersinbatches') }}</el-link>
+                    <el-link type="primary" :underline="false" @click="exportProjectData" style="margin-right: 10px">{{ $t('exportSupplier') }}</el-link>
+                    <el-link type="primary" :underline="false" @click="showClfDialog = true">{{ $t('classificationmanagement') }}</el-link>
                 </el-form-item>
             </el-form>
         </el-col>
@@ -29,26 +29,26 @@
                         {{scope.$index+1+(page-1)*size}}
                     </template> -->
             </el-table-column>
-            <el-table-column prop="providerCode" label="供应商编号"  width="200" sortable="custom"></el-table-column>
-            <el-table-column prop="providerName" label="供应商名称" width="200" sortable="custom"></el-table-column>
-            <el-table-column prop="providerCategoryName" label="供应商分类" width="200" sortable="custom"></el-table-column>
-            <el-table-column prop="contactName" label="联系人"  width="120"></el-table-column>
-            <el-table-column prop="contactPhone" label="联系电话"  width="150"></el-table-column>
-            <el-table-column prop="email" label="邮箱"  width="180"></el-table-column>
-            <el-table-column prop="address" label="地址" width="200"></el-table-column>
-            <!-- <el-table-column prop="remark" label="备注" width="300"></el-table-column> -->
+            <el-table-column prop="providerCode" :label="$t('supplierNo')"  width="200" sortable="custom"></el-table-column>
+            <el-table-column prop="providerName" :label="$t('namsupplier')" width="200" sortable="custom"></el-table-column>
+            <el-table-column prop="providerCategoryName" :label="$t('classificationSuppliers')" width="200" sortable="custom"></el-table-column>
+            <el-table-column prop="contactName" :label="$t('contact')"  width="120"></el-table-column>
+            <el-table-column prop="contactPhone" :label="$t('contactphonenumber')"  width="150"></el-table-column>
+            <el-table-column prop="email" :label="$t('email')"  width="180"></el-table-column>
+            <el-table-column prop="address" :label="$t('address')" width="200"></el-table-column>
+            <!-- <el-table-column prop="remark" :label="备注" width="300"></el-table-column> -->
             
-            <el-table-column label="操作" width="150" fixed="right">
+            <el-table-column :label="$t('operation')" width="150" fixed="right">
                 <template slot-scope="scope">
-                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">编辑</el-button>
-                    <el-button size="mini"  @click="deletePro(scope.$index, scope.row)">删除</el-button>
+                    <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="mini"  @click="deletePro(scope.$index, scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
 
         <!--工具条-->
         <el-col :span="24" class="toolbar">
-            <el-button type="primary" size="small" @click="batchDelete" :loading="delLoading">批量删除</el-button>
+            <el-button type="primary" size="small" @click="batchDelete" :loading="delLoading">{{ $t('Batchdelete') }}</el-button>
             <el-pagination
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
@@ -63,93 +63,93 @@
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="800px">
             <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
-                <el-form-item label="供应商编号" >
-                    <el-input v-model="addForm.providerCode" :max="20" placeholder="请输入供应商编号" clearable></el-input>
+                <el-form-item :label="$t('supplierNo')" >
+                    <el-input v-model="addForm.providerCode" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="供应商名称" prop="providerName">
-                    <el-input v-model="addForm.providerName" :max="20" placeholder="请输入供应商名称" clearable></el-input>
+                <el-form-item :label="$t('namsupplier')" prop="providerName">
+                    <el-input v-model="addForm.providerName" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="供应商分类" prop="providerCategoryId">
-                    <el-select v-model="addForm.providerCategoryId" filterable placeholder="请选择供应商分类" clearable @change="supplierChange">
-                        <el-option v-for="item in baseClfList" :key="item.id" :label="item.providerCategoryName" :value="item.id"></el-option>
+                <el-form-item :label="$t('classificationSuppliers')" prop="providerCategoryId">
+                    <el-select v-model="addForm.providerCategoryId" filterable :placeholder="$t('defaultText.pleaseChoose')" clearable @change="supplierChange">
+                        <el-option v-for="item in baseClfList" :key="item.id" ::label="item.providerCategoryName" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="联系人" prop="contactName">
-                    <el-input v-model="addForm.contactName" :max="20" placeholder="请输入供应商联系人" clearable></el-input>
+                <el-form-item :label="$t('contact')" prop="contactName">
+                    <el-input v-model="addForm.contactName" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="联系电话" prop="contactPhone">
-                    <el-input v-model="addForm.contactPhone" :max="20" placeholder="请输入供应商联系电话" clearable></el-input>
+                <el-form-item :label="$t('contactphonenumber')" prop="contactPhone">
+                    <el-input v-model="addForm.contactPhone" :max="20" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="邮箱" prop="email">
-                    <el-input v-model="addForm.email" :max="25" placeholder="请输入供应商邮箱" clearable></el-input>
+                <el-form-item :label="$t('email')" prop="email">
+                    <el-input v-model="addForm.email" :max="25" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="地址" prop="address">
-                    <el-input v-model="addForm.address" :max="50"  placeholder="请输入供应商联系地址" clearable></el-input>
+                <el-form-item :label="$t('address')" prop="address">
+                    <el-input v-model="addForm.address" :max="50"  :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="备注" prop="remark ">
-                    <el-input type="textarea" :rows="4" v-model="addForm.remark " maxlength="1000" show-word-limit placeholder="请输入备注" clearable></el-input>
+                <el-form-item :label="$t('bei-zhu')" prop="remark ">
+                    <el-input type="textarea" :rows="4" v-model="addForm.remark " maxlength="1000" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
 
             </el-form>
             <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
          <!-- 导入结果说明 -->
-        <el-dialog title="分摊比例导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('importingtheallocationratio')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
             <div>
                 <span>{{importResultMsg}}</span>
                 
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+                <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
-         <el-dialog title="导入供应商数据" v-if="intocustomerDialog" :visible.sync="intocustomerDialog" customClass="customWidth" width="500px">
-            <p>1. 下载
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/供应商导入模板.xlsx" download="供应商导入模板.xlsx">供应商导入模板.xlsx</el-link>
+         <el-dialog :title="$t('importsupplierdata')" v-if="intocustomerDialog" :visible.sync="intocustomerDialog" customClass="customWidth" width="500px">
+            <p>1. {{ $t('other.download') }}
+            <el-link type="primary" style="margin-left:5px;" :underline="false" :href="'./upload/'+$t('supplierimporttemplate')+'.xlsx'" :download="$t('supplierimporttemplate')+'.xlsx'">{{$t('supplierimporttemplate')}}.xlsx</el-link>
             </p>
             <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
             <p style="display: flex;justify-content: center;padding:1em 0">
                 <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+                <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting') }}</el-button>
             </el-upload>
             </p>
         </el-dialog>
 
         <!-- 分类管理 -->
-        <el-dialog title="供应商分类条目管理" show-header="false" v-if="showClfDialog" :visible.sync="showClfDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('supplierclassificationentrymanagement')" show-header="false" v-if="showClfDialog" :visible.sync="showClfDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="baseClfList" highlight-current-row  height="400" style="width: 100%;">
-            <el-table-column type="index" width="60" label="序号">
+            <el-table-column type="index" width="60" :label="$t('headerTop.serialNumber')">
                 <template slot-scope="scope" >
                         {{scope.$index+1+(page-1)*size}}
                     </template>
             </el-table-column>
-            <el-table-column prop="providerCategoryName" label="名称" ></el-table-column>
-            <el-table-column label="操作" width="150">
+            <el-table-column prop="providerCategoryName" :label="$t('names')" ></el-table-column>
+            <el-table-column :label="$t('operation')" width="150">
                 <template slot-scope="scope" >
-                    <el-button size="small" type="primary" @click="addNewClf(scope.row)">编辑</el-button>
-                    <el-button size="small" type="danger" @click="deleteClf(scope.row)">删除</el-button>
+                    <el-button size="small" type="primary" @click="addNewClf(scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="small" type="danger" @click="deleteClf(scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
 
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showClfDialog = false" >关闭</el-button>
-                <el-button type="primary" @click="addNewClf()" >新增分类项</el-button>
+                <el-button type="primary" @click="showClfDialog = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="addNewClf()" >{{ $t('newCategoryItem') }}</el-button>
             </div>
         </el-dialog>
         <!-- 新增/编辑 分类条目 -->
-        <el-dialog title="新增/修改分类条目" v-if="addClfDialog" :visible.sync="addClfDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('addmodifycategoryentry')" v-if="addClfDialog" :visible.sync="addClfDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="form2" :model="addClf" :rules="rules" label-width="100px">
-                <el-form-item label="供应商名称" prop="name">
-                    <el-input v-model="addClf.providerCategoryName" placeholder="请输入主项目名称" clearable></el-input>
+                <el-form-item :label="$t('namsupplier')" prop="name">
+                    <el-input v-model="addClf.providerCategoryName" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addClfDialog = false">取消</el-button>
-                <el-button type="primary" @click="submitClf" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addClfDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitClf" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
     </section>
@@ -173,10 +173,10 @@
     export default {
         data() {
             return {
-                roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员"],
+                roleArray:[this.$t('role.ordinaryEmployees'),this.$t('role.superAdministrator'), this.$t('role.systemAdministrator'), this.$t('role.companyTop'),this.$t('role.financialAdministrator'), this.$t('role.projectManager')],
                 status:null,
-                statusTxt:["-","进行中","已完成","已撤销"],
-                importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
+                statusTxt:["-",this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
+                importanceList:[{id:1,label:this.$t('zheng-chang')},{id:2,label:this.$t('jin-ji')},{id:3,label:this.$t('zhong-yao')},{id:4,label:this.$t('zhong-yao-qie-jin-ji')}],
                 searchField:null,
                 keyword:null,
                 user: JSON.parse(sessionStorage.getItem("user")),
@@ -205,7 +205,7 @@
                     level:1,
                 },
                 rules: {
-                    providerName: [{ required: true, message: "请输入供应商名称", trigger: "blur" }],
+                    providerName: [{ required: true, message: this.$t('peaseenterthe'), trigger: "blur" }],
                 },
                 intocustomerDialog:false,
                 importingData: false,
@@ -250,8 +250,9 @@
                 res => {
                     if (res.code == "ok") {
                         var filePath = res.data;
+                        let arr = this.$t('gong-ying-shang-dao-chu')
                         const a = document.createElement('a'); // 创建a标签
-                        a.setAttribute('download', '供应商导出.xls');// download属性
+                        a.setAttribute('download', this.$t('gong-ying-shang-dao-chu') + '.xls');// download属性
                         a.setAttribute('href', filePath);// href链接
                         a.click(); //自执行点击事件
                         a.remove();
@@ -284,9 +285,9 @@
             },
             // 删除分类条目
             deleteClf(row) {
-                this.$confirm("该操作可能造成已有数据丢失,确定要删除吗?","删除分类条目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('operationmaycausedatalossAreyousuredeletethedata'),this.$t('btn.delete'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -298,7 +299,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.getClfConfigList();
@@ -383,7 +384,7 @@
             },
             batchDelete(){
                 if(this.selectArr.length == 0){
-                    this.$message('请选择要删除的供应商数据')
+                    this.$message(this.$t('selectthevendordatyouwanttodelete'))
                     return
                 }else{
                     let nametext = ''
@@ -391,9 +392,9 @@
                         nametext += this.selectArr[i].providerName + '、'
                     }
                     nametext = nametext.substring(0,nametext.length - 1)
-                    this.$confirm("确定要批量删除供应商:" + nametext + "\u3000吗?","删除供应商", {
-                        confirmButtonText: "确定",
-                        cancelButtonText: "取消",
+                    this.$confirm(this.$t('determinethatyouwanttodeletevendorsinbulk')+":" + nametext + "\u3000"+ this.$t('ma'),this.$t('deletesupplier'), {
+                        confirmButtonText: this.$t('btn.determine'),
+                        cancelButtonText: this.$t('btn.cancel'),
                         type: "warning"
                     }).then(()=>{
                         this.delLoading = true
@@ -408,7 +409,7 @@
                             this.delLoading = false
                             if(res.code == 'ok'){
                                 this.$message({
-                                    message: '删除成功',
+                                    message: this.$t('message.successfullyDeleted'),
                                     type: 'success'
                                 })
                                 this.getList()
@@ -438,7 +439,7 @@
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -452,10 +453,10 @@
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = "成功导入/更新"+res.data+"条供应商数据。"+(res.msg?res.msg:"");
+                            this.importResultMsg = this.$t('importedupdatedsuccessfully')+res.data+this.$t('barsupplierdata')+"。"+(res.msg?res.msg:"");
                             this.getList();
                         } else {
-                            this.importResultMsg = "导入失败:"+res.msg;
+                            this.importResultMsg = this.$t('export.Importfailure')+":"+res.msg;
                         }
                     },
                     error => {
@@ -474,7 +475,7 @@
                 let format = str[str.length - 1];
                 if (format != "xls" && format != "xlsx") {
                     this.$message({
-                        message: "请选择.xls或.xlsx文件",
+                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
                         type: "error"
                     });
                 } else {
@@ -488,7 +489,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "导入成功",
+                                message: this.$t('other.importSuccess'),
                                 type: "success"
                             });
                             this.getList();
@@ -514,9 +515,9 @@
         //         this.addForm.budget = this.addForm.budget.replace('.','');
           },
             deleteSubPro(subProject) {
-                this.$confirm("确定要删除子项目" + subProject.name + "吗?","删除子项目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makesuretodeletethesubproject') + subProject.name + this.$t('ma'),this.$t('deletesubproject'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -528,7 +529,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.subProject(this.currentProject);
@@ -672,11 +673,11 @@
             //显示新增界面
             handleAdd(i, item) {
                 if(i == -1) {
-                    this.title = "新增供应商";
+                    this.title = this.$t('newsuppliers');
                     this.addForm = {
                     }
                 } else {
-                    this.title = "修改供应商";
+                    this.title = this.$t('modifysupplier');
                     this.addForm = JSON.parse(JSON.stringify(item));
                 }
                 this.addFormVisible = true;
@@ -712,9 +713,9 @@
 
             // 删除
             deletePro(i, item) {
-                this.$confirm("确定要删除供应商" + item.providerName + "吗?","删除供应商", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makesuretoremovethevendor') + item.providerName + this.$t('ma'),this.$t('deletesupplier'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -726,7 +727,7 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.getList();

+ 34 - 34
fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue

@@ -3,37 +3,37 @@
       <!-- 表头 -->
       <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
           <el-form :inline="true" style="width: 87%">
-              <el-form-item label="角色权限">
+              <el-form-item :label="$t('roleauthorization')">
               </el-form-item>
               <el-form-item >
                   <div>
-                  <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入关键字查询" clearable="true">
+                  <el-input style="float:left;" v-model="keyword" class="input-with-select" :placeholder="$t('pleaseenterakeyworforquery')" clearable="true">
                       <el-button slot="append"  @click="mohu" @clear="mohus" icon="el-icon-search"></el-button>
                   </el-input>
                   </div>
               </el-form-item>
               <el-form-item style="float: right">
-                  <el-link type="primary" :underline="false" @click="handleAdd('添加角色', '立即添加')">添加角色</el-link>
-                  <el-link type="primary" :underline="false" @click="modify()" style="margin-left: 20px;">修改默认角色</el-link>
+                  <el-link type="primary" :underline="false" @click="handleAdd($t('addingroles'), $t('Immediatelyadd'))">{{ $t('addingroles') }}</el-link>
+                  <el-link type="primary" :underline="false" @click="modify()" style="margin-left: 20px;">{{ $t('modifyingDefaultRole') }}</el-link>
                   <!-- <el-link type="primary" :underline="false" @click="exportAuthority()" style="margin-left:20px">导出所有权限</el-link> -->
               </el-form-item>
           </el-form>
       </el-col>
       <!-- 表格 -->
       <el-table :data="tableData" style="width: 100%" height="615">
-        <el-table-column prop="rolename" label="角色" align="center">
+        <el-table-column prop="rolename" :label="$t('jiao-se')" align="center">
             <template slot-scope="scope">
-              {{scope.row.rolename}} <span v-if="scope.row.isDefault == 1" style="color: #909399;"> - (默认角色)</span>
+              {{scope.row.rolename}} <span v-if="scope.row.isDefault == 1" style="color: #909399;"> {{ $t('mo-ren-jiao-se') }}</span>
             </template>
         </el-table-column>
-        <el-table-column prop="roleDescribe" label="描述"></el-table-column>
-        <el-table-column prop="date" label="操作">
+        <el-table-column prop="roleDescribe" :label="$t('other.describe')"></el-table-column>
+        <el-table-column prop="date" :label="$t('operation')">
             <template slot-scope="scope">
                 <div>
-                    <el-button size="small" @click="handleAdd('编辑角色', '立即修改', scope.row)" :style="scope.row.rolename != '超级管理员' ? '' : 'visibility:hidden;'">编辑角色</el-button>
-                    <el-button type="primary" size="small" @click="shisha(scope.row.id), roleName = scope.row.rolename" v-if="scope.row.rolename !='超级管理员' || (scope.row.rolename =='超级管理员' && user.roleName == '超级管理员')">分配权限</el-button>
-                    <el-button size="small" @click="exportAuthority(scope.row)" >导出权限</el-button>
-                    <el-button type="danger" size="small" @click="deteHand(scope.row)" v-if="scope.row.rolename != '超级管理员'">删除</el-button>
+                    <el-button size="small" @click="handleAdd($t('editingtherole'), $t('Immediatelychange'), scope.row)" :style="scope.row.rolename != $t('role.superAdministrator') ? '' : 'visibility:hidden;'">{{ $t('editingtherole') }}</el-button>
+                    <el-button type="primary" size="small" @click="shisha(scope.row.id), roleName = scope.row.rolename" v-if="scope.row.rolename !=$t('role.superAdministrator') || (scope.row.rolename ==$t('role.superAdministrator') && user.roleName == $t('role.superAdministrator'))">{{ $t('assignpermissions') }}</el-button>
+                    <el-button size="small" @click="exportAuthority(scope.row)" >{{ $t('exportpermission') }}</el-button>
+                    <el-button type="danger" size="small" @click="deteHand(scope.row)" v-if="scope.row.rolename != $t('role.superAdministrator')">{{ $t('btn.delete') }}</el-button>
                 </div>
             </template>
         </el-table-column>
@@ -51,7 +51,7 @@
             ></el-pagination>
         </el-col> -->
         <!-- 分配权限弹窗 -->
-        <el-dialog :title="'分配权限 - '+roleName" :visible.sync="dialogVisible" width="764px" :before-close="handleClose">
+        <el-dialog :title="$t('assignpermissions') +' - '+roleName" :visible.sync="dialogVisible" width="764px" :before-close="handleClose">
             <div class="quanxians">
                 <!-- <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input> -->
                 <!-- <el-tree :data="data" show-checkbox node-key="id" :filter-node-method="filterNode" ref="tree" :default-expanded-keys="[2, 3]" :default-checked-keys="[5]" :props="defaultProps"> </el-tree> -->
@@ -75,7 +75,7 @@
                       <ul v-if="mainMenu.children && mainMenu.useState">
                         <li v-for="subMenu in mainMenu.children" :key="subMenu.id">
                         <el-checkbox :label="subMenu.name" name="type" v-model="subMenu.checked" style="font-weight:bold;" @change="subChange(subMenu)"></el-checkbox>
-                            <span v-if="subMenu.functionList && subMenu.functionList.length > 0" style="margin-right:10px;margin-left:10px;">(功能:  
+                            <span v-if="subMenu.functionList && subMenu.functionList.length > 0" style="margin-right:10px;margin-left:10px;">({{ $t('gong-neng') }} :
                               <el-checkbox v-for="fun in subMenu.functionList" :key="fun.id" :label="fun.name" name="type" v-model="fun.checked" @change="funChange(fun)"></el-checkbox>)</span>
                         </li>
                       </ul>
@@ -85,39 +85,39 @@
                 </el-form>
             </div>
             <span slot="footer" class="dialog-footer">
-              <el-button type="primary" @click="saveList()">保存</el-button>
+              <el-button type="primary" @click="saveList()">{{ $t('save') }}</el-button>
             </span>
         </el-dialog>
         <!-- 添加角色弹窗 -->
         <el-dialog :title="titles" :visible.sync="addDialogVisible" width="600px" :before-close="handleClose">
             <div>
                 <el-form ref="form" :rules="rules" :model="form" label-width="80px">
-                    <el-form-item label="角色名称" prop="rolename">
+                    <el-form-item :label="$t('charactername')" prop="rolename">
                         <el-input v-model="form.rolename" clearable></el-input>
                     </el-form-item>
-                    <el-form-item label="描述">
+                    <el-form-item :label="$t('other.describe')">
                         <el-input type="textarea" v-model="form.roleDescribe" maxlength="25" show-word-limit clearable></el-input>
                     </el-form-item>
                     <el-form-item>
-                        <el-button style="float: right" type="primary" @click="onSubmit('form')">确定</el-button>
+                        <el-button style="float: right" type="primary" @click="onSubmit('form')">{{ $t('btn.determine') }}</el-button>
                     </el-form-item>
                 </el-form>
             </div>
         </el-dialog>
         <!-- 修改默认角色弹窗 -->
-        <el-dialog title="默认角色" :visible.sync="defaultRole" width="400px" :before-close="handleClose">
+        <el-dialog :title="$t('defaultrole')" :visible.sync="defaultRole" width="400px" :before-close="handleClose">
             <div>
               <el-form label-width="80px">
-                <el-form-item label="默认角色">
-                  <el-select v-model="roleId" placeholder="请选择默认角色">
+                <el-form-item :label="$t('defaultrole')">
+                  <el-select v-model="roleId" :placeholder="$t('defaultText.pleaseChoose')">
                       <el-option v-for="item in auseList" :key="item.id" :label="item.rolename" :value="item.id"></el-option>
                   </el-select>
                 </el-form-item>
-                <div class="daoru"><span type="info" style="color:#999">*设置导入人员时的默认角色</span></div>
+                <div class="daoru"><span type="info" style="color:#999">{{ $t('defaultroleforimportingpeople') }}</span></div>
               </el-form>
             </div>
             <span slot="footer" class="dialog-footer">
-              <el-button type="primary" @click="determine()">确 定</el-button>
+              <el-button type="primary" @click="determine()">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
   </div>
@@ -148,7 +148,7 @@ export default {
         moduleList: [],
         roles: '',
         titles: '',
-        addTil: '立即添加',
+        addTil: this.$t('Immediatelyadd'),
         keyword: '',
         auseList: [],
         defaultRole: false,
@@ -156,7 +156,7 @@ export default {
         roleName: '',
         rules: {
           rolename: [{
-            required: true, message: '请输入角色名称', trigger: 'blur'
+            required: true, message: this.$t('peaseenterthe'), trigger: 'blur'
           }]
         }
     };
@@ -187,7 +187,7 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.$message({
-                    message: '操作成功',
+                    message: this.$t('operationissuccessful'),
                     type: "success"
                 });
                 this.defaultRole = false
@@ -288,8 +288,8 @@ export default {
         return data.label.indexOf(value) !== -1;
       },
         handleAdd(tex, tel, id) {
-          if(id && id.rolename == '超级管理员'){
-            this.$message('超级管理员为固定的默认角色无法编辑');
+          if(id && id.rolename == this.$t('role.superAdministrator')){
+            this.$message(this.$t('administratorcannotbeedited'));
             return
           }
           this.titles = tex
@@ -339,9 +339,9 @@ export default {
          
       },
       deteHand(item) {
-        this.$confirm('此操作将删除('+item.rolename+')角色, 是否继续?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
+        this.$confirm(this.$t('operationwilldelete')+'('+item.rolename+')'+this.$t('shifujuxu'), this.$t('other.prompts'), {
+          confirmButtonText: this.$t('btn.determine'),
+          cancelButtonText: this.$t('btn.cancel'),
           type: 'warning'
         }).then(() => {
           this.http.post('/permission/deleteRole', {
@@ -350,7 +350,7 @@ export default {
           res => {
               if (res.code == "ok") {
                 this.$message({
-                      message: '删除成功',
+                      message: this.$t('message.successfullyDeleted'),
                       type: "success"
                   });
                 this.getRole()
@@ -442,7 +442,7 @@ export default {
           res => {
               if (res.code == "ok") {
                 this.$message({
-                      message: '操作成功',
+                      message: this.$t('operationissuccessful'),
                       type: "success"
                   });
                 this.getRole()
@@ -467,7 +467,7 @@ export default {
         },res => {
           if(res.code == 'ok'){
             var a = document.createElement('a');
-            a.download = "权限数据表.xls";
+            a.download = this.$t('quanxianshuju')+ ".xls";
             a.href = res.data;
             a.click();
           }else{

+ 161 - 160
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -2,80 +2,78 @@
     <section >
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;position:sticky;top:0;z-index:1002">
             <el-form :inline="true">
-                <el-form-item label="系统基础设置">
+                <el-form-item :label="$t('navigation.basicSystemSettings')">
                 </el-form-item>
                 <el-form-item  style="float:right">
-                    <el-button  type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                    <el-button  type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
                 </el-form-item>
             </el-form>
         </el-col>
-        <p style="padding-top:80px;margin: 0 0 10px 10px;color:#666;">员工时薪录入方式设置</p>
+        <p style="padding-top:80px;margin: 0 0 10px 10px;color:#666;">{{ $t('employeehourlywage') }}</p>
         <div class="panel" style="height:190px;margin-left:20px;margin-right:20px;">
-        <el-radio v-model="timeType.hourCostInputType" :label="0" style="width:100%;margin-left:10px;">方式一: 录入月成本,自动计算时薪<span class="tip">(适合企业全职员工)</span>
+        <el-radio v-model="timeType.hourCostInputType" :label="0" style="width:100%;margin-left:10px;">{{ $t('methodsa') }}<span class="tip">{{ $t('suitableforfulltimeemployees') }}</span>
             <el-form ref="form0" :inline="true" :model="timeType" label-width="150px" style="margin-top:10px;">
-            <el-form-item label="平均每月工作天数" prop="monthDays">
+            <el-form-item :label="$t('workingdayspermonth')" prop="monthDays">
             <el-input v-model="timeType.monthDays"  type="number" style="width:120px;"></el-input>
-            
+            {{ $t('time.day') }} 
             </el-form-item>    
-            <el-form-item label="每日正常工作时长" prop="allday">
-                <el-select v-model="timeType.allday" placeholder="请选择工作时长" style="width:120px;" @change="timeAlldayChange">
+            <el-form-item :label="$t('dailyworkinghours')" prop="allday">
+                <el-select v-model="timeType.allday" :placeholder="$t('defaultText.pleaseSelectWorkingHours')" style="width:120px;" @change="timeAlldayChange">
                     <el-option v-for="item in times" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
                 </el-select>
-                小时
-                
-                <span class="lockworktime"><el-checkbox v-model="timeType.lockWorktime" @change="lockChange" label="锁定工作时长" />
-                
-                <el-tooltip effect="dark" content="锁定每日填报工时的上限" placement="top-start">
+                {{ $t('time.hour') }} 
+                <span class="lockworktime"><el-checkbox v-model="timeType.lockWorktime" @change="lockChange" :label="$t('lockingworkinghours')" />
+                <el-tooltip effect="dark" :content="$t('hoursreporteperday')" placement="top-start">
                     <i class="el-icon-question" style="color:#606266"></i>
                 </el-tooltip>
-                <span style="margin-left:25px">填报时长上限</span>
+                <span style="margin-left:25px">{{ $t('imitillingtime') }}</span>
                 <el-select :disabled="timeType.lockWorktime" v-model="timeType.maxReportTime" type="number" style="width:120px;margin-left:10px">
                     <el-option v-for="item in maxReportTimeRange" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
-                </el-select><span style="margin-left:5px;color:#409eff">小时</span>
+                </el-select><span style="margin-left:5px;color:#409eff">{{ $t('time.hour') }}</span>
                 </span>
                 
             </el-form-item><br>
-            <el-form-item label="加班设置" prop="allday" v-if="!timeType.lockWorktime">
-                <el-checkbox v-model="timeType.fillOvertime" label="可填报加班时长" />
+            <el-form-item :label="$t('workSettings')" prop="allday" v-if="!timeType.lockWorktime">
+                <el-checkbox v-model="timeType.fillOvertime" :label="$t('hourscanbereported')" />
                 <template v-if="timeType.fillOvertime">
-                <el-checkbox v-model="timeType.payOvertime" label="加班工时记入成本" />
+                <el-checkbox v-model="timeType.payOvertime" :label="$t('chargedtocost')" />
                 <!-- <el-checkbox v-model="timeType.doubleOvertime" label="加班双倍成本" :disabled="!timeType.payOvertime"/> -->
-                <el-input v-model="timeType.overtimeRatio" placeholder="" clearable style="width: 100px;margin: 0 10px 0 20px" v-if="timeType.payOvertime" @keyup.native="timeType.overtimeRatio = oninput(timeType.overtimeRatio, 1)"></el-input> <span v-if="timeType.payOvertime">倍工资</span>
+                <el-input v-model="timeType.overtimeRatio" placeholder="" clearable style="width: 100px;margin: 0 10px 0 20px" v-if="timeType.payOvertime" @keyup.native="timeType.overtimeRatio = oninput(timeType.overtimeRatio, 1)"></el-input> <span v-if="timeType.payOvertime">{{ $t('bei-gong-zi') }}</span>
                 </template>
             </el-form-item>
             </el-form>
             
         </el-radio>
-        <el-radio v-model="timeType.hourCostInputType" :label="1" style="width:100%;margin-left:10px;">方式二:直接录入时薪<span class="tip">(适合计时发放酬劳的小时工,兼职员工)</span></el-radio>
+        <el-radio v-model="timeType.hourCostInputType" :label="1" style="width:100%;margin-left:10px;">{{ $t('visittwo') }}<span class="tip">{{ $t('timeemployees') }}</span></el-radio>
         </div>
         <!--设置时长样式内容-->
-        <p style="margin-left:10px;color:#666;">员工工作时长上报方式设置</p>
+        <p style="margin-left:10px;color:#666;">{{ $t('employeeworkinghours') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-col :span="6" >
         <!-- 上下午固定时长-->
         <div class="panel" >
-        <el-radio v-model="timeType.type" :label="0" style="width:100%">全天/上午/下午便捷上报
+        <el-radio v-model="timeType.type" :label="0" style="width:100%">{{ $t('reportintheafternoon') }}
         <el-form  ref="form1" :model="timeType" :rules="rules" label-width="5rem" style="color:#333;">
         <el-form-item>
         </el-form-item>  
-        <span style="color:#999;display:block;line-height:2rem;margin:1rem 0;">请设置时长</span>
-        <el-form-item label="全天时长" prop="allday">
-            <el-select v-model="timeType.allday" placeholder="请选择工作时长" style="width:120px;" @change="timeChange">
+        <span style="color:#999;display:block;line-height:2rem;margin:1rem 0;">{{ $t('settheduration') }}</span>
+        <el-form-item :label="$t('daylong')" prop="allday">
+            <el-select v-model="timeType.allday" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
                 <el-option v-for="item in times" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
             </el-select>
-            小时
-        </el-form-item>
-        <el-form-item label="上午时长" prop="am" >
-            <el-select v-model="timeType.am" placeholder="请选择工作时长" style="width:120px;" @change="timeChange">
+            {{ $t('time.hour') }} 
+            </el-form-item>
+        <el-form-item :label="$t('morningtime')" prop="am" >
+            <el-select v-model="timeType.am" placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" @change="timeChange">
                 <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
             </el-select>
-            小时
+            {{ $t('time.hour') }} 
         </el-form-item>
-        <el-form-item label="下午时长" prop="pm" >
-            <el-select v-model="timeType.pm" disabled placeholder="请选择工作时长" style="width:120px;" >
+        <el-form-item :label="$t('afternoontime')" prop="pm" >
+            <el-select v-model="timeType.pm" disabled placeholder="$t('defaultText.pleaseChoose')" style="width:120px;" >
                 <el-option v-for="item in halfTime" :key="item" :label="item.toFixed(1)" :value="item"></el-option>
             </el-select>
-            小时
+            {{ $t('time.hour') }} 
         </el-form-item>
         </el-form>
         </el-radio>
@@ -84,16 +82,16 @@
         <!-- 选择小时数样式 -->
         <el-col :span="6">   
         <div class="panel">
-        <el-radio v-model="timeType.type" :label="1">自行选择工作时长
+        <el-radio v-model="timeType.type" :label="1">{{ $t('chooseyourownhours') }}
         <el-form  class="sample" style="color:#333;">
         <p style="color:#999;display:block;line-height:2rem">
-            展示样例
+            {{ $t('showthesample') }} 
         </p>
-        <el-form-item label="工作时长">
+        <el-form-item :label="$t('screening.workTime')">
             <el-select v-model="selectTime" style="width:120px">
                 <el-option v-for="item in timeRange" :key="item" :value="item.toFixed(1)">{{item.toFixed(1)}}</el-option>
             </el-select>
-            小时
+            {{ $t('time.hour') }} 
         </el-form-item>
         
         </el-form>
@@ -104,13 +102,13 @@
         <!--选择时间段样式 -->
         <el-col :span="6">  
         <div  class="panel" >
-            <el-radio v-model="timeType.type" :label="2">自行选择时间范围
+            <el-radio v-model="timeType.type" :label="2">{{ $t('owntimeframe') }}
             <el-form class="sample" style="color:#333;">
             <p style="color:#999;display:block;line-height:2rem">
-            展示样例
+            {{ $t('showthesample') }} 
             </p>
             
-            <el-form-item label="开始时间">
+            <el-form-item :label="$t('starttimes')">
                <el-time-picker
                style="width:160px;"
                     v-model="startTime"
@@ -119,10 +117,10 @@
                         end: '18:30'
                     }"
                     format="HH:mm"
-                    placeholder="任意时间点">
+                    :placeholder="$t('pointintime')">
                 </el-time-picker>
             </el-form-item>
-            <el-form-item label="结束时间">
+            <el-form-item :label="$t('time.endTime')">
                <el-time-picker
                style="width:160px;"
                             v-model="endTime"
@@ -132,13 +130,13 @@
                                 minTime: startTime
                             }"
                             format="HH:mm"
-                            placeholder="任意时间点">
+                            :placeholder="$t('pointintime')">
                         </el-time-picker>
             </el-form-item>
             </el-form>
             </el-radio> 
             <div v-if="timeType.type == 2">
-                <el-link :underline="false" type="primary" @click="setupRest">设置休息时间段</el-link>
+                <el-link :underline="false" type="primary" @click="setupRest">{{ $t('settingrestPeriod') }}</el-link>
                 <div style="padding: 10px 2px;">
                 <el-tag style="margin: 0 8px 8px 0;" size="small" type="info" v-for="item in restList" :key="item.id">{{item.startTime + '-' + item.endTime}}</el-tag>
                 </div>
@@ -149,16 +147,16 @@
         <!--选择按比例分配样式 -->
         <el-col :span="6">  
         <div  class="panel" >
-            <el-radio v-model="timeType.type" :label="3">按比例分配时间
+            <el-radio v-model="timeType.type" :label="3">{{ $t('timeproportionally') }}
             <el-form class="sample" style="color:#333;">
             <p style="color:#999;display:block;line-height:2rem">
-            展示样例
+            {{ $t('showthesample') }} 
             </p>
             
-            <el-form-item label="用时占比">
+            <el-form-item :label="$t('lable.percentageOfTime')">
                 <!-- <el-col span="6">用时占比: </el-col> -->
                 <el-col span="12" style="padding-left:0;padding-right:0;"><el-slider v-model="progress" :step="5" style="width:100px;" ></el-slider></el-col>
-                <el-col span="2" style="padding-left:0;padding-right:0;"><span style="margin-left:10px;"><span style="margin-right:10px;">{{progress}}%</span>{{(progress*8/100).toFixed(1)}}小时</span></el-col>
+                <el-col span="2" style="padding-left:0;padding-right:0;"><span style="margin-left:10px;"><span style="margin-right:10px;">{{progress}}%</span>{{(progress*8/100).toFixed(1)}} {{ $t('time.hour') }}</span></el-col>
             </el-form-item>
             </el-form>
             </el-radio> 
@@ -166,15 +164,15 @@
         </el-col>
         </el-row>
         <!--设置时长样式内容-->
-        <p style="margin-left:10px;color:#666;">填报提醒设置</p>
+        <p style="margin-left:10px;color:#666;">{{ $t('reminderSettings') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
                 <div class="panel" style="height:200px;">
                     <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
-                    <el-form-item label="提醒时间 " prop="alertTime">
+                    <el-form-item :label="$t('remindertime') " prop="alertTime">
                         <el-time-picker 
                                 v-model="timeType.alertTime"
-                                placeholder="提醒时间"
+                                :placeholder="$t('remindertime')"
                                 style="width:120px;"
                                 format="HH:mm"
                                 value-format="HH:mm"
@@ -185,19 +183,19 @@
                             </el-time-picker>
                     </el-form-item>
                     <el-form-item prop="alertType" style="margin-left:10px">
-                        <el-select v-model="timeType.alertType" placeholder="请选择提醒方式">
-                            <el-option label="每日提醒当天漏填" :value="0"></el-option>
-                            <el-option label="每日提醒昨天漏填" :value="1"></el-option>
+                        <el-select v-model="timeType.alertType" :placeholder="$t('remindermethod')">
+                            <el-option :label="$t('missingfill')" :value="0"></el-option>
+                            <el-option :label="$t('missingfills')" :value="1"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item label="提醒文本" prop="alertMsg" style="width: 50%;margin-left:10px;">
-                            <el-input placeholder="请输入提醒文本" v-model="timeType.alertMsg" clearable class="apu" maxlength="20"></el-input>
+                    <el-form-item :label="$t('remindertext')" prop="alertMsg" style="width: 50%;margin-left:10px;">
+                            <el-input :placeholder="$t('peaseenterthe')" v-model="timeType.alertMsg" clearable class="apu" maxlength="20"></el-input>
                     </el-form-item>
                     </el-form>
                     <div class="underpanel">
                         <div class="whiteList_head">
-                            <span style="float:left;color:#999">不提醒人员设置</span>
-                            <el-link type="primary" style="float:left;margin-left:15px" :underline="false" @click="addWhite">添加</el-link>
+                            <span style="float:left;color:#999">{{ $t('personneltoset') }}</span>
+                            <el-link type="primary" style="float:left;margin-left:15px" :underline="false" @click="addWhite">{{ $t('addTian') }}</el-link>
                         </div>
                         <div class="whiteList_content">
                             <el-tag style="margin:10px 0 0 10px" v-for="item in whiteList" :key="item.id" closable @close="whiteDelete(item)">{{item.label}}</el-tag>
@@ -207,29 +205,29 @@
             </el-col>
         </el-row>
 <!-- 设置员工可补填的时间 -->
-        <p style="margin-left:10px;color:#666;">员工填报日报时间设置</p>
+        <p style="margin-left:10px;color:#666;">{{ $t('timesetting') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
         <el-col :span="24" >
             <div class="panel" style="height:120px;">
                 <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
                  
-                <el-form-item label="补填时间" prop="fillMonths">
+                <el-form-item :label="$t('filltime')" prop="fillMonths">
                     <el-select v-model="timeType.fillMonths" >
                         <el-option v-for="item in monthTimeList" :key="item.id" :label="item.name" :value="item.id">
                         </el-option>
                     </el-select>
-                    <span style="color:#666;margin-left:10px;">(说明:系统管理员为员工代填日报时不受补填时间的限制)</span>
-                    <span class="lockworktime"><el-checkbox v-model="timeType.fillAhead" label="可提前填报" /></span>
+                    <span style="color:#666;margin-left:10px;">{{ $t('instructions') }}</span>
+                    <span class="lockworktime"><el-checkbox v-model="timeType.fillAhead" :label="$t('filledinadvance')" /></span>
                 </el-form-item><br>
-                <el-form-item label="员工填报及时日" prop="timeliness" v-if="user.company.packageProject">
+                <el-form-item :label="$t('timelydate')" prop="timeliness" v-if="user.company.packageProject">
                     <el-select v-model="timeType.timeliness">
-                        <el-option label="当天" :value="0"></el-option>
-                        <el-option label="第二天" :value="1"></el-option>
-                        <el-option label="第三天" :value="2"></el-option>
+                        <el-option :label="$t('dang-tian')" :value="0"></el-option>
+                        <el-option :label="$t('oneday')" :value="1"></el-option>
+                        <el-option :label="$t('shreeday')" :value="2"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="日报自动审核时限:" style="color:#606266" v-if="user.timeType.reportAutoApprove">
-                    待审核<el-input-number v-model="timeType.reportAutoApproveDays" style="width:150px;margin:0 10px" min="1"></el-input-number>天后
+                <el-form-item :label="$t('dailyreview')" style="color:#606266" v-if="user.timeType.reportAutoApprove">
+                    {{ $t('state.WaitingAudit') }}<el-input-number v-model="timeType.reportAutoApproveDays" style="width:150px;margin:0 10px" min="1"></el-input-number>{{ $t('dyas') }}
                 </el-form-item>
                 </el-form>
             </div>
@@ -237,23 +235,23 @@
         </el-row>
         <!-- 设置研究中心 -->
         <div class="yanjiu">
-            <p style="margin-left:10px;color:#666;">自定义日报填报列表</p>
+            <p style="margin-left:10px;color:#666;">{{ $t('dailyfilling') }}</p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDegreeActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">开启后系统可按该字段数据进行分类统计工时成本</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('afteritisenabled') }}</span>
             <template v-if="timeType.customDegreeActive">
             <el-switch style="margin-left: 40px" v-model="timeType.customDegreeStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('parametermandatory') }}</span>
             </template>
         </div>
         <el-row v-if="timeType.customDegreeActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
                 <div class="panel" style="height:60px;">
                     <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
-                        <el-form-item label="字段名称 ">
-                            <el-input placeholder="请输入字段名称" maxlength="6" size="small" v-model="timeType.customDegreeName" clearable> </el-input>
+                        <el-form-item :label="$t('fieldnames') ">
+                            <el-input :placeholder="$t('peaseenterthe')" maxlength="6" size="small" v-model="timeType.customDegreeName" clearable> </el-input>
                         </el-form-item>
                         <el-form-item>
-                            <el-button type="primary" size="small" @click="bianji()">数据维护</el-button>
+                            <el-button type="primary" size="small" @click="bianji()">{{ $t('datamaintenance') }}</el-button>
                         </el-form-item>
                     </el-form>
                 </div>
@@ -261,25 +259,25 @@
         </el-row>
         <!-- 设置数值填报 -->
         <div class="yanjiu" v-if="user.company.packageProject==1">
-            <p style="margin-left:10px;color:#666;"><span>自定义日报填报数值</span></p>
+            <p style="margin-left:10px;color:#666;"><span>{{ $t('dailyfillingvalue') }}</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDataActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">开启后可按项目,部门和人员统计该数值</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('afterthisunctionisenabled') }}</span>
             <template v-if="timeType.customDataActive">
             <el-switch style="margin-left: 40px" v-model="timeType.customDataStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('parametermandatory') }}</span>
             </template>
         </div>
         <el-row v-if="timeType.customDataActive && user.company.packageProject==1" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
                 <div class="panel" style="height:60px;">
                     <el-form :inline="true" :model="timeType" style="margin-top:10px;">
-                        <el-form-item label="字段名称 ">
-                            <el-input placeholder="请输入字段名称" maxlength="5" size="small" v-model="timeType.customDataName" clearable> </el-input>
+                        <el-form-item :label="$t('fieldnames') ">
+                            <el-input :placeholder="$t('peaseenterthe')" maxlength="5" size="small" v-model="timeType.customDataName" clearable> </el-input>
                         </el-form-item>
-                        <el-form-item label="是否开启最大值限制 " style="margin-left:10px;">
+                        <el-form-item :label="$t('maximumvaluelimit') " style="margin-left:10px;">
                             <el-switch v-model="timeType.customDataMaxStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
                         </el-form-item>
-                        <el-form-item label="最大值 " style="margin-left:10px;" v-if="timeType.customDataMaxStatus">
+                        <el-form-item :label="$t('maximum') " style="margin-left:10px;" v-if="timeType.customDataMaxStatus">
                             <el-input-number v-model="timeType.customDataMaxValue"></el-input-number>
                         </el-form-item>
                     </el-form>
@@ -289,35 +287,35 @@
 
         <!-- 设置数值填报 -->
         <div class="yanjiu" >
-            <p style="margin-left:10px;color:#666;"><span>自定义日报填报文本</span></p>
+            <p style="margin-left:10px;color:#666;"><span>{{ $t('fillingtext') }}</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customTextActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">开启后可员工可额外填写该信息</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('additionalinformation') }}</span>
             <template v-if="timeType.customTextActive">
             <el-switch style="margin-left: 40px" v-model="timeType.customTextStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('parametermandatory') }}</span>
             </template>
         </div>
         <el-row v-if="timeType.customTextActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
                 <div class="panel" style="height:60px;">
                     <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
-                        <el-form-item label="字段名称 ">
-                            <el-input placeholder="请输入字段名称" maxlength="5" size="small" v-model="timeType.customTextName" clearable> </el-input>
+                        <el-form-item :label="$t('fieldnames') ">
+                            <el-input :placeholder="$t('peaseenterthe')" maxlength="5" size="small" v-model="timeType.customTextName" clearable> </el-input>
                         </el-form-item>
                     </el-form>
                 </div>
             </el-col>
         </el-row>
         <div class="yanjiu">
-            <span style="margin-left:10px;color:#666;">{{user.companyId==781?'具体内容与结果':'工作事项'}}</span>
+            <span style="margin-left:10px;color:#666;">{{user.companyId==781?$t('other.specificcontentandresults'):$t('other.workMatters')}}</span>
             <el-switch :style="user.companyId==781?'margin-left:66px;':'margin-left:108px;'" v-model="timeType.workContentState" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            <span style="margin-left:10px;color:#999;">{{ $t('parametermandatory') }}</span>
         </div>
         <!-- 是否开启导入审核 -->
         <div class="yanjiu">
-            <p style="margin-left:10px;color:#666;">是否开启导入审核</p>
+            <p style="margin-left:10px;color:#666;">{{ $t('importauditing') }}</p>
             <el-switch style="margin-left: 55px" v-model="timeType.needDeptAudit" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
-            <span v-if="timeType.needDeptAudit == 1" style="margin-left:10px;color:#999;">审核人为各部门直属领导</span>
+            <span v-if="timeType.needDeptAudit == 1" style="margin-left:10px;color:#999;">{{ $t('eachdepartment') }}</span>
         </div>
 
         <!-- 是否开启主项目管理 -->
@@ -328,90 +326,89 @@
         </div> -->
 
         <div style="width:80px;margin:0 auto;padding:20px;">
-            <el-button  type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+            <el-button  type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
         </div>
         <!-- 维护数据 -->
-        <el-dialog title="维护数据列表" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('maintenanceDatalist')" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="subProjectList" highlight-current-row  height="400" style="width: 100%;">
-            <el-table-column prop="id" width="60" label="序号">
+            <el-table-column prop="id" width="60" :label="$t('headerTop.serialNumber')">
                 <template slot-scope="scope" >
                     {{scope.$index + 1}}
                 </template>
             </el-table-column>
-            <el-table-column prop="name" label="名称" ></el-table-column>
-            <el-table-column label="操作" width="150">
+            <el-table-column prop="name" :label="$t('names')" ></el-table-column>
+            <el-table-column :label="$t('operation')" width="150">
                 <template slot-scope="scope" >
-                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">编辑</el-button>
-                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">删除</el-button>
+                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
 
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="subProjectVisible = false" >关闭</el-button>
-                <el-button type="primary" @click="addNewSubProject()" >新增数据</el-button>
+                <el-button type="primary" @click="subProjectVisible = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="addNewSubProject()" >{{ $t('addData') }}</el-button>
             </div>
         </el-dialog>
         <!-- 新增子项目弹出框 -->
-        <el-dialog title="新增/修改维护数据" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('addedormodifiedthemaintenancedata')" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="form2" :model="addfm" :rules="ruless" label-width="100px">
-                <el-form-item label="名称" prop="name">
-                    <el-input v-model="addfm.name" placeholder="请输入名称" clearable></el-input>
+                <el-form-item :label="$t('names')" prop="name">
+                    <el-input v-model="addfm.name" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addSubProject = false">取消</el-button>
-                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addSubProject = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!-- 设置休息时间段 -->
-        <el-dialog title="设置休息时间段" v-if="setupRestDialog" :visible.sync="setupRestDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('settingrestPeriod')" v-if="setupRestDialog" :visible.sync="setupRestDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="restList" highlight-current-row height="400" style="width: 100%;">
-                <el-table-column prop="id" width="60" label="序号">
+                <el-table-column prop="id" width="60" :label="$t('headerTop.serialNumber')">
                     <template slot-scope="scope" >
                         {{scope.$index + 1}}
                     </template>
                 </el-table-column>
-                <el-table-column label="时间段">
+                <el-table-column :label="$t('message.period')">
                     <template slot-scope="scope">
                         <span>{{scope.row.startTime + '-' + scope.row.endTime}}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="操作" width="150">
+                <el-table-column :label="$t('operation')" width="150">
                     <template slot-scope="scope" >
-                        <el-button size="small" type="primary" @click="setupRestEdit(scope.row)">编辑</el-button>
-                        <el-button size="small" type="danger" @click="setupRestDelete(scope.row)">删除</el-button>
+                        <el-button size="small" type="primary" @click="setupRestEdit(scope.row)">{{ $t('bian-ji') }}</el-button>
+                        <el-button size="small" type="danger" @click="setupRestDelete(scope.row)">{{ $t('btn.delete') }}</el-button>
                     </template>
                 </el-table-column>
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="setupRestDialog = false">关闭</el-button>
-                <el-button type="primary" @click="setupRestNew">新增时间段</el-button>
+                <el-button @click.native="setupRestDialog = false">{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="setupRestNew">{{ $t('xin-zeng-shi-jian-duan') }}</el-button>
             </div>
-
-            <el-dialog :title="setupItemId == null ? '新增' : '修改'" v-if="setupRestAppendDialog" :visible.sync="setupRestAppendDialog" :close-on-click-modal="false" customClass="customWidth" width="400px" append-to-body>
+            <el-dialog :title="setupItemId == null ? $t('add') : $t('xiu-gai')" v-if="setupRestAppendDialog" :visible.sync="setupRestAppendDialog" :close-on-click-modal="false" customClass="customWidth" width="400px" append-to-body>
                 <el-form label-width="100px">
-                    <el-form-item label="开始时间">
-                        <el-time-picker v-model="restTime.startTime" placeholder="请选择时间" format="HH:mm" value-format="HH:mm" @change="timeRule(0)"></el-time-picker>
+                    <el-form-item :label="$t('starttimes')">
+                        <el-time-picker v-model="restTime.startTime" :placeholder="$t('message.Pleaseselectatime')" format="HH:mm" value-format="HH:mm" @change="timeRule(0)"></el-time-picker>
                     </el-form-item>
-                    <el-form-item label="结束时间">
-                        <el-time-picker v-model="restTime.endTime" placeholder="请选择时间" format="HH:mm" value-format="HH:mm" @change="timeRule(1)"></el-time-picker>
+                    <el-form-item :label="$t('time.endTime')">
+                        <el-time-picker v-model="restTime.endTime" :placeholder="$t('message.Pleaseselectatime')" format="HH:mm" value-format="HH:mm" @change="timeRule(1)"></el-time-picker>
                     </el-form-item>
                 </el-form>
                 <div slot="footer" class="dialog-footer">
-                    <el-button @click.native="setupRestAppendDialog = false">取消</el-button>
-                    <el-button type="primary" @click="setupRestSure()">确认</el-button>
+                    <el-button @click.native="setupRestAppendDialog = false">{{ $t('btn.cancel') }}</el-button>
+                    <el-button type="primary" @click="setupRestSure()">{{ $t('btn.determine') }}</el-button>
                 </div>
             </el-dialog>
         </el-dialog>
 
         <!-- 日报提醒白名单 -->
-        <el-dialog title="选择人员"  v-if="whiteListDialog" :visible.sync="whiteListDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('screening.selectPeople')"  v-if="whiteListDialog" :visible.sync="whiteListDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <div class="tree" style="height:400px">
                 <el-scrollbar style="height:100%">
                     <el-input
-                    placeholder="输入关键字进行过滤"
+                    :placeholder="$t('keywordfiltering')"
                     v-model="filterText">
                     </el-input>
                 <el-tree :data="whiteListAll" show-checkbox :props="defaultProps" node-key="id"
@@ -421,8 +418,8 @@
             </div>
             <!-- <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>         :default-checked-keys="alreadyPartArray"  @check-change="onTreeItemChange" -->
             <div slot="footer" class="dialog-footer">
-                <el-button  @click="whiteListDialog = false">取消</el-button>
-                <el-button type="primary" @click="setWhiteList()">确定</el-button>
+                <el-button  @click="whiteListDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="setWhiteList()">{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
     </section>
@@ -433,7 +430,7 @@
     export default {
         data() {
             return {
-                monthTimeList:[{id:0, name:'不限制'},{id:1, name:'仅可补填当月'},{id:2, name:'可补填到上个月'},{id:3, name:'可补填到上上月'},{id:4, name:'可补填7天内日报'},{id:5, name:'可补填前1天日报'}],
+                monthTimeList:[{id:0, name:this.$t('donlimit')},{id:1, name:this.$t('canbefilled')},{id:2, name:this.$t('lastmonth')},{id:3, name:this.$t('lastlastmonth')},{id:4, name:this.$t('newspaperwithin')},{id:5, name:this.$t('previousdaydaily')}],
                 progress:30,
                 startTime:null,
                 endTime:null,
@@ -458,12 +455,12 @@
                 needDeptAudit: false,
                 customDegreeName: '',
                 rules: {
-                    allday: [{ required: true, message: "请选择全天工作时长", trigger: "blur" }],
-                    am: [{ required: true, message: "请输入上午工作时长", trigger: "blur" }],
-                    pm: [{ required: true, message: "请输入下午工作时长", trigger: "blur" }],
+                    allday: [{ required: true, message: this.$t('dayworkinghours'), trigger: "blur" }],
+                    am: [{ required: true, message: this.$t('morningworkinghours'), trigger: "blur" }],
+                    pm: [{ required: true, message: this.$t('afternoonworkinghours'), trigger: "blur" }],
                 },
                 ruless: {
-                    name: [{ required: true, message: "请输入名称", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('peaseenterthe'), trigger: "blur" }],
                 },
                 subProjectVisible: false,
                 subProjectList: [],//子项目列表
@@ -498,7 +495,24 @@
                 this.$refs.whiteListTree.filter(val);
             }
         },
-        methods: {
+        created() {
+            let height = window.innerHeight;
+            this.tableHeight = height - 195;
+            const that = this;
+            window.onresize = function temp() {
+                that.tableHeight = window.innerHeight - 195;
+            };
+        },
+        mounted() {
+            this.timeRange = []
+            for(let i=0.5; i<=20; i+=0.5){
+                this.timeRange.push(i)
+            }
+            this.initTime();
+            this.getCompanyTimeSetting();
+            this.getRestList()
+        },
+         methods: {
             timeAlldayChange(){
                 if(this.timeType.maxReportTime < this.timeType.allday || this.timeType.lockWorktime){
                     this.timeType.maxReportTime = this.timeType.allday
@@ -572,7 +586,7 @@
                 },res => {
                     if(res.code == 'ok'){
                         this.$message({
-                            message: '删除成功',
+                            message: this.$t('message.successfullyDeleted'),
                             type: 'success'
                         })
                         this.getRestList()
@@ -594,7 +608,7 @@
                         this.restTime.id = this.setupItemId
                     }
                     if(this.restTime.startTime == null || this.restTime.endTime == null){
-                        this.$message('请选择时间段')
+                        this.$message(this.$t('qing-xuan-ze-shi-jian-duan'))
                         return
                     }
                     this.http.post('/time-auto-exclude/addOrMod',this.restTime,
@@ -651,7 +665,7 @@
                             this.listLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: '成功',
+                                    message: this.$t('other.successful'),
                                     type: "success"
                                 });
                                 this.addfm = {name: ''}
@@ -690,9 +704,9 @@
                 this.addSubProject = true;
             },
             deleteSubPro(subProject) {
-                this.$confirm("确定要这条" + subProject.name + "数据吗?","删除", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('takethisone') + subProject.name + this.$t('shu-ju-ma'),this.$t('btn.delete'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -704,14 +718,14 @@
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.bianji();
                         } else {
-                            if(res.msg.indexOf("无法删除1") == '-1') {
+                            if(res.msg.indexOf(this.$t('wu-fa-shan-chu-1')) == '-1') {
                                 this.$message({
-                                    message: '该数据正在使用,无法删除',
+                                    message: this.$t('cannotbedeleted'),
                                     type: "error"
                                 });
                             } else {
@@ -774,7 +788,7 @@
                 // this.customDegreeName = this.timeType.customDegreeName
             },
             initTime() {
-                for (var i=1.0; i<=12.0; i+=0.5) {
+                for (var i=1.0; i<=20.0; i+=0.5) {
                    this.times.push(i);
                    if ( i <= 6) {
                        this.halfTime.push(i);
@@ -840,7 +854,7 @@
                 },res => {
                     if(res.code == 'ok'){
                         this.$message({
-                            message: '删除成功',
+                            message: this.$t('message.successfullyDeleted'),
                             type: 'success'
                         })
                     }else {
@@ -879,7 +893,7 @@
                 },res => {
                     if(res.code == 'ok'){
                         this.$message({
-                            message: '添加成功',
+                            message: this.$t('addsuccessful'),
                             type: 'success'
                         })
                         this.whiteListDialog = false
@@ -908,7 +922,7 @@
                         if(param.customDegreeActive) {
                             if(param.customDegreeName.replace(/^ +| +$/g,'') == ''){
                                 this.$message({
-                                    message:"请输入[自定义日报填报列表]的字段名称",
+                                    message:this.$t('customDailyFillingList'),
                                     type:"error"
                                 })
                                 return
@@ -920,7 +934,7 @@
                         if(param.customDataActive) {
                             if(param.customDataName.replace(/^ +| +$/g,'') == ''){
                                 this.$message({
-                                    message:"请输入[自定义日报填报数值]的字段名称",
+                                    message:this.$t('customDailyFillingLists'),
                                     type:"error"
                                 })
                                 return
@@ -932,7 +946,7 @@
                         if(param.customTextActive) {
                             if(param.customTextName == null || param.customTextName.replace(/^ +| +$/g,'') == ''){
                                 this.$message({
-                                    message:"请输入[自定义日报填报文本]的字段名称",
+                                    message:this.$t('customDailyFillingListss'),
                                     type:"error"
                                 })
                                 return
@@ -956,7 +970,7 @@
                         if(param.payOvertime) {
                             if(param.overtimeRatio == 0 || param.overtimeRatio == '') {
                                 this.$message({
-                                    message:"请设置加班几倍工资",
+                                    message:this.$t('overtimepay'),
                                     type:"error"
                                 })
                                 return
@@ -976,7 +990,7 @@
                                 this.listLoading = false;
                                 if (res.code == "ok") {
                                     this.$message({
-                                        message: '保存成功',
+                                        message: this.$t('savesuccess'),
                                         type: "success"
                                     });
                                     this.user.timeType = param;
@@ -1082,19 +1096,6 @@
             }
 
         },
-        created() {
-            let height = window.innerHeight;
-            this.tableHeight = height - 195;
-            const that = this;
-            window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 195;
-            };
-        },
-        mounted() {
-            this.initTime();
-            this.getCompanyTimeSetting();
-            this.getRestList()
-        }
     };
 </script>
 

+ 127 - 204
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -7,12 +7,12 @@
                 <el-form-item label="任务列表">
                 </el-form-item>
                 </div> -->
-                <el-form-item label="任务列表">
+                <el-form-item :label="$t('tasklist')">
                     <div style="margin-left: 8px">
                     <!-- <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入项目名称关键字" clearable="true"> -->
-                        <el-select v-model="searchField" style="width:120px;" size="small" slot="prepend" placeholder="请选择">
-                            <el-option label="进行中" value="0" @click.native="hiddens()"></el-option>
-                            <el-option label="已完成" value="1" @click.native="hiddens()"></el-option>
+                        <el-select v-model="searchField" style="width:120px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')">
+                            <el-option :label="$t('ongoing')" value="0" @click.native="hiddens()"></el-option>
+                            <el-option :label="$t('state.completed')" value="1" @click.native="hiddens()"></el-option>
                         </el-select>
                         <!-- <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button> -->
                     <!-- </el-input> -->
@@ -26,9 +26,9 @@
                     </div>
                 </el-form-item> -->
 
-                <el-form-item label="所属部门" v-if="user.timeType.projectWithDept">
+                <el-form-item :label="$t('subordinatedepartments')" v-if="user.timeType.projectWithDept">
                     <!-- <span style="margin-left:5px;margin-right:5px;color:#606266;">部门</span> -->
-                    <el-cascader v-model="deptId" :options="departmentList" size="small" placeholder="请选择部门"
+                    <el-cascader v-model="deptId" :options="departmentList" size="small" :placeholder="$t('qing-xuan-ze-bu-men')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" :show-all-levels="false" clearable filterable @change="hiddens"
                     ></el-cascader>
                 </el-form-item>
@@ -41,16 +41,16 @@
                 <el-form-item label="类型">
                 </el-form-item>
                 </div> -->
-                <el-form-item label="类型">
+                <el-form-item :label="$t('types')">
                     <div style="margin-left: 8px">
                     <!-- <el-input style="float:left;" v-model="keyword" class="input-with-select" placeholder="请输入项目名称关键字" clearable="true"> -->
-                        <el-select v-model="typeField" style="width:120px;" size="small" slot="prepend" placeholder="请选择" clearable @change="hiddens()">
+                        <el-select v-model="typeField" style="width:120px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="hiddens()">
                             <!-- <el-option label="任务" value="0" @click.native="hiddens()"></el-option>
                             <el-option label="里程碑" value="1" @click.native="hiddens()"></el-option>
                             <el-option label="风险" value="2" @click.native="hiddens()"></el-option> -->
-                            <el-option label="任务" value="0"></el-option>
-                            <el-option label="里程碑" value="1"></el-option>
-                            <el-option label="风险" value="2"></el-option>
+                            <el-option :label="$t('other.task')" value="0"></el-option>
+                            <el-option :label="$t('other.milestone')" value="1"></el-option>
+                            <el-option :label="$t('risk')" value="2"></el-option>
                         </el-select>
                         <!-- <el-button slot="append" @click="searchList" icon="el-icon-search"></el-button> -->
                     <!-- </el-input> -->
@@ -58,9 +58,9 @@
                 </el-form-item>
                 <el-form-item >
                     <div style="margin-left: 80px">
-                        <el-select v-model="dateType" style="width:120px;" size="small" slot="prepend" placeholder="请选择">
-                            <el-option label="开始时间" :value="0" @click.native="hiddens(1)"></el-option>
-                            <el-option label="截止时间" :value="1" @click.native="hiddens(1)"></el-option>
+                        <el-select v-model="dateType" style="width:120px;" size="small" slot="prepend" :placeholder="$t('defaultText.pleaseChoose')">
+                            <el-option :label="$t('starttimes')" :value="0" @click.native="hiddens(1)"></el-option>
+                            <el-option :label="$t('deadline')" :value="1" @click.native="hiddens(1)"></el-option>
                         </el-select>
                     </div>
                 </el-form-item>
@@ -71,8 +71,8 @@
                         type="daterange"
                         size="small"
                         range-separator="-"
-                        start-placeholder="区间"
-                        end-placeholder="区间"
+                        :start-placeholder="$t('interval')"
+                        :end-placeholder="$t('interval')"
                         value-format="yyyy-MM-dd"
                         clearable
                         @change="hiddens()">
@@ -84,9 +84,9 @@
         <div style="display: flex;width: 100%;">
             <div class="classification">
                 <div>
-                    <p :class="idx == 0 ? 'on' : ''" @click="switchs(0)" v-if="permissions.projectView || permissions.projectManagement">全部任务</p>
-                    <p :class="idx == 1 ? 'on' : ''" @click="switchs(1)">我执行的</p>
-                    <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">我创建的</p>
+                    <p :class="idx == 0 ? 'on' : ''" @click="switchs(0)" v-if="permissions.projectView || permissions.projectManagement">{{ $t('alltaskss') }}</p>
+                    <p :class="idx == 1 ? 'on' : ''" @click="switchs(1)">{{ $t('perform') }}</p>
+                    <p :class="idx == 2 ? 'on' : ''" @click="switchs(2)">{{ $t('created') }}</p>
                 </div>
             </div>
             <div style="max-width: 94%;min-width: 90%">
@@ -97,9 +97,9 @@
                             {{scope.$index+1+(page-1)*size}} 
                         </template>
                     </el-table-column>
-                    <el-table-column prop="stagesName" label="任务阶段" sortable width="180" @mouseover="mouseOver">
+                    <el-table-column prop="stagesName" :label="$t('taskstage')" sortable width="180" @mouseover="mouseOver">
                     </el-table-column>
-                    <el-table-column prop="name" label="任务名称" sortable width="330">
+                    <el-table-column prop="name" :label="$t('nameofthetask')" sortable width="330">
                         <template slot-scope="scope">
                             <div v-if="scope.row.name.length > 20">
                                 <el-popover trigger="hover" placement="top" width="330" v-if="scope.row.name">
@@ -119,28 +119,28 @@
                         </template>
                     </el-table-column>
                     <!-- <el-table-column prop="projectCategorySub" label="项目分组" sortable width="300" v-if="user.companyId == '428'"></el-table-column> -->
-                    <el-table-column prop="departmentName" label="所属部门" sortable width="300" v-if="user.timeType.projectWithDept"></el-table-column>
-                    <el-table-column prop="projectName" label="项目名称" sortable width="260" show-overflow-tooltip>
+                    <el-table-column prop="departmentName" :label="$t('subordinatedepartments')" sortable width="300" v-if="user.timeType.projectWithDept"></el-table-column>
+                    <el-table-column prop="projectName" :label="$t('headerTop.projectName')" sortable width="260" show-overflow-tooltip>
                         <template slot-scope="scope">
                             <el-link type="primary" :href="'#/projectInside/'+scope.row.projectId">{{scope.row.projectName}}</el-link>
                         </template>
                     </el-table-column>
-                    <el-table-column prop="executorName" label="执行人" sortable width="130">
+                    <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" sortable width="130">
                         <template slot-scope="scope">
                             <!-- <el-link type="primary" @click="showUser(scope.row.executorId)">{{scope.row.executorName}}</el-link> -->
                             <span>{{scope.row.executorName}}</span>
                         </template>
                     </el-table-column>
                     
-                    <el-table-column prop="startDate" label="开始时间" sortable width="180"></el-table-column>
-                    <el-table-column prop="endDate" label="截止时间" width="260" fixed="right" sortable>
+                    <el-table-column prop="startDate" :label="$t('starttimes')" sortable width="180"></el-table-column>
+                    <el-table-column prop="endDate" :label="$t('deadline')" width="260" fixed="right" sortable>
                         <template slot-scope="scope">
                             <div style="display: flex;justify-content: space-between;padding-right: 40px">
                             <span style="display: inline-block;margin-right: 55px">
                                 <span  :class="judgedate(scope.row.endDate) && searchField == '0' && scope.row.taskStatus == 0 ? 'redwarningspan autodatespan' : 'autodatespan'">{{scope.row.endDate}}</span>
                             </span>
-                            <el-button v-if="searchField == 0" size="small" type="primary" @click="completes(scope.row.id, 0)">完成</el-button>
-                            <el-button v-if="searchField == 1" size="small" type="warning" @click="completes(scope.row.id, 1)">重启</el-button>
+                            <el-button v-if="searchField == 0" size="small" type="primary" @click="completes(scope.row.id, 0)">{{ $t('wan-cheng') }}</el-button>
+                            <el-button v-if="searchField == 1" size="small" type="warning" @click="completes(scope.row.id, 1)">{{ $t('zhong-qi') }}</el-button>
                             </div>
                         </template>
                     </el-table-column>
@@ -161,93 +161,52 @@
                 </el-col>
             </div>
         </div>
-        <!--新增界面-->
-        <!-- <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
-            <el-form ref="form1" :model="addForm" :rules="rules" label-width="100px">
-                <el-form-item label="任务名称" >
-                    <el-input v-model="addForm.code" :disabled="user.role==0" placeholder="请输入项目编号" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="项目名称" prop="name">
-                    <el-input v-model="addForm.name" :disabled="user.role==0" placeholder="请输入项目名称" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="全部参与者">
-                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
-                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="主要负责人" >
-                    <el-select v-model="addForm.inchargerId" :disabled="addForm.userId.length==0 ||  user.role==0" filterable placeholder="请选择负责人" style="width:100%;" @change="changeIncharger">
-                        <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
-                </el-form-item>
-                
-            </el-form>
-            <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
-            </div>
-        </el-dialog> -->
-
         <!--用户详细信息弹出框-->
-        <el-dialog title="查看详情" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
-            <div class="line"><span>姓名</span><span>{{userDetail.name}}</span></div>
-            <div class="line"><span>工号</span><span>{{userDetail.jobNumber}}</span></div>
-            <div class="line"><span>手机号码</span><span>{{userDetail.phone}}</span></div>
-            <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
-            <div class="line"><span>成本</span><span>{{userDetail.cost}}元/小时</span></div>
+        <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+            <div class="line"><span>{{ $t('lable.name') }}</span><span>{{userDetail.name}}</span></div>
+            <div class="line"><span>{{ $t('Worknumber') }}</span><span>{{userDetail.jobNumber}}</span></div>
+            <div class="line"><span>{{ $t('lable.phone') }}</span><span>{{userDetail.phone}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</span></div>
+            <div class="line"><span>{{ $t('costof') }}</span><span>{{userDetail.cost}}{{ $t('Yuananhour') }}</span></div>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
+                <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
         <!-- 子项目列表 -->
-        <el-dialog title="子项目列表" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('listofsubitems')" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="subProjectList" highlight-current-row  height="400" style="width: 100%;">
-            <el-table-column type="index" width="60" label="序号">
+            <el-table-column type="index" width="60" :label="$t('headerTop.serialNumber')">
                 <template slot-scope="scope" >
                         {{scope.$index+1+(page-1)*size}}
                     </template>
             </el-table-column>
-            <el-table-column prop="name" label="名称" ></el-table-column>
-            <el-table-column label="操作" width="150">
+            <el-table-column prop="name" :label="$t('names')" ></el-table-column>
+            <el-table-column :label="$t('operation')" width="150">
                 <template slot-scope="scope" >
-                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">编辑</el-button>
-                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">删除</el-button>
+                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">{{ $t('bian-ji') }}</el-button>
+                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">{{ $t('btn.delete') }}</el-button>
                 </template>
             </el-table-column>
 
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="subProjectVisible = false" >关闭</el-button>
-                <el-button type="primary" @click="addNewSubProject()" >新增子项目</el-button>
+                <el-button type="primary" @click="subProjectVisible = false" >{{ $t('Shutdown') }}</el-button>
+                <el-button type="primary" @click="addNewSubProject()" >{{ $t('addsubitems') }}</el-button>
             </div>
         </el-dialog>
 
-
-        <!-- 新增子项目弹出框 -->
-        <!-- <el-dialog title="新增/修改子项目" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <el-form ref="form2" :model="addForm" :rules="rules" label-width="100px">
-                <el-form-item label="项目名称" prop="name">
-                    <el-input v-model="addForm.name" placeholder="请输入项目名称" clearable></el-input>
-                </el-form-item>
-            </el-form>
-            <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addSubProject = false">取消</el-button>
-                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">提交456</el-button>
-            </div>
-        </el-dialog> -->
-
         <!-- 任务详情信息弹出框 -->
         <el-dialog :class="addForm.id==null?'':'jm'" :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" 
         :close-on-click-modal="false" customClass="customWidth" width="800px">
         <!-- <div style="width: 200%;height:80%;position: absolute;right:-100%;top:0;background:#000;opacity: 0;" @click="sss"></div> -->
             <el-form ref="form1" :model="addForm" :rules="taskRules" label-width="100px">
                 <!--子任务需要选择任务列表 -->
-                <el-form-item label="任务列表" prop="stages" v-if="addForm.parentTid != null">
+                <el-form-item :label="$t('tasklist')" prop="stages" v-if="addForm.parentTid != null">
                     <el-select v-model="addForm.stagesId" style="width:100%;" >
                         <el-option v-for="item in stageList" :key="item.id" :label="item.stagesName" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="类型">
+                <el-form-item :label="$t('types')">
                     <el-select v-model="addForm.taskType" style="width:100%;" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement">
                         <el-option v-for="item in taskTypeList" :key="item.id" :label="item.name" :value="item.id">
                             <i :class="item.icon" ></i>
@@ -255,40 +214,40 @@
                         </el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="任务内容" prop="name">
-                    <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" placeholder="请输入任务内容" clearable></el-input>
+                <el-form-item :label="$t('taskdefinition')" prop="name">
+                    <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" :placeholder="$t('enterthetaskcontent')" clearable></el-input>
                 </el-form-item>
                 
-                <el-form-item :label="addForm.taskType == 1 ? '截至时间' : '开始时间'" :prop="addForm.taskType == 1 ? 'endDate' : 'startDate'">
+                <el-form-item :label="addForm.taskType == 1 ? $t('deadline') : $t('starttimes')" :prop="addForm.taskType == 1 ? 'endDate' : 'startDate'">
                     <el-date-picker v-model="addForm.startDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
-                    placeholder="请选择日期" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" v-if="addForm.taskType != 1"></el-date-picker>
-                    <span style="margin-left:30px;margin-right:10px;" v-if="addForm.taskType != 1">截止时间</span>
+                    :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" v-if="addForm.taskType != 1"></el-date-picker>
+                    <span style="margin-left:30px;margin-right:10px;" v-if="addForm.taskType != 1">{{ $t('deadline') }}</span>
                     <el-date-picker v-model="addForm.endDate" type="date" value-format="yyyy-MM-dd"  
-                    placeholder="请选择日期" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement"></el-date-picker>
+                    :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement"></el-date-picker>
                     </el-form-item>
                 <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
-                <el-form-item :label="'执行人'+(index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
-                    <el-select v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" size="small" filterable clearable placeholder="请选择执行人" style="width:40%;" @change="$forceUpdate()">
+                <el-form-item :label="$t('zhi-hang-ren')+(index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
+                    <el-select v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
                             <span style="float: left">{{ item.name }}</span>
                             <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
                         </el-option>
                     </el-select>
-                    <span style="margin-left:30px;margin-right:10px;">计划工时</span>
-                    <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" v-model="executorItem.planHours" style="width:30%;" :min="1" :max="100"  placeholder="请输入计划工作时长,单位小时" ></el-input-number ><span style="margin-left:10px;">小时</span>
+                    <span style="margin-left:30px;margin-right:10px;">{{ $t('plantime') }}</span>
+                    <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement" v-model="executorItem.planHours" style="width:30%;" :min="1" :max="100"  :placeholder="$t('pleaseentertheplannedworking')" ></el-input-number ><span style="margin-left:10px;">{{ $t('time.hour') }}</span>
                     <!--移除执行人 -->
                     <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id|| permissions.projectManagement)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
                 </el-form-item>
-                <el-link type="primary" v-if="(addForm.executorListFront == null || addForm.executorListFront.length<10)&& (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id || permissions.projectManagement)" style="margin-left:35px;" @click="addExecutorLine">添加执行人</el-link>
+                <el-link type="primary" v-if="(addForm.executorListFront == null || addForm.executorListFront.length<10)&& (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id || permissions.projectManagement)" style="margin-left:35px;" @click="addExecutorLine">{{ $t('addinganexecutor') }}</el-link>
                 </div>
                 
-                <el-form-item label="优先级">
+                <el-form-item :label="$t('priority')">
                     <el-select v-model="addForm.taskLevel" style="width:100%;" >
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
                 <!-- 富文本 -->
-                <el-form-item label="详细描述" style="height: 200px">
+                <el-form-item :label="$t('detaileddescription')" style="height: 200px">
                     <!-- <Editor id="tinymce" v-model="tinymceHtml" :init="editorInit"></Editor> -->
                     <!-- <el-input type="textarea" v-model="addForm.taskDesc" :rows="3"></el-input> -->
                       <!-- <quill-edito v-model="addForm.taskDesc"></quill-edito> -->
@@ -298,28 +257,28 @@
                 <div v-if="addForm.id != null">
                     <el-divider ></el-divider>
                     <!-- 任务进展 -->
-                    <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">任务进展</i>
-                        <span ref="addPro" style="display: block; float:right;"><el-link @click="addprogress">添加任务进展</el-link></span>
+                    <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('taskprogress') }}</i>
+                        <span ref="addPro" style="display: block; float:right;"><el-link @click="addprogress">{{ $t('addtaskprogress') }}</el-link></span>
                     </p>
                     <!-- 任务进展展示 -->
                     <div style="display: none;" ref="proBox" class="progress">
                         <!-- <el-form :model="> -->
                         <el-radio-group v-model="radio">
-                            <el-radio :label="0" class="rala1">状态正常</el-radio>
-                            <el-radio :label="1" class="rala2">存在风险</el-radio>
-                            <el-radio :label="2" class="rala3">进展逾期</el-radio>
+                            <el-radio :label="0" class="rala1">{{ $t('normals') }}</el-radio>
+                            <el-radio :label="1" class="rala2">{{ $t('atrisk') }}</el-radio>
+                            <el-radio :label="2" class="rala3">{{ $t('withinthetimelimit') }}</el-radio>
                         </el-radio-group>
 
                         <el-input
                         type="textarea"
                         border="0"
                         :autosize="{ minRows: 2, maxRows: 6}"
-                        placeholder="请输入详细进展描述"
+                        :placeholder="$t('detailedprogressdescription')"
                         v-model.trim="text2"
                         style="margin:10px 0 0 0">
                         </el-input>
 
-                        <h4 style="font-weight: normal;">提醒谁查看:{{checkLists.length}}</h4>
+                        <h4 style="font-weight: normal;">{{ $t('whotoremindtocheck') +':'}}{{checkLists.length}}</h4>
 
                         <i class="el-icon-circle-plus pron_i" style="font-size: 28px;color: #409EFF;" @click="addI(0)"></i>
 
@@ -331,8 +290,8 @@
                         <div class="ssp" @click="sss"></div>
                         <!-- </el-form> -->
                         <div class="pro_btn">
-                            <el-button size="mini" @click="shutPro">取消</el-button>
-                            <el-button size="mini" type="primary" @click="addTaskProgress">发布</el-button>
+                            <el-button size="mini" @click="shutPro">{{ $t('btn.cancel') }}</el-button>
+                            <el-button size="mini" type="primary" @click="addTaskProgress">{{ $t('fa-bu') }}</el-button>
                         </div>
 
                     </div>
@@ -342,33 +301,33 @@
                             <i class="el-icon-success" style="color: #43d14f;" v-if="recentProgressInfo.status == 0"></i>
                             <i class="el-icon-success" style="color: #fd7624;" v-else-if="recentProgressInfo.status == 1"></i>
                             <i class="el-icon-success" style="color: #fd4d47;" v-else></i>
-                            <span v-if="recentProgressInfo.status == 0">状态正常</span>
-                            <span v-else-if="recentProgressInfo.status == 1">状态正常</span>
-                            <span v-else>进展逾期</span>
+                            <span v-if="recentProgressInfo.status == 0">{{ $t('normals') }}</span>
+                            <span v-else-if="recentProgressInfo.status == 1">{{ $t('normals') }}</span>
+                            <span v-else>{{ $t('withinthetimelimit') }}</span>
 
                             <el-dropdown trigger="click" style="float:right;cursor:pointer; float: right;">
                                     <i class="el-icon-more" ></i>
                                     <el-dropdown-menu slot="dropdown">
 
                                         <el-dropdown-item divided>
-                                            <span @click="deleteTaskProgress(recentProgressInfo.id)"><i class="el-icon-delete"></i>删除列表</span></el-dropdown-item>
+                                            <span @click="deleteTaskProgress(recentProgressInfo.id)"><i class="el-icon-delete"></i>{{ $t('deleteList ') }}</span></el-dropdown-item>
                                     </el-dropdown-menu>
                             </el-dropdown>
-                            <div class="elCard_qu">{{recentProgressInfo.creatorName}}更新于{{recentProgressInfo.indate | relativeTime}}</div>
+                            <div class="elCard_qu">{{recentProgressInfo.creatorName}}{{ $t('geng-xin-yu') }}{{recentProgressInfo.indate | relativeTime}}</div>
                             <p style="padding-left: 20px;">{{recentProgressInfo.content}}</p>
-                            <div class="examine"><el-button type="text" @click="innerVisibless = true" style="color: #8F87A3;">查看历史记录</el-button></div>
+                            <div class="examine"><el-button type="text" @click="innerVisibless = true" style="color: #8F87A3;">{{ $t('viewingHistory') }}</el-button></div>
                         </div>
                     </div>
 
                     <!-- 任务列表没有数据的时候展示 -->
                     <div class="nones" v-if="ProgressList.length <= 0">
-                        暂无数据    
+                        {{ $t('nodata') }} 
                     </div>
 
                     <!-- 任务进展完整状态 -->
-                    <el-dialog title="提示" :visible.sync="innerVisibless" append-to-body width="500px">
+                    <el-dialog :title="$t('other.prompts')" :visible.sync="innerVisibless" append-to-body width="500px">
                     <div class="integrity">
-                        <h3 style="font-weight: normal;display: inline-block;margin: 0 0 20px 0;">任务进展:{{ProgressList.length}}</h3>
+                        <h3 style="font-weight: normal;display: inline-block;margin: 0 0 20px 0;">{{ $t('taskprogress') }}:{{ProgressList.length}}</h3>
                         <!-- <span class="write"><i class="el-icon-circle-plus"></i>填写进展</span> -->
                          <el-divider></el-divider>
 
@@ -383,9 +342,9 @@
                                         <span v-if="activity.status == 1" style="color: #FD7624" class="icon"></span>
                                         <span v-if="activity.status == 2" style="color: red" class="icon"></span>
                                         <div>
-                                            <span v-if="activity.status == 0" style="color: #43D14F">状态正常</span>
-                                            <span v-if="activity.status == 1" style="color: #FD7624">存在风险</span>
-                                            <span v-if="activity.status == 2" style="color: red">进展逾期</span>
+                                            <span v-if="activity.status == 0" style="color: #43D14F">{{ $t('normals') }}</span>
+                                            <span v-if="activity.status == 1" style="color: #FD7624">{{ $t('atrisk') }}</span>
+                                            <span v-if="activity.status == 2" style="color: red">{{ $t('withinthetimelimit') }}</span>
                                             <span style="display: inline-block; float: right; color: #8C8C8C">{{activity.indate | relativeTime}}</span>
                                         </div>
                                         <p style="color: #8C8C8C">{{activity.content}}</p>
@@ -397,55 +356,19 @@
                          <!--  -->
                     </div>
                     <span slot="footer" class="dialog-footer">
-                        <el-button type="primary" @click="innerVisibless = false">关闭</el-button>
+                        <el-button type="primary" @click="innerVisibless = false">{{ $t('Shutdown') }}</el-button>
                     </span>
                     </el-dialog>
-
-                    <!-- 子任务 -->
-                    <!-- <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">子任务</i>
-                        <el-link style="float:right;" @click="addSubTask">添加子任务</el-link>
-                    </p> -->
-                    <!--子任务列表 -->
-                    <!-- <el-table :data="addForm.subTaskList" 
-                            :header-cell-style="{'font-weight':'normal'}"
-                            highlight-current-row v-loading="listLoading" style="width: 100%;margin-top:10px;" @row-click="taskLineClick">
-                                <el-table-column prop="taskStatus" label="完成" width="50" >
-                                <template slot-scope="scope">
-                                   <el-checkbox :disabled="scope.row.taskStatus==2" :checked="scope.row.taskStatus==1?true:false" size="large" class="cb"  
-                                                @click.stop.native=""
-                                                @change="finishTask(scope.row)"
-                                                ></el-checkbox>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="name" label="标题" >
-                                <template slot-scope="scope">
-                                    <el-tooltip class="item" effect="dark" :content="scope.row.name" placement="top">
-                                    <span style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;" > {{scope.row.name}}</span>
-                                    </el-tooltip>
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="executorName" label="执行人" width="100" >
-                                <template slot-scope="scope">
-                                    {{scope.row.executorName == null?"待分配":scope.row.executorName}}
-                                </template>
-                            </el-table-column>
-                            <el-table-column prop="endDate" label="截止时间" width="100" >
-                                <template slot-scope="scope">
-                                    <p v-if="scope.row.endDate >= times">{{scope.row.endDate}}</p>
-                                    <p v-else style="background: #e62412; color: #fff;text-align: center; border-radius: 3px;">{{scope.row.endDate}}</p>
-                                </template>
-                            </el-table-column>
-                        </el-table> -->
                     </div>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button v-if="user.id == addForm.createrId || currentProject.inchargerId == user.id || currentProject.creatorId == user.id || permissions.projectManagement" @click.native="deleteTask" style="float:left;">删除</el-button>
-                <el-button @click.native="addFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
+                <el-button v-if="user.id == addForm.createrId || currentProject.inchargerId == user.id || currentProject.creatorId == user.id || permissions.projectManagement" @click.native="deleteTask" style="float:left;">{{ $t('btn.delete') }}</el-button>
+                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
             <div slot="title" v-if="addForm.parentTid != null" >
                 <!-- <el-link @click="backToParentTask"><i class="el-icon-arrow-left single_line">返回父级任务</i> | {{addForm.parentTname}}</el-link> -->
-                <el-page-header  @back="backToParentTask" title="返回父任务" :content="addForm.parentTname"></el-page-header>
+                <el-page-header  @back="backToParentTask" :title="$t('parenttask')" :content="addForm.parentTname"></el-page-header>
             </div>
             <!-- 评论 -->
             <div class="remark" v-show="addForm.id != null">
@@ -453,7 +376,7 @@
                     <!-- <span  v-for="(pl, i) in critic" :key="i"> -->
                         <!-- <div class="player" v-if="pl"> -->
                         <div class="player">
-                            <p @click="chan">参与人</p>
+                            <p @click="chan">{{ $t('participantin') }}</p>
                             <span  v-for="(pl, i) in critic" :key="i">
                             <div class="bj" style="width: 14%">
                                 <span style="background: #778899">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
@@ -463,14 +386,14 @@
                         </div>
                     <!-- </span> -->
                     <div class="subject">
-                        <div class="sub-all">所有动态</div>
+                        <div class="sub-all">{{ $t('alldynamic') }}</div>
                         <div class="sub-details" ref="main">
                             <ul class="infinite-list" v-infinite-scroll="load" style="overflow:auto" ref="contRoll">
                                 <div style="width: 100%" v-if="commentList.length <= 0">
                                     <img src="../../assets/image/xiao.png" alt="">
                                 </div>
                                 <li v-for="i in count" class="infinite-list-item counli" :key="i">
-                                    <p><i class="el-icon-s-fold"></i> <em>屈经理完成了依赖任务</em><span>4月20日</span></p>
+                                    <p><i class="el-icon-s-fold"></i> <em>{{ $t('managerQucompletedthedependencytask') }}</em><span>{{ $t('onApril20') }}</span></p>
                                 </li>
                                 <li class="carts" v-for="item in commentList" :key="item.id">
                                     <!-- <el-image style="width: 30px; height: 30px" :src="url" :fit="fit"></el-image> -->
@@ -493,13 +416,13 @@
                         <div class="issue_fixation">
                             <div class="inputDeep"><el-input
                             type="textarea"
-                            placeholder="请输入内容"
+                            :placeholder="$t('pleaseentercontent')"
                             :autosize="{ minRows: 6, maxRows: 6}"
                             v-model.trim="textarea2"
                             class="inputDeeps"
                             >
                             </el-input></div>
-                            <el-button class="issue-button" type="primary" @click="release()">发布</el-button>
+                            <el-button class="issue-button" type="primary" @click="release()">{{ $t('fa-bu') }}</el-button>
                         </div>
                     </div>
                 </span>
@@ -725,7 +648,7 @@ import { error } from 'dingtalk-jsapi';
                     userId: [],
                 },
                 rules: {
-                    name: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('Pleaseenteraprojectname'), trigger: "blur" }],
                 },
                 idx: 1,
                 taskDetails: false,
@@ -733,13 +656,13 @@ import { error } from 'dingtalk-jsapi';
                     name: '',
                 },
                 rules: {
-                    name: [{ required: true, message: "请输入分组名称", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('pleaseenteragroupname'), trigger: "blur" }],
                 },
                 rules2: {
-                    stagesName: [{ required: true, message: "请输入任务列表名称", trigger: "blur" }],
+                    stagesName: [{ required: true, message: this.$t('pleaseenteratasklistname'), trigger: "blur" }],
                 },
                 taskRules : {
-                    name: [{ required: true, message: "请输入任务内容", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('enterthetaskcontent'), trigger: "blur" }],
                 },
                 sleectId: null,
                 sleectProjectId: null,
@@ -752,7 +675,7 @@ import { error } from 'dingtalk-jsapi';
                 radio: 0,
                 critic: [], // 评论头像的数组
                 editorOption: { // 富文本框里面的默认值
-                    placeholder: '请输入文本...',
+                    placeholder: this.$t('pleaseentethetext'),
                      modules: {
                         toolbar:[
                             ['bold', 'italic', 'underline', 'strike'],    //加粗,斜体,下划线,删除线
@@ -783,28 +706,28 @@ import { error } from 'dingtalk-jsapi';
                 text2: '',
                 innerVisibless: false, // 任务展示弹出层
                 activities: [{
-                    content: '状态正常',
-                    timestamp: '7小时前',
+                    content: this.$t('normals'),
+                    timestamp: this.$t('hoursago'),
                     size: 'large',
                     type: 'primary',
                     icon: 'el-icon-circle-check',
                     color: '#409EFF'
                     }, {
-                    content: '进展逾期',
-                    timestamp: '八小时前',
+                    content: this.$t('withinthetimelimit'),
+                    timestamp: this.$t('hoursago8'),
                     color: '#F87872'
                     }],
                 ProgressList: [],
                 checkboxGrounp: [], // 选中人的数据
                 checkLists: [], // 选中人数据的ID
                 taskIid: null,
-                viewList: [{id:1,name:"全部任务"},{id:2,name:"进行中的任务"},{id:3,name:"已完成的任务"},{id:4,name:"待安排任务"},
-                {id:5,name:"我创建的任务"},{id:6,name:"我执行的任务"},{id:7,name:"今天的任务"},{id:8,name:"已超期的任务"}],
-                importanceList:[{id:0,name:"一般"},{id:1,name:"重要"},{id:2,name:"紧急"},],
-                taskTypeList:[{id:0,name:"任务", icon:"iconfont firerock-iconrenwu"},{id:1,name:"里程碑",icon:"iconfont firerock-iconicon-"},{id:2,name:"风险",icon:"iconfont firerock-iconfengxian"}],
+                viewList: [{id:1,name:this.$t('alltaskss')},{id:2,name:this.$t('taskinprogress')},{id:3,name:this.$t('missionscompleted')},{id:4,name:this.$t('taskscheduled')},
+                {id:5,name:this.$t('createdthetask')},{id:6,name:this.$t('missionIwason')},{id:7,name:this.$t('todaytask')},{id:8,name:this.$t('taskthatisoverdue')}],
+                importanceList:[{id:0,name:this.$t('yi-ban')},{id:1,name:this.$t('zhong-yao')},{id:2,name:this.$t('jin-ji')},],
+                taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
                 taskTypeColor:['#20A0FF','#8613ad','#bf0404'],
                 taskTypeIcon:['iconfont firerock-iconrenwu','iconfont firerock-iconicon-','iconfont firerock-iconfengxian'],
-                taskStatusList:['进行中','已完成','已撤销'],
+                taskStatusList:[this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
                 //优先级
                 taskLevelColor:['#262626','#E6A23C','#F56C6C'],
                 stageList: '',
@@ -826,9 +749,9 @@ import { error } from 'dingtalk-jsapi';
             },
 
             deleteSubPro(subProject) {
-                this.$confirm("确定要删除子项目" + subProject.name + "吗?","删除子项目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('makesuretodeletethesubproject') + subProject.name + this.$t('ma'),this.$t('deletesubproject'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -840,7 +763,7 @@ import { error } from 'dingtalk-jsapi';
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.subProject(this.currentProject);
@@ -1044,7 +967,7 @@ import { error } from 'dingtalk-jsapi';
             //显示新增界面
             handleAdd(i, item) {
                 if(i == -1) {
-                    this.title = "新增任务";
+                    this.title = this.$t('addWork');
                     this.addForm = {
                         name: '',
                         userId: [],
@@ -1052,7 +975,7 @@ import { error } from 'dingtalk-jsapi';
                         inchargerId:null,
                     }
                 } else {
-                    this.title = "修改项目";
+                    this.title = this.$t('modifytheproject');
                     var list = item.participator , arr = [];
                     for(var j in list) {
                         arr.push(list[j].id)
@@ -1078,7 +1001,7 @@ import { error } from 'dingtalk-jsapi';
                         res => {
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: "操作成功",
+                                    message: this.$t('operationissuccessful'),
                                     type: "success"
                                 });
                                 this.subProject(this.currentProject);
@@ -1154,9 +1077,9 @@ import { error } from 'dingtalk-jsapi';
 
             // 删除
             deletePro(i, item) {
-                this.$confirm("确定要项目" + item.projectName + "吗?","删除项目", {
-                    confirmButtonText: "确定",
-                    cancelButtonText: "取消",
+                this.$confirm(this.$t('identifytheproject') + item.projectName + this.$t('ma'),this.$t('deletetheproject'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: "warning"
                 })
                 .then(() => {
@@ -1168,7 +1091,7 @@ import { error } from 'dingtalk-jsapi';
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.$message({
-                                message: "删除成功",
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                             this.getList();
@@ -1220,7 +1143,7 @@ import { error } from 'dingtalk-jsapi';
                 res => {
                     if (res.code == "ok") {
                         this.$message({
-                            message: "操作成功",
+                            message: this.$t('operationissuccessful'),
                             type: "success"
                         });
                         this.getList();
@@ -1245,7 +1168,7 @@ import { error } from 'dingtalk-jsapi';
                 // console.log(task)
                 this.addFormVisible = true;
                 // this.addLoading = false;
-                this.title = "编辑任务";
+                this.title = this.$t('editingtasks');
                 this.getTaskDetail(task.id);
                 this.getTaskProgressList(task.id); // 获取任务进展列表 
                 this.getUsers(); // 获取名单数据
@@ -1408,7 +1331,7 @@ import { error } from 'dingtalk-jsapi';
                             this.shutPro()
                             this.getTaskProgressList(this.taskIid)
                             this.$message({
-                                message: '发布成功',
+                                message: this.$t('releasesuccess'),
                                 type: "success"
                             });
                             this.checkboxGrounp = [],
@@ -1431,7 +1354,7 @@ import { error } from 'dingtalk-jsapi';
                         if (res.code == "ok") {
                             this.getTaskProgressList(this.taskIid)
                             this.$message({
-                                message: '删除成功',
+                                message: this.$t('message.successfullyDeleted'),
                                 type: "success"
                             });
                         } else {
@@ -1511,7 +1434,7 @@ import { error } from 'dingtalk-jsapi';
                 this.addFormVisible = true;
                 this.addForm = {projectId: stage.projectId, groupId: stage.groupId, stagesId: stage.id, taskLevel:0, planHours: 8, taskType: 0};
                 this.addLoading = false;
-                this.title="创建任务";
+                this.title=this.$t('createtask ');
                 this.commentList = [];
             },
             addStage() {
@@ -1539,7 +1462,7 @@ import { error } from 'dingtalk-jsapi';
                     this.textContent = false
                      this.$message({
                         showClose: true,
-                        message: '图片超过了2MB,请重新上传',
+                        message: this.$t('imageexceeds2MBpleaseuploaditagain'),
                         type: 'warning'
                     });
                 }
@@ -1550,7 +1473,7 @@ import { error } from 'dingtalk-jsapi';
             },
             // 点击发布
             release() {
-                if(this.textarea2.length <= 0) return this.$message({message: "请输入内容", type: "error"})
+                if(this.textarea2.length <= 0) return this.$message({message: this.$t('pleaseentercontent'), type: "error"})
                 this.http.post('/task-comment/add', {taskId: this.taskId, userId: this.user.id, content: this.textarea2},
                 res => {
                     if(res.code == "ok"){
@@ -1581,7 +1504,7 @@ import { error } from 'dingtalk-jsapi';
             submitInsert() {
                 if (this.textContent !== true) return  this.$message({
                     showClose: true,
-                    message: '图片太大,请重新上传',
+                    message: this.$t('pictureistoolargepleaseuploaditagain'),
                     type: 'warning'
                 });
                 //检查是有重名的执行人
@@ -1597,7 +1520,7 @@ import { error } from 'dingtalk-jsapi';
                     if (findSameUser) {
                         return this.$message({
                             showClose: true,
-                            message: '执行人存在重复',
+                            message: this.$t('executorhasduplication'),
                             type: 'error'
                         });
                     }
@@ -1613,7 +1536,7 @@ import { error } from 'dingtalk-jsapi';
                             res => {
                                 if (res.code == "ok") {
                                     this.$message({
-                                        message: "提交成功",
+                                        message: this.$t('message.submittedSuccessfully'),
                                         type: "success"
                                     });
                                     
@@ -1672,11 +1595,11 @@ import { error } from 'dingtalk-jsapi';
             deleteTask() {
                 var warning='';
                 if (this.addForm.subTaskList.length > 0) {
-                    warning='您确定要删除当前任务及其子任务吗?';
+                    warning=this.$t('currenttaskanditssubtasks');
                 } else {
-                    warning='您确定要删除当前任务吗?';
+                    warning=this.$t('wanttodeletethecurrent task');
                 }
-                this.$confirm(warning, "提示", {
+                this.$confirm(warning, this.$t('other.prompts'), {
                     //type: 'warning'
                 }).then(() => {
                     this.http.post('/task/delete',{id: this.addForm.id},

Diff do ficheiro suprimidas por serem muito extensas
+ 289 - 291
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue


+ 6 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -848,8 +848,9 @@
                 </el-form-item>
                 <el-form-item prop="stateKey" :label="$t('other.doesItContain')">
                     <el-select v-model="stateKey" :placeholder="$t('defaultText.pleaseChoose')" filterable style="width:350px;">
-                        <el-option :label="$t('other.doesNotIncludeUnreviewed')" value="0"></el-option>
-                        <el-option :label="$t('other.containsUnreviewed')" value="1"></el-option>
+                        <el-option :label="$t('state.alreadyPassed')" value="0"></el-option>
+                        <el-option :label="$t('state.WaitingAudit')" value="2"></el-option>
+                        <el-option :label="$t('state.alreadyPassedAndWaitingAudit')" value="1"></el-option>
                     </el-select>
                 </el-form-item>
             </el-form>
@@ -1458,7 +1459,7 @@
                 timeFields:['timeType', 'workingTime', 'startTime', 'progress'],
                 subProjectList:[],
                 canEdit: true,
-                timeRange:[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0],
+                timeRange:[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0],
                 selectTime:null,
                 reportTimeType:{},
                 curDate:'',
@@ -1830,7 +1831,8 @@
             getTaskGroups(domain, index) {
                 domain.groupId=null;
                 this.http.post('/task-group/listMyJoinGroup',{ 
-                    projectId: domain.projectId
+                    projectId: domain.projectId,
+                    isSubstitude: this.isBatch == 2 ? 1 : 0
                 },
                 res => {
                     if (res.code == "ok") {

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

@@ -3,14 +3,14 @@
         <!--工具条-->
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
-                <el-form-item label="部门:">
-                    <el-cascader v-model="search.departmentId" placeholder="请选择部门" style="width: 100%"
+                <el-form-item :label="$t('lable.department') + ':'">
+                    <el-cascader v-model="search.departmentId" :placeholder="$t('qing-xuan-ze-bu-men')" style="width: 100%"
                     :options="option" :props="{ checkStrictly: false,expandTrigger: 'hover' }" :show-all-levels="false" clearable
                     @change="getList()" size="small"
                     ></el-cascader>
                 </el-form-item>
-                <el-form-item label="项目:">
-                    <el-select v-model="search.projectId" placeholder="请选择" clearable @change="getList()" filterable="true" size="small">
+                <el-form-item :label="$t('other.project') + ':'">
+                    <el-select v-model="search.projectId" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="getList()" filterable="true" size="small">
                         <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;margin-left: 20px">{{ item.projectName }}</span>
@@ -20,15 +20,15 @@
                 <el-form-item style="margin-left:20px;">
                     <template>
                         <div>
-                            <el-select v-model="search.dateType" placeholder="请选择" style="width: 80px" @change="dataFlgs()" size="small">
+                            <el-select v-model="search.dateType" :placeholder="$t('defaultText.pleaseChoose')" style="width: 80px" @change="dataFlgs()" size="small">
                                 <el-option v-for="item in dataFlgList" :key="item.value" :label="item.label" :value="item.value">
                                 </el-option>
                             </el-select>
                             <el-date-picker v-if="search.dateType == 0" v-model="search.date" :editable="false" format="yyyy-MM-dd" value-format="yyyy-MM-dd" size="small" 
-                                @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker>
+                                @change="getList()" :clearable="true" type="date" :placeholder="$t('defaultText.selectWorkDate')"></el-date-picker>
                             <!-- <el-date-picker v-if="search.dateType == 0" v-model="date" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"  @change="getList()" :clearable="true">
                             </el-date-picker> -->
-                             <el-date-picker size="small" v-if="search.dateType == 1" v-model="search.date" type="month" placeholder="请选择月份" format="yyyy-MM" value-format="yyyy-MM"  @change="dataYue()" :clearable="true">
+                             <el-date-picker size="small" v-if="search.dateType == 1" v-model="search.date" type="month" :placeholder="$t('peaseselectmonth')" format="yyyy-MM" value-format="yyyy-MM"  @change="dataYue()" :clearable="true">
                              </el-date-picker>
                         </div>
                     </template>
@@ -36,12 +36,12 @@
                     @change="getList()" :clearable="true" type="date" placeholder="选择工作日期"></el-date-picker> -->
                 </el-form-item>
                 <el-form-item   style="margin-left:20px;">
-                    <el-button @click="batchApprove(true)" style="margin-left:10px;" :disabled="multipleSelection.length==0" size="small">批量通过</el-button>
-                    <el-button @click="batchApprove(false)"  :disabled="multipleSelection.length==0" size="small">批量驳回</el-button>
-                    <el-button @click="approveAll" style="margin-left:10px;" :disabled="list.length==0" size="small">一键全部通过</el-button>
+                    <el-button @click="batchApprove(true)" style="margin-left:10px;" :disabled="multipleSelection.length==0" size="small">{{ $t('Batchthrough') }}</el-button>
+                    <el-button @click="batchApprove(false)"  :disabled="multipleSelection.length==0" size="small">{{ $t('Batchrejected') }}</el-button>
+                    <el-button @click="approveAll" style="margin-left:10px;" :disabled="list.length==0" size="small">{{ $t('throughwithoneclick') }}</el-button>
                 </el-form-item>
                 <el-form-item style="margin-left:20px;" v-if="permissions.importAudit">
-                   <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>
         </el-col>
@@ -106,39 +106,39 @@
                 </template>
             </el-table-column> -->
             
-            <el-table-column prop="name" label="姓名" sortable></el-table-column>
-            <el-table-column prop="date" label="日期" sortable>
+            <el-table-column prop="name" :label="$t('lable.name')" sortable></el-table-column>
+            <el-table-column prop="date" :label="$t('weekDay.date')" sortable>
             </el-table-column>
-            <el-table-column prop="project" label="项目" >
+            <el-table-column prop="project" :label="$t('other.project')" >
             </el-table-column>
-            <el-table-column prop="time" label="工作时长(h)">
+            <el-table-column prop="time" :label="$t('screening.workTime') + '(h)'">
                 <template slot-scope="scope">
                     <span>{{scope.row.time.toFixed(1)}}</span>
                 </template>
             </el-table-column>
-            <el-table-column prop="state" label="状态">
+            <el-table-column prop="state" :label="$t('state.states')">
                 <template slot-scope="scope">
-                    <span v-if="scope.row.state == -1" style="color:#DAA520;">待审核</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-if="scope.row.state == -1" style="color:#DAA520;">{{ $t('state.WaitingAudit') }}</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 v-if="scope.row.state == -1" type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">通过</el-button>
-                    <el-button v-if="scope.row.state == -1" type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.date, scope.row)">驳回</el-button>
-                    <el-button v-if="scope.row.state == 1" type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,1,scope.row.date, scope.row)">撤销</el-button>
+                    <el-button v-if="scope.row.state == -1" type="primary" :loading="logining" size="small" @click="approve(scope.row.id,scope.row.date, scope.row)">{{ $t('btn.through') }}</el-button>
+                    <el-button v-if="scope.row.state == -1" type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,0,scope.row.date, scope.row)">{{ $t('btn.rejected') }}</el-button>
+                    <el-button v-if="scope.row.state == 1" type="danger" :loading="logining" size="small" @click="showDenyDialog(scope.row.id,1,scope.row.date, scope.row)">{{ $t('btn.undo') }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
         <!--驳回弹出框 -->
-        <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>
-                <el-input type="textarea" v-model="denyForm.reason" rows="2" :placeholder="'请输入您决定'+(denyForm.i==0?'驳回':'撤销')+'的原因'" />
+                <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()" >确定</el-button>
+                <el-button  @click="denyReasonDialog = false" >{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="deny()" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
         <!--工具条-->
@@ -155,13 +155,13 @@
         </el-col>
 
         <!-- 审核记录弹窗 -->
-        <el-dialog title="审核记录" :visible.sync="recordDialogVisible" width="800px" :before-close="handleClose">
+        <el-dialog title="$t('Auditrecords')" :visible.sync="recordDialogVisible" width="800px" :before-close="handleClose">
             <div style="height: 430px">
                 <el-table :data="recordLists" style="width: 100%" height="400" v-loading="recordLoading">
-                    <el-table-column prop="userName" label="操作人" width="150"></el-table-column>
-                    <el-table-column prop="indate" label="审核时间"></el-table-column>
-                    <el-table-column prop="result" label="审核结果"></el-table-column>
-                    <el-table-column prop="date" label="员工/日期" width="200">
+                    <el-table-column prop="userName" :label="$t('other.operator')" width="150"></el-table-column>
+                    <el-table-column prop="indate" :label="$t('AuditTime')"></el-table-column>
+                    <el-table-column prop="result" :label="$t('Reviewtheresults')"></el-table-column>
+                    <el-table-column prop="date" :label="$t('EmployeeDate')" width="200">
                         <template slot-scope="scope">
                             <div>
                                 <div v-if="scope.row.membdateList.length > 1">
@@ -236,7 +236,7 @@
                 multipleSelection: [],
                 date: '',
                 dataFlg: 0,
-                dataFlgList:[{label: '日期', value: 0}, {label: '月份', value: 1}],
+                dataFlgList:[{label: this.$t('weekDay.date'), value: 0}, {label: this.$t('monany'), value: 1}],
                 yuefen: '',
                 recordDialogVisible: false,
                 recordLists: [],
@@ -319,9 +319,9 @@
             },
             //一键全部通过
             approveAll() {
-                this.$confirm('是否确认通过全部部门和日期的待审核数据?','提示',{
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
+                this.$confirm(this.$t('confirmapprovalofpendingdataforalldepartmentsanddates'),this.$t('other.prompts'),{
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
                     type: 'warning'
                 }).then(()=>{
                     this.http.post('/report/approveAllImport',{},
@@ -331,7 +331,7 @@
                         if (res.code == "ok") {
                             this.getList();
                             this.$message({
-                            message: '审核成功',
+                            message: this.$t('message.Reviewsucceeded'),
                             type: "success"
                             });
                         } else {
@@ -474,7 +474,7 @@
                     this.logining = false;
                     if (res.code == "ok") {
                         this.$message({
-                            message: "审核成功",
+                            message: this.$t('message.Reviewsucceeded'),
                             type: "success"
                         });
                         this.getList();
@@ -547,7 +547,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();

+ 23 - 23
fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

@@ -2,11 +2,11 @@
     <section >
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
-                <el-form-item label="审批流程设置">
+                <el-form-item :label="$t('approvalprocesssetting')">
                 </el-form-item>
             </el-form>
         </el-col>
-        <p style="padding-top:80px;margin: 0 0 10px 10px;color:#666;">工时审批流程</p>
+        <p style="padding-top:80px;margin: 0 0 10px 10px;color:#666;">{{$t('timeApprovalProcess')}}</p>
         <div>
         <el-col :span="6" >
             <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-left:15px;" >
@@ -18,21 +18,21 @@
         <el-col :span="18" >
             <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
             <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
-                <div style="padding:5px;color:#333;" v-if="depData != null">设置 &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> 直属人员工时审批流程
-                    <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" content="仅适用于当前部门的直属人员,子部门人员的审批流程需要单独设置" placement="top-start">
+                <div style="padding:5px;color:#333;" v-if="depData != null">{{ $t('setup') }} &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> {{ $t('workinghoursapprovalprocessofdirectstaff') }}
+                    <el-tooltip effect="dark" v-if="depData != null && depData.children!=null" :content="$t('onlyapplicabletotheimmediatestaffofthecurrentdepartment')" placement="top-start">
                     <i class="el-icon-question"></i>
                     </el-tooltip>
                 </div>
-                <div style="padding:5px;" v-if="depData == null">请选择部门</div>
+                <div style="padding:5px;" v-if="depData == null">{{ $t('qing-xuan-ze-bu-men') }}</div>
                 <div style="width:100%;margin:0 auto;text-align: center; margin-top:50px;" v-if="depData != null">
-                    <span>员工填报</span>
+                    <span>{{ $t('employeeisallowed') }}</span>
                     <icon class="iconfont firerock-iconright"></icon>
                     <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
                     <icon class="iconfont firerock-iconright"></icon>
                     <span v-for="(item, index) in dataArray" :key="item.seq" >
                         
                         <el-button type="primary" v-if="item.isDeptAudit == 1" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
-                        <el-button type="primary" v-if="item.isDeptAudit == 0" >项目审核人</el-button>
+                        <el-button type="primary" v-if="item.isDeptAudit == 0" >{{ $t('other.projectAuditor') }}</el-button>
                         <icon class="iconfont firerock-iconright"></icon>
                         <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
                         <icon class="iconfont firerock-iconright"></icon>
@@ -40,11 +40,11 @@
 
                     <!--结束点 -->
                     <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
-                    审批完成
-                </div>
+                    {{ $t('approvaltocomplete') }}
+                    </div>
 
                 <div style="width:100%;margin:0 auto;margin-bottom:30px;position: absolute;bottom: 0px;text-align: center; ">
-                    <el-button type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                    <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('save') }}</el-button>
                 </div>
             </div>
             </el-scrollbar>
@@ -53,30 +53,30 @@
         </div>
         
         <!--部门选择列表 -->
-        <el-dialog  title="请选择审批部门" v-if="dialogVisible" :visible.sync="dialogVisible"  width="400px">
+        <el-dialog  :title="$t('selectheapprovingdepartment')" v-if="dialogVisible" :visible.sync="dialogVisible"  width="400px">
               <el-form label-width="80px">
-              <el-form-item label="选择部门" >
-                  <el-cascader ref="deptCascader"  v-model="curDeptId" placeholder="请选择部门" style="width: 100%" @change="chooseDept"
+              <el-form-item :label="$t('other.selectdepartment')" >
+                  <el-cascader ref="deptCascader"  v-model="curDeptId" :placeholder="$t('qing-xuan-ze-bu-men')" style="width: 100%" @change="chooseDept"
                     :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
               </el-form-item>
               </el-form>
             <div slot="footer" class="dialog-footer">
-              <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">删除</el-button>
-                <el-button type="primary" @click="addNode" >确定</el-button>
+              <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">{{ $t('btn.delete') }}</el-button>
+                <el-button type="primary" @click="addNode" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
 
         <!--管理员设置 -->
-        <el-dialog  title="请选择审批管理员" v-if="userDialogVisible" :visible.sync="userDialogVisible"  width="400px">
+        <el-dialog  :title="$t('electanapprovaladministrator')" v-if="userDialogVisible" :visible.sync="userDialogVisible"  width="400px">
               <el-form label-width="100px">
-              <el-form-item label="指定管理员" >
+              <el-form-item :label="$t('dministrator')" >
                   <el-select v-model="auditManagerId" >
                       <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                   </el-select>
               </el-form-item>
               </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="setAuditUser" >确定</el-button>
+                <el-button type="primary" @click="setAuditUser" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
     </section>
@@ -103,9 +103,9 @@
                 curUserId: null,
                 index:0,
                 roleArray:[
-                {label:"项目管理员",value:5},
-                {label:"部门主管",value:6},
-                {label:"人事管理员",value:4},
+                {label:this.$t('role.projectManager'),value:5},
+                {label:this.$t('departmenthead'),value:6},
+                {label:this.$t('personnelAdministrator'),value:4},
                 ],
                 dialogVisible:false,
                 editNode:{},
@@ -123,7 +123,7 @@
                             this.sysAuditUSer = res.data;
                             this.userDialogVisible = false;
                             this.$message({
-                                message: '设置成功',
+                                message: this.$t('setupthesuccess'),
                                 type: "success"
                             });
                         } else {
@@ -282,7 +282,7 @@
                                 this.listLoading = false;
                                 if (res.code == "ok") {
                                     this.$message({
-                                        message: '保存成功',
+                                        message: this.$t('savesuccess'),
                                         type: "success"
                                     });
                                 } else {

+ 257 - 246
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -2,7 +2,7 @@
     <div>
         <van-nav-bar title="填写日报" left-text="返回" @click-left="back" fixed left-arrow/>
 
-        <van-form class="login_form">
+        <van-form class="login_form" ref="loginForm">
             <div>
             <van-field readonly clickable name="datetimePicker" :value="form.createDate" label="时间选择" placeholder="点击选择时间" 
             @click="showPicker = true" :rules="rules.createDate" />
@@ -313,7 +313,7 @@
             <van-search v-model="userName" placeholder="请输入项目名称/编号" @clear="sea()" @blur="sea()" @search="sea()" @input="sea()"/>
             <div style="minHeight:300px;">
                 <div v-for="(item, index) in projectss" :key="item.id" class="ryuan" @click="fZr(item, index)">
-                    <p>{{item.projectName}}</p> 
+                    <p>{{item.projectName}}</p>
                     <p style="margin-top: 5px;color: #9697B2;">{{item.projectCode}}</p> 
                 </div>
             </div>
@@ -1322,276 +1322,282 @@ import timetoolVue from '../timetool/timetool.vue';
             },
             // 提交日报
             submitReport() {
-                this.dateAr = []
-                let alp = []
-                if(this.user.timeType.multiWorktime == 1) {
-                    for(var p in this.form.domains) {
-                        var slll = this.form.domains[p]
-                        for(var o in slll.worktimeList) {
-                            if(slll.worktimeList[o].startTime || slll.worktimeList[o].endTime) {
-                                let objs = {}
-                                objs.s = slll.worktimeList[o].startTime
-                                objs.e = slll.worktimeList[o].endTime
-                                alp.push(objs)
+                this.$refs.loginForm.validate().then(
+                ()=>{
+                // 验证通过
+                    this.dateAr = []
+                    let alp = []
+                    if(this.user.timeType.multiWorktime == 1) {
+                        for(var p in this.form.domains) {
+                            var slll = this.form.domains[p]
+                            for(var o in slll.worktimeList) {
+                                if(slll.worktimeList[o].startTime || slll.worktimeList[o].endTime) {
+                                    let objs = {}
+                                    objs.s = slll.worktimeList[o].startTime
+                                    objs.e = slll.worktimeList[o].endTime
+                                    alp.push(objs)
+                                }
                             }
                         }
-                    }
-                }else{
-                    for(let i in this.form.domains){
-                        let objs = {}
-                        objs.s = this.form.domains[i].startTime
-                        objs.e = this.form.domains[i].endTime
-                        alp.push(objs)
-                    }
-                }
-                this.dateAr = alp
-                    if(this.dateAr.length > 0) {
-                        let trus = this.fns()
-                        if(!trus) {
-                            this.$toast('填写的时间段重叠')
-                            return
-                        }
-                    }
-                
-                
-                // return
-                const toast = this.$toast.loading({
-                    forbidClick: true,
-                    duration: 0
-                });
-                // let formData = new FormData();
-                let formData = new URLSearchParams()
-                formData.append("draft", this.isDraft);
-                if (this.reportTimeType.type == 0) {
-                    var alldayNum = 0;
-                    var amNum = 0;
-                    var pmNum = 0;
-                    for(var i in this.form.domains) {
-                        if (this.form.domains[i].timeType == 0) {
-                            alldayNum ++;
-                        } else if (this.form.domains[i].timeType == 1) {
-                            amNum++;
-                        } else if (this.form.domains[i].timeType == 2) {
-                            pmNum++;
+                    }else{
+                        for(let i in this.form.domains){
+                            let objs = {}
+                            objs.s = this.form.domains[i].startTime
+                            objs.e = this.form.domains[i].endTime
+                            alp.push(objs)
                         }
                     }
-                    if (alldayNum > 1) {
-                        this.$toast.fail("工作时间-全天,只能选择一次");
-                        return;
-                    }
-                    if (amNum > 1) {
-                        this.$toast.fail("工作时间-上午,只能选择一次");
-                        
-                        return;
-                    }
-                    if (pmNum > 1) {
-                        this.$toast.fail("工作时间-下午,只能选择一次");
-                        return;
-                    }
-                    if (alldayNum == 1 && (amNum > 0 || pmNum > 0)) {
-                        this.$toast.fail("工作时间-全天,不能和上下午同时存在");
-                        return;
-                    }
-                } else if (this.reportTimeType.type == 3) {
-                    //总百分比不能超过100%
-                    let total = 0;
-                    this.form.domains.forEach(w=>{total += w.progress});
-                    if (total > 100) {
-                        this.$toast.fail("用时比例之和不能超过100%");
-                        return;
-                    } else if (total < 100) {
-                        this.$toast.fail("工时尚未完全分配,无法提交");
-                        return;
-                    }
-                }
-                if (this.reportTimeType.type == 1 && this.report.time) {
-                            var totalTime = 0;
-                            for (var t=0;t<this.form.domains.length; t++) {
-                                totalTime += parseFloat(this.form.domains[t].workingTime);
-                            }
-                            if (this.report.time.workHours && totalTime > parseFloat(this.report.time.workHours)) {
-                                this.$toast.fail("填报工时之和"+(totalTime)+"h不能超过考勤总工时("+this.report.time.workHours.toFixed(1)+"h)");
-                                return;
+                    this.dateAr = alp
+                        if(this.dateAr.length > 0) {
+                            let trus = this.fns()
+                            if(!trus) {
+                                this.$toast('填写的时间段重叠')
+                                return
                             }
                         }
-                
-                //填字段
-                for(var i in this.form.domains) {
-                    if (this.user.timeType.customDegreeActive == 1) {
-                        if(this.form.domains[i].degreeId) {
-                            formData.append("degreeId", this.form.domains[i].degreeId);
-                        } else {
-                            if(this.user.timeType.customDegreeStatus && this.form.domains[i].wuduList.length){
-                                this.$toast.fail('请选择' + this.user.timeType.customDegreeName)
-                                return
-                            }else{
-                                formData.append("degreeId", -1);
+                    // return
+                    const toast = this.$toast.loading({
+                        forbidClick: true,
+                        duration: 0
+                    });
+                    // let formData = new FormData();
+                    let formData = new URLSearchParams()
+                    formData.append("draft", this.isDraft);
+                    if (this.reportTimeType.type == 0) {
+                        var alldayNum = 0;
+                        var amNum = 0;
+                        var pmNum = 0;
+                        for(var i in this.form.domains) {
+                            if (this.form.domains[i].timeType == 0) {
+                                alldayNum ++;
+                            } else if (this.form.domains[i].timeType == 1) {
+                                amNum++;
+                            } else if (this.form.domains[i].timeType == 2) {
+                                pmNum++;
                             }
+                        }
+                        if (alldayNum > 1) {
+                            this.$toast.fail("工作时间-全天,只能选择一次");
+                            return;
+                        }
+                        if (amNum > 1) {
+                            this.$toast.fail("工作时间-上午,只能选择一次");
                             
+                            return;
+                        }
+                        if (pmNum > 1) {
+                            this.$toast.fail("工作时间-下午,只能选择一次");
+                            return;
+                        }
+                        if (alldayNum == 1 && (amNum > 0 || pmNum > 0)) {
+                            this.$toast.fail("工作时间-全天,不能和上下午同时存在");
+                            return;
                         }
-                    } else {
-                        formData.append("degreeId", -1);
-                    }
-                    if(this.form.domains[i].customData) {
-                        formData.append("customData", this.form.domains[i].customData);
-                    } else {
-                        formData.append("customData", "0");
-                    }
-                    if(this.form.domains[i].customText) {
-                        formData.append("customText", this.form.domains[i].customText);
-                    } else {
-                        formData.append("customText", "-");
-                    }
-                    
-                    if (this.form.domains[i].id) {
-                        formData.append("id", this.form.domains[i].id);
-                    } else {
-                        formData.append("id", -1);
-                    }
-                    formData.append("projectId", parseFloat(this.form.domains[i].projectId));
-                    if (this.form.domains[i].subProjectId) {
-                        formData.append("subProjectId", this.form.domains[i].subProjectId);
-                    } else {
-                        formData.append("subProjectId", 0);
-                    }
-                    if (this.form.domains[i].groupId) {
-                        formData.append("groupId", this.form.domains[i].groupId);
-                    } else {
-                        formData.append("groupId", 0);
-                    }
-                    if (this.form.domains[i].stage) {
-                        formData.append("stage", this.form.domains[i].stage);
-                    } else {
-                        formData.append("stage", '-');
-                    }
-                    formData.append("reportTimeType", this.reportTimeType.type);
-                    formData.append("multiWorktime", this.reportTimeType.multiWorktime);
-                    if (this.reportTimeType.type == 0) {
-                        formData.append("timeType", this.form.domains[i].timeType);
-                        formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
-                    } else if (this.reportTimeType.type == 1) {
-                        formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
-                    } else if (this.reportTimeType.type == 2) {
-                        formData.append("startTime", this.form.domains[i].startTime);
-                        formData.append("endTime",this.form.domains[i].endTime);
                     } else if (this.reportTimeType.type == 3) {
-                        formData.append("progress", this.form.domains[i].progress);
-                        formData.append("workingTime",this.form.domains[i].workingTime);
-                    }
-                    
-                    if (this.form.domains[i].taskId) {
-                        formData.append("taskId", this.form.domains[i].taskId);
-                    } else {
-                        formData.append("taskId", 0);
-                    }
-                    if (this.form.domains[i].taskFinish == true) {
-                        formData.append("taskFinish", 1);
-                    } else {
-                        formData.append("taskFinish", 0);
-                    }
-                    formData.append("createDate", this.form.createDate);
-                    formData.append("isOvertime", this.form.domains[i].isOvertime?1:0);
-                    if (this.form.domains[i].overtimeHours && this.form.domains[i].isOvertime == 1) {
-                        formData.append("overtimeHours", this.form.domains[i].overtimeHours);
-                    } else {
-                        formData.append("overtimeHours", 0);
-                    }
-                    if(this.form.domains[i].basecostId){
-                        formData.append("basecostId", this.form.domains[i].basecostId);
-                    }
-                    
-
-
-                    //项目专业进度
-                    if (this.form.domains[i].professionProgress) {
-                        let m = JSON.stringify(this.form.domains[i].professionProgress);
-                        m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
-                        formData.append("professionProgress", m);
-                    } else {
-                        formData.append("professionProgress", "[]");
-                    }
-                    //图片的处理,serverPic是当前所有的照片
-                    if (this.form.domains[i].serverPics) {
-                        let m = JSON.stringify(this.form.domains[i].serverPics);
-                        m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
-                        formData.append("pics", m);
-                    } else {
-                        formData.append("pics", "@");
+                        //总百分比不能超过100%
+                        let total = 0;
+                        this.form.domains.forEach(w=>{total += w.progress});
+                        if (total > 100) {
+                            this.$toast.fail("用时比例之和不能超过100%");
+                            return;
+                        } else if (total < 100) {
+                            this.$toast.fail("工时尚未完全分配,无法提交");
+                            return;
+                        }
                     }
-                    
-                    //处理多个时间事项
-                    if (this.reportTimeType.multiWorktime == 1) {
-                        //检查时间是否有重叠
-                        var workList = this.form.domains[i].worktimeList;
-                        for (var j=0;j<workList.length; j++) {
-                            var curItem = workList[j];
-                            if (curItem.startTime == null || curItem.endTime == null) {
-                                this.$toast.fail("请设置工作时间");
-                                return;
+                    if (this.reportTimeType.type == 1 && this.report.time) {
+                                var totalTime = 0;
+                                for (var t=0;t<this.form.domains.length; t++) {
+                                    totalTime += parseFloat(this.form.domains[t].workingTime);
+                                }
+                                if (this.report.time.workHours && totalTime > parseFloat(this.report.time.workHours)) {
+                                    this.$toast.fail("填报工时之和"+(totalTime)+"h不能超过考勤总工时("+this.report.time.workHours.toFixed(1)+"h)");
+                                    return;
+                                }
                             }
-                            //检查开始时间是否大于结束时间
-                            if (curItem.startTime >= curItem.endTime) {
-                                this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"有误:"+ 
-                                        "结束时间必须大于开始时间");
-                                return;
+                    //填字段
+                    for(var i in this.form.domains) {
+                        if (this.user.timeType.customDegreeActive == 1) {
+                            if(this.form.domains[i].degreeId) {
+                                formData.append("degreeId", this.form.domains[i].degreeId);
+                            } else {
+                                if(this.user.timeType.customDegreeStatus && this.form.domains[i].wuduList.length){
+                                    this.$toast.fail('请选择' + this.user.timeType.customDegreeName)
+                                    return
+                                }else{
+                                    formData.append("degreeId", -1);
+                                }
+                                
                             }
-                            for (var p = j+1;p<workList.length; p++) {
-                                var jItem = workList[p];
-                                if ((jItem.startTime>=curItem.startTime&&jItem.startTime < curItem.endTime)
-                                        || (jItem.endTime>curItem.startTime&&jItem.endTime <= curItem.endTime)) {
-                                    
-                                    this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"与"+ 
-                                            jItem.startTime+'-'+jItem.endTime+ "存在重叠,请修改。");
+                        } else {
+                            formData.append("degreeId", -1);
+                        }
+                        if(this.form.domains[i].customData) {
+                            formData.append("customData", this.form.domains[i].customData);
+                        } else {
+                            formData.append("customData", "0");
+                        }
+                        if(this.form.domains[i].customText) {
+                            formData.append("customText", this.form.domains[i].customText);
+                        } else {
+                            formData.append("customText", "-");
+                        }
+                        
+                        if (this.form.domains[i].id) {
+                            formData.append("id", this.form.domains[i].id);
+                        } else {
+                            formData.append("id", -1);
+                        }
+                        formData.append("projectId", parseFloat(this.form.domains[i].projectId));
+                        if (this.form.domains[i].subProjectId) {
+                            formData.append("subProjectId", this.form.domains[i].subProjectId);
+                        } else {
+                            formData.append("subProjectId", 0);
+                        }
+                        if (this.form.domains[i].groupId) {
+                            formData.append("groupId", this.form.domains[i].groupId);
+                        } else {
+                            formData.append("groupId", 0);
+                        }
+                        if (this.form.domains[i].stage) {
+                            formData.append("stage", this.form.domains[i].stage);
+                        } else {
+                            formData.append("stage", '-');
+                        }
+                        formData.append("reportTimeType", this.reportTimeType.type);
+                        formData.append("multiWorktime", this.reportTimeType.multiWorktime);
+                        if (this.reportTimeType.type == 0) {
+                            formData.append("timeType", this.form.domains[i].timeType);
+                            formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
+                        } else if (this.reportTimeType.type == 1) {
+                            formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
+                        } else if (this.reportTimeType.type == 2) {
+                            formData.append("startTime", this.form.domains[i].startTime);
+                            formData.append("endTime",this.form.domains[i].endTime);
+                        } else if (this.reportTimeType.type == 3) {
+                            formData.append("progress", this.form.domains[i].progress);
+                            formData.append("workingTime",this.form.domains[i].workingTime);
+                        }
+                        
+                        if (this.form.domains[i].taskId) {
+                            formData.append("taskId", this.form.domains[i].taskId);
+                        } else {
+                            formData.append("taskId", 0);
+                        }
+                        if (this.form.domains[i].taskFinish == true) {
+                            formData.append("taskFinish", 1);
+                        } else {
+                            formData.append("taskFinish", 0);
+                        }
+                        formData.append("createDate", this.form.createDate);
+                        formData.append("isOvertime", this.form.domains[i].isOvertime?1:0);
+                        if (this.form.domains[i].overtimeHours && this.form.domains[i].isOvertime == 1) {
+                            formData.append("overtimeHours", this.form.domains[i].overtimeHours);
+                        } else {
+                            formData.append("overtimeHours", 0);
+                        }
+                        if(this.form.domains[i].basecostId){
+                            formData.append("basecostId", this.form.domains[i].basecostId);
+                        }
+                        
+
+
+                        //项目专业进度
+                        if (this.form.domains[i].professionProgress) {
+                            let m = JSON.stringify(this.form.domains[i].professionProgress);
+                            m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
+                            formData.append("professionProgress", m);
+                        } else {
+                            formData.append("professionProgress", "[]");
+                        }
+                        //图片的处理,serverPic是当前所有的照片
+                        if (this.form.domains[i].serverPics) {
+                            let m = JSON.stringify(this.form.domains[i].serverPics);
+                            m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
+                            formData.append("pics", m);
+                        } else {
+                            formData.append("pics", "@");
+                        }
+                        
+                        //处理多个时间事项
+                        if (this.reportTimeType.multiWorktime == 1) {
+                            //检查时间是否有重叠
+                            var workList = this.form.domains[i].worktimeList;
+                            for (var j=0;j<workList.length; j++) {
+                                var curItem = workList[j];
+                                if (curItem.startTime == null || curItem.endTime == null) {
+                                    this.$toast.fail("请设置工作时间");
                                     return;
                                 }
+                                //检查开始时间是否大于结束时间
+                                if (curItem.startTime >= curItem.endTime) {
+                                    this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"有误:"+ 
+                                            "结束时间必须大于开始时间");
+                                    return;
+                                }
+                                for (var p = j+1;p<workList.length; p++) {
+                                    var jItem = workList[p];
+                                    if ((jItem.startTime>=curItem.startTime&&jItem.startTime < curItem.endTime)
+                                            || (jItem.endTime>curItem.startTime&&jItem.endTime <= curItem.endTime)) {
+                                        
+                                        this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"与"+ 
+                                                jItem.startTime+'-'+jItem.endTime+ "存在重叠,请修改。");
+                                        return;
+                                    }
+                                }
                             }
-                        }
 
-                        let m = JSON.stringify(this.form.domains[i].worktimeList);
-                        m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
-                        formData.append("content", m);
-                    } else {
-                        if (this.form.domains[i].content) {
-                            formData.append("content", this.form.domains[i].content);
+                            let m = JSON.stringify(this.form.domains[i].worktimeList);
+                            m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
+                            formData.append("content", m);
                         } else {
-                            formData.append("content", '-');
+                            if (this.form.domains[i].content) {
+                                formData.append("content", this.form.domains[i].content);
+                            } else {
+                                formData.append("content", '-');
+                            }
                         }
-                    }
 
-                    //审核人
-                    if (this.form.domains[i].projectAuditorId) {
-                        formData.append("projectAuditorId", this.form.domains[i].projectAuditorId);
-                    } else {
-                        if (this.user.timeType.reportAuditType == 0) {
-                            this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
+                        //审核人
+                        if (this.form.domains[i].projectAuditorId) {
+                            formData.append("projectAuditorId", this.form.domains[i].projectAuditorId);
                         } else {
-                            if (this.form.domains[i].taskGroups.length == 0) {
-                                this.$toast.fail("您在["+this.form.domains[i].projectName+"]项目上尚无参与的任务分组");
-                            } else if (!this.form.domains[i].groupId) {
-                                this.$toast.fail("请选择["+this.form.domains[i].projectName+"]项目的任务分组");
+                            if (this.user.timeType.reportAuditType == 0) {
+                                this.$toast.fail("请指定["+this.form.domains[i].projectName+']项目的审核人');
                             } else {
-                                this.$toast.fail("请先设置["+this.form.domains[i].projectName+']-['+this.form.domains[i].groupName+']的分组负责人');
+                                if (this.form.domains[i].taskGroups.length == 0) {
+                                    this.$toast.fail("您在["+this.form.domains[i].projectName+"]项目上尚无参与的任务分组");
+                                } else if (!this.form.domains[i].groupId) {
+                                    this.$toast.fail("请选择["+this.form.domains[i].projectName+"]项目的任务分组");
+                                } else {
+                                    this.$toast.fail("请先设置["+this.form.domains[i].projectName+']-['+this.form.domains[i].groupName+']的分组负责人');
+                                }
                             }
+                            return;
                         }
-                        return;
                     }
-                }
-                if(!this.flgLg) {
-                    return
-                }
-                this.flgLg = false
-                this.$axios.post("/report/editReport", formData)
-                .then(res => {
-                    this.flgLg = true
-                    if(res.code == "ok") {
-                        this.$toast.clear();
-                        this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
-                        this.$router.push("/index");
-                    } else {
-                        this.$toast.clear();
-                        this.$toast.fail((this.isDraft==0?'提交失败':'暂存失败')+':'+res.msg);
+                    if(!this.flgLg) {
+                        return
                     }
-                }).catch(err=> {this.$toast.clear(); this.flgLg = true});
+                    this.flgLg = false
+                    this.$axios.post("/report/editReport", formData)
+                    .then(res => {
+                        this.flgLg = true
+                        if(res.code == "ok") {
+                            this.$toast.clear();
+                            this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
+                            this.$router.push("/index");
+                        } else {
+                            this.$toast.clear();
+                            this.$toast.fail((this.isDraft==0?'提交失败':'暂存失败')+':'+res.msg);
+                        }
+                    }).catch(err=> {this.$toast.clear(); this.flgLg = true});
+                }).catch(()=>{
+                //验证失败
+                console.log('验证失败');
+                    return
+                })
+                
             },
             //初始化参数
             initWxConfig() {
@@ -1658,6 +1664,10 @@ import timetoolVue from '../timetool/timetool.vue';
         },
         
         mounted() {
+            this.timeRange = []
+            for(let i=0.5; i<=20; i+=0.5){
+                this.timeRange.push(i)
+            }
             // console.log('user',this.user)
             var ua = navigator.userAgent.toLowerCase();
             this.isIOSystem = this.isIOS();
@@ -1808,6 +1818,7 @@ import timetoolVue from '../timetool/timetool.vue';
             padding: 0.3rem 0.53333rem;
         // line-height: 40px;
         // height: 40px;
+        overflow: auto;
         color: #333;
         border-bottom: 2px solid #f6f6f6;
         width: 100%;

+ 4 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -1743,6 +1743,10 @@
         },
         
         mounted() {
+            this.timeRange = []
+            for(let i=0.5; i<=20; i+=0.5){
+                this.timeRange.push(i)
+            }
             this.getDateRange()
             // if(user.companyId == '817')
             // console.log('userId',this.user.companyId);