MatchCasePersonService.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package cn.cslg.pas.service.report;
  2. import cn.cslg.pas.common.model.cronModel.Personnel;
  3. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  4. import cn.cslg.pas.common.model.report.*;
  5. import cn.cslg.pas.common.model.cronModel.SystemFile;
  6. import cn.cslg.pas.common.model.report.MailMessageDTO;
  7. import cn.cslg.pas.common.model.report.QueryMatchCasePersonVO;
  8. import cn.cslg.pas.common.model.report.UpdateIprPersonDTO;
  9. import cn.cslg.pas.common.model.report.UpdateMatchCasePersonDTO;
  10. import cn.cslg.pas.common.utils.CacheUtils;
  11. import cn.cslg.pas.common.utils.LoginUtils;
  12. import cn.cslg.pas.domain.business.AssoProjectPerson;
  13. import cn.cslg.pas.domain.business.ReportProject;
  14. import cn.cslg.pas.domain.business.Project;
  15. import cn.cslg.pas.domain.business.ReportProject;
  16. import cn.cslg.pas.domain.report.AssoIprReportType;
  17. import cn.cslg.pas.domain.report.IprPerson;
  18. import cn.cslg.pas.exception.ExceptionEnum;
  19. import cn.cslg.pas.exception.XiaoShiException;
  20. import cn.cslg.pas.service.business.AssoProjectPersonService;
  21. import cn.cslg.pas.service.business.ReportProjectService;
  22. import cn.cslg.pas.service.business.ProjectService;
  23. import cn.cslg.pas.service.business.ReportProjectService;
  24. import cn.cslg.pas.service.permissions.PermissionService;
  25. import com.alibaba.fastjson.JSON;
  26. import com.alibaba.fastjson.JSONObject;
  27. import com.alibaba.fastjson.JSONObject;
  28. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  29. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  30. import cn.cslg.pas.domain.report.MatchCasePerson;
  31. import cn.cslg.pas.mapper.report.MatchCasePersonMapper;
  32. import lombok.RequiredArgsConstructor;
  33. import org.springframework.beans.BeanUtils;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.context.annotation.Lazy;
  36. import org.springframework.stereotype.Service;
  37. import org.springframework.util.CollectionUtils;
  38. import java.util.*;
  39. import java.util.regex.Pattern;
  40. import java.util.stream.Collectors;
  41. /**
  42. * @author admin
  43. * @description 针对表【match_case_person(配案人员)】的数据库操作Service实现
  44. * @createDate 2024-12-24 13:56:43
  45. */
  46. @Service
  47. @RequiredArgsConstructor
  48. public class MatchCasePersonService extends ServiceImpl<MatchCasePersonMapper, MatchCasePerson> {
  49. private final LoginUtils loginUtils;
  50. private final CacheUtils cacheUtils;
  51. @Autowired
  52. @Lazy
  53. private SendReportMailService sendReportMailService;
  54. @Autowired
  55. @Lazy
  56. private IprPersonService iprPersonService;
  57. private final AssoProjectPersonService assoProjectPersonService;
  58. private final ReportProjectService reportProjectService;
  59. private final PermissionService permissionService;
  60. public Integer updateMatchCasePerson(UpdateMatchCasePersonDTO updateMatchCasePersonDTO) {
  61. String name = updateMatchCasePersonDTO.getName();
  62. String email = updateMatchCasePersonDTO.getEmail();
  63. Integer assoAccountId = updateMatchCasePersonDTO.getAssoAccountId();
  64. String remark = updateMatchCasePersonDTO.getRemark();
  65. Integer assoId = updateMatchCasePersonDTO.getAssoAccountId();
  66. // 1内部ipr 2代理所
  67. Integer type = updateMatchCasePersonDTO.getType();
  68. Integer iprPersonId = null;
  69. // 邮箱传入 即先添加ipr人员 再与报告关联
  70. // 判断邮箱是否存在
  71. // 邮箱不为空 则去新增ipr人员 并判断邮箱是否存在
  72. if (email != null) {
  73. Boolean isValid = this.isValidEmail(email);
  74. if (!isValid) {
  75. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "邮箱格式不正确");
  76. }
  77. LambdaQueryWrapper<IprPerson> queryWrapper = new LambdaQueryWrapper<>();
  78. queryWrapper.eq(IprPerson::getEmail, email);
  79. IprPerson iprPerson = iprPersonService.getOne(queryWrapper, false);
  80. if (iprPerson != null) {
  81. if (!name.trim().equals(iprPerson.getName().trim()) || assoAccountId != iprPerson.getAssoAccountId()) {
  82. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "禁止修改已存在邮箱的相关信息!请前往联系邮箱处");
  83. }
  84. //邮箱存在
  85. iprPersonId = iprPerson.getId();
  86. assoId = iprPerson.getAssoAccountId();
  87. } else {
  88. PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  89. String personId = personnelVO.getId();
  90. Integer tenantId = personnelVO.getTenantId();
  91. IprPerson newIprPerson = new IprPerson();
  92. newIprPerson.setName(updateMatchCasePersonDTO.getName());
  93. newIprPerson.setEmail(email);
  94. newIprPerson.setType(type);
  95. newIprPerson.setAssoAccountId(assoAccountId);
  96. newIprPerson.setRemark(remark);
  97. newIprPerson.setIfDefault(false);
  98. newIprPerson.setCreateId(personId);
  99. newIprPerson.setTenantId(tenantId);
  100. newIprPerson.insert();
  101. iprPersonId = newIprPerson.getId();
  102. }
  103. } else {
  104. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "邮箱不能为空");
  105. }
  106. updateMatchCasePersonDTO.setName(name);
  107. updateMatchCasePersonDTO.setType(type);
  108. updateMatchCasePersonDTO.setIprPersonId(iprPersonId);
  109. MatchCasePerson matchCasePerson = this.addMatchCasePersonDB(updateMatchCasePersonDTO, assoId);
  110. if (type != null) {
  111. this.updateReport(updateMatchCasePersonDTO.getReportId(), type);
  112. }
  113. MatchCasePerson matchCasePerson = this.addMatchCasePersonDB(updateMatchCasePersonDTO);
  114. sendReportMailService.sendMatchCasePersonMail(matchCasePerson.getProjectId(), name, email);
  115. return matchCasePerson.getId();
  116. }
  117. public void updateReport(Integer projectId, Integer type) {
  118. if (type != null) {
  119. LambdaQueryWrapper<MatchCasePerson> queryWrapper1 = new LambdaQueryWrapper<>();
  120. queryWrapper1.eq(MatchCasePerson::getProjectId, projectId)
  121. .eq(MatchCasePerson::getType, type);
  122. List<MatchCasePerson> matchCasePersons = this.list(queryWrapper1);
  123. String resultName = Optional.ofNullable(matchCasePersons)
  124. .orElse(Collections.emptyList())// 空值安全处理
  125. .stream()
  126. .map(person -> {
  127. IprPerson iprPerson = iprPersonService.getById(person.getIprPersonId());
  128. return (iprPerson != null && iprPerson.getName() != null) ? iprPerson.getName() : "";
  129. }) //对象转换
  130. .filter(name -> !name.isEmpty()) // 过滤无效数据
  131. .collect(Collectors.joining("、")); // 只能拼接
  132. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  133. queryWrapper.eq(ReportProject::getProjectId, projectId);
  134. ReportProject reportProject = reportProjectService.getOne(queryWrapper,false);
  135. if (reportProject != null) {
  136. if (type.equals(2)) { // 代理所
  137. Integer actType = reportProject.getActType();
  138. //主动类型 请求人代理所
  139. if (actType != null && actType.equals(1)) {
  140. reportProject.setApplicantAgency(resultName);
  141. } else if (actType != null && actType.equals(0)) {//被动类型 专利权人代理所
  142. reportProject.setRightHolderAgency(resultName);
  143. }
  144. } else if (type.equals(1)) { // 内部ipr
  145. reportProject.setActualPerson(resultName);
  146. }
  147. reportProject.updateById();
  148. }
  149. }
  150. }
  151. public MatchCasePerson addMatchCasePersonDB(UpdateMatchCasePersonDTO updateMatchCasePersonDTO, Integer assoId) {
  152. MatchCasePerson matchCasePerson = new MatchCasePerson();
  153. PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  154. String personId = personnelVO.getId();
  155. Integer tenantId = personnelVO.getTenantId();
  156. Integer id = updateMatchCasePersonDTO.getId();
  157. Integer assoAccountId = updateMatchCasePersonDTO.getAssoAccountId();
  158. Integer type = updateMatchCasePersonDTO.getType();
  159. Integer iprPersonId = updateMatchCasePersonDTO.getIprPersonId();
  160. LambdaQueryWrapper<MatchCasePerson> queryWrapper = new LambdaQueryWrapper<>();
  161. queryWrapper.eq(MatchCasePerson::getIprPersonId, iprPersonId);
  162. queryWrapper.eq(MatchCasePerson::getProjectId, updateMatchCasePersonDTO.getReportId());
  163. queryWrapper.eq(MatchCasePerson::getType, type);
  164. if (id != null) {
  165. queryWrapper.ne(MatchCasePerson::getId, id);
  166. }
  167. List<MatchCasePerson> matchCasePeople = this.list(queryWrapper);
  168. if (matchCasePeople != null && !matchCasePeople.isEmpty()) {
  169. String entityType = type.equals(2) ? "代理所" : "IPR";
  170. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "该" + entityType + "已配案");
  171. }
  172. if (id != null) {
  173. matchCasePerson = this.getById(id);
  174. if (matchCasePerson != null) {
  175. matchCasePerson.setIprPersonId(updateMatchCasePersonDTO.getIprPersonId());
  176. matchCasePerson.updateById();
  177. if (assoId != null) {
  178. // LambdaQueryWrapper<AssoProjectPerson> assoProjectPersonLambdaQueryWrapper = new LambdaQueryWrapper<>();
  179. // assoProjectPersonLambdaQueryWrapper.eq(AssoProjectPerson::getProjectId, updateMatchCasePersonDTO.getReportId())
  180. // .eq(AssoProjectPerson::getRole, 1)
  181. // .eq(AssoProjectPerson::getPersonId, assoId);
  182. // assoProjectPersonService.remove(assoProjectPersonLambdaQueryWrapper);
  183. }
  184. }
  185. } else {
  186. matchCasePerson.setProjectId(updateMatchCasePersonDTO.getReportId());
  187. matchCasePerson.setIprPersonId(updateMatchCasePersonDTO.getIprPersonId());
  188. matchCasePerson.setCreateId(personId);
  189. matchCasePerson.setTenantId(tenantId);
  190. matchCasePerson.setType(updateMatchCasePersonDTO.getType());
  191. matchCasePerson.setId(null);
  192. matchCasePerson.insert();
  193. }
  194. if (assoAccountId != null) {
  195. LambdaQueryWrapper<AssoProjectPerson> queryWrapper1 = new LambdaQueryWrapper<>();
  196. queryWrapper1.eq(AssoProjectPerson::getProjectId, updateMatchCasePersonDTO.getReportId());
  197. queryWrapper1.eq(AssoProjectPerson::getRole, 1);
  198. queryWrapper1.eq(AssoProjectPerson::getPersonId, assoAccountId);
  199. List<AssoProjectPerson> assoProjectPersons = assoProjectPersonService.list(queryWrapper1);
  200. if (assoProjectPersons == null || assoProjectPersons.isEmpty()) {
  201. AssoProjectPerson assoProjectPerson = new AssoProjectPerson();
  202. assoProjectPerson.setRole(1);
  203. assoProjectPerson.setProjectId(updateMatchCasePersonDTO.getReportId());
  204. assoProjectPerson.setPersonId(String.valueOf(assoAccountId));
  205. assoProjectPerson.setCreateId(personId);
  206. assoProjectPerson.insert();
  207. }
  208. }
  209. return matchCasePerson;
  210. }
  211. public List<QueryMatchCasePersonVO> getReportMatchCasePerson(QueryMatchCasePersonDTO queryMatchCasePersonDTO) {
  212. Integer reportId = queryMatchCasePersonDTO.getReportId();
  213. Integer type = queryMatchCasePersonDTO.getType();
  214. List<QueryMatchCasePersonVO> queryMatchCasePersonVOS = new ArrayList<>();
  215. LambdaQueryWrapper<MatchCasePerson> queryWrapper = new LambdaQueryWrapper<>();
  216. queryWrapper.eq(MatchCasePerson::getProjectId, reportId);
  217. if (type != null) {
  218. queryWrapper.eq(MatchCasePerson::getType, type);
  219. }
  220. List<MatchCasePerson> matchCasePersons = this.list(queryWrapper);
  221. if (matchCasePersons != null && !matchCasePersons.isEmpty()) {
  222. for (MatchCasePerson matchCasePerson : matchCasePersons) {
  223. QueryMatchCasePersonVO queryMatchCasePersonVO = new QueryMatchCasePersonVO();
  224. BeanUtils.copyProperties(matchCasePerson, queryMatchCasePersonVO);
  225. queryMatchCasePersonVO.setReportId(matchCasePerson.getProjectId());
  226. Integer iprPersonId = matchCasePerson.getIprPersonId();
  227. IprPerson iprPerson = iprPersonService.getById(iprPersonId);
  228. if (iprPerson != null) {
  229. queryMatchCasePersonVO.setName(iprPerson.getName());
  230. queryMatchCasePersonVO.setEmail(iprPerson.getEmail());
  231. queryMatchCasePersonVO.setAssoAccountId(iprPerson.getAssoAccountId());
  232. queryMatchCasePersonVO.setRemark(iprPerson.getRemark());
  233. }
  234. queryMatchCasePersonVOS.add(queryMatchCasePersonVO);
  235. }
  236. this.loadQueryMatchCasePersonVOS(queryMatchCasePersonVOS);
  237. }
  238. return queryMatchCasePersonVOS;
  239. }
  240. public void loadQueryMatchCasePersonVOS(List<QueryMatchCasePersonVO> queryMatchCasePersonVOS) {
  241. List<String> personIds = new ArrayList<>();
  242. List<Personnel> personnels = new ArrayList<>();
  243. List<String> createIds = queryMatchCasePersonVOS.stream()
  244. .map(QueryMatchCasePersonVO::getCreateId)
  245. .collect(Collectors.toList());
  246. personIds.addAll(createIds);
  247. List<String> assoAccountStrIds = queryMatchCasePersonVOS.stream()
  248. .map(QueryMatchCasePersonVO::getAssoAccountId)//提取Integer
  249. .filter(Objects::nonNull)//过滤null值
  250. .map(String::valueOf)//转换为String
  251. .collect(Collectors.toList());
  252. personIds.addAll(assoAccountStrIds);
  253. if (!CollectionUtils.isEmpty(personIds)) {
  254. try {
  255. String res = permissionService.getPersonnelByIdsFromPCS(personIds);
  256. JSONObject jsonObject = JSON.parseObject(res);
  257. personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
  258. } catch (Exception e) {
  259. throw new XiaoShiException(ExceptionEnum.BUSINESS_ERROR, "人员查询错误");
  260. }
  261. }
  262. for (QueryMatchCasePersonVO queryMatchCasePersonVO : queryMatchCasePersonVOS) {
  263. Personnel personnel = personnels.stream().filter(item -> item.getId().equals(queryMatchCasePersonVO.getCreateId())).findFirst().orElse(null);
  264. if (personnel != null) {
  265. queryMatchCasePersonVO.setCreateName(personnel.getPersonnelName());
  266. }
  267. Personnel assoAccount = personnels.stream()
  268. .filter(item -> {
  269. // 获取Integer类型的关联id
  270. Integer targetId = queryMatchCasePersonVO.getAssoAccountId();
  271. // 当目标id为空时 直接跳过匹配
  272. if (targetId == null) return false;
  273. // 将Integer转换为String进行比较
  274. return String.valueOf(targetId).equals(item.getId());
  275. })
  276. .findFirst()
  277. .orElse(null);
  278. if (assoAccount != null) {
  279. queryMatchCasePersonVO.setAccountName(assoAccount.getPersonnelName());
  280. queryMatchCasePersonVO.setAccountUserName(assoAccount.getPersonnelUserName());
  281. }
  282. }
  283. }
  284. public Boolean isValidEmail(String email) {
  285. if ((email != null) && (!email.isEmpty())) {
  286. return Pattern.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$", email);
  287. }
  288. return false;
  289. }
  290. public void delete(List<Integer> ids) {
  291. if (ids != null && !ids.isEmpty()) {
  292. LambdaQueryWrapper<MatchCasePerson> queryWrapper = new LambdaQueryWrapper<>();
  293. queryWrapper.in(MatchCasePerson::getId, ids);
  294. List<MatchCasePerson> matchCasePeople = this.list(queryWrapper);
  295. this.removeBatchByIds(ids);
  296. List<Integer> assoIds = new ArrayList<>();
  297. Integer projectId = null;
  298. for (MatchCasePerson matchCasePerson : matchCasePeople) {
  299. Integer iprPersonId = matchCasePerson.getIprPersonId();
  300. Integer type = matchCasePerson.getType();
  301. projectId = matchCasePerson.getProjectId();
  302. IprPerson iprPerson = iprPersonService.getById(iprPersonId);
  303. Integer assoId = iprPerson.getAssoAccountId();
  304. if (assoId != null) {
  305. assoIds.add(assoId);
  306. // //assoId取消关联
  307. // LambdaQueryWrapper<AssoProjectPerson> assoProjectPersonLambdaQueryWrapper = new LambdaQueryWrapper<>();
  308. // assoProjectPersonLambdaQueryWrapper.eq(AssoProjectPerson::getProjectId, projectId)
  309. // .eq(AssoProjectPerson::getRole, 1)
  310. // .eq(AssoProjectPerson::getPersonId, assoId);
  311. // assoProjectPersonService.remove(assoProjectPersonLambdaQueryWrapper);
  312. }
  313. this.updateReport(projectId, type);
  314. }
  315. }
  316. }
  317. public void cancelConnect() {
  318. }
  319. public void deleteByIprIds(List<Integer> iprPersonIds) {
  320. LambdaQueryWrapper<MatchCasePerson> queryWrapper = new LambdaQueryWrapper<>();
  321. queryWrapper.in(MatchCasePerson::getIprPersonId, iprPersonIds);
  322. this.remove(queryWrapper);
  323. }
  324. }