package com.ylx.massage.service.impl;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ylx.common.core.domain.AjaxResult;
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.ContractRecord;
import com.ylx.massage.domain.MaProject;
import com.ylx.massage.domain.MaTeProject;
import com.ylx.massage.domain.dto.MaProjectSaveDto;
import com.ylx.massage.domain.dto.MaTechnicianAuditQueryDTO;
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.MaTechnicianAuditListVO;
import com.ylx.massage.domain.vo.MaTechnicianMerchantDetailVO;
import com.ylx.massage.domain.vo.MaTechnicianMerchantListVO;
import com.ylx.massage.domain.vo.MerchantVo;
import com.ylx.massage.mapper.ContractRecordMapper;
import com.ylx.massage.mapper.MaProjectMapper;
import com.ylx.massage.mapper.MaTeProjectMapper;
import com.ylx.massage.service.TbFileService;
import com.ylx.project.domain.Project;
import com.ylx.project.mapper.ProjectMapper;
import lombok.Data;
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;
import org.springframework.web.multipart.MultipartFile;

/**
 * 技师Service业务层处理
 *
 * @author ylx
 * @date 2024-03-22
 */
@Service
public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaTechnician> 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 Integer NOT_DELETED = 0;
    private static final String MERCHANT_STATUS_NORMAL = "0";

    @Autowired
    private MaTechnicianMapper maTechnicianMapper;

    @Autowired
    private MaTeProjectMapper maTeProjectMapper;
    @Autowired
    private MaProjectMapper maProjectMapper;

    @Autowired
    private ProjectMapper projectMapper;

    @Autowired
    private TbFileService fileService;

    @Autowired
    private ContractRecordMapper contractRecordMapper;

    /**
     * 商户入驻申请注册
     *
     * @param req 申请参数
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void apply(MaTechnicianAppAddVo req) {
        String phone = req.getTePhone();
        //商户入住前置条件校验
        getMaTechnician(req, phone);
        MaTechnician maTechnician = new MaTechnician();
        BeanUtils.copyProperties(req, maTechnician);
        //技师类型默认为真实商户
        maTechnician.setTechType(0);
        maTechnician.setCreateBy("admin");
        maTechnicianMapper.insert(maTechnician);

    }

    /**
     * 商户入住前置条件校验
     *
     * @param req
     * @param phone
     */
    private void getMaTechnician(MaTechnicianAppAddVo req, String phone) {
        // 1. 判断当前用户是否已入驻
        MaTechnician userProfile = getMaTechnician(req);
        if (userProfile != null) {
            throw new RuntimeException("当前用户已入驻，请勿重复提交");
        }

        // 2. 判断手机号是否已存在
        LambdaQueryWrapper<MaTechnician> queryPhoneWrapper = new LambdaQueryWrapper<>();
        queryPhoneWrapper.eq(MaTechnician::getTePhone, phone);
        queryPhoneWrapper.eq(MaTechnician::getIsDelete, 0);
        MaTechnician maTechnicianPhone = maTechnicianMapper.selectOne(queryPhoneWrapper);
        if (maTechnicianPhone != null) {
            throw new RuntimeException("手机号已存在，请更换手机号");
        }
        //3、判断手机号是否已绑定其他用户
        LambdaQueryWrapper<MaTechnician> queryTePhoneWrapper = new LambdaQueryWrapper<>();
        queryTePhoneWrapper.eq(MaTechnician::getTePhone, phone);
        queryTePhoneWrapper.eq(MaTechnician::getIsDelete, 0);
        queryTePhoneWrapper.eq(MaTechnician::getAuditStatus, 2);
        MaTechnician maTechnicianTePhone = maTechnicianMapper.selectOne(queryTePhoneWrapper);
        if (maTechnicianTePhone != null) {
            throw new RuntimeException("手机号已被其他用户绑定，请更换手机号");
        }

    }

    /**
     * 判断当前用户是否已入驻
     *
     * @return
     */
    private MaTechnician getMaTechnician(MaTechnicianAppAddVo req) {
        LambdaQueryWrapper<MaTechnician> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MaTechnician::getTePhone, req.getTePhone());
        queryWrapper.eq(MaTechnician::getIsDelete, 0);
        queryWrapper.eq(MaTechnician::getAuditStatus, 2);
        //queryWrapper.eq(MaTechnician::getOpenService, req.getOpenService());
        queryWrapper.eq(MaTechnician::getServiceTag,req.getServiceTag());
        MaTechnician userProfile = maTechnicianMapper.selectOne(queryWrapper);
        return userProfile;
    }

    /**
     * 查询商户服务项目列表
     *
     * @param userId      商户id
     * @param auditStatus 审核状态
     * @return 技师列表
     */
    @Override
    public List<MaProject> selectMaTechnicianListBy(String userId, String auditStatus) {

        LambdaQueryWrapper<MaProject> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MaProject::getMerchantId, userId);
        queryWrapper.eq(MaProject::getAuditStatus, auditStatus);
        return maProjectMapper.selectList(queryWrapper);
    }

    /**
     * 查询服务分类项目列表
     *
     * @param typeId 技师类型
     * @return 技师列表
     */
    @Override
    public List<Project> selectTechnicianListBy(String typeId) {
        LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Project::getType, typeId);
        return projectMapper.selectList(queryWrapper);
    }

    /**
     * 查询技师
     *
     * @param id 技师主键
     * @return 技师
     */
    @Override
    public MaTechnician selectMaTechnicianById(Long id) {
        return maTechnicianMapper.selectMaTechnicianById(id);
    }

    /**
     * 查询技师列表
     *
     * @param maTechnician 技师
     * @return 技师
     */
    @Override
    public List<MaTechnician> 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) {
        MerchantProjectSelection selection = 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(joinIds(selection.getCategoryIds()));
        maTechnician.setTeProject(joinProjectTitles(selection.getProjectIds(), selection.getProjectMap()));

        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(), selection.getProjectIds());
        return rows;
    }

    /**
     * 后台编辑商户
     *
     * @param id        商户ID
     * @param dto       编辑商户参数
     * @param loginUser 当前登录用户
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateMerchant(Long id, MaTechnicianMerchantAddDTO dto, LoginUser loginUser) {
        if (id == null) {
            throw new ServiceException("商户ID不能为空");
        }
        MaTechnician existsMerchant = maTechnicianMapper.selectMerchantById(id.intValue());
        if (existsMerchant == null || !NOT_DELETED.equals(existsMerchant.getIsDelete())) {
            throw new ServiceException("商户不存在或已删除");
        }

        MerchantProjectSelection selection = checkMerchantAddParam(dto);
        String userName = loginUser.getUser().getUserName();

        MaTechnician maTechnician = new MaTechnician();
        maTechnician.setId(id);
        maTechnician.setTeName(dto.getTeName().trim());
        maTechnician.setTeNickName(dto.getTeNickName().trim());
        maTechnician.setTeSex(dto.getTeSex());
        maTechnician.setTePhone(dto.getTePhone().trim());
        maTechnician.setOpenService(joinIds(selection.getCategoryIds()));
        maTechnician.setTeProject(joinProjectTitles(selection.getProjectIds(), selection.getProjectMap()));
        maTechnician.setTechType(dto.getTechType());
        maTechnician.setIsRecommend(normalizeSwitchValue(dto.getIsRecommend(), "是否推荐"));
        maTechnician.setUpdateBy(userName);
        maTechnician.setUpdateTime(DateUtils.getNowDate());

        int rows = maTechnicianMapper.updateMerchantById(maTechnician);
        if (rows <= 0) {
            throw new ServiceException("编辑商户失败");
        }
        replaceProjectRelations(id, selection.getProjectIds());
        return rows;
    }

    /**
     * 后台上传商户合同文件
     *
     * @param id        商户ID
     * @param file      合同文件
     * @param loginUser 当前登录用户
     * @return 上传结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult uploadMerchantContract(Integer id, MultipartFile file, LoginUser loginUser) {
        if (id == null) {
            throw new ServiceException("商户ID不能为空");
        }
        if (file == null || file.isEmpty()) {
            throw new ServiceException("合同文件不能为空");
        }
        MaTechnician existsMerchant = maTechnicianMapper.selectMerchantById(id);
        if (existsMerchant == null || !NOT_DELETED.equals(existsMerchant.getIsDelete())) {
            throw new ServiceException("商户不存在或已删除");
        }

        AjaxResult uploadResult = fileService.uploadFile(file);
        if (uploadResult == null || uploadResult.isError()) {
            String message = uploadResult == null ? "合同文件上传失败" : String.valueOf(uploadResult.get(AjaxResult.MSG_TAG));
            throw new ServiceException(message);
        }
        Object url = uploadResult.get("url");
        if (url == null || StringUtils.isBlank(String.valueOf(url))) {
            throw new ServiceException("合同文件上传失败，未返回文件地址");
        }

        ContractRecord contractRecord = new ContractRecord();
        contractRecord.setMerchantId(id);
        contractRecord.setContractName(file.getOriginalFilename());
        contractRecord.setFileUrl(String.valueOf(url));
        contractRecord.setSignTime(DateUtils.getNowDate());
        contractRecord.setSignerName(existsMerchant.getTeName());
        contractRecord.setCreateTime(DateUtils.getNowDate());

        int rows = contractRecordMapper.insert(contractRecord);
        if (rows <= 0) {
            throw new ServiceException("保存合同记录失败");
        }
        return uploadResult;
    }

    /**
     * 全量替换商户与服务项目关联关系。
     *
     * @param technicianId 商户ID
     * @param projectIds   服务项目ID集合
     */
    private void replaceProjectRelations(Long technicianId, Set<Long> projectIds) {
        if (technicianId == null) {
            throw new ServiceException("商户ID不能为空");
        }
        maTeProjectMapper.deleteByTechnicianId(technicianId);
        for (Long projectId : projectIds) {
            MaTeProject relation = new MaTeProject();
            relation.setTeId(technicianId);
            relation.setProjectId(projectId);
            int rows = maTeProjectMapper.insert(relation);
            if (rows <= 0) {
                throw new ServiceException("编辑商户服务项目失败");
            }
        }
    }

    /**
     * 后台查询商户入驻审核列表
     *
     * @param page 分页参数
     * @param dto  查询条件
     * @return 商户入驻审核分页列表
     */
    @Override
    public Page<MaTechnicianAuditListVO> selectMerchantAuditList(Page<MaTechnicianAuditListVO> page, MaTechnicianAuditQueryDTO dto) {
        if (dto != null && dto.getAuditStatus() != null) {
            checkEnumValue(dto.getAuditStatus(), "审核状态", 0, 1, 2, 3);
        }
        Page<MaTechnicianAuditListVO> pageParam = page == null ? new Page<>(1, 10) : page;
        return maTechnicianMapper.selectMerchantAuditList(pageParam, dto);
    }

    /**
     * 后台查询商户列表
     *
     * @param page 分页参数
     * @param dto  查询条件
     * @return 商户分页列表
     */
    @Override
    public Page<MaTechnicianMerchantListVO> selectMerchantList(Page<MaTechnicianMerchantListVO> page,
                                                               MaTechnicianMerchantQueryDTO dto) {
        Page<MaTechnicianMerchantListVO> pageParam = page == null ? new Page<>(1, 10) : page;
        return maTechnicianMapper.selectMerchantList(pageParam, dto);
    }

    /**
     * 后台查询商户详情
     *
     * @param id 商户ID
     * @return 商户详情
     */
    @Override
    public MaTechnicianMerchantDetailVO selectMerchantDetail(Long id) {
        if (id == null) {
            throw new ServiceException("商户ID不能为空");
        }
        MaTechnicianMerchantDetailVO detail = maTechnicianMapper.selectMerchantDetailById(id);
        if (detail == null) {
            throw new ServiceException("商户不存在或已删除");
        }
        return detail;
    }

    /**
     * 修改技师
     *
     * @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) {
        return maTechnicianMapper.isHasMerchantCity(areaCode);
    }

    /**
     * 首页按摩推荐
     *
     * @param dto
     * @return
     */
    @Override
    public List<MerchantVo> getMerchantRecommend(MassageMerchantRecommendDto dto) {
        return maTechnicianMapper.getMerchantRecommend(dto);
    }

    private MerchantProjectSelection 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);
        Set<Integer> categoryIds = checkOpenServiceIds(dto.getOpenService());
        checkEnumValue(dto.getTechType(), "商户类型", 0, 1);
        if (dto.getIsRecommend() != null) {
            checkEnumValue(dto.getIsRecommend(), "是否推荐", 0, 1);
        }
        return checkProjectIds(dto.getProjectIds(), categoryIds);
    }

    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  服务项目ID集合
     * @param categoryIds 服务类目ID集合
     * @return 有效服务项目ID集合
     */
    private MerchantProjectSelection checkProjectIds(List<Long> projectIds, Set<Integer> categoryIds) {
        if (projectIds == null || projectIds.isEmpty()) {
            throw new ServiceException("服务项目不能为空");
        }

        Set<Long> distinctProjectIds = new LinkedHashSet<>();
        for (Long projectId : projectIds) {
            if (projectId == null) {
                throw new ServiceException("服务项目ID不能为空");
            }
            distinctProjectIds.add(projectId);
        }

        List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
                                                                  .in(Project::getId, distinctProjectIds)
                                                                  .eq(Project::getIsDelete, 0));
        if (projects.size() != distinctProjectIds.size()) {
            throw new ServiceException("服务项目不存在或已删除");
        }

        Map<Long, Project> projectMap = projects.stream()
                                                .collect(Collectors.toMap(project -> project.getId().longValue(), Function.identity(), (left, right) -> left));
        Set<Integer> projectCategoryIds = new LinkedHashSet<>();
        for (Long projectId : distinctProjectIds) {
            Project project = projectMap.get(projectId);
            if (project == null || project.getCategoryId() == null) {
                throw new ServiceException("服务项目类目不能为空");
            }
            if (!categoryIds.contains(project.getCategoryId())) {
                throw new ServiceException("服务项目不属于所选服务类目");
            }
            projectCategoryIds.add(project.getCategoryId());
        }
        if (!projectCategoryIds.containsAll(categoryIds)) {
            throw new ServiceException("每个服务类目至少选择一个服务项目");
        }
        return new MerchantProjectSelection(categoryIds, distinctProjectIds, projectMap);
    }

    /**
     * 校验服务类目ID集合
     *
     * @param openService 服务类目ID集合
     * @return 去重后的服务类目ID集合
     */
    private Set<Integer> checkOpenServiceIds(List<Integer> openService) {
        if (openService == null || openService.isEmpty()) {
            throw new ServiceException("服务类目不能为空");
        }
        Set<Integer> categoryIds = new LinkedHashSet<>();
        for (Integer categoryId : openService) {
            if (categoryId == null) {
                throw new ServiceException("服务类目ID不能为空");
            }
            categoryIds.add(categoryId);
        }
        return categoryIds;
    }

    private String joinIds(Set<Integer> ids) {
        return ids.stream()
                       .map(String::valueOf)
                       .collect(Collectors.joining(","));
    }

    private String joinProjectTitles(Set<Long> projectIds, Map<Long, Project> projectMap) {
        return projectIds.stream()
                       .map(projectMap::get)
                       .map(Project::getTitle)
                       .filter(StringUtils::isNotBlank)
                       .collect(Collectors.joining(","));
    }

    /**
     * 新增商户与服务项目关联关系
     *
     * @param technicianId
     * @param projectIds
     */
    private void insertProjectRelations(Long technicianId, Set<Long> projectIds) {
        if (technicianId == null) {
            throw new ServiceException("商户ID不能为空");
        }

        List<MaTeProject> 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("新增商户服务项目失败");
        }
    }

    private static class MerchantProjectSelection {
        private final Set<Integer> categoryIds;
        private final Set<Long> projectIds;
        private final Map<Long, Project> projectMap;

        private MerchantProjectSelection(Set<Integer> categoryIds, Set<Long> projectIds, Map<Long, Project> projectMap) {
            this.categoryIds = categoryIds;
            this.projectIds = projectIds;
            this.projectMap = projectMap;
        }

        private Set<Integer> getCategoryIds() {
            return categoryIds;
        }

        private Set<Long> getProjectIds() {
            return projectIds;
        }

        private Map<Long, Project> getProjectMap() {
            return projectMap;
        }
    }

    /**
     * 获取未申请技能列表
     *
     * @param userId
     * @param typeId
     * @return
     */
    @Override
    public List<Project> getNotApplyList(String userId, String typeId) {
        LambdaQueryWrapper<MaProject> query = new LambdaQueryWrapper<>();
        query.eq(MaProject::getMerchantId, userId);
        query.eq(MaProject::getMerchantType, typeId);
        List<MaProject> maProjectList = maProjectMapper.selectList(query);
        // 获取已申请技能ID集合
        List<String> projectIdList = maProjectList.stream().map(MaProject::getProjectId).collect(Collectors.toList());
        LambdaQueryWrapper<Project> query1 = new LambdaQueryWrapper<>();
        query1.eq(Project::getType, typeId);
        query1.notIn(Project::getId, projectIdList);
        return projectMapper.selectList(query1);
    }

    /**
     * 申请开通新服务
     *
     * @param dto
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public int applyForService(MaProjectSaveDto dto) {
        if (Objects.isNull(dto)) {
            return 0;
        }
        if (dto.getProjectIdList().size() > 0) {
            // 插入商户技能
            extracted(dto);
        } else {
            return 0;
        }
        return 1;
    }

    private void extracted(MaProjectSaveDto dto) {
        LambdaQueryWrapper<Project> query = new LambdaQueryWrapper<>();
        query.in(Project::getId, dto.getProjectIdList());
        List<Project> projectList = projectMapper.selectList(query);
        for (Project project : projectList) {
            MaProject maProject = new MaProject();
            maProject.setProjectId(project.getId().toString());
            maProject.setProjectName(project.getTitle());
            maProject.setProjectDescribe(project.getDetail());
            maProject.setProjectDuration(project.getStandardDuration());
            maProject.setProjectOriginalPrice(project.getPrice());
            maProject.setProjectMaxPrice(project.getPriceMax());
            maProject.setProjectLowestPrice(project.getPriceMin());
            maProject.setCreateBy(dto.getUserId());
            maProject.setMerchantId(dto.getUserId());
            maProject.setApplyTime((Data) new Date());
            maProject.setMerchantPhone(dto.getMerchantPhone());
            maProjectMapper.insert(maProject);
        }
    }
}
