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

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
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.PropertyDealMapper;
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.PropertyDealReqVO;
import cn.iocoder.yudao.module.property.vo.PropertyDealRespVO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


/**
 * 企业管理-资产处置单/变动单 Service 实现类
 * @author 小李
 * @date 21:26 2024/8/16
**/
@Service
@Validated
public class PropertyDealServiceImpl extends ServiceImpl<PropertyDealMapper, PropertyDeal> implements PropertyDealService {

    @Resource
    @Lazy // 解决循环依赖问题
    private PropertyDealItemService propertyDealItemService;

    @Resource
    @Lazy
    private PropertyService propertyService;

    /**
     * 创建企业管理-资产处置单/变动单
     * @author 小李
     * @date 21:24 2024/8/16
     * @param createReqVO 处置单/变动单对象
     **/
    @Override
    @DSTransactional
    public void createPropertyDeal(PropertyDealRespVO createReqVO) {
        /* 创建主表 */
        PropertyDeal propertyDeal = BeanUtil.toBean(createReqVO, PropertyDeal.class);
        propertyDeal.setCorpId(createReqVO.getPropList().get(0).getCorpId());
        propertyDeal.setDeptId(createReqVO.getPropList().get(0).getDeptId());
        baseMapper.insert(propertyDeal);
        String dealId = propertyDeal.getId();
        /* 创建子表 */
        List<PropertyDealItem> propertyDealItems = createReqVO.getPropList().stream().map(item -> {
            PropertyDealItem propertyDealItem = new PropertyDealItem();
            propertyDealItem.setDealId(dealId);
            propertyDealItem.setPropertyId(item.getId());
            propertyDealItem.setDealWay(item.getDealWay());
            propertyDealItem.setRemark(ObjectUtil.isNotEmpty(item.getRemark()) ? item.getRemark() : "");
            return propertyDealItem;
        }).collect(Collectors.toList());
        propertyDealItemService.saveBatch(propertyDealItems);
    }

    /**
     * 创建企业管理-资产变动单
     * @author 小李
     * @date 21:24 2024/8/16
     * @param createReqVO 提交对象
     **/
    @Override
    @DSTransactional
    public void createPropertyDealChange(PropertyDealRespVO createReqVO){
        /* 创建主表 */
        PropertyDeal propertyDeal = BeanUtil.toBean(createReqVO, PropertyDeal.class);
        propertyDeal.setCorpId(createReqVO.getPropList().get(0).getCorpId());
        propertyDeal.setDeptId(createReqVO.getPropList().get(0).getDeptId());
        baseMapper.insert(propertyDeal);
        String dealId = propertyDeal.getId();

        // 资产旧对象集合
        List<Property> properties = new ArrayList<>();
        /* 创建子表 */
        List<PropertyDealItem> propertyDealItems = createReqVO.getPropList().stream().map(item -> {
            // 查询资产旧对象
            Property property = propertyService.getProperty(item.getId());

            // 构建新对象
            PropertyDealItem propertyDealItem = new PropertyDealItem();
            // 设置正常属性
            propertyDealItem.setDealId(dealId);
            propertyDealItem.setPropertyId(item.getId());
            propertyDealItem.setDealWay(item.getDealWay());
            propertyDealItem.setRemark(ObjectUtil.isNotEmpty(item.getRemark()) ? item.getRemark() : "");
            // 设置老属性
            propertyDealItem.setOldCorpId(property.getCorpId());
            propertyDealItem.setOldDeptId(property.getDeptId());
            propertyDealItem.setOldPosId(property.getPosId());
            propertyDealItem.setOldUserId(Long.valueOf(property.getUserId()));
            // 设置新属性
            propertyDealItem.setCorpId(item.getCorpId());
            propertyDealItem.setDeptId(item.getDeptId());
            propertyDealItem.setPosId(item.getPosId());
            propertyDealItem.setUserId(Long.valueOf(item.getUserId()));

            // 更新资产数据
            property.setCorpId(item.getCorpId());
            property.setUserId(item.getUserId());
            property.setPosId(item.getPosId());
            properties.add(property);
            return propertyDealItem;
        }).collect(Collectors.toList());
        // 新增子表
        propertyDealItemService.saveBatch(propertyDealItems);
        // 更新资产
        propertyService.updateBatchById(properties);
    }
}