package cn.cslg.pas.service;
import cn.cslg.pas.domain.PatentSimpleFamilyLink;
import cn.cslg.pas.common.utils.StringUtils;
import cn.cslg.pas.domain.Patent;
import cn.cslg.pas.domain.PatentSimpleFamily;
import cn.cslg.pas.mapper.PatentSimpleFamilyMapper;
import cn.cslg.pas.common.model.params.PatentSimpleFamilyParams;
import cn.cslg.pas.common.utils.PatentUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 专利信息简单同族关联表 服务类
*
*
* @author 王岩
* @since 2022-02-24
*/
@Service
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class PatentSimpleFamilyService extends ServiceImpl {
private final PatentService patentService;
private final PatentApplicantService patentApplicantService;
private final PatentSimpleFamilyLinkService patentSimpleFamilyLinkService;
public PatentSimpleFamily getPatentSimpleFamilyByIdsAndType(List ids, Integer type) {
if (ids == null || ids.size() == 0) {
return null;
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(PatentSimpleFamily::getId, ids);
queryWrapper.eq(PatentSimpleFamily::getType, type);
return this.getOne(queryWrapper);
}
public List getPatentSimpleFamilyByIds(List ids) {
if (ids == null || ids.size() == 0) {
return null;
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(PatentSimpleFamily::getId, ids);
return this.list(queryWrapper);
}
public void importPatentSimpleFamily(Patent patent, List importPatentSimpleFamilyList, List importPatentSimpleFamilyLinkList) {
List importPatentSimpleFamilyLink = importPatentSimpleFamilyLinkList.stream().filter(item -> item.getFamilyId().equals(patent.getSimpleFamily())).collect(Collectors.toList());
List importPatentInpadocFamilyLink = importPatentSimpleFamilyLinkList.stream().filter(item -> item.getFamilyId().equals(patent.getInpadocFamily())).collect(Collectors.toList());
List importPatentPatSnapFamilyLink = importPatentSimpleFamilyLinkList.stream().filter(item -> item.getFamilyId().equals(patent.getPatSnapFamily())).collect(Collectors.toList());
PatentSimpleFamilyParams patentSimpleFamilyParams = new PatentSimpleFamilyParams();
patentSimpleFamilyParams.setPatentId(patent.getId());
patentSimpleFamilyParams.setPatentNo(patent.getPatentNo());
patentSimpleFamilyParams.setSimpleFamily(importPatentSimpleFamilyLink.stream().map(PatentSimpleFamilyLink::getPatentNo).collect(Collectors.toList()));
patentSimpleFamilyParams.setInpadocFamily(importPatentInpadocFamilyLink.stream().map(PatentSimpleFamilyLink::getPatentNo).collect(Collectors.toList()));
patentSimpleFamilyParams.setPatSnapFamily(importPatentPatSnapFamilyLink.stream().map(PatentSimpleFamilyLink::getPatentNo).collect(Collectors.toList()));
this.updatePatentSimpleFamily(patentSimpleFamilyParams);
}
public void updatePatentSimpleFamily(PatentSimpleFamilyParams params) {
if (params.getSimpleFamily() != null && params.getSimpleFamily().size() != 0) {
this.updateData(params.getSimpleFamily(), params.getPatentNo(), params.getPatentId(), 1);
}
if (params.getInpadocFamily() != null && params.getInpadocFamily().size() != 0) {
this.updateData(params.getInpadocFamily(), params.getPatentNo(), params.getPatentId(), 2);
}
if (params.getPatSnapFamily() != null && params.getPatSnapFamily().size() != 0) {
this.updateData(params.getPatSnapFamily(), params.getPatentNo(), params.getPatentId(), 3);
}
}
public PatentSimpleFamily add(Integer type) {
PatentSimpleFamily patentSimpleFamily = new PatentSimpleFamily();
patentSimpleFamily.setType(type);
patentSimpleFamily.insert();
return patentSimpleFamily;
}
public void updateData(List familyNo, String patentNo, Integer patentId, Integer type) {
//两个表 1.同族表 2.同组关联专利表
//用专利号 获取同族关联专利表的信息
List patentSimpleFamilyLinkList = patentSimpleFamilyLinkService.getPatentSimpleFamilyLinkByPatentNo(patentNo);
PatentSimpleFamily family;
if (patentSimpleFamilyLinkList == null || patentSimpleFamilyLinkList.size() == 0) {
//如果 同组关联专利表 内没有数据 就新建一条 同族表 的数据
family = this.add(type);
} else {
//如果 同组关联专利表 内有数据 那么用查询出来的List中的 同族表 的ID来获取 同族表 内的其他对应信息
PatentSimpleFamily patentSimpleFamily = this.getPatentSimpleFamilyByIdsAndType(patentSimpleFamilyLinkList.stream().map(PatentSimpleFamilyLink::getFamilyId).collect(Collectors.toList()), type);
if (patentSimpleFamily == null) {
family = this.add(type);
} else {
family = patentSimpleFamily;
}
}
for (String patent : familyNo) {
PatentSimpleFamilyLink temp = patentSimpleFamilyLinkService.getPatentSimpleFamilyLinkByPatentNoAndFamilyId(patent, family.getId());
if (temp == null) {
PatentSimpleFamilyLink patentSimpleFamilyLink = new PatentSimpleFamilyLink();
patentSimpleFamilyLink.setFamilyId(family.getId());
patentSimpleFamilyLink.setPatentNo(patent);
patentSimpleFamilyLink.insert();
} else {
temp.setFamilyId(family.getId());
temp.updateById();
}
Patent patent1 = patentService.getPublicDateAndPatentNoByPatentNo(patent);
Patent patent2 = patentService.getPublicDateAndPatentNoByPatentNo(family.getPatentNo());
if (patent1 != null) {
switch (type) {
case 1:
patent1.setSimpleFamily(family.getId());
break;
case 2:
patent1.setInpadocFamily(family.getId());
break;
case 3:
patent1.setPatSnapFamily(family.getId());
break;
}
family.setPatentNo(patent1.getPatentNo());
patent1.updateById();
}
if (patent2 != null) {
switch (type) {
case 1:
patent2.setSimpleFamily(family.getId());
break;
case 2:
patent2.setInpadocFamily(family.getId());
break;
case 3:
patent2.setPatSnapFamily(family.getId());
break;
}
family.setPatentNo(patent2.getPatentNo());
patent2.updateById();
}
if (StringUtils.isEmpty(family.getPatentNo())) {
family.setPatentNo(patent);
} else {
if (patent1 != null && patent2 != null) {
String country1 = PatentUtils.getPatentCountry(patent1.getPatentNo());
String country2 = PatentUtils.getPatentCountry(patent2.getPatentNo());
if ("CN".equals(country1) && !"CN".equals(country2)) {
family.setPatentNo(patent1.getPatentNo());
}
if (!"CN".equals(country1) && "CN".equals(country2)) {
family.setPatentNo(patent2.getPatentNo());
}
if ("CN".equals(country1) && "CN".equals(country2)) {
Integer publicData1 = patent1.getPublicDate();
Integer publicData2 = patent2.getPublicDate();
if (publicData1 == null && publicData2 != null) {
family.setPatentNo(patent2.getPatentNo());
}
if (publicData1 != null && publicData2 == null) {
family.setPatentNo(patent1.getPatentNo());
}
if (publicData1 != null && publicData2 != null) {
if (publicData1 > publicData2) {
family.setPatentNo(patent2.getPatentNo());
} else {
family.setPatentNo(patent1.getPatentNo());
}
}
}
}
}
family.updateById();
}
}
}