Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

yurk 2 lat temu
rodzic
commit
c20ad85b15
47 zmienionych plików z 22719 dodań i 2062 usunięć
  1. 50 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/WebMvcConfig.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/LocaleInformationController.java
  3. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  5. 25 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java
  6. 4 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  7. 8 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  8. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/LocaleInformation.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/LocaleInformationMapper.java
  10. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/LocaleInformationService.java
  12. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  13. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  14. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LocaleInformationServiceImpl.java
  15. 122 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  16. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  17. 26 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  18. 106 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java
  19. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/MessageUtils.java
  20. 146 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SpringUtils.java
  21. 27 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TimeZoneUtil.java
  22. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  23. 5 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  24. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties
  25. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties
  26. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_zh_CN.properties
  27. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  28. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LocaleInformationMapper.xml
  29. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  30. 33 10
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  31. 8529 0
      fhKeeper/formulahousekeeper/management-platform/workTime.2022-09-13.log
  32. 10200 0
      fhKeeper/formulahousekeeper/management-platform/workTime.log
  33. BIN
      fhKeeper/formulahousekeeper/management-platform/项目导入模板.xlsx
  34. 606 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json
  35. 606 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  36. 200 200
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  37. 164 164
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  38. 91 91
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  39. 19 19
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  40. 181 181
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  41. 377 379
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  42. 236 236
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  43. 34 34
      fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue
  44. 160 163
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  45. 288 290
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  46. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  47. 253 246
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

+ 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 {
+
+}
+

+ 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();
+    }
 }
 

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

@@ -301,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

@@ -370,7 +370,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获取到员工姓名
@@ -416,7 +416,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;
@@ -476,7 +476,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();
@@ -501,7 +501,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));
@@ -531,13 +531,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();
 }

+ 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/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 {
+
+}

+ 122 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -2750,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;
@@ -2993,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);
                         }

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

@@ -3249,6 +3249,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 titles.add("填写时间");
                 titles.add("审核人");
                 titles.add("审核时间");
+                titles.add("审核流程");
             }
             titles.add("工作事项");
             if(stateKey==1){
@@ -3465,6 +3466,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     } else {
                         row.createCell(index).setCellValue(sdf.format((Date)map.get("projectAuditTime")));
                     }
+                    index++;
+                    //审核流程显示
+                    List<ReportLog> auditLogs = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("report_ids", (int)map.get("id")));
+
+                    if (auditLogs.size() == 0) {
+                        row.createCell(index).setCellValue("");
+                    } else {
+                        String auditFlow = auditLogs.stream().map(ReportLog::getMsg).collect(Collectors.joining("->"));
+                        row.createCell(index).setCellValue(auditFlow);
+                    }
 
                     index++;
                 }
@@ -4190,6 +4201,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=用户不存在

+ 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>

Plik diff jest za duży
+ 8529 - 0
fhKeeper/formulahousekeeper/management-platform/workTime.2022-09-13.log


Plik diff jest za duży
+ 10200 - 0
fhKeeper/formulahousekeeper/management-platform/workTime.log


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


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

@@ -744,5 +744,610 @@
   "deletesupplier": "delete supplier",
   "barsupplierdata": "pieces of supplier data",
   "makesuretoremovethevendor": "Are you sure you want to delete the supplier",
-  "modifysupplier": "Modify 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?",
+  "basicinformation": "Basic Information",
+  "jihuajibie": "project level",
+  "creationdate": "Date created",
+  "shijiawancheng": "Actual Completion Date",
+  "xianguan": "Related personnel",
+  "projecttongji": "Project Statistics",
+  "wei-wan-cheng": "undone",
+  "xiangguangongcheng": "related engineering",
+  "yu-qi": "expected",
+  "dai-ren-ling": "pending claim",
+  "duetoday": "due today",
+  "limittocomplete": "overdue",
+  "yi-yu-qi": "past due",
+  "completion": "Completion",
+  "progressofeachmajor": "Professional progress",
+  "projectprogress": "Overall progress of the project",
+  "addJia": "Increase",
+  "danwei": "(unit: yuan)",
+  "hetongjinge": "Contract Amount Amendment Record",
+  "jiebnxx": "Project basic information",
+  "nderungsverlauf": "Modification",
+  "removeSao": "reduce",
+  "xiu-gai-jin-e": "Amendment amount",
+  "xiu-gai-shi-jian": "Change the time",
+  "xiugaihetongjie": "Modify contract amount",
+  "xiugayuanhetong": "Original contract amount",
+  "yuan-jin-e": "original amount",
+  "addAdding": "Add participant",
+  "addingParticipant": "Add participants",
+  "editParticipants": "Edit Participants",
+  "editkeyprojectnodes": "Edit project key nodes",
+  "jiaoyan": "Corrected cost baseline",
+  "reasoforcorrection": "Please enter the reason for correction",
+  "enterthecontractamount": "Please enter contract amount",
+  "jiaozheng": "Correction succeeded",
+  "jie-zhi-yu": "as of",
+  "kai-shi": "start",
+  "wan-cheng-yu": "completed at"
 }

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

@@ -744,5 +744,610 @@
   "deletesupplier": "删除供应商",
   "barsupplierdata": "条供应商数据",
   "modifysupplier": "修改供应商",
-  "makesuretoremovethevendor": "确定要删除供应商"
+  "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": "确认要移到回收站吗?",
+  "basicinformation": "基本信息",
+  "jihuajibie": "项目级别",
+  "creationdate": "创建日期",
+  "shijiawancheng": "实际完成日期",
+  "xianguan": "相关人员",
+  "yu-qi": "预期",
+  "xiangguangongcheng": "相关工程专业",
+  "projecttongji": "项目统计",
+  "wei-wan-cheng": "未完成",
+  "yi-yu-qi": "已逾期",
+  "dai-ren-ling": "待认领",
+  "duetoday": "今日到期",
+  "limittocomplete": "逾期完成",
+  "completion": "完成情况",
+  "projectprogress": "项目总进度",
+  "progressofeachmajor": "各专业进度",
+  "xiugaihetongjie": "修改合同金额",
+  "xiugayuanhetong": "原合同金额",
+  "xiu-gai-jin-e": "修改金额",
+  "danwei": "(单位:元)",
+  "addJia": "增加",
+  "removeSao": "减少",
+  "hetongjinge": "合同金额修改记录",
+  "xiu-gai-shi-jian": "修改时间",
+  "yuan-jin-e": "原金额",
+  "nderungsverlauf": "修改情况",
+  "jiebnxx": "项目基本信息",
+  "jiaoyan": "校正成本基线",
+  "reasoforcorrection": "请输入校正原因",
+  "editParticipants": "编辑参与人员",
+  "addingParticipant": "添加参与人",
+  "addAdding": "新增参与者",
+  "editkeyprojectnodes": "编辑项目关键节点",
+  "enterthecontractamount": "请输入合同金额",
+  "jiaozheng": "校正成功",
+  "wan-cheng-yu": "完成于",
+  "jie-zhi-yu": "截止于",
+  "kai-shi": "开始"
 }

