Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java =================================================================== diff -u -r30173 -r30917 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 30173) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 30917) @@ -2,6 +2,8 @@ import java.io.IOException; import java.io.PrintWriter; +import java.sql.ResultSet; +import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -53,6 +55,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.TousseDefinitionTemplateItem; 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.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; @@ -83,8 +86,10 @@ import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ConfigUtils; import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.PageUtil; +import com.forgon.tools.util.SqlUtils; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.opensymphony.xwork2.ModelDriven; @@ -653,6 +658,16 @@ String left = goodFilterConfigManagerImpl.buildBWListTemplate(leftStoreJson.toString(), orgunitCodes); String right = goodFilterConfigManagerImpl.buildBWListTemplate(rightStoreJson.toString(), orgunitCodes); + + // SZYK-35 物品预约单改进为支持显示库存数量以及可限制预约数量不能大于库存数量 + Boolean showTousseStorageAmountOfGoodsReservation = + ConfigUtils.getSystemSetConfigByNameBool("showTousseStorageAmountOfGoodsReservation"); + if(showTousseStorageAmountOfGoodsReservation + && StringUtils.equals(applicationFormType, InvoicePlan.TYPE_GOODS_RESERVATION_FORM)){ + left = calStorageForTousseDefinition(left); + right = calStorageForTousseDefinition(right); + } + leftStore.put("children", left); rightStore.put("children", right); @@ -664,6 +679,59 @@ } /** + * 物品预约单改进为支持显示库存数量(SZYK-35): + * 在物品名称的右侧会显示物品的库存数量(已灭菌或者已消毒状态的物品的数量) + * 需要开启配置项showTousseStorageAmountOfGoodsReservation:true + * @param templateJson + */ + private String calStorageForTousseDefinition(String templateJson) { + JSONArray jsonArray = JSONArray.fromObject(templateJson); + List tousseDefinitionIdList = new ArrayList(); + for (int i = 0, size = jsonArray.size(); i < size; i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String tousseType = jsonObject.getString("tousseType"); + if(!StringUtils.equals(DisposableGoods.TYPE_NAME, tousseType)){ + Long tousseDefinitionID = jsonObject.getLong("tousseDefinitionID"); + tousseDefinitionIdList.add(tousseDefinitionID); + } + } + if(CollectionUtils.isEmpty(tousseDefinitionIdList)){ + return templateJson; + } + Map storageMap = new HashMap(); + String sql = String.format("select count(*) storage, td.ancestorID from TousseInstance ti inner join TousseDefinition td on td.id=ti.tousseDefinition_id " + + "where %s and (ti.status='%s' or (td.tousseType='%s' and status='%s')) group by td.ancestorID;", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("td.ancestorID", tousseDefinitionIdList), + TousseInstance.STATUS_STERILED,TousseDefinition.PACKAGE_TYPE_DISINFECTION, + TousseInstance.STATUS_DISINFECTED); + ResultSet rs = null; + rs = objectDao.executeSql(sql); + try { + while(rs.next()){ + Integer storage = rs.getInt("storage"); + Long tdId = rs.getLong("ancestorID"); + storageMap.put(tdId, storage); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + if(!storageMap.isEmpty()){ + for (int i = 0, size = jsonArray.size(); i < size; i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String tousseType = jsonObject.getString("tousseType"); + if(!StringUtils.equals(DisposableGoods.TYPE_NAME, tousseType)){ + Long tousseDefinitionID = jsonObject.getLong("tousseDefinitionID"); + Integer storage = storageMap.get(tousseDefinitionID); + jsonObject.put("storage", storage == null ? 0 : storage); + } + } + } + return jsonArray.toString(); + } + + /** * 获得对应的一次性物品信息. * @param tousseItem 一次物品的申请项 * @param diposableFloatPercent 浮动价格 Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java =================================================================== diff -u -r30420 -r30917 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 30420) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 30917) @@ -9,6 +9,8 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; +import java.sql.ResultSet; +import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -106,6 +108,7 @@ import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ConfigUtils; import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.PageUtil; import com.forgon.tools.util.SpringUtils; @@ -2070,6 +2073,8 @@ //是否包含指定的一次性物品类型,格式:{include:是否包含,disposableTypes:'一次性物品类型集合'} String specifyDisposableTypes = StrutsParamUtils.getPraramValue("specifyDisposableTypes", ""); + //申请单类型 + String applicationType = StrutsParamUtils.getPraramValue("applicationType", ""); TousseDefinitionHelper tousseDefinitionHelper = TousseDefinitionHelper.getInstance(); tousseDefinitionHelper.setTousseDefinitionManager(tousseDefinitionManager); @@ -2182,13 +2187,15 @@ mapDataList.addAll(mapList2); totalCount = mapDataList.size(); } + calStorageForTousseDefinition(mapDataList, applicationType); result.put("totalCount", totalCount); result.put("data", mapDataList); json = JSONObject.fromObject(result); }else{ //申请时处理科室为空的是不合理的 Map result = tousseDefinitionManager.searchComboGoods(spell, tousseType,showReferencePrice,showExternalCodeOfDisposableGoods,settleAccountsDepartCoding,null,true); List> mapList = (List>)result.get("data"); List> mapDataList = mapList; + calStorageForTousseDefinition(mapDataList, applicationType); if(limit > 0){ int fromIndex = start; int toIndex = fromIndex + limit; @@ -2214,6 +2221,71 @@ } /** + * 物品预约单改进为支持显示库存数量(SZYK-35): + * 在物品名称的右侧会显示物品的库存数量(已灭菌或者已消毒状态的物品的数量) + * 需要开启配置项showTousseStorageAmountOfGoodsReservation:true + * @param mapDataList + * @param tousseType + */ + private void calStorageForTousseDefinition( List> mapDataList, String applicationType) { + if(CollectionUtils.isEmpty(mapDataList)){ + return; + } + Boolean showTousseStorageAmountOfGoodsReservation = + ConfigUtils.getSystemSetConfigByNameBool("showTousseStorageAmountOfGoodsReservation"); + if(!showTousseStorageAmountOfGoodsReservation){ + return; + } + if(!StringUtils.equals(applicationType, InvoicePlan.TYPE_GOODS_RESERVATION_FORM)){ + return; + } + List tousseDefinitionIds = new ArrayList(); + for (Map map : mapDataList) { + String type = (String) map.get("type"); + Long id = (Long) map.get("id"); + if(!StringUtils.equals(type, DisposableGoods.TYPE_NAME)){ + tousseDefinitionIds.add(id); + } + } + if(CollectionUtils.isEmpty(tousseDefinitionIds)){ + return; + } + Map storageMap = new HashMap(); + String sql = String.format("select count(*) storage, td.ancestorID from TousseInstance ti inner join TousseDefinition td on td.id=ti.tousseDefinition_id " + + "where %s and (ti.status='%s' or (td.tousseType='%s' and status='%s')) group by td.ancestorID;", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("td.ancestorID", tousseDefinitionIds), + TousseInstance.STATUS_STERILED,TousseDefinition.PACKAGE_TYPE_DISINFECTION, + TousseInstance.STATUS_DISINFECTED); + ResultSet rs = null; + rs = objectDao.executeSql(sql); + try { + while(rs.next()){ + Integer storage = rs.getInt("storage"); + Long tdId = rs.getLong("ancestorID"); + storageMap.put(tdId, storage); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + for (Map map : mapDataList) { + String type = (String) map.get("type"); + Long id = (Long) map.get("id"); + if(!StringUtils.equals(type, DisposableGoods.TYPE_NAME)){ + String displayName = map.get("displayName") + "(库存:"; + Integer amount = storageMap.get(id); + displayName += (amount == null?0:amount); + displayName += ")"; + map.put("displayName", displayName); + map.put("storage", amount == null?0:amount); + } + } + + } + + /** * 搜索物品(1、一次性物品 2、器械包、敷料包、消毒物品)用于物品绑定 */ public void searchGoodsDataForGoodsBind() { Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r30801 -r30917 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 30801) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 30917) @@ -4169,6 +4169,16 @@ return checkResult; } } + + //物品预约单改进为支持显示库存数量以及可限制预约数量不能大于库存数量(已灭菌或者已消毒状态的物品的数量)SZYK-35 + boolean notAllowReservationAmountGreaterThanStorageAmount = CssdUtils.getSystemSetConfigByNameBool("notAllowReservationAmountGreaterThanStorageAmount", false); + if(notAllowReservationAmountGreaterThanStorageAmount && InvoicePlan.TYPE_GOODS_RESERVATION_FORM.equals(recyclingApplication.getType())){ + JSONObject checkResult = checkTousseAmountInReservation(srcTousseItemVoList); + if(checkResult != null){ + return checkResult; + } + } + //验证科室名称和科室编码是否一致 if (!validateDepartment(recyclingApplication.getDepartCoding(), recyclingApplication.getDepart())) { return JSONUtil.buildJsonObject(false, "申请科室名称和科室编码不一致,请联系系统管理员!"); @@ -4377,8 +4387,64 @@ return submitRecyclingApplication(recyclingApplication, restApplyResult, committedStatus); } } + + /** + * 验证物品预约单添加器械包时,库存数量是否足够(SZYK-35) + * @param srcTousseItemVoList + * @return + */ + private JSONObject checkTousseAmountInReservation( + Collection srcTousseItemVoList) { + JSONObject obj = null; + + List tousseDefinitionIdList = new ArrayList(); + for (TousseItemVo tousseItemVo : srcTousseItemVoList) { + if(StringUtils.equals(tousseItemVo.getDiposable(), Constants.DIPOSABLE_TYPE_NO)){ + tousseDefinitionIdList.add(tousseItemVo.getTousseDefinitionID()); + } + } + + if(CollectionUtils.isEmpty(tousseDefinitionIdList)){ + return obj; + } + + StringBuffer result = new StringBuffer(); + Map storageMap = new HashMap(); + String sql = String.format("select count(*) storage, td.ancestorID from TousseInstance ti inner join TousseDefinition td on td.id=ti.tousseDefinition_id " + + "where %s and (ti.status='%s' or (td.tousseType='%s' and status='%s')) group by td.ancestorID;", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("td.ancestorID", tousseDefinitionIdList), + TousseInstance.STATUS_STERILED,TousseDefinition.PACKAGE_TYPE_DISINFECTION, + TousseInstance.STATUS_DISINFECTED); + ResultSet rs = null; + rs = objectDao.executeSql(sql); + try { + while(rs.next()){ + Integer storage = rs.getInt("storage"); + Long tdId = rs.getLong("ancestorID"); + storageMap.put(tdId, storage); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + for (TousseItemVo tousseItemVo : srcTousseItemVoList) { + if(StringUtils.equals(tousseItemVo.getDiposable(), Constants.DIPOSABLE_TYPE_NO)){ + Integer storage = storageMap.get(tousseItemVo.getTousseDefinitionID()); + int existingAmount = storage == null ? 0 : storage.intValue(); + int amount = tousseItemVo.getAmount().intValue(); + if(amount > existingAmount){ + result.append(tousseItemVo.getTousseName() + "库存数量不足,可预约物品库存数量为" + existingAmount + "。"); + } + } + } + if(StringUtils.isNotBlank(result.toString())){ + obj = JSONUtil.buildJsonObject(false, result.toString()); + } + return obj; + } - /** * 验证借物单添加器械包时,库存数量是否足够 * 此方法从recyclingApplicationAction移过来