فهرست منبع

分组相关问题

seyason 1 سال پیش
والد
کامیت
e4c19c3c08

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

@@ -1614,8 +1614,6 @@ public class ReportController {
     }
 
     /**
-     * 按某人某日期审批通过报告
-     * id 要通过的报告的用户id
      * reportIds 报告id
      */
     @RequestMapping("/approve")
@@ -1626,7 +1624,6 @@ public class ReportController {
 
     /**
      * 按某人某日期审批未通过报告 撤销通过报告
-     * id 要未通过的报告的用户id
      * date 日期 格式yyyy-mm-dd
      */
     @RequestMapping("/deny")
@@ -1776,6 +1773,12 @@ public class ReportController {
         return reportService.importData(companyId,withCheckIn, file, request);
     }
 
+    @RequestMapping("/importNewData")
+    public HttpRespMsg importNewData(Integer companyId, Integer withCheckIn,
+                                  MultipartFile file, HttpServletRequest request) {
+        return reportService.importNewData(companyId,withCheckIn, file, request);
+    }
+
     @RequestMapping("/listImportByState")
     public HttpRespMsg listDeptImportByState(
                                       Integer projectId,

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

@@ -228,7 +228,12 @@ public class TaskGroupController {
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        Department department = departmentMapper.selectById(user.getDepartmentId());
+        Department department = null;
+        Integer dpId = user.getDepartmentId();
+        if (dpId != null && dpId > 0) {
+            department = departmentMapper.selectById(dpId);
+        }
+
         Integer projectId = item.getProjectId();
         Project project = projectMapper.selectById(projectId);
         QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
@@ -239,7 +244,7 @@ public class TaskGroupController {
             if (token.equals(taskGroup.getInchargerId())) {
                 taskGroup.setInchargerId(project.getInchargerId());
                 //如果项目经理也是自己,就换成自己所在部门负责人
-                if (token.equals(project.getInchargerId())) {
+                if (token.equals(project.getInchargerId()) && department != null) {
                     taskGroup.setInchargerId(department.getManagerId());
                 }
             }

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

@@ -68,6 +68,9 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
 
+    //新版导入日报,采用项目在行上的模式
+    HttpRespMsg importNewData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
+
     HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList, JSONArray userReportArray);
 
     HttpRespMsg listDeptImportByState(String leaderId,

+ 338 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4378,6 +4378,337 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg importNewData(Integer companyId, Integer withCheckIn, MultipartFile multipartFile, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        //对于存在预算成本的公司,暂不支持导入工时
+        Company company = companyMapper.selectById(companyId);
+        if (company.getPackageProject() == 1) {
+            Integer alarmSettingCnt = projectBasecostSettingMapper.selectCount(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+            if (alarmSettingCnt > 0) {
+                //msg.setError("已设置工时预警类型的成本预算,暂不支持导入工时");
+                msg.setError(MessageUtils.message("report.warningType"));
+                return msg;
+            }
+        }
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/M/d");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
+            //获取公司全部成员
+            List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                //msg.setError("请填写工时数据");
+                msg.setError(MessageUtils.message("report.data"));
+                return msg;
+            }
+            List<String> projectList = new ArrayList<>();
+            List<String> subProjectList = new ArrayList<>();
+            List<Project> allProjectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+            List<SubProject> allSubProjectList = subProjectMapper.selectList(new QueryWrapper<SubProject>().eq("company_id", companyId));
+            List<Report> reportList = new ArrayList<>();
+
+
+            List<String> userNameList=new ArrayList<>();
+            boolean hasDept = false;
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
+
+                if (rowIndex == 0) {
+                    String deptName = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(3).getStringCellValue().trim();
+                    if ("部门".equals(deptName)) {
+                        hasDept = true;
+                    }
+                    if(username.equals("员工")){
+                        continue;
+                    }
+                }
+                if(!userNameList.contains(username)&&!username.equals("")){
+                    userNameList.add(username);
+                }
+            }
+            int deptColumnExtra = (hasDept?1:0);
+            //下标从0开始
+            int projectNameStartIndex = (withCheckIn==null?2:(6 + deptColumnExtra));
+            HttpRespMsg respMsg=new HttpRespMsg();
+            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)+"]的人员存在重复,请使用工号!");
+                    return msg;
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
+            int dataCount = 0;
+
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                if (rowIndex == 0) {
+                    //第一行是标题,获取项目名称
+                    int pIndex = projectNameStartIndex;
+                    boolean projectNotExists = false;
+                    String neProjectName = null;
+                    boolean subPNotExists = false;
+                    String neSubPName = null;
+                    while(pIndex < row.getLastCellNum() && row.getCell(pIndex).getCellTypeEnum() != CellType._NONE &&  row.getCell(pIndex).getCellTypeEnum() != CellType.BLANK) {
+                        row.getCell(pIndex).setCellType(CellType.STRING);
+                        String stringCellValue = row.getCell(pIndex).getStringCellValue().trim();
+                        final String projectName = stringCellValue.contains("/")?stringCellValue.split("/")[0].trim():stringCellValue;
+                        projectList.add(projectName);
+                        String subProject = stringCellValue.contains("/")?stringCellValue.split("/")[1].trim():"";
+
+                        subProjectList.add(subProject);
+                        if (!allProjectList.stream().filter(p->p.getProjectName().equals(projectName)||(p.getProjectCode()!=null&&p.getProjectCode().equals(projectName))).findAny().isPresent()) {
+                            projectNotExists = true;
+                            neProjectName = projectName;
+                            break;
+                        }
+                        //检查子项目是否存在
+                        if (!StringUtils.isEmpty(subProject) && !allSubProjectList.stream().anyMatch(subp->subp.getName().equals(subProject)||(subp.getCode()!=null&&subp.getCode().equals(subProject)))) {
+                            subPNotExists = true;
+                            neSubPName = subProject;
+                            break;
+                        }
+                        pIndex++;
+                    }
+                    if (projectNotExists) {
+                        //返回错误提示
+                        //msg.setError("项目["+neProjectName+"]不存在,请先在项目管理中添加或导入。");
+                        msg.setError(MessageUtils.message("project.noExist",neProjectName));
+                        return msg;
+                    }
+                    if (subPNotExists) {
+                        //返回错误提示
+                        //msg.setError("子项目["+neSubPName+"]不存在,请先在项目管理中添加或导入。");
+                        msg.setError(MessageUtils.message("project.sonNoExist",neSubPName));
+                        return msg;
+                    }
+                } else {
+                    dataCount++;
+                    //数据行
+                    for (int i=1;i<projectNameStartIndex+projectList.size(); i++) {
+                        if (row.getCell(i) != null) {
+                            row.getCell(i).setCellType(CellType.STRING);
+                        }
+                    }
+
+                    if (row.getCell(0) == null) {
+                        //msg.setError("第"+dataCount+"行缺少日期");
+                        msg.setError(MessageUtils.message("data.NullErrorByRow",dataCount));
+                        return msg;
+                    }
+                    boolean isDateFormat = row.getCell(0).getCellTypeEnum() == CellType.NUMERIC;
+                    String reportDate = isDateFormat?sdf.format(row.getCell(0).getDateCellValue()):row.getCell(0).getStringCellValue();
+                    if (StringUtils.isEmpty(reportDate)) {
+                        //msg.setError("第"+dataCount+"行缺少日期");
+                        msg.setError(MessageUtils.message("data.NullErrorByRow",dataCount));
+                        return msg;
+                    }
+                    String username = withCheckIn==null?row.getCell(1).getStringCellValue().trim():row.getCell(2).getStringCellValue().trim();
+                    //检查人员是否存在
+                    Optional<User> any;
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(username)).findFirst();
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findAny();
+                    }else {
+                        any = allUserList.stream().filter(u -> u.getName().equals(username)||(u.getJobNumber()!=null&&u.getJobNumber().equals(username))).findAny();
+                    }
+                    if (!any.isPresent()) {
+                        //msg.setError("人员["+username+"]不存在,请先在组织结构中添加或者通过钉钉同步导入");
+                        msg.setError(MessageUtils.message("staff.peopleNullAndAdd",username));
+                        return msg;
+                    }
+                    User reportCreator = any.get();
+                    for (int i=projectNameStartIndex; i < projectNameStartIndex + projectList.size(); i++) {
+                        if (row.getCell(i) == null) {
+                            continue;
+                        }
+                        String stringCellValue = row.getCell(i).getStringCellValue();
+                        double time = 0;
+                        if (!StringUtils.isEmpty(stringCellValue)) {
+                            time = Double.parseDouble(stringCellValue);
+                            if (time > 0) {
+                                String pName = projectList.get(i-projectNameStartIndex);
+                                Project project = allProjectList.stream().filter(p -> p.getProjectName().equals(pName)||(p.getProjectCode()!=null&&p.getProjectCode().equals(pName))).findFirst().get();
+                                String subPName = subProjectList.get(i-projectNameStartIndex);
+                                Report report = new Report();
+                                report.setCompanyId(companyId);
+                                report.setCreatorId(reportCreator.getId());
+                                report.setDeptId(reportCreator.getDepartmentId());
+                                report.setProjectId(project.getId());
+                                //子项目
+                                if (!StringUtils.isEmpty(subPName)) {
+                                    Optional<SubProject> first = allSubProjectList.stream()
+                                            .filter(sub -> sub.getProjectId().equals(project.getId()) &&( sub.getName().equals(subPName)||(sub.getCode()!=null&&sub.getCode().equals(subPName)))).findFirst();
+                                    if (first.isPresent()) {
+                                        report.setSubProjectId(first.get().getId());
+                                    }
+                                }
+                                report.setReportTimeType(1);
+                                report.setWorkingTime(time);
+                                report.setMultiWorktime(timeType.getMultiWorktime());
+                                report.setFillUserid(user.getId());
+                                if (timeType.getNeedDeptAudit() == 0) {
+                                    report.setState(1);//导入的直接算审核通过
+                                } else {
+                                    report.setState(-1);//待部门上级审核员审核
+                                    report.setDepartmentAuditState(1);//部门已审核,到上层领导审核
+                                }
+                                report.setCreateDate(LocalDate.parse(reportDate, dtf));
+                                report.setCost(reportCreator.getCost()==null?new BigDecimal(0) : reportCreator.getCost().multiply(new BigDecimal(time)));
+                                reportList.add(report);
+                            } else if (time < 0) {
+                                //msg.setError(username + "的工时存在负数,请检查修改");
+                                msg.setError(MessageUtils.message("report.negativeError",username));
+                                return msg;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (reportList.size() > 0) {
+                //依赖于对是否需要部门审核的判断,如果不需要则认为导入的就是审核通过的,重新导入就直接覆盖之前的。
+                reportMapper.deleteUserSameDayReport(companyId, reportList, timeType.getNeedDeptAudit());
+                if (timeType.getNeedDeptAudit() == 1) {
+                    //如果需要导入审核,则对审核通过的进行排除
+                    List<Map> passReports = reportMapper.getSameDayPassReport(companyId, reportList);
+                    StringBuilder sb = new StringBuilder();
+                    if (passReports.size() > 0) {
+                        //统计成功条数,需要去掉没有覆盖的
+                        dataCount -= passReports.size();
+                        passReports.forEach(map->{
+                            String creatorId = (String)map.get("creator_id");
+                            String createDate = sdf.format(map.get("create_date"));//yyyy/M/d格式
+                            String userName = allUserList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get().getName();
+                            sb.append(createDate).append("-").append(userName).append(",");
+                            for (int i=0;i<reportList.size(); i++) {
+                                Report one = reportList.get(i);
+                                if (LocalDate.parse(createDate, dtf).isEqual(one.getCreateDate())
+                                        &&creatorId.equals(one.getCreatorId())) {
+                                    reportList.remove(i);
+                                    i--;
+                                }
+                            }
+                        });
+                        String str = sb.toString();
+                        str = str.substring(0, str.length()-1);
+                        //msg.msg = "跳过以下已审核数据:"+str+"。";
+                        msg.msg = MessageUtils.message("finance.skipData",str);
+                    }
+                }
+
+                //存储
+                if (reportList.size() == 0) {
+                    //全部是重复的,本次没有需要导入的
+                    //msg.setError("本次数据全部已审核通过,无法导入。");
+                    msg.setError(MessageUtils.message("finance.importErrorByAllAdopt"));
+                    return msg;
+                } else {
+                    reportService.saveBatch(reportList);
+                    msg.data = dataCount;
+                    String originName = fileName;
+                    //定义一个独立的文件夹
+                    String importFolder = "report_import";
+                    File dir = new File(path, importFolder);
+                    if (!dir.exists()) {
+                        dir.mkdir();
+                    }
+
+                    System.out.println("fileName=="+originName);
+                    String[] names = originName.split("\\.");
+                    String destFileName = names[0] + "_"+System.currentTimeMillis()+"."+names[1];
+                    File destFile = new File(dir, destFileName);
+                    FileUtils.copyFile(file, destFile);
+                    ReportImportLog log = new ReportImportLog();
+                    log.setCompanyId(user.getCompanyId());
+                    log.setFileName(originName);
+                    log.setServerName(importFolder+"/"+destFileName);
+                    log.setUserId(user.getId());
+                    log.setUserName(user.getName());
+                    reportImportLogMapper.insert(log);
+                }
+            } else {
+                //msg.setError("工时数据不能为空");
+                msg.setError(MessageUtils.message("report.dataNullError"));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //msg.setError("数据格式有误或存在空数据 导入失败");
+            msg.setError(MessageUtils.message("file.dataFormatError"));
+            return msg;
+        }catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+            return msg;
+        }catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //msg.setError("发生其他错误:"+e.getMessage());
+            msg.setError(MessageUtils.message("other.errorByParameter",e.getMessage()));
+            return msg;
+        } finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            file.delete();
+        }
+        return msg;
+    }
+
 
     private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
         list.forEach(l->{
@@ -6645,7 +6976,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 gp.setInchargerId(projectMapper.selectById(r.getProjectId()).getInchargerId());
                                 //如果自己就是项目经理,审核人变成自己的部门负责人
                                 if (gp.getInchargerId().equals(userId)) {
-                                    gp.setInchargerId(departmentMapper.selectById(user.getDepartmentId()).getManagerId());
+                                    Integer dpId = user.getDepartmentId();
+                                    if (dpId != null && dpId > 0) {
+                                        Department department = departmentMapper.selectById(dpId);
+                                        if (department != null) {
+                                            gp.setInchargerId(department.getManagerId());
+                                        }
+                                    }
                                 }
                                 //不存在的话,加上项目经理
                                 if (!userList.stream().anyMatch(u->u.getId().equals(gp.getInchargerId()))) {