package com.opentravelsoft.providers.hibernate; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.hibernate.LockMode; import org.springframework.stereotype.Repository; import com.opentravelsoft.entity.Booking; import com.opentravelsoft.entity.Employee; import com.opentravelsoft.entity.Tourist; import com.opentravelsoft.entity.finance.Reckoning; import com.opentravelsoft.entity.finance.ReckoningAcct; import com.opentravelsoft.entity.finance.ReckoningAcctId; import com.opentravelsoft.providers.ReckoningDao; import com.opentravelsoft.util.RowDataUtil; /** * 帐单制作 * * @author <a herf="mailto:zhangsitao@gmail.com">Steven Zhang</a> */ @Repository("ReckoningDao") public class ReckoningDaoHibernate extends GenericDaoHibernate<Reckoning, Integer> implements ReckoningDao { public ReckoningDaoHibernate() { super(Reckoning.class); } @SuppressWarnings("unchecked") public List<Reckoning> getReckoning(String reserveNo) { StringBuilder sql = new StringBuilder(); sql.append("from Reckoning where bookingNo=? "); Object[] param = { reserveNo }; List<Reckoning> list = getHibernateTemplate().find(sql.toString(), param); for (Reckoning reckoning : list) { reckoning.setVersion(RowDataUtil.getInt(reckoning.getNumber())); reckoning.setCreateDate(RowDataUtil.getDate(reckoning.getCreated())); reckoning.setPrintDate(RowDataUtil.getDate(reckoning.getPrinted())); } return list; } @SuppressWarnings("unchecked") public Reckoning wholeReckoningMake(Reckoning reckoning) { StringBuilder sql = new StringBuilder(); String reserveNo = reckoning.getBookingNo(); Reckoning tblReckoning = new Reckoning(); int version = 1; // 续上版本号 sql.append("from Reckoning where bookingNo=? order by number "); Object[] param = { reserveNo }; List<Reckoning> list = getHibernateTemplate().find(sql.toString(), param); if (null == list || list.isEmpty()) { tblReckoning.setNumber(version); } else { for (Reckoning obj : list) { if (obj.getNumber() > version) version = obj.getNumber(); } tblReckoning.setNumber(++version); } // tblReckoning.setBookingNo(reckoning.getBookingNo()); tblReckoning.setTourType(reckoning.getTourType()); tblReckoning.setContact(reckoning.getContact()); tblReckoning.setPhone(reckoning.getPhone()); tblReckoning.setFax(reckoning.getFax()); tblReckoning.setCreatedBy(reckoning.getCreatedBy()); tblReckoning.setPrintedCount(0); getHibernateTemplate().save(tblReckoning); // 得到帐单号 sql = new StringBuilder(); sql.append("from Reckoning where bookingNo=? and number=? "); Object[] params = { reserveNo, version }; List<Reckoning> tblReckonings = getHibernateTemplate().find(sql.toString(), params); ReckoningAcct tblReckoningAcct; ReckoningAcct reckoningAcct; ReckoningAcctId tblReckoningAcctId; reckoning.setReckoningId(tblReckonings.get(0).getReckoningId()); reckoning.setVersion(tblReckonings.get(0).getNumber()); if (reckoning.getTourType().equals("1")) { if (!reckoning.getReckoningAcctList().isEmpty()) { if (null != tblReckonings && !(tblReckonings.isEmpty())) { for (int i = 0; i < reckoning.getReckoningAcctList().size(); i++) { tblReckoningAcct = new ReckoningAcct(); tblReckoningAcctId = new ReckoningAcctId(); reckoningAcct = reckoning.getReckoningAcctList().get(i); tblReckoningAcctId.setReckoningId(tblReckonings.get(0) .getReckoningId()); tblReckoningAcctId.setItemId(reckoningAcct.getItemId()); tblReckoningAcct.setId(tblReckoningAcctId); tblReckoningAcct.setAmount(reckoningAcct.getAmount()); tblReckoningAcct.setUnit(reckoningAcct.getUnit()); tblReckoningAcct.setDescription(reckoningAcct.getDescription()); tblReckoningAcct.setUnitPrice(reckoningAcct.getUnitPrice()); tblReckoningAcct.setCount(reckoningAcct.getCount()); getHibernateTemplate().save(tblReckoningAcct); } } } } // 保存应收帐款 Booking tfj006 = (Booking) getHibernateTemplate().get(Booking.class, reckoning.getBookingNo()); tfj006.setDbamt(reckoning.getAmount()); // -------------------------------------------------------------------- // String enabled = (String) ActionContext.getContext().getApplication() // .get(EbizCommon.WORKFLOW_ENABLED); // if (enabled.equals("1")) // { // StringBuilder sb = new StringBuilder(); // sb.append("select t "); // sb.append("from org.jbpm.pvm.internal.task.TaskImpl t "); // sb.append(",Booking b "); // sb.append("where t.executionId=b.workflowId and b.nameNo=? "); // sb.append("and t.name=? "); // sb.append("and t.state!='" + Task.STATE_COMPLETED + "' "); // Object[] p = { reckoning.getBookingNo(), // WorkFlowKeyParams.ORDER_TASK_ACCOUNT }; // List<TaskImpl> taskInstances = getHibernateTemplate().find( // sb.toString(), p); // // for (TaskImpl taskInstance : taskInstances) // { // taskInstance.createVariable(WorkFlowKeyParams.WORKFLOW_ACTOR, // reckoning.getCreatedBy()); // taskService.completeTask(taskInstance.getId()); // } // } // -------------------------------------------------------------------- getHibernateTemplate().update(tfj006); return reckoning; } @SuppressWarnings("unchecked") public Reckoning getReckoningInfo(int reckoningId) { Reckoning reckoning = (Reckoning) getHibernateTemplate().get( Reckoning.class, reckoningId); if (null != reckoning) { reckoning.setVersion(RowDataUtil.getInt(reckoning.getNumber())); reckoning.setCreateDate(RowDataUtil.getDate(reckoning.getCreated())); reckoning.setPrintDate(RowDataUtil.getDate(reckoning.getPrinted())); StringBuilder sql = new StringBuilder(); sql.append("from Employee where userId=?"); Object[] params = { reckoning.getCreatedBy() }; List<Employee> employees = getHibernateTemplate().find(sql.toString(), params); if (null != employees && !(employees.isEmpty())) reckoning.setCreatedByName(employees.get(0).getUserName()); // 如果为整团,则取出帐单明细 if (reckoning.getTourType().equals("1")) { sql = new StringBuilder(); sql.append("from ReckoningAcct where id.reckoningId=? "); Object[] param = { reckoningId }; List<ReckoningAcct> tblReckoningAcctList = getHibernateTemplate().find( sql.toString(), param); List<ReckoningAcct> reckoningAcctList = new ArrayList<ReckoningAcct>(); for (ReckoningAcct obj : tblReckoningAcctList) { obj.getId().setReckoningId(obj.getId().getReckoningId()); obj.setItemId(obj.getId().getItemId()); reckoningAcctList.add(obj); } reckoning.setReckoningAcctList(reckoningAcctList); } } return reckoning; } @SuppressWarnings("unchecked") public int wholeReckoningModify(Reckoning reckoning) { StringBuilder sql = new StringBuilder(); Reckoning tblReckoning = new Reckoning(); tblReckoning = (Reckoning) getHibernateTemplate().get(Reckoning.class, reckoning.getReckoningId(), LockMode.PESSIMISTIC_WRITE); if (null != tblReckoning && tblReckoning.getReckoningId() == reckoning.getReckoningId()) { // String str = getReckoningInfo(tblReckoning, reckoning); tblReckoning.setContact(reckoning.getContact()); tblReckoning.setPhone(reckoning.getPhone()); tblReckoning.setFax(reckoning.getFax()); tblReckoning.setUpdatedBy(reckoning.getUpdatedBy()); getHibernateTemplate().update(tblReckoning); if (reckoning.getTourType().equals("1")) { sql = new StringBuilder(); sql.append("from ReckoningAcct where id.reckoningId=? "); Object[] param2 = { reckoning.getReckoningId() }; List<ReckoningAcct> tblReckoningAcctList = getHibernateTemplate().find( sql.toString(), param2); getHibernateTemplate().deleteAll(tblReckoningAcctList); ReckoningAcct tblReckoningAcct; ReckoningAcct reckoningAcct; ReckoningAcctId tblReckoningAcctId; for (int i = 0; i < reckoning.getReckoningAcctList().size(); i++) { tblReckoningAcct = new ReckoningAcct(); tblReckoningAcctId = new ReckoningAcctId(); reckoningAcct = reckoning.getReckoningAcctList().get(i); tblReckoningAcctId.setReckoningId(reckoning.getReckoningId()); tblReckoningAcctId.setItemId(reckoningAcct.getItemId()); tblReckoningAcct.setId(tblReckoningAcctId); tblReckoningAcct.setAmount(reckoningAcct.getAmount()); tblReckoningAcct.setUnit(reckoningAcct.getUnit()); tblReckoningAcct.setDescription(reckoningAcct.getDescription()); tblReckoningAcct.setUnitPrice(reckoningAcct.getUnitPrice()); tblReckoningAcct.setCount(reckoningAcct.getCount()); getHibernateTemplate().save(tblReckoningAcct); } } // 修改应收帐款 Booking tfj006 = (Booking) getHibernateTemplate().get(Booking.class, reckoning.getBookingNo()); BigDecimal old_Amount = tfj006.getDbamt(); tfj006.setDbamt(reckoning.getAmount()); getHibernateTemplate().update(tfj006); String str1 = "账单号," + reckoning.getReckoningId() + "," + tblReckoning.getReckoningId() + ","; if (old_Amount != tfj006.getDbamt()) { str1 = str1 + "应收账款," + tfj006.getDbamt() + "," + old_Amount + ","; } return 0; } else return -1; } @SuppressWarnings("unchecked") public List<ReckoningAcct> getCustomerList(String bookingNo) { StringBuilder sql = new StringBuilder(); sql.append("from Tourist where booking.nameNo=? and del='N' "); List<ReckoningAcct> reckoningAcctList = new ArrayList<ReckoningAcct>(); ReckoningAcct reckoningAcct; Object[] params = { bookingNo }; List<Tourist> tourists = getHibernateTemplate() .find(sql.toString(), params); int itemId = 1; for (Tourist obj : tourists) { reckoningAcct = new ReckoningAcct(); reckoningAcct.setItemId(itemId++); reckoningAcct.setName(RowDataUtil.getString(obj.getUserName())); reckoningAcct.setAmount(RowDataUtil.getBigDecimal(obj.getAmt01())); reckoningAcctList.add(reckoningAcct); } return reckoningAcctList; } public int setPrint(int reckoningId) { Date sysdate = getSysdate(); Reckoning tblReckoning = new Reckoning(); tblReckoning = (Reckoning) getHibernateTemplate().get(Reckoning.class, reckoningId, LockMode.PESSIMISTIC_WRITE); tblReckoning.setPrintDate(sysdate); tblReckoning.setPrintedCount(tblReckoning.getPrintedCount() + 1); getHibernateTemplate().update(tblReckoning); return 0; } @SuppressWarnings("unchecked") public List<ReckoningAcct> getTourReckoningAcctList(String tourNo) { StringBuilder sql = new StringBuilder(); sql.append("select b.reckoningId,c.description,c.unitPrice, "); sql.append("c.count,c.amount,c.unit,b.bookingNo,b.number "); sql.append("from Booking a, "); sql.append("Reckoning b, "); sql.append("ReckoningAcct c "); sql.append("where a.plan.tourNo=? and a.nameNo=b.bookingNo "); sql.append("and b.reckoningId=c.id.reckoningId "); sql.append("order by b.bookingNo "); Object[] param = { tourNo }; List<Object[]> list = getHibernateTemplate().find(sql.toString(), param); List<ReckoningAcct> reckoningAcctList = new ArrayList<ReckoningAcct>(); if (!list.isEmpty()) { ReckoningAcct reckoningAcct; int size = list.size(); int number = 0; String bookingNo = new String(); Object[] object1; Object[] object2; // 移除订单低版本的帐单 for (int i = 0; i < size; i++) { if (null != list && i < list.size()) { object1 = list.get(0); bookingNo = RowDataUtil.getString(object1[6]); number = RowDataUtil.getInt(object1[7]); // 取此订单帐单最高版本号 for (int j = 0; j < list.size(); j++) { object2 = list.get(j); if (bookingNo.equals(RowDataUtil.getString(object2[6]))) if (number < RowDataUtil.getInt(object2[7])) number = RowDataUtil.getInt(object2[7]); } // 取此订单帐单最高版本号所对应的帐单明细 for (Object[] obj : list) { if (RowDataUtil.getString(obj[6]).equals(bookingNo) && RowDataUtil.getInt(obj[7]) == number) { reckoningAcct = new ReckoningAcct(); reckoningAcct.getId().setReckoningId(RowDataUtil.getInt(obj[0])); reckoningAcct.setDescription(RowDataUtil.getString(obj[1])); reckoningAcct.setUnitPrice(RowDataUtil.getBigDecimal(obj[2])); reckoningAcct.setCount(RowDataUtil.getInt(obj[3])); reckoningAcct.setAmount(RowDataUtil.getBigDecimal(obj[4])); reckoningAcct.setUnit(RowDataUtil.getString(obj[5])); reckoningAcct.setBookingNo(RowDataUtil.getString(obj[6])); reckoningAcctList.add(reckoningAcct); } } int lastSize = list.size(); // 移除已取订单的所有帐单 for (int k = 0; k < lastSize; k++) { if (k < list.size() && (list.get(k))[6].equals(bookingNo)) { list.remove(k); k--; } } } } } return reckoningAcctList; } private String getReckoningInfo(Reckoning tblReckoning, Reckoning reckoning) { String info = ""; if (reckoning != null && tblReckoning != null) { if (!reckoning.getContact().equals(tblReckoning.getContact())) { info = info + "联系人," + reckoning.getContact() + "," + tblReckoning.getContact() + ","; } if (!reckoning.getPhone().equals(tblReckoning.getPhone())) { info = info + "电话," + reckoning.getPhone() + "," + tblReckoning.getPhone() + ","; } if (!reckoning.getFax().equals(tblReckoning.getFax())) { info = info + "传真," + reckoning.getFax() + "," + tblReckoning.getFax() + ","; } } return info; } }