+ 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 {

+ 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 {

+ 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();

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

@@ -4,29 +4,29 @@
             <el-row :gutter="20">
             <el-col :span="17" >
                 <div class="box info">
-                    <label>基本信息<el-link v-if="(user.id == project.creatorId || user.id == project.inchargerId) || permissions.projectManagement" @click="showEdit" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
+                    <label>{{ $t('basicinformation') }}<el-link v-if="(user.id == project.creatorId || user.id == project.inchargerId) || permissions.projectManagement" @click="showEdit" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
                     <el-row :gutter="10" >
-                        <el-col :span="5" ><span class="gray_label">项目名称:</span></el-col><el-col :span="7" ><span >{{project.projectName}}</span></el-col>
-                        <el-col :span="5" ><span class="gray_label">项目分类:</span></el-col><el-col :span="7" ><span >{{project.categoryName}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('headerTop.projectName') }}:</span></el-col><el-col :span="7" ><span >{{project.projectName}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('projectclassification') }}:</span></el-col><el-col :span="7" ><span >{{project.categoryName}}</span></el-col>
                     </el-row>
                     <el-row :gutter="10" >
-                        <el-col :span="5" ><span class="gray_label">项目描述:</span></el-col><el-col :span="7" ></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('other.projectDescription') }}:</span></el-col><el-col :span="7" ></el-col>
                         <el-col :span="18" ><span>{{project.projectDesc}}</span></el-col>
                     </el-row>
                     <el-row :gutter="10" v-if="user.timeType.projectWithDept">
-                        <el-col :span="5" ><span class="gray_label">所属部门:</span></el-col><el-col :span="7" ></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('subordinatedepartments') }}:</span></el-col><el-col :span="7" ></el-col>
                         <el-col :span="18" ><span>{{project.departmentName}}</span></el-col>
                     </el-row>
                     <el-row :gutter="10">
-                        <el-col :span="5" ><span class="gray_label">状态:</span></el-col><el-col :span="7" ><span >{{project.status==null?'-':statusTxt[project.status]}}</span></el-col>
-                        <el-col :span="5" v-if="user.company.packageEngineering==0"><span class="gray_label">完成度: </span></el-col><el-col :span="7" >
+                        <el-col :span="5" ><span class="gray_label">{{ $t('state.states') }}:</span></el-col><el-col :span="7" ><span >{{project.status==null?'-':statusTxt[project.status]}}</span></el-col>
+                        <el-col :span="5" v-if="user.company.packageEngineering==0"><span class="gray_label">{{ $t('completeness') }}: </span></el-col><el-col :span="7" >
                         <span v-if="user.company.packageEngineering==0">
                             <el-progress  :percentage="project.progress == null?0:project.progress"></el-progress>
                         </span></el-col>
                     </el-row>
                     <el-row :gutter="10">
-                        <el-col :span="5" ><span class="gray_label">项目编号: </span></el-col><el-col :span="7" ><span >{{project.projectCode}}&nbsp;</span></el-col>
-                        <el-col :span="5" v-if="permissions.projectContract"><span class="gray_label">合同金额:</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('Itemno') }}: </span></el-col><el-col :span="7" ><span >{{project.projectCode}}&nbsp;</span></el-col>
+                        <el-col :span="5" v-if="permissions.projectContract"><span class="gray_label">{{ $t('contractamount') }}:</span></el-col>
                         <el-col :span="7" >
                         <span style="float:left;" v-if="permissions.projectContract">{{project.contractAmount == null?'-':project.contractAmount | numberToCurrency}} 元</span>
                         <el-link v-if="user.id == project.creatorId || user.id == project.inchargerId" @click="contractRecord" style="float:left;"><i class="iconfont firerock-iconrecord"></i></el-link>
@@ -35,21 +35,21 @@
                         
                     </el-row>
                     <el-row :gutter="10">
-                        <el-col :span="5" ><span class="gray_label">项目级别: </span></el-col><el-col :span="7" ><span >{{levelTextShow(project.level)}}</span></el-col>
-                        <el-col :span="5" ><span class="gray_label">创建日期:</span></el-col><el-col :span="7" ><span>{{project.createDate}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('jihuajibie') }}: </span></el-col><el-col :span="7" ><span >{{levelTextShow(project.level)}}</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('creationdate') }}:</span></el-col><el-col :span="7" ><span>{{project.createDate}}</span></el-col>
                     </el-row>
                     <el-row :gutter="10">
-                        <el-col :span="5" ><span class="gray_label">计划开始日期:</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('ommencementDate') }}:</span></el-col>
                         <el-col :span="7" ><span >{{project.planStartDate==null?'-':project.planStartDate}}</span></el-col>
-                        <el-col :span="5" ><span class="gray_label">计划结束日期:</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('ji-hua-jie-shu-ri-qi') }}:</span></el-col>
                         <el-col :span="7" ><span>{{project.planEndDate == null?'-':project.planEndDate}}</span></el-col>
                     </el-row>
                     <el-row :gutter="10">
-                        <el-col :span="5" ><span class="gray_label">实际完成日期:</span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('shijiawancheng') }}:</span></el-col>
                         <el-col :span="7" ><span>{{project.finishDate==null?'-':project.finishDate}}</span></el-col>
                         <template v-if="user.timeType.outputValueStatus == 1">
-                        <el-col :span="5" ><span class="gray_label">项目产值:</span></el-col>
-                        <el-col :span="7" ><span>{{project.outputValue == null?'-':project.outputValue | numberToCurrency}} </span></el-col>
+                        <el-col :span="5" ><span class="gray_label">{{ $t('projectoutput') }}:</span></el-col>
+                        <el-col :span="7" ><span>{{project.outputValue == null?'-':project.outputValue | numberToCurrency}} {{ $t('yuan') }}</span></el-col>
                         </template>
                     </el-row>
                     <el-row :gutter="10" v-if="yonghuUser.customDegreeActive == 1">
@@ -61,48 +61,48 @@
                     <!-- this.project  -->
                     <div v-if="user.companyId == '936'">
                         <el-row :gutter="10" >
-                            <el-col :span="5" ><span class="gray_label">合同编号:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('contractno') }}:</span></el-col><el-col :span="7" ></el-col>
                             <el-col :span="18" ><span>{{project.projectSeparate.contractCode}}</span></el-col>
                         </el-row>
                         <el-row :gutter="10">
