package com.goafanti.demand.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.AchievementDemandListBo; 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.DemandKeywordMapper; import com.goafanti.common.dao.DemandMapper; import com.goafanti.common.dao.NoticeMapper; import com.goafanti.common.dao.OrganizationIdentityMapper; import com.goafanti.common.dao.UserIdentityMapper; import com.goafanti.common.dao.UserMapper; import com.goafanti.common.dao.UserRoleMapper; import com.goafanti.common.enums.DeleteStatus; import com.goafanti.common.enums.DemandAuditStatus; import com.goafanti.common.enums.DemandInfoSourceStatus; import com.goafanti.common.enums.DemandPortalSearchSignType; import com.goafanti.common.enums.DemandReleaseStatus; import com.goafanti.common.enums.DemandStatus; import com.goafanti.common.enums.DemandSwitchSign; import com.goafanti.common.enums.NoticeReadStatus; import com.goafanti.common.enums.NoticeStatus; import com.goafanti.common.enums.UserType; import com.goafanti.common.model.AchievementDemand; import com.goafanti.common.model.AchievementDemandCount; import com.goafanti.common.model.Demand; import com.goafanti.common.model.DemandKeyword; import com.goafanti.common.model.Notice; import com.goafanti.common.model.OrganizationIdentity; import com.goafanti.common.model.User; 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.DemandImportBo; import com.goafanti.demand.bo.DemandListBo; import com.goafanti.demand.bo.DemandManageDetailBo; import com.goafanti.demand.bo.DemandManageListBo; import com.goafanti.demand.bo.DemandPartnerListBo; import com.goafanti.demand.service.DemandService; import com.goafanti.portal.bo.DemandPortalDetailBo; import com.goafanti.portal.bo.DemandPortalSimilarListBo; import com.goafanti.portal.bo.DemandSearchDetailBo; import com.goafanti.portal.bo.DemandSearchListBo; @Service public class DemandServiceImpl extends BaseMybatisDao implements DemandService { @Autowired private DemandMapper demandMapper; @Autowired private UserMapper userMapper; @Autowired private UserRoleMapper userRoleMapper; @Autowired private NoticeMapper noticeMapper; @Autowired private DemandKeywordMapper demandKeywordMapper; @Autowired private AchievementDemandMapper achievementDemandMapper; @Autowired private AchievementKeywordMapper achievementKeywordMapper; @Autowired private AchievementDemandCountMapper achievementDemandCountMapper; @Autowired private UserIdentityMapper userIdentityMapper; @Autowired private OrganizationIdentityMapper organizationIdentityMapper; @SuppressWarnings("unchecked") @Override public Pagination selectUserDemandManageList(String employerName, Integer auditStatus, Integer province, Integer serialNumber, String name, String keyword, Integer infoSources, Integer demandType, String validityPeriodStartDate, String validityPeriodEndDate, String username, Integer status, Integer releaseStatus, String releaseDateStartDate, String releaseDateEndDate, Integer pNo, Integer pSize) { Map params = disposeParams(auditStatus, province, serialNumber, name, keyword, infoSources, demandType, validityPeriodStartDate, validityPeriodEndDate, username, status, releaseStatus, releaseDateStartDate, releaseDateEndDate); if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } /* * if (TokenManager.hasRole(AFTConstants.SALESMANAGERADMIN) || * TokenManager.hasRole(AFTConstants.SALESMANADMIN)) { * params.put("principal", TokenManager.getAdminId()); } * * if (TokenManager.hasRole(AFTConstants.MANAGERADMIN)) { * params.put("mid", TokenManager.getAdminId()); } * * if (TokenManager.hasRole(AFTConstants.TECHBROKER)) { * params.put("techBroker", TokenManager.getAdminId()); } */ if (!TokenManager.hasRole(AFTConstants.SUPERADMIN) && !TokenManager.hasRole(AFTConstants.AUDITORADMIN)) { params.put("adminId", TokenManager.getAdminId()); } if (StringUtils.isNotBlank(employerName)) { params.put("employerName", employerName); } if (StringUtils.isNotBlank(username)) { params.put("username", username); } return (Pagination) findPage("findManageUserDemandListByPage", "findManageUserDemandCount", params, pNo, pSize); } @SuppressWarnings("unchecked") @Override public Pagination selectOrgDemandManageList(String employerName, Integer auditStatus, Integer province, Integer serialNumber, String name, String keyword, Integer infoSources, Integer demandType, String validityPeriodStartDate, String validityPeriodEndDate, String username, Integer status, Integer releaseStatus, String releaseDateStartDate, String releaseDateEndDate, Integer pNo, Integer pSize) { Map params = disposeParams(auditStatus, province, serialNumber, name, keyword, infoSources, demandType, validityPeriodStartDate, validityPeriodEndDate, username, status, releaseStatus, releaseDateStartDate, releaseDateEndDate); if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } /*if (TokenManager.hasRole(AFTConstants.SALESMANAGERADMIN) || TokenManager.hasRole(AFTConstants.SALESMANADMIN)) { params.put("principal", TokenManager.getAdminId()); } if (TokenManager.hasRole(AFTConstants.MANAGERADMIN)) { params.put("mid", TokenManager.getAdminId()); } if (TokenManager.hasRole(AFTConstants.TECHBROKER)) { params.put("techBroker", TokenManager.getAdminId()); }*/ if (!TokenManager.hasRole(AFTConstants.SUPERADMIN) && !TokenManager.hasRole(AFTConstants.AUDITORADMIN)) { params.put("adminId", TokenManager.getAdminId()); } if (StringUtils.isNotBlank(employerName)) { params.put("employerName", employerName); } if (StringUtils.isNotBlank(username)) { params.put("unitName", username); } return (Pagination) findPage("findManageOrgDemandListByPage", "findManageOrgDemandCount", params, pNo, pSize); } @Override public void saveUserDemand(Demand d, String validityPeriodFormattedDate, String[] keywords) { Date validityPeriod = null; if (!StringUtils.isBlank(validityPeriodFormattedDate)) { try { validityPeriod = DateUtils.parseDate(validityPeriodFormattedDate, AFTConstants.YYYYMMDD); } catch (ParseException e) { } } d.setValidityPeriod(validityPeriod); d.setId(UUID.randomUUID().toString()); d.setTechBrokerId(TokenManager.getAdminId()); d.setDeletedSign(DeleteStatus.UNDELETE.getCode()); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); d.setStatus(DemandStatus.UNRESOLVED.getCode()); d.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); d.setPrincipalId(TokenManager.getAdminId()); if (DemandAuditStatus.SUBMIT.getCode().equals(d.getAuditStatus())) { d.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); createAuditorNotice(d); } else { d.setAuditStatus(DemandAuditStatus.CREATE.getCode()); } d.setCreateTime(now.getTime()); demandMapper.insert(d); disposeDemandKeyword(keywords, d, false); } @Override public int updateUserDemand(Demand d, String validityPeriodFormattedDate, String[] keywords, Integer switchSign) { Date validityPeriod = null; if (!StringUtils.isBlank(validityPeriodFormattedDate)) { try { validityPeriod = DateUtils.parseDate(validityPeriodFormattedDate, AFTConstants.YYYYMMDD); } catch (ParseException e) { } } d.setValidityPeriod(validityPeriod); if (DemandAuditStatus.SUBMIT.getCode().equals(d.getAuditStatus())) { d.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); createAuditorNotice(d); } disposeDemandKeyword(keywords, d, true); demandMapper.updateByPrimaryKeySelective(d); if (null != switchSign && DemandSwitchSign.CLOSE.getCode().equals(switchSign)) { demandMapper.updateEmployerId(d.getId()); } return 1; } @Override public DemandManageDetailBo selectUserDemandDetail(String id) { return demandMapper.selectUserDemandDetail(id); } @Override public int deleteByPrimaryKey(List id) { demandKeywordMapper.batchDeleteByDemandIds(id); achievementDemandMapper.batchDeleteByDemandIds(id); for (String s : id) { Demand d = demandMapper.selectByPrimaryKey(s); if (null != d && DemandAuditStatus.AUDITED.getCode().equals(d.getAuditStatus()) && StringUtils.isNotBlank(d.getEmployerId())) { AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(d.getEmployerId()); if (null != adc) { adc.setDemandCount(adc.getDemandCount() - 1); if (adc.getDemandCount() < 0) { adc.setDemandCount(0); } achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } } return demandMapper.batchDeleteByPrimaryKey(id); } @Override public DemandManageDetailBo selectOrgDemandDetail(String id) { return demandMapper.selectOrgDemandDetail(id); } @Override public Demand selectByPrimaryKey(String id) { return demandMapper.selectByPrimaryKey(id); } @SuppressWarnings("unchecked") @Override public Pagination listDemand(Integer auditStatus, Integer serialNumber, String name, String keyword, Integer demandType, String validityPeriodStartDate, String validityPeriodEndDate, Integer status, Integer releaseStatus, String releaseDateStartDate, String releaseDateEndDate, Integer pNo, Integer pSize) { Map params = disposeParams(auditStatus, null, serialNumber, name, keyword, null, demandType, validityPeriodStartDate, validityPeriodEndDate, null, status, releaseStatus, releaseDateStartDate, releaseDateEndDate); params.put("employerId", TokenManager.getUserId()); if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0) { pSize = 10; } return (Pagination) findPage("findDemandListByPage", "findDemandCount", params, pNo, pSize); } @Override public int updateReleaseStatus(Demand d) { d.setAuditStatus(DemandAuditStatus.CREATE.getCode()); d.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); d.setStatus(DemandStatus.UNRESOLVED.getCode()); demandMapper.updateByPrimaryKeySelective(d); demandKeywordMapper.batchDeleteByDemandId(d.getId()); achievementDemandMapper.deleteByDemandId(d.getId()); if (StringUtils.isNotBlank(d.getEmployerId())) { AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(d.getEmployerId()); if (null != adc) { adc.setDemandCount(adc.getDemandCount() - 1); if (adc.getDemandCount() < 0) { adc.setDemandCount(0); } achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } return demandMapper.updateReleaseDate(d.getId()); } @Override public int updateAuditDemand(Demand d, String techBroderId, Integer auditStatus) { d.setAuditStatus(auditStatus); if (DemandAuditStatus.AUDITED.getCode().equals(auditStatus)) { Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); d.setReleaseDate(now.getTime()); d.setReleaseStatus(DemandReleaseStatus.RELEASED.getCode()); d.setTechBrokerId(techBroderId); if (StringUtils.isNotBlank(d.getKeyword())) { String[] keywords = d.getKeyword().trim().split(",|,"); disposeDemandKeyword(keywords, d, false); } String employerId = d.getEmployerId(); if (StringUtils.isNotBlank(employerId)) { if (UserType.PERSONAL.getCode().equals(d.getDataCategory())) { UserIdentity ui = userIdentityMapper.selectUserIdentityByUserId(employerId); if (null != ui) { d.setEmployerName(ui.getUsername()); } } else if (UserType.ORGANIZATION.getCode().equals(d.getDataCategory())) { OrganizationIdentity oi = organizationIdentityMapper.selectOrgIdentityByUserId(employerId); if (null != oi) { d.setEmployerName(oi.getUnitName()); } } AchievementDemandCount adc = achievementDemandCountMapper.selectByUid(employerId); if (null == adc) { AchievementDemandCount achievementDemandCount = new AchievementDemandCount(); achievementDemandCount.setId(UUID.randomUUID().toString()); achievementDemandCount.setUid(employerId); achievementDemandCount.setDemandCount(AFTConstants.ACHIEVEMENT_DEMAND_FIRST_COUNT); achievementDemandCount.setAchievementCount(AFTConstants.ACHIEVEMENT_DEMAND_INIT_COUNT); achievementDemandCountMapper.insert(achievementDemandCount); } else { adc.setDemandCount(adc.getDemandCount() + 1); achievementDemandCountMapper.updateByPrimaryKeySelective(adc); } } } else { d.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); } createTechBorkerNotice(d); return demandMapper.updateByPrimaryKeySelective(d); } @Override public void saveDemand(Demand d, String validityPeriodFormattedDate, String[] keywords) { Date validityPeriod = null; if (!StringUtils.isBlank(validityPeriodFormattedDate)) { try { validityPeriod = DateUtils.parseDate(validityPeriodFormattedDate, AFTConstants.YYYYMMDD); } catch (ParseException e) { } } d.setValidityPeriod(validityPeriod); d.setId(UUID.randomUUID().toString()); d.setDeletedSign(DeleteStatus.UNDELETE.getCode()); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); d.setStatus(DemandStatus.UNRESOLVED.getCode()); d.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); if (DemandAuditStatus.SUBMIT.getCode().equals(d.getAuditStatus())) { d.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); createAuditorNotice(d); } else { d.setAuditStatus(DemandAuditStatus.CREATE.getCode()); } d.setCreateTime(now.getTime()); demandMapper.insert(d); disposeDemandKeyword(keywords, d, false); } @Override public List selectAchievementDemandListByDemandId(String id) { return achievementDemandMapper.selectAchievementDemandListByDemandId(id); } @Override public void insertImport(List data) { if (null == data || data.isEmpty()) { return; } Demand d = null; DemandKeyword dk = null; List demandList = new ArrayList<>(); List demandKeywordList = new ArrayList<>(); Calendar now = Calendar.getInstance(); now.set(Calendar.MILLISECOND, 0); for (DemandImportBo bo : data) { d = new Demand(); BeanUtils.copyProperties(bo, d); d.setId(UUID.randomUUID().toString()); d.setReleaseStatus(DemandReleaseStatus.UNRELEASE.getCode()); d.setCreateTime(now.getTime()); d.setDeletedSign(DeleteStatus.UNDELETE.getCode()); d.setAuditStatus(DemandAuditStatus.INAUDIT.getCode()); d.setStatus(DemandStatus.UNRESOLVED.getCode()); d.setInfoSources(DemandInfoSourceStatus.IMPORT.getCode()); List keywordsList = bo.getKeywords(); if (null != keywordsList && keywordsList.size() > 0) { for (String s : keywordsList) { if (!StringUtils.isBlank(s)) { dk = new DemandKeyword(); dk.setDemandId(d.getId()); dk.setKeyword(s.trim()); dk.setId(UUID.randomUUID().toString()); demandKeywordList.add(dk); } } } demandList.add(d); } demandMapper.insertBatch(demandList); demandKeywordMapper.insertBatch(demandKeywordList); } @SuppressWarnings("unchecked") @Override public Pagination listDemandSearchList(Integer sign, String keyword, Integer industryCategoryA, Integer industryCategoryB, Integer demandType, BigDecimal budgetCostLower, BigDecimal budgetCostUpper, Integer pNo, Integer pSize) { Map params = new HashMap<>(); if (!StringUtils.isBlank(keyword)) { params.put("keyword", keyword); } if (null != industryCategoryA) { params.put("industryCategoryA", industryCategoryA); } if (null != industryCategoryB) { params.put("industryCategoryB", industryCategoryB); } if (null != demandType) { params.put("demandType", demandType); } if (null != budgetCostLower && DemandPortalSearchSignType.ALL.getCode().equals(sign)) { params.put("budgetCostLower", budgetCostLower); } if (null != budgetCostUpper && DemandPortalSearchSignType.ALL.getCode().equals(sign)) { params.put("budgetCostUpper", budgetCostUpper); } if (null != sign) { params.put("sign", sign); } if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findSearchDemandListByPage", "findSearchDemandCount", params, pNo, pSize); } @Override public DemandSearchDetailBo selectDemandSearchDetail(String uid, String id) { return demandMapper.selectDemandSearchDetail(uid, id); } private Map disposeParams(Integer auditStatus, Integer province, Integer serialNumber, String name, String keyword, Integer infoSources, Integer demandType, String validityPeriodStartDate, String validityPeriodEndDate, String username, Integer status, Integer releaseStatus, String releaseDateStartDate, String releaseDateEndDate) { Map params = new HashMap<>(); Date vStart = null; Date vEnd = null; Date rStart = null; Date rEnd = null; if (!StringUtils.isBlank(validityPeriodStartDate)) { try { vStart = DateUtils.parseDate(validityPeriodStartDate, AFTConstants.YYYYMMDD); } catch (ParseException e) { } } if (!StringUtils.isBlank(validityPeriodEndDate)) { try { vEnd = DateUtils.addDays(DateUtils.parseDate(validityPeriodEndDate, AFTConstants.YYYYMMDD), 1); } catch (ParseException e) { } } 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 != vStart) { params.put("vStart", vStart); } if (null != vEnd) { params.put("vEnd", vEnd); } if (null != rStart) { params.put("rStart", rStart); } if (null != rEnd) { params.put("rEnd", rEnd); } if (null != auditStatus) { params.put("auditStatus", auditStatus); } if (null != province) { params.put("province", province); } if (null != serialNumber) { params.put("serialNumber", serialNumber); } if (!StringUtils.isBlank(name)) { params.put("name", name); } if (!StringUtils.isBlank(keyword)) { params.put("keyword", keyword); } /* * if (!StringUtils.isBlank(username)) { params.put("username", * username); } */ if (null != infoSources) { params.put("infoSources", infoSources); } if (null != demandType) { params.put("demandType", demandType); } if (null != status) { params.put("status", status); } if (null != releaseStatus) { params.put("releaseStatus", releaseStatus); } return params; } // 给所有审核员发送审核通知 private void createAuditorNotice(Demand d) { List ids = userRoleMapper.listAuditor(); List list = new ArrayList<>(); if (null != ids && ids.size() > 0) { for (String s : ids) { list.add(disposeNotice(d, s)); } noticeMapper.insertBatch(list); } } // 给指派技术经纪人发送审核结果通知 private void createTechBorkerNotice(Demand a) { noticeMapper.insert(disposeNotice(a, null)); } private Notice disposeNotice(Demand d, 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(d.getId()); User u = userMapper.selectByPrimaryKey(d.getEmployerId()); if (null != u) { n.setPid(u.getAid()); } if (StringUtils.isBlank(aid)) { n.setAid(d.getTechBrokerId()); if (UserType.PERSONAL.getCode().equals(d.getDataCategory())) { n.setContent("编号" + d.getSerialNumber() + NoticeStatus.PERSONALDEMAND.getDesc() + " " + (DemandAuditStatus.AUDITED.getCode().equals(d.getAuditStatus()) ? DemandAuditStatus.AUDITED.getDesc() : DemandAuditStatus.UNAUDITED.getDesc())); n.setNoticeType(NoticeStatus.PERSONALDEMAND.getCode()); } else if (UserType.ORGANIZATION.getCode().equals(d.getDataCategory())) { n.setContent("编号" + d.getSerialNumber() + NoticeStatus.ORGANIZATIONDEMAND.getDesc() + " " + (DemandAuditStatus.AUDITED.getCode().equals(d.getAuditStatus()) ? DemandAuditStatus.AUDITED.getDesc() : DemandAuditStatus.UNAUDITED.getDesc())); n.setNoticeType(NoticeStatus.ORGANIZATIONDEMAND.getCode()); } } else { n.setAid(aid); if (UserType.PERSONAL.getCode().equals(d.getDataCategory())) { n.setContent(NoticeStatus.PERSONALDEMAND.getDesc() + " " + DemandAuditStatus.SUBMIT.getDesc()); n.setNoticeType(NoticeStatus.PERSONALDEMAND.getCode()); } else if (UserType.ORGANIZATION.getCode().equals(d.getDataCategory())) { n.setContent(NoticeStatus.ORGANIZATIONDEMAND.getDesc() + " " + DemandAuditStatus.SUBMIT.getDesc()); n.setNoticeType(NoticeStatus.ORGANIZATIONDEMAND.getCode()); } } return n; } private void disposeDemandKeyword(String[] keywords, Demand d, boolean delete) { if (null != keywords && keywords.length > 0) { if (delete) { demandKeywordMapper.batchDeleteByDemandId(d.getId()); } List list = new ArrayList<>(); DemandKeyword dk = null; for (int i = 0; i < keywords.length; i++) { dk = new DemandKeyword(); dk.setId(UUID.randomUUID().toString()); dk.setDemandId(d.getId()); dk.setKeyword(keywords[i].trim()); list.add(dk); } demandKeywordMapper.insertBatch(list); } } @Override public int updateMatchAchievement(Demand d) { achievementDemandMapper.deleteByDemandId(d.getId()); List demand = demandKeywordMapper.selectKeywordsByDemandId(d.getId()); if (null != demand && demand.size() > 0) { List keyword = new ArrayList<>(); for (DemandKeyword k : demand) { if (!StringUtils.isBlank(k.getKeyword())) { keyword.add(k.getKeyword()); } } List list = achievementKeywordMapper.selectAchievementDemand(keyword); if (null != list && list.size() > 0) { for (AchievementDemand ad : list) { ad.setDemandId(d.getId()); } return achievementDemandMapper.insertBatch(list); } } return 0; } @SuppressWarnings("unchecked") @Override public Pagination lisePartnerDemand(String employerId, Integer pNo, Integer pSize) { Map params = new HashMap<>(); params.put("employerId", employerId); if (pNo == null || pNo < 0) { pNo = 1; } if (pSize == null || pSize < 0 || pSize > 10) { pSize = 10; } return (Pagination) findPage("findPartnerDemandListByPage", "findPartnerDemandCount", params, pNo, pSize); } @Override public DemandPortalDetailBo findUserPortalDemandDetail(String id) { return demandMapper.findUserPortalDemandDetail(id, TokenManager.getUserId()); } @Override public DemandPortalDetailBo findOrgPortalDemandDetail(String id) { return demandMapper.findOrgPortalDemandDetail(id, TokenManager.getUserId()); } @Override public List findByIndustryCategoryA(Integer industryCategoryA, String id) { return demandMapper.findByIndustryCategoryA(industryCategoryA, id); } @Override public int updateByPrimaryKeySelective(Demand d) { return demandMapper.updateByPrimaryKeySelective(d); } }