Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r29387 -r29474 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 29387) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 29474) @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; +import java.text.SimpleDateFormat; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; @@ -68,6 +69,7 @@ import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.SqlUtils; /** @@ -134,6 +136,8 @@ String personInCharge = JSONUtil.optString(params, "personInCharge", ""); String personInChargeCode = JSONUtil.optString(params, "personInChargeCode", ""); JSONArray invoiceItems = params.optJSONArray("invoiceItems"); + //日期,格式为开始日期;结束日期。开始日期和结果的格式为yyyy-MM-dd + String applyDate = JSONUtil.optString(params, "applyDate", ""); if(CollectionUtils.isEmpty(invoiceItems)){ throw new SystemException("发货物品为空"); } @@ -711,7 +715,7 @@ Map> tousseItemToTousesListMap5 = findTousseItemAndMatchTraceForeignProxyTousseInstanceList( invoicePlanIdToForeignProxyTousseListMap, - invoicePlanId, departCoding, invoiceGroupByConfig, + invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion); if(MapUtils.isNotEmpty(tousseItemToTousesListMap5)){ if(allTousseItemToTiListMap == null) allTousseItemToTiListMap = new HashMap>(); @@ -723,7 +727,7 @@ if(CollectionUtils.isNotEmpty(unTraceForeignProxyTousseList)){ Map> tousseItemToTousesListMap6 = findTousseItemAndMatchUnTraceForeignProxyTousseInstanceList(unTraceForeignProxyTousseList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); if(MapUtils.isNotEmpty(tousseItemToTousesListMap6)){ @@ -752,7 +756,7 @@ } Map> tousseItemToTousesListMap7 = findTousseItemAndMatchTraceNormalTousseInstanceList(traceNotDisinfectTousseList, - invoicePlanId, departCoding, invoiceGroupByConfig, + invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion); if(MapUtils.isNotEmpty(tousseItemToTousesListMap7)){ if(allTousseItemToTiListMap == null) allTousseItemToTiListMap = new HashMap>(); @@ -764,7 +768,7 @@ if(CollectionUtils.isNotEmpty(traceDisinfectTousseList)){ Map> tousseItemToTousesListMap8 = findTousseItemAndMatchTraceNotLimitDisinfectTousseInstanceList(traceDisinfectTousseList, - idToTdMapForAncestorDisinfectTd, invoicePlanId, departCoding, invoiceGroupByConfig, + idToTdMapForAncestorDisinfectTd, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion); if(MapUtils.isNotEmpty(tousseItemToTousesListMap8)){ if(allTousseItemToTiListMap == null) allTousseItemToTiListMap = new HashMap>(); @@ -776,7 +780,7 @@ if(CollectionUtils.isNotEmpty(unTraceLimitNotDisinfectTousseList)){ Map> tousseItemToTousesListMap9 = findTousseItemAndMatchUnTraceNormalTousseInstanceList(unTraceLimitNotDisinfectTousseList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, true, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); if(MapUtils.isNotEmpty(tousseItemToTousesListMap9)){ @@ -789,7 +793,7 @@ if(CollectionUtils.isNotEmpty(unTraceLimitDisinfectTousseList)){ Map> tousseItemToTousesListMap10 = findTousseItemAndMatchUnTraceDisinfectTousseInstanceList(unTraceLimitDisinfectTousseList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, true, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); if(MapUtils.isNotEmpty(tousseItemToTousesListMap10)){ @@ -802,7 +806,7 @@ if(CollectionUtils.isNotEmpty(unTraceNotLimitNotDisinfectTousseList)){ Map> tousseItemToTousesListMap11 = findTousseItemAndMatchUnTraceNormalTousseInstanceList(unTraceNotLimitNotDisinfectTousseList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, false, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); if(MapUtils.isNotEmpty(tousseItemToTousesListMap11)){ @@ -815,7 +819,7 @@ if(CollectionUtils.isNotEmpty(unTraceNotLimitDisinfectTousseList)){ Map> tousseItemToTousesListMap12 = findTousseItemAndMatchUnTraceDisinfectTousseInstanceList(unTraceNotLimitDisinfectTousseList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, false, warningTousseWhetherDelivery, validUtilTodayCanInvoice, currentDateTime); if(MapUtils.isNotEmpty(tousseItemToTousesListMap12)){ @@ -827,15 +831,15 @@ //2.申请项与高值耗材实例集合的关联map(key为申请项,value为高值耗材实例集合) Map> tousseItemToExpensiveDisposablegoodsMap = findTousseItemAndMatchExpensiveDisposablegoodsList(expensiveDisposablegoodsList, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, hideUnprintedDisposableGoodsInvoicePlan); //3.申请项与一次性物品标识的关联map(第一层map的key为申请项,value为一次性物品标识数量map(key为一次性物品标识对象,value为数量)) Map> allTousseItemToIdentificationAmountMap = null; if(MapUtils.isNotEmpty(batchToIdentificationAmountMap)){ Map> tousseItemToIdentificationAmountMapForBatch = findTousseItemAndMatchIdentificationAmountMapFromBatch(batchToIdentificationAmountMap, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, invoiceOrigin, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, hideUnprintedDisposableGoodsInvoicePlan); if(MapUtils.isNotEmpty(tousseItemToIdentificationAmountMapForBatch)){ if(allTousseItemToIdentificationAmountMap == null){ @@ -850,7 +854,7 @@ if(MapUtils.isNotEmpty(disposableGoodsToIdentificationAmountMap)){ Map> tousseItemToIdentificationAmountMapForDisposableGoods = findTousseItemAndMatchIdentificationAmountMapFromDisposableGoods(disposableGoodsToIdentificationAmountMap, - barcodeToSendAmountMap, invoicePlanId, departCoding, invoiceGroupByConfig, + barcodeToSendAmountMap, invoicePlanId, departCoding, applyDate, invoiceGroupByConfig, invoiceOrigin, tousseDeliverOccasion, hideUnprintedDisposableGoodsInvoicePlan); if(MapUtils.isNotEmpty(tousseItemToIdentificationAmountMapForDisposableGoods)){ if(allTousseItemToIdentificationAmountMap == null){ @@ -2129,14 +2133,14 @@ */ private Map> findTousseItemAndMatchTraceForeignProxyTousseInstanceList( Map> invoicePlanIdToTousseListMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion){ Map> tousseItemMatchTousseInstanceList = new LinkedHashMap>(); if(MapUtils.isNotEmpty(invoicePlanIdToTousseListMap)){ List invoicePlanTypeList = Collections.singletonList(InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, false, false); String queryCondition = String.format("where %s and %s and %s", invoicePlanCondition, @@ -2241,7 +2245,7 @@ */ private Map> findTousseItemAndMatchUnTraceForeignProxyTousseInstanceList( List unTraceForeignProxyTousseInstanceList,Map barcodeToSendAmountMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion, boolean warningTousseWhetherDelivery,boolean validUtilTodayCanInvoice,Date currentDateTime){ if(CollectionUtils.isNotEmpty(unTraceForeignProxyTousseInstanceList)){ @@ -2260,7 +2264,7 @@ List invoicePlanTypeList = Collections.singletonList(InvoicePlan.TYPE_FOREIGNPROXYDISINFECTION); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, false, false); //申请单过滤条件:1.对应的包定义(传包定义参数) 2.未终止(固定写法) 3.需要发货(固定写法) String tousseItemCondition = String.format("%s and (po.isTerminated is null or po.isTerminated <> 1) " @@ -2497,7 +2501,7 @@ */ private Map> findTousseItemAndMatchTraceNormalTousseInstanceList( List tousseInstanceList, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion){ if(CollectionUtils.isNotEmpty(tousseInstanceList)){ //按包定义拆分成需回收与不需要回收两种(因为二者取的申请单的条件不一样) @@ -2573,7 +2577,7 @@ */ String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, true, false); //申请单过滤条件:1.对应的包定义(传包定义参数) 2.未终止(固定写法) 3.需要发货(固定写法) String tousseItemCondition = String.format("%s and (po.isTerminated is null or po.isTerminated <> 1) " @@ -2746,7 +2750,7 @@ private Map> findTousseItemAndMatchTraceNotLimitDisinfectTousseInstanceList( List tousseInstanceList, Map idToTdMapForAncestorDisinfectTd, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion){ if(CollectionUtils.isNotEmpty(tousseInstanceList)){ //按包定义拆分成需回收与不需要回收两种(因为二者取的申请单的条件不一样) @@ -2786,7 +2790,7 @@ ancestorIdToMaterialsMD5TiListMap.put(ancestorId, materialsMD5ToTiListMap); }); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, true, false); //申请项按祖先包定义id及材料md5条件的过滤 List tdIdAndMaterialsMd5Conidtion = new ArrayList(); @@ -2984,7 +2988,7 @@ */ private Map> findTousseItemAndMatchUnTraceNormalTousseInstanceList( List unTraceTousseInstanceList,Map barcodeToSendAmountMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion,boolean limitInvoice, boolean warningTousseWhetherDelivery,boolean validUtilTodayCanInvoice,Date currentDateTime){ if(CollectionUtils.isNotEmpty(unTraceTousseInstanceList)){ @@ -3013,7 +3017,7 @@ InvoicePlan.TYPE_RECYCLINGCREATE_APPLICATION }); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, false, false); //申请单过滤条件:1.对应的包定义(传包定义参数) 2.未终止(固定写法) 3.需要发货(固定写法) 4.4.还需待发货数量是否大于0 String tousseItemCondition = String.format("%s and (po.isTerminated is null or po.isTerminated <> 1) " @@ -3274,7 +3278,7 @@ */ private Map> findTousseItemAndMatchUnTraceDisinfectTousseInstanceList( List unTraceDisinfectTousseInstanceList,Map barcodeToSendAmountMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion,boolean limitInvoice, boolean warningTousseWhetherDelivery,boolean validUtilTodayCanInvoice,Date currentDateTime){ if(CollectionUtils.isNotEmpty(unTraceDisinfectTousseInstanceList)){ @@ -3306,7 +3310,7 @@ //申请单查询条件 String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, departCoding, - invoiceGroupByConfig, invoicePlanTypeList, invoiceOrigin, + invoiceGroupByConfig, invoicePlanTypeList, applyDate, invoiceOrigin, tousseDeliverOccasion, true, false); /* @@ -3610,7 +3614,7 @@ */ private Map> findTousseItemAndMatchExpensiveDisposablegoodsList( List expensiveDisposablegoodsList,Map barcodeToSendAmountMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion, boolean hideUnprintedDisposableGoodsInvoicePlan){ if(CollectionUtils.isNotEmpty(expensiveDisposablegoodsList)){ @@ -3626,7 +3630,7 @@ InvoicePlan.TYPE_COMBO_FORM }); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, - departCoding, invoiceGroupByConfig,invoicePlanList, + departCoding, invoiceGroupByConfig,invoicePlanList, applyDate, invoiceOrigin, tousseDeliverOccasion,false, hideUnprintedDisposableGoodsInvoicePlan); String queryCondition = String.format("where %s and (isTerminated is null or isTerminated <> 1) and sendOutAmount < amount and %s)", invoicePlanCondition, @@ -3747,7 +3751,7 @@ */ private Map> findTousseItemAndMatchIdentificationAmountMapFromBatch( Map> batchToIdentificationAmountMap, - Map barcodeToSendAmountMap,Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Map barcodeToSendAmountMap,Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion,boolean hideUnprintedDisposableGoodsInvoicePlan){ if(MapUtils.isNotEmpty(batchToIdentificationAmountMap)){ Map> tousseItemMatchIdentiAmountMap = @@ -3795,7 +3799,7 @@ InvoicePlan.TYPE_COMBO_FORM }); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, - departCoding, invoiceGroupByConfig,invoicePlanList, + departCoding, invoiceGroupByConfig,invoicePlanList, applyDate, invoiceOrigin, tousseDeliverOccasion,false, hideUnprintedDisposableGoodsInvoicePlan); String queryCondition = String.format("where %s and (po.isTerminated is null or po.isTerminated <> 1) and po.sendOutAmount < po.amount and %s)", invoicePlanCondition, @@ -4075,7 +4079,7 @@ private Map> findTousseItemAndMatchIdentificationAmountMapFromDisposableGoods( Map> disposableGoodsToIdentificationAmountMap, Map barcodeToSendAmountMap, - Long invoicePlanId,String departCoding,String invoiceGroupByConfig, + Long invoicePlanId,String departCoding,String applyDate,String invoiceGroupByConfig, String invoiceOrigin,String tousseDeliverOccasion,boolean hideUnprintedDisposableGoodsInvoicePlan ){ Set disposableGoodsSet = @@ -4096,7 +4100,7 @@ InvoicePlan.TYPE_COMBO_FORM }); String invoicePlanCondition = buildInvoicePlanCondition(invoicePlanId, - departCoding, invoiceGroupByConfig,invoicePlanList, + departCoding, invoiceGroupByConfig,invoicePlanList, applyDate, invoiceOrigin, tousseDeliverOccasion,false, hideUnprintedDisposableGoodsInvoicePlan); String queryCondition = String.format("where %s and (po.isTerminated is null or po.isTerminated <> 1) and po.sendOutAmount < po.amount and %s)", invoicePlanCondition, @@ -4227,6 +4231,7 @@ * @param departCoding 科室编码 * @param invoiceGroupByConfig 过滤的科室编码类型 * @param invoicePlanTypeList 过滤的申请单类型 + * @param applyDate 申请日期,格式为开始日期;结束日期。开始日期和结果的格式为yyyy-MM-dd * @param invoiceOrigin 发货数量依据(申请单或回收单) * @param afterRecyclingTousseDeliver 回收后发货 * @param allToussesAreNeedRecycle 是否都是要回收的器械包,true为是,false为否 @@ -4237,6 +4242,7 @@ String departCoding, String invoiceGroupByConfig, List invoicePlanTypeList, + String applyDate, String invoiceOrigin, String tousseDeliverOccasion, boolean allToussesAreNeedRecycle, @@ -4317,6 +4323,38 @@ } } + + String applyDateCondition = "1=1"; + //如果申请时间范围不为空时 + if (StringUtils.isNotBlank(applyDate)) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(DateTools.COMMON_DATE_HMS); + try { + String[] applyDateArray = StringUtils.split(applyDate, Constants.IDS_SEPARATOR); + //如果convertTime方法转换出错,尝试重新再转换(花都区人民医院要求:发货时间精确到上午和下午的时分,而之前默认的方法是精确到时分秒,所以要尝试再次转换) + Date out_beginTime = ForgonDateUtils.safelyParseDate(applyDateArray[0]); + String endDate = applyDateArray[1]; + if(StringUtils.length(StringUtils.trim(endDate)) <= 10){ + endDate = endDate + " 23:59:59"; + } + Date out_endTime = ForgonDateUtils.safelyParseDate(endDate); + //如果结束日期的时分秒是 + applyDateCondition = String.format("((invoicePlan.applicationTime between %s and %s) or (invoicePlan.recyclingTime between %s and %s))", + dateQueryAdapter.dateAdapter(out_beginTime), + dateQueryAdapter.dateAdapter(out_endTime), + dateQueryAdapter.dateAdapter(out_beginTime), + dateQueryAdapter.dateAdapter(out_endTime)); + } + catch (Exception e) { + logger.error(e); + throw new RuntimeException(e); + } + } + catch (Exception e) { + logger.error(e, e); + } + } + /* * 条件如下: * 0.处理科室编码过滤 @@ -4329,8 +4367,8 @@ * 7.借物单审核状态(只能为null或不为未审核) */ String invoicePlanCondition = String.format(" %s and %s and (invoicePlan.endStatus is null or invoicePlan.endStatus <> '%s') " - + "and %s and %s and %s and %s and %s", handleDepartCodingCondition,departCodingCondition,InvoicePlan.STATUS_END, - typeCondition,deliverStatusCondition,recyclingStatusCondition,printedCondition,borrowConfirmStatusCondition + + "and %s and %s and %s and %s and %s and %s", handleDepartCodingCondition,departCodingCondition,InvoicePlan.STATUS_END, + typeCondition,deliverStatusCondition,recyclingStatusCondition,printedCondition,borrowConfirmStatusCondition,applyDateCondition ); if(DatabaseUtil.isPoIdValid(invoicePlanId)){ invoicePlanCondition = String.format("invoicePlan.id=%s",invoicePlanId);