doum
2026-06-18 93de43267e1663031fe5dc2f5ae40d128a182a76
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerH5AuthServiceImpl.java
@@ -7,9 +7,12 @@
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;
@@ -25,23 +28,40 @@
    @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) {
        YwCustomer customer = findActiveByPhone(dto.getPhone());
        bindOpenId(customer, dto.getOpenid());
        touchLogin(customer);
        return jwtTokenUtil.generateToken(toLoginUserInfo(customer));
        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);
        return jwtTokenUtil.generateToken(toLoginUserInfo(customer));
        if (member != null) {
            touchMemberLogin(member);
        }
        return jwtTokenUtil.generateToken(toLoginUserInfo(customer, member));
    }
    @Override
@@ -50,36 +70,153 @@
        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<YwCustomer>().lambda()
                .eq(YwCustomer::getIsdeleted, Constants.ZERO)
                .eq(YwCustomer::getOpenid, openId.trim())
                .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));
        return jwtTokenUtil.generateToken(toLoginUserInfo(customer, defaultMember));
    }
    @Override
    public LoginUserInfo buildLoginUserInfo(Integer customerId) {
        return toLoginUserInfo(requireActiveCustomer(customerId));
    public LoginUserInfo buildLoginUserInfo(Integer customerId, Integer memberId) {
        YwCustomer customer = requireActiveCustomer(customerId);
        Member member = resolveMemberForCustomer(customer, memberId);
        return toLoginUserInfo(customer, member);
    }
    private YwCustomer findActiveByPhone(String phone) {
    @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(), "手机号不能为空");
        }
        YwCustomer customer = ywCustomerMapper.selectOne(new QueryWrapper<YwCustomer>().lambda()
                .eq(YwCustomer::getIsdeleted, Constants.ZERO)
                .eq(YwCustomer::getPhone, phone.trim())
                .last(" limit 1 "));
        if (customer == null) {
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "商户不存在或未注册");
        String trimmed = phone.trim();
        Member member = findActiveCustomerMemberByPhone(trimmed);
        if (member != null) {
            YwCustomer customer = loadCustomerByMember(member);
            if (customer != null) {
                return new CustomerMemberContext(customer, member);
            }
        }
        assertCustomerEnabled(customer);
        return customer;
        YwCustomer byCustomerPhone = ywCustomerMapper.selectOne(new QueryWrapper<YwCustomer>().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<Member>().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<Member>().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<YwCustomer>().lambda()
                .eq(YwCustomer::getId, member.getCustomerId())
                .eq(YwCustomer::getIsdeleted, Constants.ZERO)
                .last(" limit 1 "));
        if (customer != null) {
            return customer;
        }
        return ywCustomerMapper.selectOne(new QueryWrapper<YwCustomer>().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<Member>().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) {
@@ -100,15 +237,32 @@
        }
    }
    private void bindOpenId(YwCustomer customer, String openid) {
        if (StringUtils.isBlank(openid)) {
    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;
        }
        ywCustomerMapper.update(null, new UpdateWrapper<YwCustomer>().lambda()
                .set(YwCustomer::getOpenid, null)
                .eq(YwCustomer::getOpenid, openid.trim())
                .ne(YwCustomer::getId, customer.getId()));
        customer.setOpenid(openid.trim());
        String trimmed = openid.trim();
        memberMapper.update(null, new UpdateWrapper<Member>().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) {
@@ -119,17 +273,96 @@
        ywCustomerMapper.updateById(customer);
    }
    private LoginUserInfo toLoginUserInfo(YwCustomer 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.setRealname(customer.getName());
        loginUserInfo.setMobile(customer.getPhone());
        loginUserInfo.setUsername("customer_" + customer.getId());
        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<Member>().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<YwCustomer>().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;
        }
    }
}