package cn.cslg.pas.service;
import cn.cslg.pas.common.model.BaseEntity;
import cn.cslg.pas.common.model.vo.PatentReadVO;
import cn.cslg.pas.common.utils.JsonUtils;
import cn.cslg.pas.common.utils.StringUtils;
import cn.cslg.pas.domain.Patent;
import cn.cslg.pas.domain.ProjectFolderPatentLink;
import cn.cslg.pas.domain.ProjectPatentLink;
import cn.cslg.pas.mapper.ProjectPatentLinkMapper;
import cn.cslg.pas.common.utils.CacheUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
*
* 专题库关联专利信息表 服务实现类
*
*
* @author 王岩
* @since 2022-01-24
*/
@Service
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class ProjectPatentLinkService extends ServiceImpl {
private final ProjectFolderPatentLinkService projectFolderPatentLinkService;
private final CacheUtils cacheUtils;
private final PatentService patentService;
public List getProjectPatentsByProjectId(Integer projectId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProjectPatentLink::getProjectId, projectId);
return this.list(queryWrapper);
}
public ProjectPatentLink getProjectPatentByProIdAndPatentId(Integer projectId, Integer patentId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProjectPatentLink::getProjectId, projectId);
queryWrapper.eq(ProjectPatentLink::getPatentId, patentId);
return this.getOne(queryWrapper);
}
public List getProjectPatentByProIdAndPatentIds(Integer projectId, List patentIds) {
if (patentIds == null || patentIds.size() == 0) {
return new ArrayList<>();
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProjectPatentLink::getProjectId, projectId);
queryWrapper.in(ProjectPatentLink::getPatentId, patentIds);
return this.list(queryWrapper);
}
public void updateProjectPatent(Integer projectId, Integer patentId) {
ProjectPatentLink temp = this.getProjectPatentByProIdAndPatentId(projectId, patentId);
if (temp == null) {
temp = new ProjectPatentLink();
temp.setPatentId(patentId);
temp.setProjectId(projectId);
temp.insert();
}
}
public List getProjectPatentLinkByProjectAndFolder(Integer projectId, String folder) {
List linkList = this.getProjectPatentsByProjectId(projectId);
if (StringUtils.isNotEmpty(folder)) {
List folders = StringUtils.changeStringToInteger(folder, ",");
List folderLinks = projectFolderPatentLinkService.getProjectFolderLinkByProjectIdAndFolder(projectId, folders);
linkList = linkList.stream().filter(item -> folderLinks.stream().map(ProjectFolderPatentLink::getPatentId).collect(Collectors.toList()).contains(item.getPatentId())).collect(Collectors.toList());
}
return linkList;
}
public Map getPatentReadTotal(PatentReadVO params) {
List linkList = new ArrayList<>();
if (StringUtils.isNotEmpty(params.getFolder())) {
linkList = projectFolderPatentLinkService.getProjectFolderLinkByProjectIdAndFolder(params.getProjectId(), Integer.parseInt(params.getFolder())).stream().map(item -> {
ProjectPatentLink projectPatentLink = new ProjectPatentLink();
projectPatentLink.setLook(item.getLook());
projectPatentLink.setProjectId(item.getProjectId());
projectPatentLink.setPatentId(item.getPatentId());
projectPatentLink.setId(item.getId());
return projectPatentLink;
}).collect(Collectors.toList());
} else {
linkList = this.getProjectPatentsByProjectId(params.getProjectId());
}
Map result = new ConcurrentHashMap<>();
result.put("all", linkList.size());
result.put("read", linkList.stream().filter(item -> item.getLook().equals(1)).count());
result.put("unread", linkList.stream().filter(item -> item.getLook().equals(0)).count());
return result;
}
public Boolean updatePatentReadStatus(PatentReadVO params) {
if (StringUtils.isNotEmpty(params.getFolder())) {
List projectFolderPatentLinkList = projectFolderPatentLinkService.getProjectFolderLinkByProjectIdAndFolderAndPatentIds(params.getProjectId(), Integer.parseInt(params.getFolder()), params.getPatentIds());
projectFolderPatentLinkList.forEach(item -> item.setLook(params.getStatus()));
return projectFolderPatentLinkService.saveOrUpdateBatch(projectFolderPatentLinkList);
} else {
List projectPatentLinkList = this.getProjectPatentByProIdAndPatentIds(params.getProjectId(), params.getPatentIds());
projectPatentLinkList.forEach(item -> item.setLook(params.getStatus()));
return this.saveOrUpdateBatch(projectPatentLinkList);
}
}
public void deleteByProjectId(Integer projectId) {
this.remove(Wrappers.lambdaQuery().eq(ProjectPatentLink::getProjectId, projectId));
}
@Transactional
public void deleteByProjectIdAndPatentIds(Integer projectId, List patentIds) {
this.remove(Wrappers.lambdaQuery().eq(ProjectPatentLink::getProjectId, projectId).in(ProjectPatentLink::getPatentId, patentIds));
projectFolderPatentLinkService.deleteByProjectIdAndPatentIds(projectId, patentIds);
}
public void importProjectPatentLink(Integer projectId, String patentIdPatentNoJson) {
List importPatentList = JsonUtils.jsonToList(patentIdPatentNoJson, Patent.class);
List importPatentNos = importPatentList.stream().map(Patent::getPatentNo).collect(Collectors.toList());
List localPatentList = patentService.getPatentListByPatentNo(importPatentNos);
List localProjectPatentLinkList = this.getProjectPatentByProIdAndPatentIds(projectId, localPatentList.stream().map(Patent::getId).collect(Collectors.toList()));
for (String patentNo : importPatentNos) {
Patent localPatent = localPatentList.stream().filter(item -> item.getPatentNo().equals(patentNo)).findFirst().orElse(null);
if (localPatent == null) {
continue;
}
ProjectPatentLink localProjectPatentLink = localProjectPatentLinkList.stream().filter(item -> item.getPatentId().equals(localPatent.getId())).findFirst().orElse(null);
if (localProjectPatentLink == null) {
localProjectPatentLink = new ProjectPatentLink();
localProjectPatentLink.setProjectId(projectId);
localProjectPatentLink.setPatentId(localPatent.getId());
localProjectPatentLink.setLook(0);
localProjectPatentLink.insert();
}
}
}
}