package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.doumee.config.jwt.JwtTokenUtil; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.utils.Constants; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.YwCustomerMapper; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.YwCustomer; import com.doumee.dao.system.dto.LoginPhoneDTO; import com.doumee.service.business.YwCustomerH5AuthService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.Date; @Service public class YwCustomerH5AuthServiceImpl implements YwCustomerH5AuthService { @Autowired private YwCustomerMapper ywCustomerMapper; @Autowired private MemberMapper memberMapper; @Autowired private JwtTokenUtil jwtTokenUtil; @Override @Transactional(rollbackFor = Exception.class) public String loginByPhone(LoginPhoneDTO dto) { YwCustomer customer = findActiveByPhone(dto.getPhone()); bindOpenId(customer, dto.getOpenid()); touchLogin(customer); return jwtTokenUtil.generateToken(toLoginUserInfo(customer)); } @Override @Transactional(rollbackFor = Exception.class) public String loginByCustomerId(Integer customerId) { YwCustomer customer = requireActiveCustomer(customerId); touchLogin(customer); return jwtTokenUtil.generateToken(toLoginUserInfo(customer)); } @Override @Transactional(rollbackFor = Exception.class) public String loginByOpenId(String openId) { if (StringUtils.isBlank(openId)) { return null; } YwCustomer customer = ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getIsdeleted, Constants.ZERO) .eq(YwCustomer::getOpenid, openId.trim()) .last(" limit 1 ")); if (customer == null) { return null; } assertCustomerEnabled(customer); touchLogin(customer); return jwtTokenUtil.generateToken(toLoginUserInfo(customer)); } @Override public LoginUserInfo buildLoginUserInfo(Integer customerId) { return toLoginUserInfo(requireActiveCustomer(customerId)); } @Override public void assertActiveCustomerByPhone(String phone) { findActiveByPhone(phone); } private YwCustomer findActiveByPhone(String phone) { if (StringUtils.isBlank(phone)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "手机号不能为空"); } YwCustomer customer = findCustomerByPhone(phone.trim()); if (customer == null) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "商户不存在或未注册"); } assertCustomerEnabled(customer); return customer; } /** * 商户手机号:优先 yw_customer.phone,否则匹配联系人 member.phone */ private YwCustomer findCustomerByPhone(String phone) { YwCustomer byCustomerPhone = ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getIsdeleted, Constants.ZERO) .eq(YwCustomer::getPhone, phone) .last(" limit 1 ")); if (byCustomerPhone != null) { return byCustomerPhone; } Member member = memberMapper.selectOne(new QueryWrapper().lambda() .eq(Member::getIsdeleted, Constants.ZERO) .eq(Member::getType, Constants.memberType.customer) .eq(Member::getPhone, phone) .isNotNull(Member::getCustomerId) .orderByDesc(Member::getId) .last(" limit 1 ")); if (member == null || member.getCustomerId() == null) { return null; } YwCustomer customer = ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getId, member.getCustomerId()) .eq(YwCustomer::getIsdeleted, Constants.ZERO) .last(" limit 1 ")); if (customer != null) { return customer; } return ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getIsdeleted, Constants.ZERO) .eq(YwCustomer::getMemberId, member.getId()) .last(" limit 1 ")); } private YwCustomer requireActiveCustomer(Integer customerId) { if (customerId == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } YwCustomer customer = ywCustomerMapper.selectById(customerId); if (customer == null || Constants.equalsInteger(customer.getIsdeleted(), Constants.ONE)) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "商户不存在或未注册"); } assertCustomerEnabled(customer); return customer; } private void assertCustomerEnabled(YwCustomer customer) { if (customer.getStatus() != null && Constants.equalsInteger(customer.getStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.NO_ALLOW_LOGIN.getCode(), "商户账号已禁用"); } } private void bindOpenId(YwCustomer customer, String openid) { if (StringUtils.isBlank(openid)) { return; } ywCustomerMapper.update(null, new UpdateWrapper().lambda() .set(YwCustomer::getOpenid, null) .eq(YwCustomer::getOpenid, openid.trim()) .ne(YwCustomer::getId, customer.getId())); customer.setOpenid(openid.trim()); } private void touchLogin(YwCustomer customer) { Date now = new Date(); customer.setLastLoginDate(now); customer.setEditDate(now); customer.setLoginNum((customer.getLoginNum() == null ? 0 : customer.getLoginNum()) + 1); ywCustomerMapper.updateById(customer); } private LoginUserInfo toLoginUserInfo(YwCustomer customer) { LoginUserInfo loginUserInfo = new LoginUserInfo(); loginUserInfo.setCustomerId(customer.getId()); loginUserInfo.setId(customer.getId()); loginUserInfo.setH5UserType(LoginUserInfo.H5_USER_CUSTOMER); loginUserInfo.setRealname(customer.getName()); loginUserInfo.setMobile(resolveLoginMobile(customer)); loginUserInfo.setUsername("customer_" + customer.getId()); loginUserInfo.setSource(LoginUserInfo.SOURCE_H5_CUSTOMER); loginUserInfo.setRoles(Collections.singletonList("h5_customer")); loginUserInfo.setPermissions(Collections.emptyList()); return loginUserInfo; } private String resolveLoginMobile(YwCustomer customer) { if (StringUtils.isNotBlank(customer.getPhone())) { return customer.getPhone(); } if (customer.getMemberId() != null) { Member member = memberMapper.selectById(customer.getMemberId()); if (member != null && StringUtils.isNotBlank(member.getPhone())) { return member.getPhone(); } } return customer.getPhone(); } }