package com.goafanti.achievement.service.impl; import java.math.BigDecimal; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.goafanti.achievement.bo.AchievementImportBo; import com.goafanti.achievement.bo.AchievementListBo; import com.goafanti.achievement.bo.AchievementOrgOwnerDetailBo; import com.goafanti.achievement.bo.AchievementPartnerListBo; import com.goafanti.achievement.bo.AchievementUserOwnerDetailBo; import com.goafanti.achievement.service.AchievementService; import com.goafanti.common.constant.AFTConstants; import com.goafanti.common.dao.AchievementDemandCountMapper; import com.goafanti.common.dao.AchievementDemandMapper; import com.goafanti.common.dao.AchievementKeywordMapper; import com.goafanti.common.dao.AchievementMapper; import com.goafanti.common.dao.DemandKeywordMapper; import com.goafanti.common.dao.NoticeMapper; import com.goafanti.common.dao.OrganizationIdentityMapper; import com.goafanti.common.dao.UserIdentityMapper; import com.goafanti.common.dao.UserRoleMapper; import com.goafanti.common.enums.AchievementAuditStatus; import com.goafanti.common.enums.AchievementReleaseStatus; import com.goafanti.common.enums.AchievementSwitchSign; import com.goafanti.common.enums.DeleteStatus; import com.goafanti.common.enums.DemandAuditStatus; import com.goafanti.common.enums.DemandReleaseStatus; import com.goafanti.common.enums.NoticeReadStatus; import com.goafanti.common.enums.NoticeStatus; import com.goafanti.common.enums.UserType; import com.goafanti.common.model.Achievement; import com.goafanti.common.model.AchievementDemand; import com.goafanti.common.model.AchievementDemandCount; import com.goafanti.common.model.AchievementKeyword; import com.goafanti.common.model.Admin; import com.goafanti.common.model.Notice; import com.goafanti.common.model.OrganizationIdentity; import com.goafanti.common.model.UserIdentity; import com.goafanti.common.utils.DateUtils; import com.goafanti.common.utils.LoggerUtils; import com.goafanti.core.mybatis.BaseMybatisDao; import com.goafanti.core.mybatis.page.Pagination; import com.goafanti.core.shiro.token.TokenManager; import com.goafanti.demand.bo.DemandAchievementListBo; import com.goafanti.portal.bo.AchievementDetailBo; import com.goafanti.portal.bo.AchievementPortalDetailBo; import com.goafanti.portal.bo.AchievementPortalSimilarListBo; import com.goafanti.portal.bo.AchievementSearchListBo; import com.goafanti.portal.bo.InternationalListBo; @Service public class AchievementServiceImpl extends BaseMybatisDao implements AchievementService { @Autowired private AchievementMapper achievementMapper; @Autowired private UserRoleMapper userRoleMapper; @Autowired private NoticeMapper noticeMapper; @Autowired private AchievementKeywordMapper achievementKeywordMapper; @Autowired private AchievementDemandMapper achievementDemandMapper; @Autowired private DemandKeywordMapper demandKeywordMapper; @Autowired private AchievementDemandCountMapper achievementDemandCountMapper; @Autowired private UserIdentityMapper userIdentityMapper; @Autowired private OrganizationIdentityMapper organizationIdentityMapper; private static final Logger logger = LoggerFactory.getLogger(AchievementServiceImpl.class); @SuppressWarnings("unchecked") @Override public Pagination listUserOwnerAchievement(String username, String ownerName, String ownerId, Integer auditStatus, Integer serialNumber, String name, String keyword, Integer category, Integer status, String releaseDateStartDate, String releaseDateEndDate, Integer releaseStatus, Integer pNo, Integer pSize) { if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findUserOwnerAchievementListByPage", "findUserOwnerAchievementCount", disposeParams(username, ownerName, ownerId, auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus, UserType.PERSONAL.getCode()), pNo, pSize); } @SuppressWarnings("unchecked") @Override public Pagination listOrgOwnerAchievement(String unitName, String ownerName, String ownerId, Integer auditStatus, Integer serialNumber, String name, String keyword, Integer category, Integer status, String releaseDateStartDate, String releaseDateEndDate, Integer releaseStatus, Integer pNo, Integer pSize) { if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findOrgOwnerAchievementListByPage", "findOrgOwnerAchievementCount", disposeParams(unitName, ownerName, ownerId, auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus, UserType.ORGANIZATION.getCode()), pNo, pSize); } @Override public void saveAchievement(Achievement a, String[] keywords) { a.setId(UUID.randomUUID().toString()); a.setDeletedSign(DeleteStatus.UNDELETE.getCode()); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); if (TokenManager.getToken() instanceof Admin) { a.setTechBrokerId(TokenManager.getAdminId()); } a.setReleaseStatus(AchievementReleaseStatus.UNRELEASE.getCode()); if (AchievementAuditStatus.SUBMIT.getCode().equals(a.getAuditStatus())) { a.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); createAuditorNotice(a); } else { a.setAuditStatus(AchievementAuditStatus.CREATE.getCode()); } a.setCreateTime(now.getTime()); achievementMapper.insert(a); disposeAchievementKeyword(keywords, a, false); } @Override public int updateAchievement(Achievement a, String[] keywords, Integer switchSign) { if (AchievementAuditStatus.SUBMIT.getCode().equals(a.getAuditStatus())) { a.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); createAuditorNotice(a); } disposeAchievementKeyword(keywords, a, true); achievementMapper.updateByPrimaryKeySelective(a); if (null != switchSign && AchievementSwitchSign.CLOSE.getCode().equals(switchSign)) { achievementMapper.updateOwnerId(a.getId()); } return 1; } @Override public Achievement selectByPrimaryKey(String id) { return achievementMapper.selectByPrimaryKey(id); } @Override public int deleteByPrimaryKey(List id) { achievementKeywordMapper.batchDeleteByAchievementIds(id); achievementDemandMapper.batchDeleteByAchievementIds(id); for (String s : id) { Achievement a = achievementMapper.selectByPrimaryKey(s); if (null != a && AchievementAuditStatus.AUDITED.getCode().equals(a.getAuditStatus()) && StringUtils.isNotBlank(a.getOwnerId())) { AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(a.getOwnerId()); if (null != adc) { adc.setAchievementCount(adc.getAchievementCount() - 1); if (adc.getAchievementCount() < 0) { adc.setAchievementCount(0); } achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } } return achievementMapper.batchDeleteByPrimaryKey(id); } @SuppressWarnings("unchecked") @Override public Pagination listUserAchievement(Integer auditStatus, Integer serialNumber, String name, String keyword, Integer category, Integer ownerType, Integer status, String releaseDateStartDate, String releaseDateEndDate, Integer releaseStatus, Integer pNo, Integer pSize) { if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findAchievementListByPage", "findAchievementCount", disposeParams(null, null, TokenManager.getUserId(), auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus, null), pNo, pSize); } private Map disposeParams(String username, String ownerName, String ownerId, Integer auditStatus, Integer serialNumber, String name, String keyword, Integer category, Integer status, String releaseDateStartDate, String releaseDateEndDate, Integer releaseStatus, Integer type) { Map params = new HashMap<>(); Date rStart = null; Date rEnd = null; if (!StringUtils.isBlank(releaseDateStartDate)) { try { rStart = DateUtils.parseDate(releaseDateStartDate, AFTConstants.YYYYMMDD); } catch (ParseException e) { } } if (!StringUtils.isBlank(releaseDateEndDate)) { try { rEnd = DateUtils.addDays(DateUtils.parseDate(releaseDateEndDate, AFTConstants.YYYYMMDD), 1); } catch (ParseException e) { } } if (StringUtils.isNotBlank(ownerName)) { params.put("ownerName", ownerName); } if (null != type && StringUtils.isNotBlank(username)) { if (UserType.PERSONAL.getCode().equals(type) ) { params.put("username", username); } else { params.put("unitName", username); } } if (null != rStart) { params.put("rStart", rStart); } if (null != rEnd) { params.put("rEnd", rEnd); } if (null != auditStatus) { params.put("auditStatus", auditStatus); } if (!StringUtils.isBlank(ownerId)) { params.put("ownerId", ownerId); } if (null != serialNumber) { params.put("serialNumber", serialNumber); } if (!StringUtils.isBlank(name)) { params.put("name", name); } if (!StringUtils.isBlank(keyword)) { params.put("keyword", keyword); } if (null != category) { params.put("category", category); } if (null != status) { params.put("status", status); } if (null != releaseStatus) { params.put("releaseStatus", releaseStatus); } if (TokenManager.hasRole(AFTConstants.TECHBROKER)) { params.put("techBrokerId", TokenManager.getAdminId()); } return params; } @Override public int updateAuditAchievement(Achievement a, String techBroderId, Integer auditStatus) { a.setAuditStatus(auditStatus); if (AchievementAuditStatus.AUDITED.getCode().equals(auditStatus)) { Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); a.setReleaseDate(now.getTime()); a.setReleaseStatus(DemandReleaseStatus.RELEASED.getCode()); a.setTechBrokerId(techBroderId); if (StringUtils.isNotBlank(a.getKeyword())) { String[] keywords = a.getKeyword().trim().split(",|,"); disposeAchievementKeyword(keywords, a, false); } String ownerId = a.getOwnerId(); if (StringUtils.isNotBlank(ownerId)) { if (UserType.PERSONAL.getCode().equals(a.getOwnerType())) { UserIdentity ui = userIdentityMapper.selectUserIdentityByUserId(ownerId); if (null != ui) { a.setOwnerName(ui.getUsername()); } } else if (UserType.ORGANIZATION.getCode().equals(a.getOwnerType())) { OrganizationIdentity oi = organizationIdentityMapper.selectOrgIdentityByUserId(ownerId); if (null != oi) { a.setOwnerName(oi.getUnitName()); } } AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(ownerId); if (null == adc) { AchievementDemandCount achievementDemandCount = new AchievementDemandCount(); achievementDemandCount.setId(UUID.randomUUID().toString()); achievementDemandCount.setUid(ownerId); achievementDemandCount.setAchievementCount(AFTConstants.ACHIEVEMENT_DEMAND_FIRST_COUNT); achievementDemandCount.setDemandCount(AFTConstants.ACHIEVEMENT_DEMAND_INIT_COUNT); achievementDemandCountMapper.insert(achievementDemandCount); } else { adc.setAchievementCount(adc.getAchievementCount() + 1); achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } } else { a.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); } createTechBorkerNotice(a); return achievementMapper.updateByPrimaryKeySelective(a); } @Override public int updateReleaseStatus(Achievement a) { a.setAuditStatus(AchievementAuditStatus.CREATE.getCode()); a.setReleaseStatus(AchievementReleaseStatus.UNRELEASE.getCode()); achievementDemandMapper.deleteByAchievementId(a.getId()); achievementKeywordMapper.batchDeleteByAchievementId(a.getId()); achievementMapper.updateByPrimaryKeySelective(a); if (StringUtils.isNotBlank(a.getOwnerId())) { AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(a.getOwnerId()); if (null != adc) { adc.setAchievementCount(adc.getAchievementCount() - 1); if (adc.getAchievementCount() < 0) { adc.setAchievementCount(0); } achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } return achievementMapper.updateReleaseDate(a.getId()); } @Override public AchievementUserOwnerDetailBo selectUserOwnerDetail(String id) { return achievementMapper.selectUserOwnerDetail(id); } @Override public AchievementOrgOwnerDetailBo selectOrgOwnerDetail(String id) { return achievementMapper.selectOrgOwnerDetail(id); } @Override public List selectAchievementDemandListByAchievementId(String id) { return achievementDemandMapper.selectAchievementDemandListByAchievementId(id); } @Override public void insertImport(List data) { if (null == data || data.isEmpty()) { return; } Achievement a = null; AchievementKeyword ak = null; List achievementList = new ArrayList<>(); List AchievementKeywordList = new ArrayList<>(); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); for (AchievementImportBo bo : data) { a = new Achievement(); BeanUtils.copyProperties(bo, a); a.setId(UUID.randomUUID().toString()); a.setDeletedSign(DeleteStatus.UNDELETE.getCode()); a.setCreateTime(now.getTime()); a.setAuditStatus(AchievementAuditStatus.INAUDIT.getCode()); a.setReleaseStatus(AchievementReleaseStatus.UNRELEASE.getCode()); List keywordsList = bo.getKeywords(); if (null != keywordsList && keywordsList.size() > 0) { for (String s : keywordsList) { if (!StringUtils.isBlank(s)) { ak = new AchievementKeyword(); ak.setAchievementId(a.getId()); ak.setKeyword(s.trim()); ak.setId(UUID.randomUUID().toString()); AchievementKeywordList.add(ak); } } } achievementList.add(a); } achievementMapper.insertBatch(achievementList); achievementKeywordMapper.insertBatch(AchievementKeywordList); } @SuppressWarnings("unchecked") @Override public Pagination listAchievementSearchList(Integer bargainingMode, Integer category, Integer maturity, BigDecimal transferPriceLower, BigDecimal transferPriceUpper, Integer transferMode, String keyword, Integer fieldA, Integer fieldB, Integer pNo, Integer pSize) { Map params = new HashMap<>(); if (!StringUtils.isBlank(keyword)) { params.put("keyword", keyword); } if (null != bargainingMode) { params.put("bargainingMode", bargainingMode); } if (null != category) { params.put("category", category); } if (null != maturity) { params.put("maturity", maturity); } if (null != transferPriceLower) { params.put("transferPriceLower", transferPriceLower); } if (null != transferPriceUpper) { params.put("transferPriceUpper", transferPriceUpper); } if (null != transferMode) { params.put("transferMode", transferMode); } if (null != fieldA) { params.put("fieldA", fieldA); } if (null != fieldB) { params.put("fieldB", fieldB); } if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 20) { pSize = 20; } return (Pagination) findPage("findSearchAchievementListByPage", "findSearchAchievementCount", params, pNo, pSize); } @Override public AchievementDetailBo selectAchievementSearchDetail(String uid, String id) { return achievementMapper.selectAchievementSearchDetail(uid, id); } private void createTechBorkerNotice(Achievement a) { noticeMapper.insert(disposeNotice(a, null)); } // 给所有审核员发送审核通知 private void createAuditorNotice(Achievement a) { List ids = userRoleMapper.listAuditor(); List list = new ArrayList<>(); if (null != ids && ids.size() > 0) { for (String s : ids) { list.add(disposeNotice(a, s)); } noticeMapper.insertBatch(list); } } private Notice disposeNotice(Achievement a, String aid) { Notice n = new Notice(); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); n.setId(UUID.randomUUID().toString()); n.setCreateTime(now.getTime()); n.setReaded(NoticeReadStatus.UNREAD.getCode()); n.setRid(a.getId()); if (StringUtils.isBlank(aid)) { n.setAid(a.getTechBrokerId()); if (UserType.PERSONAL.getCode().equals(a.getOwnerType())) { n.setContent("编号" + a.getSerialNumber() + NoticeStatus.PERSONALACHIEVEMENTT.getDesc() + " " + (AchievementAuditStatus.AUDITED.getCode().equals(a.getAuditStatus()) ? AchievementAuditStatus.AUDITED.getDesc() : AchievementAuditStatus.UNAUDITED.getDesc())); n.setNoticeType(NoticeStatus.PERSONALACHIEVEMENTT.getCode()); } else if (UserType.ORGANIZATION.getCode().equals(a.getOwnerType())) { n.setContent("编号" + a.getSerialNumber() + NoticeStatus.ORGANIZATIONACHIEVEMENT.getDesc() + " " + (AchievementAuditStatus.AUDITED.getCode().equals(a.getAuditStatus()) ? AchievementAuditStatus.AUDITED.getDesc() : AchievementAuditStatus.UNAUDITED.getDesc())); n.setNoticeType(NoticeStatus.ORGANIZATIONACHIEVEMENT.getCode()); } } else { n.setAid(aid); if (UserType.PERSONAL.getCode().equals(a.getOwnerType())) { n.setContent( NoticeStatus.PERSONALACHIEVEMENTT.getDesc() + " " + AchievementAuditStatus.SUBMIT.getDesc()); n.setNoticeType(NoticeStatus.PERSONALACHIEVEMENTT.getCode()); } else if (UserType.ORGANIZATION.getCode().equals(a.getOwnerType())) { n.setContent( NoticeStatus.ORGANIZATIONACHIEVEMENT.getDesc() + " " + AchievementAuditStatus.SUBMIT.getDesc()); n.setNoticeType(NoticeStatus.ORGANIZATIONACHIEVEMENT.getCode()); } } return n; } private void disposeAchievementKeyword(String[] keywords, Achievement a, boolean delete) { if (null != keywords && keywords.length > 0) { if (delete) { achievementKeywordMapper.batchDeleteByAchievementId(a.getId()); } List list = new ArrayList<>(); AchievementKeyword ak = null; for (int i = 0; i < keywords.length; i++) { ak = new AchievementKeyword(); ak.setId(UUID.randomUUID().toString()); ak.setAchievementId(a.getId()); ak.setKeyword(keywords[i].trim()); list.add(ak); } achievementKeywordMapper.insertBatch(list); } } @Override public int updateMatchDemand(Achievement a) { achievementDemandMapper.deleteByAchievementId(a.getId());// 删除之前匹配单 List achievement = achievementKeywordMapper.selectKeywordsByAchievementId(a.getId()); if (null != achievement && achievement.size() > 0) { List keyword = new ArrayList<>(); for (AchievementKeyword k : achievement) { if (!StringUtils.isBlank(k.getKeyword())) { keyword.add(k.getKeyword()); } } List list = demandKeywordMapper.selectAchievementDemand(keyword); if (null != list && list.size() > 0) { for (AchievementDemand ad : list) { ad.setAchievementId(a.getId()); } return achievementDemandMapper.insertBatch(list); } } return 0; } @SuppressWarnings("unchecked") @Override public Pagination listPartnerAchievement(String ownerId, Integer pNo, Integer pSize) { Map params = new HashMap<>(); params.put("ownerId", ownerId); if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findPartnerAchievementListByPage", "findPartnerAchievementCount", params, pNo, pSize); } @Override public AchievementPortalDetailBo findUserPortalAchievementDetail(String id) { return achievementMapper.findUserPortalAchievementDetail(id, TokenManager.getUserId()); } @Override public AchievementPortalDetailBo findOrgPortalAchievementDetail(String id) { return achievementMapper.findOrgPortalAchievementDetail(id, TokenManager.getUserId()); } @Override public List findByFieldA(Integer fieldA, String id, Integer type) { if (UserType.PERSONAL.getCode().equals(type)) { return achievementMapper.findUserPortalSimilarByFieldA(fieldA, id); } else if (UserType.ORGANIZATION.getCode().equals(type)) { return achievementMapper.findOrgPortalSimilarByFieldA(fieldA, id); } return null; } @Override public int updateByPrimaryKeySelective(Achievement a) { return achievementMapper.updateByPrimaryKey(a); } @Override @Cacheable(value = "internationalAchievementList", key = "'internationalAchievementList:'+#internationalAchievementCacheKey") public List selectInternationalAchievement(Integer internationalAchievementCacheKey) { return achievementMapper.selectInternationalAchievement(); } @CacheEvict(value = "internationalAchievementList", allEntries = true) public void cleanInternationalAchievement() { LoggerUtils.debug(logger, "清除国际化技术列表"); } }