package com.steerinfo.ems.trmdwvalue.service.impl;

import com.steerinfo.framework.mapper.IBaseMapper;
import com.steerinfo.framework.service.impl.BaseServiceImpl;
import com.steerinfo.framework.service.pagehelper.PageHelper;
import com.steerinfo.framework.service.pagehelper.PageList;
import com.steerinfo.ems.trmdwvalue.model.TRmDwValue;
import com.steerinfo.auth.utils.JwtUtil;
import com.steerinfo.ems.Utils.BigDecimalUtil;
import com.steerinfo.ems.Utils.DateUtils;
import com.steerinfo.ems.Utils.TimegranidUtils;
import com.steerinfo.ems.formula.model.Formula;
import com.steerinfo.ems.formula.service.IFormulaService;
import com.steerinfo.ems.trmactitem.model.TRmActItem;
import com.steerinfo.ems.trmactitem.service.ITRmActItemService;
import com.steerinfo.ems.trmactvalue.model.TRmActValue;
import com.steerinfo.ems.trmactvalue.service.impl.TRmActValueServiceImpl;
import com.steerinfo.ems.trmdwvalue.mapper.TRmDwValueMapper;
import com.steerinfo.ems.trmdwvalue.service.ITRmDwValueService;
import com.steerinfo.ems.trmindexitem.mapper.TRmIndexItemMapper;
import com.steerinfo.ems.trmindexitem.model.TRmIndexItem;
import com.steerinfo.ems.trmindexitem.service.ITRmIndexItemService;
import com.steerinfo.ems.trmindexvalue.model.TRmIndexValue;
import com.steerinfo.ems.trmindexvalue.service.ITRmIndexValueService;
import com.steerinfo.ems.trmworkprocproductvalue.service.ITRmWorkprocProductValueService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;

/**
 * TRmDwValue服务实现：
 * @author generator
 * @version 1.0-SNAPSHORT 2020-10-30 10:34
 * 类描述
 * 修订历史：
 * 日期：2020-10-30
 * 作者：generator
 * 参考：
 * 描述：TRmDwValue服务实现
 * @see null
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 */
@Service(value = "tRmDwValueService")
public class TRmDwValueServiceImpl extends BaseServiceImpl<TRmDwValue, HashMap<String, Object>> implements ITRmDwValueService {
	
	private static final Logger logger = LoggerFactory.getLogger(TRmActValueServiceImpl.class);

    @Autowired
    private TRmDwValueMapper tRmDwValueMapper;
    @Autowired
    private ITRmActItemService tRmActItemService;
    @Autowired
    private IFormulaService formulaService;
    @Autowired
    ITRmIndexItemService tRmIndexItemService;
    @Autowired
    ITRmIndexValueService tRmIndexValueService;
    @Autowired
    private TRmIndexItemMapper tRmIndexItemMapper;

    @Override
    protected IBaseMapper<TRmDwValue, HashMap<String, Object>> getMapper() {
        return tRmDwValueMapper;
    }
    
    @Override
	public void state(Date d) {
    	// 获取上报项目
        List<TRmActItem> wt = tRmActItemService.getitems("W");
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        c.add(Calendar.MONTH, -1); // 减1月获得上月
        String clockm = new SimpleDateFormat("yyyy-MM").format(c.getTime());
        c.add(Calendar.MONTH, 1); // 回到当前月
        c.add(Calendar.YEAR, -1); // 去年
        String clocky = new SimpleDateFormat("yyyy").format(c.getTime());
 		// 每月前3天生成上月数据
		if(c.get(Calendar.DAY_OF_MONTH) <= 3){
			for (TRmActItem tRmActItem : wt) {
				this.restatData(tRmActItem.getItemid(), clockm, "MONTH", "系统", null, "");
			}
		}
		// 每年前3天生成去年数据
		if(c.get(Calendar.DAY_OF_YEAR) <= 3){
			for (TRmActItem tRmActItem : wt) {
				this.restatData(tRmActItem.getItemid(), clocky, "YEAR", "系统", null, "");
			}
		}
		logger.info("上报数据定时任务结束....");
	}
    
	@Override
	public PageList<Map<String, Object>> getProjectwDataForPage(HashMap<String, Object> parmas, Integer pageNum,
			Integer pageSize) {
		PageHelper.startPage(pageNum, pageSize);
        List<Map<String, Object>> actitemDetalts = tRmDwValueMapper.getProjectwData(parmas);
        PageList<Map<String,Object>> plist = new PageList<Map<String,Object>>(actitemDetalts);
        return plist;
	}