-                            <el-col :span="5" ><span class="gray_label">质保开始时间:</span></el-col><el-col :span="7" >
+                            <el-col :span="5" ><span class="gray_label">{{ $t('warrantystartime') }}:</span></el-col><el-col :span="7" >
                                 <span >{{project.projectSeparate.warrantyStartDate==null?'-':project.projectSeparate.warrantyStartDate}}</span></el-col>
-                            <el-col :span="5" ><span class="gray_label">质保截止时间:</span></el-col><el-col :span="7" ><span>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('warrantyexpirationtime') }}:</span></el-col><el-col :span="7" ><span>
                                 {{project.projectSeparate.warrantyEndDate == null?'-':project.projectSeparate.warrantyEndDate}}</span></el-col>
                         </el-row>
                         <el-row :gutter="10" >
-                            <el-col :span="5" ><span class="gray_label">自主项目类别:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('IndependentProject') }}:</span></el-col><el-col :span="7" ></el-col>
                             <el-col :span="18" ><span>{{project.projectSeparate.projectCategorySub}}</span></el-col>
                         </el-row>
                         <el-row :gutter="10" >
-                            <el-col :span="5" ><span class="gray_label">所属大区:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('region') }}:</span></el-col><el-col :span="7" ></el-col>
                             <el-col :span="18" ><span>{{project.projectSeparate.region}}</span></el-col>
                         </el-row>
                         <el-row :gutter="10" >
-                            <el-col :span="5" ><span class="gray_label">所属BU:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('subordinateBU') }}:</span></el-col><el-col :span="7" ></el-col>
                             <el-col :span="18" ><span>{{project.projectSeparate.bu}}</span></el-col>
                         </el-row>
                     </div>
                     <div v-if="user.companyId == '428'">
                         <el-row :gutter="10" >
-                            <el-col :span="5" ><span class="gray_label">项目分组:</span></el-col><el-col :span="7" ></el-col>
+                            <el-col :span="5" ><span class="gray_label">{{ $t('projectgroup') }}:</span></el-col><el-col :span="7" ></el-col>
                             <el-col :span="18" ><div v-if="project.projectSeparate"><span>{{project.projectSeparate.projectCategorySub}}</span></div></el-col>
                         </el-row>
                     </div>
                 </div>
                 <div class="box" style="margin-top:10px;">
-                    <div><label>相关人员</label>
+                    <div><label>{{ $t('xianguan') }}</label>
                     <el-link v-if="user.id == project.creatorId || user.id == project.inchargerId || permissions.projectManagement" @click="showEditPar" style="float:right;"><i class="el-icon-edit"  ></i></el-link>
                     </div>
-                    <div style="margin-top:10px;color:#999;">项目经理</div>
+                    <div style="margin-top:10px;color:#999;">{{ $t('projectmanager') }}</div>
                     <div><el-link style="margin:10px" @click="showUser(project.inchargerId)">{{project.inchargerName}}</el-link></div>
-                    <div style="margin-top:10px;color:#999;">日报审核人</div>
+                    <div style="margin-top:10px;color:#999;">{{ $t('newspaperauditor') }}</div>
                     <div>
                         <span v-if="project.auditorList.length == 0" style="margin:10px;">-</span>
                         <el-link v-for="item in project.auditorList" :key="item.id" style="margin:10px;" @click="showUser(item.auditorId)">{{item.auditorName}}</el-link>
                     </div>
                    
-                    <div v-show="project.isPublic == 0" style="color:#999;">参与人</div>
+                    <div v-show="project.isPublic == 0" style="color:#999;">{{ $t('participantin') }}</div>
                     <div v-show="project.isPublic == 0" >
                         <el-link v-for="item in project.participationList" :key="item.id" style="margin:10px;" @click="showUser(item.id)">{{item.name}}</el-link>
                         <el-button class="el-icon-plus" @click="addMembVisible=true" size="mini"></el-button>
@@ -110,17 +110,17 @@
                 </div>
 
                 <div class="box" style="margin-top:10px;" v-if="user.companyId == '936'">
-                    <div><label>关键节点</label>
+                    <div><label>{{ $t('keynodes') }}</label>
                         <el-link v-if="user.id == project.creatorId || user.id == project.inchargerId || permissions.projectManagement" @click="showEditParKeyNode" style="float:right;"><i class="el-icon-edit"  ></i></el-link>
                     </div>
                     <el-table :data="keyNodesList" style="width: 100%">
-                        <el-table-column prop="nodesName" label="节点名称" width="300"></el-table-column>
-                        <el-table-column prop="planCompleteDate" label="计划完成时间" width="150"></el-table-column>
-                        <el-table-column prop="actualCompleteDate" label="实际完成时间" width="150"></el-table-column>
-                        <el-table-column prop="states" label="状态" width="80">
+                        <el-table-column prop="nodesName" :label="$t('nameofthenode')" width="300"></el-table-column>
+                        <el-table-column prop="planCompleteDate" :label="$t('plannedcompletiontime')" width="150"></el-table-column>
+                        <el-table-column prop="actualCompleteDate" :label="$t('actualcompletiontime')" width="150"></el-table-column>
+                        <el-table-column prop="states" :label="$t('state.states')" width="80">
                             <template slot-scope="scope">
                                 <div>
-                                    {{scope.row.states == '0' ? '正常' : (scope.row.states == '1' ? '预期' : '完成')}}
+                                    {{scope.row.states == '0' ? $t('zheng-chang') : (scope.row.states == '1' ? $t('yu-qi') : $t('wan-cheng'))}}
                                 </div>
                             </template>
                         </el-table-column>
@@ -139,7 +139,7 @@
                 </div> -->
                 <!--项目相关工程专业 -->
                 <div class="box info" style="margin-top:10px;" v-if="user.company.packageEngineering == 1">
-                    <div><label>相关工程专业<el-link v-if="user.id == project.creatorId || user.id == project.inchargerId || permissions.projectManagement" @click="showEditProfession" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
+                    <div><label>{{ $t('xiangguangongcheng') }}<el-link v-if="user.id == project.creatorId || user.id == project.inchargerId || permissions.projectManagement" @click="showEditProfession" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
                     <el-row :gutter="10" v-for="item in projectProfessionListOnPage" :key="item.id">
                         <el-col :span="5" ><span >{{item.professionName}}</span></el-col>
                         <el-col :span="2" ><span >{{item.percentage}}%</span></el-col>
@@ -164,31 +164,31 @@
                 </div> -->
 
                 <div class="box" style="margin-top:10px;">
