puzhibing
6 天以前 082bddee7df8a05ca95f473ec2643701d41a5213
更新代码
1个文件已添加
18个文件已修改
7974 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBreedingAndPreservationController.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TPedigreeChartController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TStrainReportController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TStrainValidationDataController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTrainLibraryController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-prod.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-test.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPedigreeChartServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TPedigreeChartMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/api/login.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/login.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/vue.config.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/新的/strain_library.sql 7518 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBreedingAndPreservationController.java
@@ -164,28 +164,7 @@
        }
        culturePreservationService.saveBatch(culturePreservations);
        if (dto.getStatus()!=null&&dto.getStatus()==2){
            // 新增消息
            TNotice tNotice = new TNotice();
            List<String> allProjectIds = projectTeamStaffService.lambdaQuery()
                    .eq(TProjectTeamStaff::getTeamId,dto.getProjectId())
                    .eq(TProjectTeamStaff::getRoleType, 2)
                    .list().stream().map(TProjectTeamStaff::getTeamId).collect(Collectors.toList());
            if (!allProjectIds.isEmpty()){
                TProjectTeam projectTeam = projectTeamService.lambdaQuery().in(TProjectTeam::getId, allProjectIds)
                        .eq(TProjectTeam::getStatus, 1)
                        .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
                TProjectTeamStaff projectTeamStaff = projectTeamStaffService.lambdaQuery()
                        .eq(TProjectTeamStaff::getTeamId, projectTeam.getId()).eq(TProjectTeamStaff::getRoleType, 2).one();
                tNotice.setUserId(projectTeamStaff.getUserId());
                tNotice.setCommitId(tokenService.getLoginUser().getUserId()+"");
                tNotice.setStatus(1);
                tNotice.setNoticeContent("您有【1】条【菌种选育保藏记录】等待签字入库确认;");
                tNotice.setDataId(dto.getId());
                tNotice.setNoticeType(5);
                noticeService.save(tNotice);
            }
            notifyProjectEngineers(dto.getProjectId(), dto.getId(), 5);
        }
        return R.ok();
    }
@@ -209,8 +188,33 @@
            dto.setIsDraft(0);
        }
        TBreedingAndPreservation breedingAndPreservationServiceById = breedingAndPreservationService.getById(dto.getId());
        if (breedingAndPreservationServiceById == null) {
            return R.fail("记录不存在");
        }
        if (breedingAndPreservationServiceById.getStatus()==1){
            return R.fail("该记录已提交,不可编辑!");
        }
        SysUser currentUser = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        if ("3".equals(currentUser.getRoleType())) {
            return R.fail("菌种工程师只能进行入库确认,不能编辑记录");
        }
        List<TVaccinationSlope> vaccinationSlopes = dto.getVaccinationSlopes();
        List<TCulturePreservation> culturePreservations = dto.getCulturePreservations();
        if (vaccinationSlopes == null || culturePreservations == null) {
            return R.fail("接种斜面记录和菌种保藏记录不能为空");
        }
        if (dto.getStatus() != null && dto.getStatus() == 1) {
            if (breedingAndPreservationServiceById.getStatus() == null
                    || breedingAndPreservationServiceById.getStatus() != 2) {
                return R.fail("请先同步给保藏人并完成入库确认");
            }
            boolean slopeUnconfirmed = vaccinationSlopes.stream().anyMatch(item ->
                    !StringUtils.hasLength(item.getPreserveId()) || !StringUtils.hasLength(item.getPreserveSignature()));
            boolean preservationUnconfirmed = culturePreservations.stream().anyMatch(item ->
                    !StringUtils.hasLength(item.getPreserveId()) || !StringUtils.hasLength(item.getPreserveSignature()));
            if (slopeUnconfirmed || preservationUnconfirmed) {
                return R.fail("存在未确认的接种斜面或菌种保藏记录,不能提交");
            }
        }
        breedingAndPreservationService.updateById(dto);
        List<TSeparationOfCultureDishes> separationOfCultureDishesList = dto.getSeparationOfCultureDishesList();
