Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java =================================================================== diff -u -r26797 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java (.../StorageLocationAction.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java (.../StorageLocationAction.java) (revision 26816) @@ -24,17 +24,16 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageLocationManager; -import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageRecordManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageLocation; -import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageRecord; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; +import com.forgon.tools.string.StringTools; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; @@ -52,8 +51,6 @@ private StorageLocationManager storageLocationManager; - private StorageRecordManager storageRecordManager; - private WareHouseManager wareHouseManager; private ObjectDao objectDao; @@ -62,10 +59,6 @@ StorageLocationManager storageLocationManager) { this.storageLocationManager = storageLocationManager; } - - public void setStorageRecordManager(StorageRecordManager storageRecordManager) { - this.storageRecordManager = storageRecordManager; - } public void setWareHouseManager(WareHouseManager wareHouseManager) { this.wareHouseManager = wareHouseManager; @@ -147,8 +140,19 @@ map.put("success", true); JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter(new JsonPropertyFilter(new String[] { - "storageLocation"})); + "tousseDefinitionList"})); JSONObject jsonObject = JSONObject.fromObject(map, config); + List list = storageLocation.getTousseDefinitionList(); + String tdName = ""; + String tdIds = ""; + if (CollectionUtils.isNotEmpty(list)) { + for (TousseDefinition td : list) { + tdName = StringTools.uniteTwoStringBySemicolon(tdName, td.getName(), ";"); // 可放物品器械包定义名称 + tdIds = StringTools.uniteTwoStringBySemicolon(tdIds, td.getId().toString(), ";"); // 可放物品器械包定义id + } + } + jsonObject.getJSONObject("data").put("tousseDefinitionNames", tdName); + jsonObject.getJSONObject("data").put("tousseDefinitionIds", tdIds); // 用于前台展示 String jsonStr = jsonObject.toString(); try { StrutsParamUtils.getResponse().getWriter().println(jsonStr); @@ -177,53 +181,47 @@ String wareHouseName = StrutsParamUtils.getPraramValue("wareHouseName", ""); String parentId = StrutsParamUtils.getPraramValue("parentId", ""); String tousseDefinitionIds = StrutsParamUtils.getPraramValue("putInGoodsCode", null); - String tousseDefinitionNames = StrutsParamUtils.getPraramValue("putInGoods", null); if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(orgUnitCode) && StringUtils.isNotBlank(wareHouseId)) { - // 判断抽屉是否存放物品 - if (storageLocation.getId() == null) { - List storageRecordList = storageRecordManager.getStorageRecordByStorageLocation(parentId); - if (CollectionUtils.isNotEmpty(storageRecordList)) { - responce.put("success", false); - responce.put("message", "该库位有存放物品,不能再添加下级库位!"); - response.getWriter().print(responce.toString()); - return; - } - } - // 判断库位编码(用户自定义库位的唯一标识)是否重复 - if (StringUtils.isNotBlank(storageLocationCode)) { - List storageRecordList = storageLocationManager.getStorageLocationByCode(storageLocationCode); - if (CollectionUtils.isNotEmpty(storageRecordList)) { - responce.put("success", false); - responce.put("message", "库位编码为" + storageLocationCode + "的库位已存在!"); - response.getWriter().print(responce.toString()); - return; - } - } storageLocation.setName(name); storageLocation.setSimpleName(simpleName); storageLocation.setStorageLocationCode(storageLocationCode); storageLocation.setOrgUnitCode(orgUnitCode); storageLocation.setOrgUnitName(orgUnitName); storageLocation.setWareHouseId(wareHouseId); storageLocation.setWareHouseName(wareHouseName); - storageLocation.setTousseDefinitionIds(tousseDefinitionIds); - storageLocation.setTousseDefinitionNames(tousseDefinitionNames); - if (StringUtils.isNotBlank(parentId)) { - storageLocation.setParentId(Long.parseLong(parentId)); - StorageLocation parentStorageLocation = storageLocationManager.getStorageLocationById(parentId); - if (parentStorageLocation != null) { - if (StringUtils.isNotBlank(parentStorageLocation.getAncestorIds())) { - storageLocation.setAncestorIds(parentStorageLocation.getAncestorIds() + parentId + ";"); - } else { - storageLocation.setAncestorIds(parentId + ";"); + storageLocation.setType(BarcodeDevice.BARCODE_TYPE_WAREHOUSELOCATION); + // 设置可放物品 + if (StringUtils.isNotBlank(tousseDefinitionIds)) { + String[] ids = tousseDefinitionIds.split(";"); + List list = Arrays.asList(ids); + // 器械包定义 + List tdList = objectDao.findByIds(TousseDefinition.class.getSimpleName(), list); + String tousseDefinitionNames = ""; + if (CollectionUtils.isNotEmpty(tdList)) { + for (TousseDefinition td : tdList) { + tousseDefinitionNames = StringTools.uniteTwoStringBySemicolon(tousseDefinitionNames, td.getName(), ";"); } } + storageLocation.setTousseDefinitionList(tdList); + storageLocation.setTousseDefinitionNames(tousseDefinitionNames); } else { - storageLocation.setParentId(0L); - storageLocation.setAncestorIds(null); + storageLocation.setTousseDefinitionList(null); + storageLocation.setTousseDefinitionNames(null); } - storageLocation.setType(BarcodeDevice.BARCODE_TYPE_WAREHOUSELOCATION); - storageLocationManager.saveOfUpdate(storageLocation); + // 上级库位 + if (StringUtils.isNotBlank(parentId)) { + storageLocation.setParentId(Long.parseLong(parentId)); + } + // 保存库位 + try { + storageLocationManager.saveOfUpdate(storageLocation); + } catch (Exception e) { + responce.put("success", false); + responce.put("message", e.getMessage()); + response.getWriter().print(responce.toString()); + e.printStackTrace(); + return; + } } else { responce.put("success", false); responce.put("message", "保存失败!"); @@ -282,7 +280,7 @@ } /** - * 获取某个库位在树形视图上的路径 + * 获取某个库位在树形视图上的路径(/storageLocation;92784/storageLocation;92782/storage;10215/orgUnit;0) */ public void getTreePathById () { String id = StrutsParamUtils.getPraramValue("searchId", ""); @@ -329,11 +327,6 @@ } } -/* public void test() { - List list = storageLocationManager.getProgenyNodesByAncestorId("346269"); - System.out.println(list.size()); - }*/ - @Override public void prepare() throws Exception { String id = StrutsParamUtils.getPraramValue("id", null); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseDefinition.java =================================================================== diff -u -r26604 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseDefinition.java (.../TousseDefinition.java) (revision 26604) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseDefinition.java (.../TousseDefinition.java) (revision 26816) @@ -16,6 +16,9 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Index; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; @@ -45,6 +48,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.videomanager.VideoFile; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageLocation; import com.forgon.disinfectsystem.entity.idcarddefinition.IDCardDefinition; import com.forgon.disinfectsystem.idpredicate.IDAble; import com.forgon.tools.crypto.coder.CoderEncryption; @@ -574,6 +578,13 @@ * 最大标识牌数量 */ private Integer maxIDCardNum; + + /** + * 可存放的库位 + */ + @JsonIgnore + private List storageLocationList = new ArrayList(); + @Override @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -1840,4 +1851,14 @@ public void setMaxIDCardNum(Integer maxIDCardNum) { this.maxIDCardNum = maxIDCardNum; } + + @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY) + @JoinTable(name = "storageLocation_tousseDefinition", joinColumns = { @JoinColumn(name = "tousseDefinition_id") }, inverseJoinColumns = { @JoinColumn(name = "storageLocation_id") }) + public List getStorageLocationList() { + return storageLocationList; + } + + public void setStorageLocationList(List storageLocationList) { + this.storageLocationList = storageLocationList; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java =================================================================== diff -u -r26797 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java (.../StorageLocationManager.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java (.../StorageLocationManager.java) (revision 26816) @@ -135,5 +135,11 @@ * @return */ List getStorageLocationByCode(String storageLocationCode); + + /** + * 获取没有限制存放物品的库位 + * @return + */ + public List getUnLimitedStorageLocation(); } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r26793 -r26816 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 26793) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 26816) @@ -68,6 +68,7 @@ import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseDefinitionUtils; import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseInstanceUtils; import com.forgon.disinfectsystem.basedatamanager.urgent.service.UrgentLevelManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageLocationManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; @@ -79,6 +80,7 @@ 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.basedatamanager.warehouse.StorageLocation; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.becleanitem.ClassifiedItem; import com.forgon.disinfectsystem.entity.becleanitem.ClassifyBasket; @@ -239,6 +241,8 @@ private UrgentLevelManager urgentLevelManager; + private StorageLocationManager storageLocationManager; + public void setUrgentLevelManager(UrgentLevelManager urgentLevelManager) { this.urgentLevelManager = urgentLevelManager; } @@ -383,6 +387,11 @@ this.departmentStockManager = departmentStockManager; } + public void setStorageLocationManager( + StorageLocationManager storageLocationManager) { + this.storageLocationManager = storageLocationManager; + } + @Override public void delete(PackingTask task,String cause) { if (task != null) { @@ -4163,6 +4172,8 @@ }else if (toussesArray.size() > 0) { + //添加库位编码、库位简称、装配日期、检查人 + toussesArray = setStorageLocationForTousse(toussesArray); json.put("success", true); json.put("message", msg); json.put("tousses", toussesArray); @@ -4181,6 +4192,167 @@ return json.toString(); } + /** + * 添加库位编码、库位简称、装配日期、检查人 + * @param toussesArray + * @return + */ + private JSONArray setStorageLocationForTousse (JSONArray toussesArray) { + if (toussesArray == null || toussesArray.size() == 0) { + return toussesArray; + } + // 从toussesArray中获取包实例ID + List tousseInstanceIds = new ArrayList(); + for (int i = 0; i < toussesArray.size();i++) { + JSONObject tousseObj = toussesArray.getJSONObject(i); + if (tousseObj == null) { + continue; + } + tousseInstanceIds.add(tousseObj.getLong("id")); + } + // 包实例列表 + List tousseInstanceList = objectDao.findByIds(TousseInstance.class.getSimpleName(), tousseInstanceIds); + if (CollectionUtils.isEmpty(tousseInstanceList)) { + return toussesArray; + } + List unLimitedStorageLocation = storageLocationManager.getUnLimitedStorageLocation(); // 不限制存放物品的库位 + List packingRecordIds = new ArrayList(); // 装配记录ID + Map> storageLocationMap = new HashMap>(); // 库位Map(库位简称、库位编码) + Map tousseInstanceMap = new HashMap(); // 器械包实例Map(装配时间) + Map packingRecordMap = new HashMap(); // 装配任务Map(检查人) + Set tdList = new HashSet(); // 器械包定义ID + Map ancestorTousseIdsMap = new HashMap(); // 外来器械包祖先包定义Map(用于外来器械包拆包后,查找库位Map) + Set parentTousseIds = new HashSet();// 外来器械包拆包前的器械包的包定义ID + for (TousseInstance ti : tousseInstanceList) { + TousseDefinition td = ti.getTousseDefinition(); + packingRecordIds.add(ti.getPackingRecord_id()); + tousseInstanceMap.put(ti.getId(), ti); + if (td != null) { + if (StringUtils.equals(td.getTousseType(), TousseDefinition.PACKAGE_TYPE_FOREIGN)) { + // 外来器械包取祖先包ID + tdList.add(td.getAncestorID()); + } else if (StringUtils.equals(td.getTousseType(), TousseDefinition.PACKAGE_TYPE_SPLIT)) { + // 外来器械拆分小包-->parentTD + parentTousseIds.add(td.getParentID()); + } else { + // 普通器械包、外部代理灭菌包 + tdList.add(td.getId()); + } + } + } + + // 外来器械包拆包需要根据parentId查找ancestorId + if (CollectionUtils.isNotEmpty(parentTousseIds)) { + String sql = String.format(" where %s ", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", parentTousseIds)); + List parentTDList = objectDao.findBySql(TousseDefinition.class.getSimpleName(), sql); + if (CollectionUtils.isNotEmpty(parentTDList)) { + for (TousseDefinition td : parentTDList) { + // 外来器械包取祖先包ID parentTD-->ancestorTD + tdList.add(td.getAncestorID()); + ancestorTousseIdsMap.put(td.getId(), td.getAncestorID()); + } + } + } + + // 根据器械包定义ID查库位简称、库位编码 + String sql = String.format("select td.id, sl.simpleName, sl.storageLocationCode, sl.orgUnitName " + + "from StorageLocation sl join storageLocation_tousseDefinition ts on sl.id = ts.storageLocation_id " + + "join TousseDefinition td on td.id = ts.tousseDefinition_id " + + "and %s ", + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("td.id", tdList)); + ResultSet rs = objectDao.executeSql(sql); + try { + while (rs.next()) { + Long tdId = rs.getLong(1); + String simpleName = rs.getString(2); + String storageLocationCode = rs.getString(3); + String orgUnitName = rs.getString(4); + StorageLocation sl = new StorageLocation(); + sl.setSimpleName(simpleName); // 库位简称 + sl.setStorageLocationCode(storageLocationCode); // 库位编码 + sl.setOrgUnitName(orgUnitName); // 库位所在科室 + List list = storageLocationMap.get(tdId); + if (CollectionUtils.isEmpty(list)) { + list = new ArrayList(); + } + list.add(sl); + // 增加不限制存放物品的库位 + list.addAll(unLimitedStorageLocation); + storageLocationMap.put(tdId, list); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + // 装配任务列表 + List prList = objectDao.findByIds(PackingRecord.class.getSimpleName(), packingRecordIds); + for (PackingRecord pr : prList) { + packingRecordMap.put(pr.getTousseDefinitionId(), pr); + } + + // 处理返回的JSONArray + for (int i = 0; i < toussesArray.size();i++) { + JSONObject tousseObj = toussesArray.getJSONObject(i); + if (tousseObj == null) { + continue; + } + Long tousseInstanceId = tousseObj.getLong("id"); + if (tousseInstanceId == null) { + continue; + } + // 根据器械包实例ID获取库位、装配信息 + TousseInstance ti = tousseInstanceMap.get(tousseInstanceId); + if (ti == null) { + continue; + } + List slList = null; + TousseDefinition td = ti.getTousseDefinition(); + PackingRecord pr = packingRecordMap.get(ti.getTousseDefinition().getId()); // 装配记录 + if (StringUtils.equals(td.getTousseType(), TousseDefinition.PACKAGE_TYPE_FOREIGN)) { + slList = storageLocationMap.get(td.getAncestorID()); // 库位 + } else if (StringUtils.equals(td.getTousseType(), TousseDefinition.PACKAGE_TYPE_SPLIT)) { + pr = packingRecordMap.get(ti.getTousseDefinition().getParentID()); // 外来器械包拆包根据parentId查找装配任务 + Long ancestorId = ancestorTousseIdsMap.get(td.getParentID()); + slList = storageLocationMap.get(ancestorId); // 库位 + } else { + slList = storageLocationMap.get(td.getId()); // 库位 + } + if (CollectionUtils.isEmpty(slList)) { + slList = new ArrayList(); + slList.addAll(unLimitedStorageLocation); + } + Set simpleNameSet = new HashSet(); + String codes = ""; + String names = ""; + String orgUnitName = tousseObj.getString("depart"); + if (CollectionUtils.isNotEmpty(slList)) { + for (StorageLocation sl : slList) { + // 不是当前器械包实例所在科室下的库位不可用 + if (StringUtils.equals(orgUnitName, sl.getOrgUnitName())) { + codes = StringTools.uniteTwoStringBySemicolon(codes, sl.getStorageLocationCode(), "、"); + simpleNameSet.add(sl.getSimpleName()); + } + } + for (String name : simpleNameSet) { + names = StringTools.uniteTwoStringBySemicolon(names, name, "、"); + } + } + toussesArray.getJSONObject(i).put("simpleName", names); // 库位简称 + toussesArray.getJSONObject(i).put("storageLocationCode", codes); // 库位编码 + String operationTimeStr = ForgonDateUtils.safelyFormatDate(ti.getOperationTime(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDD, null); + toussesArray.getJSONObject(i).put("operationDate", operationTimeStr); // 装配时间 + if (pr == null) { + toussesArray.getJSONObject(i).put("inspectorName", ""); // 检查人 + } else { + toussesArray.getJSONObject(i).put("inspectorName", pr.getInspector()); // 检查人 + } + } + return toussesArray; + } + private void setPrintCause(PackingTask packingTask,JSONObject obj){ if(PackingTask.TASK_RETURNGOODS.equals(packingTask.getTaskType())){ obj.put("logPrintTousse", true); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java =================================================================== diff -u -r26620 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 26620) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 26816) @@ -82,6 +82,7 @@ import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ConfigUtils; +import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.PathUtils; import com.forgon.tools.xml.XMLUtil; import com.forgon.util.StringUtil; @@ -1506,6 +1507,8 @@ obj.put("reviewerToPrint", names.optString("reviewerToPrint")); obj.put("wrapper", tousseInstance.getWrapper()); obj.put("wrapperCode", tousseInstance.getWrapperCode()); + String operationTimeStr = ForgonDateUtils.safelyFormatDate(tousseInstance.getOperationTime(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDD, null); + obj.put("operationDate", operationTimeStr); // 装配日期 obj.put("sterilizationUserToPrint", names.optString("sterilizationUserToPrint")); obj.put("washOperator", names.optString("washOperatorToPrint")); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java =================================================================== diff -u -r26797 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java (.../StorageLocationManagerImpl.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java (.../StorageLocationManagerImpl.java) (revision 26816) @@ -18,7 +18,6 @@ import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.hibernate.ObjectDao; -import com.forgon.tools.hibernate.ObjectDaoImpl; public class StorageLocationManagerImpl extends BasePoManagerImpl implements StorageLocationManager { @@ -237,11 +236,41 @@ public List findChildNodesByParentId(String parentId) { String sql = String.format(" where po.parentId = '%s' ", parentId); return objectDao.findBySql(StorageLocation.class.getSimpleName(), sql); - //return objectDao.findByProperty(StorageLocation.class.getSimpleName(), "parentId", parentId); } @Override public void saveOfUpdate(StorageLocation storageLocation) { + // 判断抽屉是否存放物品(只在新建库位时才需要判断) + if (storageLocation.getId() == null) { + String sql = String.format(" where po.storageLocationId = %s and po.status = '%s' ", storageLocation.getParentId().toString(), StorageRecord.IN); + List storageRecordList = objectDao.findBySql(StorageRecord.class.getSimpleName(), sql); + if (CollectionUtils.isNotEmpty(storageRecordList)) { + throw new RuntimeException("该库位有存放物品,不能再添加下级库位!"); + } + } + // 判断库位编码(用户自定义库位的唯一标识)是否重复 + List storageRecordList1 = getStorageLocationByCode(storageLocation.getStorageLocationCode()); + if (CollectionUtils.isNotEmpty(storageRecordList1)) { + StorageLocation sl = storageRecordList1.get(0); + if (storageLocation.getId() == null || Long.compare(storageLocation.getId(), sl.getId()) != 0) { + throw new RuntimeException("库位编码为" + storageLocation.getStorageLocationCode() + "的库位已存在!"); + } + } + // 祖先库位Ids(1;2;3;) 用于获取当前库位的所有上级库位 + if (storageLocation.getParentId() != null && storageLocation.getParentId().longValue() != 0L) { + String parentId = storageLocation.getParentId().toString(); + StorageLocation parentStorageLocation = getStorageLocationById(parentId); + if (parentStorageLocation != null) { + if (StringUtils.isNotBlank(parentStorageLocation.getAncestorIds())) { + storageLocation.setAncestorIds(parentStorageLocation.getAncestorIds() + parentId + ";"); + } else { + storageLocation.setAncestorIds(parentId + ";"); + } + } + } else { + storageLocation.setParentId(0L); + storageLocation.setAncestorIds(null); + } //设置条码 String barcode = storageLocation.getBarcode(); if(StringUtils.isBlank(storageLocation.getBarcode())){ @@ -342,8 +371,29 @@ @Override public List getStorageLocationByCode(String storageLocationCode) { + if (StringUtils.isEmpty(storageLocationCode)) { + return null; + } String sql = String.format(" where po.storageLocationCode = '%s' ", storageLocationCode); return objectDao.findBySql(StorageLocation.class.getSimpleName(), sql); } + + @Override + public List getUnLimitedStorageLocation() { + String sql = String.format(" where po.id not in (select parentId from %s ) ", StorageLocation.class.getSimpleName()); + // 不限制存放物品的库位(包含上级库位) + List list = objectDao.findBySql(StorageLocation.class.getSimpleName(), sql); + if (CollectionUtils.isEmpty(list)) { + return null; + } + // 去除上级库位 + List result = new ArrayList(); + for (StorageLocation sl : list) { + if (CollectionUtils.isEmpty(sl.getTousseDefinitionList())) { + result.add(sl); + } + } + return result; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/StorageLocation.java =================================================================== diff -u -r26797 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/StorageLocation.java (.../StorageLocation.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/warehouse/StorageLocation.java (.../StorageLocation.java) (revision 26816) @@ -1,13 +1,18 @@ package com.forgon.disinfectsystem.entity.basedatamanager.warehouse; +import java.util.ArrayList; +import java.util.List; + import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Index; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Lob; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -19,7 +24,9 @@ import org.hibernate.annotations.DynamicUpdate; import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; /** * 库位表 @@ -85,6 +92,12 @@ private String tousseDefinitionNames; /** + * 可存放器械包 + */ + @JsonIgnore + private List tousseDefinitionList = new ArrayList(); + + /** * 所有祖先库位ID */ private String ancestorIds; @@ -171,6 +184,16 @@ this.tousseDefinitionNames = tousseDefinitionNames; } + @ManyToMany(cascade = { javax.persistence.CascadeType.MERGE,javax.persistence.CascadeType.PERSIST }, fetch = FetchType.LAZY) + @JoinTable(name = "storageLocation_tousseDefinition", joinColumns = { @JoinColumn(name = "storageLocation_id") }, inverseJoinColumns = { @JoinColumn(name = "tousseDefinition_id") }) + public List getTousseDefinitionList() { + return tousseDefinitionList; + } + + public void setTousseDefinitionList(List tousseDefinitionList) { + this.tousseDefinitionList = tousseDefinitionList; + } + public String getAncestorIds() { return ancestorIds; } Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/foreignproxydisinfection/service/ForeignProxyDisinfectionManagerImpl.java =================================================================== diff -u -r25409 -r26816 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/foreignproxydisinfection/service/ForeignProxyDisinfectionManagerImpl.java (.../ForeignProxyDisinfectionManagerImpl.java) (revision 25409) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/foreignproxydisinfection/service/ForeignProxyDisinfectionManagerImpl.java (.../ForeignProxyDisinfectionManagerImpl.java) (revision 26816) @@ -33,12 +33,14 @@ import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.basedatamanager.toussedefinition.service.TousseInstanceUtils; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.StorageLocationManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; 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.basedatamanager.warehouse.StorageLocation; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; @@ -58,6 +60,7 @@ import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.string.StringTools; import com.forgon.tools.util.ForgonDateUtils; import edu.emory.mathcs.backport.java.util.Collections; @@ -93,6 +96,8 @@ private InitDbConnection dbConnection; + private StorageLocationManager storageLocationManager; + public void setExpirationDateInfoManager( ExpirationDateInfoManager expirationDateInfoManager) { this.expirationDateInfoManager = expirationDateInfoManager; @@ -137,6 +142,11 @@ this.dbConnection = dbConnection; } + public void setStorageLocationManager( + StorageLocationManager storageLocationManager) { + this.storageLocationManager = storageLocationManager; + } + @Override public void endForeignProxyDisinfection(String id) { if(StringUtils.isBlank(id)){ @@ -997,6 +1007,8 @@ private JSONArray buildTousseInstancesPrintInfo(List tousseInstances,ForeignProxyDisinfection foreignProxyDisinfection){ JSONArray printParamList = new JSONArray(); + // 没有限制存放物品的库位 + List unLimitedStorageLocation = storageLocationManager.getUnLimitedStorageLocation(); for (TousseInstance tousseInstance : tousseInstances) { TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); if(tousseDefinition != null && !StringUtils.equals(TousseDefinition.STR_YES, tousseDefinition.getIsPrint())){ @@ -1026,6 +1038,29 @@ obj.put("markTousse",isMarkTousse); obj.put("sterileDateTime2", TousseInstanceUtils.safelyGetSterileStartDateTimeStr2(tousseInstance)); obj.put("expirationDateTime2", tousseInstance.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM)); + String operationTimeStr = ForgonDateUtils.safelyFormatDate(tousseInstance.getOperationTime(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDD, null); + obj.put("operationDate", operationTimeStr); // 装配时间 + obj.put("inspectorName", ""); // 外来器械申请单没有检查人,设置为空字符串 + // 可存放物品的库位编码、库位简称 + List list = tousseDefinition.getStorageLocationList(); + List slList = new ArrayList(); + slList.addAll(list); + String names = ""; + String codes = ""; + Set simpleNameSet = new HashSet(); + slList.addAll(unLimitedStorageLocation); //包含不限制存放物品的库位 + for (StorageLocation sl : slList) { + // 取申请科室下的库位 + if (StringUtils.equals(foreignProxyDisinfection.getDepart(), sl.getOrgUnitName())) { + simpleNameSet.add(sl.getName()); + codes = StringTools.uniteTwoStringBySemicolon(codes, sl.getStorageLocationCode(), "、"); + } + } + for (String name : simpleNameSet) { + names = StringTools.uniteTwoStringBySemicolon(names, name, "、"); + } + obj.put("simpleName", names); // 库位简称(A1、A2) + obj.put("storageLocationCode", codes); // 库位编码(code1、code2) printParamList.add(obj); } return printParamList; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java =================================================================== diff -u -r26797 -r26816 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java (.../StorageRecordManagerImpl.java) (revision 26797) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageRecordManagerImpl.java (.../StorageRecordManagerImpl.java) (revision 26816) @@ -4,6 +4,7 @@ import java.util.List; import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -12,12 +13,13 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageLocation; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageRecord; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JSONUtil; -import com.forgon.tools.string.StringTools; +import com.forgon.tools.json.JsonPropertyFilter; import com.forgon.tools.util.SqlUtils; public class StorageRecordManagerImpl extends BasePoManagerImpl implements StorageRecordManager { @@ -65,8 +67,12 @@ } // 上级库位 String parentStorageLocationPath = storageLocationManager.getParentStorageLocationNameById(storageLocation.getId()); - JSONUtil.addProperty(json, "data", storageLocation); - json.optJSONObject("data").put("parentStorageLocationPath", parentStorageLocationPath); + // 扫描的库位信息 + JsonConfig config = new JsonConfig(); + config.setJsonPropertyFilter(new JsonPropertyFilter(new String[] {"tousseDefinitionList"})); + JSONObject data = JSONObject.fromObject(storageLocation, config); + data.put("parentStorageLocationPath", parentStorageLocationPath); + json.put("data", data); json.put("returnType", "storageLocation"); json.put("success", true); return json.toString(); @@ -102,9 +108,8 @@ return json.toString(); } // 判断物品是否为库位限制存放的物品 - String tousseDefinitionIds = storageLocation.getTousseDefinitionIds(); - String tousseDefinitionId = ti.getTousseDefinition().getId().toString(); - if (StringUtils.isNotBlank(tousseDefinitionIds) && !tousseDefinitionIds.contains(tousseDefinitionId)) { + List tdList = storageLocation.getTousseDefinitionList(); + if (CollectionUtils.isNotEmpty(tdList) && !tdList.contains(ti.getTousseDefinition())) { json.put("message", ti.getTousseName() + "不允许存入" + storageLocation.getName()); return json.toString(); }