/*
 * 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.bizPssStorageAnomaly.service.impl;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.entity.BizPssMoInventoryTimeAnomaly;
import com.unis.purchaseAndSalesSupervision.modular.bizPssMoInventoryTimeAnomaly.service.BizPssMoInventoryTimeAnomalyService;
import com.unis.purchaseAndSalesSupervision.modular.bizPssStorageAnomaly.entity.BizPssStorageAnomaly;
import com.unis.purchaseAndSalesSupervision.modular.bizPssStorageAnomaly.mapper.BizPssStorageAnomalyMapper;
import com.unis.purchaseAndSalesSupervision.modular.bizPssStorageAnomaly.param.BizPssStorageAnomalyPageParam;
import com.unis.purchaseAndSalesSupervision.modular.bizPssStorageAnomaly.service.BizPssStorageAnomalyService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 购销监管-仓储管理监管-在库时间异常表Service接口实现类
 *
 * @author TS
 * @date  2024/06/13 17:00
 **/
@Service
public class BizPssStorageAnomalyServiceImpl extends ServiceImpl<BizPssStorageAnomalyMapper, BizPssStorageAnomaly> implements BizPssStorageAnomalyService {

    @Resource
    private  BizPssStorageAnomalyMapper bizPssStorageAnomalyMapper;
    @Autowired
    private BizPssMoInventoryTimeAnomalyService bizPssMoInventoryTimeAnomalyService;
    /**
     * 获取购销监管-仓储管理监管-在库时间异常表分页
     *
     * @param pageParam
     * @author TS
     * @date 2024/06/13 17:00
     */
    @Override
    public IPage<BizPssStorageAnomaly> findPage(BizPssStorageAnomalyPageParam pageParam) {
            //条形查询器
            QueryWrapper<BizPssStorageAnomaly> queryWrapper = new QueryWrapper<>();

            if (StringUtils.isNotBlank(pageParam.getOrgName())){
                queryWrapper.like("c.orgName", pageParam.getOrgName());
            }
            Page<BizPssStorageAnomaly> p =new Page<>(pageParam.getCurrent(),pageParam.getSize());
            IPage<BizPssStorageAnomaly> page = bizPssStorageAnomalyMapper.findPage(p,queryWrapper);
            return page;
    }

    /**
     * ● 在库时间异常
     * ○ 频率：1小时执行一次。
     * ○ 功能：每次统计48小时内的数据。超过“在库时间异常模型优化-在库时间”，统计在库时间异常数据，添加到biz_pss_storage_anomaly。
     * ■ 在库时间：
     * ● 从车入门开始，超过了在库时间，如果没有出门，生成一条biz_pss_storage_anomaly记录。
     * ● 在库时间异常只判断48小时的在库时间，超过48小时不再继续累计
     * ■ 车辆入门时间：出入库系统-原粮管理-入库-入门登记-业务登记时间
     * ■ 出门、入门是否是同一辆车：通过车辆编号。
     */
    @Override
    public void taskAction() {
        //查询启动启用并且阈值>0状态的在库时间异常模型
        QueryWrapper<BizPssMoInventoryTimeAnomaly> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(BizPssMoInventoryTimeAnomaly::getIsEnabled,1)
                .gt(BizPssMoInventoryTimeAnomaly::getInventoryTimeThreshold,0);
        List<BizPssMoInventoryTimeAnomaly> list = bizPssMoInventoryTimeAnomalyService.list(queryWrapper);
        //无模型则不进行检查
        if (list.size() <= 0){
            return;
        }
        BizPssMoInventoryTimeAnomaly anomaly = list.get(0);
        //在库时间大于等于的阈值，单位：小时
        Integer inventoryTimeThreshold = anomaly.getInventoryTimeThreshold();
        List<Map<String,Object>>  anomalyDatas = bizPssStorageAnomalyMapper.getAnomalyDatas(inventoryTimeThreshold);
        for (Map<String,Object> map:anomalyDatas) {
            String dataId = map.getOrDefault("dataId","").toString();
            QueryWrapper<BizPssStorageAnomaly> anomalyQueryWrapper = new QueryWrapper<>();
            anomalyQueryWrapper.lambda()
                    .eq(BizPssStorageAnomaly::getCrkywRmdjDefaultId,dataId);
            BizPssStorageAnomaly bizPssStorageAnomaly = this.getOne(anomalyQueryWrapper,false);
            Date rmsj = DateUtil.parse(map.getOrDefault("ywdjsj","").toString()); //入门时间
            if (bizPssStorageAnomaly == null){
                bizPssStorageAnomaly = new BizPssStorageAnomaly();
                //设置数据
                bizPssStorageAnomaly.setOrgId(Integer.parseInt(map.getOrDefault("unitId","0").toString())); //库区id
                bizPssStorageAnomaly.setCrkywRmdjDefaultId(map.getOrDefault("dataId","").toString()); //入门id
                bizPssStorageAnomaly.setLicensePlateNumber(map.getOrDefault("cph","").toString()); // 车牌号
                bizPssStorageAnomaly.setStorageTime(rmsj); //入门时间
                bizPssStorageAnomaly.setGrainVarietyId(Integer.parseInt(map.getOrDefault("lspz","1").toString())); //品种
            }
            bizPssStorageAnomaly.setAlarmDate(new Date()); //报错时间
            bizPssStorageAnomaly.setStatus(Integer.parseInt(map.getOrDefault("status","1").toString())); //状态
            bizPssStorageAnomaly.setInStorageTime(Integer.parseInt(map.getOrDefault("inStorageTime","1").toString())); //在库时长
//            if (bizPssStorageAnomaly.getStatus() == 2){ //表示已出门
//                Date cmsj = DateUtil.parse(map.getOrDefault("ywdjsj","").toString()); //入门时间
//                Long hour = DateUtil.between(rmsj,cmsj,DateUnit.HOUR);
//                bizPssStorageAnomaly.setInStorageTime(Integer.parseInt(hour.toString()));
//            }else{ //与当前时间比较，得到在库时间
//                Long hour = DateUtil.between(rmsj,DateUtil.date(),DateUnit.HOUR);
//                bizPssStorageAnomaly.setInStorageTime(Integer.parseInt(hour.toString()));
//            }
            this.saveOrUpdate(bizPssStorageAnomaly);

        }

    }
}
