Index: ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js =================================================================== diff -u -r25246 -r25251 --- ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js (.../returnGoodsRecordForm.js) (revision 25246) +++ ssts-web/src/main/webapp/disinfectsystem/returnGoodsRecord/returnGoodsRecordForm.js (.../returnGoodsRecordForm.js) (revision 25251) @@ -2242,11 +2242,13 @@ // } //获取tree columns数据 - var returnTousseItemStr = getReturnTousseDetailGridData(true); - if(!returnTousseItemStr){ + var returnTousseItems = getReturnTousseDetailGridData2(); + + if(returnTousseItems.length == 0){ showResult('退货详细信息列表不能为空'); return false; } + var returnTousseItemStr = top.Ext.encode(returnTousseItems); top.Ext.getCmp('returnTousseItemStr').setValue(returnTousseItemStr); /*top.Ext.getCmp('returnOfPeople').setDisabled(false); top.Ext.getCmp('depart').setDisabled(false);*/ @@ -2329,7 +2331,34 @@ }); return returnTousseItemStr; } +// 返回json格式 +function getReturnTousseDetailGridData2() { + var rootNode = top.Ext.getCmp('returnGoodsColumnTree').getRootNode(); + var tousses = []; + rootNode.eachChild(function(tousseNode) { + var tousse = {}; + top.Ext.apply(tousse,tousseNode.attributes); + tousses.push(tousse); + + tousse.tousses = getChildNodesInfo(tousseNode); + }); + return tousses; +} +function getChildNodesInfo(pNode){ + var childNodes = []; + if(pNode.isLeaf()){ + return childNodes; + }else{ + pNode.eachChild(function(tousseNode) { + var tousse = {}; + top.Ext.apply(tousse,tousseNode.attributes.tousseInstance); + childNodes.push(tousse); + }); + } + return childNodes; +} + //把器械包添加到tree中 function addScanningTousseItemToTree(tousseInstance){ var barcode = tousseInstance.barcode; Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java =================================================================== diff -u -r25145 -r25251 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 25145) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 25251) @@ -4,9 +4,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -22,6 +20,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; @@ -41,12 +40,9 @@ import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; -import com.forgon.disinfectsystem.entity.assestmanagement.TousseStock; -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.basedatamanager.warehouse.WareHouse; -import com.forgon.disinfectsystem.entity.departmentstock.DepartmentStock; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; @@ -64,6 +60,7 @@ import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceManager; import com.forgon.disinfectsystem.packing.service.PackingManager; +import com.forgon.disinfectsystem.recyclingapplication.service.InvoicePlanManager; import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationManager; import com.forgon.disinfectsystem.stockmanage.cssdstock.service.TousseStockManager; import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; @@ -133,6 +130,9 @@ private InvoiceManager invoiceManager; + @Autowired + private InvoicePlanManager invoicePlanManager; + public void setDbConnection(InitDbConnection dbConnection) { this.dbConnection = dbConnection; } @@ -873,7 +873,7 @@ } returnGoodsRecord.setSettlementPrice(settlementPriceOfRecord); // 创建发货单 - createInvoicePlan(returnGoodsRecord,idToDisposableGoodsMap); + createInvoicePlan(returnGoodsRecord,idToDisposableGoodsMap,null); updateInvoicePlan(invoicePlanId); @@ -932,49 +932,54 @@ // 先保存一次,若重装,装配任务需记下退货记录Id saveOrUpdate(returnGoodsRecord); + Set foreignTousseReturnGoodsItems = new HashSet(); + List foreignTousseInstanceList = new LinkedList(); for (ReturnGoodsItem newItem : returnGoodsRecord.getReturnGoodsItems()) { TousseDefinition tousseDefinition = newItem.getTousseDefinition(); if (tousseDefinition == null) { throw new RuntimeException(String.format("未找到%s的包定义!", newItem.getTousseName())); } + if(tousseDefinition.isForeignOrSplitTousse()){ + foreignTousseReturnGoodsItems.add(newItem); + } // 如果是消毒物品,要重新创建包定义 if(tousseDefinition.isDisinfection()){ TousseDefinition newTousseDefinition = tousseDefinitionManager.newDisinfectGoodsDefinitionWithoutInvoicePlanId(tousseDefinition); newItem.setTousseDefinition(newTousseDefinition); } - if (newItem.isRepacking()) { + if (newItem.isRepacking() && !tousseDefinition.isForeignOrSplitTousse()) { // 更新待装配数量 createPackingTaskForRepacking(returnGoodsRecord, newItem); } - // 更新器械包库存 - updataTousseStockWithAmount(newItem.getTousseName(), - newItem.getAmount()); - // 修改器械包实例状态,要根据是否重装来改变状态,重装改为已废弃,否则改为已灭菌 List tousseInstanceList = newItem .getTousseInstanceList(); if (tousseInstanceList != null) { + for (TousseInstance tousseInstance : tousseInstanceList) { TousseDefinition td = tousseInstance.getTousseDefinition(); if(td == null){ throw new RuntimeException(String.format( "器械包 %s[%s]的包定义已被删除,不能退货!:",tousseInstance.getTousseName(), tousseInstance.getBarcode())); } + if (tousseInstance.isShipped() || tousseInstance.isSigned() || TousseInstance.STATUS_STERILED .equals(tousseInstance.getStatus())) { - if (newItem.isRepacking()) { + if(td.isForeignOrSplitTousse()){ + // 外来器械特殊处理 + foreignTousseInstanceList.add(tousseInstance); + }else if (newItem.isRepacking()) { tousseInstanceManager.discardTousseInstance(tousseInstance, "退货重装"); } else { if(td.isDisinfection()){ tousseInstance.setStatus(TousseInstance.STATUS_DISINFECTED); }else{ tousseInstance.setStatus(TousseInstance.STATUS_STERILED); } - } tousseInstanceManager.save(tousseInstance); } else { @@ -984,14 +989,19 @@ tousseInstance.getStatus())); } } + } //更新仓库库存,并设置器械包的仓库信息 updateTousseInstanceGoodsStock(newItem); - minusDepartmentStock(returnGoodsRecord, newItem); } + if(DatabaseUtil.isPoIdValid(invoicePlanId) && CollectionUtils.isNotEmpty(foreignTousseInstanceList)){ + throw new RuntimeException("暂不支持从申请单退货外来器械!"); + } + // 外来器械处理 + returnForeignTousse(foreignTousseInstanceList); // 创建发货计划单 - createInvoicePlan(returnGoodsRecord,null); + createInvoicePlan(returnGoodsRecord,null,foreignTousseReturnGoodsItems); updateInvoicePlan(invoicePlanId); saveOrUpdate(returnGoodsRecord); @@ -1000,20 +1010,134 @@ writeBackInventoryHelper.writeBackForReturnGoods( Collections.singleton(returnGoodsRecord.getId()), true); } - if(true){ +// if(true){ // throw new RuntimeException("速度测试!"); - } +// } return buildSuccessMsgJsonResult(); } + + private void returnForeignTousse( + List foreignTousseInstanceList) { + if (CollectionUtils.isEmpty(foreignTousseInstanceList)) { + return; + } + Set tdIds = new HashSet(); + for (TousseInstance tousseInstance : foreignTousseInstanceList) { + TousseDefinition td = tousseInstance.getTousseDefinition(); + Long tdId = null; + if (td.isSplit()) { + tdId = td.getParentID(); + } else { + tdId = td.getId(); + } + if (tdId == null) { + throw new RuntimeException("包定义id不能为空!"); + } + tdIds.add(tdId); + } + // 查找申请单 + String hql = String + .format("select distinct po from %s po inner join fetch po.applicationItems it where %s ", + InvoicePlan.class.getSimpleName(), SqlUtils + .getNonStringFieldInLargeCollectionsPredicate( + "it.tousseDefinitionId", tdIds)); + List invoicePlanList = objectDao.findByHql(hql); + if (CollectionUtils.isEmpty(invoicePlanList)) { + throw new RuntimeException("申请单已被删除!"); + } + Map map = new HashMap(); + // 校验申请单状态 + for (InvoicePlan invoicePlan : invoicePlanList) { + List applicationItems = invoicePlan.getApplicationItems(); + if(CollectionUtils.isNotEmpty(applicationItems)){ + for (TousseItem tousseItem : applicationItems) { + Long tousseDefinitionId = tousseItem.getTousseDefinitionId(); + + if(tdIds.contains(tousseDefinitionId)){ + map.put(tousseDefinitionId, invoicePlan); + + Integer sendOutAmount = tousseItem.getSendOutAmount(); + if(sendOutAmount == null || sendOutAmount < 1){ + throw new RuntimeException(String.format("外来器械 %s必须为完全发货!", tousseItem.getTousseName())); + } + } + } + } + } + // 更新状态 + for (TousseInstance tousseInstance : foreignTousseInstanceList) { + TousseDefinition td = tousseInstance.getTousseDefinition(); + Long tdId = null; + if (td.isSplit()) { + tdId = td.getParentID(); + } else { + tdId = td.getId(); + } + if(!map.containsKey(tdId)){ + throw new RuntimeException(String.format("未找到%s的申请单!", td.getName())); + } + tousseInstance.setStatus(TousseInstance.STATUS_STERILED); + // 清除发货信息 + tousseInstance.setInvoice2_id(null); + tousseInstance.setLocation_2(null); + tousseInstance.setLocationForDisplay2(null); + tousseInstance.setSettleAccountsDepart2(null); + tousseInstance.setSettleAccountsDepartCode2(null); + tousseInstance.setInvoiceSender2(null); + tousseInstance.setInvoiceSendTime2(null); + + tousseInstance.setInvoice_id(null); + tousseInstance.setLocation(null); + tousseInstance.setLocationForDisplay(null); + tousseInstance.setSettleAccountsDepart(null); + tousseInstance.setSettleAccountsDepartCode(null); + tousseInstance.setInvoiceSender(null); + tousseInstance.setInvoiceSendTime(null); + // + tousseInstanceManager.save(tousseInstance); + } + + for (InvoicePlan invoicePlan : invoicePlanList) { + List applicationItems = invoicePlan.getApplicationItems(); + if(CollectionUtils.isNotEmpty(applicationItems)){ + for (TousseItem tousseItem : applicationItems) { + Long tousseDefinitionId = tousseItem.getTousseDefinitionId(); + + if(tdIds.contains(tousseDefinitionId)){ + // 校验是否全部退货 + String sql = String.format("where (po.tousseDefinition.id = %s or po.tousseDefinition.parentID = %s) and po.wasteDate is null and po.insteadTiBarcode is null ", tousseDefinitionId,tousseDefinitionId); + List tousseInstanceList = objectDao.findBySql( + TousseInstance.class.getSimpleName(), sql); + if(CollectionUtils.isNotEmpty(applicationItems)){ + for (TousseInstance tousseInstance : tousseInstanceList) { + if(!tousseInstance.isSteriled()){ + throw new RuntimeException("外来器械不允许部分退货!"); + } + } + } + + tousseItem.setSendOutAmount(0);// 待发货 + objectDao.update(tousseItem); + } + } + } + invoicePlanManager.computeAndSetInvoiceStatus(invoicePlan); + objectDao.update(invoicePlan); + + } + } - private boolean createInvoicePlan(ReturnGoodsRecord returnGoodsRecord,Map idToDisposableGoodsMap){ + private boolean createInvoicePlan(ReturnGoodsRecord returnGoodsRecord,Map idToDisposableGoodsMap,Set foreignTousseReturnGoodsItems){ RecyclingApplication recyclingApplication = new RecyclingApplication(); // 生成发货单明细 List tousseItems = new ArrayList(); recyclingApplication.setApplicationItems(tousseItems); BigDecimal disposableGoodsFluctuation = supplyRoomConfigManager.getDisposableGoodsFluctuationByOrgUnitCoding(returnGoodsRecord.getDepartCoding()); for(ReturnGoodsItem returnGoodsItem : returnGoodsRecord.getReturnGoodsItems()){ + if(foreignTousseReturnGoodsItems != null && foreignTousseReturnGoodsItems.contains(returnGoodsItem)){ + continue; + } if (!"是".equals(returnGoodsItem.getIsDelivery())) continue; @@ -1192,84 +1316,6 @@ return true; } - // 减库存 - private void minusDepartmentStock(ReturnGoodsRecord returnGoodsRecord, - ReturnGoodsItem returnGoodsItem) { - if (returnGoodsItem.getTousseDefinition() == null) - return; - String tousseType = returnGoodsItem.getTousseDefinition() - .getTousseType(); - if (!TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) - return; - DepartmentStock departmentStock = departmentStockManager - .getByDepartCodingAndTousseName( - returnGoodsRecord.getDepartCoding(), - returnGoodsItem.getTousseName()); - - if (departmentStock != null) { - // 库存非负数验证 - if (departmentStock.getAmount() >= returnGoodsItem - .getAmount()) { - departmentStock.setAmount(departmentStock.getAmount() - - returnGoodsItem.getAmount()); - - // 若退货时是扫器械包条码的,则把这些器械包从科室库存中移除 - // 否则,从科室库存中移除装配时间最早的器械包 - Collection returnTousseInstances = returnGoodsItem.getTousseInstanceList(); - Collection tousseInstancesOfRemoveFromDepartmentStock; - if(CollectionUtils.isNotEmpty(returnTousseInstances)){ - tousseInstancesOfRemoveFromDepartmentStock = returnTousseInstances; - } else { - List tousseInstances = departmentStock - .getTousseInstances(objectDao); - Collections.sort(tousseInstances, new Comparator(){ - @Override - public int compare(TousseInstance o1, TousseInstance o2) { - return o1.getOperationTime().compareTo(o2.getOperationTime()); - } - }); - int size = Math.min(returnGoodsItem.getAmount(), tousseInstances.size()); - tousseInstancesOfRemoveFromDepartmentStock = tousseInstances.subList(0, size); - } - for(TousseInstance tousseInstance : tousseInstancesOfRemoveFromDepartmentStock){ - tousseInstance.setDepartmentStock_id(null); - } - - } else { - departmentStock.setAmount(0); - } - departmentStockManager.saveOrUpdata(departmentStock); - - // 添加供应时器械包库存的管理 - SupplyRoomConfig firstSupplyRoom = supplyRoomConfigManager - .getFirstSupplyRoomConfig(); - DepartmentStock supplyRoomStock = null; - if (firstSupplyRoom != null) { - supplyRoomStock = departmentStockManager - .getByDepartCodingAndTousseName( - firstSupplyRoom.getOrgUnitCoding(), - returnGoodsItem.getTousseName()); - } - - if (supplyRoomStock != null) { - supplyRoomStock.setAmount(supplyRoomStock.getAmount() - + returnGoodsItem.getAmount()); - } else { - supplyRoomStock = new DepartmentStock(); - supplyRoomStock.setAmount(returnGoodsItem.getAmount()); - supplyRoomStock.setCardinalNum(0); - supplyRoomStock.setDepartCoding(firstSupplyRoom - .getOrgUnitCoding()); - supplyRoomStock.setDepartName(firstSupplyRoom - .getOrgUnitName()); - supplyRoomStock.setTousseName(returnGoodsItem - .getTousseName()); - supplyRoomStock.setUsedAmount(0); - } - departmentStockManager.saveOrUpdata(supplyRoomStock); - } - } - /** * 更新退货记录中器械包的库存并更新器械包的仓库信息,如果是重装,则只减当前库存,如果是重发,则减当前库存后还要更新供应室的库存 * @param returnGoodsItem @@ -1338,43 +1384,7 @@ } } - /** - * 更新器械包库存 - * - * @param tousseName - * @param amount - * @throws Exception - */ - private void updataTousseStockWithAmount(String tousseName, Integer amount) { - if (amount == 0) - return; - TousseStock tousseStock = tousseStockManager - .getTousseStockByTousseName(tousseName); - if (tousseStock == null) { - tousseStock = new TousseStock(); - tousseStock.setTousseName(tousseName); - tousseStock.setTousseAmount(amount); - tousseStock.setStockAmount(amount); - } else { - tousseStock.setTousseAmount(tousseStock.getTousseAmount() + amount);// 增加或减少器械包库存 - if (tousseStock.getTousseAmount() > tousseStock.getStockAmount()) { - tousseStock.setStockAmount(tousseStock.getTousseAmount()); - } - } - // 判断当前器械包的库存 - if (tousseStock.getTousseAmount() < 0){ - String warningMsg = "器械包【" + tousseStock.getTousseName() - + "】的库存不足!"; - logger.warn(warningMsg); - // 不抛出异常,避免退货不成功 - //throw new RuntimeException(warningMsg); - } - - tousseStockManager.saveOrUpdateTousseStock(tousseStock); - - } - /** * 更新或生成待装配任务 * Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java =================================================================== diff -u -r23747 -r25251 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 23747) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 25251) @@ -311,9 +311,9 @@ if (!TousseDefinition.PACKAGE_TYPE_INSIDE .equals(tousseType) && !TousseDefinition.PACKAGE_TYPE_DRESSING .equals(tousseType) && !TousseDefinition.PACKAGE_TYPE_DISINFECTION - .equals(tousseType)) { + .equals(tousseType) && !tousseDefinition.isForeignOrSplitTousse()) { // 验证器械包类型 - throw new RuntimeException("只能退货普通器械包或敷料包或消毒物品"); + throw new RuntimeException("只能退货普通器械包或敷料包或消毒物品或外来器械"); } if (TousseInstance.STATUS_RETURNED .equals(tousseInstance.getStatus())) { @@ -629,6 +629,34 @@ return null; } + private TousseDefinition getTousseDefinition(JSONObject returnTousseItemData){ + JSONArray tousses = returnTousseItemData.getJSONArray("tousses"); + for(int t=0;t tousseInstances = new ArrayList(); int tousseAmount = 0; - if (len >= 7) { - - for (int k = 6; k < len; k++) { - tousseInstances - .add(tousseInstanceManager - .getTousseInstanceByBarcode(returnTousseItemDetailArr[k])); - } - returnTousseItem.setTousseInstanceList(tousseInstances); - tousseAmount = tousseInstances.size(); + JSONArray tousses = returnTousseItemData.getJSONArray("tousses"); + for(int t=0;t currentAmount){ throw new RuntimeException("参数错误"); }