package com.steerinfo.baseinfo.meterbasecalibrationnum.service.impl;

import com.steerinfo.baseinfo.meterbasecalibranumrel.service.impl.MeterBaseCalibraNumRelServiceImpl;
import com.steerinfo.baseinfo.meterbasecalibrarelation.service.impl.MeterBaseCalibraRelationServiceImpl;
import com.steerinfo.baseinfo.meterbasecalibrationtime.model.MeterBaseCalibrationTime;
import com.steerinfo.framework.mapper.IBaseMapper;
import com.steerinfo.framework.service.impl.BaseServiceImpl;
import com.steerinfo.baseinfo.meterbasecalibrationnum.model.MeterBaseCalibrationNum;
import com.steerinfo.baseinfo.meterbasecalibrationnum.mapper.MeterBaseCalibrationNumMapper;
import com.steerinfo.baseinfo.meterbasecalibrationnum.service.IMeterBaseCalibrationNumService;
import com.steerinfo.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.Assert;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * MeterBaseCalibrationNum服务实现：
 * @author generator
 * @version 1.0-SNAPSHORT 2020-06-28 03:17
 * 类描述
 * 修订历史：
 * 日期：2020-06-28
 * 作者：generator
 * 参考：
 * 描述：MeterBaseCalibrationNum服务实现
 * @see null
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 */
@Service(value = "meterBaseCalibrationNumService")
public class MeterBaseCalibrationNumServiceImpl extends BaseServiceImpl<MeterBaseCalibrationNum, String> implements IMeterBaseCalibrationNumService {

    @Autowired
    private MeterBaseCalibrationNumMapper meterBaseCalibrationNumMapper;

    @Autowired
    private MeterBaseCalibraNumRelServiceImpl meterBaseCalibraNumRelService;

    @Override
    protected IBaseMapper<MeterBaseCalibrationNum, String> getMapper() {
        return meterBaseCalibrationNumMapper;
    }

    @Override
    public String checkandadd(MeterBaseCalibrationNum model)
    {
        String msg=check(model);
        if (StringUtils.isNotEmpty(msg)){
            return msg;
        }
        HashMap<String, Object> obj = new HashMap<>();
        obj.put("spotTypeNo", model.getSpotTypeNo());
        obj.put("calibrationTypeNo", model.getCalibrationTypeNo());
        if (model.getCalibrationTypeNo().equals("001005002") ) {
            obj.put("mutualStrategyNo",model.getMutualStrategyNo());
            List<MeterBaseCalibrationNum> com=meterBaseCalibrationNumMapper.selectByParameters(obj);
            if (! com.isEmpty()) {
                return model.getCalibrationTypeName()+"为"+model.getMutualStrategyName()+"的模式与"+model.getSpotTypeName()+"已配置，请直接修改！！";
            }
        }else {
            List<MeterBaseCalibrationNum> com=meterBaseCalibrationNumMapper.selectByParameters(obj);
            if (! com.isEmpty()) {
                return model.getCalibrationTypeName()+"与"+model.getSpotTypeName()+"已配置，请直接修改！！";
            }
        }

        String no= meterBaseCalibrationNumMapper.GetNewID();
        model.setId(new SimpleDateFormat("yyyyMMdd").format(new Date()) +no);
        model.setStateFlag("0");
        meterBaseCalibrationNumMapper.insertSelective(model);
        return "";
    }