-                    <label>项目统计</label>
+                    <label>{{ $t('projecttongji') }}</label>
                     <div>
                         <el-row :gutter="10">
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">已完成</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('state.completed') }}</p>
                             <p style="font-size:20px;font-weight:bold;color:green;">{{taskSum.finishCount}}</p>
                         </el-col>
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">未完成</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('wei-wan-cheng') }}</p>
                             <p style="font-size:20px;color:blue;font-weight:bold;">{{taskSum.unfinishCount}}</p>
                         </el-col>
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">已逾期</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('yi-yu-qi') }}</p>
                             <p style="font-size:20px;color:red;font-weight:bold;">{{taskSum.timeupCount}}</p>
                         </el-col>
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">待认领</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('dai-ren-ling') }}</p>
                             <p style="font-size:20px;color:#orange;font-weight:bold;">{{taskSum.unassignCount}}</p>
                         </el-col>
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">今日到期</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('duetoday') }}</p>
                             <p style="font-size:20px;font-weight:bold;color:pink;">{{taskSum.todayTimeupCount}}</p>
                         </el-col>
                         <el-col :span="4" style="text-align:center;">
-                            <p style="color:#666;font-size:12px;">逾期完成</p>
+                            <p style="color:#666;font-size:12px;">{{ $t('limittocomplete') }}</p>
                             <p style="font-size:20px;font-weight:bold;color:gray;">{{taskSum.timeupFinishCount}}</p>
                         </el-col>
                         </el-row>
@@ -198,11 +198,11 @@
             <el-col :span="7">
                 <!--进度显示 -->
                 <div v-if="user.company.packageEngineering == 1" style="margin-bottom:10px;background:#fff;border: 1px solid #eeeeee;border-radius:5px;min-height:305px;padding-left:5px;padding-right:5px;">
-                    <p><i class="el-icon-odometer"></i><span style="margin-left:5px;">完成情况</span></p>
+                    <p><i class="el-icon-odometer"></i><span style="margin-left:5px;">{{ $t('completion') }}</span></p>
                     <el-divider></el-divider>
-                    <el-row><el-col :span="12"><span>项目总进度</span></el-col>
+                    <el-row><el-col :span="12"><span>{{ $t('projectprogress') }}</span></el-col>
                         <el-col :span="12"><el-progress :percentage="progressData.totalProjectProgress" ></el-progress></el-col></el-row>
-                    <p style="font-size:12px;color:#666;">各专业进度</p>
+                    <p style="font-size:12px;color:#666;">{{ $t('progressofeachmajor') }}</p>
                     <el-table :show-header="false" :data="progressData.professionList" row-key="id" size="small"  :tree-props="{children: 'membList', hasChildren: 'hasChildren'}">
                         <el-table-column
                         prop="professionName">
@@ -219,7 +219,7 @@
                 
                 <div style="background:#fff;border: 1px solid #eeeeee;border-radius:5px;min-height:547px;padding-left:5px;padding-right:5px;">
                     <div>
-                    <p><i class="el-icon-trophy"></i><span style="margin-left:5px;">里程碑</span></p>
+                    <p><i class="el-icon-trophy"></i><span style="margin-left:5px;">{{ $t('other.milestone') }}</span></p>
                     </div>
                     <el-timeline :reverse="reverse" style="padding-left: 3px;">
                         <el-timeline-item
@@ -236,126 +236,126 @@
             </el-row>
         </div>
         <!--用户详细信息弹出框-->
-        <el-dialog title="查看详情" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
-            <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>{{roleArray[userDetail.role]}}</span></div>
-            <div class="line"><span>部门</span><span>{{userDetail.departmentName}}</span></div>
+        <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <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('jiao-se') }}</span><span>{{roleArray[userDetail.role]}}</span></div>
+            <div class="line"><span>{{ $t('lable.department') }}</span><span>{{userDetail.departmentName}}</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="contractDialog" :visible.sync="contractDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('xiugaihetongjie')" v-if="contractDialog" :visible.sync="contractDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="contractForm" :model="contractData" :rules="contractRules" label-width="120px">
-                <el-form-item label="原合同金额"><span>{{contractData.oldContractAmount == null?'-':contractData.oldContractAmount | numberToCurrency}}(单位:元)</span></el-form-item>
-                <el-form-item label="修改金额" prop="contractAmount">
+                <el-form-item :label="$t('xiugayuanhetong')"><span>{{contractData.oldContractAmount == null?'-':contractData.oldContractAmount | numberToCurrency}}{{ $t('danwei') }}</span></el-form-item>
+                <el-form-item :label="$t('xiu-gai-jin-e')" prop="contractAmount">
                     <el-select v-model="contractData.addordelete" style="width:20%">
-                        <el-option label="增加" :value="1"></el-option>
-                        <el-option label="减少" :value="0"></el-option>
+                        <el-option :label="$t('addJia')" :value="1"></el-option>
+                        <el-option :label="$t('removeSao')" :value="0"></el-option>
                     </el-select>
                     <el-input style="width:79%" v-model="contractData.contractAmount" id="contractChange" placeholder="" clearable @keyup.native="restrictNumber('contractChange')"></el-input>
                 </el-form-item>
-                <el-form-item label="修改原因">
-                    <el-input type="textarea" :rows="2" v-model="contractData.contractAmountDesc" maxlength="200" show-word-limit placeholder="请输入修改原因" clearable></el-input>
+                <el-form-item :label="$t('modifythereason')">
+                    <el-input type="textarea" :rows="2" v-model="contractData.contractAmountDesc" maxlength="200" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="contractDialog = false">取消</el-button>
-                <el-button type="primary" @click="contractChangeSure" :loading="addLoading">提交</el-button>
+                <el-button @click.native="contractDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="contractChangeSure" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!-- 合同金额修改记录 -->
-        <el-dialog title="合同金额修改记录" v-if="contractRecordDialog" :visible.sync="contractRecordDialog" :close-on-click-modal="false" customClass="customWidth" width="1000px">
+        <el-dialog :title="$t('hetongjinge')" v-if="contractRecordDialog" :visible.sync="contractRecordDialog" :close-on-click-modal="false" customClass="customWidth" width="1000px">
             <el-table :data="contractRecordData" height="500px" :loading="contractRecordLoading" :default-sort="{prop: 'date', order: 'descending'}">
-                <el-table-column label="操作人" prop="name" min-width="100">
+                <el-table-column :label="$t('other.operator')" prop="name" min-width="100">
                     <template slot-scope="scope">
                         <!-- <span>{{users.filter(item => item.id == scope.row.editUserId)[0].name}}</span> -->
                         <span>{{filterUserContract(scope.row.editUserId)}}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="修改时间" prop="date" min-width="120">