	@Override
	public String restatData(String itemid, String clock, String timegranid, String opuser, Double dwcl, String bz) {
		if(!itemid.endsWith("W")){
			return "项目编号错误";
		}
		TRmActItem t = tRmActItemService.getById(itemid);
		if(t!=null){
			Integer zh = t.getDefaultvalue()==null || t.getDefaultvalue()==0?1:t.getDefaultvalue(); // 单位转换系数（除法），上报最终值转换单位
			Short digits = t.getDigits() == null ? 2 : t.getDigits();
			int digits2 = digits < 3 ? 3 : digits; // 单耗精度最少为3
			HashMap<String, Object> id = new HashMap<String, Object>();
    		id.put("clock", clock);
    		id.put("timegranid", timegranid);
    		id.put("itemid", itemid);
    		// 关联能耗编号
    		String assid = t.getAssociateid();
    		// 系统最终值
    		Double apval = null;
    		// 系统最终值-换算
    		BigDecimal apportvalue = null;
    		// 系统折标值
    		BigDecimal stdvalue = null;
    		// 公式内容
			String fs = formulaService.getFormula(itemid, clock);
			if(fs==null){
				return "公式错误";
			}
			// 系统最终值
    		if(assid!=null && !assid.isEmpty()){
                apval = formulaService.readValByItemid(assid,timegranid, clock, 0);
                // 系统折标值读取
				// Double std = formulaService.readValByItemid(assid,timegranid,
				// clock, 2);
				// if(std!=null){
				// stdvalue = new BigDecimal(std).setScale(digits,
				// BigDecimal.ROUND_HALF_UP);
				// }
    		}
    		// 关联产量编号
    		String fid = t.getFid();
    		// 系统产品产量
    		Double pval=null;
    		// 系统产品产量-精度
    		BigDecimal productvalue = null;
    		if(fid!=null && !fid.isEmpty()){
                pval = formulaService.readValByItemid(fid,timegranid, clock, 0);
                if(pval!=null){
                	productvalue = new BigDecimal(pval).setScale(3, BigDecimal.ROUND_HALF_UP);
                }
                // 产量--系统最终值（等于产品产量）
                if(assid==null || assid.isEmpty()){
                	apval = pval;
                }
    		}
    		// 系统单耗值
    		BigDecimal ucvalue = null;
    		if(pval!=null && apval!=null && pval!=0){
    			ucvalue = BigDecimalUtil.divide(apval, pval, digits2);
    		}
    		// 系统最终值-换算单位
    		if(apval!=null){
    			apportvalue = BigDecimalUtil.divide(apval, zh.doubleValue(), digits.intValue());
    		}
    		TRmDwValue tv = tRmDwValueMapper.selectByPrimaryKey(id);
			if(tv != null){
				// 系统最终值
				tv.setApportvalue(apportvalue);
	            // 系统折标值
	            tv.setStdvalue(stdvalue);
	            // 系统单耗值
	            tv.setUcvalue(ucvalue);
	            // 系统产品产量
	            tv.setProductvalue(productvalue);
	            // 还未确认产量
	            if(tv.getApportwvalue()==null){
	            	tv.setCreateman(opuser);
		            tv.setRecTime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
	            }
	            // 有上报产量
				if(dwcl!=null){
					// 上报产量
					tv.setProductwvalue(new BigDecimal(dwcl));
					if(fs.startsWith("R")){
						// 上报最终值
						tv.setApportwvalue(BigDecimalUtil.divide(dwcl, zh.doubleValue(), digits.intValue()));
						// 上报单耗
						tv.setUcwvalue(new BigDecimal("1"));
					}else{
						// 计算上报最终值
						Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
						// 上报单耗
						tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, dwcl, digits2));
						// 上报最终值-单位转换
						tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
					}
					// 洗煤车间特殊处理
					if(itemid.startsWith("ZY3000")){
						// 能耗
						if(assid!=null && !assid.isEmpty()){
							// 上报产量
							tv.setProductwvalue(new BigDecimal(dwcl));
							// 计算上报最终值
							Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
							// 上报单耗
							tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, dwcl, digits2));
							// 上报最终值-单位转换
							tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
						}else{//产量
							// 计算上报产量
							Double dwcl2 = formulaService.getValByItemid(itemid, timegranid, clock, 0);
							tv.setProductwvalue(new BigDecimal(dwcl2));
							// 上报单耗
							tv.setUcwvalue(new BigDecimal("1"));
							// 上报最终值=上报产量
							tv.setApportwvalue(new BigDecimal(dwcl2));
						}
					}
					tv.setBz(bz);
					tv.setUpuser(opuser);
					tv.setUptime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
				}else if(tv.getProductwvalue()!=null){ // 已经确认过，修改指标触发
					if(!fs.startsWith("R")){
						// 计算上报最终值
						Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
						// 上报单耗
						tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, tv.getProductwvalue().doubleValue(), digits2));
						// 上报最终值-单位转换
						tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
					}
					// 洗煤车间特殊处理
					if(itemid.startsWith("ZY3000")){
						// 能耗
						if(assid!=null && !assid.isEmpty()){
							// 精煤上报产量
			        		Double jm = formulaService.getValByItemid("ZY3000X0052W", "MONTH", clock, 0);
			        		if(jm!=null && jm>0){
			        			tv.setProductwvalue(new BigDecimal(jm));
								// 计算上报最终值
								Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
								// 上报单耗
								tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, jm, digits2));
								// 上报最终值-单位转换
								tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
			        		}
						}else{//产量
							// 计算上报产量
							Double dwcl2 = formulaService.getValByItemid(itemid, timegranid, clock, 0);
							tv.setProductwvalue(new BigDecimal(dwcl2));
							// 上报单耗
							tv.setUcwvalue(new BigDecimal("1"));
							// 上报最终值=上报产量
							tv.setApportwvalue(new BigDecimal(dwcl2));
						}
					}
				}else{
					// 计算上报最终值
					Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
					// 上报最终值-单位转换
					tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
				}
				tRmDwValueMapper.updateByPrimaryKeySelective(tv);
			}else{
				tv = new TRmDwValue();
				tv.setId(id);
				// 系统最终值
				tv.setApportvalue(apportvalue);
	            // 系统折标值
	            tv.setStdvalue(stdvalue);
	            // 系统单耗值
	            tv.setUcvalue(ucvalue);
	            // 系统产品产量
	            tv.setProductvalue(productvalue);
	            tv.setCreateman(opuser);
	            tv.setRecTime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
				if(dwcl!=null){
					// 上报产量
					tv.setProductwvalue(new BigDecimal(dwcl));
					if(fs.startsWith("R")){
						// 上报最终值-转换
						tv.setApportwvalue(BigDecimalUtil.divide(dwcl, zh.doubleValue(), digits.intValue()));
						// 上报单耗
						tv.setUcwvalue(new BigDecimal("1"));
					}else{
						// 计算上报最终值
						Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
						// 上报单耗
						tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, dwcl, digits2));
						// 上报最终值-单位转换
						tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
					}
					// 洗煤车间特殊处理
					if(itemid.startsWith("ZY3000")){
						// 能耗
						if(assid!=null && !assid.isEmpty()){
							tv.setProductwvalue(new BigDecimal(dwcl));
							// 计算上报最终值
							Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
							// 上报单耗
							tv.setUcwvalue(BigDecimalUtil.divide(apportwvalue, dwcl, digits2));
							// 上报最终值-单位转换
							tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
						}else{//产量
							// 计算上报产量
							Double dwcl2 = formulaService.getValByItemid(itemid, timegranid, clock, 0);
							tv.setProductwvalue(new BigDecimal(dwcl2));
							// 上报单耗
							tv.setUcwvalue(new BigDecimal("1"));
							// 上报最终值=上报产量
							tv.setApportwvalue(new BigDecimal(dwcl2));
						}
					}
				}else{
					// 计算上报最终值
					Double apportwvalue = formulaService.getValByItemid(itemid, timegranid, clock, 0);
					// 上报最终值-单位转换
					tv.setApportwvalue(BigDecimalUtil.divide(apportwvalue, zh.doubleValue(), digits.intValue()));
				}
				tv.setUpuser(opuser);
				tv.setBz(bz);
				tv.setUptime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
				tRmDwValueMapper.insert(tv);
			}
			// 如果是产量变化，联动计算相关项目
			if(fs.startsWith("R")){
				formulaService.reCalculate(itemid, clock, timegranid, clock);
				// 产量确认，联动计算指标（根据波动关联对象fluitemid关联）
				Map<String, Object> m = new HashMap<String, Object>();
				m.put("useflag", "1");
				m.put("itemflag", "3");
		    	m.put("parentid", "NYDW001001");
				m.put("fluitemid", itemid);
				List<TRmIndexItem> l = tRmIndexItemMapper.selectByParasForFla(m);
				for(TRmIndexItem tii:l){
					tRmIndexValueService.restatData(tii.getItemid(), clock, timegranid, opuser);
				}
			}
		}
		return null;
	}

	@Override
	public void modifyByApv(TRmDwValue model) {
		TRmActItem t = tRmActItemService.getById(model.getItemid());
		// 上报产量
		BigDecimal productwvalue = model.getProductwvalue();
		// 上报最终值
		BigDecimal apportwvalue = model.getApportwvalue();
		// 单位换算
		Integer rate = t.getDefaultvalue()==null?1:t.getDefaultvalue();
		// 单耗
		BigDecimal ucwvalue = BigDecimalUtil.divide(BigDecimalUtil.mul(apportwvalue.doubleValue(), rate.doubleValue()).doubleValue(), productwvalue.doubleValue(), 6);
		model.setMftime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
		model.setMfuser(JwtUtil.getUseridByToken());
		// 修改单耗指标数据与指标
		HashMap<String, Object> parmas = new HashMap<String, Object>();
    	parmas.put("energyid", t.getEnergyid());
    	parmas.put("workprocid", t.getWorkprocid());
    	parmas.put("propertyid", t.getPropertyid());
    	parmas.put("parentid", "NYDW001001");
    	
    	TRmIndexItem tii = tRmIndexItemService.getByParams(parmas);
    	int digits = 2;
    	if(tii!=null){
    		digits =  tii.getDigits()==null?2:tii.getDigits().intValue();
    		HashMap<String, Object> id = new HashMap<String, Object>();
    		id.put("clock", model.getClock());
    		id.put("timegranid", "MONTH");
    		id.put("itemid", tii.getItemid());
    		TRmIndexValue tv = tRmIndexValueService.getById(id);
    		if(tv!=null){
    			tv.setApportvalue(ucwvalue.setScale(digits, BigDecimal.ROUND_HALF_UP));
    			if(tv.getActualvalue()!=null){
    				tv.setCorrectvalue(ucwvalue.subtract(tv.getActualvalue()));
    			}
    			tv.setUpman(JwtUtil.getUseridByToken());
    			tv.setUptime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
    			tRmIndexValueService.modify(tv);
    		}else{
    			tv = new TRmIndexValue();
    			tv.setId(id);
    			tv.setActualvalue(ucwvalue);
    			tv.setApportvalue(ucwvalue);
    			tv.setCorrectvalue(BigDecimal.ZERO);
    			tv.setRecTime(DateUtils.dateStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
    			tv.setRecUser(JwtUtil.getUseridByToken());
    			tRmIndexValueService.add(tv);
    		}
    		// 如果是修改上月数据，增加或者修改公式
//    		Calendar c = Calendar.getInstance();
//    		c.add(Calendar.MONTH, -1);
//    		if(new SimpleDateFormat("yyyy-MM").format(c.getTime()).equals(model.getClock())){
//    			Formula f = formulaService.getFormulaLatest(tii.getItemid());
//    			String clk = model.getClock().split("-")[0] + model.getClock().split("-")[1];
//    			if(f!=null && f.getClock().equals(clk)){
//    				// 修改
//    				f.setSourcecode(ucwvalue.toPlainString());
//    				f.setRevisetime(DateUtils.getCurrentTime("yyyy-MM-dd HH:mm:ss"));
//    				f.setRevisor(JwtUtil.getUseridByToken());
//    				formulaService.modify(f);
//    			}else{
//    				// 新增公式
//    				f = new Formula();
//    				f.setClock(clk);
//    				f.setCode(tii.getItemid());
//    				f.setDescription(tii.getItemname());
//    				f.setSourcecode(ucwvalue.toPlainString());
//    				f.setIsavailable("1");
//    				f.setRevisetime(DateUtils.getCurrentTime("yyyy-MM-dd HH:mm:ss"));
//    				f.setTablename("T_RM_INDEX_VALUE");
//    				f.setRevisor(JwtUtil.getUseridByToken());
//    				formulaService.add(f);
//    			}
//    		}
    	}
    	model.setUcwvalue(ucwvalue.setScale(digits, BigDecimal.ROUND_HALF_UP));
    	tRmDwValueMapper.updateByPrimaryKeySelective(model);
	}
	
	@Override
	public int getCount(Map<String, Object> params) {
		return tRmDwValueMapper.getCount(params);
	}
}