@@ -225,60 +229,62 @@
        }
        observationOfPetriDishesService.remove(new LambdaQueryWrapper<TObservationOfPetriDishes>().eq(TObservationOfPetriDishes::getBreedingPreserveId, dto.getId()));
        observationOfPetriDishesService.saveBatch(observationOfPetriDishes);
        List<TVaccinationSlope> vaccinationSlopes = dto.getVaccinationSlopes();
        for (TVaccinationSlope vaccinationSlope : vaccinationSlopes) {
            if (dto.getStatus()==1&&!StringUtils.hasLength(vaccinationSlope.getPreserveId())){
                return R.fail("接种斜面记录未确认,不能提交");
            }
            vaccinationSlope.setBreedingPreserveId(dto.getId());
        }
        vaccinationSlopeService.remove(new LambdaQueryWrapper<TVaccinationSlope>().eq(TVaccinationSlope::getBreedingPreserveId, dto.getId()));
        vaccinationSlopeService.saveBatch(vaccinationSlopes);
        List<TCulturePreservation> culturePreservations = dto.getCulturePreservations();
        for (TCulturePreservation tSeparationOfCultureDishes : culturePreservations) {
            tSeparationOfCultureDishes.setBreedingPreserveId(dto.getId());
        }
        culturePreservationService.remove(new LambdaQueryWrapper<TCulturePreservation>().eq(TCulturePreservation::getBreedingPreserveId, dto.getId()));
        for (TCulturePreservation culturePreservation : culturePreservations) {
            if (dto.getStatus()==1&&!StringUtils.hasLength(culturePreservation.getPreserveId())){
                return R.fail("菌种保藏记录未确认,不能提交");
            }
            culturePreservation.setBreedingPreserveId(dto.getId());
        }
        culturePreservationService.saveBatch(culturePreservations);
        if (dto.getStatus()==2){
            // 新增消息
            TNotice tNotice = new TNotice();
            List<String> allProjectIds = projectTeamStaffService.lambdaQuery().eq(TProjectTeamStaff::getUserId, tokenService.getLoginUser().getUserId())
                    .eq(TProjectTeamStaff::getRoleType, 3)
                    .list().stream().map(TProjectTeamStaff::getTeamId).collect(Collectors.toList());
            if (!allProjectIds.isEmpty()){
                TProjectTeam projectTeam = projectTeamService.lambdaQuery().in(TProjectTeam::getId, allProjectIds)
                        .eq(TProjectTeam::getStatus, 1)
                        .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
                TProjectTeamStaff one1 = projectTeamStaffService.lambdaQuery()
                        .eq(TProjectTeamStaff::getTeamId, projectTeam.getId()).eq(TProjectTeamStaff::getRoleType, 2).one();
                tNotice.setUserId(one1.getUserId());
                tNotice.setCommitId(tokenService.getLoginUser().getUserId()+"");
                tNotice.setStatus(1);
                tNotice.setNoticeContent("您有【1】条【菌种选育保藏记录】等待签字入库确认;");
                tNotice.setDataId(dto.getId());
                tNotice.setNoticeType(6);
                noticeService.save(tNotice);
            }
            notifyProjectEngineers(dto.getProjectId(), dto.getId(), 6);
        }
        return R.ok();
    }
    private void notifyProjectEngineers(String projectId, String dataId, int noticeType) {
        List<TProjectTeamStaff> engineers = projectTeamStaffService.lambdaQuery()
                .eq(TProjectTeamStaff::getTeamId, projectId)
                .eq(TProjectTeamStaff::getRoleType, 3)
                .list();
        for (TProjectTeamStaff engineer : engineers) {
            TNotice notice = new TNotice();
            notice.setUserId(engineer.getUserId());
            notice.setCommitId(tokenService.getLoginUser().getUserId() + "");
            notice.setStatus(1);
            notice.setNoticeContent("您有【1】条【菌种选育保藏记录】等待签字入库确认;");
            notice.setDataId(dataId);
            notice.setNoticeType(noticeType);
            noticeService.save(notice);
        }
    }
    @Log(title = "接种斜面记录确认入库", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "接种斜面记录确认入库",response = TConfirmBreedingAndPreservationDTO.class)
    @PostMapping(value = "/api/t-breeding-and-preservation/vaccinationSlopesConfirm")
    public R<Boolean> vaccinationSlopesConfirm(@RequestBody String param) {
        if (tokenService.getLoginUser() == null) {
            return R.fail(401, "登陆失效");
        }
        Long userId = tokenService.getLoginUser().getUserId();
        TConfirmBreedingAndPreservationDTO dto = JSON.parseObject(param,TConfirmBreedingAndPreservationDTO.class);
        TVaccinationSlope vaccinationSlope = vaccinationSlopeService.getById(dto.getId());
        if (vaccinationSlope == null) {
            return R.fail("接种斜面记录不存在");
        }
        R<Boolean> validation = validatePreservationConfirmation(vaccinationSlope.getBreedingPreserveId(), userId,
                vaccinationSlope.getPreserveSignature());
        if (validation != null) {
            return validation;
        }
        vaccinationSlope.setPreserveId(userId+"");
        vaccinationSlope.setPreserveTime(LocalDateTime.now());
        vaccinationSlope.setPreserveSignature(dto.getPreserveSignature());
@@ -289,9 +295,20 @@
    @ApiOperation(value = "菌种保藏记录确认入库",response = TConfirmBreedingAndPreservationDTO.class)
    @PostMapping(value = "/api/t-breeding-and-preservation/culturePreservationsConfirm")
    public R<Boolean> culturePreservationsConfirm(@RequestBody String param) {
        if (tokenService.getLoginUser() == null) {
            return R.fail(401, "登陆失效");
        }
        Long userId = tokenService.getLoginUser().getUserId();
        TConfirmBreedingAndPreservationDTO dto = JSON.parseObject(param,TConfirmBreedingAndPreservationDTO.class);
        TCulturePreservation culturePreservation = culturePreservationService.getById(dto.getId());
        if (culturePreservation == null) {
            return R.fail("菌种保藏记录不存在");
        }
        R<Boolean> validation = validatePreservationConfirmation(culturePreservation.getBreedingPreserveId(), userId,
                culturePreservation.getPreserveSignature());
        if (validation != null) {
            return validation;
        }
        culturePreservation.setPreserveId(userId+"");
        culturePreservation.setPreserveTime(LocalDateTime.now());
        culturePreservation.setPreserveSignature(dto.getPreserveSignature());
@@ -302,28 +319,56 @@
    @Resource
    private TProjectTeamMapper tProjectTeamMapper;
    private R<Boolean> validatePreservationConfirmation(String breedingPreserveId, Long userId,
                                                        String existingSignature) {
        if (StringUtils.hasLength(existingSignature)) {
            return R.fail("该记录已经确认,不能重复签字");
        }
        TBreedingAndPreservation record = breedingAndPreservationService.getById(breedingPreserveId);
        if (record == null || record.getStatus() == null || record.getStatus() != 2) {
            return R.fail("仅已同步且未提交的记录可以确认入库");
        }
        boolean isProjectEngineer = projectTeamStaffService.lambdaQuery()
                .eq(TProjectTeamStaff::getTeamId, record.getProjectId())
                .eq(TProjectTeamStaff::getUserId, userId)
                .count() > 0;
        SysUser sysUser = sysUserService.selectUserById(userId);
        if (isProjectEngineer) {
            if (!sysUser.getRoleType().equals("3")) {
                return R.fail("仅当前项目的菌种工程师可以确认入库");
            }
        }
        return null;
    }
    //@PreAuthorize("@ss.hasPermi('system:breedingAndPreservation:detail')")
    @ApiOperation(value = "选育保藏记录详情")
    @GetMapping(value = "/open/t-breeding-and-preservation/getDetailById")
    public R<TBreedingAndPreservationDetailVO> getDetailById(@RequestParam String id) {
        if (!StringUtils.hasText(id)) {
            return R.fail("记录ID不能为空");
        }
        TBreedingAndPreservation breedingAndPreservation = breedingAndPreservationService.getById(id);
        if (breedingAndPreservation == null) {
            return R.fail("菌种选育保藏记录不存在或已删除");
        }
        List<SysUser> sysUsers = sysUserService.selectAllList();
        TBreedingAndPreservationDetailVO res = new TBreedingAndPreservationDetailVO();
        TBreedingAndPreservation breedingAndPreservation = breedingAndPreservationService.getById(id);
        BeanUtils.copyProperties(breedingAndPreservation, res);
        List<TSeparationOfCultureDishes> separationOfCultureDishesList = separationOfCultureDishesService.lambdaQuery().eq(TSeparationOfCultureDishes::getBreedingPreserveId, id).list();
        List<TObservationOfPetriDishes> observationOfPetriDishes = observationOfPetriDishesService.lambdaQuery().eq(TObservationOfPetriDishes::getBreedingPreserveId, id).list();
        List<TVaccinationSlope> vaccinationSlopes = vaccinationSlopeService.lambdaQuery().eq(TVaccinationSlope::getBreedingPreserveId, id).list();
        List<TCulturePreservation> culturePreservations = culturePreservationService.lambdaQuery().eq(TCulturePreservation::getBreedingPreserveId, id).list();
        for (TCulturePreservation culturePreservation : culturePreservations) {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(culturePreservation.getHandleId()))).findFirst()
                    .orElse(null);
            SysUser sysUser = findUserById(sysUsers, culturePreservation.getHandleId());
            if (sysUser!=null){
                culturePreservation.setHandleName(sysUser.getNickName());
            }
        }
        for (TVaccinationSlope vaccinationSlope : vaccinationSlopes) {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(vaccinationSlope.getHandleId()))).findFirst()
                    .orElse(null);
            SysUser sysUser = findUserById(sysUsers, vaccinationSlope.getHandleId());
            if (sysUser!=null){
                vaccinationSlope.setHandleName(sysUser.getNickName());
            }