+                <el-table-column :label="$t('xiu-gai-shi-jian')" prop="date" min-width="120">
                     <template slot-scope="scope">
                         <!-- <span>{{scope.row.updateDate[0] + '-' + scope.row.updateDate[1] + '-' + scope.row.updateDate[2] + '\u3000' + scope.row.updateDate[3] + ':' + scope.row.updateDate[4] + ':' + scope.row.updateDate[5]}}</span> -->
                         <span>{{tempDateContract(scope.row.updateDate)}}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="原金额" prop="oldContractAmount" min-width="120">
+                <el-table-column :label="$t('yuan-jin-e')" prop="oldContractAmount" min-width="120">
                     <template slot-scope="scope">
-                        <span>{{scope.row.oldContractAmount.toFixed(2)}} </span>
+                        <span>{{scope.row.oldContractAmount.toFixed(2)}}  {{ $t('yuan') }}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="修改情况" prop="record" min-width="120">
+                <el-table-column :label="$t('nderungsverlauf')" prop="record" min-width="120">
                     <template slot-scope="scope">
-                        <span>{{scope.row.oldContractAmount - scope.row.newContractAmount > 0 ? '减少' : '增加'}}</span>
-                        <span>{{scope.row.oldContractAmount - scope.row.newContractAmount > 0 ? (scope.row.oldContractAmount - scope.row.newContractAmount).toFixed(2) : (scope.row.newContractAmount - scope.row.oldContractAmount).toFixed(2)}} </span>
+                        <span>{{scope.row.oldContractAmount - scope.row.newContractAmount > 0 ? $t('addJia') : $t('addJia')}}</span>
+                        <span>{{scope.row.oldContractAmount - scope.row.newContractAmount > 0 ? (scope.row.oldContractAmount - scope.row.newContractAmount).toFixed(2) : (scope.row.newContractAmount - scope.row.oldContractAmount).toFixed(2)}} {{ $t('yuan') }}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="修改原因" prop="reason" min-width="200"></el-table-column>
+                <el-table-column :label="$t('modifythereason')" prop="reason" min-width="200"></el-table-column>
             </el-table>
         </el-dialog>
 
         
         <!--编辑基本信息界面-->
-        <el-dialog title="项目基本信息" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px">
+        <el-dialog :title="$t('jiebnxx')" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px">
             <el-form ref="basicInfoForm" :model="addForm" :rules="rules" label-width="120px">
-                <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('peaseenterthe')" 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('peaseenterthe')" clearable></el-input>
                 </el-form-item>
-                <el-form-item label="项目描述" prop="projectDesc">
-                    <el-input type="textarea" :rows="2" v-model="addForm.projectDesc" maxlength="4000" show-word-limit  placeholder="请输入项目描述" clearable></el-input>
+                <el-form-item :label="$t('other.projectDescription')" prop="projectDesc">
+                    <el-input type="textarea" :rows="2" v-model="addForm.projectDesc" maxlength="4000" show-word-limit  :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
 
-                <el-form-item label="所属部门" v-if="user.timeType.projectWithDept">
-                    <el-cascader v-model="addForm.deptId" :options="departmentList" placeholder="请选择部门"
+                <el-form-item :label="$t('subordinatedepartments')" v-if="user.timeType.projectWithDept">
+                    <el-cascader v-model="addForm.deptId" :options="departmentList" :placeholder="$t('defaultText.pleaseChoose')"
                         :props="{ checkStrictly: true, expandTrigger: 'hover' }" clearable filterable @change="cascaderChange"
                     ></el-cascader>
                 </el-form-item>
 
-                <el-form-item label="级别" >
-                    <el-select v-model="addForm.level"  placeholder="请选择级别" style="width:32%;" v-if="user.timeType.projectLevelState == 1">
+                <el-form-item :label="$t('ji-bie')" >
+                    <el-select v-model="addForm.level"  placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-if="user.timeType.projectLevelState == 1">
                         <el-option v-for="item in levelList" :key="item.id" :label="item.projectLevelName" :value="item.id"></el-option>
                     </el-select>
-                    <el-select v-model="addForm.level"  placeholder="请选择级别" style="width:32%;" v-else>
+                    <el-select v-model="addForm.level"  placeholder="$t('defaultText.pleaseChoose')" style="width:32%;" v-else>
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
                     </el-select>
-                    <span style="margin-left:50px;margin-right:10px;">合同金额</span>
+                    <span style="margin-left:50px;margin-right:10px;">{{ $t('contractamount') }}</span>
                     <el-input v-model="addForm.contractAmount" id="contractAmount" :disabled="true" style="width:32%;"
-                    placeholder="" clearable @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;"></span>
+                    placeholder="" clearable @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
                 </el-form-item>
-                <el-form-item label="开始日期" prop="planStartDate">
+                <el-form-item :label="$t('time.startDate')" prop="planStartDate">
                     <el-date-picker v-model="addForm.planStartDate" 
                      :editable="false" 
                      format="yyyy-MM-dd" 
                      value-format="yyyy-MM-dd"
                      :clearable="false" type="date" 
                      style="width:32%"
-                     placeholder="选择日期"></el-date-picker>
+                     :placeholder="$t('optiondate')"></el-date-picker>
                     <template v-if="user.timeType.outputValueStatus == 1">
-                    <span style="margin-left:50px;margin-right:10px;">项目产值</span>
+                    <span style="margin-left:50px;margin-right:10px;">{{ $t('projectoutput') }}</span>
                     <el-input v-model="addForm.outputValue" id="outputValue" style="width:32%;"
-                    placeholder="" clearable @keyup.native="restrictNumber('outputValue')"></el-input><span style="margin-left:10px;"></span>
+                    placeholder="" clearable @keyup.native="restrictNumber('outputValue')"></el-input><span style="margin-left:10px;">{{ $t('yuan') }}</span>
                     </template>
                 </el-form-item>
-                <el-form-item label="截止日期" prop="planEndDate">
+                <el-form-item :label="$t('expirationdate')" prop="planEndDate">
                     <el-date-picker v-model="addForm.planEndDate" 
                      :editable="false" 
                      format="yyyy-MM-dd" 
                      value-format="yyyy-MM-dd"
                      :clearable="false" type="date" 
                      style="width:32%"
-                     placeholder="选择日期"></el-date-picker>
+                     :placeholder="$t('optiondate')"></el-date-picker>
                 </el-form-item>
 
                 <!-- 研究中心 -->
                 <el-form-item :label="yonghuUser.customDegreeName" v-if="user.timeType.customDegreeActive != 0">
-                    <el-select v-model="auseList" multiple placeholder="请选择" filterable="true" style="width: 100%">
+                    <el-select v-model="auseList" multiple :placeholder="$t('defaultText.pleaseChoose')" filterable="true" style="width: 100%">
                         <span v-for="(item, index) in ause" :key="index">
                         <el-option :label="item.name" :value="item.id"></el-option>
                         </span> 
@@ -363,102 +363,102 @@
                 </el-form-item>
 
                 <div v-if="user.companyId == '936'">
