Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java =================================================================== diff -u -r21662 -r21841 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 21662) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 21841) @@ -100,6 +100,7 @@ import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionRecordManager; import com.forgon.disinfectsystem.washTransition.service.WashTransitionItemManager; import com.forgon.tools.MapTools; +import com.forgon.tools.SqlBuilder; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.db.DatabaseUtil; @@ -110,6 +111,7 @@ import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.SqlUtils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; @@ -119,6 +121,8 @@ import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; +import edu.emory.mathcs.backport.java.util.Arrays; + /** * @author WangYi 2012-3-5 */ @@ -1544,6 +1548,29 @@ } } + public void loadExpensiveGoodsApplicationGoods() { + String orgUnitCoding = StrutsParamUtils.getPraramValue("orgUnitCoding", + null); + //申请日期 + String applyDate = StrutsParamUtils.getPraramValue("applyDate", ""); + + //申请单id + String invoicePlanId = StrutsParamUtils.getPraramValue("invoicePlanId", ""); + + Collection list = null; + list = invoiceManager + .getWaitDeliverGoods(Long.parseLong(invoicePlanId), applyDate, null,null); + + JSONArray jsonArray = JSONArray.fromObject(list); + try { + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + response.getWriter().println(jsonArray.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void loadExpressInvoiceWaitDeliverGoods() { String orgUnitCoding = StrutsParamUtils.getPraramValue("orgUnitCoding", null); @@ -2247,4 +2274,67 @@ JSONArray array = JSONArray.fromObject(invoiceItemManager.summaryInvoiceItem(StrutsParamUtils.getPraramValue("invoiceIds", ""))); StrutsResponseUtils.output(true,array); } + public String test_findInvoiceTableList() { + + // 申请单查看 发货单 + String recyclingApplicantID = null; + String invoiceType = null; + String selectedTousseType = null; + String selectedDisposableGoodsType = null; + String applyType = null; + String selectedDepartCodes = null; +// String sql = "where po.invoicePlan is not null"; + String sql = "where 1=1 "; +// if (StringUtils.isNotBlank(selectedTousseType)) { +// sql = "inner join po.invoiceItem where 1=1 "; +// } + if (StringUtils.isNotBlank(recyclingApplicantID)) { + sql += " and po.invoicePlan.id = " + recyclingApplicantID + + " and po.status != '" + Invoice.STATUS_UNDELIVERED + "'"; + } + if (StringUtils.isNotBlank(invoiceType)) { + if (invoiceType.equals("1")) {// 已处理的发货单 + sql += " and po.status != '" + Invoice.STATUS_UNDELIVERED + "'"; + } else if (invoiceType.equals("2")) {// 未处理的发货单 + sql += " and po.status = '" + Invoice.STATUS_UNDELIVERED + "'"; + } + } + sql += " and po.orgUnitCoding = '" + + AcegiHelper.getLoginUser() + .getOrgUnitCodingFromSupplyRoomConfig() + "'"; + if(StringUtils.isNotBlank(selectedDepartCodes)){ + String[] selectedDepartCodesArr = selectedDepartCodes.split(";"); + sql += String.format(" and %s ", SqlUtils.getStringFieldInCollectionsPredicate("po.departCoding", Arrays.asList(selectedDepartCodesArr))); + + } + + //按物品类型过滤 + if (StringUtils.isNotBlank(selectedTousseType) && selectedTousseType.indexOf("全部") == -1) { + String[] selectedTousseTypeArr = selectedTousseType.split(","); + sql += String.format(" and po.id in(select i.invoiceID from InvoiceItem i where %s) ", SqlUtils.getStringFieldInCollectionsPredicate("i.tousseType", Arrays.asList(selectedTousseTypeArr))); + } + //按一次性物品类型过滤 + if (StringUtils.isNotBlank(selectedDisposableGoodsType)) { + String[] selectedDisposableGoodsTypeArr = selectedDisposableGoodsType.split(","); + sql += String.format(" and po.id in(select i.invoiceID from InvoiceItem i where %s) ", SqlUtils.getStringFieldInCollectionsPredicate("i.disposableGoodsType2", Arrays.asList(selectedDisposableGoodsTypeArr))); + } + + //按申请单类型过滤 + if (StringUtils.isNotBlank(applyType) && applyType.indexOf("全部") == -1) { + sql += String.format(" and %s ", SqlBuilder.build_IN_Statement("po.invoicePlanType", SqlBuilder.IN, applyType.split(Constants.IDS_SEPARATOR_COMMA))); + } + @SuppressWarnings("rawtypes") + List list = objectDao.findBySql(Invoice.class.getSimpleName(),sql, 0, 20," id desc "); + + String json = gridManager.converJsonString(list.size(), list, sql, new String[] { + "invoicePlan", "returnedTousseItems", + "diposableGoodsItems", "tousseInstances", + "noProvideGoods", "invoiceItem" }); +// String json = gridManager.renderGrid(null, +// Invoice.class.getSimpleName(), sql, new String[] { +// "invoicePlan", "returnedTousseItems", +// "diposableGoodsItems", "tousseInstances", +// "noProvideGoods", "invoiceItem" }); + return json; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemUtils.java =================================================================== diff -u -r20083 -r21841 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemUtils.java (.../TousseItemUtils.java) (revision 20083) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemUtils.java (.../TousseItemUtils.java) (revision 21841) @@ -10,6 +10,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.expensivegoodsapplication.ExpensiveGoodsApplication; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; @@ -72,8 +73,8 @@ .equals(recyclingStatus); // 回收后发货 过滤申请单的申请项 String tousseType = applicationItem.getTousseType(); - // 一次性物品和辅料包在任何情况下都不过滤 - if("一次性物品".equals(tousseType) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType) || StringUtils.equals(isRecycling, TousseDefinition.STR_NO)){ + // 高值耗材,一次性物品和辅料包在任何情况下都不过滤 + if(applicationItem.isExpensiveGoods() || "一次性物品".equals(tousseType) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType) || StringUtils.equals(isRecycling, TousseDefinition.STR_NO)){ }else{ Integer recyclingAmount = applicationItem.getRecyclingAmount(); @@ -84,11 +85,15 @@ return true; } } - // + // 高值耗材不验证数量 + if(applicationItem.isExpensiveGoods()){ + return false; + } int appAmount = 0; if(invoicePlan.isOperationReservationApplication() || invoicePlan instanceof ProxyDisinfection - || invoicePlan instanceof ForeignProxyDisinfection){ + || invoicePlan instanceof ForeignProxyDisinfection + || invoicePlan instanceof ExpensiveGoodsApplication){ appAmount = applicationItem.getAmount(); }else{ appAmount = CssdUtils.getWaitDeliverAmount(applicationItem, Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r21795 -r21841 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 21795) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 21841) @@ -77,6 +77,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.expensivegoods.ExpensiveGoodsModel; import com.forgon.disinfectsystem.entity.expensivegoods.ExpensiveGoodsModelStock; +import com.forgon.disinfectsystem.entity.expensivegoodsapplication.ExpensiveGoodsApplication; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; @@ -5221,7 +5222,8 @@ int appAmount = 0; if(invoicePlan.isOperationReservationApplication() || invoicePlan instanceof ProxyDisinfection - || invoicePlan instanceof ForeignProxyDisinfection){ + || invoicePlan instanceof ForeignProxyDisinfection + || invoicePlan instanceof ExpensiveGoodsApplication){ appAmount = applicationItem.getAmount(); }else{ appAmount = CssdUtils.getWaitDeliverAmount(applicationItem, @@ -6431,7 +6433,7 @@ .getBarcodeToExpensiveGoodsInstanceMap(); Long expensiveGoodsId = applicationItem.getExpensiveGoodsId(); if (expensiveGoodsId == null) { - throw new RuntimeException(String.format("数据异常,一次性物品 %s 的定义id为空", + throw new RuntimeException(String.format("数据异常,高值耗材 %s 的定义id为空", applicationItem.getTousseName())); } // ExpensiveGoods expensiveGoods = idToExpensiveGoodsMap @@ -6507,6 +6509,74 @@ } } + // 发货数量可以大于申请数量 + private void getAvaliableInvoiceItemForExpensiveGoods2( + InvoicePlan invoicePlan, TousseItem applicationItem, + Set invoiceItemSet, + SubmitInvoiceContext submitInvoiceContext) { + Map sendOutBarcodeAmountMap = submitInvoiceContext + .getSendOutBarcodeToAmountMap(); + Map barcodeToExpensiveGoodsInstanceMap = submitInvoiceContext + .getExpensiveGoodsServiceContext() + .getBarcodeToExpensiveGoodsInstanceMap(); + Long expensiveGoodsId = applicationItem.getExpensiveGoodsId(); + if (expensiveGoodsId == null) { + throw new RuntimeException(String.format("数据异常,高值耗材 %s 的定义id为空", + applicationItem.getTousseName())); + } +// ExpensiveGoods expensiveGoods = idToExpensiveGoodsMap +// .get(expensiveGoodsId); +// if (expensiveGoods == null) { +// return; +// } + String applicationGoodsName = applicationItem.getTousseName(); + // 高值耗材 + Collection expensiveGoodsInstanceCollection = barcodeToExpensiveGoodsInstanceMap + .values(); + if (expensiveGoodsInstanceCollection == null + || expensiveGoodsInstanceCollection.isEmpty()) { + return; + } + List expensiveGoodsInstanceList = new ArrayList( + expensiveGoodsInstanceCollection.size()); + // 物品过滤 + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceCollection) { + Long invoicePlanId = expensiveGoodsInstance.getInvoicePlanId(); + if(invoicePlanId == null){ + continue; + } + if (invoicePlanId.equals(invoicePlan.getId()) && expensiveGoodsId.equals(expensiveGoodsInstance + .getExpensiveGoods().getId())) { + expensiveGoodsInstanceList.add(expensiveGoodsInstance); + } + } + if (expensiveGoodsInstanceList.isEmpty()) { + return; + } + // 高值耗材不合并 + for (ExpensiveGoodsInstance expensiveGoodsInstance : expensiveGoodsInstanceList) { + + InvoiceItem invoiceItem = new InvoiceItem(); + invoiceItemSet.add(invoiceItem); + invoiceItem.setBarcode(expensiveGoodsInstance.getBarcode()); + invoiceItem.setExpensiveGoodsId(expensiveGoodsId); + invoiceItem.setExpensiveGoodsInstanceId(expensiveGoodsInstance.getId()); + invoiceItem.setExpensiveGoodsStockId(expensiveGoodsInstance.getExpensiveGoodsStockId()); + invoiceItem + .getExpensiveGoodsInstanceList().add(expensiveGoodsInstance);; + invoiceItem.setAmount(1); + invoiceItem.setDiposable(InvoiceItem.DIPOSABLE_NO); + invoiceItem.setTousseType(applicationItem.getTousseType()); + invoiceItem.setTousseName(applicationGoodsName); + sendOutBarcodeAmountMap.remove(expensiveGoodsInstance + .getBarcode()); + barcodeToExpensiveGoodsInstanceMap + .remove(expensiveGoodsInstance.getBarcode()); + } + + applicationItem.setSendOutAmount((applicationItem + .getSendOutAmount() + expensiveGoodsInstanceList.size())); + } private void getAvaliableInvoiceItemForTousse(InvoicePlan invoicePlan, TousseItem applicationItem, Set invoiceItemSet, @@ -6823,7 +6893,7 @@ if (TousseItem.TYPE_DIPOSABLE_GOODS.equals(applicationItem.getTousseType())) { getAvaliableInvoiceItemForDisposableGoods(invoicePlan,applicationItem,invoiceItemSet, submitInvoiceContext); } else if (applicationItem.isExpensiveGoods()) { - getAvaliableInvoiceItemForExpensiveGoods(invoicePlan,applicationItem,invoiceItemSet, submitInvoiceContext); + getAvaliableInvoiceItemForExpensiveGoods2(invoicePlan,applicationItem,invoiceItemSet, submitInvoiceContext); } else { getAvaliableInvoiceItemForTousse(invoicePlan, applicationItem, invoiceItemSet, submitInvoiceContext); }