Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingContext.java =================================================================== diff -u -r37811 -r37854 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingContext.java (.../RecyclingContext.java) (revision 37811) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingContext.java (.../RecyclingContext.java) (revision 37854) @@ -178,6 +178,10 @@ * 是否继续回收回收数量小于发货数量的物品 */ private String continueRecycleItemsthatLessThanSendAmount; + /** + * 是否新建的回收记录 + */ + private Boolean newRecyclingRecord; public String getJsonParam() { return jsonParam; } @@ -534,5 +538,11 @@ Boolean foreignTousseInvoicedAndNoUse) { this.foreignTousseInvoicedAndNoUse = foreignTousseInvoicedAndNoUse; } + public Boolean getNewRecyclingRecord() { + return newRecyclingRecord; + } + public void setNewRecyclingRecord(Boolean newRecyclingRecord) { + this.newRecyclingRecord = newRecyclingRecord; + } } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManager.java =================================================================== diff -u -r20422 -r37854 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManager.java (.../ClassifyBasketRecyclingSequenceManager.java) (revision 20422) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManager.java (.../ClassifyBasketRecyclingSequenceManager.java) (revision 37854) @@ -13,8 +13,9 @@ * @param classifyBasketId * @param tousseDefinitionId * @param order + * @param newRecyclingRecord 是否新建的回收记录 如果是则不需要先查询 */ - public void save(Long recyclingRecordId,Long classifyBasketId,Long tousseDefinitionId,Integer order); + public void save(Long recyclingRecordId,Long classifyBasketId,Long tousseDefinitionId,Integer order, boolean newRecyclingRecord); /** * 获取对象 * @param recyclingRecordId Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManagerImpl.java =================================================================== diff -u -r20422 -r37854 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManagerImpl.java (.../ClassifyBasketRecyclingSequenceManagerImpl.java) (revision 20422) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/ClassifyBasketRecyclingSequenceManagerImpl.java (.../ClassifyBasketRecyclingSequenceManagerImpl.java) (revision 37854) @@ -15,13 +15,16 @@ implements ClassifyBasketRecyclingSequenceManager { @Override - public void save(Long recyclingRecordId,Long classifyBasketId,Long tousseDefinitionId,Integer sequence) { + public void save(Long recyclingRecordId,Long classifyBasketId,Long tousseDefinitionId,Integer sequence, boolean newRecyclingRecord) { if(!DatabaseUtil.isPoIdValid(recyclingRecordId) || !DatabaseUtil.isPoIdValid(classifyBasketId) || !DatabaseUtil.isPoIdValid(tousseDefinitionId)){ return; } - RecyclingBasketSequence cbro = getForUpdate(recyclingRecordId,classifyBasketId,tousseDefinitionId); + RecyclingBasketSequence cbro = null; + if(!newRecyclingRecord){ + cbro = getForUpdate(recyclingRecordId,classifyBasketId,tousseDefinitionId); + } if(sequence != null && sequence > 0){ if(cbro == null){ cbro = new RecyclingBasketSequence(); Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java =================================================================== diff -u -r36548 -r37854 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 36548) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 37854) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.recyclingrecord.vo; import java.util.List; +import java.util.Map; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -16,12 +17,21 @@ */ private List tousseDefinitions; - + private Map haveErrorOrDamageInfo; public List getTousseDefinitions() { return tousseDefinitions; } public void setTousseDefinitions(List tousseDefinitions) { this.tousseDefinitions = tousseDefinitions; } + + public Map getHaveErrorOrDamageInfo() { + return haveErrorOrDamageInfo; + } + + public void setHaveErrorOrDamageInfo(Map haveErrorOrDamageInfo) { + this.haveErrorOrDamageInfo = haveErrorOrDamageInfo; + } + } Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r37811 -r37854 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 37811) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 37854) @@ -1095,8 +1095,21 @@ } } Map>> map = new HashMap>>(); + Set miIds = new HashSet();//材料实例的id 用于查询 for (int i = 0; i < tousseJson.size(); i++) { RecyclingBasketItemVo basketItemVo = tousseJson.get(i); + if(!basketItemVo.itemTypeMaterial()){ + TousseDefinition td = IDOperators.find(tds, basketItemVo.getTousseDefinitionID()); + if(td != null){ + for(MaterialInstance mi : td.getMaterialInstances()){ + miIds.add(mi.getId()); + } + } + } + } + Map materialNameMap = getMaterialName(miIds); + for (int i = 0; i < tousseJson.size(); i++) { + RecyclingBasketItemVo basketItemVo = tousseJson.get(i); String tousseName = basketItemVo.getTousseName(); Integer amount = basketItemVo.getAmount(); /** @@ -1174,7 +1187,7 @@ TousseDefinition td = IDOperators.find(tds, basketItemVo.getTousseDefinitionID()); if(td != null){ for(MaterialInstance mi : td.getMaterialInstances()){ - setUnCleanedEntirelyTousseMaterials(basketItemVo,CssdUtils.getMaterialName(mi.getMaterialDefinition()), + setUnCleanedEntirelyTousseMaterials(basketItemVo,materialNameMap.get(mi.getId()), MathTools.mul(basketItemVo.getAmount(), mi.getCount()).intValue()); } } @@ -1189,7 +1202,37 @@ } return list; } - + /** + * 查询材料的名称规格 + * @param miIds 材料id + * @return + */ + private Map getMaterialName(Set miIds){ + Map materialNameMap = new HashMap(); + if(CollectionUtils.isEmpty(miIds)){ + return materialNameMap; + } + String sql = " select mi.id,md.name,md.specification from "+ MaterialInstance.class.getSimpleName() +" mi " + + " join "+ MaterialDefinition.class.getSimpleName() +" md on md.id=mi.materialDefinition_id " + + " where 1=1 " + SqlUtils.getInLongListSql("mi.id", miIds); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while (rs.next()){ + String name = rs.getString(2); + String specification = rs.getString(3); + if (StringUtils.isNotBlank(specification)) { + name += "[" + specification + "]"; + } + materialNameMap.put(rs.getLong(1), name); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return materialNameMap; + } private void setUnCleanedEntirelyTousseMaterials(RecyclingBasketItemVo jsonObj, String materialName, Integer amount) { //器械包包含的材料 @@ -1243,8 +1286,8 @@ private void setClassifyBaskets(List tousseJson, List tousseDefinitions, RecyclingRecord record, Map containerMap,boolean isSecondRecycleForForeignTousse, - Map toReSetWorkloadMap,JSONArray tousseIntoBasketInfo, JSONArray basketSizeArr) { - + Map toReSetWorkloadMap,JSONArray tousseIntoBasketInfo, JSONArray basketSizeArr + ,RecyclingContext recyclingContext) { List baskets = record.getClassifyBaskets(); if(baskets == null){ baskets = new ArrayList(); @@ -1346,7 +1389,7 @@ classifiedItemManager.delete(item); } //删除对应的篮筐序号 - classifyBasketRecyclingSequenceManager.save(record.getId(), classifyBasket.getId(), tousseDefinitionID, null); + classifyBasketRecyclingSequenceManager.save(record.getId(), classifyBasket.getId(), tousseDefinitionID, null, recyclingContext.getNewRecyclingRecord()); continue; } tousseIntoBasketService.canAddThisBasketItem(classifyBasket.getContainerBarcode(), tousseDefinition,isSecondRecycleForForeignTousse); @@ -1425,7 +1468,7 @@ if(cb == null){ baskets.add(classifyBasket); } - classifyBasketRecyclingSequenceManager.save(record.getId(), classifyBasket.getId(), tousseDefinitionID, basketItemVo.getBasketSequence()); + classifyBasketRecyclingSequenceManager.save(record.getId(), classifyBasket.getId(), tousseDefinitionID, basketItemVo.getBasketSequence(), recyclingContext.getNewRecyclingRecord()); } //修改篮筐状态 for(Entry entry : basketBarcodeMap.entrySet()){ @@ -1831,6 +1874,25 @@ } } } + /** + * 设置原回收记录的物品 是否有丢失报损 主要是用于设置了丢失报损 又改为没有丢失报损 需要修改对应的装配任务状态的问题 + * @param record + * @param recyclingSumInfoVo + */ + private void setHaveErrorOrDamageInfo(RecyclingRecord record, RecyclingSumInfoVo recyclingSumInfoVo){ + Map haveErrorOrDamageInfo = new HashMap(); + if(record != null && DatabaseUtil.isPoIdValid(record.getId()) && CollectionUtils.isNotEmpty(record.getItems())){ + for (RecyclingItem item : record.getItems()) { + boolean haveErrorOrDamage = false; + if(CollectionUtils.isNotEmpty(item.getErrorDamageDetails())){ + haveErrorOrDamage = true; + } + haveErrorOrDamageInfo.put(item.getId(), haveErrorOrDamage); + } + } + recyclingSumInfoVo.setHaveErrorOrDamageInfo(haveErrorOrDamageInfo); + + } @Override @Activity(name = AmountControl.RECYCLING) public void save(RecyclingRecord record, RecyclingContext recyclingContext) { @@ -1841,7 +1903,12 @@ throw new RuntimeException("该回收记录已被修改,请刷新后再操作!"); } RecyclingSumInfoVo recyclingSumInfoVo = new RecyclingSumInfoVo(); - + setHaveErrorOrDamageInfo(record, recyclingSumInfoVo); + if(!DatabaseUtil.isPoIdValid(record.getId())){ + recyclingContext.setNewRecyclingRecord(true); + }else{ + recyclingContext.setNewRecyclingRecord(false); + } //放入篮筐的物品 List basketItemJson = JSONUtil.fromJson(params.optJSONArray("tousseJson"), RecyclingBasketItemVo.class) ; //校验点击清点确认按钮时,篮筐中的物品 @@ -1910,7 +1977,6 @@ + TousseDefinition.class.getSimpleName() + " po left join fetch po.materialInstances where " +SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", tousseDefIds)); - tousseDefinitionManager.initTousseGoods(tousseDefinitions); //验证回收时的包定义 verifyTousseAtRecycling(record, tousseDefIds,recyclingContext); Map containerMap = new HashMap(); @@ -1964,7 +2030,6 @@ + TousseDefinition.class.getSimpleName() + " po left join fetch po.materialInstances where " +SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", tousseDefIds)); - tousseDefinitionManager.initTousseGoods(tousseDefinitions); //申请还物单的id List borrowRecyclingApplicationIds = returnGoodsVo.getNewBorrowingRecyclingApplicationIds(); if(CollectionUtils.isNotEmpty(borrowRecyclingApplicationIds)){ @@ -2070,7 +2135,7 @@ //修改已清洗或清洗中的篮筐,清洗工作量需要重新计算 Map toReSetWorkloadMap = new HashMap(); //设置篮筐及篮筐内物品 - setClassifyBaskets(basketItemJson,tousseDefinitions,record,containerMap,isSecondRecycleForForeignTousse,toReSetWorkloadMap,recyclingContext.getTousseIntoBasketInfo(),basketSizeArr); + setClassifyBaskets(basketItemJson,tousseDefinitions,record,containerMap,isSecondRecycleForForeignTousse,toReSetWorkloadMap,recyclingContext.getTousseIntoBasketInfo(),basketSizeArr, recyclingContext); Set taskGroupOfModifiedNumOfTousse = new HashSet();//被修改数量的器械包的任务组 //设置回收物品 setRecylingItems(recyclingContext, record, tousseItemJson,tousseDefinitions,urgentTousseItems,tousseDefIdTousseItemVoMap,taskGroupOfModifiedNumOfTousse, cameraPhotoInfo); @@ -2080,7 +2145,7 @@ setRecyclingRecordStatus(record,confirmation); //设置装配任务 setPackingTask(record,tousseItemJson,tousseDefinitions,confirmation,urgentTousseItems,isForeignTousseApplication,containerMap, - isChangeApplyDepart,recyclingContext); + isChangeApplyDepart,recyclingContext, recyclingSumInfoVo); //标识牌回收时,自动取出器械包实例GDSRMYY-556 autoTakeOutByTousseInstanceAfterRecycleIDCardInstance(tousseItemJson); //加急物品 @@ -2628,6 +2693,11 @@ @Activity(name = AmountControl.RECYCLING) private void inventoryConfirm(RecyclingRecord record, RecyclingContext recyclingContext) { JSONObject params = recyclingContext.getJsonParamObject(); + if(!DatabaseUtil.isPoIdValid(record.getId())){ + recyclingContext.setNewRecyclingRecord(true); + }else{ + recyclingContext.setNewRecyclingRecord(false); + } boolean autoReturnTheBorrowingTousse = recyclingContext.getAutoReturnTheBorrowingTousse(); //放入篮筐的物品 List basketItemJson = JSONUtil.fromJson(params.optJSONArray("tousseJson"), RecyclingBasketItemVo.class) ; @@ -2658,7 +2728,6 @@ + TousseDefinition.class.getSimpleName() + " po left join fetch po.materialInstances where " +SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", tousseDefIds)); - tousseDefinitionManager.initTousseGoods(tousseDefinitions); Map containerMap = new HashMap(); //放入篮筐的物品(已将非整包清洗放入篮筐的材料组合成器械包) @@ -2803,7 +2872,7 @@ boolean isSecondRecycleForForeignTousse = (application == null) ? false : application.isSecondRecycleForForeignTousse(); JSONArray basketSizeArr = params.optJSONArray("basketSizeArr"); //设置篮筐及篮筐内物品 - setClassifyBaskets(basketItemJson,tousseDefinitions,record,containerMap,isSecondRecycleForForeignTousse,toReSetWorkloadMap,recyclingContext.getTousseIntoBasketInfo(),basketSizeArr); + setClassifyBaskets(basketItemJson,tousseDefinitions,record,containerMap,isSecondRecycleForForeignTousse,toReSetWorkloadMap,recyclingContext.getTousseIntoBasketInfo(),basketSizeArr,recyclingContext); Set taskGroupOfModifiedNumOfTousse = new HashSet();//被修改数量的器械包的任务组 //设置回收物品(如果回收项为空或(所有回收项的物品申请数量及回收数量都为0、null)、同时对应申请单的申请项为空或(所有申请项的物品申请数量及回收数量都为0、null)),则删除此回收记录及对象设置为空 setRecylingItems(recyclingContext,record, tousseItemJson,tousseDefinitions,urgentTousseItems,tousseDefIdTousseItemVoMap,taskGroupOfModifiedNumOfTousse, null); @@ -2815,7 +2884,7 @@ setRecyclingRecordStatus(record,confirmation); //设置装配任务 setPackingTask(record,tousseItemJson,tousseDefinitions,confirmation,urgentTousseItems,isForeignTousseApplication,containerMap, - isChangeApplyDepart,recyclingContext); + isChangeApplyDepart,recyclingContext, recyclingSumInfoVo); //加急物品 if(urgentTousseItems != null && !isSecondRecycleForForeignTousse){ setPackingTaskUrgentAmount(record, urgentTousseItems,tousseDefinitions,tousseItemIdAndUrgentAmountMap); @@ -3788,7 +3857,8 @@ */ private void setPackingTask(RecyclingRecord recyclingRecord, List itemJsonList,List tousseDefinitions, boolean confirmation,List urgentTousseItems, - boolean isForeignTousseApplication,Map containerBarcodeMap,boolean isChangeApplyDepart,RecyclingContext recyclingContext) { + boolean isForeignTousseApplication,Map containerBarcodeMap,boolean isChangeApplyDepart,RecyclingContext recyclingContext + ,RecyclingSumInfoVo recyclingSumInfoVo) { //不处理已回收或二次回收状态的外来器械申请单 if(isForeignTousseApplication){ InvoicePlan invoicePlan = recyclingRecord.getRecyclingApplication(); @@ -3830,6 +3900,18 @@ Set thisTimeTds = new HashSet();//本次入筐的包定义,回收时非本次入筐且有丢失报损的器械包,不修改包实例的状态。 List logArr = new ArrayList(); Date newDate = new Date(); + List packingTasks = null; + if(recyclingRecord != null && DatabaseUtil.isPoIdValid(recyclingRecord.getId())){ + Set tdIds = new HashSet(); + for (RecyclingBasketItemVo json : itemJsonList) { + tdIds.add(json.getTousseDefinitionID()); + } + if(CollectionUtils.isNotEmpty(tdIds)){ + packingTasks = packingManager.getByHql(" po.taskType= "+ PackingTask.TASK_RECYCLINGRECORD + +" and po.sourceId="+ recyclingRecord.getId() + + SqlUtils.getInLongListSql("po.tousseDefinition.id", tdIds)); + } + } for (RecyclingBasketItemVo json : itemJsonList) { String tousseName = json.getTousseName(); Long tousseDefinitionID = json.getTousseDefinitionID(); @@ -3882,11 +3964,8 @@ // 非敷料包的,回收都会产生装配任务(消毒物品不追溯时,也不生产装配任务) if (!tousseDefinition.isDressing()&& !tousseDefinition.isHomeMadeTousse() &&tousseDefinition.needPacking()) { + PackingTask task = findPackingTask(packingTasks, basketBarcode, tousseDefinitionID, idCardBarcode); - PackingTask task = packingManager.getUnfinishedTask( - recyclingRecord.getId(), basketBarcode, tousseDefinitionID, - PackingTask.TASK_RECYCLINGRECORD,true,idCardBarcode); - IDCardInstance idCardInstance = null; TousseInstance idCardTousseInstance = null; if(StringUtils.isNotBlank(idCardBarcode)){ @@ -4078,8 +4157,7 @@ updatePackingTaskRemark(recyclingRecord); //setIdCardBarcodeForPackingTask(idCardTaskMap); //报损、丢失关联装配任务 - setRecyclingErrorAndDamagePackingTaskId(thisTimeTds, recyclingRecord,tousseDefinitions,confirmation); - + setRecyclingErrorAndDamagePackingTaskId(packingTasks, thisTimeTds, recyclingRecord,tousseDefinitions,confirmation,recyclingSumInfoVo); if(isChangeApplyDepart){ String sql = String .format("update %s set department = '%s',departCoding = '%s' where sourceId = %s and taskType = %s", @@ -4092,6 +4170,34 @@ } /** + * 从packingTasks找符合条件的装配任务 + * @param packingTasks + * @param basketBarcode + * @param tousseDefinitionId + * @param idCardBarcode + * @return + */ + private PackingTask findPackingTask(List packingTasks + ,String basketBarcode,Long tousseDefinitionId + , String idCardBarcode){ + if(CollectionUtils.isEmpty(packingTasks)){ + return null; + } + for (PackingTask packingTask : packingTasks) { + if(MathTools.equals(packingTask.getTousseDefinition().getId(), tousseDefinitionId)){ + if(StringUtils.isNotBlank(basketBarcode) && !StringUtils.equals(basketBarcode, packingTask.getBasketBarcode())){ + continue; + } + if(StringUtils.isNotBlank(idCardBarcode) && !StringUtils.equals(idCardBarcode, packingTask.getIdCardBarcode())){ + continue; + } + return packingTask; + } + + } + return null; + } + /** * 获取每个清洗篮筐可完美组合的数量 * @param tousseDefinition 包定义 * @param barcodeArray 篮筐条码列表 @@ -4439,7 +4545,7 @@ return null; } - private void setRecyclingErrorAndDamagePackingTaskId(Set thisTimeTds, RecyclingRecord record,List tousseDefinitions,boolean confirmation) { + private void setRecyclingErrorAndDamagePackingTaskId(List packingTasks, Set thisTimeTds, RecyclingRecord record,List tousseDefinitions,boolean confirmation, RecyclingSumInfoVo recyclingSumInfoVo) { for (RecyclingItem item : record.getItems()) { Long historyPackingTaskId = item.getHistoryPackingTaskId(); TousseDefinition td = getTousseDefinition(tousseDefinitions,item.getTousseDefinitionId()); @@ -4478,17 +4584,17 @@ } setLostIDCardPackingTaskId(record, item, idCardLostList,confirmation); //添加了丢失或报损记录后,最终又改为0了 - if(!haveErrorOrDamage){ - List taskList = packingManager - .getPackingTask(record.getId(), - item.getTousseDefinitionId(), - PackingTask.TASK_RECYCLINGRECORD); - if(taskList != null){ - for (PackingTask packingTask : taskList) { - if(PackingTask.STATUS_AWAIT_VERIFYING.equals(packingTask.getStatus())){ - packingTask.setStatus(PackingTask.STATUS_AWAIT_PACKING); - } + if(!haveErrorOrDamage && recyclingSumInfoVo.getHaveErrorOrDamageInfo() != null + && recyclingSumInfoVo.getHaveErrorOrDamageInfo().containsKey(item.getId()) + && recyclingSumInfoVo.getHaveErrorOrDamageInfo().get(item.getId()) != null + && recyclingSumInfoVo.getHaveErrorOrDamageInfo().get(item.getId())){ + for (PackingTask packingTask : packingTasks) { + if(!MathTools.equals(item.getTousseDefinitionId(), packingTask.getTousseDefinition().getId())){ + continue; } + if(PackingTask.STATUS_AWAIT_VERIFYING.equals(packingTask.getStatus())){ + packingTask.setStatus(PackingTask.STATUS_AWAIT_PACKING); + } } } }