Explorar el Código

员工任务完成情况表

Min hace 1 año
padre
commit
9fc4002b41

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

@@ -14,6 +14,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.poi.hssf.usermodel.*;
 import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -101,9 +104,17 @@ public class TaskController {
     private SapProjectServiceService sapProjectServiceService;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private DingDingService dingDingService;
     @Value(value = "${upload.path}")
     private String path;
 
+    //用于控制线程锁
+    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
+    public static HashMap<String, Integer> corpddJobCenter = new HashMap();
+
     @RequestMapping("/save")
     @Transactional
     public HttpRespMsg save(Task task) throws Exception {
@@ -968,7 +979,195 @@ public class TaskController {
 
     @RequestMapping("exportTask")
     public HttpRespMsg exportTask(Integer projectId, Integer taskType) {
-        return taskService.exportTask(projectId, taskType);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        List<TimeTask> list= taskMapper.getTaskWithWorktime(projectId, taskType);
+        Project project = projectMapper.selectById(projectId);
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        try {
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            //准备导出
+            HSSFWorkbook workbook = new HSSFWorkbook();
+            //HSSFSheet sheet = workbook.createSheet("任务数据");
+            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.taskData"));
+            //创建表头
+            HSSFRow headRow = sheet.createRow(0);
+            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
+            sheet.setColumnWidth(0, 50 * 256);
+            sheet.setColumnWidth(1, 20 * 256);
+            sheet.setColumnWidth(2, 20 * 256);
+            sheet.setColumnWidth(3, 20 * 256);
+            sheet.setColumnWidth(4, 20 * 256);
+            sheet.setColumnWidth(5, 20 * 256);
+            sheet.setColumnWidth(6, 20 * 256);
+            sheet.setColumnWidth(7, 20 * 256);
+            sheet.setColumnWidth(8, 20 * 256);
+            sheet.setColumnWidth(9, 20 * 256);
+            //设置为居中加粗
+            HSSFCellStyle headStyle = workbook.createCellStyle();
+            HSSFFont font = workbook.createFont();
+            font.setBold(true);
+            headStyle.setFont(font);
+            HSSFFont redFont = workbook.createFont();
+            redFont.setColor(HSSFFont.COLOR_RED);
+            HSSFCellStyle redStyle = workbook.createCellStyle();
+            redStyle.setFont(redFont);
+            //表头
+            HSSFCell headCell;
+            headCell = headRow.createCell(0);
+            //headCell.setCellValue("任务内容");
+            headCell.setCellValue(MessageUtils.message("excel.taskContent"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(1);
+            //headCell.setCellValue("项目");
+            headCell.setCellValue(MessageUtils.message("entry.project"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(2);
+            //headCell.setCellValue("执行人");
+            headCell.setCellValue(MessageUtils.message("excel.executor"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(3);
+            //headCell.setCellValue("创建时间");
+            headCell.setCellValue(MessageUtils.message("excel.creatTime"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(4);
+            //headCell.setCellValue("截止时间");
+            headCell.setCellValue(MessageUtils.message("excel.deadline"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(5);
+            //headCell.setCellValue("完成时间");
+            headCell.setCellValue(MessageUtils.message("excel.comTime"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(6);
+            //headCell.setCellValue("是否完成");
+            headCell.setCellValue(MessageUtils.message("excel.whetherCom"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(7);
+            //headCell.setCellValue("是否逾期");
+            headCell.setCellValue(MessageUtils.message("excel.overdueNot"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(8);
+            //headCell.setCellValue("计划工时(h)");
+            headCell.setCellValue(MessageUtils.message("excel.plannedWork"));
+            headCell.setCellStyle(headStyle);
+            headCell = headRow.createCell(9);
+            //headCell.setCellValue("实际工时(h)");
+            headCell.setCellValue(MessageUtils.message("excel.actualWork"));
+            headCell.setCellStyle(headStyle);
+            int rowNum = 1;
+            for (TimeTask task : list) {
+                HSSFRow row = sheet.createRow(rowNum);
+                row.createCell(0).setCellValue(task.getName());
+                row.createCell(1).setCellValue(project.getProjectName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
+                    if(first.isPresent()){
+                        row.createCell(2).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
+                    }else {
+                        row.createCell(2).setCellValue("");
+                    }
+                }else {
+                    row.createCell(2).setCellValue(task.getExecutorName());
+                }
+                row.createCell(3).setCellValue(dateTimeFormatter.format(task.getCreateDate()));
+                row.createCell(4).setCellValue(task.getEndDate() != null?dateTimeFormatter.format(task.getEndDate()):"");
+                row.createCell(5).setCellValue(task.getFinishDate() !=null?dateTimeFormatter.format(task.getFinishDate()):"");
+                row.createCell(6).setCellValue(task.getTaskStatus() == 1?"Y":"N");
+                boolean isExpired = false;
+                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDate.now())) {
+                    isExpired = true;
+                }
+                row.createCell(7).setCellValue(isExpired?"Y":"N");
+                row.createCell(8).setCellValue(task.getPlanHours()==null?"": task.getPlanHours().toString());
+                row.createCell(9).setCellValue(task.getWorkHours());
+                rowNum++;
+            }
+            //生成Excel文件
+            //String fileUrlSuffix = "【"+project.getProjectName()+"】任务数据" + System.currentTimeMillis() + ".xls";
+            String fileUrlSuffix = "【"+project.getProjectName()+"】"+MessageUtils.message("excel.taskData") + System.currentTimeMillis() + ".xls";
+            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
+            workbook.write(fos);
+            fos.flush();
+            fos.close();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
+                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
+                    if (corpwxJobResult != null) {
+                        if (corpwxJobResult.getErrCode() == 0) {
+                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                            corpwxJobCenter.remove(jobId);
+                        } else {
+                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                            return httpRespMsg;
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else if(dingding!=null&&dingding.getSyncContact()==1){
+                String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
+                String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
+                int i = 0;
+                String syncTranslationResult = null;
+                /**
+                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
+                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
+                 */
+                while (i < 10) {
+                    Thread.sleep(300);
+                    Integer status = corpddJobCenter.get(jobId);
+                    if (status != null) {
+                        if (status==1) {
+                            syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
+                            corpddJobCenter.remove(jobId);
+                        }
+                        break;
+                    }
+                    i++;
+                }
+                if (syncTranslationResult != null) {
+                    httpRespMsg.data = syncTranslationResult;
+                } else {
+                    //httpRespMsg.setError("处理超时...");
+                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
+                }
+            }else {
+                httpRespMsg.data = "/upload/" + fileUrlSuffix;
+            }
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("验证失败或缺少数据");
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        } catch (IOException e) {
+            e.printStackTrace();
+            //httpRespMsg.setError("文件生成错误");
+            httpRespMsg.setError(MessageUtils.message("file.generateError"));
+            return httpRespMsg;
+        }catch (Exception e){
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
     }
 
     @RequestMapping("/importTask")
@@ -1265,6 +1464,16 @@ public class TaskController {
         return taskService.userTaskCompleteDetail(pageIndex,pageSize,startDate,endDate,userId,deptId);
     }
 
+    @RequestMapping("/exportUserTaskCompleteDetail")
+    public HttpRespMsg exportUserTaskCompleteDetail(String startDate,String endDate,String userId,Integer deptId){
+        return taskService.exportUserTaskCompleteDetail(startDate,endDate,userId,deptId);
+    }
+
+    @RequestMapping("/getTaskByUserId")
+    public HttpRespMsg getTaskByUserId(String startDate,String endDate,String userId,Integer pageIndex,Integer pageSize){
+        return taskService.getTaskByUserId(startDate,endDate,userId,pageIndex,pageSize);
+    }
+
 
 }
 

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

@@ -825,7 +825,7 @@ public class WeiXinCorpController {
                     ExcelExportServiceImpl.corpwxJobCenter.put(jobId, result);
                     ReportServiceImpl.corpwxJobCenter.put(jobId, result);
                     UserController.corpwxJobCenter.put(jobId, result);
-                    TaskServiceImpl.corpwxJobCenter.put(jobId, result);
+                    TaskController.corpwxJobCenter.put(jobId, result);
                 } else if ("auto_activate".equals(infoType)) {
                     //被邀请的同事自动激活使用
                     //{"xml":{"Scene":1,"InfoType":"auto_activate",

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

@@ -55,4 +55,10 @@ public interface TaskMapper extends BaseMapper<Task> {
     void updateFinishDate(Integer id);
 
     List<Map<String,Object>>  userTaskCompleteDetail(Integer pageStart, Integer pageSize, String startDate, String endDate, String userId, Integer deptId,@Param("list") List<Integer> deptIds, Integer companyId);
+
+    Integer userTaskCompleteDetailCount(String startDate, String endDate, String userId, Integer deptId,@Param("list") List<Integer> deptIds, Integer companyId);
+
+    List<Map<String, Object>> getTaskByUserId(String startDate, String endDate, String userId, Integer pageStart, Integer pageSize);
+
+    Integer getTaskByUserIdCount(String startDate, String endDate, String userId);
 }

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/TaskService.java

@@ -35,8 +35,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getTaskTimeCompare(Integer projectId,Integer deptId);
     HttpRespMsg exportTaskTimeCompare(Integer projectId,Integer deptId);
 
-    HttpRespMsg exportTask(Integer projectId, Integer taskType);
-
     HttpRespMsg importTask(Integer isMultiProject, Integer projectId, Integer groupId, MultipartFile file, HttpServletRequest request) throws Exception;
 
     HttpRespMsg delete(TaskGroup item);
@@ -52,4 +50,8 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getExecutorPlanHour(Integer projectId);
 
     HttpRespMsg userTaskCompleteDetail(Integer pageIndex, Integer pageSize, String startDate, String endDate, String userId, Integer deptId);
+
+    HttpRespMsg exportUserTaskCompleteDetail(String startDate, String endDate, String userId, Integer deptId);
+
+    HttpRespMsg getTaskByUserId(String startDate, String endDate, String userId, Integer pageIndex, Integer pageSize);
 }

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -16,6 +16,7 @@ import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
 import com.management.platform.constant.Constant;
+import com.management.platform.controller.TaskController;
 import com.management.platform.controller.UserController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
@@ -1375,7 +1376,7 @@ public class DingDingServiceImpl implements DingDingService {
                                     ExcelExportServiceImpl.corpddJobCenter.put(jobId, status);
                                     ReportServiceImpl.corpddJobCenter.put(jobId, status);
                                     UserController.corpddJobCenter.put(jobId, status);
-                                    TaskServiceImpl.corpddJobCenter.put(jobId, status);
+                                    TaskController.corpddJobCenter.put(jobId, status);
                                 }
                             }
                         }

+ 74 - 212
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -46,10 +46,6 @@ import java.util.stream.Collectors;
 @Transactional
 public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements TaskService {
 
-    //用于控制线程锁
-    public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
-    public static HashMap<String, Integer> corpddJobCenter = new HashMap();
-
     @Value(value = "${upload.path}")
     private String path;
     @Resource
@@ -80,14 +76,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     private WxCorpInfoService wxCorpInfoService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
-//    @Resource
-//    private DingDingService dingDingService;
     @Resource
     private SysFunctionService sysFunctionService;
     @Resource
     private DepartmentService departmentService;
     @Resource
     private DepartmentOtherManagerMapper departmentOtherManagerMapper;
+    @Resource
+    private ExcelExportService excelExportService;
 
     @Override
     public HttpRespMsg getExecutorPanel(Integer projectId) {
@@ -224,211 +220,6 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     }
 
 
-    @Override
-    public HttpRespMsg exportTask(Integer projectId, Integer taskType) {
-        HttpRespMsg httpRespMsg = new HttpRespMsg();
-        List<TimeTask> list= taskMapper.getTaskWithWorktime(projectId, taskType);
-        Project project = projectMapper.selectById(projectId);
-        User user = userMapper.selectById(request.getHeader("token"));
-        Integer companyId = user.getCompanyId();
-        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
-        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-        try {
-            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-            //准备导出
-            HSSFWorkbook workbook = new HSSFWorkbook();
-            //HSSFSheet sheet = workbook.createSheet("任务数据");
-            HSSFSheet sheet = workbook.createSheet(MessageUtils.message("excel.taskData"));
-            //创建表头
-            HSSFRow headRow = sheet.createRow(0);
-            //设置列宽 setColumnWidth的第二个参数要乘以256 这个参数的单位是1/256个字符宽度
-            sheet.setColumnWidth(0, 50 * 256);
-            sheet.setColumnWidth(1, 20 * 256);
-            sheet.setColumnWidth(2, 20 * 256);
-            sheet.setColumnWidth(3, 20 * 256);
-            sheet.setColumnWidth(4, 20 * 256);
-            sheet.setColumnWidth(5, 20 * 256);
-            sheet.setColumnWidth(6, 20 * 256);
-            sheet.setColumnWidth(7, 20 * 256);
-            sheet.setColumnWidth(8, 20 * 256);
-            sheet.setColumnWidth(9, 20 * 256);
-            //设置为居中加粗
-            HSSFCellStyle headStyle = workbook.createCellStyle();
-            HSSFFont font = workbook.createFont();
-            font.setBold(true);
-            headStyle.setFont(font);
-            HSSFFont redFont = workbook.createFont();
-            redFont.setColor(HSSFFont.COLOR_RED);
-            HSSFCellStyle redStyle = workbook.createCellStyle();
-            redStyle.setFont(redFont);
-            //表头
-            HSSFCell headCell;
-            headCell = headRow.createCell(0);
-            //headCell.setCellValue("任务内容");
-            headCell.setCellValue(MessageUtils.message("excel.taskContent"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(1);
-            //headCell.setCellValue("项目");
-            headCell.setCellValue(MessageUtils.message("entry.project"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(2);
-            //headCell.setCellValue("执行人");
-            headCell.setCellValue(MessageUtils.message("excel.executor"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(3);
-            //headCell.setCellValue("创建时间");
-            headCell.setCellValue(MessageUtils.message("excel.creatTime"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(4);
-            //headCell.setCellValue("截止时间");
-            headCell.setCellValue(MessageUtils.message("excel.deadline"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(5);
-            //headCell.setCellValue("完成时间");
-            headCell.setCellValue(MessageUtils.message("excel.comTime"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(6);
-            //headCell.setCellValue("是否完成");
-            headCell.setCellValue(MessageUtils.message("excel.whetherCom"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(7);
-            //headCell.setCellValue("是否逾期");
-            headCell.setCellValue(MessageUtils.message("excel.overdueNot"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(8);
-            //headCell.setCellValue("计划工时(h)");
-            headCell.setCellValue(MessageUtils.message("excel.plannedWork"));
-            headCell.setCellStyle(headStyle);
-            headCell = headRow.createCell(9);
-            //headCell.setCellValue("实际工时(h)");
-            headCell.setCellValue(MessageUtils.message("excel.actualWork"));
-            headCell.setCellStyle(headStyle);
-            int rowNum = 1;
-            for (TimeTask task : list) {
-                HSSFRow row = sheet.createRow(rowNum);
-                row.createCell(0).setCellValue(task.getName());
-                row.createCell(1).setCellValue(project.getProjectName());
-                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                    Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(task.getExecutorId())).findFirst();
-                    if(first.isPresent()){
-                        row.createCell(2).setCellValue("$userName="+(first.get().getCorpwxUserid()==null?"":first.get().getCorpwxUserid())+"$");
-                    }else {
-                        row.createCell(2).setCellValue("");
-                    }
-                }else {
-                    row.createCell(2).setCellValue(task.getExecutorName());
-                }
-                row.createCell(3).setCellValue(dateTimeFormatter.format(task.getCreateDate()));
-                row.createCell(4).setCellValue(task.getEndDate() != null?dateTimeFormatter.format(task.getEndDate()):"");
-                row.createCell(5).setCellValue(task.getFinishDate() !=null?dateTimeFormatter.format(task.getFinishDate()):"");
-                row.createCell(6).setCellValue(task.getTaskStatus() == 1?"Y":"N");
-                boolean isExpired = false;
-                if (task.getTaskStatus() == 0 && task.getEndDate() !=null&& !task.getEndDate().isAfter(LocalDate.now())) {
-                    isExpired = true;
-                }
-                row.createCell(7).setCellValue(isExpired?"Y":"N");
-                row.createCell(8).setCellValue(task.getPlanHours()==null?"": task.getPlanHours().toString());
-                row.createCell(9).setCellValue(task.getWorkHours());
-                rowNum++;
-            }
-            //生成Excel文件
-            //String fileUrlSuffix = "【"+project.getProjectName()+"】任务数据" + System.currentTimeMillis() + ".xls";
-            String fileUrlSuffix = "【"+project.getProjectName()+"】"+MessageUtils.message("excel.taskData") + System.currentTimeMillis() + ".xls";
-            FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix);
-            workbook.write(fos);
-            fos.flush();
-            fos.close();
-            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
-                String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);
-            /*if(jobId!=null&&!jobId.equals("")){
-                File file=new File(path + fileUrlSuffix);
-                if(file.exists()){
-                    file.delete();
-                }
-            }*/
-                int i = 0;
-                String syncTranslationResult = null;
-                /**
-                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
-                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
-                 */
-                while (i < 10) {
-                    Thread.sleep(300);
-                    CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                    if (corpwxJobResult != null) {
-                        if (corpwxJobResult.getErrCode() == 0) {
-                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                            corpwxJobCenter.remove(jobId);
-                        } else {
-                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                            return httpRespMsg;
-                        }
-                        break;
-                    }
-                    i++;
-                }
-                if (syncTranslationResult != null) {
-                    httpRespMsg.data = syncTranslationResult;
-                } else {
-                    //httpRespMsg.setError("处理超时...");
-                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
-                }
-            }else if(dingding!=null&&dingding.getSyncContact()==1){
-//                String mediaId = dingDingService.getTranslationMediaId(fileUrlSuffix,dingding);
-//                String jobId = dingDingService.syncTranslation(mediaId,fileUrlSuffix,user.getDingdingUnionid(),dingding);
-//            /*if(jobId!=null&&!jobId.equals("")){
-//                File file=new File(path + fileUrlSuffix);
-//                if(file.exists()){
-//                    file.delete();
-//                }
-//            }*/
-//                int i = 0;
-//                String syncTranslationResult = null;
-//                /**
-//                 * 异步上传转译文件的任务完成时会触发回调,在WeiXinCorpController中的commonDevCallbackPost实现了对回调的处理,存储到corpwxJobResult表中
-//                 * 此处轮询查询本地数据库,检测到有任务的回调数据时继续执行查询操作
-//                 */
-//                while (i < 10) {
-//                    Thread.sleep(300);
-//                    Integer status = corpddJobCenter.get(jobId);
-//                    if (status != null) {
-//                        if (status==1) {
-//                            syncTranslationResult = dingDingService.getSyncTranslationResult(jobId,dingding);
-//                            corpddJobCenter.remove(jobId);
-//                        }
-//                        break;
-//                    }
-//                    i++;
-//                }
-//                if (syncTranslationResult != null) {
-//                    httpRespMsg.data = syncTranslationResult;
-//                } else {
-//                    //httpRespMsg.setError("处理超时...");
-//                    httpRespMsg.setError(MessageUtils.message("request.outTime"));
-//                }
-            }else {
-                httpRespMsg.data = "/upload/" + fileUrlSuffix;
-            }
-        } catch (NullPointerException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("验证失败或缺少数据");
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        } catch (IOException e) {
-            e.printStackTrace();
-            //httpRespMsg.setError("文件生成错误");
-            httpRespMsg.setError(MessageUtils.message("file.generateError"));
-            return httpRespMsg;
-        }catch (Exception e){
-            e.printStackTrace();
-            httpRespMsg.setError(MessageUtils.message("access.verErrorOrDataLack"));
-            return httpRespMsg;
-        }
-        return httpRespMsg;
-    }
-
     @Override
     public HttpRespMsg importTask(Integer isMultiProject, Integer projectId, Integer groupId, MultipartFile multipartFile, HttpServletRequest request) throws Exception {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -852,6 +643,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "全部员工任务完成情况表");
         boolean viewDept = sysFunctionService.hasPriviledge(user.getRoleId(), "负责部门员工任务完成情况表");
         List<Map<String, Object>> resultMaps;
+        Integer total;
         if(pageIndex!=null&&pageSize!=null){
             pageStart = (pageIndex - 1) * pageSize;
         }
@@ -866,14 +658,84 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     targetDeptIds.addAll(branchDepartment);
                 }
                 resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, userId, deptId,targetDeptIds, companyId);
+                total = taskMapper.userTaskCompleteDetailCount(startDate, endDate, userId, deptId, targetDeptIds, companyId);
             }else {
                 //只能看自己的
                 resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, user.getId(), deptId,null, companyId);
+                total = taskMapper.userTaskCompleteDetailCount( startDate, endDate, user.getId(), deptId, null, companyId);
             }
         }else {
             resultMaps = taskMapper.userTaskCompleteDetail(pageStart, pageSize, startDate, endDate, userId, deptId,null, companyId);
+            total = taskMapper.userTaskCompleteDetailCount(startDate, endDate, userId, deptId, null, companyId);
+        }
+        Map<String,Object> map=new HashMap<>();
+        map.put("records",resultMaps);
+        map.put("total",total);
+        msg.setData(map);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportUserTaskCompleteDetail(String startDate, String endDate, String userId, Integer deptId) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, companyId));
+        HttpRespMsg respMsg = userTaskCompleteDetail(null, null, startDate, endDate, userId, deptId);
+        Map<String, Object> data = (Map<String, Object>) respMsg.getData();
+        List<Map<String, Object>> mapList = (List<Map<String, Object>>) data.get("records");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        titleList.add("员工");
+        titleList.add("部门");
+        titleList.add("任务总数量");
+        titleList.add("已完成数量");
+        titleList.add("未完成数量");
+        titleList.add("未完成率");
+        titleList.add("按时完成数量");
+        titleList.add("延迟完成数量");
+        titleList.add("按时完成率");
+        dataList.add(titleList);
+        for (Map<String, Object> map : mapList) {
+            List<String> item=new ArrayList<>();
+            if((wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getSyncContact()==1)){
+                item.add("$userName="+String.valueOf(map.get("userName"))+"$");
+                item.add("$departmentName="+String.valueOf(map.get("deptName"))+"$");
+            }else {
+                item.add(String.valueOf(map.get("userName")));
+                item.add(String.valueOf(map.get("deptName")));
+            }
+            item.add(String.valueOf(map.get("allNum")));
+            item.add(String.valueOf(map.get("completedNum")));
+            item.add(String.valueOf(map.get("noCompletedNum")));
+            item.add(String.valueOf(map.get("noCompletedPercent")));
+            item.add(String.valueOf(map.get("onTimeNum")));
+            item.add(String.valueOf(map.get("noOnTimeNum")));
+            item.add(String.valueOf(map.get("onTimePercent")));
+            dataList.add(item);
+        }
+        String fileName="员工任务完成情况表_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName,dataList,path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getTaskByUserId(String startDate, String endDate, String userId, Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer pageStart=null;
+        if(pageIndex!=null&&pageSize!=null){
+            pageStart = (pageIndex - 1) * pageSize;
         }
-        msg.setData(resultMaps);
+        List<Map<String,Object>> mapList=taskMapper.getTaskByUserId(startDate,endDate,userId,pageStart,pageSize);
+        Integer total=taskMapper.getTaskByUserIdCount(startDate,endDate,userId);
+        Map<String,Object> map=new HashMap<>();
+        map.put("records",mapList);
+        map.put("total",total);
+        msg.setData(map);
         return msg;
     }
 

+ 56 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -279,9 +279,9 @@
     </select>
 
     <select id="userTaskCompleteDetail" resultType="java.util.Map">
-        SELECT u.id as userId, u.name AS userName,u.corpwx_deptid AS corpWxUserId,d.corpwx_deptid AS corpWxDeptId,d.department_name AS deptName,COUNT(t.name) AS allNum,COUNT(CASE WHEN t.task_status=0 THEN 1 END) AS noCompletedNum,COUNT(CASE WHEN t.task_status=1 THEN 1 END) AS completedNum,
+        SELECT u.id as userId, u.name AS userName,u.corpwx_userid AS corpWxUserId,d.corpwx_deptid AS corpWxDeptId,d.department_name AS deptName,COUNT(t.name) AS allNum,COUNT(CASE WHEN t.task_status=0 THEN 1 END) AS noCompletedNum,COUNT(CASE WHEN t.task_status=1 THEN 1 END) AS completedNum,
         COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END) AS onTimeNum,COUNT(CASE WHEN t.finish_date>t.end_date AND t.task_status=1 THEN 1 END) AS noOnTimeNum,
-        CONCAT(FORMAT(COUNT(CASE WHEN t.task_status=0 THEN 1 END)/COUNT(t.name), 2), '%') AS noCompletedPercent,CONCAT(FORMAT(COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END)/COUNT(t.name), 2), '%') AS onTimePercent
+        CONCAT(FORMAT(COUNT(CASE WHEN t.task_status=0 THEN 1 END)/COUNT(t.name)*100, 2), '%') AS noCompletedPercent,CONCAT(FORMAT(COUNT(CASE WHEN t.finish_date &lt;= t.end_date AND t.task_status=1  THEN 1 END)/COUNT(t.name)*100, 2), '%') AS onTimePercent
         FROM
         task_executor te
         LEFT JOIN user u ON te.executor_id=u.id
@@ -289,7 +289,7 @@
         LEFT JOIN task t ON te.task_id=t.`id`
         WHERE u.company_id=#{companyId}
         <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
-            AND t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} GROUP BY te.executor_id
+            AND t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate}
         </if>
         <if test="userId!=null and userId!=''">
             and u.id=#{userId}
@@ -303,8 +303,61 @@
                 #{item}
             </foreach>
         </if>
+        group by te.executor_id
         <if test="pageStart != null and pageSize != null">
             limit #{pageStart}, #{pageSize}
         </if>
     </select>
+
+    <select id="userTaskCompleteDetailCount" resultType="java.lang.Integer">
+        select count(1) from (
+        SELECT u.id as userId
+        FROM
+        task_executor te
+        LEFT JOIN user u ON te.executor_id=u.id
+        LEFT JOIN department d ON u.department_id=d.department_id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE u.company_id=#{companyId}
+        <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
+            AND t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate}
+        </if>
+        <if test="userId!=null and userId!=''">
+            and u.id=#{userId}
+        </if>
+        <if test="deptId!=null">
+            and d.department_id=#{deptId}
+        </if>
+        <if test="list!=null and list.size()>0">
+            and  d.department_id in
+            <foreach collection="list" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        group by te.executor_id
+        ) as total
+    </select>
+
+    <select id="getTaskByUserId" resultType="java.util.Map">
+        SELECT t.`name` AS taskName,GROUP_CONCAT(u.name) AS executorNames,GROUP_CONCAT(u.corpwx_userid) AS executorCorpWxUserIds,
+        date_format(t.`start_date`,'%Y-%m-%d') AS startDate,date_format(t.`end_date`,'%Y-%m-%d') AS endDate,date_format(t.`finish_date`,'%Y-%m-%d') AS finishDate,
+        (CASE t.`task_status` WHEN 0 THEN '进行中' WHEN 1 THEN '已完成' ELSE '已撤销' END) AS stateValue
+        FROM
+        task_executor te
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
+        <if test="pageStart != null and pageSize != null">
+            limit #{pageStart}, #{pageSize}
+        </if>
+    </select>
+    <select id="getTaskByUserIdCount" resultType="java.lang.Integer">
+        select count(1) from (
+        SELECT t.`name` AS taskName
+        FROM
+        task_executor te
+        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN task t ON te.task_id=t.`id`
+        WHERE t.start_date &lt; #{endDate} AND t.end_date &gt; #{startDate} AND FIND_IN_SET(#{userId},t.`executor_id`) GROUP BY t.`id`
+        )as total
+    </select>
 </mapper>

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

@@ -269,6 +269,7 @@ const StringUtil = {
         arr[i] == '全部分组耗用进度表' || arr[i] == '负责部门分组耗用进度表' ? obj.reportProjectConsumptionFirst = true : ''
         arr[i] == '全部项目耗用进度表' || arr[i] == '负责部门项目耗用进度表' ? obj.reportProjectConsumptionTwo = true : ''
         arr[i] == '全部员工任务进度表' || arr[i] == '负责部门员工任务进度表' ? obj.reportStaffTaskAccomplished = true : ''
+        arr[i] == '全部员工任务完成情况表' || arr[i] == '负责部门员工任务完成情况表' ? obj.takCompletedStatus = true : ''
 
         arr[i] == '新增立项申请'  ? obj.projectApprovalNew = true : ''
         arr[i] == '导入立项申请'  ? obj.projectApprovalImport = true : ''

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

@@ -48,6 +48,7 @@
                   <el-menu-item index="1-26" v-if="permissions.reportProjectConsumptionTwo" @click="ssl(25)"><p>项目耗用进度表</p></el-menu-item>
                   <el-menu-item index="1-27" v-if="permissions.reportStaffTaskAccomplished" @click="ssl(26)"><p>员工任务进度表</p></el-menu-item>
                   <el-menu-item index="1-28" v-if="permissions.reportProjectEstimated" @click="ssl(27)"><p>项目预估工时表</p></el-menu-item>
+                  <el-menu-item index="1-29" v-if="permissions.takCompletedStatus" @click="ssl(28)"><p>员工任务完成情况表</p></el-menu-item>
                 </el-submenu>
               </el-menu>
           </el-col>
@@ -1253,6 +1254,41 @@
               <el-table-column align="center" prop="estimatedWorkTime" label="预估工时" min-width="150"></el-table-column>
               <el-table-column align="center" prop="workTime" label="实际工时" min-width="150"></el-table-column>
             </el-table>
+
+            <!-- 员工任务完成情况表 -->
+            <el-table  v-if="ins == 28" key="28" border :data="taskCompletedData" highlight-current-row v-loading="listLoading"  :height="+tableHeight - 1" style="width: 100%;" :span-method="objectSpanMethod">
+              <el-table-column align="center" prop="userName" label="员工" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='userName' :openid='scope.row.userName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      <el-link type="primary" :underline="false" @click="showUserTask(scope.row.userId)">{{scope.row.userName}}</el-link>
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="deptName" label="部门" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='deptName' :openid='scope.row.deptName'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.deptName}}
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="allNum" label="任务总数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="completedNum" label="已完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noCompletedNum" label="未完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noCompletedPercent" label="未完成率" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="onTimeNum" label="按时完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="noOnTimeNum" label="延迟完成数量" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="onTimePercent" label="按时完成率" min-width="150"></el-table-column>
+            </el-table>
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6 && ins != 20 && ins != 21">
           <el-pagination
@@ -1495,6 +1531,45 @@
             <el-button type="primary" @click="setForewarning()" :loading="warningTableLoading">确 定</el-button>
           </span>
         </el-dialog>
+        <!-- 员工任务数据弹窗 -->
+        <el-dialog
+          title="员工任务数据"
+          :visible.sync="showUserTaskDialog"
+          width="80%"
+          :before-close="handleClose">
+          <el-table  border :data="userTaskData" highlight-current-row v-loading="userTasklistLoading" style="width: 100%;" >
+              <el-table-column align="center" prop="executorNames" label="执行人" min-width="150">
+                <template slot-scope="scope">
+                  <div>
+                    <span v-if="user.userNameNeedTranslate == '1'">
+                      <ww-open-data type='userName' :openid='scope.row.executorNames'></ww-open-data>
+                    </span>
+                    <span v-if="user.userNameNeedTranslate != '1'">
+                      {{scope.row.executorNames}}
+                    </span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" prop="taskName" label="任务名称" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="stateValue" label="当前状态" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="startDate" label="开始日期" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="endDate" label="截止日期" min-width="150"></el-table-column>
+              <el-table-column align="center" prop="finishDate" label="完成日期" min-width="150"></el-table-column>
+            </el-table>
+          <span slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="showUserTaskDialog = false">关闭</el-button>
+          </span>
+          <el-pagination
+                @size-change="usertaskSizeChange"
+                @current-change="usertaskCurrentChange"
+                :current-page="userTaskPage"
+                :page-sizes="[20 , 50 , 80 , 100]"
+                :page-size="userTaskSize"
+                layout="total, sizes, prev, pager, next"
+                :total="userTaskTotal"
+                style="float:right;"
+            ></el-pagination>
+        </el-dialog>
   </section>
 </template>
 
@@ -1515,12 +1590,12 @@ export default {
   data() {
     return {
       screeningCondition: { // 筛选条件的判断
-        project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22], // 项目筛选条件 (不等于)
+        project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22,28], // 项目筛选条件 (不等于)
         months: [14, 15], // 月份筛选条件 (等于)
         monthRange: [19], // 月份区间筛选条件 (等于)
-        staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26], // 人员筛选条件 (等于)
-        departments: [14, 15, 23,21,26], // 部门筛选条件 (等于)
-        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26], // 时间段筛选条件 (等于)
+        staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26,28], // 人员筛选条件 (等于)
+        departments: [14, 15, 23,21,26,28], // 部门筛选条件 (等于)
+        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26,28], // 时间段筛选条件 (等于)
       },
       efficentList:[],
       groupNames: [],
@@ -1579,14 +1654,14 @@ export default {
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('statisticsofstafffillingintimerate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表', '有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表','员工任务完成情况表'],
 
       shuzArr: [this.$t('projectreport'),this.$t('projectTaskReport'),this.$t('projectcoststatement'),
       this.$t('projectbalancesheet'),this.$t('customerprojectincomestatement'),this.$t('projectphasetimesheet'),
       this.$t('statisticsofovertimework'),this.$t('timecostearlywarningtable'),this.$t('personneltimeallocationtable'),
       this.$t('employeereporttimelinessrate'),this.$t('dailyreporttobereviewedstatistics'),this.$t('statisticsofpersonnelhours'),this.$t('taskgrouptimesheet'),this.$t('projectcostbaselinetable'),
       this.$t('ren-yuan-yue-du-gong-shi-biao'), this.$t('bumenchanyuqingkuang'), this.$t('ge-fen-zu-yu-jie-duan-gong-shi-biao'), '子项目工时成本表', '任务重启表', 'FTE报表','有效工时率表', '项目分类工时占比表', '分类工时明细表',
-      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表'],
+      '员工项目进度表', '分组耗用进度表', '项目耗用进度表', '员工任务进度表', '项目预估工时表','员工任务完成情况表'],
 
       ins: 10000,
       user: JSON.parse(sessionStorage.user),
@@ -1630,6 +1705,11 @@ export default {
       groupSize: 20,
       groupTotal: 0,
 
+      //员工任务分页参数
+      userTaskPage:1,
+      userTaskSize:20,
+      userTaskTotal:0,
+
       stateKey: 1,
 
       outputValueList: [],
@@ -1720,6 +1800,11 @@ export default {
       projectEstimatedWorkData: [], // 项目预估工时表
       subUserCustom:[],
       subUserCustomName:null,
+      taskCompletedData:[],
+      showUserTaskDialog:false,
+      userTaskData:[], //员工任务数据列表
+      userTasklistLoading:false,
+      userTaskUserId:null
     };
   },
   computed: {},
@@ -1828,6 +1913,7 @@ export default {
       if(this.permissions.reportProjectConsumptionTwo) {this.ssl(25);this.defaultActive = '1-26';return} else
       if(this.permissions.reportStaffTaskAccomplished) {this.ssl(26);this.defaultActive = '1-27';return} else
       if(this.permissions.reportProjectEstimated) {this.ssl(27);this.reportProjectEstimated = '1-28';return} else
+      if(this.permissions.takCompletedStatus) {this.ssl(28);this.takCompletedStatus = '1-29';return} else
       {this.allWrong = false}
     },
     rowspan(spanArr,position,spanName,dataItem = [],fields=false){
@@ -2077,6 +2163,18 @@ export default {
                   this.getList(true);
                 }
             },
+            //员工任务弹窗列表分页
+            usertaskSizeChange(val){
+              this.userTaskSize = val;
+              this.userTaskPage = 1
+              this.userTaskData=[]
+              this.getTaskByUserId()
+            },
+            usertaskCurrentChange(val){
+              this.userTaskPage = val;
+              this.userTaskData=[]
+              this.getTaskByUserId()
+            },
             groupSizeChange(val){
               this.groupSize = val
               this.groupPage = 1
@@ -2174,6 +2272,9 @@ export default {
                 if(this.ins == 27) {
                   this.getProjectEstimatedWork()
                 }
+                if(this.ins == 28) {
+                  this.gettaskCompletedData()
+                }
             },
       exportExcel() {
         var url = "/project";
@@ -2372,6 +2473,14 @@ export default {
           fName = '项目预估工时表' + '.xlsx'
           url = "/project/exportProjectEstimatedWorkTime"
           this.proJuctId ? sl.projectId = this.proJuctId : ''
+        }else if(this.ins == 28) {
+          fName = '员工任务完成情况表' + '.xlsx'
+          url = "/task/exportUserTaskCompleteDetail"
+          let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+          this.userId ? sl.userId = this.userId : ''
+          dept ? sl.deptId = dept : ''
+          sl.startDate = this.rangeDatas[0]
+          sl.endDate = this.rangeDatas[1]
         }
           this.http.post(url, sl,
             res => {
@@ -3519,6 +3628,9 @@ export default {
       if(this.ins == 26) {
         this.getTaskCompletionSheet()
       }
+      if(this.ins == 28) {
+        this.gettaskCompletedData()
+      }
     },
     // 任务重启表
     taskRestart() {
@@ -3886,6 +3998,78 @@ export default {
       this.total = data.total
       this.listLoading = false
     },
+    //展示员工任务数据
+    showUserTask(userId){
+        this.showUserTaskDialog=true
+        this.getTaskByUserId(userId)
+    },
+    //获取指定人员的任务数据
+    getTaskByUserId(value){
+      if(value){
+        this.userTaskUserId=value
+      }else{
+        value=this.userTaskUserId
+      }
+      this.userTasklistLoading = true; 
+      let parameter = {
+        pageIndex: this.userTaskPage,
+        pageSize: this.userTaskSize,
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+        userId:value
+      }
+      this.http.post('/task/getTaskByUserId',parameter,
+        res => {
+            if (res.code == "ok") {
+                this.userTaskTotal = res.data.total;
+                this.userTaskData = res.data.records
+                this.userTasklistLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    // 获取员工任务完成情况表
+    gettaskCompletedData() {
+      let parameter = {
+        pageIndex: this.page,
+        pageSize: this.size,
+        startDate: this.rangeDatas[0],
+        endDate: this.rangeDatas[1],
+      }
+      let dept = this.departmentIdArray[this.departmentIdArray.length - 1]
+      this.userId ? parameter.userId = this.userId : ''
+      dept ? parameter.deptId = dept : ''
+      this.listLoading = true
+      this.http.post('/task/userTaskCompleteDetail',parameter,
+        res => {
+            if (res.code == "ok") {
+                this.total = res.data.total;
+                this.taskCompletedData = res.data.records
+                this.listLoading = false; 
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     // 分组耗用进度表
     async getConsumptionSchedule() {
       let parameter = {