该方法中有问题!!!!!
错误是在for循环中将订货单的信息和采购单的信息存放到中间表中,但第一次执行到:
//因为每次审核时只是生成一个采购单,所以只需保存这个采购单
//frank 当销货单添加成功后获取销货单的id 和no 及类名称
qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");
this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
这段代码时会发出sql命令,但是当第二次执行到此段代码时,就不会发出sql命令。
错误原因是:
//frank add
Timestamp ts = new Timestamp(new Date().getTime());
QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank 单据关联实体类
qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
qcyReceiptsConnection.setParentNo(pageObject.getNo());
qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
qcyReceiptsConnection.setCreator(user);
qcyReceiptsConnection.setCreateTime(ts);
qcyReceiptsConnection.setModifier(user);
qcyReceiptsConnection.setModifyTime(ts);
这段代码中的QcyReceiptsConnection实体类只new了一次,所以要想让 this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection); 这段代码每次执行都发出sql语句只需要new新的实体就行。
QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank 单据关联实体类
qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
qcyReceiptsConnection.setParentNo(pageObject.getNo());
qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
qcyReceiptsConnection.setCreator(user);
qcyReceiptsConnection.setCreateTime(ts);
qcyReceiptsConnection.setModifier(user);
qcyReceiptsConnection.setModifyTime(ts);
//因为每次审核时只是生成一个采购单,所以只需保存这个采购单
qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");
this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
这样修改就行
/**
* <b>审核与退回的相关操作</b> <b>Peter</b>*/
public void saveAuditAndUnaudit(QcyUnitedOrderInfo pageObject,String isExternal, int i, String[] nos, CommonService service,SysUser user )
throws Exception {
//frank add
Timestamp ts = new Timestamp(new Date().getTime());
QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank 单据关联实体类
qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
qcyReceiptsConnection.setParentNo(pageObject.getNo());
qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
qcyReceiptsConnection.setCreator(user);
qcyReceiptsConnection.setCreateTime(ts);
qcyReceiptsConnection.setModifier(user);
qcyReceiptsConnection.setModifyTime(ts);
if (null != pageObject.getId()) {
// pageObject.setIsAudit(i + "");
this.getQcyUnitedOrderInfoDAO().update(pageObject);
}
// 审核通过后,要对销货单,采购单,验收单进行自动生成
String salesSlipNo = nos[0];
// String purchaseInfoNo = nos[1];
// String acceptenceInfoNo = nos[2];
Date now = new Date();
if (i == 1) {
List<Object> paramsList = new ArrayList<Object>();
SqlStoreUtil util = new SqlStoreUtil();
if (!"1".equals(isExternal)) {
// 销货单转换
QcySalesSlip salesItem = new QcySalesSlip();
salesItem.setBranch(pageObject.getBranch());
salesItem.setRequestBranch(pageObject.getRequestBranch());
salesItem.setNo(salesSlipNo);
salesItem.setReceiptDate(pageObject.getReceiptDate());
salesItem.setSalesDate(pageObject.getReceiptDate());
salesItem.setStatus(ERPConstants.UNSAVED_RECEIPT);
salesItem.setCreateTime(new Timestamp(now.getTime()));
salesItem.setCreator(pageObject.getModifier());
salesItem.setModifyTime(new Timestamp(now.getTime()));
salesItem.setModifier(pageObject.getModifier());
this.getQcyUnitedOrderInfoDAO().saveObject(salesItem);
//frank 当销货单添加成功后获取销货单的id 和no 及类名称
qcyReceiptsConnection.setSeedId(salesItem.getId());
qcyReceiptsConnection.setSeedNo(salesItem.getNo());
qcyReceiptsConnection.setSeedClass("QcySalesSlip");
this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
//frank end
paramsList.add(salesItem.getId());
paramsList.add(pageObject.getId());
List<IvtWarehouse> ivt = new ArrayList<IvtWarehouse>();
ivt = (List<IvtWarehouse>) this.getQcyUnitedOrderInfoDAO().executeQuery("from IvtWarehouse as i where i.isDefault='1' and i.branch.id="+ pageObject.getBranch().getId());
if (ivt.size() > 0) {
paramsList.add(ivt.get(0).getId());
this.getQcyUnitedOrderInfoDAO().executeSQLUpdate(util.convertSQL(util.qcyUnitedOrderInfo2QcySalesSlip,paramsList));
} else {
System.out.println("审核失败,没有默认仓库");
return;
}
} else {
// 采购单
paramsList.clear();
// paramsList.add(pageObject.getBranch() == null ? null
// : pageObject.getBranch().getId());
paramsList.add(pageObject.getId());
// 提取数据 品项和供应商
String queryhql = util.convertSQL(util.qcyUnitedOrderInfo2QcyPurchaseInfo, paramsList);
// System.out.println(queryhql);
List<Object[]> objectList = this.getQcyUnitedOrderInfoDAO().executeSQLQuery(queryhql);
List<?> tempList = new ArrayList<QcyPurchaseInfo>();
for (int j = 0; j < objectList.size(); j++) {
boolean isUpdate = false;// 更新表项的flag
Object[] objs = objectList.get(j);
// /判断这个供应商采购单是否存在
// 如果存在则更新,否则插入
BigInteger supplierId = (BigInteger) objs[5];
if (supplierId == null)
continue;
tempList = this.getQcyUnitedOrderInfoDAO().executeQuery(
"from QcyPurchaseInfo t where t.supplier.id = "+ supplierId + " and t.status = '"+ ERPConstants.SAVED_RECEIPT + "'");
QcyPurchaseInfo qcyPurchaseInfo = null;
if (null != tempList && tempList.size() > 0) {// 更新,并将表项插入(更新)这个表单
// 更新主表单信息
qcyPurchaseInfo = (QcyPurchaseInfo) tempList.get(0);
qcyPurchaseInfo.setModifier(pageObject.getModifier());
qcyPurchaseInfo.setModifyTime(pageObject.getModifyTime());
this.getQcyUnitedOrderInfoDAO().updateObject( qcyPurchaseInfo);
// 检查是否有重复的子表项,如存在,则更新这个表项的数量,否则新增一个表项
String checkSql = "from QcyPurchaseInfoItem where header.id = "
+ qcyPurchaseInfo.getId()+ " and branch.id = "+ supplierId+ " and itemNo = '" + objs[0]+ "'";
List<?> checkList = this.getQcyUnitedOrderInfoDAO()
.executeQuery(checkSql);
if (null != checkList && checkList.size() > 0) {// 更新子表项
isUpdate = true;
} else {// 新增加子表项
isUpdate = false;
}
} else { // 新增主表单,并且将表项插入到这个表单
isUpdate = false;
qcyPurchaseInfo = new QcyPurchaseInfo();
qcyPurchaseInfo.setNo(service.getNo( QcyPurchaseInfo.class, 3));
qcyPurchaseInfo.setPurchaseDate(now);
qcyPurchaseInfo.setReceiptDate(now);
qcyPurchaseInfo.setCreator(pageObject.getModifier());
qcyPurchaseInfo.setCreateTime(pageObject .getModifyTime());
qcyPurchaseInfo.setModifier(pageObject.getModifier());
qcyPurchaseInfo.setModifyTime(pageObject.getModifyTime());
qcyPurchaseInfo.setStatus(ERPConstants.SAVED_RECEIPT);
BdSupplier bdSupplier = new BdSupplier();
bdSupplier.setId(supplierId.intValue());
qcyPurchaseInfo.setSupplier(bdSupplier);
this.getQcyUnitedOrderInfoDAO().saveObject( qcyPurchaseInfo);
QcyReceiptsConnection qcyReceiptsConnection = new QcyReceiptsConnection();//frank 单据关联实体类
qcyReceiptsConnection.setParentId(pageObject.getId());//相对于销货单或采购单为父单据
qcyReceiptsConnection.setParentNo(pageObject.getNo());
qcyReceiptsConnection.setParentClass("QcyUnitedOrderInfo");
qcyReceiptsConnection.setCreator(user);
qcyReceiptsConnection.setCreateTime(ts);
qcyReceiptsConnection.setModifier(user);
qcyReceiptsConnection.setModifyTime(ts);
//因为每次审核时只是生成一个采购单,所以只需保存这个采购单
qcyReceiptsConnection.setSeedId(qcyPurchaseInfo.getId());
qcyReceiptsConnection.setSeedNo(qcyPurchaseInfo.getNo());
qcyReceiptsConnection.setSeedClass("QcyPurchaseInfo");
this.getQcyUnitedOrderInfoDAO().saveObject(qcyReceiptsConnection);
}
BdProduct product = null;
PurcInquiryInfoItem inquiry = null;
if (isUpdate == false) {
// 插入子表项
// 取默认规格
product = new BdProduct();
product = (BdProduct) this.getQcyUnitedOrderInfoDAO()
.getObject("from BdProduct as p where p.no='"+ (String) objs[0] + "'");
// 取供应商规格 仅限单供应商(一个商品只有一个供应商)
inquiry = new PurcInquiryInfoItem();
inquiry = (PurcInquiryInfoItem) this
.getQcyUnitedOrderInfoDAO().getObject( "from PurcInquiryInfoItem as p where p.itemNo='"+ (String) objs[0] + "'");
// 构建子表
QcyPurchaseInfoItem qcyPurchaseInfoItem = new QcyPurchaseInfoItem();
qcyPurchaseInfoItem.setBranch(pageObject .getRequestBranch());// pageObject.getBranch为null
qcyPurchaseInfoItem.setItemNo((String) objs[0]);
qcyPurchaseInfoItem.setItemName((String) objs[1]);
BdUnit bdUnit = new BdUnit();
bdUnit.setId(((Integer) objs[2]));
qcyPurchaseInfoItem.setUnit(bdUnit);
qcyPurchaseInfoItem.setPrice(objs[3] == null ? 0d: ((BigDecimal) objs[3]).doubleValue());
qcyPurchaseInfoItem.setOrderAmount((Integer) objs[4] * product.getMain2Basic()/ inquiry.getMain2Basic());
qcyPurchaseInfoItem.setSubtotal(qcyPurchaseInfoItem.getPrice()* qcyPurchaseInfoItem.getOrderAmount());
qcyPurchaseInfoItem.setHeader(qcyPurchaseInfo);
this.getQcyUnitedOrderInfoDAO().saveObject( qcyPurchaseInfoItem);
} else {
// 更新指定表项
// 还未进行单位换算
String updateSql = "update QcyPurchaseInfoItem set orderAmount = orderAmount +"
+ objs[4]
+ "where header.id = "
+ qcyPurchaseInfo.getId()
+ " and branch.id = "
+ supplierId
+ " and itemNo = '"
+ objs[0]
+ "'";
this.getQcyUnitedOrderInfoDAO().executeUpdate(updateSql);
}
}
}
}
// /退回相关操作
else {
}
}
总结:Hibernate在执行save方法时,在for循环中要确保实体类每次都new一个新的,当为同一个实体类时,Hibernate就不会再发出sql命令。