-                    <el-form-item label="合同编号" >
-                        <el-input v-model="addForm.projectSeparate.contractCode" placeholder="请输入合同编号" clearable></el-input>
+                    <el-form-item :label="$t('contractno')" >
+                        <el-input v-model="addForm.projectSeparate.contractCode" :placeholder="$t('peaseenterthe')" clearable></el-input>
                     </el-form-item>
-                    <el-form-item label="质保开始时间">
+                    <el-form-item :label="$t('warrantystartime')">
                         <el-date-picker v-model="addForm.projectSeparate.warrantyStartDate" 
                         :editable="false" style="width:32%;" 
                         format="yyyy-MM-dd" 
                         value-format="yyyy-MM-dd"
                         :clearable="false" type="date" 
-                        placeholder="选择日期"></el-date-picker>
+                        :placeholder="$t('optiondate')"></el-date-picker>
 
-                        <span style="margin-left:63px;margin-right:10px;" >质保截止时间</span>
+                        <span style="margin-left:63px;margin-right:10px;" >{{ $t('warrantyexpirationtime') }}</span>
                         <el-date-picker v-model="addForm.projectSeparate.warrantyEndDate" style="width:33%;"
                         :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-item label="自主项目类别" >
-                        <el-input v-model="addForm.projectSeparate.projectCategorySub" placeholder="请输入自主项目类别" clearable></el-input>
+                    <el-form-item :label="$t('IndependentProject')" >
+                        <el-input v-model="addForm.projectSeparate.projectCategorySub" :placeholder="$t('peaseenterthe')" clearable></el-input>
                     </el-form-item>
-                    <el-form-item label="所属大区" >
-                        <el-input v-model="addForm.projectSeparate.region" placeholder="请输入 所属大区" clearable></el-input>
+                    <el-form-item :label="$t('region')" >
+                        <el-input v-model="addForm.projectSeparate.region" :placeholder="$t('peaseenterthe')" clearable></el-input>
                     </el-form-item>
-                    <el-form-item label="所属BU" >
-                        <el-input v-model="addForm.projectSeparate.bu" placeholder="所属BU" clearable></el-input>
+                    <el-form-item :label="$t('subordinateBU')" >
+                        <el-input v-model="addForm.projectSeparate.bu" :placeholder="$t('subordinateBU')" clearable></el-input>
                     </el-form-item>
                 </div>
 
                 <div v-if="user.companyId == '428'">
-                    <el-form-item label="项目分组" >
-                        <el-input v-model="addForm.projectSeparate.projectCategorySub" placeholder="请输入项目分组" maxlength="50" show-word-limit clearable></el-input>
+                    <el-form-item :label="$t('projectgroup')" >
+                        <el-input v-model="addForm.projectSeparate.projectCategorySub" :placeholder="$t('peaseenterthe')" maxlength="50" show-word-limit clearable></el-input>
                     </el-form-item>
                 </div>
                
             </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="addBaseFormVisible" :visible.sync="addBaseFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('jiaoyan')" v-if="addBaseFormVisible" :visible.sync="addBaseFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="basicInfoForm" label-width="120px">
                 <el-form-item v-for="(item, index) in modBaseCostData" :label="item.baseName" :key="item.id">
-                    <el-input :id="'baseCost'+index" v-model="item.baseAmount"  placeholder="请输入" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input>
+                    <el-input :id="'baseCost'+index" v-model="item.baseAmount"  :placeholder="$t('peaseenterthe')" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input>
                 </el-form-item>
-                <el-form-item label="备注" >
-                    <el-input v-model="remark"  placeholder="请输入校正原因" ></el-input>
+                <el-form-item :label="$t('bei-zhu')" >
+                    <el-input v-model="remark"  :placeholder="$t('reasoforcorrection')" ></el-input>
                 </el-form-item>
             </el-form>
             
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addBaseFormVisible = false">取消</el-button>
-                <el-button type="primary" @click="adjustBase" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addBaseFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="adjustBase" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!--编辑参与人界面-->
-        <el-dialog title="编辑参与人员" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('editParticipants')" v-if="pVisible" :visible.sync="pVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="participForm" :model="addForm" :rules="rules" label-width="120px">
-                <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('defaultText.pleaseChoose')" 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"  filterable placeholder="请选择负责人" style="width:100%;" >
+                <el-form-item :label="$t('projectmanager')" >
+                    <el-select v-model="addForm.inchargerId"  filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" >
                         <el-option v-for="item in project.participationList" :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="pVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitParticip" :loading="addLoading">提交</el-button>
+                <el-button @click.native="pVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitParticip" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!--添加参与人界面-->
-        <el-dialog title="添加参与人" v-if="addMembVisible" :visible.sync="addMembVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('addingParticipant')" v-if="addMembVisible" :visible.sync="addMembVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="addMembForm" :model="addMembForm"  label-width="120px">
-                <el-form-item label="新增参与者">
-                    <el-select v-model="addMembForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" >
+                <el-form-item :label="$t('addAdding')">
+                    <el-select v-model="addMembForm.userId" multiple filterable :placeholder="$t('defaultText.pleaseChoose')" style="width:100%;" >
                         <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>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="addMembVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitAddMemb" :loading="addLoading">提交</el-button>
+                <el-button @click.native="addMembVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitAddMemb" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!--修改工程专业界面-->
-        <el-dialog title="工程专业" v-if="editProfessionDialog" :visible.sync="editProfessionDialog" 
+        <el-dialog :title="$t('engineering')" v-if="editProfessionDialog" :visible.sync="editProfessionDialog" 
         :close-on-click-modal="false" customClass="customWidth" width="1000px">
             <el-table :data="projectProfessionList" size="small" max-height="400" :key="Math.random()">
                 <el-table-column prop="professionId" width="200">
@@ -468,22 +468,22 @@
                                        </el-select>
                                    </template>
                                    <template slot="header" >
-                                       <span style="font-size:14px;font-weight:normal;">专业名称</span>
+                                       <span style="font-size:14px;font-weight:normal;">{{ $t('nameprofessional') }}</span>
                                    </template>
                                </el-table-column>
-                               <el-table-column prop="percentage" width="100" label="占比">
+                               <el-table-column prop="percentage" width="100" :label="$t('Accountedfor')">
                                    <template slot-scope="scope">
                                        <el-input type="number" v-model="scope.row.percentage"></el-input>
                                    </template>
                                </el-table-column>
                                
-                               <el-table-column prop="membNames" label="相关人员及占比">
+                               <el-table-column prop="membNames" :label="$t('personnelproportion')">
                                    <template slot-scope="scope">
                                        <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">{{item.membName}}({{item.percentage}}%)</span>
