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.SmsEmailService; 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; @Autowired private SmsEmailService smsEmailService; @Override @Transactional(rollbackFor = Exception.class) public String loginByPhone(LoginPhoneDTO dto) { smsEmailService.validateCode(dto.getCode(), dto.getPhone()); CustomerMemberContext ctx = resolveByPhone(dto.getPhone()); if (ctx == null || ctx.customer == null) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "商户不存在或未注册"); } assertCustomerEnabled(ctx.customer); if (ctx.member != null) { assertMemberEnabled(ctx.member); bindMemberOpenId(ctx.member, dto.getOpenid()); touchMemberLogin(ctx.member); } touchLogin(ctx.customer); return jwtTokenUtil.generateToken(toLoginUserInfo(ctx.customer, ctx.member)); } @Override @Transactional(rollbackFor = Exception.class) public String loginByCustomerId(Integer customerId) { YwCustomer customer = requireActiveCustomer(customerId); Member member = resolveDefaultMember(customer); touchLogin(customer); if (member != null) { touchMemberLogin(member); } return jwtTokenUtil.generateToken(toLoginUserInfo(customer, member)); } @Override @Transactional(rollbackFor = Exception.class) public String loginByOpenId(String openId) { if (StringUtils.isBlank(openId)) { return null; } String trimmed = openId.trim(); Member member = findActiveCustomerMemberByOpenId(trimmed); if (member != null) { YwCustomer customer = loadCustomerByMember(member); if (customer != null) { assertCustomerEnabled(customer); assertMemberEnabled(member); touchMemberLogin(member); touchLogin(customer); return jwtTokenUtil.generateToken(toLoginUserInfo(customer, member)); } } YwCustomer customer = ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getIsdeleted, Constants.ZERO) .eq(YwCustomer::getOpenid, trimmed) .last(" limit 1 ")); if (customer == null) { return null; } assertCustomerEnabled(customer); Member defaultMember = resolveDefaultMember(customer); if (defaultMember != null && StringUtils.isBlank(defaultMember.getOpenid())) { bindMemberOpenId(defaultMember, trimmed); touchMemberLogin(defaultMember); } touchLogin(customer); return jwtTokenUtil.generateToken(toLoginUserInfo(customer, defaultMember)); } @Override public LoginUserInfo buildLoginUserInfo(Integer customerId, Integer memberId) { YwCustomer customer = requireActiveCustomer(customerId); Member member = resolveMemberForCustomer(customer, memberId); return toLoginUserInfo(customer, member); } @Override public void assertActiveCustomerByPhone(String phone) { CustomerMemberContext ctx = resolveByPhone(phone); if (ctx == null || ctx.customer == null) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "商户不存在或未注册"); } assertCustomerEnabled(ctx.customer); if (ctx.member != null) { assertMemberEnabled(ctx.member); } } private CustomerMemberContext resolveByPhone(String phone) { if (StringUtils.isBlank(phone)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "手机号不能为空"); } String trimmed = phone.trim(); Member member = findActiveCustomerMemberByPhone(trimmed); if (member != null) { YwCustomer customer = loadCustomerByMember(member); if (customer != null) { return new CustomerMemberContext(customer, member); } } YwCustomer byCustomerPhone = ywCustomerMapper.selectOne(new QueryWrapper().lambda() .eq(YwCustomer::getIsdeleted, Constants.ZERO) .eq(YwCustomer::getPhone, trimmed) .last(" limit 1 ")); if (byCustomerPhone != null) { return new CustomerMemberContext(byCustomerPhone, resolveDefaultMember(byCustomerPhone)); } return null; } private Member findActiveCustomerMemberByPhone(String phone) { return 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 ")); } private Member findActiveCustomerMemberByOpenId(String openId) { return memberMapper.selectOne(new QueryWrapper().lambda() .eq(Member::getIsdeleted, Constants.ZERO) .eq(Member::getType, Constants.memberType.customer) .eq(Member::getOpenid, openId) .isNotNull(Member::getCustomerId) .orderByDesc(Member::getId) .last(" limit 1 ")); } private YwCustomer loadCustomerByMember(Member member) { 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 Member resolveDefaultMember(YwCustomer customer) { if (customer.getMemberId() != null) { Member member = memberMapper.selectById(customer.getMemberId()); if (isActiveCustomerMember(member)) { return member; } } return memberMapper.selectOne(new QueryWrapper().lambda() .eq(Member::getIsdeleted, Constants.ZERO) .eq(Member::getType, Constants.memberType.customer) .eq(Member::getCustomerId, customer.getId()) .orderByAsc(Member::getId) .last(" limit 1 ")); } private Member resolveMemberForCustomer(YwCustomer customer, Integer memberId) { if (memberId != null) { Member member = memberMapper.selectById(memberId); if (member != null && isMemberBelongsToCustomer(member, customer)) { assertMemberEnabled(member); return member; } } return resolveDefaultMember(customer); } private boolean isMemberBelongsToCustomer(Member member, YwCustomer customer) { if (!isActiveCustomerMember(member)) { return false; } if (member.getCustomerId() != null && Constants.equalsInteger(member.getCustomerId(), customer.getId())) { return true; } return customer.getMemberId() != null && Constants.equalsInteger(customer.getMemberId(), member.getId()); } private boolean isActiveCustomerMember(Member member) { return member != null && Constants.equalsInteger(member.getIsdeleted(), Constants.ZERO) && Constants.equalsInteger(member.getType(), Constants.memberType.customer); } 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 assertMemberEnabled(Member member) { if (member.getStatus() != null && Constants.equalsInteger(member.getStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.NO_ALLOW_LOGIN.getCode(), "人员账号已禁用"); } } private void bindMemberOpenId(Member member, String openid) { if (member == null || StringUtils.isBlank(openid)) { return; } String trimmed = openid.trim(); memberMapper.update(null, new UpdateWrapper().lambda() .set(Member::getOpenid, null) .eq(Member::getOpenid, trimmed) .ne(Member::getId, member.getId())); member.setOpenid(trimmed); member.setEditDate(new Date()); memberMapper.updateById(member); } private void touchMemberLogin(Member member) { if (member == null) { return; } member.setEditDate(new Date()); memberMapper.updateById(member); } 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, Member member) { LoginUserInfo loginUserInfo = new LoginUserInfo(); loginUserInfo.setCustomerId(customer.getId()); loginUserInfo.setId(customer.getId()); loginUserInfo.setH5UserType(LoginUserInfo.H5_USER_CUSTOMER); loginUserInfo.setCustomerName(customer.getName()); if (member != null) { loginUserInfo.setMemberId(member.getId()); loginUserInfo.setMemberName(member.getName()); loginUserInfo.setMobile(member.getPhone()); } else { loginUserInfo.setMobile(resolveLoginMobile(customer)); } String displayName = buildDisplayName(customer.getName(), member != null ? member.getName() : null); loginUserInfo.setDisplayName(displayName); loginUserInfo.setRealname(displayName); loginUserInfo.setUsername("customer_" + customer.getId() + "_member_" + (member != null ? member.getId() : 0)); loginUserInfo.setSource(LoginUserInfo.SOURCE_H5_CUSTOMER); loginUserInfo.setRoles(Collections.singletonList("h5_customer")); loginUserInfo.setPermissions(Collections.emptyList()); return loginUserInfo; } private String buildDisplayName(String customerName, String memberName) { String customer = StringUtils.trimToEmpty(customerName); String member = StringUtils.trimToEmpty(memberName); if (StringUtils.isBlank(customer) && StringUtils.isBlank(member)) { return ""; } if (StringUtils.isBlank(member)) { return customer; } if (StringUtils.isBlank(customer)) { return member; } return customer + "-" + member; } 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(); } @Override @Transactional(rollbackFor = Exception.class) public void logout(LoginUserInfo user, String token) { if (user == null) { jwtTokenUtil.invalidateToken(token); return; } String memberOpenId = null; if (user.getMemberId() != null) { Member member = memberMapper.selectById(user.getMemberId()); if (member != null) { memberOpenId = member.getOpenid(); if (StringUtils.isNotBlank(memberOpenId)) { memberMapper.update(null, new UpdateWrapper().lambda() .set(Member::getOpenid, null) .eq(Member::getId, member.getId())); } } } if (user.getCustomerId() != null) { YwCustomer customer = ywCustomerMapper.selectById(user.getCustomerId()); if (customer != null && StringUtils.isNotBlank(customer.getOpenid()) && (memberOpenId == null || StringUtils.equals(customer.getOpenid(), memberOpenId))) { ywCustomerMapper.update(null, new UpdateWrapper().lambda() .set(YwCustomer::getOpenid, null) .eq(YwCustomer::getId, customer.getId())); } } jwtTokenUtil.invalidateToken(token); } private static class CustomerMemberContext { private final YwCustomer customer; private final Member member; private CustomerMemberContext(YwCustomer customer, Member member) { this.customer = customer; this.member = member; } } }