Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/Storage_TousseInstance.java =================================================================== diff -u -r35499 -r37769 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/Storage_TousseInstance.java (.../Storage_TousseInstance.java) (revision 35499) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/Storage_TousseInstance.java (.../Storage_TousseInstance.java) (revision 37769) @@ -4,6 +4,8 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -18,6 +20,8 @@ @DynamicInsert(false) @DynamicUpdate(true) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +@Table(name = "Storage_TousseInstance",indexes = {@Index(columnList = "tousseInstanceId", name = "sti_ti_id_index"), +@Index(columnList = "storageLocationId", name = "sti_st_id_index")}) public class Storage_TousseInstance { /** Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/dwr/table/OperationReservationTableManager.java =================================================================== diff -u -r37681 -r37769 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/dwr/table/OperationReservationTableManager.java (.../OperationReservationTableManager.java) (revision 37681) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/dwr/table/OperationReservationTableManager.java (.../OperationReservationTableManager.java) (revision 37769) @@ -1,8 +1,17 @@ package com.forgon.disinfectsystem.operationreservation.dwr.table; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import com.forgon.Constants; @@ -12,9 +21,12 @@ import com.forgon.disinfectsystem.entity.basedatamanager.operationRoom.OperationRoom; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.operationreservation.OperationReservation; -import com.forgon.disinfectsystem.operationreservation.service.OperationReservationManager; import com.forgon.security.service.OperationManager; +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; /** * @author wangyi @@ -25,21 +37,30 @@ private GridManager gridManager; - private OperationReservationManager operationReservationManager; - private DateQueryAdapter dateQueryAdapter; private OperationManager operationManager; + private ObjectDao objectDao; + + public static final String TAKE_OUT_STATUS_BLANK = "空白"; + + public static final String TAKE_OUT_STATUS_TO_TAKE_OUT = "待取出"; + + public static final String TAKE_OUT_STATUS_TAKE_OUT_PARTIALLY = "部分取出"; + + public static final String TAKE_OUT_STATUS_TAKEN_OUT = "已取出"; + + public static final String TAKE_OUT_STATUS_END = "已终止"; + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + public void setOperationManager(OperationManager operationManager) { this.operationManager = operationManager; } - public void setOperationReservationManager( - OperationReservationManager operationReservationManager) { - this.operationReservationManager = operationReservationManager; - } - public void setGridManager(GridManager gridManager) { this.gridManager = gridManager; } @@ -109,14 +130,266 @@ operatingRoomValidateSql = " and operatingRoom in (select operationRoomName from "+ OperationRoom.class.getSimpleName() +" where isInvoice='"+ Constants.STR_YES +"') "; } + //“取出状态”查询条件BJDXZLYY-52 + String takeOutStatusSql = buildTakeOutStatusSql(sqlWhereParamMap); + sqls.append(takeOutStatusSql); + String sql = " where 1=1 " + operatingRoomValidateSql + sqls.toString(); - return gridManager + String json = gridManager .renderGrid(parameterMap, OperationReservation.class.getSimpleName(), sql, new String[] { "invoice","applicationItems" }); + + //“手术预约管理列表”中新增表格列“取出状态”BJDXZLYY-52 + json = returnTakeOutStatus(json); + + return json; } + /** + * “取出状态”查询条件BJDXZLYY-52 + * @param sqlWhereParamMap + * @return + */ + private String buildTakeOutStatusSql(Map sqlWhereParamMap) { + boolean enableOperationReservationShippedToTraysOfKardexContainer = + ConfigUtils.getSystemSetConfigByNameBool("enableOperationReservationShippedToTraysOfKardexContainer"); + if(!enableOperationReservationShippedToTraysOfKardexContainer){ + return ""; + } + String takeOutStatus = sqlWhereParamMap.get("takeOutStatus"); + //takeOutStatus = "已终止;已取出;待取出;部分取出"; + if(StringUtils.isBlank(takeOutStatus)){ + return ""; + } + + if(StringUtils.contains(takeOutStatus, "全部")){ + return ""; + } + + String sql = ""; + + //存在“待取出”的物品 + String inSql = new StringBuffer() + .append(" (select 1 from Invoice i ") + .append(", TousseInstance ti ") + .append(", Storage_TousseInstance st ") + .append("where ti.lastStorageLocationId is not null ") + .append("and st.tousseInstanceId = ti.id ") + .append("and (i.id = ti.invoice_id or i.id = ti.invoice2_id) ") + .append("and i.invoicePlan.id = po.id ") + .append(") ").toString(); + //存在“已取出”的物品 + String outSql = new StringBuffer() + .append(" (select 1 from Invoice i ") + .append(", TousseInstance ti ") + .append("where ti.lastStorageLocationId is not null ") + .append("and (i.id = ti.invoice_id or i.id = ti.invoice2_id) ") + .append("and ti.id not in (select tousseInstanceId from Storage_TousseInstance) ") + .append("and i.invoicePlan.id = po.id ") + .append(") ").toString(); + + List storageStatusSql = new ArrayList(); + + //已终止 + if(StringUtils.contains(takeOutStatus, TAKE_OUT_STATUS_END)){ + //存在“待取出”的物品并且不存在“已取出”的物品并且申请单已经终止 + String tempSql = String.format(" ( exists %s and not exists %s and po.endStatus = '%s') ", inSql, outSql, InvoicePlan.STATUS_END); + storageStatusSql.add(tempSql); + } + + //部分取出 + if(StringUtils.contains(takeOutStatus, TAKE_OUT_STATUS_TAKE_OUT_PARTIALLY)){ + //存在“待取出”的物品并且存在“已取出”的物品 + String tempSql = String.format(" ( exists %s and exists %s ) ", inSql, outSql); + storageStatusSql.add(tempSql); + } + + //已取出 + if(StringUtils.contains(takeOutStatus, TAKE_OUT_STATUS_TAKEN_OUT)){ + //不存在“待取出”的物品并且存在“已取出”的物品 + String tempSql = String.format(" ( not exists %s and exists %s ) ", inSql, outSql); + storageStatusSql.add(tempSql); + } + + //待取出 + if(StringUtils.contains(takeOutStatus, TAKE_OUT_STATUS_TO_TAKE_OUT)){ + //存在“待取出”的物品并且不存在“已取出”的物品 + String tempSql = String.format(" ( exists %s and not exists %s ) and (po.endStatus is null or po.endStatus <> '%s') ", inSql, outSql, InvoicePlan.STATUS_END); + storageStatusSql.add(tempSql); + } + + //空白 + if(StringUtils.contains(takeOutStatus, TAKE_OUT_STATUS_BLANK)){ + //物品没有入库记录 + String tempSql = String.format(" ( not exists %s and not exists %s ) ", inSql, outSql); + storageStatusSql.add(tempSql); + } + + if(CollectionUtils.isNotEmpty(storageStatusSql)){ + sql = " and (" + StringTools.join(storageStatusSql, " or ") + ") "; + } + + return sql; + } + + /** + * “手术预约管理列表”中新增表格列“取出状态”BJDXZLYY-52 + * @param json + * @return + */ + private String returnTakeOutStatus(String json) { + + boolean enableOperationReservationShippedToTraysOfKardexContainer = + ConfigUtils.getSystemSetConfigByNameBool("enableOperationReservationShippedToTraysOfKardexContainer"); + if(!enableOperationReservationShippedToTraysOfKardexContainer){ + return json; + } + + JSONObject jsonObject = JSONObject.fromObject(json); + if(jsonObject == null){ + return json; + } + JSONArray jsonArray = jsonObject.optJSONArray("rows"); + if (jsonArray == null || jsonArray.size() == 0) { + return json; + } + Map endStatusMap = new HashMap(); + List idList = new ArrayList(); + for(int i=0; i storageStatusMap = loadOperationReservationGoodsStorageStatusMap(idList, endStatusMap); + if(MapUtils.isEmpty(storageStatusMap)){ + return json; + } + for(int i=0; i loadOperationReservationGoodsStorageStatusMap(List idList, Map endStatusMap) { + Map storageStatusMap = new HashMap(); + if(CollectionUtils.isEmpty(idList)){ + return storageStatusMap; + } + String invoiceIdSql = SqlUtils.getNonStringFieldInLargeCollectionsPredicate("i.invoicePlan_ID", idList); + StringBuffer sql = new StringBuffer("select * from ("); + sql.append("select i.invoicePlan_ID, st.storageLocationId "); + sql.append("from invoice i "); + sql.append("join TousseInstance ti on ti.invoice_id = i.id "); + sql.append("left join Storage_TousseInstance st on st.tousseInstanceId = ti.id "); + sql.append("where 1=1 "); + sql.append("and ti.lastStorageLocationId is not null "); + sql.append("and " + invoiceIdSql); + sql.append("union all "); + sql.append("select i.invoicePlan_ID, st.storageLocationId "); + sql.append("from invoice i "); + sql.append("join TousseInstance ti on ti.invoice2_id = i.id "); + sql.append("left join Storage_TousseInstance st on st.tousseInstanceId = ti.id "); + sql.append("where 1=1 "); + sql.append("and ti.lastStorageLocationId is not null "); + sql.append("and " + invoiceIdSql); + sql.append(") rs"); + + Map inStorageAmountMap = new HashMap(); + Map amountMap = new HashMap(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql.toString()); + while(rs.next()){ + Long invoicePlanID = rs.getLong("invoicePlan_ID"); + //物品所在库位的ID + Long storageLocationId = rs.getLong("storageLocationId"); + //统计入库的数量 + Integer amount = amountMap.get(invoicePlanID); + if(amount == null){ + amount = 0; + } + amount++; + amountMap.put(invoicePlanID, amount); + //统计在库的数量 + Integer inAmount = inStorageAmountMap.get(invoicePlanID); + if(inAmount == null){ + inAmount = 0; + } + if(DatabaseUtil.isPoIdValid(storageLocationId)){ + inAmount++; + } + inStorageAmountMap.put(invoicePlanID, inAmount); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + if(MapUtils.isEmpty(amountMap)){ + return storageStatusMap; + } + + for (Entry entry : amountMap.entrySet()) { + Long invoicePlanID = entry.getKey(); + //入库数量 + Integer amount = entry.getValue() == null ? 0 : entry.getValue(); + //在库数量 + Integer inStorageAmount = inStorageAmountMap.get(invoicePlanID) == null ? 0 : inStorageAmountMap.get(invoicePlanID); + if(amount == 0){ + //没有入库记录 + storageStatusMap.put(invoicePlanID, ""); + continue; + } + if(inStorageAmount == 0){ + storageStatusMap.put(invoicePlanID, TAKE_OUT_STATUS_TAKEN_OUT); + continue; + } + if(inStorageAmount == amount){ + String endStatus = endStatusMap.get(invoicePlanID); + if(StringUtils.equals(endStatus, InvoicePlan.STATUS_END)){ + //该手术预约单内物品都没有被取出时被终止,显示此状态; + storageStatusMap.put(invoicePlanID, TAKE_OUT_STATUS_END); + }else{ + storageStatusMap.put(invoicePlanID, TAKE_OUT_STATUS_TO_TAKE_OUT); + } + continue; + } + if(inStorageAmount < amount){ + storageStatusMap.put(invoicePlanID, TAKE_OUT_STATUS_TAKE_OUT_PARTIALLY); + continue; + } + } + + return storageStatusMap; + } + public String findWaitingForDeliveryOperationReservationTableList( Map> parameterMap) {