package com.ylx.massage.service.impl; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ylx.common.core.domain.model.LoginUser; import com.ylx.common.exception.ServiceException; import com.ylx.common.utils.DateUtils; import com.ylx.common.utils.StringUtils; import com.ylx.massage.domain.MaProject; import com.ylx.massage.domain.MaTeProject; import com.ylx.massage.domain.dto.MaTechnicianMerchantAddDTO; import com.ylx.massage.domain.dto.MaTechnicianMerchantQueryDTO; import com.ylx.massage.domain.dto.MassageMerchantRecommendDto; import com.ylx.massage.domain.vo.MaTechnicianAppAddVo; import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO; import com.ylx.massage.domain.vo.MerchantVo; import com.ylx.massage.mapper.MaProjectMapper; import com.ylx.massage.mapper.MaTeProjectMapper; import com.ylx.project.domain.Project; import com.ylx.project.mapper.ProjectMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ylx.massage.mapper.MaTechnicianMapper; import com.ylx.massage.domain.MaTechnician; import com.ylx.massage.service.IMaTechnicianService; import org.springframework.transaction.annotation.Transactional; /** * 技师Service业务层处理 * * @author ylx * @date 2024-03-22 */ @Service public class MaTechnicianServiceImpl implements IMaTechnicianService { private static final int SERVICE_STATE_AVAILABLE = 1; private static final int POST_STATE_OFFLINE = 0; private static final int ENABLED = 1; private static final int DEFAULT_AGE = 18; private static final int AUDIT_APPROVED = 2; private static final int NS_STATUS_NOT_ON_DUTY = -1; private static final int DEFAULT_STAT_VALUE = 0; private static final long NOT_DELETED = 0L; private static final String MERCHANT_STATUS_NORMAL = "0"; @Autowired private MaTechnicianMapper maTechnicianMapper; @Autowired private MaTeProjectMapper maTeProjectMapper; @Autowired private ProjectMapper projectMapper; /** * 查询技师 * * @param id 技师主键 * @return 技师 */ @Override public MaTechnician selectMaTechnicianById(Long id) { return maTechnicianMapper.selectMaTechnicianById(id); } /** * 查询技师列表 * * @param maTechnician 技师 * @return 技师 */ @Override public List selectMaTechnicianList(MaTechnician maTechnician) { return maTechnicianMapper.selectMaTechnicianList(maTechnician); } /** * 新增技师 * * @param maTechnicianAppAddVo 技师 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) public int insertMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo) { MaTechnician maTechnician = new MaTechnician(); BeanUtils.copyProperties(maTechnicianAppAddVo, maTechnician); int rows = maTechnicianMapper.insertMaTechnician(maTechnician); if (maTechnicianAppAddVo.getProjectIds() != null && !maTechnicianAppAddVo.getProjectIds().isEmpty()) { insertProjectRelations(maTechnician.getId(), new LinkedHashSet<>(maTechnicianAppAddVo.getProjectIds())); } return rows; } /** * 后台新增商户 * * @param dto 新增商户参数 * @param loginUser 当前登录用户 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) public int insertMerchant(MaTechnicianMerchantAddDTO dto, LoginUser loginUser) { Set projectIds = checkMerchantAddParam(dto); String userName = loginUser.getUser().getUserName(); MaTechnician maTechnician = new MaTechnician(); maTechnician.setTeName(dto.getTeName().trim()); maTechnician.setTeNickName(dto.getTeNickName().trim()); maTechnician.setTeSex(dto.getTeSex()); maTechnician.setTePhone(dto.getTePhone().trim()); maTechnician.setOpenService(dto.getOpenService()); dto.getProjectIds().forEach(projectId -> { Project project = projectMapper.selectById(projectId); if (project != null) { maTechnician.setTeProject(project.getTitle() + ","); } }); //移除末尾的逗号 maTechnician.setTeProject(StrUtil.removeSuffix(maTechnician.getTeProject(), ",")); maTechnician.setTechType(dto.getTechType()); maTechnician.setIsRecommend(normalizeSwitchValue(dto.getIsRecommend(), "是否推荐")); maTechnician.setServiceState(SERVICE_STATE_AVAILABLE); maTechnician.setPostState(POST_STATE_OFFLINE); maTechnician.setTeIsEnable(ENABLED); //上岗状态:默认-1 未上岗 maTechnician.setNStatus2(NS_STATUS_NOT_ON_DUTY); maTechnician.setMerchantStatus(MERCHANT_STATUS_NORMAL); //审核状态 maTechnician.setAuditStatus(AUDIT_APPROVED); maTechnician.setTeAddress(""); maTechnician.setNStar(DEFAULT_STAT_VALUE); maTechnician.setNNum(DEFAULT_STAT_VALUE); maTechnician.setCreateBy(userName); maTechnician.setUpdateBy(userName); maTechnician.setCreateTime(DateUtils.getNowDate()); maTechnician.setUpdateTime(DateUtils.getNowDate()); int rows = maTechnicianMapper.insert(maTechnician); if (rows <= 0) { throw new ServiceException("新增商户失败"); } insertProjectRelations(maTechnician.getId(), projectIds); return rows; } /** * 后台查询商户列表 * * @param page 分页参数 * @param dto 查询条件 * @return 商户分页列表 */ @Override public Page selectMerchantList(Page page, MaTechnicianMerchantQueryDTO dto) { Page pageParam = page == null ? new Page<>(1, 10) : page; return maTechnicianMapper.selectMerchantList(pageParam, dto); } /** * 修改技师 * * @param maTechnicianAppAddVo * @return 结果 */ @Override public int updateMaTechnician(MaTechnicianAppAddVo maTechnicianAppAddVo) { MaTechnician maTechnician = new MaTechnician(); BeanUtils.copyProperties(maTechnicianAppAddVo, maTechnician); return maTechnicianMapper.updateMaTechnician(maTechnician); } /** * 批量删除技师 * * @param ids 需要删除的技师主键 * @return 结果 */ @Override public int deleteMaTechnicianByIds(Long[] ids) { return maTechnicianMapper.deleteMaTechnicianByIds(ids); } /** * 删除技师信息 * * @param id 技师主键 * @return 结果 */ @Override public int deleteMaTechnicianById(Long id) { return maTechnicianMapper.deleteMaTechnicianById(id); } /** * 首页选中的城市是否有开通服务 * @param areaCode * @return */ @Override public Boolean isHasMerchantCity(String areaCode) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MaTechnician::getTeAreaCode, areaCode); return maTechnicianMapper.selectCount(queryWrapper) > 0; } /** * 首页按摩推荐 * @param dto * @return */ @Override public List getMerchantRecommend(MassageMerchantRecommendDto dto) { return maTechnicianMapper.getMerchantRecommend(dto); } private Set checkMerchantAddParam(MaTechnicianMerchantAddDTO dto) { if (dto == null) { throw new ServiceException("商户参数不能为空"); } checkRequiredText(dto.getTeName(), "姓名", 10); checkRequiredText(dto.getTeNickName(), "昵称", 10); checkRequiredText(dto.getTePhone(), "电话", 11); checkEnumValue(dto.getTeSex(), "性别", 0, 1); //checkEnumValue(dto.getOpenService(), "服务类目", 1, 2); //校验服务类名不能为空 if (dto.getOpenService() == null) { throw new ServiceException("服务类目不能为空"); } checkEnumValue(dto.getTechType(), "商户类型", 0, 1); if (dto.getIsRecommend() != null) { checkEnumValue(dto.getIsRecommend(), "是否推荐", 0, 1); } return checkProjectIds(dto.getProjectIds()); } private void checkRequiredText(String value, String fieldName, int maxLength) { if (StringUtils.isBlank(value)) { throw new ServiceException(fieldName + "不能为空"); } if (value.trim().length() > maxLength) { throw new ServiceException(fieldName + "长度不能超过" + maxLength + "个字符"); } } private void checkEnumValue(Integer value, String fieldName, int... allowedValues) { if (value == null) { throw new ServiceException(fieldName + "不能为空"); } for (int allowedValue : allowedValues) { if (value == allowedValue) { return; } } throw new ServiceException(fieldName + "值不正确"); } private Integer normalizeSwitchValue(Integer value, String fieldName) { if (value == null) { return 0; } checkEnumValue(value, fieldName, 0, 1); return value; } /** * 校验服务项目ID集合 * @param projectIds * @return 有效服务项目ID集合 */ private Set checkProjectIds(List projectIds) { if (projectIds == null || projectIds.isEmpty()) { throw new ServiceException("服务项目不能为空"); } Set distinctProjectIds = new LinkedHashSet<>(); for (Long projectId : projectIds) { if (projectId == null) { throw new ServiceException("服务项目ID不能为空"); } distinctProjectIds.add(projectId); } /*int validCount = 0; for (Long projectId : distinctProjectIds) { MaProject project = maProjectMapper.selectMaProjectById(projectId); if (project != null && (project.getIsDelete() == null || project.getIsDelete() != 1)) { validCount++; } } if (validCount != distinctProjectIds.size()) { throw new ServiceException("服务项目不存在或已删除"); }*/ return distinctProjectIds; } /** * 新增商户与服务项目关联关系 * * @param technicianId * @param projectIds */ private void insertProjectRelations(Long technicianId, Set projectIds) { if (technicianId == null) { throw new ServiceException("商户ID不能为空"); } List relations = new ArrayList<>(); for (Long projectId : projectIds) { MaTeProject relation = new MaTeProject(); relation.setTeId(technicianId); relation.setProjectId(projectId); relations.add(relation); } int rows = maTeProjectMapper.insertBatch(relations); if (rows != relations.size()) { throw new ServiceException("新增商户服务项目失败"); } } }