Index: ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js =================================================================== diff -u -r14519 -r14559 --- ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js (.../packingView.js) (revision 14519) +++ ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js (.../packingView.js) (revision 14559) @@ -593,7 +593,7 @@ } } // 刷新waitPackingTreeGrid - reflushWaitPackingTreeGrid(); + Ext4.getCmp('waitPackingTreeGrid').getStore().reload(); } }, failure : function(response, options) { @@ -1018,11 +1018,15 @@ var amount = taskItemArray[i].amount; Ext4.Array.each(taskNodes,function(cNode){ if(cNode.get('taskId') == taskId){ - if(amount < cNode.get('amount')){ - cNode.set('amount',cNode.get('amount') - amount); - }else{ - var len = delNodes.length; - delNodes[len] = cNode; + var errors = cNode.get('errors'); + var damages = cNode.get("damages"); + if((errors == null || errors.length == 0) && (damages == null || damages.length == 0)){ + if(amount < cNode.get('amount')){ + cNode.set('amount',cNode.get('amount') - amount); + }else{ + var len = delNodes.length; + delNodes[len] = cNode; + } } } }); @@ -2492,6 +2496,9 @@ newParentNode = true; } var cLength = taskVO.children.length; + + var childNodes = parentNode.childNodes; + var childNodeLength = childNodes.length; for (var j = 0; j < cLength; j++) { var task = taskVO.children[j]; var taskId = task.taskId; @@ -2513,19 +2520,18 @@ var taskType = task.taskType; var supplierName = task.supplierName; var sigle = true; - var childNodes = parentNode.childNodes; speakBasket.addGoods(basketName, tousseName, amount); - for (var m = 0; m < childNodes.length; m++) { + for (var m = 0; m < childNodeLength; m++) { var cNode = childNodes[m]; if(cNode.get('taskId') == taskId){ sigle = false; - return; + break; } } if(sigle){ var childNode = addTaskNode(taskId,td_id,videoNames,tousseName,amount,washTime,basketBarcode,basketName, - taskStatus,department,tousseType, packageType, - sterilingMethod,dateTime,isTraceable,isPrint,isReview,errors,damages,replenishMaterils,taskType,supplierName,task.haveIDCard,childUrgentAmount); + taskStatus,department,tousseType, packageType,sterilingMethod,dateTime,isTraceable,isPrint,isReview, + errors,damages,replenishMaterils,taskType,supplierName,task.haveIDCard,childUrgentAmount); parentNode.appendChild(childNode); var pNewAmount = parentNode.get('amount') + amount; parentNode.set('amount',pNewAmount); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r14438 -r14559 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 14438) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 14559) @@ -105,6 +105,7 @@ import com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.service.WashAndDisinfectRecordManager; import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; +import com.forgon.reflect.ReflectUtil; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.systemsetting.model.HttpOption; @@ -1105,6 +1106,7 @@ vo.setAdditionalAmount(additionalAmount); vo.setDepartCodeForId(departCodeForId); vo.setLostIDCardInstanceBarcode(lostIDCardInstanceBarcode); + vo.setMaterialDefinitionId(rs.getLong("materialDefinitionId")); List errors = map.get(packingTaskId); if(errors == null){ errors = new ArrayList(); @@ -1132,7 +1134,7 @@ * @return */ private Map> loadWaitSupplementRecyclingDamages(){ - String sql = "select packingTask_ID,id,materialName,amount,additionalAmount from RecyclingDamageItem po " + String sql = "select packingTask_ID,id,materialName,amount,additionalAmount,materialDefinitionId from RecyclingDamageItem po " + "where po.packingTask_ID is not null and po.amount != po.additionalAmount"; ResultSet rs = objectDao.executeSql(sql); Map> map = new HashMap>(); @@ -1148,6 +1150,7 @@ vo.setId(id); vo.setAmount(amount - (additionalAmount == null ? 0 : additionalAmount)); vo.setMaterialName(materialName); + vo.setMaterialDefinitionId(rs.getLong(6)); List damages = map.get(packingTaskId); if(damages == null){ damages = new ArrayList(); @@ -1225,6 +1228,7 @@ Map> errorsMap = loadWaitSupplementRecyclingErrors(); Map> damagesMap = loadWaitSupplementRecyclingDamages(); + TimeoutSetting timeoutSetting = timeoutManager.getTimeoutSetting(TimeoutManager.PROCEDURE_WASH_TO_PACKING); for (Object[] result : taskList) { @@ -1321,6 +1325,20 @@ vo.setReplenishMaterils(true); itemVo.getDamages().addAll(damages); } + //丢失、报损未补充可装配数量 + Integer unPackingAmount = getWaitSupplementTousseAmount(itemVo.getErrors(),itemVo.getDamages(),task.getStatus(),td.getId()); + if(unPackingAmount > 0 && unPackingAmount < itemVo.getAmount()){ + Integer canPackingAmount = itemVo.getAmount() - unPackingAmount; + itemVo.setAmount(unPackingAmount); + WaitPackingTaskItemVo newItemVo = new WaitPackingTaskItemVo(); + List listProNotToCopy = new ArrayList(); + listProNotToCopy.add("errors"); + listProNotToCopy.add("damages"); + listProNotToCopy.add("replenishMaterils"); + ReflectUtil.copyProperties(itemVo, newItemVo, true, listProNotToCopy); + newItemVo.setAmount(canPackingAmount); + childrens.add(newItemVo); + } } } Iterator itr = taskMap.keySet().iterator(); @@ -1332,6 +1350,80 @@ } /** + * 获取待补充材料所包含的器械包数量 + * @param recyclingErrors + * @param damages + * @param status + * @param tousseDefinitionIds + * @return + */ + private Integer getWaitSupplementTousseAmount(List recyclingErrors,List damages,String status,Long tousseDefinitionIds){ + if(PackingTask.STATUS_AWAIT_PACKING.equals(status)){ + Map materialMap = new HashMap(); + if(recyclingErrors != null){ + for (RecyclingError error : recyclingErrors) { + if("器械包标识牌".equals(error.getMaterialName())){ + continue; + } + Long materialId = error.getMaterialDefinitionId(); + Integer amount = materialMap.get(materialId); + if(amount == null){ + amount = 0; + } + materialMap.put(materialId, amount + (error.getAmount() - error.getAdditionalAmount())); + } + } + if(damages != null){ + for (RecyclingDamageItem damageItem : damages) { + Long materialId = damageItem.getMaterialDefinitionId(); + Integer amount = materialMap.get(materialId); + if(amount == null){ + amount = 0; + } + materialMap.put(materialId, amount + (damageItem.getAmount() - damageItem.getAdditionalAmount())); + } + } + if(materialMap.size() > 0){ + return getMaxUnPackingAmount(tousseDefinitionIds,materialMap); + } + } + return 0; + } + + private Integer getMaxUnPackingAmount(Long toussedefintionId,Map map){ + + TousseDefinition td = tousseDefinitionManager.getTousseDefinitionById(toussedefintionId); + if(td == null){ + return 0; + } + Integer maxAmount = 0; + + Set mdIDset = map.keySet(); + + List materialInstances = td.getMaterialInstances(); + + for (Long materialDefinitionID : mdIDset) { + if(materialInstances != null){ + for (MaterialInstance ms : materialInstances) { + if(ms.getMaterialDefinition() != null){ + if(materialDefinitionID.toString().equals(ms.getMaterialDefinition().getId().toString())){ + if(ms.getCount() > 0){ + Integer tousseAmount = MathTools.divide(map.get(materialDefinitionID), ms.getCount()); + if(maxAmount < tousseAmount){ + maxAmount = tousseAmount; + } + } + break; + } + } + } + } + } + return maxAmount; + } + + + /** * 查询待装配装配任务集合(v4.0代码旧的方法,按包定义的任务组查询) * @param taskGroup * @param basketBarcode @@ -3448,7 +3540,16 @@ int alreadyPackedAmount = 0; PackingTask prePackingTask = null;//定义当前装配任务的变量,将某个预装配的器械包实例与某个装配任务关联 for(PackingTask packingTask : packingTaskList){ - alreadyPackedAmount += packingTask.getUnPackAmount(); + + Integer unPackingAmount = packingTask.getWaitSupplementTousseAmount(); + if(unPackingAmount == null){ + List errors = packingTask.findRecyclingErrors(objectDao); + List damage = packingTask.findRecyclingDamages(objectDao); + unPackingAmount = getWaitSupplementTousseAmount(errors,damage,packingTask.getStatus(),packingTask.getTousseDefinition().getId()); + } + packingTask.setWaitSupplementTousseAmount(unPackingAmount); + + alreadyPackedAmount += (packingTask.getUnPackAmount() - unPackingAmount); if(i < alreadyPackedAmount){ prePackingTask = packingTask; break; @@ -3638,11 +3739,26 @@ int leftAmount = currentPackAmount; Map map = new HashMap(); for(PackingTask packingTask : packingTaskList){ - if(leftAmount >= packingTask.getUnPackAmount()){ - leftAmount -= packingTask.getUnPackAmount(); - delete(packingTask); - if(StringUtils.isNotBlank(packingTask.getBasketBarcode())){ - map.put(packingTask.getBasketBarcode(), packingTask.getBasketBarcode()); + Integer unPackAmount = packingTask.getUnPackAmount(); + + Integer waitSupplementTousseAmount = packingTask.getWaitSupplementTousseAmount(); + if(waitSupplementTousseAmount != null){ + unPackAmount -= waitSupplementTousseAmount; + } + if(unPackAmount < 0){ + throw new RuntimeException("保存失败!"); + } + if(leftAmount >= unPackAmount){ + leftAmount -= unPackAmount; + //待补充数量 + if(waitSupplementTousseAmount == null || waitSupplementTousseAmount == 0){ + delete(packingTask); + if(StringUtils.isNotBlank(packingTask.getBasketBarcode())){ + map.put(packingTask.getBasketBarcode(), packingTask.getBasketBarcode()); + } + }else{ + packingTask.setUnPackAmount(packingTask.getUnPackAmount() - unPackAmount); + saveOrUpdate(packingTask); } }else{ // 修改待装配数量 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/packing/PackingTask.java =================================================================== diff -u -r14423 -r14559 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/packing/PackingTask.java (.../PackingTask.java) (revision 14423) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/packing/PackingTask.java (.../PackingTask.java) (revision 14559) @@ -53,11 +53,13 @@ private Integer uncofirmedAmount = 0; // 没有确认的器械包的数量 + private Integer waitSupplementTousseAmount;//待补充器械包数量(不持久化到数据库) + private Integer urgentAmount;// 加急数量 private String orgUnitCoding; - private Integer unPackAmount; + private Integer unPackAmount;//未装配数量 private Date supplementTime; @@ -237,5 +239,14 @@ public void setUrgentAmount(Integer urgentAmount) { this.urgentAmount = urgentAmount; } + + @Transient + public Integer getWaitSupplementTousseAmount() { + return waitSupplementTousseAmount; + } + + public void setWaitSupplementTousseAmount(Integer waitSupplementTousseAmount) { + this.waitSupplementTousseAmount = waitSupplementTousseAmount; + } } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java =================================================================== diff -u -r14525 -r14559 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 14525) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 14559) @@ -53,7 +53,6 @@ import com.forgon.security.service.OperationManager; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; -import com.forgon.tools.FileSystemHelper; import com.forgon.tools.ImageUtils; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils;