package com.pusong.business.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.pusong.business.domain.PsTaskAppoint;
import com.pusong.business.domain.PsTaskMain;
import com.pusong.business.mapper.PsTaskAppointMapper;
import com.pusong.business.mapper.PsTaskMainMapper;
import com.pusong.common.core.utils.MapstructUtils;
import com.pusong.common.core.utils.StringUtils;
import com.pusong.common.mybatis.core.page.TableDataInfo;
import com.pusong.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.pusong.business.domain.bo.PsTaskWorkRecordBo;
import com.pusong.business.domain.vo.PsTaskWorkRecordVo;
import com.pusong.business.domain.PsTaskWorkRecord;
import com.pusong.business.mapper.PsTaskWorkRecordMapper;
import com.pusong.business.service.IPsTaskWorkRecordService;

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

/**
 * 外勤任务记录Service业务层处理
 *
 * @author wls
 * @date 2024-08-09
 */
@RequiredArgsConstructor
@Service
public class PsTaskWorkRecordServiceImpl implements IPsTaskWorkRecordService {

    private final PsTaskWorkRecordMapper baseMapper;
    private final PsTaskAppointMapper appointMapper;
    private final PsTaskMainMapper taskMainMapper;


    /**
     * 根据任务委派id查询工作进度列表
     *
     * @param id 任务委派id
     * @return 外勤任务记录列表
     */
    @Override
    public List<PsTaskWorkRecordVo> queryListByAppointId(Long id) {
        LambdaQueryWrapper<PsTaskWorkRecord> lqw = Wrappers.lambdaQuery();
        lqw.eq(PsTaskWorkRecord::getDelFlag,"0");
        lqw.eq(PsTaskWorkRecord::getTaskAppointId,id);
        return baseMapper.selectVoList(lqw);
    }
    /**
     * 根据主任务id查询工作进度列表
     *
     * @param id 任务委派id
     * @return 外勤任务记录列表
     */
    @Override
    public List<PsTaskWorkRecordVo> queryListByTaskId(Long id) {
        List<PsTaskAppoint> list = appointMapper.selectList(Wrappers.<PsTaskAppoint>lambdaQuery().eq(PsTaskAppoint::getTaskId, id).eq(PsTaskAppoint::getAppointType, 2));
        if(CollectionUtils.isEmpty(list)){
            return new ArrayList<>();
        }
        //转map
        Map<Long, PsTaskAppoint> map = list.stream().collect(Collectors.toMap(PsTaskAppoint::getId, Function.identity()));
        List<PsTaskWorkRecordVo> lis = baseMapper.selectVoList(Wrappers.<PsTaskWorkRecord>lambdaQuery()
                .eq(PsTaskWorkRecord::getDelFlag, "0").in(PsTaskWorkRecord::getTaskAppointId, map.keySet()));
        lis.forEach(item->{
            item.setExecutor(map.get(item.getTaskAppointId()).getExecutor());
        });
        return lis;
    }
    /**
     * 新增外勤任务记录
     *
     * @param bo 外勤任务记录
     * @return 是否新增成功
     */
    @Override
    public Boolean insertByBo(PsTaskWorkRecordBo bo) {
        PsTaskAppoint appoint = appointMapper.selectById(bo.getTaskAppointId());
        PsTaskWorkRecord add = MapstructUtils.convert(bo, PsTaskWorkRecord.class);
        add.setContractCode(appoint.getContractCode());
        boolean flag = baseMapper.insert(add) > 0;
        return flag;
    }


//    /**
//     * 查询外勤任务记录
//     *
//     * @param id 主键
//     * @return 外勤任务记录
//     */
//    @Override
//    public PsTaskWorkRecordVo queryById(Long id){
//        return baseMapper.selectVoById(id);
//    }
//
//    /**
//     * 分页查询外勤任务记录列表
//     *
//     * @param bo        查询条件
//     * @param pageQuery 分页参数
//     * @return 外勤任务记录分页列表
//     */
//    @Override
//    public TableDataInfo<PsTaskWorkRecordVo> queryPageList(PsTaskWorkRecordBo bo, PageQuery pageQuery) {
//        LambdaQueryWrapper<PsTaskWorkRecord> lqw = buildQueryWrapper(bo);
//        Page<PsTaskWorkRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
//        return TableDataInfo.build(result);
//    }
//
//    /**
//     * 查询符合条件的外勤任务记录列表
//     *
//     * @param bo 查询条件
//     * @return 外勤任务记录列表
//     */
//    @Override
//    public List<PsTaskWorkRecordVo> queryList(PsTaskWorkRecordBo bo) {
//        LambdaQueryWrapper<PsTaskWorkRecord> lqw = buildQueryWrapper(bo);
//        return baseMapper.selectVoList(lqw);
//    }
//
//    private LambdaQueryWrapper<PsTaskWorkRecord> buildQueryWrapper(PsTaskWorkRecordBo bo) {
//        Map<String, Object> params = bo.getParams();
//        LambdaQueryWrapper<PsTaskWorkRecord> lqw = Wrappers.lambdaQuery();
//        lqw.eq(bo.getTaskAppointId() != null, PsTaskWorkRecord::getTaskAppointId, bo.getTaskAppointId());
//        lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), PsTaskWorkRecord::getContractCode, bo.getContractCode());
//        lqw.eq(bo.getHandleDate() != null, PsTaskWorkRecord::getHandleDate, bo.getHandleDate());
//        lqw.eq(StringUtils.isNotBlank(bo.getHandleInfo()), PsTaskWorkRecord::getHandleInfo, bo.getHandleInfo());
//        lqw.eq(StringUtils.isNotBlank(bo.getHandlePlan()), PsTaskWorkRecord::getHandlePlan, bo.getHandlePlan());
//        lqw.eq(StringUtils.isNotBlank(bo.getNextType()), PsTaskWorkRecord::getNextType, bo.getNextType());
//        lqw.eq(StringUtils.isNotBlank(bo.getNextDesc()), PsTaskWorkRecord::getNextDesc, bo.getNextDesc());
//        lqw.eq(StringUtils.isNotBlank(bo.getNextDate()), PsTaskWorkRecord::getNextDate, bo.getNextDate());
//        return lqw;
//    }
//
//    /**
//     * 新增外勤任务记录
//     *
//     * @param bo 外勤任务记录
//     * @return 是否新增成功
//     */
//    @Override
//    public Boolean insertByBo(PsTaskWorkRecordBo bo) {
//        PsTaskWorkRecord add = MapstructUtils.convert(bo, PsTaskWorkRecord.class);
//        validEntityBeforeSave(add);
//        boolean flag = baseMapper.insert(add) > 0;
//        if (flag) {
//            bo.setId(add.getId());
//        }
//        return flag;
//    }
//
//    /**
//     * 修改外勤任务记录
//     *
//     * @param bo 外勤任务记录
//     * @return 是否修改成功
//     */
//    @Override
//    public Boolean updateByBo(PsTaskWorkRecordBo bo) {
//        PsTaskWorkRecord update = MapstructUtils.convert(bo, PsTaskWorkRecord.class);
//        validEntityBeforeSave(update);
//        return baseMapper.updateById(update) > 0;
//    }
//
//    /**
//     * 保存前的数据校验
//     */
//    private void validEntityBeforeSave(PsTaskWorkRecord entity){
//        //TODO 做一些数据校验,如唯一约束
//    }
//
//    /**
//     * 校验并批量删除外勤任务记录信息
//     *
//     * @param ids     待删除的主键集合
//     * @param isValid 是否进行有效性校验
//     * @return 是否删除成功
//     */
//    @Override
//    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
//        if(isValid){
//            //TODO 做一些业务上的校验,判断是否需要校验
//        }
//        return baseMapper.deleteBatchIds(ids) > 0;
//    }
}
