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

import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.module.property.entity.Property;
import cn.iocoder.yudao.module.property.entity.PropertyDeal;
import cn.iocoder.yudao.module.property.entity.PropertyDealItem;
import cn.iocoder.yudao.module.property.mapper.PropertyDealItemMapper;
import cn.iocoder.yudao.module.property.service.PropertyDealItemService;
import cn.iocoder.yudao.module.property.service.PropertyDealService;
import cn.iocoder.yudao.module.property.service.PropertyService;
import cn.iocoder.yudao.module.property.vo.PropertyDealItemReqVO;
import cn.iocoder.yudao.module.property.vo.PropertyDealItemRespVO;
import cn.iocoder.yudao.module.property.vo.PropertyDealReqVO;
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 com.wechat.pay.java.service.certificate.model.Data;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;

/**
 * 企业管理-资产处置子 Service 实现类
 *
 * @author 小李
 * @date 21:37 2024/8/16
 **/
@Service
@Validated
public class PropertyDealItemServiceImpl extends ServiceImpl<PropertyDealItemMapper, PropertyDealItem> implements PropertyDealItemService {

    @Resource
    @Lazy // 解决循环依赖问题
    private PropertyDealService dealService;

    @Resource
    @Lazy
    private PropertyService propertyService;

    /**
     * 获得企业管理-资产处置子表分页
     *
     * @param pageReqVO
     * @author 小李
     * @date 9:18 2024/8/17
     **/
    @Override
    public IPage<PropertyDealItemRespVO> getPropertyDealItemPage(PropertyDealReqVO pageReqVO, Page<PropertyDealItemRespVO> page) {
        return baseMapper.getPropertyDealItemPage(pageReqVO, page);
    }

    /**
     * 获得企业管理-资产处置子表
     * @author 小李
     * @date 10:20 2024/8/17
     * @param id 记录ID
     **/
    public PropertyDealItemRespVO getPropertyDealItem(String id){
        return baseMapper.getPropertyDealItem(id);
    }

    /**
     * 更新企业管理-资产处置子表
     * @author 小李
     * @date 14:05 2024/8/17
     * @param updateReqVO 更新对象
     **/
    @Override
    public void updatePropertyDealItem(PropertyDealItemReqVO updateReqVO){
        baseMapper.updateById(updateReqVO);
    }

    /**
     * 删除企业管理-资产处置子表
     * @author 小李
     * @date 14:55 2024/8/17
     * @param id 记录
     **/
    @Override
    @DSTransactional
    public void deletePropertyDealItem(String id){
        // 这里删除是删除子表的一条记录，所以要先去拿主表的记录，看看自己是不是最后一条，是的话主表也要删
        // 获取子表的详细信息
        PropertyDealItem dealItem = baseMapper.selectById(id);
        // 获取主表的详细信息
        PropertyDeal deal = dealService.getById(dealItem.getDealId());
        // 反查统计子表相关联的数据的数量
        Long count = baseMapper.selectCount(new LambdaQueryWrapper<PropertyDealItem>().eq(PropertyDealItem::getDealId, deal.getId()));
        // 如果减掉一条记录就没有记录了，就要删除主表
        if (count - 1L == 0){
            dealService.removeById(deal.getId());
        }
        // 删除子表
        baseMapper.deleteById(id);
    }

    /**
     * 更新企业管理-资产变动子表
     *
     * @param updateReqVO 更新对象
     * @author 小李
     * @date 14:05 2024/8/17
     **/
    @Override
    @DSTransactional
    public void updatePropertyDealItemChange(PropertyDealItemReqVO updateReqVO){
        // 修改资产表
        Property property = BeanUtil.toBean(updateReqVO, Property.class);
        property.setId(updateReqVO.getPropertyId());
        propertyService.updateById(property);

        // 修改变动子表
        baseMapper.updateById(updateReqVO);
    }
}