    @Override
    public String checkandupdate(String id,MeterBaseCalibrationNum model)
    {
        try{
            String msg=check(model);
            if (StringUtils.isNotEmpty(msg)){
                return msg;
            }
            HashMap<String, Object> obj = new HashMap<>();
            obj.put("spotTypeNo", model.getSpotTypeNo());
            obj.put("calibrationTypeNo", model.getCalibrationTypeNo());
            obj.put("calibrationNumNo", id);
            //校称类型不是”互检类型时“，只判定校称类型和计量点类型是否重复；如果校称类型为”互检“时，判定校称类型、计量点类型、校称策略三者是否重复
            if (model.getCalibrationTypeNo().equals("001005002")){
                obj.put("mutualStrategyNo",model.getMutualStrategyNo());
                List<MeterBaseCalibrationNum> com=meterBaseCalibrationNumMapper.selectForUpdate(obj);
                if (! com.isEmpty()) {
                    return model.getCalibrationTypeName()+"为"+model.getMutualStrategyName()+"的模式与"+model.getSpotTypeName()+"已配置，请重新修改！！";
                }
            }else{
                List<MeterBaseCalibrationNum> com=meterBaseCalibrationNumMapper.selectForUpdate(obj);
                if (! com.isEmpty()) {
                    return model.getCalibrationTypeName()+"与"+model.getSpotTypeName()+"已配置，请重新修改！！";
                }
            }
            if ("1".equals(model.getStateFlag())){
                return "该数据已经使用与计量点匹配，无法修改，请废除已绑定数据后再修改！";
            }

            int key1=meterBaseCalibrationNumMapper.updateByPrimaryKey(model);
            Assert.isTrue(key1 == 1,"更新校称重量错误");


        }catch (Exception ex){
            ex.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return "操作异常，请联系管理员";
        }
        return "";
    }

    private String check (MeterBaseCalibrationNum model)
    {
        if(model == null){
            return "参数为空！！";
        }
        if(StringUtils.isEmpty(model.getCalibrationTypeNo())){
            return "校秤类型编号不能为空";
        }
        if(StringUtils.isEmpty(model.getCalibrationTypeName())){
            return "校秤类型名称不能为空";
        }
        if(StringUtils.isEmpty(model.getSpotTypeNo())){
            return "计量点类型编号不能为空";
        }
        if(StringUtils.isEmpty(model.getSpotTypeName())){
            return "计量点类型名称不能为空";
        }
        if(StringUtils.isEmpty(model.getCalibrationNumNo())){
            model.setCreateTime(new Date());
            model.setValidFlag("0");//有效
        }else {
            model.setUpdateTime(new Date());
        }
        return "";
    }

    @Override
    public String recovery(List<MeterBaseCalibrationNum> models) {
        try {
            if (models == null || models.size() < 1) {
                return "请传入参数!";
            }
            for (MeterBaseCalibrationNum model:models) {
                model.setCalibrationNumNo(model.getCalibrationNumNo());
                model.setValidFlag("1");
                model.setDeleteTime(new Date());

                meterBaseCalibrationNumMapper.updateByPrimaryKey(model);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return "操作异常，请联系管理员";
        }
        return "";
    }

    @Override
    public String abolish(List<MeterBaseCalibrationNum> models)  {
        try {
            if (models == null || models.size() < 1) {
                return "请传入参数!";
            }
            for (MeterBaseCalibrationNum model:models) {
                model.setCalibrationNumNo(model.getCalibrationNumNo());
                model.setValidFlag("0");
                model.setDeleteTime(new Date());

                meterBaseCalibrationNumMapper.updateByPrimaryKey(model);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return "操作异常，请联系管理员";
        }
        return "";
    }

    @Override
    public String updateStateByPrimaryKey(String mbCalibNumNo, String flag) {
        if (mbCalibNumNo == null ) {
            return "请传入校称重量编号参数!";
        }
        if (com.steerinfo.framework.utils.base.StringUtils.isBlank(flag)){
            return "请传入操作状态!";
        }
        MeterBaseCalibrationNum meterBaseCalibrationNum = new MeterBaseCalibrationNum();
        meterBaseCalibrationNum.setCalibrationNumNo(mbCalibNumNo);
        //flag=1是绑定校称时间，flag=0是废除（解除）校称时间绑定
        if(flag.equals("1")){
            meterBaseCalibrationNum.setStateFlag("1");
        }else{
            meterBaseCalibrationNum.setStateFlag("0");
        }

        meterBaseCalibrationNumMapper.updateStateByPrimaryKey(meterBaseCalibrationNum);
        return "";
    }

}
