/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoGrain.entity.BizPssMoGrain;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.param.*;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoRotationEmptyPeriod.entity.BizPssMoRotationEmptyPeriod;
import com.unis.sys.modular.user.entity.SysUser;
import com.unis.sys.modular.user.mapper.SysUserMapper;
import io.swagger.annotations.Authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.unis.common.enums.CommonSortOrderEnum;
import com.unis.common.exception.CommonException;
import com.unis.common.page.CommonPageRequest;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.entity.BizPssMoInventoryTimeAnomaly;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.mapper.BizPssMoInventoryTimeAnomalyMapper;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.service.BizPssMoInventoryTimeAnomalyService;

import java.util.List;
import java.util.Objects;

/**
 * 模型优化-在库时间异常模型优化表Service接口实现类
 *
 * @author hjc
 * @date 2024/06/12 20:01
 **/
@Service
public class BizPssMoInventoryTimeAnomalyServiceImpl extends ServiceImpl<BizPssMoInventoryTimeAnomalyMapper, BizPssMoInventoryTimeAnomaly> implements BizPssMoInventoryTimeAnomalyService {

    @Autowired
    private BizPssMoInventoryTimeAnomalyMapper bizPssMoInventoryTimeAnomalyMapper;

    @Autowired
    private SysUserMapper sysUserMapper;