@@ -355,6 +400,21 @@
        res.setVaccinationSlopes(vaccinationSlopes);
        res.setCulturePreservations(culturePreservations);
        return R.ok(res);
    }
    private SysUser findUserById(List<SysUser> sysUsers, String userId) {
        if (!StringUtils.hasText(userId)) {
            return null;
        }
        try {
            Long parsedUserId = Long.valueOf(userId);
            return sysUsers.stream()
                    .filter(user -> user.getUserId() != null && user.getUserId().equals(parsedUserId))
                    .findFirst()
                    .orElse(null);
        } catch (NumberFormatException exception) {
            return null;
        }
    }
//
//    @Log(title = "培养皿分离记录删除", businessType = BusinessType.DELETE)
@@ -394,6 +454,13 @@
    @ApiOperation(value = "菌种保藏记录删除")
    @DeleteMapping(value = "/open/t_project_team/deleteBreedingAndPreservation")
    public R<Boolean> deleteCulturePreservation(@RequestParam String id) {
        TBreedingAndPreservation record = breedingAndPreservationService.getById(id);
        if (record == null) {
            return R.fail("记录不存在");
        }
        if (record.getStatus() != null && record.getStatus() == 1) {
            return R.fail("该记录已提交,不可删除");
        }
        return R.ok(breedingAndPreservationService.removeById(id));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TPedigreeChartController.java
@@ -171,7 +171,7 @@
                count.setPedigreeChartId(parent.getId());
                count.setId(null);
                if (parent.getStatus()==1){
                    count.setAuditStatus(0);
                    count.setAuditStatus(1);
                }else{
                    count.setAuditStatus(1);
                }
@@ -206,12 +206,12 @@
                            TPedigreeChartParentTwoCountDTO childCount = count1List.get(0);
                            childCount.setType(2);
                            if (parent.getStatus()==1){
                                count.setAuditStatus(0);
                                childCount.setAuditStatus(1);
                            }else{
                                count.setAuditStatus(1);
                                childCount.setAuditStatus(1);
                            }
                            count.setVaccinateId(loginUser.getUserId()+"");
                            count.setVaccinateTime(LocalDateTime.now());
                            childCount.setVaccinateId(loginUser.getUserId()+"");
                            childCount.setVaccinateTime(LocalDateTime.now());
                            childCount.setParentId(tPedigreeChartParentTwoDTO.getId());
                            childCount.setPedigreeChartId(parent.getId());
                            childCount.setStatus(1);
@@ -317,7 +317,7 @@
        Integer status = parent.getStatus();
        TPedigreeChart pedigreeChart = pedigreeChartService.getById(parent.getId());
        if (pedigreeChart.getStatus() == 2){
            parent.setStatus(2);
            return R.fail("谱系图已提交,不可编辑");
        }
        pedigreeChartService.updateById(parent);
        parent.setStatus( status);
@@ -371,7 +371,7 @@
                count.setStatus(1);
                if (count.getId()==null){
                    if (parent.getStatus()==1){
                        count.setAuditStatus(0);
                        count.setAuditStatus(1);
                        count.setCodeStatus(parent.getStatus());
                    }else{
                        count.setAuditStatus(1);
@@ -447,7 +447,7 @@
                            childCount.setType(2);
                            if (childCount.getId()==null){
                                if (parent.getStatus()==1){
                                    childCount.setAuditStatus(0);
                                    childCount.setAuditStatus(1);
                                    childCount.setCodeStatus(parent.getStatus());
                                }else{
                                    childCount.setAuditStatus(1);
@@ -543,7 +543,7 @@
                    .eq(TProjectTeam::getStatus, 1)
                    .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
            TProjectTeamStaff projectTeamStaff = projectTeamStaffService.lambdaQuery()
                    .eq(TProjectTeamStaff::getTeamId, team.getId()).eq(TProjectTeamStaff::getRoleType, 1).one();
                    .eq(TProjectTeamStaff::getTeamId, team.getId()).eq(TProjectTeamStaff::getRoleType, 2).one();
            tNotice.setCommitId(tokenService.getLoginUser().getUserId()+"");
            tNotice.setUserId(projectTeamStaff.getUserId());
            tNotice.setStatus(1);
@@ -692,7 +692,21 @@
    public R<TPedigreeChart> getDetailInfoById(@RequestParam String id) {
        List<TPedigreeChartParentOneDTO> tPedigreeChartParentOneDTOS = new ArrayList<>();
        TPedigreeChart pedigreeChart = pedigreeChartService.getById(id);
        List<TPedigreeChartDetail> details = pedigreeChartDetailService.lambdaQuery().eq(TPedigreeChartDetail::getPedigreeChartId, id).list();
        if (pedigreeChart == null) {
            return R.fail("谱系图不存在或已删除");
        }
        List<TPedigreeChartDetail> details = new ArrayList<>(pedigreeChartDetailService.lambdaQuery()
                .eq(TPedigreeChartDetail::getPedigreeChartId, id)
                .orderByDesc(TPedigreeChartDetail::getUpdateTime)
                .orderByDesc(TPedigreeChartDetail::getCreateTime)
                .list().stream()
                .filter(detail -> StringUtils.isNotEmpty(detail.getId()))
                .collect(Collectors.toMap(
                        TPedigreeChartDetail::getId,
                        detail -> detail,
                        (first, duplicate) -> first,
                        LinkedHashMap::new
                )).values());
        TPedigreeChartParentAllDetailDTO tPedigreeChartParentAllDetailDTO = new TPedigreeChartParentAllDetailDTO();
        // 祖代
        TPedigreeChartDetail pedigreeChartDetail = details.stream().filter(e -> e.getParentId().equals("0")
@@ -714,7 +728,6 @@
                List<TPedigreeChartDetail> childs = details.stream().filter(e -> e.getParentId().equals(tPedigreeChartParentOneCountDTO.getId())
                        && e.getType() == 1).collect(Collectors.toList());
                List<TPedigreeChartParentTwoDTO> tPedigreeChartParentTwoDTOS = new ArrayList<>();
                List<TPedigreeChartParentThreeDTO> tPedigreeChartParentThreeDTOS = new ArrayList<>();
                for (TPedigreeChartDetail tPedigreeChartDetail : childs) {
                    TPedigreeChartParentTwoDTO tPedigreeChartParentTwoDTO = new TPedigreeChartParentTwoDTO();
                    BeanUtils.copyProperties(tPedigreeChartDetail,tPedigreeChartParentTwoDTO);
@@ -725,6 +738,7 @@
                        ArrayList<TPedigreeChartParentTwoCountDTO> tPedigreeChartParentTwoCountDTOS = new ArrayList<>();
                        TPedigreeChartParentTwoCountDTO tPedigreeChartParentTwoCountDTO = new TPedigreeChartParentTwoCountDTO();
                        BeanUtils.copyProperties(childCountChild,tPedigreeChartParentTwoCountDTO);
                        List<TPedigreeChartParentThreeDTO> tPedigreeChartParentThreeDTOS = new ArrayList<>();
                        List<TPedigreeChartDetail> childChilds = details.stream().filter(e -> e.getParentId().equals(tPedigreeChartParentTwoCountDTO.getId())
                                && e.getType() == 1).collect(Collectors.toList());
                        for (TPedigreeChartDetail chartDetail : childChilds) {
@@ -818,11 +832,7 @@
        pedigreeChartDetail1.setType(2);
        pedigreeChartDetail1.setCodeStatus(dto.getCodeStatus());
        if (dto.getCodeStatus()==1){
            pedigreeChartDetail1.setAuditStatus(0);
        }else{
            pedigreeChartDetail1.setAuditStatus(1);
        }
        pedigreeChartDetailService.save(pedigreeChartDetail1);
        return R.ok();
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TStrainReportController.java
@@ -16,20 +16,14 @@
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TStrainReportProjectQuery;
import com.ruoyi.system.query.TStrainReportQuery;
import com.ruoyi.system.query.TTrainLibraryDetailQuery;
import com.ruoyi.system.query.TTrainLibraryQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.*;
import com.tencentcloudapi.tcaplusdb.v20190823.models.IdlFileInfo;
import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.parser.Token;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.sql.Array;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@@ -202,7 +196,8 @@
        LoginUser loginUser = tokenService.getLoginUser();
        SysUser sysUser = sysUserService.selectUserById(loginUser.getUserId());
        List<TStrainReport> tStrainReports = strainReportService.list(new LambdaQueryWrapper<TStrainReport>()
                .eq(TStrainReport::getStatus,3).eq(TStrainReport::getProjectId,id));
                .eq(TStrainReport::getStatus,3).eq(TStrainReport::getProjectId,id)
                .orderByDesc(TStrainReport::getEvaluateTime));
        List<String> strainReportIds = tStrainReports.stream().map(TStrainReport::getId).collect(Collectors.toList());
        if (strainReportIds.isEmpty())strainReportIds.add("0");
        List<TStrainReportDetail> tStrainReportDetails = strainReportDetailService
@@ -258,12 +253,15 @@
        }
        tStrainReportDetailVO.setStartTime(project.getCreateTime());
        TProjectTeamStaff projectTeamStaff = projectTeamStaffService.lambdaQuery().eq(TProjectTeamStaff::getTeamId, project.getId())
                .eq(TProjectTeamStaff::getRoleType, 2).one();
                .eq(TProjectTeamStaff::getRoleType, 2).last("limit 1").one();
        List<TStrainReportDetailExperimentVO> tStrainReportDetailExperimentVOS = new ArrayList<>();
        if (sysUser.getRoleType().equals("4")){
            TStrainReportDetailExperimentVO tStrainReportDetailExperimentVO = new TStrainReportDetailExperimentVO();
            tStrainReportDetailExperimentVO.setUserName(sysUser.getNickName());
            tStrainReportDetailExperimentVO.setHandleCount((int) tStrainReportDetails.stream().filter(e -> e.getExperimentId()!=null&&e.getExperimentId().equals(sysUser.getUserId() + "")).count());
            tStrainReportDetailExperimentVO.setHandleCount((int) tStrainReportDetails.stream()
                    .filter(e -> e.getEvaluateHumanType().equals(1) && e.getReportType() == 1
                            && e.getExperimentId()!=null && e.getExperimentId().equals(sysUser.getUserId() + ""))
                    .count());
            BigDecimal handleIntegral = tStrainReportDetails.stream()
                    .filter(e -> e.getEvaluateHumanType().equals(1)&&e.getExperimentId().equals(sysUser.getUserId()+"")
                            &&e.getReportType()==1)
@@ -272,9 +270,12 @@
                    .orElse(BigDecimal.ZERO);
            tStrainReportDetailExperimentVO.setHandleIntegral(handleIntegral);
            List<TStrainReportDetail> strainReportDetails = tStrainReportDetails.stream().filter(e -> e.getExperimentId().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            List<TStrainReportDetail> strainReportDetails = tStrainReportDetails.stream()
                    .filter(e -> e.getEvaluateHumanType().equals(1) && e.getReportType() == 1
                            && e.getExperimentId().equals(sysUser.getUserId() + ""))
                    .collect(Collectors.toList());
            if (!strainReportDetails.isEmpty()){
                tStrainReportDetailExperimentVO.setHandleEndTime(strainReportDetails.get(strainReportDetails.size()-1).getCreateTime());
                tStrainReportDetailExperimentVO.setHandleEndTime(strainReportDetails.get(0).getCreateTime());
            }
            tStrainReportDetailExperimentVO.setHandleStartTime(project.getCreateTime());
            tStrainReportDetailExperimentVOS.add(tStrainReportDetailExperimentVO);
@@ -305,14 +306,18 @@
                    tStrainReportDetailExperimentVO.setUserName(sysUserService.selectUserById(Long.valueOf(tStrainReportDetail.getExperimentId())).getNickName());
                    tStrainReportDetailExperimentVO.setHandleCount((int) collect.stream().filter(e -> e.getExperimentId().equals(tStrainReportDetail.getExperimentId())).count());
                    BigDecimal handleIntegral = collect.stream()
                            .filter(e -> e.getEvaluateHumanType().equals(1)&&e.getExperimentId().equals(sysUser.getUserId()+"") &&e.getReportType()==1)
                            .filter(e -> e.getEvaluateHumanType().equals(1)
                                    && e.getExperimentId().equals(tStrainReportDetail.getExperimentId())
                                    && e.getReportType()==1)
                            .map(TStrainReportDetail::getEvaluateTotal)
                            .reduce(BigDecimal::add)
                            .orElse(BigDecimal.ZERO);
                    tStrainReportDetailExperimentVO.setHandleIntegral(handleIntegral);
                    List<TStrainReportDetail> reportDetails = collect.stream().filter(e -> e.getExperimentId().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
                    List<TStrainReportDetail> reportDetails = collect.stream()
                            .filter(e -> e.getExperimentId().equals(tStrainReportDetail.getExperimentId()))
                            .collect(Collectors.toList());
                    if (!reportDetails.isEmpty()){
                        tStrainReportDetailExperimentVO.setHandleEndTime(reportDetails.get(reportDetails.size()-1).getCreateTime());
                        tStrainReportDetailExperimentVO.setHandleEndTime(reportDetails.get(0).getCreateTime());
                    }
                    tStrainReportDetailExperimentVO.setHandleStartTime(project.getCreateTime());
                    tStrainReportDetailExperimentVOS1.add(tStrainReportDetailExperimentVO);
@@ -327,7 +332,7 @@
                tStrainReportDetailEngineerVO.setInnovateIntegral(reportDetails.stream().filter(e->e.getEvaluateType()!=null&&e.getEvaluateType().equals(1)).map(TStrainReportDetail::getEvaluateTotal).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
                List<TStrainReportDetail> tStrainReportDetails1 = reportDetails.stream().filter(e ->e.getEvaluateType()!=null&& e.getEvaluateType().equals(1)).collect(Collectors.toList());
                if (!tStrainReportDetails1.isEmpty()){
                    tStrainReportDetailEngineerVO.setInnovateEndTime(tStrainReportDetails1.get(tStrainReportDetails1.size()-1).getCreateTime());
                    tStrainReportDetailEngineerVO.setInnovateEndTime(tStrainReportDetails1.get(0).getCreateTime());
                }
                tStrainReportDetailEngineerVO.setInnovateStartTime(project.getCreateTime());
@@ -335,7 +340,7 @@
                tStrainReportDetailEngineerVO.setRegulationIntegral(reportDetails.stream().filter(e->e.getEvaluateType()!=null&&e.getEvaluateType().equals(2)).map(TStrainReportDetail::getEvaluateTotal).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
                List<TStrainReportDetail> collect4 = reportDetails.stream().filter(e -> e.getEvaluateType()!=null&&e.getEvaluateType().equals(2)).collect(Collectors.toList());
                if (!collect4.isEmpty()){
                    tStrainReportDetailEngineerVO.setRegulationEndTime(collect4.get(collect4.size()-1).getCreateTime());
                    tStrainReportDetailEngineerVO.setRegulationEndTime(collect4.get(0).getCreateTime());
                }
                tStrainReportDetailEngineerVO.setRegulationStartTime(project.getCreateTime());
@@ -343,7 +348,7 @@
                tStrainReportDetailEngineerVO.setHandleIntegral(reportDetails.stream().filter(e->e.getReportType().equals(1)).map(TStrainReportDetail::getEvaluateTotal).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
                List<TStrainReportDetail> reportDetailList = reportDetails.stream().filter(e->e.getReportType().equals(1)).collect(Collectors.toList());
                if (!reportDetailList.isEmpty()){
                    tStrainReportDetailEngineerVO.setHandleEndTime(reportDetailList.get(reportDetailList.size()-1).getCreateTime());
                    tStrainReportDetailEngineerVO.setHandleEndTime(reportDetailList.get(0).getCreateTime());
                }
                tStrainReportDetailEngineerVO.setHandleStartTime(project.getCreateTime());
@@ -356,7 +361,9 @@
                        .map(TStrainReportDetail::getExperimentId)
                        .distinct()
                        .collect(Collectors.toList());
                List<TStrainReportDetail> tStrainReportDetails2 = tStrainReportDetails.stream().filter(e -> e.getEvaluateHumanType().equals(1)).collect(Collectors.toList());
                List<TStrainReportDetail> tStrainReportDetails2 = tStrainReportDetails.stream()
                        .filter(e -> e.getEvaluateHumanType().equals(1) && e.getReportType() == 1)
                        .collect(Collectors.toList());
                for (String experimentId : experimentIds) {
                    List<TStrainReportDetail> details = tStrainReportDetails2.stream().filter(e -> e.getExperimentId().equals(experimentId)).collect(Collectors.toList());
@@ -371,8 +378,8 @@
                            .reduce(BigDecimal::add)
                            .orElse(BigDecimal.ZERO);
                    tStrainReportDetailExperimentVO.setHandleIntegral(handleIntegral);
                    if (!tStrainReportDetails2.isEmpty()){
                        tStrainReportDetailExperimentVO.setHandleEndTime(details.get(details.size()-1).getCreateTime());
                    if (!details.isEmpty()){
                        tStrainReportDetailExperimentVO.setHandleEndTime(details.get(0).getCreateTime());
                    }
                    tStrainReportDetailExperimentVO.setHandleStartTime(project.getCreateTime());
                    tStrainReportDetailExperimentVOS1.add(tStrainReportDetailExperimentVO);
@@ -590,6 +597,9 @@
    public R<TStrainReportDetailVO> detail(@RequestParam String id) {
        TStrainReportDetailVO tStrainReportDetailVO = new TStrainReportDetailVO();
        TStrainReport strainReport = strainReportService.getById(id);
        if (strainReport == null) {
            return R.fail("报告不存在或已删除");
        }
        if (strainReport.getAuditId()!=null){
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(strainReport.getAuditId()));
            if (sysUser!=null){
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TStrainValidationDataController.java
@@ -242,6 +242,9 @@
    @GetMapping(value = "/open/t-strain-validation-data/getDetailById")
    public R<AddStrainValidationDataDetailVO> getDetailMainById(@RequestParam String id) {
        TStrainValidationData strainValidationData = strainValidationDataService.getById(id);
        if (strainValidationData == null) {
            return R.fail("菌种验证资料不存在或已删除");
        }
        AddStrainValidationDataDetailVO res = new AddStrainValidationDataDetailVO();
        BeanUtils.copyProperties(strainValidationData,res);
        List<TStrainValidationDataDetail> list = strainValidationDataDetailService.lambdaQuery().eq(TStrainValidationDataDetail::getDataId, id).list();
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTrainLibraryController.java
@@ -98,12 +98,14 @@
    public R<PageInfo<TProjectTeamVO>> choiceProjectList(@RequestBody String param) {
        LoginUser loginUser = tokenService.getLoginUser();
        SysUser sysUser = sysUserService.selectUserById(loginUser.getUserId());
        List<String> projectIds = projectTeamStaffService.lambdaQuery().eq(TProjectTeamStaff::getUserId, sysUser.getUserId()).list().stream().map(TProjectTeamStaff::getTeamId).collect(Collectors.toList());
        ChoiceProjectDTO query = JSON.parseObject(param, ChoiceProjectDTO.class);
        if (!"1".equals(sysUser.getRoleType())) {
            List<String> projectIds = getAccessibleProjectIds(sysUser.getUserId());
        if (projectIds.isEmpty()){
            projectIds.add("0");
        }
        ChoiceProjectDTO query = JSON.parseObject(param, ChoiceProjectDTO.class);
        query.setProjectIds(projectIds);
        }
        return R.ok(projectTeamService.choiceProjectList(query));
    }
@@ -116,31 +118,41 @@
        Long userId = tokenService.getLoginUser().getUserId();
        SysUser sysUser = sysUserService.selectUserById(userId);
        TTrainLibraryQuery query = JSON.parseObject(param, TTrainLibraryQuery.class);
        if (sysUser.getRoleType().equals("2")){
            if (CollectionUtils.isNotEmpty(query.getProjectIds())) {
                query.setProjectIds(query.getProjectIds());
            }
        }else if (!sysUser.getRoleType().equals("1")){
            if (CollectionUtils.isNotEmpty(query.getProjectIds())) {
                query.setProjectIds(query.getProjectIds());
            }else {
                // 没有根据项目组查询
                List<String> allProjectIds = projectTeamStaffService.lambdaQuery().eq(TProjectTeamStaff::getUserId, tokenService.getLoginUser().getUserId())
                        .list().stream().map(TProjectTeamStaff::getTeamId).collect(Collectors.toList());
                if (!allProjectIds.isEmpty()){
                    List<String> projectIds = projectTeamService.lambdaQuery().in(TProjectTeam::getId, allProjectIds)
                            .eq(TProjectTeam::getStatus, 1).list().stream().map(TProjectTeam::getId).collect(Collectors.toList());
                    if (projectIds.isEmpty()){
        if (!sysUser.getRoleType().equals("1")){
            List<String> accessibleProjectIds = getAccessibleProjectIds(userId);
            if (accessibleProjectIds.isEmpty()) {
                        return R.ok(new PageInfo<>());
                    }
                    query.setProjectIds(projectIds);
                }else {
            if (CollectionUtils.isNotEmpty(query.getProjectIds())) {
                List<String> requestedProjectIds = new ArrayList<>(query.getProjectIds());
                requestedProjectIds.retainAll(accessibleProjectIds);
                if (requestedProjectIds.isEmpty()) {
                    return R.ok(new PageInfo<>());
                }
                query.setProjectIds(requestedProjectIds);
            } else {
                query.setProjectIds(accessibleProjectIds);
            }
        }
        return R.ok(tTrainLibraryService.pageList(query, sysUser.getRoleType()));
    }
    private List<String> getAccessibleProjectIds(Long userId) {
        List<String> teamIds = projectTeamStaffService.lambdaQuery()
                .eq(TProjectTeamStaff::getUserId, userId)
                .list().stream()
                .map(TProjectTeamStaff::getTeamId)
                .distinct()
                .collect(Collectors.toList());
        if (teamIds.isEmpty()) {
            return new ArrayList<>();
        }
        return projectTeamService.lambdaQuery()
                .in(TProjectTeam::getId, teamIds)
                .eq(TProjectTeam::getStatus, 1)
                .list().stream()
                .map(TProjectTeam::getId)
                .collect(Collectors.toList());
    }
    /**
@@ -395,6 +407,9 @@
    @GetMapping(value = "/open/t-train-library/getDetailEditById")
    public R<TTrainLibraryDetailVO> getDetailEditById(@RequestParam String id) {
        TTrainLibrary trainLibrary = tTrainLibraryService.getById(id);
        if (trainLibrary == null) {
            return R.fail("菌种库记录不存在或已删除");
        }
        TTrainLibraryDetailVO tTrainLibraryDetailVO = new TTrainLibraryDetailVO();
        BeanUtils.copyProperties(trainLibrary,tTrainLibraryDetailVO);
        return R.ok(tTrainLibraryDetailVO);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -51,6 +51,16 @@
    @Autowired
    private ISysRoleService roleService;
//    @PostMapping("/login")
//    public AjaxResult login(@RequestBody LoginBody loginBody)
//    {
//        AjaxResult ajax = AjaxResult.success();
//        // 生成令牌
//        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
//                loginBody.getUuid());
//        ajax.put(Constants.TOKEN, token);
//        return ajax;
//    }
    /**
     * 账号密码登录
ruoyi-admin/src/main/resources/application-prod.yml
@@ -190,7 +190,7 @@
    location: /file/
    qrLocation: /file/qrCode/
    accessPath: /file/
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.MP4|.mp4|.pdf|.PDF|.xls|.xlsx|.rar|.zip|.rar|.ppt|.pptx
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.mp4|.pdf|.xls|.xlsx|.rar|.zip|.ppt|.pptx|.caj
  url:
    #    prefix: http://localhost:${server.port}${server.servlet.context-path}
    prefix: https://xzgt.test.591taxi.cn:${server.port}${server.servlet.context-path}
ruoyi-admin/src/main/resources/application-test.yml
@@ -75,7 +75,7 @@
    # 数据库索引
    database: 0
    # 密码
    password: 123456
    password:
    # 连接超时时间
    timeout: 10s
    lettuce:
@@ -95,9 +95,9 @@
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://192.168.110.34:3306/strain_library?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
        url: jdbc:mysql://localhost:3399/strain_library?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        password: qwe123
      # 从库数据源
      slave:
        # 从数据源开关/默认关闭
@@ -155,7 +155,7 @@
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  # 令牌有效期(默认30分钟)
  expireTime: 120
  expireTime: 720
mybatis-plus:
  # 此处在多数据源中生效
@@ -190,7 +190,7 @@
    location: /file/
    qrLocation: /file/qrCode/
    accessPath: /file/
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.MP4|.mp4|.pdf|.PDF|.xls|.xlsx|.rar|.zip|.rar
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.MP4|.mp4|.pdf|.PDF|.xls|.xlsx|.rar|.zip|.caj|.ppt|.pptx
  url:
    #    prefix: http://localhost:${server.port}${server.servlet.context-path}
    prefix: https://xzgt.test.591taxi.cn:${server.port}${server.servlet.context-path}
ruoyi-admin/src/main/resources/application.yml
@@ -1,4 +1,5 @@
# 项目相关配置
spring:
  profiles:
    active: test
#    active: test
    active: prod
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/FileController.java
@@ -13,6 +13,7 @@
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
 * 文件上传控制类
@@ -48,6 +49,10 @@
        }
        // 获取文件名称
        String filename = mf.getOriginalFilename();
        if (filename == null || !filename.contains(".")) {
            return AjaxResult.error("上传文件缺少扩展名!");
        }
        filename = new File(filename).getName();
        // 生成随机5位英文字母
        String rename = "";
        for (int i = 0; i < 5; i++) {
@@ -56,9 +61,10 @@
        long l = System.currentTimeMillis();
        // 获取文件后缀
        String temp = rename+l+filename;
        String ext = temp.substring(temp.lastIndexOf("."), temp.length());
        String ext = temp.substring(temp.lastIndexOf(".")).toLowerCase(Locale.ROOT);
        // 检查文件类型
        if (!fileUploadConfig.getAllowExt().contains(ext)) {
        String allowExt = fileUploadConfig.getAllowExt().toLowerCase(Locale.ROOT);
        if (!allowExt.contains(ext)) {
            return AjaxResult.error("上传文件格式不正确,仅支持" + fileUploadConfig.getAllowExt());
        }
        File targetFile = new File(realPath, temp);//目标文件
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java
@@ -1,8 +1,6 @@
package com.ruoyi.common.utils.poi;
import javafx.scene.control.Cell;
/**
 * Excel数据格式处理适配器
 * 
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -112,7 +112,7 @@
                .authorizeRequests()
                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                .antMatchers("/getPrivacyAgreement/{agreementType}",
                        "/applet/queryProtocolConfigByType","/applet/login",
                        "/applet/queryProtocolConfigByType","/applet/login","/login",
                        "/api/login","/applet/queryProtocolConfigByType",
                        "/register","/applet/getCode","/applet/loginCode",
                        "/applet/changepwd", "/captchaImage","/getCode","/loginCode",
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -62,6 +62,45 @@
    @Autowired
    private SysPermissionService permissionService;
    public String login(String username, String password, String code, String uuid)
    {
        // 验证码校验
        validateCaptcha(username, code, uuid);
        // 登录前置校验
        loginPreCheck(username, password);
        // 用户验证
        Authentication authentication = null;
        try
        {
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
        }
        catch (Exception e)
        {
            if (e instanceof BadCredentialsException)
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                throw new ServiceException(e.getMessage());
            }
        }
        finally
        {
            AuthenticationContextHolder.clearContext();
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUserId());
        // 生成token
        return tokenService.createToken(loginUser);
    }
    /**
     * 登录验证
     * 
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPedigreeChartServiceImpl.java
@@ -26,7 +26,10 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -74,7 +77,7 @@
    @Override
    public PageInfo<TPedigreeChartDetailVO> pageListDetail(TPedigreeChartDetailQuery query) {
        PageInfo<TPedigreeChartDetailVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TPedigreeChartDetailVO> list = this.baseMapper.pageListDetail(query,pageInfo);
        List<TPedigreeChartDetailVO> list = distinctById(this.baseMapper.pageListDetail(query,pageInfo));
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
        for (TPedigreeChartDetailVO tPedigreeChartDetailVO : list) {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tPedigreeChartDetailVO.getVaccinateId())))
@@ -96,24 +99,50 @@
    public PageInfo<TPedigreeChartDetailVO> pageListCountDetail(TPedigreeChartDetailQuery query) {
        TPedigreeChart tPedigreeChart = this.baseMapper.selectById(query.getId());
        PageInfo<TPedigreeChartDetailVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TPedigreeChartDetailVO> list = this.baseMapper.pageListCountDetail(query,pageInfo);
        List<TPedigreeChartDetailVO> list = distinctById(this.baseMapper.pageListCountDetail(query,pageInfo));
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
        for (TPedigreeChartDetailVO tPedigreeChartDetailVO : list) {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tPedigreeChartDetailVO.getVaccinateId())))
            SysUser sysUser = StringUtils.isEmpty(tPedigreeChartDetailVO.getVaccinateId()) ? null : sysUsers.stream()
                    .filter(e -> e.getUserId().equals(Long.valueOf(tPedigreeChartDetailVO.getVaccinateId())))
                    .findFirst().orElse(null);
            if (sysUser!=null){
                tPedigreeChartDetailVO.setExperimenter(sysUser.getNickName());
            }
            SysUser sysUser1 = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tPedigreeChartDetailVO.getVaccinateId())))
                    .findFirst().orElse(null);
            if (sysUser1!=null){
                tPedigreeChartDetailVO.setVaccinateName(sysUser.getNickName());
            }
            TPedigreeChartDetail parent = pedigreeChartDetailMapper.selectList(
                    Wrappers.<TPedigreeChartDetail>lambdaQuery()
                            .eq(TPedigreeChartDetail::getId, tPedigreeChartDetailVO.getParentId())
                            .eq(TPedigreeChartDetail::getPedigreeChartId, query.getId())
                            .eq(TPedigreeChartDetail::getType, 1)
                            .orderByDesc(TPedigreeChartDetail::getUpdateTime)
                            .orderByDesc(TPedigreeChartDetail::getCreateTime)
                            .last("limit 1")
            ).stream().findFirst().orElse(null);
            if (parent != null) {
                tPedigreeChartDetailVO.setStrainType(parent.getStrainType());
                tPedigreeChartDetailVO.setSource(parent.getSource());
                tPedigreeChartDetailVO.setColonyNumber(parent.getColonyNumber());
                tPedigreeChartDetailVO.setStrainCode(StringUtils.isNotEmpty(parent.getStrainCode())
                        ? parent.getStrainCode() : tPedigreeChart.getStrainCode());
                tPedigreeChartDetailVO.setStrainName(StringUtils.isNotEmpty(parent.getStrainName())
                        ? parent.getStrainName() : tPedigreeChart.getStrainName());
                tPedigreeChartDetailVO.setConfirmTime(parent.getConfirmTime() != null
                        ? parent.getConfirmTime() : parent.getStorageTime());
            } else {
            tPedigreeChartDetailVO.setStrainCode(tPedigreeChart.getStrainCode());
            tPedigreeChartDetailVO.setStrainName(tPedigreeChart.getStrainName());
            tPedigreeChartDetailVO.setConfirmTime(tPedigreeChart.getCreateTime());
        }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    private List<TPedigreeChartDetailVO> distinctById(List<TPedigreeChartDetailVO> list) {
        Map<String, TPedigreeChartDetailVO> uniqueRecords = new LinkedHashMap<>();
        for (TPedigreeChartDetailVO detail : list) {
            uniqueRecords.putIfAbsent(detail.getId(), detail);
        }
        return new ArrayList<>(uniqueRecords.values());
    }
}
ruoyi-system/src/main/resources/mapper/system/TPedigreeChartMapper.xml
@@ -39,7 +39,7 @@
                and status = 2
            </if>
            <if test="query.roleType == 2">
                and status = 2
                and (status = 1 or status = 2)
            </if>
            <if test="query.roleType == 3">
                and (status = 2 or status = 1)
ruoyi-ui/src/api/login.js
@@ -9,7 +9,7 @@
    uuid
  }
  return request({
    url: '/login',
    url: '/api/login',
    headers: {
      isToken: false
    },
ruoyi-ui/src/views/login.vue
@@ -72,8 +72,8 @@
    return {
      codeUrl: "",
      loginForm: {
        username: "admin",
        password: "admin123",
        username: "",
        password: "",
        rememberMe: false,
        code: "",
        uuid: ""
ruoyi-ui/vue.config.js
@@ -35,7 +35,7 @@
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://localhost:8081`,
        target: `http://localhost:8082`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
sql/新的/strain_library.sql
New file
Diff too large