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.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; 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.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; @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; @SuppressWarnings("unchecked") @Override public Pagination listUserOwnerAchievement(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(ownerId, auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus), pNo, pSize); } @SuppressWarnings("unchecked") @Override public Pagination listOrgOwnerAchievement(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(ownerId, auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus), 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 && 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(TokenManager.getUserId(), auditStatus, serialNumber, name, keyword, category, status, releaseDateStartDate, releaseDateEndDate, releaseStatus), pNo, pSize); } private Map disposeParams(String ownerId, Integer auditStatus, Integer serialNumber, String name, String keyword, Integer category, Integer status, String releaseDateStartDate, String releaseDateEndDate, Integer releaseStatus) { 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 (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); 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; } }