package com.tourguide.modules.operation.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.operation.dto.AgreementResponse; import com.tourguide.modules.operation.dto.MiniAgreementSummaryResponse; import com.tourguide.modules.operation.entity.AgreementSetting; import com.tourguide.modules.operation.mapper.AgreementSettingMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.LinkedHashMap; import java.util.stream.Collectors; @Service public class AgreementSettingService { private static final Map MINI_AGREEMENT_TITLES = createMiniAgreementTitles(); private static final Map GUIDE_AGREEMENT_TITLES = createGuideAgreementTitles(); private final AgreementSettingMapper agreementMapper; public AgreementSettingService(AgreementSettingMapper agreementMapper) { this.agreementMapper = agreementMapper; } public List list() { return agreementMapper.selectList(new LambdaQueryWrapper() .orderByAsc(AgreementSetting::getSortOrder, AgreementSetting::getId)) .stream().map(AgreementResponse::new).collect(Collectors.toList()); } public AgreementResponse get(String code) { return new AgreementResponse(requireAgreement(code)); } public List listMiniAgreements() { return listAllowedAgreements(MINI_AGREEMENT_TITLES); } public List listGuideAgreements() { return listAllowedAgreements(GUIDE_AGREEMENT_TITLES); } private List listAllowedAgreements(Map allowedTitles) { Map agreements = agreementMapper.selectList( new LambdaQueryWrapper() .in(AgreementSetting::getAgreementCode, allowedTitles.keySet())) .stream().collect(Collectors.toMap(AgreementSetting::getAgreementCode, value -> value)); return allowedTitles.entrySet().stream() .filter(entry -> agreements.containsKey(entry.getKey())) .map(entry -> new MiniAgreementSummaryResponse(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); } public AgreementResponse getMiniAgreement(String code) { return getAllowedAgreement(code, MINI_AGREEMENT_TITLES); } public AgreementResponse getGuideAgreement(String code) { return getAllowedAgreement(code, GUIDE_AGREEMENT_TITLES); } private AgreementResponse getAllowedAgreement(String code, Map allowedTitles) { String title = allowedTitles.get(code); if (title == null) { throw new BusinessException(404, "协议类型不存在"); } return new AgreementResponse(requireAgreement(code), title); } @Transactional public AgreementResponse update(String code, String content) { AgreementSetting agreement = requireAgreement(code); agreement.setContent(content); agreement.setUpdatedAt(LocalDateTime.now()); agreementMapper.updateById(agreement); return new AgreementResponse(agreement); } private AgreementSetting requireAgreement(String code) { AgreementSetting agreement = agreementMapper.selectOne(new LambdaQueryWrapper() .eq(AgreementSetting::getAgreementCode, code).last("LIMIT 1")); if (agreement == null) { throw new BusinessException(404, "协议类型不存在"); } return agreement; } private static Map createMiniAgreementTitles() { Map titles = new LinkedHashMap(); titles.put("VISITOR_USER_AGREEMENT", "用户协议"); titles.put("VISITOR_PRIVACY_PERMISSION", "隐私与权限"); titles.put("EXPLANATION_SERVICE_NOTICE", "纯讲解服务须知协议"); return titles; } private static Map createGuideAgreementTitles() { Map titles = new LinkedHashMap(); titles.put("GUIDE_USER_AGREEMENT", "用户协议"); titles.put("EXPLANATION_SERVICE_COOPERATION", "讲解服务合作协议"); titles.put("GUIDE_REWARD_PUNISHMENT", "平台奖惩机制"); return titles; } }