package cn.iocoder.yudao.module.tickets.service.impl;

import cn.iocoder.yudao.module.tickets.entity.DlRepairTitem;
import cn.iocoder.yudao.module.tickets.mapper.DlRepairTitemMapper;
import cn.iocoder.yudao.module.tickets.service.DlRepairTicketsService;
import cn.iocoder.yudao.module.tickets.service.DlRepairTitemService;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTitemReqVO;
import cn.iocoder.yudao.module.tickets.vo.DlRepairTitemRespVO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;

/**
 * 针对表【dl_repair_titem(维修工单子表)】的数据库操作Service实现
 *
 * @author 小李
 * @date 18:20 2024/9/13
 **/
@Service
public class DlRepairTitemServiceImpl extends ServiceImpl<DlRepairTitemMapper, DlRepairTitem>
        implements DlRepairTitemService {

    @Resource
    private DlRepairTicketsService repairTicketsService;

    /**
     * 维修工单子表 分页
     *
     * @author 小李
     * @date 10:34 2024/9/21
     * @param repairTitemRespVO 查询对象
     **/
    @Override
    public IPage<DlRepairTitemRespVO> getTItemPage(DlRepairTitemRespVO repairTitemRespVO, Page<DlRepairTitemRespVO> page){
        return baseMapper.getTItemPage(repairTitemRespVO, page);
    }

    /**
     * 获取当前操作人操作的工单中的项目
     *
     * @param ticketId 工单ID
     * @author 小李
     * @date 15:01 2024/10/18
     **/
    @Override
    public List<DlRepairTitem> getProjectList(String ticketId){
        return baseMapper.selectList(new LambdaQueryWrapper<DlRepairTitem>().and(item -> {
            item.eq(DlRepairTitem::getItemType, "01")
                    .eq(DlRepairTitem::getTicketId, ticketId);
        }));
    }

    /**
     * 更新工单子表中维修人员、销售人员信息（app）
     *
     * @param dlRepairTitem
     * @return
     */
    @Override
    public DlRepairTitem updateRepairAndSale(DlRepairTitem dlRepairTitem) {
        baseMapper.updateRepairAndSale(dlRepairTitem);
        return dlRepairTitem;
    }

    /**
     * 查看单个维修子表的数据
     *
     * @author 小李
     * @param id 子表ID
     **/
    @Override
    public DlRepairTitem getItemById(String id){
        return baseMapper.selectById(id);
    }

    /**
     * 修改单个工单子项的内容
     *
     * @author 小李
     * @date 15:41 2024/10/24
     * @param dlRepairTitemReqVO 对象
     **/
    @Override
    @DSTransactional
    public void updateItemById(DlRepairTitemReqVO dlRepairTitemReqVO){
        // 更新工单子表
        DlRepairTitem titem = new DlRepairTitem();
        titem.setId(dlRepairTitemReqVO.getId());
        titem.setItemCount(dlRepairTitemReqVO.getItemCount());
        titem.setItemPrice(dlRepairTitemReqVO.getItemPrice());
        titem.setItemDiscount(dlRepairTitemReqVO.getItemDiscount());
        // 计算总价
        BigDecimal total = titem.getItemPrice().multiply(BigDecimal.valueOf(titem.getItemCount())).multiply(titem.getItemDiscount());
        titem.setItemMoney(total);
        baseMapper.updateById(titem);

        // 重新计算工单的一些数值
        boolean flag = repairTicketsService.computeTicket(dlRepairTitemReqVO.getTicketId());
        if (!flag){
            throw exception0(500, "系统异常");
        }
    }

    /**
     * 维修工单单个子项
     *
     * @author 小李
     * @date 20:18 2024/10/24
     * @param id 工单子项ID
     **/
    @Override
    @DSTransactional
    public void removeItemById(String id){
        // 先查出来备用
        DlRepairTitem titem = baseMapper.selectById(id);
        // 删除数据
        baseMapper.deleteById(id);
        // 更新主表
        repairTicketsService.computeTicket(titem.getTicketId());
    }

    /**
     * 更新工单子表，维修项目配件的单价、数量、折扣、单项总价等
     *
     * @param itemList
     * @author vinjor-M
     * @date 16:11 2024/10/31
     */
    @Override
    public void updateRepairItem(List<DlRepairTitem> itemList) {
        this.updateBatchById(itemList);
        //重新计划工单价格
        repairTicketsService.computeTicket(itemList.get(0).getTicketId());
    }
}




