Prechádzať zdrojové kódy

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

ggooalice 2 rokov pred
rodič
commit
a7d412f534
21 zmenil súbory, kde vykonal 988 pridanie a 150 odobranie
  1. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  2. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  3. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java
  5. 20 21
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  6. 160 43
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  7. 69 44
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  8. 6 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  9. 30 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  10. BIN
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/项目任务导入模板.xlsx
  11. BIN
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/项目导入模板.xlsx
  12. 644 0
      fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue
  13. 13 5
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  14. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  15. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue
  16. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  17. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  18. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue
  19. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue
  20. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  21. 14 8
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -119,7 +119,7 @@ public class AuthRedirectController {
                     }
                 } else {
                     System.err.println("==生成企业微信User失败==");
-                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                    reqParam.put("errorMsg", "尚未绑定企业微信,请使用账号密码登录。");
                 }
 
             }
@@ -220,7 +220,7 @@ public class AuthRedirectController {
                             }
                         } else {
                             System.err.println("==生成企业微信User失败==");
-                            reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                            reqParam.put("errorMsg", "尚未绑定企业微信,请使用账号密码登录。");
                         }
 
                     }

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java

@@ -140,7 +140,7 @@ public class FinanceController {
 
         List<String> heads = new ArrayList<>();
         Company company = companyMapper.selectById(companyId);
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+//        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         //判断是否启用了工号模式
         TimeType timeType = timeTypeMapper.selectById(companyId);
         if (timeType.getFinanceJobnumEnabled() == 1) {
@@ -165,7 +165,8 @@ public class FinanceController {
         allList.add(heads);
         //String fileName = company.getCompanyName()+"_财务人员成本模板";
         String fileName = MessageUtils.message("fileName.financialCost",company.getCompanyName());
-        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo, fileName, allList, path);
+        //导出模板不需要转译,不传wxCorpInfo
+        return excelExportService.exportGeneralExcelByTitleAndList(null, fileName, allList, path);
     }
     @RequestMapping("/batchRemove")
     public HttpRespMsg batchRemove(String ids){

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

@@ -690,7 +690,7 @@ public class ProjectController {
         if(timeType.getMainProjectState()!=1){
             //heads.add("项目分类");
             heads.add(MessageUtils.message("entry.projectType"));
-            exampleDataList.add("示例-项目分类");
+            exampleDataList.add("");
         }
         //heads.add("是否为公共项目");
         heads.add(MessageUtils.message("entry.publicProject"));
@@ -701,7 +701,7 @@ public class ProjectController {
         if(timeType.getMainProjectState()!=1){
             //heads.add("子项目(多个用,隔开)");
             heads.add(MessageUtils.message("entry.sonProject"));
-            exampleDataList.add("示例-子项目名称");
+            exampleDataList.add("");
         }
         //heads.add("参与人");
         heads.add(MessageUtils.message("entry.Participants"));
@@ -720,12 +720,12 @@ public class ProjectController {
         if(company.getPackageCustomer()==1){
             //heads.add("客户");
             heads.add(MessageUtils.message("entry.customer"));
-            exampleDataList.add("示例-客户");
+            exampleDataList.add("");
         }
         if(company.getPackageProvider()==1){
             for (String s : collect) {
                 heads.add(s);
-                exampleDataList.add("示例供应商名称");
+                exampleDataList.add("");
             }
         }
         //heads.add("开始日期");
@@ -960,14 +960,14 @@ public class ProjectController {
                                     comment.setString(new HSSFRichTextString(MessageUtils.message("excel.manyPeople")));
                                     cell.setCellComment(comment);
                                     break;
-                                case "项目经理":
+                                /*case "项目经理":
                                 case "project manager":
                                     comment = drawing.createCellComment(anchor);
                                     // 输入批注信息
                                     //comment.setString(new HSSFRichTextString("项目经理需存在于参与人中"));
                                     comment.setString(new HSSFRichTextString(MessageUtils.message("excel.projectManager")));
                                     cell.setCellComment(comment);
-                                    break;
+                                    break;*/
                                 case "开始日期":
                                 case "Start Date":
                                 case "截止日期":

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java

@@ -22,7 +22,7 @@ public interface FinanceService extends IService<Finance> {
 
     HttpRespMsg getByMonth(Integer companyId, String yearMonth);
 
-    HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws IOException, InvalidFormatException, UserNotFoundException;
+    HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws Exception;
 
     HttpRespMsg exportData(Integer groupByCategory, String date, Boolean assignNoProUser, HttpServletRequest request);
 

+ 20 - 21
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -385,35 +385,34 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 XSSFCell reportDateCell = firstRow.getCell(1);
                 XSSFCell expenseTypeCell = firstRow.getCell(2);
                 XSSFCell remarksCell = firstRow.getCell(3);
-                List<String> userNameList=new ArrayList<>();
-                String value = reimburserCell.getStringCellValue();
-                if(userNameList.contains(value)){
-                    continue;
-                }
-                userNameList.add(value);
-                System.out.println("参与搜素的人员列表"+userNameList);
-                HttpRespMsg respMsg=new HttpRespMsg();
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
-                    if(respMsg.code.equals("0")){
-                        msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
-                        return msg;
-                    }
-                }
-                List<User> targetUserList= (List<User>) respMsg.data;
+
                 if (reimburserCell != null) reimburserCell.setCellType(CellType.STRING);
                 if (reportDateCell != null) reportDateCell.setCellType(CellType.NUMERIC);
                 if (expenseTypeCell != null) expenseTypeCell.setCellType(CellType.STRING);
                 if (remarksCell != null) remarksCell.setCellType(CellType.STRING);
-                if (reimburserCell == null) {//报销人为空的直接跳过
+                if (reimburserCell == null || StringUtils.isEmpty(reimburserCell.getStringCellValue())) {//报销人为空的直接跳过
                     throw new Exception("报销人名称不能为空");
                 }
                 if (expenseTypeCell == null) {
                     throw new Exception("费用类型不能为空");
                 }
-                if (reportDateCell == null) {
+                if (reportDateCell == null  || StringUtils.isEmpty(reportDateCell.getStringCellValue())) {
                     throw new Exception("填报日期不能为空");
                 }
+                //做完非空校验后,进行姓名处理
+                List<String> userNameList=new ArrayList<>();
+                String reimburserName = reimburserCell.getStringCellValue();
+                userNameList.add(reimburserName);
+                HttpRespMsg respMsg= null;
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    System.out.println("参与搜素的人员列表"+userNameList);
+                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                    if(respMsg.code.equals("0")){
+                        msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                        return msg;
+                    }
+                }
+                List<User> targetUserList= (List<User>) respMsg.data;
                 ExpenseSheet expenseSheet = new ExpenseSheet();
                 if(functionList.size()>0){
                     expenseSheet.setStatus(0);
@@ -442,10 +441,10 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 expenseSheet.setCreateDate(localDate);
                 Optional<User> first;
                 if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(reimburserCell.getStringCellValue())).findFirst();
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserCell.getStringCellValue()))||(optional.isPresent()&&us.getCorpwxUserid()!=null&&us.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(reimburserName)).findFirst();
+                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)||(us.getJobNumber()!=null&&us.getJobNumber().equals(reimburserName))||(optional.isPresent()&&us.getCorpwxUserid()!=null&&us.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                 }else {
-                    first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())).findFirst();
+                    first = userList.stream().filter(us -> us.getName().equals(reimburserName)).findFirst();
                 }
                 if (first.isPresent()) {
                     expenseSheet.setOwnerId(first.get().getId());

+ 160 - 43
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -81,6 +81,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     ExcelExportService excelExportService;
     @Resource
     UserCustomMapper userCustomMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
 
     @Resource
     private ProjectMapper projectMapper;
@@ -135,7 +137,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws IOException, InvalidFormatException, UserNotFoundException {
+    public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) throws Exception {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("TOKEN"));
         //然后处理文件
@@ -161,6 +163,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 //            XSSFSheet sheet = workbook.getSheetAt(0);
             //要插入的账号列表
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
             List<Finance> financeList = new ArrayList<Finance>();
             List<Finance> oldFinanceList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
             //获取月成本列表
@@ -190,6 +193,84 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 financeConfig.setField3(cusColList.get(2).getFieldName());
                 financeConfig.setField3Calculate(cusColList.get(2).getNeedCalculate());
             }
+            List<String> userNameList=new ArrayList<>();
+            List<String> jobNumberList = new ArrayList<>();
+            //是否配置了工号模式的模板
+            boolean includeJobNumber = (timeType.getFinanceJobnumEnabled() == 1);
+            for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //(工号-可配置)	姓名 工资	奖金	津贴	养老保险	医疗保险	失业保险	(新增工伤保险) 住房公积金	其他; 可能有自定义的项
+                Cell jobNumberCell = null;
+                int nameStartIndex = 0;
+
+                //工号有了,就按工号匹配,没有工号需要按姓名匹配
+                String jobNumber = null;
+                if (includeJobNumber) {
+                    jobNumberCell = row.getCell(0);
+                    if (jobNumberCell != null) {
+                        jobNumberCell.setCellType(CellType.STRING);
+                        jobNumber = jobNumberCell.getStringCellValue();
+                    }
+                    nameStartIndex = 1;
+                }
+                Cell nameCell = row.getCell(nameStartIndex + 0);
+                String name = nameCell.getStringCellValue().trim().replaceAll("\\u00a0", "");
+                if(name.equals("姓名")){
+                    continue;
+                }
+                //判断工号是否填写
+                if (StringUtils.isEmpty(jobNumber)) {
+                    //没有工号,需要判断姓名是否存在重名
+                    if (!StringUtils.isEmpty(name)) {
+                        if (userNameList.contains(name)) {
+                            if(includeJobNumber){
+                                msg.setError("上传的数据中["+name+"]的存在重复,请完善工号信息!");
+                            }else {
+                                msg.setError("上传的数据中["+name+"]的存在重复,请确认是否有误。如确实为重名人员请联系服务商开启工号模式!");
+                            }
+                            return msg;
+                        } else {
+                            userNameList.add(name);
+                        }
+                    }
+                } else {
+                    //有工号的情况,判断工号是否有重复录入的
+                    if (jobNumberList.contains(jobNumber)) {
+                        msg.setError("上传的数据中工号为["+jobNumber+"]的存在重复数据。");
+                        return msg;
+                    }
+                }
+            }
+            HttpRespMsg respMsg=new HttpRespMsg();
+            if(userNameList.size() > 0){
+                if (wxCorpInfo != null&&wxCorpInfo.getSaasSyncContact() == 1) {
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+                    respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                    if(respMsg.code.equals("0")){
+                        msg.setError("["+String.valueOf(respMsg.data)+"]在系统中为重名人员,请完善工号信息!");
+                        return msg;
+                    }
+                } else {
+                    //不需要转译的情况
+                    for (String name : userNameList) {
+                        long count = userList.stream().filter(u -> u.getName().equals(name)).count();
+                        if (count == 0) {
+                            msg.setError(MessageUtils.message("group.userNull",name));
+                            return msg;
+                        } else if (count > 1) {
+                            msg.setError("["+name+"]在系统中为重名人员,请完善工号信息!");
+                            return msg;
+                        }
+                    }
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
             //由于第一行需要指明列对应的标题
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                 Row row = sheet.getRow(rowIndex);
@@ -204,10 +285,12 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 Cell jobNumberCell = null;
                 int nameStartIndex = 0;
                 //是否配置了工号模式的模板
-                boolean includeJobNumber = (timeType.getFinanceJobnumEnabled() == 1);
+
                 if (includeJobNumber) {
                     jobNumberCell = row.getCell(0);
-                    jobNumberCell.setCellType(CellType.STRING);
+                    if (jobNumberCell != null) {
+                        jobNumberCell.setCellType(CellType.STRING);
+                    }
                     nameStartIndex = 1;
                 }
                 Cell nameCell = row.getCell(nameStartIndex + 0);
@@ -236,19 +319,40 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 if (field3 != null)field3.setCellType(CellType.STRING);
 
                 finance.setCompanyId(companyId);
-                finance.setName(name);
+                Optional<User> userOp;
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(name)).findFirst();
+                    userOp= userList.stream().filter(u ->((optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
+                }else {
+                    userOp= userList.stream().filter(u -> u.getName().equals(name)).findFirst();
+                }
+                if(userOp.isPresent()){
+                    finance.setName(userOp.get().getName());
+                }
+                //工号模式下,工号也不是必填,有工号优先按工号匹配
                 if (includeJobNumber) {
-                    finance.setJobNumber(jobNumberCell.getStringCellValue());
-                    if (StringUtils.isEmpty(finance.getJobNumber())) {
-                        msg.setError(MessageUtils.message("staff.jobNoNull"));
-                        return msg;
+                    finance.setJobNumber(jobNumberCell!=null?jobNumberCell.getStringCellValue():null);
+                }
+                Optional<User> first = null;
+                if (!StringUtils.isEmpty(finance.getJobNumber())) {
+                    first = userList.stream().filter(u -> finance.getJobNumber().equals(u.getJobNumber())).findFirst();
+                } else {
+                    //按照姓名匹配,需区分是否是转译的方式
+                    if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                        //去转译后的名单中匹配
+                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(name)).findFirst();
+                        if (optional.isPresent()) {
+                            first = userList.stream().filter(u->u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid())).findFirst();
+                        } else {
+                            //转译后的名单中也没有
+                            System.out.println("转译后的名单中没有:"+name);
+                        }
+                    } else {
+                        first = userList.stream().filter(u -> u.getName().equals(name)).findFirst();
                     }
                 }
 
-                Optional<User> first = userList.stream().filter(u -> includeJobNumber?
-                        u.getJobNumber() != null && u.getJobNumber().equals(finance.getJobNumber())
-                                                    :u.getName().equals(name)).findFirst();
-                if (first.isPresent()) {
+                if (first != null && first.isPresent()) {
                     finance.setUserId(first.get().getId());
                     BigDecimal total = new BigDecimal(0);
                     if (salaryCell != null) {
@@ -929,25 +1033,25 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                                 }
                             }
                             membRowData.add(workingTime+"");
-                            membRowData.add(salary.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(bonus.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(allowance.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(old.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(medical.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(loseJob.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(injury.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(house.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(salary.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(bonus.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(allowance.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(old.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(medical.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(loseJob.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(injury.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(house.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                             //自定义字段
                             if (cusColList.size() > 0) {
-                                membRowData.add(field1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(field1.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                             }
                             if (cusColList.size() > 1) {
-                                membRowData.add(field2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(field2.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                             }
                             if (cusColList.size() > 2) {
-                                membRowData.add(field3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(field3.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                             }
-                            membRowData.add(cost.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                            membRowData.add(cost.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                             allList.add(membRowData);
                         }
                     }
@@ -1007,25 +1111,25 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                                         }
                                     }
                                     membRowData.add(workingTime+"");
-                                    membRowData.add(salary.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(bonus.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(allowance.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(old.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(medical.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(loseJob.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(injury.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(house.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(salary.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(bonus.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(allowance.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(old.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(medical.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(loseJob.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(injury.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(house.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                                     //自定义字段
                                     if (cusColList.size() > 0) {
-                                        membRowData.add(field1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(field1.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                                     }
                                     if (cusColList.size() > 1) {
-                                        membRowData.add(field2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(field2.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                                     }
                                     if (cusColList.size() > 2) {
-                                        membRowData.add(field3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(field3.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                                     }
-                                    membRowData.add(cost.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                    membRowData.add(cost.setScale(3, BigDecimal.ROUND_HALF_UP).toPlainString());
                                     allList.add(membRowData);
                                 }
                             }
@@ -1415,7 +1519,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+//            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
             final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
             Company company = companyMapper.selectById(companyId);
@@ -1434,6 +1539,9 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 
             List<String> headList = new ArrayList<String>();
             //headList.add("姓名");
+            if (timeType.getFinanceJobnumEnabled() == 1) {
+                headList.add("工号");
+            }
             headList.add(MessageUtils.message("entry.name"));
             FinanceFixedcolname fixedItem = financeFixedcolnameService.getFixed(companyId);
             headList.add(fixedItem.getMonthCost()+"(元)");
@@ -1498,11 +1606,15 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     totalField3 = totalField3.add(field3Item);
                 }
                 List<String> rowData = new ArrayList<String>();
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    rowData.add("$userName="+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
-                }else {
-                    rowData.add(f.getName());
+//                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+//                    rowData.add("$userName="+(user.getCorpwxUserid()==null?"":user.getCorpwxUserid())+"$");
+//                }else {
+//                    rowData.add(f.getName());
+//                }
+                if (timeType.getFinanceJobnumEnabled() == 1) {
+                    rowData.add(f.getJobNumber());
                 }
+                rowData.add(f.getName());
                 rowData.add(salary == null?"0":salary.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
                 rowData.add(bonus == null?"0":bonus.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
                 rowData.add(allowance == null?"0":allowance.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());
@@ -1545,7 +1657,11 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //合计
             List<String> sumRow = new ArrayList<String>();
             //sumRow.add("合计");;
-            sumRow.add(MessageUtils.message("entry.total"));;
+            sumRow.add(MessageUtils.message("entry.total"));
+            if (timeType.getFinanceJobnumEnabled() == 1) {
+                //多空出一行工号
+                sumRow.add("");
+            }
             sumRow.add(totalSalary.toString());
             sumRow.add(totalBonus.toString());
             sumRow.add(totalAllowance.toString());
@@ -1563,7 +1679,8 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //String fileName = "人员薪资_"+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
             String fileName = MessageUtils.message("fileName.perSal")+company.getCompanyName()+yearMonth+"_"+System.currentTimeMillis();
             try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+                //不需要转译
+                return excelExportService.exportGeneralExcelByTitleAndList(null,fileName , allList, path);
             } catch (Exception e) {
                 e.printStackTrace();
             }

+ 69 - 44
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -3170,19 +3170,27 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         continue;
                     }
                     XSSFCell participatorCell = row.getCell(5);
+                    XSSFCell inchargerCell = row.getCell(6);
                     if (participatorCell!=null)participatorCell.setCellType(CellType.STRING);
+                    if (inchargerCell != null)inchargerCell.setCellType(CellType.STRING);
                     String part = participatorCell.getStringCellValue().trim();
+                    String inchargerName = inchargerCell.getStringCellValue().trim();
+                    if(part.equals("参与人")){
+                        continue;
+                    }
                     String[] partSplit = part.split("\\,|\\,");
                     for (String s : partSplit) {
-                        if(userNameList.contains(s)){
-                            continue;
+                        if(!userNameList.contains(s)&&!s.equals("")){
+                            userNameList.add(s);
                         }
-                        userNameList.add(s);
+                    }
+                    if(!userNameList.contains(inchargerName)&&!inchargerName.equals("")){
+                        userNameList.add(inchargerName);
                     }
                 }
-                System.out.println("参与搜素的人员列表"+userNameList);
                 HttpRespMsg respMsg=new HttpRespMsg();
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if(userNameList.size() > 0 && wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                    System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
@@ -3378,44 +3386,51 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     List<Participation> participationList = new ArrayList<>();
                     if(inchargerCell!=null){
-                        String value = inchargerCell.getStringCellValue();
-                        String s1;
-                        if(value.startsWith("/")){
-                            s1=value.substring(1,value.length());
-                        }else s1=value;
-                        String s2;
-                        if(s1.endsWith("/")){
-                            s2=s1.substring(0,s1.length()-1);
-                        }else s2=s1;
-                        String[] split = s2.split("/");
-                        Optional<User> first;
-                        Integer exception=null;
-                        if(split.length==1){
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                        String value = inchargerCell.getStringCellValue().trim();
+                        if (!StringUtils.isEmpty(value)) {
+                            //有项目经理
+                            String s1;
+                            if(value.startsWith("/")){
+                                s1=value.substring(1,value.length());
                             }else {
-                                first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
+                                s1=value;
                             }
-                            exception=0;
-                        }else {
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
-                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
-                                exception=1;
+                            String s2;
+                            if(s1.endsWith("/")){
+                                s2=s1.substring(0,s1.length()-1);
                             }else {
-                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                s2=s1;
                             }
-                        }
-                        Participation p = new Participation();
-                        if (first.isPresent()) {
-                            p.setUserId(first.get().getId());
-                            p.setProjectId(project.getId());
-                            participationList.add(p);
-                        } else {
-                            switch (exception){
-                                case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                            String[] split = s2.split("/");
+                            Optional<User> first;
+                            Integer exception=null;
+                            if(split.length==1){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[0])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                }else {
+                                    first= userList.stream().filter(u -> u.getName().equals(split[0])||(u.getJobNumber()!=null&&u.getJobNumber().equals(split[0]))).findFirst();
+                                }
+                                exception=0;
+                            }else {
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(split[1])).findFirst();
+                                    first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                                    exception=1;
+                                }else {
+                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                }
+                            }
+                            Participation p = new Participation();
+                            if (first.isPresent()) {
+                                p.setUserId(first.get().getId());
+                                p.setProjectId(project.getId());
+                                participationList.add(p);
+                            } else {
+                                switch (exception){
+                                    case 0:throw new Exception("["+split[0]+"]在系统中不存在");
+                                    case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                }
                             }
                         }
                     }
@@ -3557,28 +3572,38 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         continue;
                     }
                     HSSFCell participatorCell=null;
+                    HSSFCell inchargerCell=null;
                     int c=0;
                     if(company.getId()==936){
                         c++;
                     }
                     if(timeType.getMainProjectState()==1){
                         participatorCell = row.getCell(4+c);
+                        inchargerCell = row.getCell(5+c);
                     }else {
                         participatorCell = row.getCell(5+c);
+                        inchargerCell = row.getCell(6+c);
                     }
                     if (participatorCell!=null)participatorCell.setCellType(CellType.STRING);
+                    if (inchargerCell != null)inchargerCell.setCellType(CellType.STRING);
                     String part = participatorCell.getStringCellValue().trim();
+                    String inchargerName = inchargerCell.getStringCellValue().trim();
+                    if(part.equals("参与人")){
+                        continue;
+                    }
                     String[] partSplit = part.split("\\,|\\,");
                     for (String s : partSplit) {
-                        if(userNameList.contains(s)){
-                            continue;
+                        if(!userNameList.contains(s)&&!s.equals("")){
+                            userNameList.add(s);
                         }
-                        userNameList.add(s);
+                    }
+                    if(!userNameList.contains(inchargerName)&&!inchargerName.equals("")){
+                        userNameList.add(inchargerName);
                     }
                 }
-                System.out.println("参与搜素的人员列表"+userNameList);
+                System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
                 HttpRespMsg respMsg=new HttpRespMsg();
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                     if(respMsg.code.equals("0")){
                         msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");

+ 6 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -3526,14 +3526,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
                 dataCount++;
                 String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
-                if(userNameList.contains(username)){
+                if(username.equals("员工")){
                     continue;
                 }
-                userNameList.add(username);
+                if(!userNameList.contains(username)&&!username.equals("")){
+                    userNameList.add(username);
+                }
             }
-            System.out.println("参与搜素的人员列表"+userNameList);
             HttpRespMsg respMsg=new HttpRespMsg();
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                System.out.println("参与搜素的人员列表"+userNameList);
                 respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
                 if(respMsg.code.equals("0")){
                     msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");

+ 30 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -11,6 +11,7 @@ import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.TaskExecutorService;
 import com.management.platform.service.TaskService;
 import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.apache.poi.hssf.usermodel.*;
@@ -76,6 +77,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     private HttpServletRequest request;
     @Resource
     private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
 
     @Override
     public HttpRespMsg getExecutorPanel(Integer projectId) {
@@ -390,6 +393,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         String userId = request.getHeader("Token");
         User creator = userMapper.selectById(userId);
         Integer companyId = creator.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
         List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         HashMap<String, Integer> taskTypeMap = new HashMap<>();
         //taskTypeMap.put("任务", 0);
@@ -428,6 +432,30 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             List<String> phoneList = new ArrayList<>();
             //要插入的账号列表
             List<Task> taskList = new ArrayList<>();
+            List<String> userNameList=new ArrayList<>();
+            for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
+                XSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                XSSFCell executorCell = row.getCell(3);
+                String[] executorNameArray = executorCell.getStringCellValue().split(",");
+                for (String s : executorNameArray) {
+                    if(!userNameList.contains(s)&&!s.equals("")&&!s.equals("执行人")){
+                        userNameList.add(s);
+                    }
+                }
+            }
+            System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+            HttpRespMsg respMsg=new HttpRespMsg();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                if(respMsg.code.equals("0")){
+                    httpRespMsg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                    return httpRespMsg;
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
             //由于第一行需要指明列对应的标题
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                 XSSFRow row = sheet.getRow(rowIndex);
@@ -472,7 +500,8 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     String executorColorString="";
                     for (int i=0;i<executorNameList.size();i++) {
                         String executorName = executorNameList.get(i);
-                        Optional<User> first = allUserList.stream().filter(u -> u.getName().equals(executorName)).findFirst();
+                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(executorName)).findFirst();
+                        Optional<User> first = allUserList.stream().filter(u ->optional.isPresent()&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid())).findFirst();
                         if (first.isPresent()) {
                             User find = first.get();
                             if(i==executorNameList.size()-1){

BIN
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/项目任务导入模板.xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/项目导入模板.xlsx


+ 644 - 0
fhKeeper/formulahousekeeper/timesheet/src/components/taskComponent.vue

@@ -0,0 +1,644 @@
+<template>
+  <div>
+    <div style="height: 72vh;overflow: auto;">
+        <el-form ref="form1" :model="addForm" :rules="taskRules" label-width="100px">
+            <!--子任务需要选择任务列表 -->
+            <el-form-item :label="$t('tasklist')" prop="stages" v-if="addForm.parentTid != null">
+                <el-select v-model="addForm.stagesId" style="width:100%;" >
+                    <el-option v-for="item in stageList" :key="item.id" :label="item.stagesName" :value="item.id"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('types')">
+                <!-- <el-button @click="test">test</el-button> -->
+                <!-- 0011 -->
+                <!-- {{groupResponsibleId == user.id}} -->
+                <el-select v-model="addForm.taskType" style="width:100%;" :disabled="((this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement) && !(groupResponsibleId == user.id)" @change="selchg()">
+                    <el-option v-for="item in taskTypeList" :key="item.id" :label="item.name" :value="item.id">
+                        <i :class="item.icon" ></i>
+                        <span>{{item.name}}</span>
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('taskdefinition')" prop="name">
+                <el-input v-model="addForm.name" :maxlength="40" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" :placeholder="$t('enterthetaskcontent')" clearable></el-input>
+            </el-form-item>
+            <!-- {{timelabel}}{{mileageCup}} -->
+            <el-form-item :label="!timelabel ? $t('starttimes') : $t('jie-zhi-shi-jian')" prop="startDate">
+                <el-date-picker v-model="addForm.startDate" type="date" style="width:40%;" value-format="yyyy-MM-dd"  
+                :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" @change="DateChange()" v-if="!timelabel"></el-date-picker>
+                <span style="margin-left:30px;margin-right:10px;" v-if="!timelabel">{{ $t('deadline') }}</span>
+                <el-date-picker style="width:40%;" v-model="addForm.endDate" type="date" value-format="yyyy-MM-dd"  
+                :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" @change="DateChange()"></el-date-picker>
+                <span style="margin-left:30px;margin-right:10px;" v-if="timelabel && mileageCup">{{ $t('wan-cheng-shi-jian') }}</span>
+                <el-date-picker style="width:40%;" v-if="timelabel && mileageCup" v-model="addForm.finishDate" type="date" value-format="yyyy-MM-dd"  
+                :placeholder="$t('pleaseselectadate')" :disabled="(this.addForm.id != null && user.id != this.addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" @change="DateChange()"></el-date-picker>
+                </el-form-item>
+            <div style="border: 1px solid #ddd;margin:5px 0;padding:5px 0;">
+            <el-form-item :label="$t('zhi-hang-ren') + (index+1)" v-for="(executorItem, index) in addForm.executorListFront" :key="index">
+                <el-select v-if="user.userNameNeedTranslate != 1" v-model="executorItem.executorId" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" size="small" filterable clearable :placeholder="$t('pleaseselectanexecutor')" style="width:40%;" @change="$forceUpdate()">
+                    <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                        <span style="float: left">{{ item.name }}</span>
+                        <span style="float: right; color: #8492a6; font-size: 13px;margin-left: 20px" v-if="item.jobNumber">{{ item.jobNumber }}</span>
+                    </el-option>
+                </el-select>
+                <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="users" :subjectId="executorItem.executorId" :distinction="'1'" @selectCal="selectCal" :index="index" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)"></selectCat>
+                <!-- <selectCat v-if="user.userNameNeedTranslate == '1'" :wxCope="true" :size="'size'" :subjectId="executorItem.executorId" :distinction="'1'" :subject="users"  @selectCal="selectCal" :index="index" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)"></selectCat> -->
+                <span style="margin-left:30px;margin-right:10px;">{{ $t('plantime') }}</span>
+                <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimday[index]" style="width:16%;" :min="1" :max="100"  :placeholder="$t('danweitian')" @change="chggstim(0,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.day') }}</span>
+                <el-input-number size="small" :disabled="(addForm.id != null && user.id != addForm.createrId && currentProject.inchargerId != user.id) && !permissions.projectManagement && !(groupResponsibleId == user.id)" v-model="gstimhour[index]" style="width:16%;" :min="1" :max="100"  :placeholder="$t('pleaseentertheplannedworking')" @change="chggstim(1,index)"></el-input-number ><span style="margin-left:5px;">{{ $t('time.hour') }}</span>
+                <!--移除执行人 -->
+                <i class="el-icon-delete" v-if="index>0 && (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id|| permissions.projectManagement || groupResponsibleId == user.id)" style="margin-left:5px" @click="removeExecutorLine(index)"></i>
+            </el-form-item>
+            <el-link type="primary" v-if="(((addForm.executorListFront == null || addForm.executorListFront.length<10) && 
+            (addForm.id == null|| user.id == addForm.createrId || currentProject.inchargerId == user.id || permissions.projectManagement)) || 
+            groupResponsibleId == user.id)" 
+            style="margin-left:35px;" @click="addExecutorLine">{{ $t('addinganexecutor') }}</el-link>
+            </div>
+            <el-form-item :label="$t('priority')">
+                <el-select v-model="addForm.taskLevel" style="width:100%;" >
+                    <el-option v-for="item in importanceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+            </el-form-item>
+            <!-- 富文本 -->
+            <el-form-item :label="$t('detaileddescription')" style="height: 200px">
+                <!-- <Editor id="tinymce" v-model="tinymceHtml" :init="editorInit"></Editor> -->
+                <!-- <el-input type="textarea" v-model="addForm.taskDesc" :rows="3"></el-input> -->
+                <!-- <quill-edito v-model="addForm.taskDesc"></quill-edito> -->
+                <quill-editor style="height: 150px" ref="text" v-model="addForm.taskDesc" class="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)"/>
+            </el-form-item>
+            <!-- 富文本 -->
+            <div v-if="addForm.id != null">
+                <el-divider ></el-divider>
+                <!-- 任务进展 -->
+                <template v-if="!timelabel || isRelationItem">
+                
+                <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('taskprogress') }}</i>
+                    <span ref="addPro" style="display: block; float:right;"><el-link @click="addprogress">{{ $t('addtaskprogress') }}</el-link></span>
+                </p>
+                <!-- 任务进展展示 -->
+                <div style="display: none;" ref="proBox" class="progress">
+                    <!-- <el-form :model="> -->
+                    <el-radio-group v-model="radio">
+                        <el-radio :label="0" class="rala1">{{ $t('normals') }}</el-radio>
+                        <el-radio :label="1" class="rala2">{{ $t('atrisk') }}</el-radio>
+                        <el-radio :label="2" class="rala3">{{ $t('withinthetimelimit') }}</el-radio>
+                    </el-radio-group>
+                    <el-input
+                    type="textarea"
+                    border="0"
+                    :autosize="{ minRows: 2, maxRows: 6}"
+                    :placeholder="$t('detailedprogressdescription')"
+                    v-model="text2"
+                    style="margin:10px 0 0 0">
+                    </el-input>
+                    <h4 style="font-weight: normal;">{{ $t('tixiang') }}{{checkLists.length}}</h4>
+                    <i class="el-icon-circle-plus pron_i" style="font-size: 28px;color: #409EFF;" @click="addI(0)"></i>
+                    <div class="remind" ref="addRem" style="display: none">
+                        <el-checkbox-group v-model="checkboxGrounp" v-for="item in users" :key="item.id">
+                            <p>
+                                <el-checkbox :label="item.name" @change="kkk(item)">
+                                    <span>
+                                        <span v-if="user.userNameNeedTranslate != '1'">
+                                            {{item.name}}
+                                        </span>
+                                        <span v-if="user.userNameNeedTranslate == '1'">
+                                            <ww-open-data type='userName' :openid='item.name'></ww-open-data>
+                                        </span>
+                                    </span>
+                                </el-checkbox>
+                            </p>
+                        </el-checkbox-group>
+                    </div>
+                    <div class="ssp" @click="sss"></div>
+                    <!-- </el-form> -->
+                    <div class="pro_btn">
+                        <el-button size="mini" @click="shutPro">{{ $t('btn.cancel') }}</el-button>
+                        <el-button size="mini" type="primary" @click="addTaskProgress">{{ $t('fa-bu') }}</el-button>
+                    </div>
+                </div>
+                
+                <div class="ddl" v-if="recentProgressInfo != null && recentProgressInfo.id != null">
+                    <div class="elCard" style="margin-bottom: 10px; height:" >
+                        <i class="el-icon-success" style="color: #43d14f;" v-if="recentProgressInfo.status == 0"></i>
+                        <i class="el-icon-success" style="color: #fd7624;" v-else-if="recentProgressInfo.status == 1"></i>
+                        <i class="el-icon-success" style="color: #fd4d47;" v-else></i>
+                        <span v-if="recentProgressInfo.status == 0">{{ $t('normals') }}</span>
+                        <span v-else-if="recentProgressInfo.status == 1">{{ $t('normals') }}</span>
+                        <span v-else>{{ $t('withinthetimelimit') }}</span>
+                        <el-dropdown trigger="click" style="float:right;cursor:pointer; float: right;">
+                                <i class="el-icon-more" ></i>
+                                <el-dropdown-menu slot="dropdown">
+                                    <el-dropdown-item divided>
+                                        <span @click="deleteTaskProgress(recentProgressInfo.id)"><i class="el-icon-delete"></i>{{ $t('deleteList ') }}</span></el-dropdown-item>
+                                </el-dropdown-menu>
+                        </el-dropdown>
+                        <!-- <div class="elCard_qu">{{recentProgressInfo.creatorName}}{{ $t('geng-xin-yu') }}{{recentProgressInfo.indate | relativeTime}}</div> -->
+                        <div class="elCard_qu">
+                            <span>
+                                <span v-if="user.userNameNeedTranslate != '1'">
+                                    {{recentProgressInfo.creatorName}}
+                                </span>
+                                <span v-if="user.userNameNeedTranslate == '1'">
+                                    <ww-open-data type='userName' :openid='recentProgressInfo.creatorName'></ww-open-data>
+                                </span>
+                            </span>
+                            {{ $t('geng-xin-yu') }}{{recentProgressInfo.indate | relativeTime}}
+                        </div>
+                        <p style="padding-left: 20px;">{{recentProgressInfo.content}}</p>
+                        <div class="examine"><el-button type="text" @click="innerVisibless = true" style="color: #8F87A3;">{{ $t('viewingHistory') }}</el-button></div>
+                    </div>
+                </div>
+                <!-- 任务列表没有数据的时候展示 -->
+                <div class="nones" v-if="ProgressList.length <= 0">
+                    {{ $t('nodata') }} 
+                </div>
+                <!-- 任务进展完整状态 -->
+                <el-dialog :title="$t('other.prompts')" :visible.sync="innerVisibless" append-to-body width="500px">
+                <div class="integrity">
+                    <h3 style="font-weight: normal;display: inline-block;margin: 0 0 20px 0;">{{ $t('taskprogress') }} :{{ProgressList.length}}</h3>
+                    <!-- <span class="write"><i class="el-icon-circle-plus"></i>填写进展</span> -->
+                    <el-divider></el-divider>
+                    <!--  -->
+                        <div class="block" style="height: 200px;">
+                            <el-timeline style="padding:20px 0 0 0;">
+                                <el-timeline-item
+                                v-for="(activity, index) in ProgressList"
+                                :key="index">
+                                <div class="tb">
+                                    <span v-if="activity.status == 0" style="color: #43D14F" class="icon"></span>
+                                    <span v-if="activity.status == 1" style="color: #FD7624" class="icon"></span>
+                                    <span v-if="activity.status == 2" style="color: red" class="icon"></span>
+                                    <div>
+                                        <span v-if="activity.status == 0" style="color: #43D14F">{{ $t('normals') }}</span>
+                                        <span v-if="activity.status == 1" style="color: #FD7624">{{ $t('atrisk') }}</span>
+                                        <span v-if="activity.status == 2" style="color: red">{{ $t('withinthetimelimit') }}</span>
+                                        <span style="display: inline-block; float: right; color: #8C8C8C">{{activity.indate | relativeTime}}</span>
+                                    </div>
+                                    <p style="color: #8C8C8C">{{activity.content}}</p>
+                                    
+                                </div>
+                                </el-timeline-item>
+                            </el-timeline>
+                        </div>
+                    <!--  -->
+                </div>
+                <span slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="innerVisibless = false">{{ $t('Shutdown') }}</el-button>
+                </span>
+                </el-dialog>
+                </template>
+                <!-- 子任务/关联任务 -->
+                <p ><i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{timelabel && !isRelationItem ? $t('guanlian') : $t('zirwu')}}</i>
+                    <el-link style="float:right;" @click="addRelation" v-if="timelabel && !isRelationItem">{{ $t('associatedTask') }}</el-link>
+                    <el-link style="float:right;" @click="addSubTask" v-else>{{ $t('addingsubtask') }}</el-link>
+                </p>
+                <!-- 关联任务列表 -->
+                <el-table key="guanlian" :data="relationSubTaskList" v-if="timelabel && !isRelationItem"
+                :header-cell-style="{'font-weight':'normal'}"
+                highlight-current-row
+                v-loading="listLoading"
+                style="width: 100%;margin-top:10px;"
+                @row-click="relationTaskClick">
+                    <el-table-column prop="taskStatus" :label="$t('wan-cheng')" width="50" >
+                        <template slot-scope="scope">
+                            <el-checkbox :disabled="scope.row.taskStatus==2" :checked="scope.row.taskStatus==1?true:false" size="large" class="cb" @change="relationFinishTask(scope.row)" @click.stop.native=""></el-checkbox>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="taskName" :label="$t('biao-ti')" >
+                        <template slot-scope="scope">
+                            <el-tooltip class="item" effect="dark" :content="scope.row.taskName" placement="top" style="cursor:pointer;color:#409eff;">
+                                <span style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;" > {{scope.row.taskName}}</span>
+                            </el-tooltip>
+                        </template>
+                    </el-table-column>
+                    <el-table-column :label="$t('operation')" width="130" align="left">
+                        <template slot-scope="scope">
+                            <el-button @click.stop.native="deleteRelationItem(scope.row.id)" size="mini">{{ $t('dissociated') }}</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <!--子任务列表 -->
+                <el-table key="zi" :data="addForm.subTaskList" v-else
+                        :header-cell-style="{'font-weight':'normal'}"
+                        highlight-current-row v-loading="listLoading" style="width: 100%;margin-top:10px;" @row-click="taskLineClick">
+                            <el-table-column prop="taskStatus" :label="$t('wan-cheng')" width="50" >
+                            <template slot-scope="scope">
+                            <el-checkbox :disabled="scope.row.taskStatus==2" :checked="scope.row.taskStatus==1?true:false" size="large" class="cb"  
+                                            @click.stop.native=""
+                                            @change="finishTask(scope.row)"
+                                            ></el-checkbox>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="name" :label="$t('biao-ti')" >
+                            <template slot-scope="scope">
+                                <el-tooltip class="item" effect="dark" :content="scope.row.name" placement="top">
+                                <span style="overflow: hidden;text-overflow:ellipsis;white-space: nowrap;" > {{scope.row.name}}</span>
+                                </el-tooltip>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="executorName" :label="$t('zhi-hang-ren')" width="100" >
+                            <template slot-scope="scope">
+                                <span v-if="user.userNameNeedTranslate != 1">
+                                    {{scope.row.executorName == null?$t('dai-fen-pei'):scope.row.executorName}}
+                                </span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <span v-if="scope.row.executorName == null">
+                                        {{$t('dai-fen-pei')}}
+                                    </span>
+                                    <span v-else>
+                                        <span v-for="item,index in scope.row.executorName" :key="index">
+                                            <ww-open-data type='userName' :openid='item'></ww-open-data>
+                                            <span v-if="index < scope.row.executorName.length - 1">,</span>
+                                        </span>
+                                    </span>
+                                </span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="endDate" :label="$t('deadline')" width="100" >
+                            <template slot-scope="scope">
+                                <p v-if="scope.row.endDate >= times">{{scope.row.endDate}}</p>
+                                <p v-else style="background: #e62412; color: #fff;text-align: center; border-radius: 3px;">{{scope.row.endDate}}</p>
+                            </template>
+                        </el-table-column>
+                </el-table>
+            </div>
+        </el-form>
+        <!-- 关联文件列表 -->
+        <template v-if="isEditFile">
+            <div style="width:100%;margin:1em 0;">
+                <i class="iconfont firerock-icontree" style="color:#20A0ff;margin-left:10px;">{{ $t('jiafuchengguo') }}</i>
+                <el-link @click="relationFileClick()" style="float:right;margin-left:10px">{{ $t('associatedfiles') }}</el-link>
+                <el-upload style="float:right;" action="#" :http-request="uploadFileClick" :show-file-list="false" :multiple="false">
+                    <el-link>{{ $t('uoloadFiles') }}</el-link>
+                </el-upload>
+                
+            </div>
+            <el-table
+                v-loading="fileListLoading"
+                ref="filetable"
+                :data="taskFileList"
+                :header-cell-style="{'font-weight':'normal'}"
+                highlight-current-row
+                max-height="240"
+                style="width: 100%;margin-top:10px;margin-bottom:15px">
+                <el-table-column :label="$t('headerTop.serialNumber')" prop="documentType" min-width="40" align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            {{scope.$index + 1}}
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column :label="$t('filenames')" prop="documentName" min-width="180"></el-table-column>
+                <el-table-column :label="$t('filesize')" prop="size" min-width="60" align="center"></el-table-column>
+                <el-table-column :label="$t('founder')" prop="creatorName" min-width="60" align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            <span v-if="user.userNameNeedTranslate != 1">{{scope.row.creatorName}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1">
+                                <ww-open-data type='userName' :openid='scope.row.creatorName'></ww-open-data>
+                            </span>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column :label="$t('creationtime')" prop="indate" min-width="120" align="center">
+                    <template slot-scope="scope">
+                        <span>{{scope.row.indate[0] + '-' + scope.row.indate[1] + '-' + scope.row.indate[2] + '\u0020\u0020' + scope.row.indate[3] + ':' + scope.row.indate[4] + ':' + scope.row.indate[5]}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column :label="$t('operation')" min-width="90">
+                    <template slot-scope="scope">
+                        <el-link :href="scope.row.url" :download="scope.row.documentName" type="primary" style="margin-right:7px">{{ $t('other.download') }}</el-link>
+                        <el-link @click="taskFileDelete(scope.row.id)">{{ $t('btn.delete') }}</el-link>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </template>
+        <!-- 关联文件dialog -->
+        <el-dialog v-if="relationFileDialog" :visible.sync="relationFileDialog" :title="$t('associatedfiles')" append-to-body>
+            <span>{{ $t('wenjian1guanli') }}</span>
+            <div>
+                <span>{{ $t('xuanzwenjian') }}</span>
+                <el-select v-model="addFileId" filterable >
+                    <el-option
+                        v-for="item in projectFileList"
+                        :key="item.id"
+                        :label="item.documentName"
+                        :value="item.id"
+                    ></el-option>
+                </el-select>
+                <el-button @click="addTaskFile()">{{ $t('btn.determine') }}</el-button>
+                <!-- <el-button @click="relationFileDialog = false">取消</el-button> -->
+            </div>
+        </el-dialog>
+        <el-dialog v-if="isRelationTab" :visible.sync="isRelationTab" :title="$t('associatedTask')" width="800px" append-to-body>
+            <el-form ref="relationItemForm" label-width="100px">
+                <el-form-item :label="$t('selecttask')" prop="taskType">
+                    <el-select v-model="relationvalue" multiple style="width:80%">
+                        <el-option
+                        v-for="item in relationdata"
+                        :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="isRelationTab = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="addRelationTask()">{{ $t('btn.determine') }}</el-button>
+            </div>
+        </el-dialog>
+    </div>
+    <div slot="footer" class="dialog-footer">
+        <el-button v-if="(user.id == addForm.createrId || currentProject.inchargerId == user.id || currentProject.creatorId == user.id || permissions.projectManagement) && canAddTask" @click.native="deleteTask()" style="float:left;">{{ $t('btn.delete') }}</el-button>
+        <el-button @click.native="closeBounced()">{{ $t('btn.cancel') }}</el-button>
+        <el-button type="primary" @click="submitInsert" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
+    </div>
+    <div slot="title" v-if="addForm.parentTid != null || isRelationItem" >
+        <!-- <el-link @click="backToParentTask"><i class="el-icon-arrow-left single_line">返回父级任务</i> | {{addForm.parentTname}}</el-link> -->
+        <el-page-header  @back="backToParentTask" :title="timelabel ? $t('returnmilestone') : $t('parenttask')" :content="timelabel ? relationPar.name : addForm.parentTname"></el-page-header>
+    </div>
+    <!-- 评论 -->
+    <div class="remark" v-show="addForm.id != null">
+        <span class="zh">
+                <div class="player">
+                    <p>{{ $t('participantin') }}</p>
+                    <div class="bj">
+                        <span  v-for="(pl, i) in critic" :key="i">
+                        <span style="background: #778899" v-if="user.userNameNeedTranslate != 1">{{pl.length > 2 ? pl.substring(pl.length - 2, pl.length) : pl}}</span>
+                        <span v-if="user.userNameNeedTranslate == 1">
+                            <ww-open-data type='userName' :openid='pl'></ww-open-data>
+                        </span>
+                        </span>
+                        <!-- <span style="background: #778899">{{pl.length}}</span> -->
+                    </div>
+                </div>
+            <div class="subject">
+                <div class="sub-all">
+                    <div :class="dynamicTab ? 'subOn' : ''" @click="dynamicTab = true">{{ $t('alldynamic') }}</div>
+                    <div :class="dynamicTab ? '' : 'subOn'" @click="dynamicTab = false">{{ $t('xiang-guan-ri-bao') }}</div>
+                </div>
+                <div class="sub-details" ref="main" v-if="dynamicTab">
+                    <ul class="infinite-list" v-infinite-scroll="load" ref="contRoll">
+                        <div style="width: 100%" v-if="commentList.length <= 0">
+                            <img src="../assets/image/xiao.png" alt="">
+                        </div>
+                        <li v-for="i in count" class="infinite-list-item counli" :key="i">
+                            <p><i class="el-icon-s-fold"></i> <em>{{ $t('managerQucompletedthedependencytask') }}</em><span>{{ $t('onApril20') }}</span></p>
+                        </li>
+                        <li class="carts" v-for="item in commentList" :key="item.id">
+                            <!-- <el-image style="width: 30px; height: 30px" :src="url" :fit="fit"></el-image> -->
+                            <!-- <i :style="'background' + item.userColor"> -->
+                            <i :style="'background' + item.userColor">
+                                <i v-if="user.userNameNeedTranslate != 1">
+                                    {{item.userName.length > 2 ? item.userName.substring(item.userName.length - 2, item.userName.length) : item.userName}}
+                                </i>   
+                                <i v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                </i>
+                            </i>
+                            <div>
+                                <!-- <p>{{item.userName}}</p> -->
+                                <!-- <p> -->
+                                    <p v-if="user.userNameNeedTranslate != 1">
+                                        {{item.userName}}
+                                    </p>
+                                    <p v-if="user.userNameNeedTranslate == 1">
+                                        <ww-open-data type='userName' :openid='item.userName'></ww-open-data>
+                                    </p>
+                                <!-- </p> -->
+                                <em>
+                                    <!-- {{item.content}} -->
+                                    <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate == 1">
+                                        {{item.content.msg1}}
+                                        <ww-open-data type='userName' :openid='item.content.msg2'></ww-open-data>
+                                        {{item.content.msg3}}
+                                    </p>
+                                    <p style="display: inline-block;padding: 0;margin: 0;" v-if="user.userNameNeedTranslate != 1">{{item.content}}</p>
+                                </em>
+                            </div>
+                            <span>{{item.createTime | relativeTime}}</span>
+                        </li>
+                    </ul>
+                </div>
+                <div class="Daily" v-if="!dynamicTab">
+                    <div class="one_daily_body DailyBody">
+                        <el-card shadow="never" v-for="(item2,index2) in dailyList" :key="index2" style="margin-bottom: 20px;">
+                            <p>
+                                {{ $t('tian-bao-ren') }}: <span v-if="user.userNameNeedTranslate != 1">{{item2.userName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                    <ww-open-data type='userName' :openid='item2.userName'></ww-open-data>
+                                </span>
+                                <span style="float: right;">{{item2.createDate}}</span>
+                            </p>
+                            <p>{{ $t('other.approvalStatus') }}:
+                                <span v-if="user.company.packageEngineering == 0">
+                                    <span style="margin-left:15px;color:#DAA520;"  v-if="item2.state == 0">
+                                        <span v-if="item2.isDeptAudit==0">
+                                            <span v-if="item2.projectAuditState==0">
+                                                <!-- 待项目审核人 --> {{$t('other.waitForTheProjectReviewer')}}
+                                                <span v-if="item2.projectAuditorName != null">(
+                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                    )</span> 
+                                                <!-- 审核 --> {{$t('other.audit')}}
+                                            </span>
+                                            <span style="color:#32CD32;" v-else-if="item2.projectAuditState==1">
+                                                <!-- 项目审核人 --> {{$t('other.projectAuditor')}}
+                                                <span v-if="item2.projectAuditorName != null">(
+                                                    <!-- {{item2.projectAuditorName}} -->
+                                                    <span v-if="user.userNameNeedTranslate == '1'">
+                                                        <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                                    </span>
+                                                    <span v-if="user.userNameNeedTranslate != '1'">{{item2.projectAuditorName}}</span>
+                                                    )</span>
+                                                <!-- 审核通过 --> {{$t('state.approved')}}
+                                            </span>
+                                        </span>
+                                        <span v-else-if="item2.isDeptAudit==1">
+                                            ({{$t('other.await')}}
+                                            <span v-if="user.userNameNeedTranslate == '1'">
+                                                <ww-open-data type='departmentName' :openid='item2.auditDeptName'></ww-open-data>
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate != '1'">{{item2.auditDeptName}}</span>
+                                            {{$t('other.audit')}})
+                                        </span>
+                                        </span> 
+                                    <span style="margin-left:15px;color:#DAA520;" v-else-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                    <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}
+                                        <span style="color:#c7e944" v-if="item2.reportAutoApprove == 1">{{$t('other.automaticReview')}}</span>
+                                    </span>
+                                    
+                                    <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                    <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                </span>
+                                <span v-if="user.company.packageEngineering == 1">
+                                    <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == -1">{{$t('other.importWaitingForReview')}}</span>
+                                    <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == -1">{{$t('other.waitingForProfessionalReview')}}</span>
+                                    <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 0">{{$t('other.waitingForDepartmentReview')}}</span>
+                                    <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">{{$t('other.waitForTheProjectReviewer')}}<span v-if="item2.projectAuditorName != null">
+                                        (
+                                            <span v-if="user.userNameNeedTranslate != 1">
+                                                {{item2.projectAuditorName}}
+                                            </span>
+                                            <span v-if="user.userNameNeedTranslate == 1">
+                                                <ww-open-data type='userName' :openid='item2.projectAuditorName'></ww-open-data>
+                                            </span>
+                                        )
+                                    </span>{{$t('other.audit')}}</span>
+                                    <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">{{$t('state.alreadyPassed')}}</span>
+                                    <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">{{$t('state.rejected')}} {{$t('other.reason')}}:{{item2.rejectReason}}</span>
+                                    <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">{{$t('state.waitingsubmit')}}</span>
+                                </span>
+                            </p>
+                            <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null && item2.degree_id != -1">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
+                            <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item2.customData}}</p>
+                            <!-- 自定义日报文本 -->
+                            <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item2.customText}}</p>
+                            <p v-if="user.company.packageEngineering == 1">
+                                {{$t('other.professionalProgress')}}:
+                                <span style="margin-right:10px;" v-for="progressItem in item2.professionProgress" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 
+                                    <el-tooltip v-if="progressItem.auditState == 0"  :content="$t('state.WaitingAudit')" effect="light" placement="top">
+                                    <i class="iconfont firerock-icondaibandengdaishenhe"></i>
+                                    </el-tooltip>
+                                    <el-tooltip v-if="progressItem.auditState == 1" :content="$t('state.alreadyPassed')" effect="light" placement="top">
+                                    <i  class="iconfont firerock-iconshenhetongguo"></i>
+                                    </el-tooltip>
+                                    <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
+                                    <i  class="iconfont firerock-iconshenhebohui"></i>
+                                    </el-tooltip>
+                                    </span>
+                            </p>
+                            <div v-if="item2.multiWorktime==0">
+                            <p style="display: inline-block;">{{$t('time.duration')}}:
+                                <span v-if="item2.reportTimeType == 0" style="margin-right:10px;">{{typeList[item2.timeType]}}</span>
+                                <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{item2.startTime+'-'+item2.endTime}}</span>
+                            {{item2.time.toFixed(1)}}h  
+                            <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{$t('other.WorkOvertime')}}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag>
+                            </p>
+                            <p>{{$t('other.matters')}}:<span v-html="item2.content"></span></p>
+                            </div>
+                            <div v-if="item2.multiWorktime==1" >
+                                <p>{{$t('other.projectDuration')}}:{{item2.time.toFixed(1)}}h  <el-tag type="danger" size="mini" style="margin-left: 65px" v-if="item2.isOvertime === 1">{{ $t('other.WorkOvertime') }}<span v-if="item2.overtimeHours">{{item2.overtimeHours.toFixed(1)}}h</span></el-tag></p>
+                                <div v-for="(timeItem, tIndex) in item2.worktimeList" :key="tIndex"
+                                    style="border: 0.5px #ddd solid;margin-bottom:5px;padding:5px;">
+                                    <p style="display: inline-block;">{{$t('time.duration')}}:
+                                        <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
+                                    {{timeItem.time.toFixed(1)}}h  
+                                    </p>
+                                    <p>{{$t('other.matters')}}:<span v-html="timeItem.content"></span></p>
+                                </div>
+                            </div>
+                            <p v-if="item2.state == 1 && user.timeType.needEvaluate == 1">{{$t('other.evaluation')}}:<span v-html="item2.evaluate"></span></p>
+                            
+                            <!--照片的显示 -->
+                            <p v-if="item2.pics != null && item2.pics.length > 0"> 
+                                <el-image v-for="(pic, index) in item2.pics" :key="index"
+                                    style="width: 100px; height: 100px; margin-right:10px;"
+                                    :src="pic" 
+                                    :preview-src-list="item2.pics">
+                                </el-image>
+                            </p>
+                        </el-card>
+                    </div>
+                </div>
+            </div>
+            <div class="issue" v-if="dynamicTab">
+                <!-- <el-input type="textarea" class="textareays" label-width="100%" label-height="140px"></el-input> -->
+                <div class="issue_fixation">
+                    <div class="inputDeep"><el-input
+                    type="textarea"
+                    :placeholder="$t('pleaseentercontent')"
+                    :autosize="{ minRows: 6, maxRows: 6}"
+                    v-model="textarea2"
+                    class="inputDeeps"
+                    >
+                    </el-input></div>
+                    <el-button class="issue-button" type="primary" @click="release()">{{ $t('fa-bu') }}</el-button>
+                </div>
+            </div>
+        </span>
+    </div>
+  </div>
+</template>
+
+<script>
+// 富文本样式
+import 'quill/dist/quill.core.css'
+import 'quill/dist/quill.snow.css'
+import 'quill/dist/quill.bubble.css'
+// 导入富文本
+import { quillEditor } from 'vue-quill-editor'
+export default {
+  props: {
+    integrationTask:{
+        type: Object,
+        default: {}
+    },
+  },
+  components: {
+    quillEditor, // 富文本
+  },
+  data() {
+    return {
+        user: JSON.parse(sessionStorage.getItem("user")),
+        permissions: JSON.parse(sessionStorage.getItem("permissions")),
+        date: new Date(),
+        editorOption: { // 富文本框里面的默认值
+            placeholder: this.$t('pleaseentethetext'),
+             modules: {
+                toolbar:[
+                    ['bold', 'italic', 'underline', 'strike'],    //加粗,斜体,下划线,删除线
+                    // ['blockquote', 'code-block'],     //引用,代码块
+            
+                    [{ 'header': 1 }, { 'header': 2 }],        // 标题,键值对的形式;1、2表示字体大小
+                    // [{ 'list': 'ordered'}, { 'list': 'bullet' }],     //列表
+                    // [{ 'script': 'sub'}, { 'script': 'super' }],   // 上下标
+                    // [{ 'indent': '-1'}, { 'indent': '+1' }],     // 缩进
+                    // [{ 'direction': 'rtl' }],             // 文本方向
+            
+                    [{ 'size': ['small', false, 'large', 'huge'] }], // 字体大小
+                    [{ 'header': [1, 2, 3, 4, 5, 6, false] }],     //几级标题
+            
+                    [{ 'color': [] }, { 'background': [] }],     // 字体颜色,字体背景颜色
+                    // [{ 'font': [] }],     //字体
+                    [{ 'align': [] }],    //对齐方式
+            
+                    ['clean'],    //清除字体样式
+                    // ['image','video']    //上传图片、上传视频
+                    ['image']    //上传图片、上传视频
+                ], //工具栏设置
+            },
+            theme: 'snow',
+        },
+
+        taskTypeList:[{id:0,name:this.$t('other.task'), icon:"iconfont firerock-iconrenwu"},{id:1,name:this.$t('other.milestone'),icon:"iconfont firerock-iconicon-"},{id:2,name:this.$t('risk'),icon:"iconfont firerock-iconfengxian"}],
+        
+        addForm: {},
+        currentProject: {},
+        checkLists: {}
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    console.log('我获取到的数据', this.integrationTask)
+    this.addForm = this.integrationTask.addForm
+    this.currentProject = this.integrationTask.currentProject
+    this.checkLists = this.integrationTask.checkLists
+  },
+  methods: {
+    // 关闭最外层弹窗
+    closeBounced() {
+        this.$emit('closeBounced')
+    }
+  },
+};
+</script>
+
+<style scoped>
+
+</style>

+ 13 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -1,6 +1,6 @@
 <template>
     <div>
-        <div class="login" v-if="!isCorpWX">
+        <div class="login" v-if="!bindingqywx">
             <div class="login-par">
                 <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-position="left" label-width="0px" class="demo-ruleForm login-container">
                     <div class="login-logo">
@@ -57,8 +57,8 @@
                 </div>
             </el-dialog>
         </div>
-        <!-- 企业微信的话 -->
-        <div class="qiweix" v-if="isCorpWX">
+        <!-- 绑定企业微信的话显示这个 -->
+        <div class="qiweix" v-if="bindingqywx">
             正在进入系统...
         </div>
     </div>
@@ -84,7 +84,8 @@
                     username: [{ required: true, message: this.$t('peaseenterthe'), trigger: 'blur' },],
                     password: [{ required: true, message: this.$t('peaseenterthe'), trigger: 'blur' },]
                 },
-                wxworkFlg: false
+                wxworkFlg: false,
+                bindingqywx: false
             };
         },
         watch: {
@@ -108,10 +109,15 @@
                 let token = windowHerf.split('&token=')[1]
                 this.automaticLogin(jobNumber, token)
             }
+            // 用户绑定了企业微信
+            if(windowHerf.indexOf('userId') != '-1') {
+                this.bindingqywx = true
+            }
         },
         mounted() {
             // this.wxworkCli()
             var ua = navigator.userAgent.toLowerCase();
+            console.log(ua, '打印出来')
             if (ua.indexOf("wxwork") > 0) {
                 this.isCorpWX = true;
             } 
@@ -146,6 +152,7 @@
                         }
                     } else if (href.indexOf('errorMsg=') > 0) {
                         var errorMsg = href.split('errorMsg=')[1].split('#')[0];
+                        errorMsg = decodeURI(errorMsg);
                         this.$message({
                             message: errorMsg,
                             type: 'error'
@@ -535,7 +542,8 @@
         height: 100%;
         .login-par {
             width: 100%;
-            min-height: 100%;
+            // min-height: 100%;
+            height: 100vh;
             background: #f0f2f5 url('../assets/image/background.png') no-repeat 50%;
             background-size: 100%;
             padding: 110px 0 144px;

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

@@ -10,7 +10,7 @@
                     <span slot="title">{{ $t('businesstriisallowed') }}</span>
                 </el-menu-item>
                 <el-menu-item index="2" @select="bills" @click="auditList()" v-if="permissions.awayOfficeAudit">
-                <i class="iconfont firerock-iconbaoxiaodan"></i>
+                <i class="iconfont firerock-iconshenhe"></i>
                 <span slot="title">出差审核</span>
                 </el-menu-item>
                 <el-menu-item index="3" @select="bills" @click="bills(false, 2)" >
@@ -20,7 +20,7 @@
                 
                 <el-menu-item index="4" v-if="permissions.awayOfficeStatistical">
                     <template slot="title">
-                        <i class="iconfont firerock-icontianbao"></i>
+                        <i class="iconfont firerock-icongongshitongji"></i>
                         <span slot="title">{{ $t('businessstatistics') }}</span>
                     </template>
                 </el-menu-item>

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

@@ -30,7 +30,7 @@
           </el-submenu> -->
 
           <el-menu-item index="2" @select="bills" @click="auditList()" v-if="permissions.leaveAudit">
-              <i class="iconfont firerock-iconbaoxiaodan"></i>
+              <i class="iconfont firerock-iconshenhe"></i>
               <span slot="title">请假审核</span>
             </el-menu-item>
             <el-menu-item index="3" @select="bills" @click="bills(false, 2)" >
@@ -44,7 +44,7 @@
             
             <el-menu-item index="4" v-if="permissions.leaveStatistical">
               <template slot="title">
-                <i class="iconfont firerock-icontianbao"></i>
+                <i class="iconfont firerock-icongongshitongji"></i>
                 <span slot="title">{{ $t('for') }}</span>
               </template>
           </el-menu-item>
@@ -58,7 +58,7 @@
 
           <el-menu-item index="6" v-if="permissions.leaveAnnual">
               <template slot="title">
-                <i class="iconfont firerock-icontianbao"></i>
+                <i class="iconfont firerock-iconsetting"></i>
                 <span slot="title">{{ $t('annualleavemanagement') }}</span>
               </template>
           </el-menu-item>

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

@@ -1334,10 +1334,13 @@ import { error } from 'dingtalk-jsapi';
                     sums[index] = this.$t('zongjia');
                     return;
                 }
-                if (index === 1 || index === 2){
-                    sums[index] = ''
+                if (index === 1){
+                    sums[index] = '';
                     return
                 }
+                if (index === 2 && this.user.timeType.financeJobnumEnabled == 1) {
+                    sums[index] = '';
+                }
                 const values = data.map(item => Number(item[column.property]));
                 if (!values.every(value => isNaN(value))) {
                     sums[index] = values.reduce((prev, curr) => {

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

@@ -393,6 +393,7 @@
             <template v-if="(showColumnWidth != '0' || permissions.projectManagement)">
                 <el-button size="small" type="primary" @click="addProPreson()">{{ $t('projectparticipantsinbatches') }}</el-button>
                 <el-button size="small" type="primary" @click="batchIncharger()">{{ $t('projectmanagersinbatches') }}</el-button>
+                <!-- <el-button size="small" type="primary" @click="batchDelete()">批量删除</el-button> -->
             </template>
                 
             

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -726,7 +726,7 @@
                     <span>{{ $t('wenjian1guanli') }}</span>
                     <div>
                         <span>{{ $t('xuanzwenjian') }}</span>
-                        <el-select v-model="addFileId">
+                        <el-select v-model="addFileId" filterable >
                             <el-option
                                 v-for="item in projectFileList"
                                 :key="item.id"
@@ -1689,7 +1689,7 @@
             },
             // 列表的删除按钮
             taskFileDelete(eid){
-                this.$confirm(this.$t('quxiaoguanlan'), this.$t('other.prompts'), {
+                this.$confirm('是否移除此文件?', this.$t('other.prompts'), {
                     confirmButtonText: this.$t('btn.determine'),
                     cancelButtonText: this.$t('btn.cancel'),
                     type: 'warning'
@@ -2435,6 +2435,7 @@
             backToParentTask() {
                 // this.getTaskDetail(this.addForm.parentTid);
                 this.getTaskDetail(this.timelabel ? this.relationPar.id : this.addForm.parentTid);
+                this.isEditFile = true;
                 if(this.timelabel){
                     this.isRelationItem = false
                     // this.relationPar = {name: ''}
@@ -2449,6 +2450,8 @@
                 this.addForm = {parentTname: this.addForm.name,parentTid: this.addForm.id,projectId: this.addForm.projectId, groupId: this.addForm.groupId,  taskLevel:0, planHours: 8, taskType: 0};
                 this.addForm.executorListFront = [{executorId:null, planHours:8}];
                 this.addLoading = false;
+                //创建子任务,非编辑状态
+                this.isEditFile = false;
             },
             //认领任务
             addAsMyTask(task) {

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

@@ -1772,7 +1772,6 @@ import { error } from 'dingtalk-jsapi';
                 })
             },
             submitInsert() {
-                this.addLoading = true
                 if (this.textContent !== true) return  this.$message({
                     showClose: true,
                     message: this.$t('pictureistoolargepleaseuploaditagain'),
@@ -1796,13 +1795,14 @@ import { error } from 'dingtalk-jsapi';
                         });
                     }
                 }
-
+                
                 this.$refs.form1.validate(valid => {
                     if (valid) {
                         delete this.addForm.subTaskList;
                         delete this.addForm.progress;
                         delete this.addForm.refTaskList;
                         this.addForm.executorListStr = JSON.stringify(this.addForm.executorListFront);
+                        this.addLoading = true;
                         this.http.post('/task/save',this.addForm,
                             res => {
                                 this.addLoading = false

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

@@ -325,8 +325,8 @@
                     <selectCat :size="'medium'" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="depForm.otherManagerIds" :distinction="'4'" @selectCal="selectCal"></selectCat>
                 </el-form-item>
                 <!-- 直属领导 -->
-                <el-form-item :label="$t('leadership')" prop="reportAuditUserid" v-if="user.timeType.needDeptAudit && user.userNameNeedTranslate != '1'">
-                    <el-select v-model="depForm.reportAuditUserid" filterable  clearable  :placeholder="$t('defaultText.pleaseChoose')" style="width: 100%">
+                <el-form-item :label="$t('leadership')" prop="reportAuditUserid" v-if="user.timeType.needDeptAudit">
+                    <el-select v-model="depForm.reportAuditUserid" v-if="user.userNameNeedTranslate != '1'" filterable  clearable  :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>
                     <selectCat :size="'medium'" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="depForm.reportAuditUserid" :distinction="'5'" @selectCal="selectCal"></selectCat>

+ 14 - 8
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -44,7 +44,7 @@
                                 </el-select>
                             </div>
                             <div>
-                                <el-tree :data="data"  @node-click="handleNodeClick" node-key="id" :default-expanded-keys="expandDate">
+                                <el-tree :data="data"  @node-click="handleNodeClick" node-key="id" :default-expanded-keys="expandDate" v-loading="dataLoading">
                                     <span class="custom-tree-node"  style="position: relative;box-sizing: border-box;width: 10%;" slot-scope="{ node, data}">
                                         <!-- <span>{{ node.label }}</span> -->
                                         <span style="padding-right: 50px;box-sizing: border-box;overflow:hidden;text-overflow:ellipsis;line-height: 36px; display: inline-block;">
@@ -1631,12 +1631,11 @@
         </el-dialog>
         <!--基于企业微信考勤数据的工时导入 -->
         <el-dialog :title="$t('title.Workhoursimportresult')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
-            <div>
-                <span>{{importResultMsg}}</span>
-                
+            <div style="padding-bottom:10px;">
+                <p>{{importResultMsg}}</p>
             </div>
             <!-- <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">{{$t('btn.submit')}}</el-button>
+                <el-button type="primary" @click="showImportResult=false">关闭</el-button>
             </span> -->
         </el-dialog>
         
@@ -1922,7 +1921,9 @@
                 workReportStateString: [this.$t('state.WaitingAudit'),this.$t('state.alreadyPassed'),this.$t('state.rejected'),this.$t('state.waitingsubmit')],
                 weeklyFilledTimeCanDelete: false,
                 weeklyFilledTimeDate: null,
-                leaveAllNum: 0
+                leaveAllNum: 0,
+
+                dataLoading: true
             };
         },
         watch: {
@@ -2007,6 +2008,11 @@
             if(this.user.timeType.lockWorktime){
                 this.timeRange = this.timeRange.filter(item => {return item <= this.user.timeType.allday})
             }
+
+            const that = this
+            setTimeout(()=>{
+                that.dataLoading = false
+            }, 1000)
         },
         methods: {
             test(){
@@ -2366,7 +2372,7 @@
                         this.importingData = false;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = this.$t('other.successful') + ':' + this.$t('other.importSuccess') +res.data+this.$t('other.workHourData')+(res.msg?res.msg:"");
+                            this.importResultMsg = '成功导入' +res.data+this.$t('other.workHourData')+(res.msg?res.msg:"");
                             this.getReportList();
                             this.importWxDialog = false;
                         } else {
@@ -2404,7 +2410,7 @@
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = this.$t('other.importSuccess')+res.data+this.$t('other.workHourData')+(res.msg?res.msg:"");;
+                            this.importResultMsg = "成功导入"+res.data+this.$t('other.workHourData')+(res.msg?res.msg:"");;
                             this.getReportList();
                             this.importWXDialog = false;
                         } else {