Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java =================================================================== diff -u -r35680 -r35719 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java (.../ForeignTousseApplicationAction.java) (revision 35680) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java (.../ForeignTousseApplicationAction.java) (revision 35719) @@ -2,7 +2,9 @@ import java.io.IOException; import java.io.PrintWriter; +import java.sql.ResultSet; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; @@ -18,6 +20,7 @@ import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; @@ -54,6 +57,7 @@ import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ConfigUtils; import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.SqlUtils; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; @@ -274,6 +278,9 @@ */ private JSONArray buildTousseItemsJson(List tousseItems,boolean confirmRecycle,JSONArray jsonArray) { if(tousseItems != null){ + //ZSYY-330 【外来器械申请单】视图列表新增扩展表格列“装配状态”和“灭菌状态” + String extendedColumnConfigOfForeignTousseApplicationForm = + ConfigUtils.getSystemSetConfigByName("extendedColumnConfigOfForeignTousseApplicationForm"); for (TousseItem tousseItem : tousseItems) { String tousseName = tousseItem.getTousseName(); TousseDefinition td = tousseDefinitionManager.getForeignTousseDefinitionByTousseItem(tousseItem); @@ -314,6 +321,11 @@ jsonobj.put("urgentLevelId", urgentLevelObj.getId()); } jsonobj.put("packed", false); + //ZSYY-330新增扩展表格列“装配状态”和“灭菌状态” + //"待装配"、"已装配" + jsonobj.put("packingState", "待装配"); + //"待灭菌"、"部分灭菌"、"已灭菌" + jsonobj.put("sterilizationState", "待灭菌"); // 判断物品是否为“已使用”(包括拆分的小包部分是已使用,部分是未使用,都算已使用) boolean used = false; if(CollectionUtils.isNotEmpty(tiList)){ @@ -324,6 +336,33 @@ } } jsonobj.put("packed", true); + if(StringUtils.isNotBlank(extendedColumnConfigOfForeignTousseApplicationForm) + && StringUtils.equals(tousseItem.getPackageStatus(), ForeignTousseApplication.RECYCLINGSTATUS_AWAITRECEIVED)){ + jsonobj.put("packingState", "已装配"); + Map sterilizationIdMap = getSterilizationIdMap(tiList); + int sterilizationAmount = 0; + if(MapUtils.isNotEmpty(sterilizationIdMap)){ + for (TousseInstance ti : tiList) { + if(DatabaseUtil.isPoIdValid(sterilizationIdMap.get(ti.getId()))){ + sterilizationAmount++; + } + } + } + if(sterilizationAmount > 0){ + if(sterilizationAmount >= tiList.size()){ + jsonobj.put("sterilizationState", "已灭菌"); + }else{ + jsonobj.put("sterilizationState", "部分灭菌"); + } + } + if(StringUtils.contains(extendedColumnConfigOfForeignTousseApplicationForm, "\"packingState\"")){ + jsonobj.put("packageStatus", "已装配"); + } + if(StringUtils.contains(extendedColumnConfigOfForeignTousseApplicationForm, "\"sterilizationState\"") + && sterilizationAmount > 0){ + jsonobj.put("packageStatus", jsonobj.optString("sterilizationState")); + } + } } jsonobj.put("used", used); boolean isRecycled = (tousseItem.getRecyclingAmount() != null && tousseItem.getRecyclingAmount() > 0); @@ -430,6 +469,41 @@ return jsonArray; } + /** + * 查询器械包实例的灭菌记录ID + * @param tiList + * @return + */ + private Map getSterilizationIdMap(List tiList) { + Map sterilizationIdMap = new HashMap(); + if(CollectionUtils.isEmpty(tiList)){ + return sterilizationIdMap; + } + List tousseInstanceIdList = new ArrayList(); + for(TousseInstance ti : tiList){ + tousseInstanceIdList.add(ti.getId()); + } + String sql = String.format("select ti.id, case when ti.sterilizationRecord_id is not null then ti.sterilizationRecord_id else sti.sterilizationRecord_id end sterilizationRecordId " + + "from %s ti " + + "left join sterilization_tousseInstance sti on sti.tousseInstance_id = ti.id where %s", + TousseInstance.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.id", tousseInstanceIdList)); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + Long id = rs.getLong("id"); + Long sterilizationRecordId = rs.getLong("sterilizationRecordId"); + sterilizationIdMap.put(id, sterilizationRecordId); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return sterilizationIdMap; + } + private void responsePrint(String result) { HttpServletResponse response = StrutsParamUtils.getResponse(); response.setCharacterEncoding("UTF-8"); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java =================================================================== diff -u -r34864 -r35719 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java (.../ForeignTousseApplicationTableManager.java) (revision 34864) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java (.../ForeignTousseApplicationTableManager.java) (revision 35719) @@ -2,14 +2,17 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang.StringUtils; import com.forgon.component.grid.GridManager; @@ -19,15 +22,18 @@ import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.supplier.Supplier; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.foreigntousseapplication.service.ForeignTousseApplicationManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousse.toussedefinition.vo.SplitForeignTousseVo; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ConfigUtils; import com.forgon.tools.util.SqlUtils; /** @@ -134,10 +140,213 @@ if (showForeignTousseApplicationBarcode) { result = foreignTousseApplicationBarcodeHandler(result); } + + // 外来器械包申请单扩展列 ZSYY-330 【外来器械申请单】视图列表新增扩展表格列“装配状态”和“灭菌状态” + String extendedColumnConfigOfForeignTousseApplicationForm = + ConfigUtils.getSystemSetConfigByName("extendedColumnConfigOfForeignTousseApplicationForm"); + if(StringUtils.isNotBlank(extendedColumnConfigOfForeignTousseApplicationForm) + && (StringUtils.contains(extendedColumnConfigOfForeignTousseApplicationForm, "\"packingState\"") + || StringUtils.contains(extendedColumnConfigOfForeignTousseApplicationForm, "\"sterilizationState\""))){ + //“装配状态”、“灭菌状态” + result = foreignTousseApplicationPackingStateSterilizationStateHandler(result); + } + return result; } /** + * 关联查询外来器械包申请单的“灭菌状态” + * @param result + * @return + */ + private String foreignTousseApplicationPackingStateSterilizationStateHandler(String result) { + if (StringTools.isNotBlank(result)) { + JSONObject resultJsonObj = JSONObject.fromObject(result); + if (resultJsonObj != null) { + JSONArray rows = resultJsonObj.optJSONArray("rows"); + if(rows == null || rows.size() == 0){ + return result; + } + List foreignTousseApplicationIdList = new ArrayList(); + for (Object row : rows) { + JSONObject obj = (JSONObject) row; + Long id = obj.optLong("id"); + foreignTousseApplicationIdList.add(id); + } + if(CollectionUtils.isEmpty(foreignTousseApplicationIdList)){ + return result; + } + //外来器械包申请单各个申请项的灭菌数量map + Map> foreignTousseAppTousseIdSterilizationAmountMap = new HashMap>(); + //外来器械包申请单各个申请项的装配数量map + Map> foreignTousseAppTousseIdPackingAmountMap = new HashMap>(); + String sql = String.format("select ti.foreignTousseApp_id, ti.id tousseInstanceID" + + ", case when td.parentID is not null then td.parentID else td.id end tdParentId" + + ", case when ti.sterilizationRecord_id is not null then ti.sterilizationRecord_id else sti.sterilizationRecord_id end sterilizationRecordId " + + "from %s ti " + + "join %s td on td.id = ti.tousseDefinition_id " + + "left join sterilization_tousseInstance sti on sti.tousseInstance_id = ti.id where %s ", + TousseInstance.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.foreignTousseApp_id", foreignTousseApplicationIdList)); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + Long foreignTousseApp_id = rs.getLong("foreignTousseApp_id"); + Long tdParentId = rs.getLong("tdParentId"); + Long tousseInstanceID = rs.getLong("tousseInstanceID"); + Long sterilizationRecordId = rs.getLong("sterilizationRecordId"); + if(foreignTousseApp_id == null || tdParentId == null){ + continue; + } + if(DatabaseUtil.isPoIdValid(sterilizationRecordId)){ + Map tousseIdSterilizationAmountMap = foreignTousseAppTousseIdSterilizationAmountMap.get(foreignTousseApp_id); + if(tousseIdSterilizationAmountMap == null){ + tousseIdSterilizationAmountMap = new HashMap(); + } + Integer sterilizationAmount = tousseIdSterilizationAmountMap.get(tdParentId); + if(sterilizationAmount == null){ + sterilizationAmount = 0; + } + sterilizationAmount++; + tousseIdSterilizationAmountMap.put(tdParentId, sterilizationAmount); + foreignTousseAppTousseIdSterilizationAmountMap.put(foreignTousseApp_id, tousseIdSterilizationAmountMap); + } + if(DatabaseUtil.isPoIdValid(tousseInstanceID)){ + Map tousseIdPackingAmountMap = foreignTousseAppTousseIdPackingAmountMap.get(foreignTousseApp_id); + if(tousseIdPackingAmountMap == null){ + tousseIdPackingAmountMap = new HashMap(); + } + Integer packingAmount = tousseIdPackingAmountMap.get(tdParentId); + if(packingAmount == null){ + packingAmount = 0; + } + packingAmount++; + tousseIdPackingAmountMap.put(tdParentId, packingAmount); + foreignTousseAppTousseIdPackingAmountMap.put(foreignTousseApp_id, tousseIdPackingAmountMap); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + if(MapUtils.isEmpty(foreignTousseAppTousseIdPackingAmountMap) + && MapUtils.isEmpty(foreignTousseAppTousseIdSterilizationAmountMap)){ + return result; + } + Map foreignTousseApplicationMap = new HashMap(); + @SuppressWarnings("unchecked") + List foreignTousseApplicationList = objectDao.findByIds(ForeignTousseApplication.class.getSimpleName(), foreignTousseApplicationIdList); + if(CollectionUtils.isNotEmpty(foreignTousseApplicationList)){ + for (ForeignTousseApplication foreignTousseApplication : foreignTousseApplicationList) { + foreignTousseApplicationMap.put(foreignTousseApplication.getId(), foreignTousseApplication); + } + } + for (Object row : rows) { + JSONObject obj = (JSONObject) row; + Long id = obj.optLong("id"); + //装配状态 + String packingState = "待装配"; + //灭菌状态 + String sterilizationState = "待灭菌"; + //申请项数量(不包含已终止的申请项) + int applicationTousseItemAmount = 0; + //已经装配的申请项数量 + int packingTousseItemAmount = 0; + //已经灭菌的器械包实例数量 + int sterilizationTousseInstanceAmount = 0; + //装配产生的器械包实例数量+待装配的外来器械包的申请数量 + int tousseInstanceAmount = 0; + ForeignTousseApplication foreignTousseApplication = foreignTousseApplicationMap.get(id); + if(foreignTousseApplication.ended()){ + //申请单被终止时,装配状态、灭菌状态都显示"已终止" + packingState = "已终止"; + sterilizationState = "已终止"; + obj.put("packingState", packingState); + obj.put("sterilizationState", sterilizationState); + continue; + } + List applicationItems = foreignTousseApplication.getApplicationItems(); + if(CollectionUtils.isNotEmpty(applicationItems)){ + Map tousseIdPackingAmountMap = foreignTousseAppTousseIdPackingAmountMap.get(id); + Map tousseIdSterilizationAmountMap = foreignTousseAppTousseIdSterilizationAmountMap.get(id); + for (TousseItem tousseItem : applicationItems) { + //终止的不需要计算装配状态、灭菌状态 + if(tousseItem.terminated()){ + continue; + } + + //申请项数量 + applicationTousseItemAmount++; + + //装配产生的器械包实例数量,包含拆分小包 + Integer packingAmount = 0; + if(MapUtils.isNotEmpty(tousseIdPackingAmountMap)){ + packingAmount = tousseIdPackingAmountMap.get(tousseItem.getTousseDefinitionId()); + if(packingAmount == null){ + packingAmount = 0; + } + if(packingAmount > 0){ + //已经装配的申请项数量 + packingTousseItemAmount++; + //装配产生的器械包实例数量 + tousseInstanceAmount += packingAmount; + } + } + if(packingAmount == 0){ + //还没装配的,取申请数量作为装配的包数量,用于比较申请单上物品是否都已经灭菌 + tousseInstanceAmount += tousseItem.getAmount(); + } + + //灭菌数量处理 + if(MapUtils.isNotEmpty(tousseIdSterilizationAmountMap)){ + //已经灭菌的器械包实例数量 + Integer sterilizationAmount = tousseIdSterilizationAmountMap.get(tousseItem.getTousseDefinitionId()); + if(sterilizationAmount == null){ + sterilizationAmount = 0; + } + if(sterilizationAmount > 0){ + sterilizationTousseInstanceAmount += sterilizationAmount; + } + } + } + + //比较已经装配的申请项数量及申请项数量,判断装配状态: + //已经装配的申请项数量>=申请项数量,装配状态为"已装配"; + //已经装配的申请项数量<申请项数量,装配状态为"部分装配"; + if(packingTousseItemAmount > 0){ + if(packingTousseItemAmount >= applicationTousseItemAmount){ + packingState = "已装配"; + }else{ + packingState = "部分装配"; + } + } + + //比较已经灭菌的器械包实例数量和(装配产生的器械包实例数量+待装配的申请数量),判断灭菌状态 + //已经灭菌的器械包实例数量>=(装配产生的器械包实例数量+待装配的申请数量),灭菌状态为"已灭菌"; + //已经灭菌的器械包实例数量<(装配产生的器械包实例数量+待装配的申请数量),灭菌状态为"部分灭菌"; + if(sterilizationTousseInstanceAmount > 0){ + if(sterilizationTousseInstanceAmount >= tousseInstanceAmount){ + sterilizationState = "已灭菌"; + }else{ + sterilizationState = "部分灭菌"; + } + } + } + obj.put("packingState", packingState); + obj.put("sterilizationState", sterilizationState); + } + + result = resultJsonObj.toString(); + } + } + return result; + } + + /** * 重新获取每张外来器械包申请单所关联的外来器械包实例条码 * @param result * @return