提交 335be5bd 编写于 作者: 街头小贩's avatar 街头小贩

增加MemberVipExchangeRecords(VIP交易记录)

上级 a0b8fa6f
......@@ -19,6 +19,7 @@ import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
......@@ -41,10 +42,8 @@ public class MemberDaoImpl implements MemberDao {
@Cacheable(key="#memberId", unless="#result==null")
@Override
public Member findOneById(long memberId) {
logger.info("[MemberDAO]method find one arg:" + memberId);
try {
Member m = entityManager.find(Member.class, memberId);
return m; //return Optional.ofNullable(m);
return entityManager.find(Member.class, memberId);
} catch (Exception e) {
return null;
}
......@@ -54,7 +53,7 @@ public class MemberDaoImpl implements MemberDao {
@CacheEvict(key="#memberId")
@Override
public boolean editMemberRole(long memberId, MemberRoleEnum role) {
int affect = entityManager.createQuery("UPDATE Member m SET m.mrole = ?1 WHERE m.id = ?2").setParameter(1, role).setParameter(2, memberId).executeUpdate();
int affect = entityManager.createQuery("UPDATE Member m SET m.mrole = ?1 WHERE m.id = ?2 AND m.mrole != ?3").setParameter(1, role).setParameter(2, memberId).setParameter(3, role).executeUpdate();
boolean complete = (affect == 1);
return complete;
}
......@@ -63,7 +62,7 @@ public class MemberDaoImpl implements MemberDao {
@CacheEvict(key="#memberId")
@Override
public boolean editMemberGroup(long memberId, MemberGroupEnum group) {
int affect = entityManager.createQuery("UPDATE Member m SET m.mgroup = ?1 WHERE m.id = ?2").setParameter(1, group).setParameter(2, memberId).executeUpdate();
int affect = entityManager.createQuery("UPDATE Member m SET m.mgroup = ?1 WHERE m.id = ?2 AND m.mgroup != ?3").setParameter(1, group).setParameter(2, memberId).setParameter(3, group).executeUpdate();
boolean complete = (affect == 1);
return complete;
}
......@@ -72,7 +71,7 @@ public class MemberDaoImpl implements MemberDao {
@CacheEvict(key="#memberId")
@Override
public boolean editMemberStatus(long memberId, MemberStatusEnum status) {
int affect = entityManager.createQuery("UPDATE Member m SET m.status = ?1 WHERE m.id = ?2").setParameter(1, status).setParameter(2, memberId).executeUpdate();
int affect = entityManager.createQuery("UPDATE Member m SET m.status = ?1 WHERE m.id = ?2 AND m.status != ?3").setParameter(1, status).setParameter(2, memberId).setParameter(3, status).executeUpdate();
boolean complete = (affect == 1);
return complete;
}
......
package com.apobates.forum.member.impl.dao;
import com.apobates.forum.member.dao.MemberVipExchangeRecordsDao;
import com.apobates.forum.member.entity.MemberVipExchangeRecords;
import com.apobates.forum.utils.persistence.Page;
import com.apobates.forum.utils.persistence.Pageable;
import java.time.LocalDateTime;
import java.util.Optional;
import java.util.stream.Stream;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author xiaofanku
* @since 20200921
*/
@Repository
public class MemberVipExchangeRecordsDaoImpl implements MemberVipExchangeRecordsDao{
@PersistenceContext
private EntityManager entityManager;
private final static Logger logger = LoggerFactory.getLogger(MemberVipExchangeRecordsDaoImpl.class);
@Override
public Page<MemberVipExchangeRecords> findAllByMember(long memberId) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Page<MemberVipExchangeRecords> findAll(LocalDateTime start, LocalDateTime finish) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Stream<MemberVipExchangeRecords> findAllOfRecent(int size) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Page<MemberVipExchangeRecords> findAll(Pageable pageable) {
final long total = count();
if (total == 0) {
return emptyResult();
}
final String SQL = "SELECT ver FROM MemberVipExchangeRecords ver ORDER BY ver.entryDateTime DESC";
TypedQuery<MemberVipExchangeRecords> query = entityManager.createQuery(SQL, MemberVipExchangeRecords.class);
query.setFirstResult(pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
final Stream<MemberVipExchangeRecords> result = query.getResultStream();
return new Page<MemberVipExchangeRecords>() {
@Override
public long getTotalElements() {
return total;
}
@Override
public Stream<MemberVipExchangeRecords> getResult() {
return result;
}
};
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void save(MemberVipExchangeRecords entity) {
entityManager.persist(entity);
}
@Override
public Optional<MemberVipExchangeRecords> findOne(Long primaryKey) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Optional<Boolean> edit(MemberVipExchangeRecords updateEntity) {
return Optional.empty();
}
@Override
public Stream<MemberVipExchangeRecords> findAll() {
return Stream.empty();
}
@Override
public long count() {
try {
return entityManager.createQuery("SELECT COUNT(ver) FROM MemberVipExchangeRecords ver", Long.class).getSingleResult();
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("[count][MemberVipExchangeRecords]", e);
}
}
return 0L;
}
@Override
public Stream<MemberVipExchangeRecords> findAllByExpire(LocalDateTime lapseDateStart, LocalDateTime lapseDateFinish) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
\ No newline at end of file
......@@ -49,7 +49,7 @@ public class ForumScoreRoleServiceImpl implements ForumScoreRoleService{
return Optional.empty();
}
@Cacheable(value = "memberCache", key="'score_'+#id", unless="#result == null")
@Cacheable(value = "memberCache", key="'score_'+#id", unless="#result==null")
@Override
public Optional<ForumScoreRole> get(int id) {
if (id > 0) {
......
......@@ -15,6 +15,8 @@ import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
......@@ -37,6 +39,7 @@ public class MemberLevelServiceImpl implements MemberLevelService{
public Stream<MemberLevel> getAll() {
return memberLevelDao.findAll();
}
@CacheEvict(value="memberCache", key="'level_used'")
@Override
public Optional<MemberLevel> create(String names, double minScore, double score, String imageAddr, boolean status) {
......@@ -51,6 +54,7 @@ public class MemberLevelServiceImpl implements MemberLevelService{
}
return Optional.empty();
}
@CacheEvict(value="memberCache", key="'level_used'")
@Override
public Optional<MemberLevel> edit(int id, String names, double minScore, double score, String imageAddr, boolean status)throws IllegalArgumentException {
......@@ -101,6 +105,7 @@ public class MemberLevelServiceImpl implements MemberLevelService{
public boolean editStatus(int id, boolean status) {
return memberLevelDao.editStatus(id, status) == 1;
}
@Cacheable(value="memberCache", key="'level_used'", unless="#result==null")
@Override
public List<CommonDoubleBean> getMemberLevelCommonBean() {
......
......@@ -3,7 +3,6 @@ package com.apobates.forum.member.impl.service;
import com.apobates.forum.member.dao.MemberDao;
import com.apobates.forum.member.dao.MemberPenalizeRecordsDao;
import com.apobates.forum.member.entity.MemberPenalizeRecords;
import com.apobates.forum.member.impl.event.MemberEventPublisher;
import com.apobates.forum.member.impl.event.MemberPenalizeEvent;
import com.apobates.forum.member.service.MemberPenalizeRecordsService;
import com.apobates.forum.utils.DateTimeUtils;
......@@ -14,6 +13,7 @@ import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
/**
......@@ -28,7 +28,7 @@ public class MemberPenalizeRecordsServiceImpl implements MemberPenalizeRecordsSe
@Autowired
private MemberDao memberDao;
@Autowired
private MemberEventPublisher memberEventPublisher;
private JmsTemplate jmsTemplate;
private final static Logger logger = LoggerFactory.getLogger(MemberPenalizeRecordsServiceImpl.class);
@Override
......@@ -57,15 +57,13 @@ public class MemberPenalizeRecordsServiceImpl implements MemberPenalizeRecordsSe
memberPenalizeRecordsDao.save(entity);
if (entity.getId() > 0) {
// 应该在惩罚生效时发送,暂不支持预定日期的惩罚,只支持即可生效
memberEventPublisher.publishPenalizeEvent(
new MemberPenalizeEvent(this,
entity.getMemberId(),
new MemberPenalizeEvent(entity.getMemberId(),
entity.getMemberNickname(),
entity.getArrive(),
entity.getDuration(),
entity.getJudger(),
entity.getJudgeNickname(),
entity.getReason()));
entity.getReason()).sendBy(jmsTemplate);
return entity.getId();
}
} catch (Exception e) {
......
......@@ -19,7 +19,6 @@ import com.apobates.forum.member.entity.RegisteInviteCode;
import com.apobates.forum.member.exception.MemberNamesExistException;
import com.apobates.forum.member.exception.MemberNamesProtectException;
import com.apobates.forum.member.impl.MemberAction;
import com.apobates.forum.member.impl.event.MemberEventPublisher;
import com.apobates.forum.member.impl.event.MemberSignInEvent;
import com.apobates.forum.member.impl.event.MemberSignOutEvent;
import com.apobates.forum.member.impl.event.MemberSignUpEvent;
......@@ -47,6 +46,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
/**
......@@ -70,7 +70,7 @@ public class MemberServiceImpl implements MemberService{
@Autowired
private MemberLevelService memberLevelService;
@Autowired
private MemberEventPublisher memberEventPublisher;
private JmsTemplate jmsTemplate;
private final static Logger logger = LoggerFactory.getLogger(MemberServiceImpl.class);
@Cacheable(key="'avatar_'+#id", unless="#result==null")
......@@ -180,7 +180,7 @@ public class MemberServiceImpl implements MemberService{
//丢掉了inviteCode相关信息
eventMember.setInviteCodeId(inviteCodeId);
eventMember.setInviteCode(inviteCode);
memberEventPublisher.publishSignUpEvent(new MemberSignUpEvent(this, eventMember));
new MemberSignUpEvent(eventMember).sendBy(jmsTemplate);
}
//
return tmp;
......@@ -225,8 +225,7 @@ public class MemberServiceImpl implements MemberService{
Optional<Member> tmp = securityMember(m);
if (tmp.isPresent()) {
Member member = tmp.get();
memberEventPublisher.publishSignInEvent(new MemberSignInEvent(this, member, actionDescriptor.location().getIpAddr(), actionDescriptor.getReferrer(), actionDescriptor.getDevice()));
//
new MemberSignInEvent(member, actionDescriptor.location().getIpAddr(), actionDescriptor.getReferrer(), actionDescriptor.getDevice()).sendBy(jmsTemplate);
return tmp;
}
throw new IllegalStateException("会员不存在或密码错误");
......@@ -247,7 +246,7 @@ public class MemberServiceImpl implements MemberService{
@MemberAction(action = ForumActionEnum.MEMBER_LOGOUT, keyName="memberNames", keyType=String.class)
@Override
public Optional<Boolean> signOut(String memberNames, Member member, MemberActionDescriptor actionDescriptor) { //ASP-M7
memberEventPublisher.publishSignOutEvent(new MemberSignOutEvent(this, member, actionDescriptor.getReferrer(), actionDescriptor.location().getIpAddr()));
new MemberSignOutEvent(member, actionDescriptor.getReferrer(), actionDescriptor.location().getIpAddr()).sendBy(jmsTemplate);
return Optional.of(true);
}
......
package com.apobates.forum.member.impl.service;
import com.apobates.forum.member.dao.MemberVipExchangeRecordsDao;
import com.apobates.forum.member.entity.MemberVipExchangeRecords;
import com.apobates.forum.member.service.MemberVipExchangeRecordsService;
import com.apobates.forum.utils.persistence.Page;
import java.time.LocalDateTime;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author xiaofanku
* @since 20200921
*/
@Service
public class MemberVipExchangeRecordsServiceImpl implements MemberVipExchangeRecordsService{
@Autowired
private MemberVipExchangeRecordsDao memberVipExchangeRecordsDao;
private final static Logger logger = LoggerFactory.getLogger(MemberVipExchangeRecordsServiceImpl.class);
@Override
public Page<MemberVipExchangeRecords> getAll(LocalDateTime start, LocalDateTime finish) {
return memberVipExchangeRecordsDao.findAll(start, finish);
}
@Override
public Page<MemberVipExchangeRecords> getAll(long memberId) {
return memberVipExchangeRecordsDao.findAllByMember(memberId);
}
@Override
public Stream<MemberVipExchangeRecords> getRecent(int size) {
return memberVipExchangeRecordsDao.findAllOfRecent(size);
}
}
\ No newline at end of file
......@@ -106,7 +106,7 @@ public class MemberProfile {
}
MemberProfileBuilder newMpb = new MemberProfileBuilder(source.getId(), source.getNickname(), source.getGroupName(), source.getRoleName(), source.getLabel(), source.getSignature());
double sv = getMemberScore(statsdata, scoreRoleSet);
logger.info("[bean]mid: " + newMpb.getId() + ", score: " + sv);
//logger.info("[MP][bean]mid: " + newMpb.getId() + ", score: " + sv);
newMpb.setScore(sv);
newMpb.setReplies(statsdata.getOrDefault(ForumActionEnum.POSTS_REPLY, 0L));
newMpb.setThreads(statsdata.getOrDefault(ForumActionEnum.TOPIC_PUBLISH, 0L));
......
package com.apobates.forum.member.dao;
import com.apobates.forum.member.entity.MemberVipExchangeRecords;
import com.apobates.forum.utils.persistence.Page;
import com.apobates.forum.utils.persistence.PagingAndSortingRepository;
import java.time.LocalDateTime;
import java.util.stream.Stream;
/**
*
* @author xiaofanku
* @since 20200921
*/
public interface MemberVipExchangeRecordsDao extends PagingAndSortingRepository<MemberVipExchangeRecords, Long>{
/**
* 查看指定会员的VIP交易记录
*
* @param memberId 会员ID
* @return
*/
Page<MemberVipExchangeRecords> findAllByMember(long memberId);
/**
* 查看指定日期范围的VIP交易记录
*
* @param start 开始日期
* @param finish 结束日期
* @return
*/
Page<MemberVipExchangeRecords> findAll(LocalDateTime start, LocalDateTime finish);
/**
* 最近的VIP交易记录
*
* @param size 显示的数量
* @return
*/
Stream<MemberVipExchangeRecords> findAllOfRecent(int size);
/**
* 查看即将到期的VIP交易记录
*
* @param lapseDateStart 到期日期的开始(凌晨)
* @param lapseDateFinish 到期日期的结束(午夜)
* @return
*/
Stream<MemberVipExchangeRecords> findAllByExpire(LocalDateTime lapseDateStart, LocalDateTime lapseDateFinish);
}
\ No newline at end of file
package com.apobates.forum.member.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
/**
* VIP交易记录
*
* @author xiaofanku
* @since 20200921
*/
@Entity
@Table(name = "apo_member_exchange", uniqueConstraints = {@UniqueConstraint(columnNames = {"memberId", "status"})})
public class MemberVipExchangeRecords implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
//会员
private long memberId;
private String memberNickname;
// 记录日期
private LocalDateTime entryDateTime;
// 开始日期
private LocalDateTime activeDateTime;
// 有效日期单位,只支持:月,年
@Basic
@Enumerated(EnumType.STRING)
private ForumCalendarUnitEnum durationUnit;
// 有效日期时长
private int duration;
// 结束日期
private LocalDateTime lapseDateTime;
// 是否有效,true(1)有效,false(0)无效
@Column(columnDefinition="tinyint(1) default 0")
private boolean status;
// 交易流水号
private String serial;
//empty constructor for JPA instantiation
public MemberVipExchangeRecords() {
}
public MemberVipExchangeRecords(long memberId, String memberNickname, int duration, ForumCalendarUnitEnum unit) {
this.id = 0L;
this.memberId = memberId;
this.memberNickname = memberNickname;
this.durationUnit = unit;
this.duration = duration;
this.status = true;
//
LocalDateTime entry = LocalDateTime.now();
this.activeDateTime = entry;
this.entryDateTime = entry;
this.lapseDateTime = unit.plug(duration, entry);
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public long getMemberId() {
return memberId;
}
public void setMemberId(long memberId) {
this.memberId = memberId;
}
public String getMemberNickname() {
return memberNickname;
}
public void setMemberNickname(String memberNickname) {
this.memberNickname = memberNickname;
}
public LocalDateTime getEntryDateTime() {
return entryDateTime;
}
public void setEntryDateTime(LocalDateTime entryDateTime) {
this.entryDateTime = entryDateTime;
}
public LocalDateTime getActiveDateTime() {
return activeDateTime;
}
public void setActiveDateTime(LocalDateTime activeDateTime) {
this.activeDateTime = activeDateTime;
}
public ForumCalendarUnitEnum getDurationUnit() {
return durationUnit;
}
public void setDurationUnit(ForumCalendarUnitEnum durationUnit) {
this.durationUnit = durationUnit;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public LocalDateTime getLapseDateTime() {
return lapseDateTime;
}
public void setLapseDateTime(LocalDateTime lapseDateTime) {
this.lapseDateTime = lapseDateTime;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getSerial() {
return serial;
}
public void setSerial(String serial) {
this.serial = serial;
}
@Override
public int hashCode() {
int hash = 3;
hash = 31 * hash + (int) (this.memberId ^ (this.memberId >>> 32));
hash = 31 * hash + (this.status ? 1 : 0);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MemberVipExchangeRecords other = (MemberVipExchangeRecords) obj;
if (this.memberId != other.memberId) {
return false;
}
if (this.status != other.status) {
return false;
}
return true;
}
}
\ No newline at end of file
package com.apobates.forum.member.service;
import com.apobates.forum.member.entity.MemberVipExchangeRecords;
import com.apobates.forum.utils.persistence.Page;
import java.time.LocalDateTime;
import java.util.stream.Stream;
/**
*
* @author xiaofanku
* @since 20200921
*/
public interface MemberVipExchangeRecordsService {
/**
* 查看指定日期范围的VIP交易记录
*
* @param start 开始日期
* @param finish 结束日期
* @return
*/
Page<MemberVipExchangeRecords> getAll(LocalDateTime start, LocalDateTime finish);
/**
* 查看指定会员的VIP交易记录
*
* @param memberId 会员ID
* @return
*/
Page<MemberVipExchangeRecords> getAll(long memberId);
/**
* 最近的VIP交易记录
*
* @param size 显示的数量
* @return
*/
Stream<MemberVipExchangeRecords> getRecent(int size);
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册