-                                       <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?'设置专业参与人员':'设置'}}</el-link>
+                                       <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}</el-link>
                                    </template>
                                </el-table-column>
-                               <el-table-column prop="inchargerName" width="120" label="负责人">
+                               <el-table-column prop="inchargerName" width="120" :label="$t('head')">
                                    <template slot-scope="scope">
                                        <el-select v-model="scope.row.inchargerId" >
                                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
@@ -497,28 +497,28 @@
                                        <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.$index)"></el-button>
                                    </template>
                                    <template slot="header" >
-                                       <el-link type="primary" :underline="false" @click="addItem">添加</el-link>
+                                       <el-link type="primary" :underline="false" @click="addItem">{{ $t('addTian') }}</el-link>
                                    </template>
                                </el-table-column>
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button @click.native="editProfessionDialog = false">取消</el-button>
-                <el-button type="primary" @click="saveProjectProfessions" :loading="addLoading">提交</el-button>
+                <el-button @click.native="editProfessionDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="saveProjectProfessions" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
             </div>
         </el-dialog>
 
         <!-- 项目专业人员的设置 -->
-        <el-dialog title="设置项目专业人员"  v-if="editPpMembDialog" :visible.sync="editPpMembDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('setupprojectprofessionals')"  v-if="editPpMembDialog" :visible.sync="editPpMembDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-table :data="curProfessionRow.membList" height="400">
-                <el-table-column prop="name" label="专业人员">
+                <el-table-column prop="name" :label="$t('professionals')">
                     <template slot-scope="scope">
-                        <el-select v-model="scope.row.membId"  filterable placeholder="请选择专业参与人" style="width:100%;" >
+                        <el-select v-model="scope.row.membId"  filterable :placeholder="$t('professionaladdsparticipant')" style="width:100%;" >
                             <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
                             </el-option>
                         </el-select>
                     </template>
                 </el-table-column>
-                <el-table-column prop="percentage" width="120" label="占比(%)">
+                <el-table-column prop="percentage" width="120" :label="$t('zhan-bi')">
                     <template slot-scope="scope">
                         <el-input type="number" v-model="scope.row.percentage"></el-input>
                     </template>
@@ -528,45 +528,45 @@
                         <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteMembItem(scope.$index)"></el-button>
                     </template>
                     <template slot="header" >
-                        <el-link @click="addMembItem">添加</el-link>
+                        <el-link @click="addMembItem">{{ $t('addTian') }}</el-link>
                     </template>
                 </el-table-column>
             </el-table>
             <div slot="footer" class="dialog-footer">
