Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r24028 -r24041 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 24028) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 24041) @@ -130,10 +130,10 @@ import com.forgon.treenode.model.THTreeNode; import com.forgon.workflow.service.WorkFlowApprovalTaskManager; import com.google.common.collect.Maps; - + /** * @author songwei 2012-3-23 下午16:59:34 - */ + */ public class RecyclingApplicationManagerImpl extends BasePoManagerImpl implements RecyclingApplicationManager { private static final Logger logger = Logger @@ -2105,7 +2105,7 @@ boolean success = true; String message = null; - if (printRowVos.size() == 0 && CollectionUtils.isEmpty(printTousseVos)){ + if (CollectionUtils.isEmpty(printTousseVos)){ success = false; message = "该时间段内没有需要打印的内容!"; } @@ -3976,9 +3976,10 @@ * 判断该申请单是否是新建, 如果是则查询是否有同一科室、同一结算科室、同一状态、同一类型的申请单,如果有 * 则将申请单中的申请物品加入到旧的已存在的申请单中。并记录下操作时间、操作人、以及所添加 的明细加入到备注中。 * - * @param dateFormat - * 用于拿到操作时间的格式化对象 - * @return 如果能查到与原单相同的单,返回合并之后的单;如果查不到则返回空 + * @param recyclingApplication 新申请单的申请单(前台页面传输到后台、并未持久化的对象) + * @param sbf 如果发生了合并,则存储备注信息(备注格式为:"您申请的物品已被合并到单号为【被合并的单号】的申请单,提交成功!"),并将消息往上返回,最终被返回到前端进行提示 + * @param isCommit 新申请的申请单(前台页面传输到后台、并未持久化的对象)的状态(如果前端申请单点的是暂存isCommit为false、如果点的是提交则isCommit为true) + * @return 如果能查到与原单相同的单,返回合并之后的单(即之前被合并到的旧单);如果查不到则返回空 */ private RecyclingApplication mergeApplications( RecyclingApplication recyclingApplication,StringBuffer sbf,Boolean isCommit) { @@ -3990,22 +3991,25 @@ SupplyRoomConfig supplyRoomConfig = supplyRoomConfigManager.getSystemParamsObj(); boolean autoMerge = supplyRoomConfig.getAutoMergeApplication(); - if(autoMerge && recyclingApplication.getId() == null){ + if(autoMerge && !DatabaseUtil.isPoIdValid(recyclingApplication.getId())){ //只有待回收状态的器械包申请单、待发货状态的一次性物品申请单才会被合并;通用申请单目前不会被合并 boolean isNeedToBeMerged = false; - if ((InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM.equals(appType) && InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE - .equals(recyclingStatus)) || (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM - .equals(appType) && InvoicePlan.DELIVERSTATUS_AWAITDELIVER - .equals(deliverStatus))) { + + //1.先从单类型、状态等本身信息字段来判断该申请单是否满足合并的条件,决定是否需要合并(因为这个判断效率高所以放在第一步) + if (((InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM.equals(appType) || InvoicePlan.TYPE_DISINFECT_GOODS_APPLICATION_FORM.equals(appType)) + && (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)) + ) { isNeedToBeMerged = true; } + //2.再根据科室供应室的配置进行判断该项目、该申请科室是否启用或符合合并条件来决定该单是否需要合并(因为这个判断需要对比查询科室供应室的数据出来进行比较所以效率高、所以放在第二步) + if(isNeedToBeMerged){ + isNeedToBeMerged = isApplicationFormMerge(recyclingApplication,supplyRoomConfig, autoMerge); + } - isNeedToBeMerged = isApplicationFormMerge(recyclingApplication,supplyRoomConfig, autoMerge); - //simon-add:判断申请物品的器械包定义是否改变,如果已改变,那么不合并 - - - + //如果需要合并,则进行相应的处理 if (isNeedToBeMerged) { existApplication = getSameStatusRecyclingApplicationForUpdate(recyclingApplication,isCommit); if (existApplication != null) { @@ -4024,7 +4028,6 @@ if (recyclingApplication.getBorrowConfirmStatus() != null){ existApplication.setBorrowConfirmStatus(BorrowConfirmStatus.WAITINGCONFIRM.getDesc()); } - //endregion String modifyTimeString = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM.format(modifyTime); String remarkNeedToBeAdded = "——被 " @@ -4045,9 +4048,11 @@ } String tousseItemDetails = null; + //遍历新申请单的申请项 for (TousseItem newItem : recyclingApplication .getApplicationItems()) { boolean isMatched = false; + //遍历旧申请单的申请项 for (TousseItem oldItem : existApplication .getApplicationItems()) { //验证物品名称及类型是否都一致,如果不是都一致的话则进入下一次循环 @@ -4058,31 +4063,47 @@ String key = String.format("%s_%s", newItem.getTousseName(), newItem.getTousseType()); TousseItem existTousseItem = tousseNameAndTypeToTousseItem.get(key); if (existTousseItem != null) { + //如果在旧单里也能找到该包,则将是否匹配设为true isMatched = true; //simon-add:如果为消毒物品,需要特殊处理 - if(oldItem.getTousseType().equals(TousseDefinition.PACKAGE_TYPE_DISINFECTION)){ - String isApplyEntireTousse=oldItem.getIsApplyEntireTousse(); - //如果是整包申请,包数量相加,材料数量不相加;如果非整包申请,包数量不相加,材料数量相加 - if(isApplyEntireTousse != null&&isApplyEntireTousse.equals(com.forgon.Constants.STR_YES)){ - oldItem.setEditAmount(oldItem.getAmount() + newItem.getEditAmount()); - }else{ + if(StringUtils.equals(oldItem.getTousseType() , TousseDefinition.PACKAGE_TYPE_DISINFECTION)){ + //如果非整包申请,包数量不相加,材料数量相加 + 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(); - - String infectGoodsMaterials =newItem.getDisinfectGoodsMaterials(); - com.alibaba.fastjson.JSONArray infoArray=JSON.parseArray(infectGoodsMaterials); + //新申请的包 + String infectGoodsMaterials = newItem.getDisinfectGoodsMaterials(); + com.alibaba.fastjson.JSONArray infoArray = JSON.parseArray(infectGoodsMaterials); for(MaterialInstance ms_old : materialInstances_old){ - for(int i=0;i