package com.steering.pss.plnsaleord.planStove;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

import CoreFS.SA06.CoreReturnObject;
import CoreFS.SA08.CoreXmlSqlParsersFactory;
import CoreFS.SC01.CoreConstantData;

import com.steering.comm.db.DBCommon;
import com.steering.pss.plnsaleord.base.PlnHelper;
import com.steering.pss.plnsaleord.planStove.entity.ComBaseGradeEntity;
import com.steering.pss.plnsaleord.planStove.entity.MilFeedsawResultEntity;
import com.steering.pss.plnsaleord.planStove.entity.MilPlanEntity;
import com.steering.pss.plnsaleord.processOrder.entity.PlnOrderDbkSEntity;
import com.steering.pss.plnsaleord.processOrder.entity.PlnOrderRclSEntity;
import com.steering.pss.plnsaleord.processOrder.entity.PlnOrderZgSEntity;
import com.steering.pss.plnsaleord.stove.entity.PlnZyZgMEntity;

/**
 * 炉计划公共类
 * 
 * @author peng
 * 
 */
public class StoveCommon extends DBCommon {
	/**
	 * 生成轧管炉计划(以及镦拔扩虚拟炉计划)
	 * 
	 * @param con
	 * @param resultNo
	 *            实绩编号
	 * @param judgeStoveNo
	 *            判定炉号
	 */
	public CoreReturnObject generatePlanStove(String resultNo,
			String judgeStoveNo, String userName) {
		CoreReturnObject core = new CoreReturnObject();
		core.setResult(false);
		Connection con = null;
		StoveCommon stoveCommon = new StoveCommon();
		try {
			con = getDao(CoreConstantData.sysbeanstr).getConnection();
			con.setAutoCommit(false);
//			String message = stoveCommon.generatePlanStoveD(con, resultNo,
//					judgeStoveNo, userName);
//			if (message.length() > 0) {
//				stoveCommon.addExceptionD(message);
//			}
			core.setResult(false);
			core.setV_errMsg("生成成功!");
			con.commit();
			core.setResult(true);
		} catch (Exception e) {
			String message = "判定炉号:" + judgeStoveNo + " 实绩编号:" + resultNo
					+ e.toString();
			if (message.length() > 1000) {
				message = message.substring(0, 999);
			}
			stoveCommon.addExceptionD(message);
			core.setV_errMsg(e.toString());
			e.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return core;
	}

	/**
	 * 删除炉计划
	 * 
	 * @param judgeStoveNo
	 *            判定炉号
	 * @return
	 */
	public CoreReturnObject deletePlanStove(String judgeStoveNo) {
		CoreReturnObject core = new CoreReturnObject();
		core.setResult(false);
		Connection con = null;
		try {
			con = getDao(CoreConstantData.sysbeanstr).getConnection();
			con.setAutoCommit(false);
			deletePlanStoveD(con, judgeStoveNo);
			deletePlanStoveF(con, judgeStoveNo);
			core.setResult(false);
			core.setV_errMsg("删除成功!");
			con.commit();
			core.setResult(true);
		} catch (Exception e) {
			core.setV_errMsg(e.toString());
			e.printStackTrace();
			try {
                if (con != null) {
                    con.rollback();
                }
            }
            catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        finally {
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
		return core;
	}

	/**
	 * 写入异常
	 * 
	 * @param con
	 * @param message
	 * @throws SQLException
	 */
	void addExceptionD(String message) {
		Connection con = getDao(CoreConstantData.sysbeanstr).getConnection();
		String sql = CoreXmlSqlParsersFactory
				.getSql("StoveCommon.addExceptionD");
		PreparedStatement ps;
		try {
			ps = con.prepareStatement(sql);
			ps.setObject(1, message);
			ps.executeUpdate();
			ps.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (con != null)
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}

	}

	/**
	 * 生成轧管炉计划(以及镦拔扩虚拟炉计划)
	 * 
	 * @param con
	 * @param resultNo
	 *            实绩编号
	 * @param judgeStoveNo
	 *            判定炉号
	 * @throws SQLException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
//	public String generatePlanStoveD(Connection con, String resultNo,
//			String judgeStoveNo, String usrName) throws SQLException,
//			IllegalAccessException, InvocationTargetException {
//		MilPlanEntity milPlanEntity = PlnHelper.getEntityData(con,
//				new String[] { resultNo, judgeStoveNo },
//				"StoveCommon.getMilPlanEntity", "", MilPlanEntity.class);
//		// 1. 如果炉计划接收表没有记录
//		if (milPlanEntity == null) {
//			return "判定炉号:" + judgeStoveNo + " 实绩编号:" + resultNo
//					+ " 在炉计划接收表找不到记录!";
//		}
//		MilFeedsawResultEntity resultEntity = PlnHelper.getEntityData(con,
//				new String[] { resultNo, judgeStoveNo },
//				"StoveCommon.getMilFeedsawResultEntity", "",
//				MilFeedsawResultEntity.class);
//		// 2. 如果管坯锯切实绩表没有记录
//		if (resultEntity == null) {
//			return "判定炉号:" + judgeStoveNo + " 实绩编号:" + resultNo
//					+ " 在管坯锯切实绩表找不到记录!";
//
//		}
//		String[] orderArr = milPlanEntity.getContractNo().split("/");
//		String orderNo = orderArr[0];// 合同号
//		String orderSeq = orderArr[1];// 合同行号
//		String plineCode = resultEntity.getPlineCode();// 产线
//		String realJudgeStoveNo = judgeStoveNo.substring(0, 6);
//		// 3. 查询轧管订单排产
//		PlnOrderZgSEntity zgsEntity = PlnHelper
//				.getEntityData(con,
//						new String[] { plineCode, orderNo, orderSeq },
//						"StoveCommon.getPlnOrderZgSEntity", "",
//						PlnOrderZgSEntity.class);
//		if (zgsEntity == null) {
//			return "判定炉号:" + judgeStoveNo + " 实绩编号:" + resultNo
//					+ " 在轧管订单排产找不到记录!";
//		}
//		/**
//		 * 4. 生成轧管炉计划数据
//		 */
//		PlnZyZgMEntity zgmEntity = new PlnZyZgMEntity();
//		// 查询最大炉次ID
//		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
//		String nowTime = df.format(new Date());// 当前时间
//		int num = Integer.parseInt(PlnHelper.getParam(con,
//				"FrmMaterialChoose.getMaxHeatPlanNoD", "",
//				new String[] { nowTime }, "HEAT_PLAN_NO"));// 炉号最大序号
//		String heatPlanNo = "D" + nowTime + String.format("%04d", num);// 炉次ID
//		zgmEntity.setHeatPlanNo(heatPlanNo);// 炉批计划ID
//		BeanUtils.copyProperties(zgmEntity, zgsEntity);
////		zgmEntity.setHeatnoLast(realJudgeStoveNo);// 炉号
////		zgmEntity.setRealStoveNo(judgeStoveNo);// 生产炉号
////		zgmEntity.setCutSingleNum(resultEntity.getCutNum());// 计划单倍坯支数
////		zgmEntity.setCutSingleWt(resultEntity.getQaTon());// 计划单倍坯重量
////		zgmEntity.setIfWlMatched("1");// 是否挂料确定
//		int cutNum = 0;// 计划单倍坯支数
//		if (!resultEntity.getCutNum().equals("")) {
//			cutNum = Integer.parseInt(resultEntity.getCutNum());
//		}
//		int outNumCut = 0;// 分切数
//		if (!zgsEntity.getOutnumCut().equals("")) {
//			outNumCut = Integer.parseInt(zgsEntity.getOutnumCut());
//		}
//		// 计划产出支数 CUT_NUM*分切数
//		int outNum = cutNum * outNumCut;
////		zgmEntity.setOutNum(String.valueOf(outNum));
//
//		double aimlength = 0;// 目标长度
//		if (!zgsEntity.getAimlength().equals("")) {
//			aimlength = Double.parseDouble(zgsEntity.getAimlength());
//		}
//		// 单支重量(吨)
//		double singleWt = StoveHelper.caculatePipeSimgleWgt(
//				zgsEntity.getAimoutdiameter(), zgsEntity.getAimwallthick())// 单支重量
//				* aimlength / 1000;
//		double outWt = singleWt * outNum;// 计划产出重量
////		zgmEntity.setOutWt(String.valueOf(outWt));
//		zgmEntity.setPlanstatus("2");// 计划状态
//		ComBaseGradeEntity gradeEntity = PlnHelper.getEntityData(con,
//				new String[] { milPlanEntity.getGradename() },
//				"StoveCommon.getGradeEntityByName", "",
//				ComBaseGradeEntity.class);
//		if (gradeEntity != null) {
//			zgmEntity.setGradecode(gradeEntity.getGradecode());// 钢种代码
//		}
//		zgmEntity.setGradename(milPlanEntity.getGradename());// 钢种名称
//		zgmEntity.setCraftFileNo(milPlanEntity.getImpProcess());// 工艺文件号
////		zgmEntity.setDiameterGp(milPlanEntity.getPipeSection());// 管坯直径
////		zgmEntity.setLengthGp(milPlanEntity.getTargetLength());// 管坯长度
////		zgmEntity.setLenGpSingle(milPlanEntity.getDbLength());// 单倍坯长
////		zgmEntity.setInNumReal(resultEntity.getFeedNum());// 实际投入支数
////		zgmEntity.setPlanGpNum(resultEntity.getFeedNum());// 计划管坯支数
////		zgmEntity.setCreateName(usrName);// 创建人
//		double targetLength = 0;
//		if (!milPlanEntity.getTargetLength().equals("")) {
//			targetLength = Double.parseDouble(milPlanEntity.getTargetLength());
//		}
//		double feedNum = 0;
//		if (!resultEntity.getFeedNum().equals("")) {
//			feedNum = Double.parseDouble(resultEntity.getFeedNum());
//		}
//		// 实际投入重量
//		double inWgtReal = StoveHelper.caculatebBlankSimgleWgt(milPlanEntity
//				.getPipeSection()) * targetLength * feedNum;
//		zgmEntity.setInWtReal(String.valueOf(inWgtReal));
//		// 新增轧管炉计划
//		PlnHelper
//				.addEntityData(con, "StoveCommon.addPlnZyZgMEntity", zgmEntity);
//		/**
//		 * 5.镦拔扩计划
//		 */
//		// 5.1 查询 轧管工序合同
//		List<PlnOrderZgEntity> zgEntityList = PlnHelper.getEntityDatas(con,
//				new String[] { zgsEntity.getProPlanId() },
//				"StoveCommon.getPlnOrderZgEntity", "", PlnOrderZgEntity.class);
//		if (zgEntityList == null || zgEntityList.size() == 0) {
//			return "订单编号:" + zgsEntity.getProPlanId() + "找不到轧管工序合同!";
//		}
//		// 5.2 轧管工序合同找到的所有镦拔扩排产
//		List<PlnOrderDbkSEntity> dbkList = new ArrayList<PlnOrderDbkSEntity>();
//		// 轧管工序合同找到的所有热处理排产
//		List<PlnOrderRclSEntity> rclList = new ArrayList<PlnOrderRclSEntity>();
//		for (PlnOrderZgEntity zgEntity : zgEntityList) {
//			// 5.1如果下一工序是镦拔扩
//			if (zgEntity.getNextGx().equals("E")) {
//				// 5.2 通过排产联动组号查询镦拔扩工序排产(按计划时间顺序)
//				List<PlnOrderDbkSEntity> dbksEntityList = PlnHelper
//						.getEntityDatas(con,
//								new String[] { zgEntity.getPlanGroupId() },
//								"StoveCommon.getPlnOrderDbkSEntity", "",
//								PlnOrderDbkSEntity.class);
//				// 如果找不到镦拔扩工序排产则不执行
//				if (dbksEntityList == null || dbksEntityList.size() == 0) {
//					continue;
//				}
//				for (PlnOrderDbkSEntity entity : dbksEntityList) {
//					// 如果已经下发，则不再形成虚拟炉计划
//					if (entity.getIfStoveIssued().equals("1")) {
//						continue;
//					}
//					dbkList.add(entity);
//				}
//			} else if (zgEntity.getNextGx().equals("F")) {
//				// 5.2 通过排产联动组号查询热处理工序排产(按计划时间顺序)
//				List<PlnOrderRclSEntity> rclsEntityList = PlnHelper
//						.getEntityDatas(con,
//								new String[] { zgEntity.getPlanGroupId() },
//								"StoveCommon.getPlnOrderRclEntity",
//								PlnOrderRclSEntity.class);
//				// 如果找不到热处理工序排产则不执行
//				if (rclsEntityList == null || rclsEntityList.size() == 0) {
//					continue;
//				}
//				for (PlnOrderRclSEntity entity : rclsEntityList) {
//					// 如果已经下发，则不再形成虚拟炉计划
//					if (entity.getIfStoveIssued().equals("1")) {
//						continue;
//					}
//					rclList.add(entity);
//				}
//			}
//
//		}
//		if (dbkList.size() == 0 && rclList.size() == 0) {
//			return "";
//		}
//		if (dbkList.size() != 0) {
//			/**
//			 * 6.形成 镦拔扩虚拟炉计划表
//			 */
//			for (int i = 0; i < dbkList.size(); i++) {
//				PlnOrderDbkSEntity dbkSEntity = dbkList.get(i);
//				double inWeightS = 0;// 待投重量
//				if (!dbkSEntity.getInWeightS().equals("")) {
//					inWeightS = Double.parseDouble(dbkSEntity.getInWeightS());
//				}
//				double addWtIn = 0;// 加投重量
//				if (!dbkSEntity.getAddWtIn().equals("")) {
//					addWtIn = Double.parseDouble(dbkSEntity.getAddWtIn());
//				}
//				double batchedWt = 0;// 炉计划已排重量
//				if (!dbkSEntity.getBatchedWt().equals("")) {
//					batchedWt = Double.parseDouble(dbkSEntity.getBatchedWt());
//				}
//				// 5.4如果待投重量+加投重量-炉计划已排重量，则分配下一个镦拔扩排产
//				double waitWgt = inWeightS + addWtIn - batchedWt;
//				if (waitWgt <= 0) {
//					continue;
//				}
//				// 如果轧管产出重量小于0
//				if (outWt <= 0) {
//					break;
//				}
//
//				PlnZyDbkReadyEntity readyEntity = new PlnZyDbkReadyEntity();
//				BeanUtils.copyProperties(readyEntity, dbkSEntity);
//				readyEntity.setZgHeatPlanNo(heatPlanNo);
//				readyEntity.setIfMatchOdd("0");// 是否利库记录
//				readyEntity.setIfDoHeatPlan("0");// 是否已做正式炉计划
//				readyEntity.setJudgeStoveNo(realJudgeStoveNo);// 炉号
//				readyEntity.setRealStoveNo(judgeStoveNo);// 生产炉号
//				String readyPlanNo = PlnHelper.getParam(con,
//						"StoveCommon.getMaxReadyPlanNo", "",
//						new String[] { dbkSEntity.getProPlanId(), },
//						"READY_PLAN_NO");
//				readyEntity.setReadyPlanNo(readyPlanNo);// 预排序号
//				// 5.5如果待分配重量大于轧管产出重量，则全部分配,或者是最后一条排产
//				if (waitWgt >= outWt || i + 1 == dbkList.size()) {
//					readyEntity.setAllotNum(String.valueOf(outNum));
//					readyEntity.setAllotWt(String.valueOf(outWt));
//					PlnHelper.addEntityData(con,
//							"StoveCommon.addPlnZyDbkReadyEntity", readyEntity);
//					PlnHelper.deleteOrUpdate(
//							con,
//							"StoveCommon.updatePlnOrderDbkSEntity",
//							"",
//							new Object[] { outNum, outWt,
//									dbkSEntity.getProPlanId(),
//									dbkSEntity.getGxPlanNo() });
//					break;
//				} else {
//					// 如果小于则部分分配
//					int canNum = (int) Math.ceil(waitWgt / singleWt);
//					double canWgt = canNum * singleWt;
//					outWt = outWt - canWgt;// 轧管产出重量=轧管产出重量-分配重量;
//					outNum = outNum - canNum;//
//					readyEntity.setAllotNum(String.valueOf(canNum));
//					readyEntity.setAllotWt(String.valueOf(canWgt));
//					// 新增虚拟炉计划
//					PlnHelper.addEntityData(con,
//							"StoveCommon.addPlnZyDbkReadyEntity", readyEntity);
//					// 修改排产信息
//					PlnHelper.deleteOrUpdate(
//							con,
//							"StoveCommon.updatePlnOrderDbkSEntity",
//							"",
//							new Object[] { outNum, outWt,
//									dbkSEntity.getProPlanId(),
//									dbkSEntity.getGxPlanNo() });
//				}
//			}
//		}
//		// 生成热处理虚拟炉计划
//		if (rclList.size() != 0) {
//			/**
//			 * 6.形成 热处理虚拟炉计划表
//			 */
//			for (int i = 0; i < rclList.size(); i++) {
//				PlnOrderRclSEntity rclSEntity = rclList.get(i);
//				double inWeightS = 0;// 待投重量
//				if (!rclSEntity.getInWeightS().equals("")) {
//					inWeightS = Double.parseDouble(rclSEntity.getInWeightS());
//				}
//				double addWtIn = 0;// 加投重量
//				if (!rclSEntity.getAddWtIn().equals("")) {
//					addWtIn = Double.parseDouble(rclSEntity.getAddWtIn());
//				}
//				double batchedWt = 0;// 炉计划已排重量
//				if (!rclSEntity.getBatchedWt().equals("")) {
//					batchedWt = Double.parseDouble(rclSEntity.getBatchedWt());
//				}
//				// 5.4如果待投重量+加投重量-炉计划已排重量，则分配下一个镦拔扩排产
//				double waitWgt = inWeightS + addWtIn - batchedWt;
//				if (waitWgt <= 0) {
//					continue;
//				}
//				// 如果轧管产出重量小于0
//				if (outWt <= 0) {
//					break;
//				}
//
//				PlnZyRclReadyEntity readyEntity = new PlnZyRclReadyEntity();
//				BeanUtils.copyProperties(readyEntity, rclSEntity);
//				readyEntity.setZgHeatPlanNo(heatPlanNo);
//				readyEntity.setIfMatchOdd("0");// 是否利库记录
//				readyEntity.setIfDoHeatPlan("0");// 是否已做正式炉计划
//				readyEntity.setJudgeStoveNo(realJudgeStoveNo);// 炉号
//				readyEntity.setRealStoveNo(judgeStoveNo);// 生产炉号
//				String readyPlanNo = PlnHelper.getParam(con,
//						"StoveCommon.getMaxReadyPlanNoRcl",
//						new String[] { rclSEntity.getProPlanId(), },
//						"READY_PLAN_NO");
//				readyEntity.setReadyPlanNo(readyPlanNo);// 预排序号
//				// 5.5如果待分配重量大于轧管产出重量，则全部分配,或者是最后一条排产
//				if (waitWgt >= outWt || i + 1 == dbkList.size()) {
//					readyEntity.setAllotNum(String.valueOf(outNum));
//					readyEntity.setAllotWt(String.valueOf(outWt));
//					PlnHelper.addEntityData(con,
//							"StoveCommon.addPlnZyRclReadyEntity", readyEntity);
//					PlnHelper.deleteOrUpdate(
//							con,
//							"StoveCommon.updatePlnOrderRclSEntity",
//							"",
//							new Object[] { outNum, outWt,
//									rclSEntity.getProPlanId(),
//									rclSEntity.getGxPlanNo() });
//					break;
//				} else {
//					// 如果小于则部分分配
//					int canNum = (int) Math.ceil(waitWgt / singleWt);
//					double canWgt = canNum * singleWt;
//					outWt = outWt - canWgt;// 轧管产出重量=轧管产出重量-分配重量;
//					outNum = outNum - canNum;//
//					readyEntity.setAllotNum(String.valueOf(canNum));
//					readyEntity.setAllotWt(String.valueOf(canWgt));
//					// 新增虚拟炉计划
//					PlnHelper.addEntityData(con,
//							"StoveCommon.addPlnZyRclReadyEntity", readyEntity);
//					// 修改排产信息
//					PlnHelper.deleteOrUpdate(
//							con,
//							"StoveCommon.updatePlnOrderRclSEntity",
//							"",
//							new Object[] { outNum, outWt,
//									rclSEntity.getProPlanId(),
//									rclSEntity.getGxPlanNo() });
//				}
//			}
//		}
//
//		return "";
//	}

	/**
	 * 删除镦拔扩炉计划
	 * 
	 * @param con
	 * @param judgeStoveNo
	 *            判定炉号
	 * @throws SQLException
	 */
	public void deletePlanStoveD(Connection con, String judgeStoveNo)
			throws SQLException {
//		List<PlnZyDbkReadyEntity> list = PlnHelper.getEntityDatas(con,
//				new String[] { judgeStoveNo },
//				"StoveCommon.queryPlnZyDbkReadyById", "AND T.REAL_STOVE_NO=?",
//				PlnZyDbkReadyEntity.class);
//		int num = 0;
//		double wgt = 0;
//		String proPlanId = "";
//		String gxPlanNo = "";
//		if (list != null && list.size() > 0) {
//			for (PlnZyDbkReadyEntity readyEntity : list) {
//				num += Integer.parseInt(readyEntity.getAllotNum());
//				wgt += Double.parseDouble(readyEntity.getAllotWt());
//				proPlanId = readyEntity.getProPlanId();
//				gxPlanNo = readyEntity.getGxPlanNo();
//			}
//		}
//		// 修改镦拔扩排产 虚拟重量
//		if (proPlanId.length() > 0) {
//			PlnHelper.deleteOrUpdate(con, "StoveCommon.updatePlanE", "",
//					new Object[] { num, wgt, proPlanId, gxPlanNo });
//		}
//		// 删除镦拔扩炉计划
//		PlnHelper.deleteOrUpdate(con, "StoveCommon.deleteDbkReady", "",
//				new Object[] { judgeStoveNo });
//		// 删除轧管炉计划
//		PlnHelper.deleteOrUpdate(con, "StoveCommon.deleteZyD", "",
//				new Object[] { judgeStoveNo });
	}

	/**
	 * 删除热处理炉计划
	 * 
	 * @param con
	 * @param judgeStoveNo
	 *            判定炉号
	 * @throws SQLException
	 */
	public void deletePlanStoveF(Connection con, String judgeStoveNo)
			throws SQLException {
//		List<PlnZyRclReadyEntity> list = PlnHelper.getEntityDatas(con,
//				new String[] { judgeStoveNo },
//				"StoveCommon.queryPlnZyRclReadyById", "AND T.REAL_STOVE_NO=?",
//				PlnZyRclReadyEntity.class);
//		int num = 0;
//		double wgt = 0;
//		String proPlanId = "";
//		String gxPlanNo = "";
//		if (list != null && list.size() > 0) {
//			for (PlnZyRclReadyEntity readyEntity : list) {
//				num += Integer.parseInt(readyEntity.getAllotNum());
//				wgt += Double.parseDouble(readyEntity.getAllotWt());
//				proPlanId = readyEntity.getProPlanId();
//				gxPlanNo = readyEntity.getGxPlanNo();
//			}
//		}
//		// 修改热处理排产 虚拟重量
//		if (proPlanId.length() > 0) {
//			PlnHelper.deleteOrUpdate(con, "StoveCommon.updatePlanF",
//					new Object[] { num, wgt, proPlanId, gxPlanNo });
//		}
//		// 删除热处理炉计划
//		PlnHelper.deleteOrUpdate(con, "StoveCommon.deleteRclReady",
//				new Object[] { judgeStoveNo });
//		// 删除轧管炉计划
//		PlnHelper.deleteOrUpdate(con, "StoveCommon.deleteZyD",
//				new Object[] { judgeStoveNo });
	}

}