    @Override
    public Page<BizPssMoInventoryTimeAnomaly> page(BizPssMoInventoryTimeAnomalyPageParam bizPssMoInventoryTimeAnomalyPageParam) {
        QueryWrapper<BizPssMoInventoryTimeAnomaly> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotEmpty(bizPssMoInventoryTimeAnomalyPageParam.getModelName())) {
            queryWrapper.lambda().like(BizPssMoInventoryTimeAnomaly::getModelName, bizPssMoInventoryTimeAnomalyPageParam.getModelName());
        }
        if (ObjectUtil.isAllNotEmpty(bizPssMoInventoryTimeAnomalyPageParam.getSortField(), bizPssMoInventoryTimeAnomalyPageParam.getSortOrder())) {
            CommonSortOrderEnum.validate(bizPssMoInventoryTimeAnomalyPageParam.getSortOrder());
            queryWrapper.orderBy(true, bizPssMoInventoryTimeAnomalyPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
                    StrUtil.toUnderlineCase(bizPssMoInventoryTimeAnomalyPageParam.getSortField()));
        } else {
            queryWrapper.lambda().orderByDesc(BizPssMoInventoryTimeAnomaly::getCreateTime);
        }
        Page<BizPssMoInventoryTimeAnomaly> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
        List<BizPssMoInventoryTimeAnomaly> records = page.getRecords();
        if (CollectionUtil.isNotEmpty(records)) {
            for (BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly : records) {
                SysUser sysUser = sysUserMapper.selectById(bizPssMoInventoryTimeAnomaly.getCreateUser());
                if (ObjectUtil.isNotEmpty(sysUser)) {
                    bizPssMoInventoryTimeAnomaly.setCreateUser(sysUser.getName());
                }
            }
        }
        return page;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void add(BizPssMoInventoryTimeAnomalyAddParam bizPssMoInventoryTimeAnomalyAddParam) {
        List<BizPssMoInventoryTimeAnomaly> bizPssMoInventoryTimeAnomalies = bizPssMoInventoryTimeAnomalyMapper.selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                .eq(BizPssMoInventoryTimeAnomaly::getModelName, bizPssMoInventoryTimeAnomalyAddParam.getModelName()));
        if (CollectionUtil.isNotEmpty(bizPssMoInventoryTimeAnomalies)) {
            throw new CommonException("模型名称已存在，请重新输入");
        }
        List<BizPssMoInventoryTimeAnomaly> bizPssMoInventoryTimeAnomalyList = bizPssMoInventoryTimeAnomalyMapper
                .selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                        .eq(BizPssMoInventoryTimeAnomaly::getModelNumber, bizPssMoInventoryTimeAnomalyAddParam.getModelNumber()));
        if (CollectionUtil.isNotEmpty(bizPssMoInventoryTimeAnomalyList)) {
            throw new CommonException("模型编号已存在，请重新输入");
        }

        if (bizPssMoInventoryTimeAnomalyAddParam.getIsEnabled() == 1) {
            //开启的话，将其他的设置为关0，自身id设置为开1
            List<BizPssMoInventoryTimeAnomaly> bizPssMoRotationEmptyPeriodList = bizPssMoInventoryTimeAnomalyMapper
                    .selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                            .eq(BizPssMoInventoryTimeAnomaly::getIsEnabled, 1));
            if (CollectionUtil.isNotEmpty(bizPssMoRotationEmptyPeriodList)) {
                for (BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly1 : bizPssMoRotationEmptyPeriodList) {
                    bizPssMoInventoryTimeAnomaly1.setIsEnabled(0);
                    bizPssMoInventoryTimeAnomalyMapper.updateById(bizPssMoInventoryTimeAnomaly1);
                }
            }
        }
        BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly = BeanUtil.toBean(bizPssMoInventoryTimeAnomalyAddParam, BizPssMoInventoryTimeAnomaly.class);
        this.save(bizPssMoInventoryTimeAnomaly);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(BizPssMoInventoryTimeAnomalyEditParam bizPssMoInventoryTimeAnomalyEditParam) {

        List<BizPssMoInventoryTimeAnomaly> bizPssMoInventoryTimeAnomalies = bizPssMoInventoryTimeAnomalyMapper.selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                .eq(BizPssMoInventoryTimeAnomaly::getModelName, bizPssMoInventoryTimeAnomalyEditParam.getModelName()));
        if (CollectionUtil.isNotEmpty(bizPssMoInventoryTimeAnomalies) && !Objects.equals(bizPssMoInventoryTimeAnomalies.get(0).getId(),
                bizPssMoInventoryTimeAnomalyEditParam.getId())) {
            throw new CommonException("模型名称已存在，请重新输入");
        }
        List<BizPssMoInventoryTimeAnomaly> bizPssMoInventoryTimeAnomalyList = bizPssMoInventoryTimeAnomalyMapper
                .selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                        .eq(BizPssMoInventoryTimeAnomaly::getModelNumber, bizPssMoInventoryTimeAnomalyEditParam.getModelNumber()));
        if (CollectionUtil.isNotEmpty(bizPssMoInventoryTimeAnomalyList) && !Objects.equals(bizPssMoInventoryTimeAnomalyList.get(0).getId(),
                bizPssMoInventoryTimeAnomalyEditParam.getId())) {
            throw new CommonException("模型编号已存在，请重新输入");
        }
        if (bizPssMoInventoryTimeAnomalyEditParam.getIsEnabled() == 1) {
            //开启的话，将其他的设置为关0，自身id设置为开1
            List<BizPssMoInventoryTimeAnomaly> bizPssMoRotationEmptyPeriodList = bizPssMoInventoryTimeAnomalyMapper
                    .selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                            .eq(BizPssMoInventoryTimeAnomaly::getIsEnabled, 1));
            if (CollectionUtil.isNotEmpty(bizPssMoRotationEmptyPeriodList)) {
                for (BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly1 : bizPssMoRotationEmptyPeriodList) {
                    bizPssMoInventoryTimeAnomaly1.setIsEnabled(0);
                    bizPssMoInventoryTimeAnomalyMapper.updateById(bizPssMoInventoryTimeAnomaly1);
                }
            }
        }
        BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly = this.queryEntity(bizPssMoInventoryTimeAnomalyEditParam.getId());
        BeanUtil.copyProperties(bizPssMoInventoryTimeAnomalyEditParam, bizPssMoInventoryTimeAnomaly);
        this.updateById(bizPssMoInventoryTimeAnomaly);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<BizPssMoInventoryTimeAnomalyIdParam> bizPssMoInventoryTimeAnomalyIdParamList) {
        // 执行删除
        this.removeByIds(CollStreamUtil.toList(bizPssMoInventoryTimeAnomalyIdParamList, BizPssMoInventoryTimeAnomalyIdParam::getId));
    }

    @Override
    public BizPssMoInventoryTimeAnomaly detail(BizPssMoInventoryTimeAnomalyIdParam bizPssMoInventoryTimeAnomalyIdParam) {
        return this.queryEntity(bizPssMoInventoryTimeAnomalyIdParam.getId());
    }

    @Override
    public BizPssMoInventoryTimeAnomaly queryEntity(String id) {
        BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly = this.getById(id);
        if (ObjectUtil.isEmpty(bizPssMoInventoryTimeAnomaly)) {
            throw new CommonException("模型优化-在库时间异常模型优化表不存在，id值为：{}", id);
        }
        return bizPssMoInventoryTimeAnomaly;
    }

    /**
     * 获取模型优化-在库时间异常模型优化表-开启关闭
     *
     * @author hjc
     * @date 2024/06/12 20:03
     */
    @Override
    public void isEnabledById(BizPssMoInventoryTimeAnomalyIsEnabledByIdParam isEnabledByIdParam) {

        BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly = this.queryEntity(isEnabledByIdParam.getId());
        if (isEnabledByIdParam.getIsEnabled() == 0) {
            //关闭，直接设置为0
            bizPssMoInventoryTimeAnomaly.setIsEnabled(0);
            bizPssMoInventoryTimeAnomalyMapper.updateById(bizPssMoInventoryTimeAnomaly);
        }
        if (isEnabledByIdParam.getIsEnabled() == 1) {
            //开启的话，将其他的设置为关0，自身id设置为开1
            List<BizPssMoInventoryTimeAnomaly> bizPssMoRotationEmptyPeriodList = bizPssMoInventoryTimeAnomalyMapper
                    .selectList(Wrappers.lambdaQuery(BizPssMoInventoryTimeAnomaly.class)
                            .eq(BizPssMoInventoryTimeAnomaly::getIsEnabled, 1));
            if (CollectionUtil.isNotEmpty(bizPssMoRotationEmptyPeriodList)) {
                for (BizPssMoInventoryTimeAnomaly bizPssMoInventoryTimeAnomaly1 : bizPssMoRotationEmptyPeriodList) {
                    bizPssMoInventoryTimeAnomaly1.setIsEnabled(0);
                    bizPssMoInventoryTimeAnomalyMapper.updateById(bizPssMoInventoryTimeAnomaly1);
                }
            }
            bizPssMoInventoryTimeAnomaly.setIsEnabled(isEnabledByIdParam.getIsEnabled());
            bizPssMoInventoryTimeAnomalyMapper.updateById(bizPssMoInventoryTimeAnomaly);

        }
    }
}
