package com.ruoyi.system.service.impl.projectV2;

import java.util.List;

import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.projectV2.ZsyzSkcy;
import com.ruoyi.system.mapper.projectV2.ZsyzSkcyMapper;
import com.ruoyi.system.service.projectV2.IZsyzSkcyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 省库产业Service业务层处理
 * 
 * @author boman
 * @date 2023-03-29
 */
@Service
public class ZsyzSkcyServiceImpl implements IZsyzSkcyService
{
    @Autowired
    private ZsyzSkcyMapper zsyzSkcyMapper;

    /**
     * 查询省库产业
     * 
     * @param skcyId 省库产业主键
     * @return 省库产业
     */
    @Override
    public ZsyzSkcy selectZsyzSkcyBySkcyId(Long skcyId)
    {
        return zsyzSkcyMapper.selectZsyzSkcyBySkcyId(skcyId);
    }

    /**
     * 查询省库产业列表
     * 
     * @param zsyzSkcy 省库产业
     * @return 省库产业
     */
    @Override
    public List<ZsyzSkcy> selectZsyzSkcyList(ZsyzSkcy zsyzSkcy)
    {
        return zsyzSkcyMapper.selectZsyzSkcyList(zsyzSkcy);
    }

    /**
     * 新增省库产业
     * 
     * @param zsyzSkcy 省库产业
     * @return 结果
     */
    @Override
    public int insertZsyzSkcy(ZsyzSkcy zsyzSkcy)
    {
        ZsyzSkcy info = zsyzSkcyMapper.selectZsyzSkcyBySkcyId(zsyzSkcy.getParentId());
        if (info == null){
            zsyzSkcy.setParentId(0L);
            zsyzSkcy.setAncestors("0");
        }else {
            // 如果父节点不为正常状态,则不允许新增子节点
            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
            {
                throw new ServiceException("省库产业停用，不允许新增");
            }
            zsyzSkcy.setAncestors(info.getAncestors() + "," + zsyzSkcy.getParentId());
        }
        zsyzSkcy.setCreateTime(DateUtils.getNowDate());
        return zsyzSkcyMapper.insertZsyzSkcy(zsyzSkcy);
    }

    /**
     * 修改省库产业
     * 
     * @param zsyzSkcy 省库产业
     * @return 结果
     */
    @Override
    public int updateZsyzSkcy(ZsyzSkcy zsyzSkcy)
    {
        ZsyzSkcy newParentZsyzSkcy = zsyzSkcyMapper.selectZsyzSkcyBySkcyId(zsyzSkcy.getParentId());
        ZsyzSkcy oldZsyzSkcy = zsyzSkcyMapper.selectZsyzSkcyBySkcyId(zsyzSkcy.getSkcyId());
        if (StringUtils.isNotNull(newParentZsyzSkcy) && StringUtils.isNotNull(oldZsyzSkcy))
        {
            String newAncestors = newParentZsyzSkcy.getAncestors() + "," + newParentZsyzSkcy.getSkcyId();
            String oldAncestors = oldZsyzSkcy.getAncestors();
            zsyzSkcy.setAncestors(newAncestors);
            updateZsyzSkcyChildren(zsyzSkcy.getSkcyId(), newAncestors, oldAncestors);
        }
        zsyzSkcy.setUpdateTime(DateUtils.getNowDate());
        int result = zsyzSkcyMapper.updateZsyzSkcy(zsyzSkcy);
        if (UserConstants.DEPT_NORMAL.equals(zsyzSkcy.getStatus()) && StringUtils.isNotEmpty(zsyzSkcy.getAncestors())
                && !StringUtils.equals("0", zsyzSkcy.getAncestors()))
        {
            // 如果该部门是启用状态，则启用该部门的所有上级部门
            updateParentZsyzSkcyStatusNormal(zsyzSkcy);
        }
        return result;
    }

    public void updateZsyzSkcyChildren(Long skcyId, String newAncestors, String oldAncestors)
    {
        List<ZsyzSkcy> children = zsyzSkcyMapper.selectChildrenSkcyById(skcyId);
        for (ZsyzSkcy child : children)
        {
            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
        }
        if (children.size() > 0)
        {
            zsyzSkcyMapper.updateZsyzSkcyChildren(children);
        }
    }

    /**
     * 修改该产业的父级产业状态
     *
     * @param zsyzSkcy 当前产业
     */
    private void updateParentZsyzSkcyStatusNormal(ZsyzSkcy zsyzSkcy)
    {
        String ancestors = zsyzSkcy.getAncestors();
        Long[] skcyIds = Convert.toLongArray(ancestors);
        zsyzSkcyMapper.updateZsyzSkcyStatusNormal(skcyIds);
    }
    /**
     * 批量删除省库产业
     * 
     * @param skcyIds 需要删除的省库产业主键
     * @return 结果
     */
    @Override
    public int deleteZsyzSkcyBySkcyIds(Long[] skcyIds)
    {
        return zsyzSkcyMapper.deleteZsyzSkcyBySkcyIds(skcyIds);
    }

    /**
     * 删除省库产业信息
     * 
     * @param skcyId 省库产业主键
     * @return 结果
     */
    @Override
    public int deleteZsyzSkcyBySkcyId(Long skcyId)
    {
        return zsyzSkcyMapper.deleteZsyzSkcyBySkcyId(skcyId);
    }

    @Override
    public boolean hasChildBySkcyId(Long skcyId) {
        int result = zsyzSkcyMapper.hasChildBySkcyId(skcyId);
        return result > 0;
    }
}
