package com.hongqiang.shop.modules.user.service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.LockModeType;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.hongqiang.shop.common.base.persistence.Page;
import com.hongqiang.shop.common.service.BaseService;
import com.hongqiang.shop.common.utils.Pageable;
import com.hongqiang.shop.common.utils.Principal;
import com.hongqiang.shop.common.utils.Setting;
import com.hongqiang.shop.common.utils.SettingUtils;
import com.hongqiang.shop.modules.entity.Admin;
import com.hongqiang.shop.modules.entity.Deposit;
import com.hongqiang.shop.modules.entity.Member;
import com.hongqiang.shop.modules.user.dao.DepositDao;
import com.hongqiang.shop.modules.user.dao.MemberDao;
@Service
public class MemberServiceImpl extends BaseService implements MemberService {
@Autowired
private MemberDao memberDao;
@Autowired
private DepositDao depositDao;
@Transactional(readOnly = true)
public boolean usernameExists(String username) {
return this.memberDao.usernameExists(username);
}
@Transactional(readOnly = true)
public boolean usernameDisabled(String username) {
Assert.hasText(username);
Setting setting = SettingUtils.get();
if (setting.getDisabledUsernames() != null)
for (String localUsername : setting.getDisabledUsernames())
if (StringUtils.containsIgnoreCase(username, localUsername))
return true;
return false;
}
@Transactional(readOnly = true)
public boolean emailExists(String email) {
return this.memberDao.emailExists(email);
}
@Transactional(readOnly = true)
public boolean emailUnique(String previousEmail, String currentEmail) {
if (StringUtils.equalsIgnoreCase(previousEmail, currentEmail))
return true;
return !this.memberDao.emailExists(currentEmail);
}
@Transactional
public void save(Member member, Admin operator) {
if (member == null) {
return;
}
this.memberDao.persist(member);
if (member.getBalance().compareTo(new BigDecimal(0)) > 0) {
Deposit deposit = new Deposit();
deposit.setType(operator != null ? Deposit.Type.adminRecharge : Deposit.Type.memberRecharge);
deposit.setCredit(member.getBalance());
deposit.setDebit(new BigDecimal(0));
deposit.setBalance(member.getBalance());
deposit.setOperator(operator != null ? operator.getUsername() : null);
deposit.setMember(member);
this.depositDao.persist(deposit);
}
}
@Transactional
public void update(Member member, Integer modifyPoint,
BigDecimal modifyBalance, String depositMemo, Admin operator) {
if (member == null) {
return;
}
this.memberDao.lock(member, LockModeType.PESSIMISTIC_WRITE);
if ((modifyPoint != null) && (modifyPoint.intValue() != 0)
&& (member.getPoint().longValue() + modifyPoint.intValue() >= 0L))
member.setPoint(Long.valueOf(member.getPoint().longValue() + modifyPoint.intValue()));
if ((modifyBalance != null)
&& (modifyBalance.compareTo(new BigDecimal(0)) != 0)
&& (member.getBalance().add(modifyBalance).compareTo(new BigDecimal(0)) >= 0)) {
member.setBalance(member.getBalance().add(modifyBalance));
Deposit deposit = new Deposit();
if (modifyBalance.compareTo(new BigDecimal(0)) > 0) {
deposit.setType(operator != null ? Deposit.Type.adminRecharge : Deposit.Type.memberRecharge);
deposit.setCredit(modifyBalance);
deposit.setDebit(new BigDecimal(0));
} else {
deposit.setType(operator != null ? Deposit.Type.adminChargeback : Deposit.Type.memberPayment);
deposit.setCredit(new BigDecimal(0));
deposit.setDebit(modifyBalance);
}
deposit.setBalance(member.getBalance());
deposit.setOperator(operator != null ? operator.getUsername() : null);
deposit.setMemo(depositMemo);
deposit.setMember(member);
this.depositDao.persist(deposit);
}
this.memberDao.merge(member);
}
@Transactional(readOnly = true)
public Long count(){
return this.memberDao.count();
}
@Transactional(readOnly = true)
public Member find(Long id) {
return this.memberDao.findById(id);
}
@Transactional(readOnly = true)
public Page<Member> findPage(Pageable pageable) {
return this.memberDao.findPage(pageable);
}
@Transactional(readOnly = true)
public Member findByUsername(String username) {
return this.memberDao.findByUsername(username);
}
@Transactional(readOnly = true)
public List<Member> findListByEmail(String email) {
return this.memberDao.findListByEmail(email);
}
@Transactional(readOnly = true)
public Page<Object> findPurchasePage(Date beginDate, Date endDate, Pageable pageable) {
return this.memberDao.findPurchasePage(beginDate, endDate, pageable);
}
@Transactional(readOnly = true)
public boolean isAuthenticated() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest localHttpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
Principal principal = (Principal) localHttpServletRequest.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME);
if (principal != null)
return true;
}
return false;
}
@Transactional(readOnly = true)
public Member getCurrent() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest localHttpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
Principal principal = (Principal) localHttpServletRequest.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME);
if (principal != null)
return (Member) this.memberDao.findById(principal.getId());
}
return null;
}
@Transactional(readOnly = true)
public String getCurrentUsername() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest localHttpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
Principal principal = (Principal) localHttpServletRequest.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME);
if (principal != null)
return principal.getUsername();
}
return null;
}
@Transactional
public void save(Member member) {
this.memberDao.persist(member);
}
@Transactional
public Member update(Member member) {
return (Member) this.memberDao.merge(member);
}
@Transactional
public Member update(Member member, String[] ignoreProperties) {
return (Member) this.memberDao.update(member, ignoreProperties);
}
@Transactional
public void delete(Long id) {
this.memberDao.delete(id);
}
@Transactional
public void delete(Long[] ids) {
if (ids != null)
for (Long localSerializable : ids)
this.memberDao.delete(localSerializable);
}
@Transactional
public void delete(Member member) {
this.memberDao.delete(member);
}
}