/**
   * 通过审批
   *
   * @param con
   */
  public void pass(Connection con, String suggest) throws Exception {
    String sql = null;
    PreparedStatement pstmt = null;
    YmContract contract = YmContract.getYmContractByConId(con, this.getCon_id());
    java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
    int updateCount = 0;
    sql =
        "update t_ym_process_approval set status = 4, pass_date = ? where approval_id = ? and status = 2 ";
    pstmt = con.prepareStatement(sql);
    pstmt.setTimestamp(1, now);
    pstmt.setString(2, this.getApproval_id());
    updateCount = pstmt.executeUpdate();
    pstmt.close();
    if (updateCount != 1) throw new Exception("更新记录不是一条");

    int msgWay = JMessageEnum.SYSTEM_MESSAGE;

    Set<String> set = new HashSet<String>();
    set.add(contract.getCon_visa_con());
    if (!set.contains(contract.getCon_visa_guide())) set.add(contract.getCon_visa_guide());

    String toUserIds[] = new String[set.size()];
    int i = 0;
    for (Iterator<String> iter = set.iterator(); iter.hasNext(); i++) {
      toUserIds[i] = (String) iter.next();
    }

    String subject =
        contract.getCstm_name()
            + "的办理进程"
            + JUtil.convertNull(this.getApproval_type_name())
            + "审批已经通过审批!";
    String url = "/ym/processControl.jsp?cmd=update&con_id=" + contract.getCon_id();
    JMessageAdapter.sendMessage(msgWay, toUserIds, subject, subject, "-1", url);

    YmProcessItem item =
        YmProcessItem.getYmProcessItem(contract.getApply_project(), this.getApproval_type());
    if (YmProcess.isNewProcess(contract.getApply_project())) {
      int count = 0;
      sql = " select count(*) item_count from t_ym_process_date where con_id = ? and item_id = ?  ";
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, contract.getCon_id());
      pstmt.setString(2, item.getItem_id());
      ResultSet rs = pstmt.executeQuery();

      if (rs.next()) {
        count = rs.getInt("item_count");
      }
      rs.close();
      pstmt.close();
      if (count == 0) {
        sql = " insert into t_ym_process_date(con_id, item_id, done_date) values(?, ?, ?) ";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, contract.getCon_id());
        pstmt.setString(2, item.getItem_id());
        pstmt.setDate(3, JUtil.str2SQLDate(JUtil.formatDate(now, "YYYY-MM-DD")));
        pstmt.executeUpdate();
        pstmt.close();
      } else {
        sql = " update t_ym_process_date set done_date = ? where con_id = ? and item_id = ? ";
        pstmt = con.prepareStatement(sql);
        pstmt.setDate(1, JUtil.str2SQLDate(JUtil.formatDate(now, "YYYY-MM-DD")));
        pstmt.setString(2, contract.getCon_id());
        pstmt.setString(3, item.getItem_id());
        pstmt.executeUpdate();
        pstmt.close();
      }
    }

    if (item.getShow_approval() == 1 && this.getApproval_type().indexOf("date_item") > -1) {
      // 如果时间点已经录过,则不覆盖
      sql =
          " select "
              + this.getApproval_type()
              + " as type_date from t_ym_process where con_id = ? ";
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, contract.getCon_id());
      ResultSet rs = pstmt.executeQuery();
      java.sql.Date type_date = null;
      if (rs.next()) {
        type_date = rs.getDate("type_date");
      }
      rs.close();
      pstmt.close();
      if (type_date == null) {
        // 审批时间既为提交时间
        sql = " update t_ym_process set " + this.getApproval_type() + " = ? where con_id = ? ";
        pstmt = con.prepareStatement(sql);
        pstmt.setDate(1, JUtil.str2SQLDate(JUtil.formatDate(now, "YYYY-MM-DD")));
        pstmt.setString(2, contract.getCon_id());
        updateCount = pstmt.executeUpdate();
        pstmt.close();
        if (updateCount == 0) {
          sql = " insert into t_ym_process(" + this.getApproval_type() + ", con_id) values(?,?)";
          pstmt = con.prepareStatement(sql);
          pstmt.setDate(1, JUtil.str2SQLDate(JUtil.formatDate(now, "YYYY-MM-DD")));
          pstmt.setString(2, contract.getCon_id());
          pstmt.executeUpdate();
        }
        KHRecord.saveYjDate(
            con,
            JUtil.str2SQLDate(JUtil.formatDate(now, "YYYY-MM-DD")),
            contract.getCon_no(),
            this.getApproval_type());
      }
    }
    // 生成新流程
    YmProcessEvolve.initEvolveDay1(con, this.getCon_id());
    // 保存办理进程时,修改办理进展
    YmProcessEvolve.autoModifyEvolve(con, this.getCon_id());
    // 保存办理进程时,修改办理进展(针对于新流程)
    YmProcessEvolve.autoModifyEvolve1(con, this.getCon_id());
  }
  /**
   * 审批
   *
   * @param user
   * @param jobId
   * @param agree
   * @param suggest
   */
  public void approve(JUser user, String jobId, boolean agree, String suggest) throws Exception {
    Connection con = null;
    PreparedStatement pstmt = null;
    String sql = null;
    Job job = null;
    java.util.Map<String, Object> context = new java.util.HashMap<String, Object>();
    StringBuffer contextXML = new StringBuffer();

    context.put("user_id", user.getUserId()); // 当前操作人
    context.put("approveFlag", (agree ? "1" : "0")); // 审批标记
    context.put("suggest", suggest); // 审批意见
    boolean end = true;
    try {
      con = JDatabase.getJDatabase().getConnection();
      con.setAutoCommit(false);
      job = Job.getJobById(con, jobId);

      contextXML.append("<ContextData>");
      contextXML.append("<approval><flag>" + (agree ? "1" : "0") + "</flag></approval>");

      if (agree) {
        YmContract contract = YmContract.getYmContractByConId(con, this.getCon_id());
        YmProcessItem item =
            YmProcessItem.getYmProcessItem(contract.getApply_project(), this.getApproval_type());
        if (item != null
            && !user.getUserId().equals(this.getApprover())
            && item.getCon_lead_app() == 1) {
          end = false;
          contextXML.append("<approver>" + this.getApprover() + "</approver>");
        }
        contextXML.append("<Participants>");
        contextXML.append("<Participant type=\"user\">");
        if (item != null
            && !user.getUserId().equals(this.getApprover())
            && item.getCon_lead_app() == 1) {
          contextXML.append("<user>" + this.getApprover() + "</user>");
        }
        contextXML.append("</Participant>");
        contextXML.append("</Participants>");
      }
      contextXML.append("</ContextData>");
      context.put("contextXML", contextXML.toString());
      job.setContext(context);
      job.start(con);

      if (!agree) {
        sql = "update t_ym_process_approval set status = 3 where approval_id = ? ";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, this.getApproval_id());
        pstmt.executeUpdate();
        pstmt.close();
        YmContract contract = YmContract.getYmContractByConId(con, this.getCon_id());
        int msgWay = JMessageEnum.SYSTEM_MESSAGE;

        Set<String> set = new HashSet<String>();
        set.add(contract.getCon_visa_con());
        if (!set.contains(contract.getCon_visa_guide())) set.add(contract.getCon_visa_guide());

        String toUserIds[] = new String[set.size()];
        int i = 0;
        for (Iterator<String> iter = set.iterator(); iter.hasNext(); i++) {
          toUserIds[i] = (String) iter.next();
        }

        String subject =
            contract.getCstm_name()
                + "的办理进程"
                + JUtil.convertNull(this.getApproval_type_name())
                + "审核未通过";
        String url = "/ym/processControl.jsp?cmd=update&con_id=" + this.getCon_id();
        JMessageAdapter.sendMessage(msgWay, toUserIds, subject, subject, "-1", url);
      } else if (job.getActivityId().equals("manager") && end) {
        this.pass(con, suggest);
      }
      con.commit();
    } catch (Exception e) {
      throw e;
    } finally {
      if (con != null) con.rollback();
      if (con != null) con.close();
    }
  }