Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r31131 -r31221 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 31131) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 31221) @@ -5456,7 +5456,7 @@ } List items = recyclingApplication.getApplicationItems(); List existItems = existApplication.getApplicationItems(); - if(CollectionUtils.isNotEmpty(items)){ + if(CollectionUtils.isNotEmpty(items) && recyclingApplication.getUseRecord() == null){ for (TousseItem tousseItem : items) { if(tousseItem.isDisinfection()){ //如果第一张和第二张申请单都包含了消毒物品,则不进行合并 @@ -5523,7 +5523,7 @@ //1.先从单类型、状态等本身信息字段来判断该申请单是否满足合并的条件,决定是否需要合并(因为这个判断效率高所以放在第一步):消毒物品申请单也都不再合并 // TODO:已打印的单也不能被合并,需要增加这种检查 if ((((InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM.equals(appType) - || InvoicePlan.TYPE_COMBO_FORM.equals(appType))/* || InvoicePlan.TYPE_DISINFECT_GOODS_APPLICATION_FORM.equals(appType)*/) + || InvoicePlan.TYPE_COMBO_FORM.equals(appType)) || (InvoicePlan.TYPE_DISINFECT_GOODS_APPLICATION_FORM.equals(appType) && recyclingApplication.getUseRecord() != null)) && (StringUtils.isBlank(recyclingStatus) || InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE.equals(recyclingStatus)) && (StringUtils.isBlank(deliverStatus) || InvoicePlan.DELIVERSTATUS_AWAITDELIVER.equals(deliverStatus))) || (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM.equals(appType) && InvoicePlan.DELIVERSTATUS_AWAITDELIVER.equals(deliverStatus)) @@ -5607,6 +5607,7 @@ } String tousseItemDetails = null; + Map disinfectionTdMap = new HashMap(); //遍历新申请单的申请项 for (TousseItem newItem : recyclingApplication .getApplicationItems()) { @@ -5626,11 +5627,17 @@ isMatched = true; //simon-add:如果为消毒物品,需要特殊处理 if(StringUtils.equals(oldItem.getTousseType() , TousseDefinition.PACKAGE_TYPE_DISINFECTION)){ + //被合并的申请单的消毒物品包定义 + TousseDefinition td_new = disinfectionTdMap.get(newItem.getTousseDefinitionId()); + td_new = td_new == null ? tousseDefinitionManager.get(newItem.getTousseDefinitionId()) : td_new; + disinfectionTdMap.put(newItem.getTousseDefinitionId(), td_new); + //合并前要合并到的申请单的消毒物品包定义 + TousseDefinition td_old = disinfectionTdMap.get(oldItem.getTousseDefinitionId()); + td_old = td_old == null ? tousseDefinitionManager.getTousseDefinitionByTousseItem(oldItem) : td_old; + disinfectionTdMap.put(oldItem.getTousseDefinitionId(), td_old); //如果非整包申请,包数量不相加,材料数量相加 if(StringUtils.equals(oldItem.getIsApplyEntireTousse() , com.forgon.Constants.STR_NO) && StringUtils.equals(newItem.getIsApplyEntireTousse() , com.forgon.Constants.STR_NO)){ - //合并前要合并到的申请单的消毒物品包定义 - TousseDefinition td_old = tousseDefinitionManager.getTousseDefinitionByTousseItem(oldItem); //合并前要合并到的申请单的消毒物品包定义的材料实例 List materialInstances_old = td_old.getMaterialInstances(); //新申请的包 @@ -5654,9 +5661,17 @@ td_old.calculateMaterialSplitAmount(); } else if(StringUtils.equals(oldItem.getIsApplyEntireTousse() , com.forgon.Constants.STR_YES) && StringUtils.equals(newItem.getIsApplyEntireTousse() , com.forgon.Constants.STR_YES)){ + //如果旧单的该消毒物品包定义的整包申请为是并且新单的该消毒物品包定义的整包申请也为是,但是材料不一样,不合并 + if(!StringUtils.equals(td_old.getMaterialsMD5(), td_new.getMaterialsMD5())){ + return recyclingApplication; + } //如果旧单的该消毒物品包定义的整包申请为是并且新单的该消毒物品包定义的整包申请也为是,则包数量相加,材料数量不变 oldItem.setEditAmount(oldItem.getAmount() + newItem.getEditAmount()); }else { + if(!StringUtils.equals(td_old.getMaterialsMD5(), td_new.getMaterialsMD5())){ + //包定义的“是否整包申请”不一样,而且材料不一样,不合并 + return recyclingApplication; + } //其它特殊情况:如旧单里的该消毒物品与新单里的该消毒物品的是否整包申请单没有同时为是或没有同时为否时,暂先按合并包数量处理(先临时处理解决中六问题、后期再持续调整) oldItem.setEditAmount(oldItem.getAmount() + newItem.getEditAmount()); //因为是特殊情况,所以需要记录一下日志信息 @@ -6366,21 +6381,16 @@ .getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION)); recyclingApplication.setApplicationTime(applicationCreateDate); - //必须先设置申请项,再计算单的状态 - //createApplicationItems(recyclingApplication, newTousseNameAndAmountMap , newDiposableGoodMap , dpf ,applyUrgentTousseMap); - //设置申请单状态这一句一定要放在设置申请项之后 - //setApplicationStatus(recyclingApplication, newTousseNameAndAmountMap); - //setInstanceCodesToApplication(tousseInstanceMap, recyclingApplication); - // 备注里面增加普通器械包的数量(做成可配置,不用对所有项目都全部写死的方式) - //RecyclingApplicationUtils.appendTousseAmountRemark(recyclingApplication); - - objectDao.saveOrUpdate(recyclingApplication); - Long invoicePlanId = recyclingApplication.getId(); list.add(recyclingApplication); List useRecordIdList = new ArrayList(); List tousseBarcodeList = new ArrayList(); Map applyTousseMap = new HashMap(); + List tousseItems = new ArrayList(); + // 回收状态 + Map recyclingStatusMap = new HashMap(); + // 发货状态 + Map deliverStatusMap = new HashMap(); //遍历祖先包定义对应的包实例集合 ancestorTdToMaterialMd5ToTiListMapMap.entrySet().stream().forEach(entry -> { @@ -6389,9 +6399,6 @@ List tousseInstanceList = materialMd5ToTiListMap.values().stream().reduce((list1, list2) -> { return null; }).get(); - //2.生成消毒物品对应的包定义 - TousseDefinition newDisinfectGoodsDefinition = - tousseDefinitionManager.newDisinfectGoodsDefinition(ancestorTd, tousseInstanceList.get(0).getTousseDefinition().getMaterialInstancesJsonArray(), recyclingApplication.getId()); Integer urgentAmount = 0; for(TousseInstance ti : tousseInstanceList) { @@ -6412,29 +6419,30 @@ tousseItem.setAmount(tousseInstanceList.size()); tousseItem.setAncestorID(ancestorTd.getId()); tousseItem.setDiposable(TousseItem.DIPOSABLE_NO); - tousseItem.setDisinfectGoodsMaterials(newDisinfectGoodsDefinition.getMaterialInstancesJsonArray().toString()); + tousseItem.setDisinfectGoodsMaterials(tousseInstanceList.get(0).getTousseDefinition().getMaterialInstancesJsonArray().toString()); tousseItem.setExpressInvoice(ancestorTd.getExpressInvoice()); tousseItem.setExpressRecycling(ancestorTd.getExpressRecycling()); tousseItem.setHideRecycling(ancestorTd.getHideRecycling()); tousseItem.setInvoiceAmountMode(ancestorTd.getInvoiceAmountMode()); - tousseItem.setIsApplyEntireTousse(ancestorTd.getIsApplyEntireTousse()); + tousseItem.setIsApplyEntireTousse(tousseInstanceList.get(0).getTousseDefinition().getIsApplyEntireTousse()); tousseItem.setIsCleanedEntirely(ancestorTd.getIsCleanedEntirely()); tousseItem.setIsInvoice(ancestorTd.getIsInvoice()); tousseItem.setIsRecycling(ancestorTd.getIsRecycling()); - tousseItem.setIsThereIdentificationCard(StringUtils.equals(com.forgon.Constants.STR_YES, ancestorTd.getIsDisableIDCard()) ? com.forgon.Constants.STR_NO : com.forgon.Constants.STR_YES); + tousseItem.setIsThereIdentificationCard((ancestorTd.isIDCardDisabled() + || StringUtils.isBlank(ancestorTd.getIsDisableIDCard())) ? com.forgon.Constants.STR_NO : com.forgon.Constants.STR_YES); tousseItem.setIsTraceable(ancestorTd.getIsTraceable()); tousseItem.setPrice(ancestorTd.getPrice()); tousseItem.setRowPrice(MathTools.mul(tousseItem.getAmount(), ancestorTd.getPrice()).doubleValue()); - tousseItem.setTousseDefinitionId(newDisinfectGoodsDefinition.getId()); + tousseItem.setTousseDefinitionId(tousseInstanceList.get(0).getTousseDefinition().getId()); tousseItem.setTousseName(ancestorTd.getName()); tousseItem.setTousseType(ancestorTd.getTousseType()); tousseItem.setUnit(ancestorTd.getUnit()); tousseItem.setUrgent(urgentAmount > 0 ? com.forgon.Constants.STR_YES : com.forgon.Constants.STR_NO); tousseItem.setUrgentAmount(urgentAmount); + tousseItem.setEditAmount(tousseInstanceList.size()); tousseItem.setInvoicePlan(recyclingApplication); - tousseItem.setInvoicePlanID(invoicePlanId); - objectDao.saveOrUpdate(tousseItem); + tousseItems.add(tousseItem); String recyclingStatus = recyclingApplication.getRecyclingStatus(); String deliverStatus = recyclingApplication.getDeliverStatus(); @@ -6445,10 +6453,28 @@ if(StringUtils.isBlank(deliverStatus)){ recyclingApplication.setDeliverStatus(StringUtils.equals(com.forgon.Constants.STR_YES, ancestorTd.getIsInvoice()) ? InvoicePlan.DELIVERSTATUS_AWAITDELIVER : null); } + + if(ancestorTd.recycling()){ + recyclingStatusMap.put(ancestorTd.getId(), InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE); + } + if(StringUtils.equals(com.forgon.Constants.STR_YES, ancestorTd.getIsInvoice())){ + deliverStatusMap.put(ancestorTd.getId(), InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + } }); + + //设置申请单的使用记录(取第一个包实例的使用记录) + recyclingApplication.setUseRecord(idToUseRecordMap.get(useRecordIdList.get(0))); + recyclingApplication.setApplicationItems(tousseItems); + // 保存并合并申请单 + StringBuffer sbf = new StringBuffer(); + RecyclingApplication application = mergeApplications(recyclingApplication, sbf,true); + + saveOrUpdateRecyclingApplication(application, true); + List useRecordList = new ArrayList(); //4.插入使用记录与转换后的申请单的关系表数据 + Long invoicePlanId = application.getId(); for(Long useRecordId : useRecordIdList){ UseRecordToRecycleApplication urToRa = new UseRecordToRecycleApplication(); urToRa.setConvertUserCode(AcegiHelper.getLoginUser().getUserName()); @@ -6460,21 +6486,52 @@ useRecordList.add(idToUseRecordMap.get(useRecordId)); } - //设置申请单的使用记录(取第一个包实例的使用记录) - recyclingApplication.setUseRecord(idToUseRecordMap.get(useRecordIdList.get(0))); //备注信息(及设置包实例条码等待完善...) String remark = RecyclingApplicationUtils.getRemarkByUseRecordAndProjectConfig(applyTousseMap, useRecordList, null, true, false, objectDao); - recyclingApplication.setRemark(remark + ",包数量:" + tousseBarcodeList.size()); - recyclingApplication.setTousseBarcodes(StringUtils.join(tousseBarcodeList,";")); + String oldAppRemark = application.getRemark() == null ? "" : application.getRemark() + "。"; + remark = oldAppRemark + remark+ ",包数量:" + tousseBarcodeList.size(); + remark = remark.length() > 1000 ? remark.substring(0, 1000) : remark; + application.setRemark(remark); + application.setTousseBarcodes(StringUtils.join(tousseBarcodeList,";")); + + for (TousseItem ti : application.getApplicationItems()) { + ti.setInvoicePlanID(application.getId()); + } + + String recyclingStatus = application.getRecyclingStatus(); + String deliverStatus = application.getDeliverStatus(); + + if(StringUtils.isBlank(recyclingStatus)){ + for (TousseItem ti : application.getApplicationItems()) { + Long ancestorID = ti.getAncestorID(); + recyclingStatus = (String)recyclingStatusMap.get(ancestorID); + if(StringUtils.isNotBlank(recyclingStatus)){ + application.setRecyclingStatus(recyclingStatus); + break; + } + } + } + + if(StringUtils.isBlank(deliverStatus)){ + for (TousseItem ti : application.getApplicationItems()) { + Long ancestorID = ti.getAncestorID(); + deliverStatus = (String)recyclingStatusMap.get(ancestorID); + if(StringUtils.isNotBlank(deliverStatus)){ + application.setDeliverStatus(deliverStatus); + break; + } + } + } + //以下两个字段也需要赋值 if(StringUtils.equals(InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE, recyclingApplication.getRecyclingStatus())){ - recyclingApplication.setIncludeRecyclingItems(1); + application.setIncludeRecyclingItems(1); } if(StringUtils.equals(InvoicePlan.DELIVERSTATUS_AWAITDELIVER, recyclingApplication.getDeliverStatus())){ - recyclingApplication.setIncludeInvoiceItems(1); + application.setIncludeInvoiceItems(1); } - objectDao.saveOrUpdate(recyclingApplication); + objectDao.saveOrUpdate(application); return list; }