-                <el-button  @click="editPpMembDialog = false" >取消</el-button>
-                <el-button type="primary" @click="addPpMemb" >确定</el-button>
+                <el-button  @click="editPpMembDialog = false" >{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="addPpMemb" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
         <!-- 编辑项目关键节点 -->
-        <el-dialog title="编辑项目关键节点" :visible.sync="keyNodeIsShow" width="960px" :before-close="handleClose">
+        <el-dialog :title="$t('editkeyprojectnodes')" :visible.sync="keyNodeIsShow" width="960px" :before-close="handleClose">
             <div>
                 <!--新版 -->
                 <div class="keyNodes">
-                    <div class="keyNodesName">节点名称</div>
-                    <div class="keyNodesTime">计划完成时间</div>
-                    <div class="keyNodesTime">实际完成时间</div>
-                    <div class="keyNodesTime">状态</div>
+                    <div class="keyNodesName">{{ $t('nameofthenode') }}</div>
+                    <div class="keyNodesTime">{{ $t('plannedcompletiontime') }}</div>
+                    <div class="keyNodesTime">{{ $t('actualcompletiontime') }}</div>
+                    <div class="keyNodesTime">{{ $t('state.states') }}</div>
                 </div>
                 <div class="keyNodes" v-for="item in projectKeyNodesData" :key="item.nodesId">
                     <div class="keyNodesName">{{item.nodesName}}</div>
                     <div class="keyNodesTime">
-                        <el-date-picker v-model="item.planCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  placeholder="选择日期"></el-date-picker>
+                        <el-date-picker v-model="item.planCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  :placeholder="$t('optiondate')"></el-date-picker>
                     </div>
                     <div class="keyNodesTime">
-                        <el-date-picker v-model="item.actualCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  placeholder="选择日期"></el-date-picker>
+                        <el-date-picker v-model="item.actualCompleteDate" clearable style="width: 80%" size="small" :editable="false" format="yyyy-MM-dd"  value-format="yyyy-MM-dd" type="date"  :placeholder="$t('optiondate')"></el-date-picker>
                     </div>
                     <div class="keyNodesTime">
-                        <el-select v-model="item.states" placeholder="请选择" style="width: 80%" size="small">
-                            <el-option label="正常" value="0"></el-option>
-                            <el-option label="预期" value="1"></el-option>
-                            <el-option label="完成" value="2"></el-option>
+                        <el-select v-model="item.states" :placeholder="$t('defaultText.pleaseChoose')" style="width: 80%" size="small">
+                            <el-option :label="$t('zheng-chang')" value="0"></el-option>
+                            <el-option :label="$t('yu-qi')" value="1"></el-option>
+                            <el-option :label="$t('wan-cheng')" value="2"></el-option>
                         </el-select>
                     </div>
                 </div>
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button @click="keyNodeIsShow = false">取 消</el-button>
-                <el-button type="primary" @click="submitKeyNodeaddForm()">确 定</el-button>
+                <el-button @click="keyNodeIsShow = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="submitKeyNodeaddForm()">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
         
@@ -644,7 +644,7 @@
                 deptMembData: [
                     {
                         id: 0,
-                        label: '未分配',
+                        label: this.$t('lable.unassigned'),
                     }
                 ],
                 chosenMembCount:0,
@@ -658,7 +658,7 @@
                 projectProfessionList:[],
                 modBaseCostData:[],
                 projectBaseCostData:[],
-                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')],
                 addBaseFormVisible:false,
                 addMembVisible:false,
                 addMembForm:{},
@@ -670,11 +670,11 @@
                 addFormVisible:false,
                 userDetail:{},
                 userDetailVisible: false,
-                importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
+                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')}],
                 //1-一般,2-紧急,3-重要,4-重要且紧急
-                levelTxt:["全部","正常","紧急","重要","重要且紧急"],
+                levelTxt:[this.$t('all'),this.$t('zheng-chang'),this.$t('jin-ji'),this.$t('zhong-yao'),this.$t('zhong-yao-qie-jin-ji')],
                 //1-进行中,2-已完成,3-已撤销
-                statusTxt: ["全部","进行中","已完成","已撤销"],
+                statusTxt: [this.$t('all'),this.$t('ongoing'),this.$t('state.completed'),this.$t('state.undone')],
                 mileStoneList:[],
                 reverse:false,
                 project:{},
@@ -687,10 +687,10 @@
                 curProjectId:null,
                 title: "",
                 rules: {
-                    name: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
+                    name: [{ required: true, message: this.$t('Pleaseenteraprojectname'), trigger: "blur" }],
                 },
                 contractRules: {
-                    contractAmount: [{ required: true, message: "请输入合同金额", trigger: "blur" }]
+                    contractAmount: [{ required: true, message: this.$t('enterthecontractamount'), trigger: "blur" }]
                 },
                 yonghuUser: [],
                 ause: [], // 研究中心总数据
@@ -743,7 +743,7 @@
                         this.keyNodeIsShow = false
                         this.getKeyNodes()
                         this.$message({
-                            message: '修改成功',
+                            message: this.$t('message.modifyTheSuccess'),
                             type: 'success'
                         });
                     }else {
@@ -816,7 +816,7 @@
                             if(res.code == 'ok'){
                                 this.contractDialog = false
                                 this.$message({
-                                    message: '修改成功',
+                                    message: this.$t('message.modifyTheSuccess'),
                                     type: 'success'
                                 })
                                 this.getProjectInfo()
@@ -1083,7 +1083,7 @@
                 });
                 if (hasNoMemb) {
                     this.$message({
-                            message: '专业人员不能为空',
+                            message: this.$t('professionalscannotbeempty'),
                             type: "error"
                         });
                     return;
@@ -1097,14 +1097,14 @@
                 });
                 if (hasDuplicate) {
                     this.$message({
-                            message: '专业人员不能重复',
+                            message: this.$t('professionalscannotrepeat'),
                             type: "error"
                         });
                     return;
                 }
                 if (p != 100) {
                     this.$message({
-                            message: '占比合计必须是100%',
+                            message: this.$t('totalproportionmust'),
                             type: "error"
                         });
                     return;
@@ -1164,14 +1164,14 @@
                 
                 if (hasNoProfession) {
                     this.$message({
-                            message: '专业不能为空',
+                            message: this.$t('majorcannotbeempty'),
                             type: "error"
                         });
                     return false;
                 }
                 if (hasNoMembList) {
                     this.$message({
-                            message: '专业相关人员不能为空',
+                            message: this.$t('personnelcannotbeleftblank'),
                             type: "error"
                         });
                     return false;
@@ -1179,7 +1179,7 @@
                 
                 if (hasNoMemb) {
                     this.$message({
-                            message: '专业负责人不能为空',
+                            message: this.$t('leadercannotbeblank'),
                             type: "error"
                         });
                     return false;
@@ -1193,14 +1193,14 @@
                 });
                 if (hasDuplicate) {
                     this.$message({
-                            message: '专业不能重复',
+                            message: this.$t('shouldnotberepeated'),
                             type: "error"
                         });
                     return false;
                 }
                 if (p != 100) {
                     this.$message({
-                            message: '专业占比合计必须是100%',
+                            message: this.$t('numberomajorsmust'),
                             type: "error"
                         });
                     return false;
@@ -1248,7 +1248,7 @@
                         this.editProfessionDialog = false;
                         this.projectProfessionListOnPage = res.data;
                         this.$message({
-                            message: '修改成功',
+                            message: this.$t('message.modifyTheSuccess'),
                             type: "success"
                         });
                     } else {
@@ -1343,7 +1343,7 @@
                         this.getProjectBaseData(this.curProjectId);
                         this.addBaseFormVisible = false;
                         this.$message({
-                            message: '校正成功',
+                            message: this.$t('jiaozheng'),
                             type: "success"
                         });
                         this.$emit("basecost-change", null);
@@ -1374,7 +1374,7 @@
                 } else {
                     this.addLoading = false;
                     this.$message({
-                        message: '请选择参与者',
+                        message: this.$t('Pleaseselectparticipants'),
                         type: 'warning'
                     });
                     return
@@ -1385,7 +1385,7 @@
                     this.addLoading = false;
                     if (res.code == "ok") {
                         this.$message({
-                            message: "添加成功",
+                            message: this.$t('addsuccessful'),
                             type: "success"
                         });
                         this.addMembForm.userId = []
@@ -1492,7 +1492,7 @@
                     this.addLoading = false;
                     if (res.code == "ok") {
                         this.$message({
-                            message: '修改成功',
+                            message: this.$t('message.modifyTheSuccess'),
                             type: "success"
                         });
                         this.pVisible = false;
@@ -1593,7 +1593,7 @@
                             this.addLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: (this.addForm.id!=null?'修改':'创建')+"成功",
+                                    message: (this.addForm.id!=null?this.$t('xiu-gai'):this.$t('create'))+this.$t('other.successful'),
                                     type: "success"
                                 });
                                 this.addFormVisible = false;
@@ -1764,23 +1764,23 @@
                             //     res.data[i].taskTex = '截止于 ' + res.data[i].endDate
                             // }
                             if(res.data[i].finishDate) {
-                                let str = `完成于 ${res.data[i].finishDate}`
+                                let str = this.$t('wan-cheng-yu') + res.data[i].finishDate
                                 res.data[i].taskTex = str
                                 if(res.data[i].endDate) {
-                                    let strS = '截止于 ' + res.data[i].endDate
+                                    let strS = this.$t('jie-zhi-yu') + res.data[i].endDate
                                     let assignment = `${strS}   ${str}`
                                     res.data[i].taskTex = assignment
                                 }
                                 // res.data[i].taskTex = '完成于 ' + res.data[i].finishDate
                             } else if(res.data[i].endDate) {
-                                res.data[i].taskTex = '截止于 ' + res.data[i].endDate
+                                res.data[i].taskTex = this.$t('jie-zhi-yu') + res.data[i].endDate
                             } else {
                                 res.data[i].taskTex = ''
                             }
 
                         }
                         this.mileStoneList = res.data;
-                        this.mileStoneList.unshift( {id:-1, name:'开始', taskStatus:1});
+                        this.mileStoneList.unshift( {id:-1, name:this.$t('kai-shi'), taskStatus:1});
                         
                         
                     } else {

Plik diff jest za duży
+ 377 - 379
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue


Plik diff jest za duży
+ 236 - 236
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue


+ 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{

+ 160 - 163
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 {
@@ -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,23 +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.timeRange = []
-            for(let i=0.5; i<=20; i+=0.5){
-                this.timeRange.push(i)
-            }
-            this.initTime();
-            this.getCompanyTimeSetting();
-            this.getRestList()
-        }
     };
 </script>
 

Plik diff jest za duży
+ 288 - 290
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue


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

@@ -1831,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") {

+ 253 - 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() {
@@ -1812,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%;