Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java =================================================================== diff -u -r37391 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java (.../StorageLocationManager.java) (revision 37391) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManager.java (.../StorageLocationManager.java) (revision 41525) @@ -1,10 +1,7 @@ package com.forgon.disinfectsystem.basedatamanager.warehouse.service; import java.util.List; - -import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageLocation; -import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.StorageRecord; public interface StorageLocationManager { @@ -37,10 +34,12 @@ /** * 根据关键词模糊查找库位 - * @param keyword - * @return + * @param keyword 关键字 + * @param orgUnitCode 库位所属科室编码 + * @param searchLeafStorageLocation 只查询叶子节点的库位 + * @return 库位 */ - public List findAllStorageLocationByKeyword(String keyword); + public List findAllStorageLocationByKeyword(String keyword, String orgUnitCode, boolean searchLeafStorageLocation); /** * 根据父节点id查找库位 Index: forgon-tools/src/main/java/com/forgon/Constants.java =================================================================== diff -u -r41415 -r41525 --- forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 41415) +++ forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 41525) @@ -29,7 +29,7 @@ "4.9.63","4.9.64","4.9.65","4.9.66","4.9.67","4.9.68","4.9.69","4.9.70","4.9.71","4.9.72","4.9.73","4.9.74","4.9.75","4.9.76","4.9.77","4.9.78","4.9.79","4.9.80","4.9.81","4.9.82","4.9.83","4.9.84","4.9.85", "4.9.86","4.9.87","4.9.88","4.9.89","4.9.90","4.9.91","4.9.92","4.9.93","4.9.94","4.9.95","4.9.96","4.9.97","4.9.98","4.9.99","5.0.0","5.0.1","5.0.2","5.0.3","5.0.4","5.0.5","5.0.6","5.0.7", "5.0.8","5.0.9","5.0.10","5.0.11","5.0.12","5.0.13","5.0.14","5.0.15","5.0.16","5.0.17","5.0.18","5.0.19","5.0.20","5.0.21","5.0.22","5.0.23","5.0.24","5.0.25","5.0.26","5.0.27","5.0.28","5.0.29","5.0.30","5.0.31", - "5.0.32","5.0.33","5.0.34","5.0.35","5.0.36","5.0.37","5.0.38","5.0.39","5.0.40","5.0.41","5.0.42","5.0.43","5.0.44","5.0.45","5.0.46","5.0.47","5.0.48","5.0.49","5.0.50","5.0.51","5.0.52","5.0.53"}; + "5.0.32","5.0.33","5.0.34","5.0.35","5.0.36","5.0.37","5.0.38","5.0.39","5.0.40","5.0.41","5.0.42","5.0.43","5.0.44","5.0.45","5.0.46","5.0.47","5.0.48","5.0.49","5.0.50","5.0.51","5.0.52","5.0.53","5.0.54"}; // 版本列表(4.0版本升级4.1版需要分两步:先从4.0升到4.1.0、然后从4.1.0升级4.1最新版本) /*public final static String[] SOFTWARE_VERSION_ARRAY = new String[] { Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java =================================================================== diff -u -r41367 -r41525 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 41367) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 41525) @@ -422,6 +422,14 @@ "diposableGoodsItems", "invoicePlan", "returnedTousseItems" }); config.setJsonPropertyFilter(propertyFilter); + //【发货管理】“发货单”新增字段“签收库房”ZSYKEQ-23 + boolean enableDesignatedWarehouseReceiving = ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving"); + if(invoice != null && enableDesignatedWarehouseReceiving){ + StorageLocation signStorageLocation = invoiceManager.getInvoiceSignStorageLocation(invoice); + if(signStorageLocation != null){ + invoice.setSignStorageLocationName(signStorageLocation.getName()); + } + } Map map = new HashMap(); map.put("success", true); map.put("data", invoice); @@ -2085,6 +2093,7 @@ invoiceSerialNumbers = barcodeDevice.getBarcode(); } } + map.put("signStorageLocation", getInvoiceSignStorageLocation(invoiceList)); map.put("applicationSerialNumbers", getInvoicePlanSerialNumbersByInvoice(invoiceList)); map.put("invoiceSerialNumbers", invoiceSerialNumbers); } @@ -2142,6 +2151,59 @@ } } + /** + * 查询签收库位名称 + * @param invoiceList 发货单 + * @return 签收库位名称 + */ + private String getInvoiceSignStorageLocation(List invoiceList) { + //启用指定库房签收入库功能;ZSYKEQ-23 + boolean enableDesignatedWarehouseReceiving = ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving"); + if(!enableDesignatedWarehouseReceiving){ + return ""; + } + + if(CollectionUtils.isEmpty(invoiceList)){ + return ""; + } + + List storageLocationIdList = new ArrayList(); + for (Invoice invoice : invoiceList) { + Long signStorageLocationId = invoice.getSignStorageLocationId(); + if(DatabaseUtil.isPoIdValid(signStorageLocationId) && !storageLocationIdList.contains(signStorageLocationId)){ + storageLocationIdList.add(signStorageLocationId); + } + } + + if(CollectionUtils.isEmpty(storageLocationIdList)){ + return ""; + } + + List storageLocationNameList = new ArrayList(); + StringBuffer signStorageLocationIdSql = new StringBuffer(); + signStorageLocationIdSql.append("select name from "); + signStorageLocationIdSql.append(StorageLocation.class.getSimpleName()); + signStorageLocationIdSql.append(" where "); + signStorageLocationIdSql.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", storageLocationIdList)); + ResultSet rs = null; + try { + rs = objectDao.executeSql(signStorageLocationIdSql.toString()); + while(rs.next()){ + String name = rs.getString("name"); + if(StringUtils.isNotBlank(name)){ + storageLocationNameList.add(name); + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + return StringTools.join(storageLocationNameList, ";"); + } + private String getInvoicePlanSerialNumbersByInvoice(List invoices) { if(CollectionUtils.isEmpty(invoices)){ return ""; @@ -2931,6 +2993,8 @@ String storageLocationAddr = StrutsParamUtils.getPraramValue("storageLocationAddr", ""); //是否允许发货已经在同科室库位中的物品,并且不修改物品库位BJDXZLYY-46 boolean allowInvoiceStorageLocGoodsWithOutChangeStorageLoc = StrutsParamUtils.getBoolPraramValue("allowInvoiceStorageLocGoodsWithOutChangeStorageLoc", false); + //发货时指定的签收库位ID ZSYKEQ-23 + Long signStorageLocationId = StrutsParamUtils.getPraramLongValue("signStorageLocationId", null); params.put("tousseGroupIds", tousseGroupIds); params.put("invoiceType", invoiceType); @@ -2956,6 +3020,7 @@ params.put("storageLocationId", storageLocationId); params.put("storageLocationAddr", storageLocationAddr); params.put("allowInvoiceStorageLocGoodsWithOutChangeStorageLoc", allowInvoiceStorageLocGoodsWithOutChangeStorageLoc); + params.put("signStorageLocationId", signStorageLocationId); //申请日期 String applyDate = StrutsParamUtils.getPraramValue("applyDate", ""); Index: ssts-web/src/main/webapp/dataUpdater/sqls/5.0.53_5.0.54.sql =================================================================== diff -u --- ssts-web/src/main/webapp/dataUpdater/sqls/5.0.53_5.0.54.sql (revision 0) +++ ssts-web/src/main/webapp/dataUpdater/sqls/5.0.53_5.0.54.sql (revision 41525) @@ -0,0 +1,2 @@ +update StorageLocation set orgUnitName = (select name from OrgUnit where orgUnitCoding = StorageLocation.orgUnitCode) where orgUnitName <> (select name from OrgUnit where orgUnitCoding = StorageLocation.orgUnitCode); +update StorageLocation set wareHouseName = (select name from WareHouse where id = StorageLocation.wareHouseId) where wareHouseName <> (select name from WareHouse where id = StorageLocation.wareHouseId); \ No newline at end of file Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java =================================================================== diff -u -r40492 -r41525 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java (.../InvoiceManager.java) (revision 40492) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java (.../InvoiceManager.java) (revision 41525) @@ -488,5 +488,21 @@ * @param supplyRoomOrgUnitCode */ public void setCurrentSupplyRoomOrgUnitCode(String currentSupplyRoomOrgUnitCode); + + /** + * 设置发货单指定的签收库位ID + * ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + * @param invoiceList 发货单 + * @param signStorageLocationId 发货指定的签收入库的库位 + */ + public void updateInvoiceSignStorageLocationId(List invoiceList, Long signStorageLocationId); + /** + * 查询发货单指定的签收库位 + * ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + * @param invoice 发货单 + * @return 签收库位 + */ + public StorageLocation getInvoiceSignStorageLocation(Invoice invoice); + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/WareHouseManagerImpl.java =================================================================== diff -u -r39631 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/WareHouseManagerImpl.java (.../WareHouseManagerImpl.java) (revision 39631) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/WareHouseManagerImpl.java (.../WareHouseManagerImpl.java) (revision 41525) @@ -240,6 +240,7 @@ objectDao.executeUpdate(String.format("update %s set warehouseName='%s' where warehouseID=%s",DisposableGoodsBatchStock.class.getSimpleName(), wareHouse.getName(),wareHouse.getId())); objectDao.executeUpdate(String.format("update %s set warehouseName='%s' where warehouseID=%s",DisposableGoodsStock.class.getSimpleName(), wareHouse.getName(),wareHouse.getId())); objectDao.executeUpdate(String.format("update %s set warehouseName='%s' where warehouseID=%s",DisposableGoodsIdentification.class.getSimpleName(), wareHouse.getName(),wareHouse.getId())); + objectDao.executeUpdate("update StorageLocation set wareHouseName='" + wareHouse.getName() + "' where wareHouseId=" + wareHouse.getId()); }catch(Exception e){ e.printStackTrace(); Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r41367 -r41525 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 41367) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 41525) @@ -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.datasynchronization.dao.TousseInstancePushDao; @@ -299,6 +300,9 @@ @Autowired protected RunWithTransNewManager runWithTransNewManager; + + @Autowired + protected StorageLocationManager storageLocationManager; /** * 当前供应室编码(用于发货时,查询待发货的申请单时按处理科室为该供应室编码进行申请单的过滤-兼容定时或自动完成灭菌时二级供应室自动发货的场景) @@ -3384,6 +3388,8 @@ boolean allowPartlyInvoiceForeignTousse = CssdUtils.getSystemSetConfigByNameBool("allowPartlyInvoiceForeignTousse"); allowPartlyInvoiceForeignTousse = JSONUtil.optBoolean(params, "allowPartlyInvoiceForeignTousse", allowPartlyInvoiceForeignTousse); submitInvoiceContext.setAllowPartlyInvoiceForeignTousse(allowPartlyInvoiceForeignTousse); + //发货时指定的签收库位ID ZSYKEQ-23 + Long signStorageLocationId = JSONUtil.optLong(params, "signStorageLocationId", null); if (StringUtils.isBlank(sender)) { throw new RuntimeException("缺失参数sender"); } @@ -3426,6 +3432,7 @@ //卡迪斯货柜的ip地址、端口、托盘(库位)id、开口号(手术预约发货功能增加发货到卡迪斯货柜BJDXZLYY-35) submitInvoiceContext.setStorageLocationId(storageLocationId); submitInvoiceContext.setStorageLocationAddr(storageLocationAddr); + submitInvoiceContext.setSignStorageLocationId(signStorageLocationId); //submitInvoiceContext.setKardexContainerHost(kardexContainerHost); //submitInvoiceContext.setKardexContainerPort(KardexContainerPort); JSONArray jsonArrayInvoiceItems = params.optJSONArray("invoiceItems"); @@ -3731,6 +3738,9 @@ //添加标识牌实例的器械实例发货数据 addIdCardInstanceInstrumentInstanceInvoiceData(submitInvoiceContext); + //设置发货单指定的签收库位ID ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + this.updateInvoiceSignStorageLocationId(writeBackInvoiceList, submitInvoiceContext.getSignStorageLocationId()); + //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 pushTousseInstanceAfterInvoice(submitInvoiceContext); @@ -3744,6 +3754,54 @@ return submitInvoiceContext; } + @Override + public void updateInvoiceSignStorageLocationId(List invoiceList, Long signStorageLocationId) { + boolean enableDesignatedWarehouseReceiving = ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving"); + if(!enableDesignatedWarehouseReceiving){ + return; + } + boolean enableWarehousePositionModule = ConfigUtils.getSystemSetConfigByNameBool("enableWarehousePositionModule"); + if(!enableWarehousePositionModule){ + return; + } + //Long signStorageLocationId = submitInvoiceContext.getSignStorageLocationId(); + if(!DatabaseUtil.isPoIdValid(signStorageLocationId)){ + return; + } + //List invoiceList = submitInvoiceContext.getWriteBackInvoiceList(); + if(CollectionUtils.isEmpty(invoiceList)){ + return; + } + //objectDao.clear(); + StorageLocation storageLocation = storageLocationManager.getStorageLocationById(signStorageLocationId.toString()); + if(storageLocation == null){ + throw new SystemException("指定的签收库位不存在!"); + } + OrgUnit orgUnit = orgUnitManager.getByCode(invoiceList.get(0).getDepartCoding()); + if(orgUnit == null){ + throw new SystemException("发货申请科室不存在!"); + } + //判断发货单上的物品是否允许放入指定的签收库位(根据发货单申请科室判断) + List allTousseInstances = new ArrayList(); + for (Invoice invoice : invoiceList) { + List invoiceTousseInstanceList = invoice.getTousseInstances(objectDao); + if(CollectionUtils.isNotEmpty(invoiceTousseInstanceList)){ + //objectDao.refresh(invoice); + for (TousseInstance tousseInstance : invoiceTousseInstanceList) { + objectDao.refresh(tousseInstance); + } + allTousseInstances.addAll(invoiceTousseInstanceList); + invoice.setSignStorageLocationId(signStorageLocationId); + objectDao.saveOrUpdate(invoice); + } + } + if(CollectionUtils.isEmpty(allTousseInstances)){ + return; + } + //判断是否允许放入指定的库位 + tousseInstanceManager.canTousseInstancePutIntoStorageLocation(allTousseInstances, storageLocation, orgUnit); + } + /** * 对发货的物品明细根据条码进行去重(zsyy-392问题发现pda的聚合包发货有重复的子包条码,后续对pda端进行处理防止条码有重复) * @param params @@ -18019,4 +18077,12 @@ return diposableGoodsIdDiposableGoodsItemListMap; } + @Override + public StorageLocation getInvoiceSignStorageLocation(Invoice invoice) { + if(invoice == null || !DatabaseUtil.isPoIdValid(invoice.getSignStorageLocationId())){ + return null; + } + return storageLocationManager.getStorageLocationById(invoice.getSignStorageLocationId().toString()); + } + } \ No newline at end of file Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r41030 -r41525 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41030) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41525) @@ -182,6 +182,9 @@ String applyDate = JSONUtil.optString(params, "applyDate", ""); //申请单类型 String appFormType = JSONUtil.optString(params, "appFormType", ""); + //发货时指定的签收库位ID ZSYKEQ-23 + Long signStorageLocationId = params.optLong("signStorageLocationId"); + context.setSignStorageLocationId(signStorageLocationId); if(CollectionUtils.isEmpty(invoiceItems)){ throw new SystemException("发货物品为空"); } @@ -791,6 +794,8 @@ context.setInvoiceList(invoiceList); //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 pushTousseInstanceAfterInvoice(context); + //设置发货单指定的签收库位ID ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + this.updateInvoiceSignStorageLocationId(invoiceList, context.getSignStorageLocationId()); return context; } /* @@ -1192,6 +1197,8 @@ addIdCardInstanceInstrumentInstanceInvoiceData(context); //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列XKYY-244 pushTousseInstanceAfterInvoice(context); + //设置发货单指定的签收库位ID ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + this.updateInvoiceSignStorageLocationId(invoiceList, context.getSignStorageLocationId()); //标识牌实例数据处理及推送发货数据至第三方平台完成后的毫秒数 long start10 = System.currentTimeMillis(); StringBuffer debugInfo = new StringBuffer("新版发货业务处理完成,总耗时(秒):"); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r41122 -r41525 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 41122) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 41525) @@ -4312,16 +4312,23 @@ signRecordId); result = objectDao.excuteSQL(signAmountSql); } - if(tousseInstancePushDao != null){ - //向智慧手术系统推送签收的手术器械包 + + if(tousseInstancePushDao != null || ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving")){ Collection tis = null; if(DatabaseUtil.isPoIdValid(signRecordId)){ tis = objectDao.findByProperty(TousseInstance.class.getSimpleName(), "signRecordId", signRecordId); } if(CollectionUtils.isEmpty(tis)){ tis = getWaiteSignTousseInstanceByInvoiceIds(ids); } - tousseInstancePushDao.pushTousseInstanceAfterSign(tis); + + //签收成功时,自动将物品入库到发货时指定的签收库位ZSYKEQ-23 + this.batchAutoPutTousseInstanceIntoSignStorageLoactionAfterSign(tis); + + //向智慧手术系统推送签收的手术器械包 + if(tousseInstancePushDao != null){ + tousseInstancePushDao.pushTousseInstanceAfterSign(tis); + } } } return result; @@ -4692,6 +4699,10 @@ if(MapUtils.isNotEmpty(tousseNameAndIdMap)){ departmentStockManager.instrumentSetToBeAdded(orgUnit.getName(), orgUnit.getOrgUnitCoding(), tousseNameAndIdMap); } + + //签收成功时,自动将物品入库到发货时指定的签收库位ZSYKEQ-23 + this.batchAutoPutTousseInstanceIntoSignStorageLoactionAfterSign(allSignedTousseInstanceList); + if(tousseInstancePushDao != null){ tousseInstancePushDao.pushTousseInstanceAfterSign(allSignedTousseInstanceList); } @@ -4735,6 +4746,10 @@ departmentStockManager.instrumentSetToBeAdded(orgUnitName, orgUnitCoding, tousseNameAndIdMap); } } + + //签收成功时,自动将物品入库到发货时指定的签收库位ZSYKEQ-23 + this.batchAutoPutTousseInstanceIntoSignStorageLoactionAfterSign(waiteSignTousseInstances); + //向智慧手术系统推送签收的手术器械包 if(tousseInstancePushDao != null){ tousseInstancePushDao.pushTousseInstanceAfterSign(waiteSignTousseInstances); @@ -12120,7 +12135,7 @@ } //批量签收器械实例 - signRecordId = this.batchSignTousseInstance_intenal(waitSignTousseInstanceList, invoiceBeginDate, invoiceEndDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, signInvoice); + signRecordId = this.batchSignTousseInstance_intenal(waitSignTousseInstanceList, invoiceBeginDate, invoiceEndDate, signRecordId, signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, signInvoice, true); //需要签收成功的签收结果 return buildSignResultVo(isSuccess, msg, waitSignTousseInstanceList, signRecordId, signOrgUnitCode, invoiceBeginDate, invoiceEndDate); @@ -12169,12 +12184,13 @@ * @param signUserFullName 签收人姓名 * @param signDate 签收日期 * @param signInvoice 是否签收发货单(整单签收时,不需要计算签收状态,直接设置签收状态为“已签收”) + * @param putIntoSignStorageLocation 签收成功后,将物品放入指定的签收库位 */ private Long batchSignTousseInstance_intenal(List tousseInstanceList, String invoiceBeginDate, String invoiceEndDate, Long signRecordId, String signOrgUnitCode, String signOrgUnitName, String signUserCode, String signUserFullName, Date signDate, - boolean signInvoice){ + boolean signInvoice, boolean putIntoSignStorageLocation){ if(CollectionUtils.isEmpty(tousseInstanceList)){ throw new SystemException("无待签收物品!"); @@ -12276,6 +12292,11 @@ } } + //签收成功时,自动将物品入库到发货时指定的签收库位ZSYKEQ-23 + if(putIntoSignStorageLocation){ + this.batchAutoPutTousseInstanceIntoSignStorageLoactionAfterSign(waitSignTousseInstanceList); + } + if(tousseInstancePushDao != null){ tousseInstancePushDao.pushTousseInstanceAfterSign(waitSignTousseInstanceList); } @@ -12284,6 +12305,111 @@ } /** + * 签收成功时,自动将物品入库到发货时指定的签收库位 + * @param waitSignTousseInstanceList 器械包实例 + */ + private void batchAutoPutTousseInstanceIntoSignStorageLoactionAfterSign(Collection signTousseInstanceList) { + boolean enableDesignatedWarehouseReceiving = ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving"); + boolean enableWarehousePositionModule = ConfigUtils.getSystemSetConfigByNameBool("enableWarehousePositionModule"); + if(!enableDesignatedWarehouseReceiving || !enableWarehousePositionModule || CollectionUtils.isEmpty(signTousseInstanceList)){ + return; + } + for (TousseInstance tousseInstance : signTousseInstanceList) { + objectDao.refresh(tousseInstance); + } + //根据发货单上指定的签收库位id,分开放入库位 + Map> signStorageLoactionIdTousseInstanceMap = getSignStorageLoactionIdTousseInstanceMap(signTousseInstanceList); + if(MapUtils.isEmpty(signStorageLoactionIdTousseInstanceMap)){ + return; + } + for (Entry> entry : signStorageLoactionIdTousseInstanceMap.entrySet()) { + Long signStorageLoactionId = entry.getKey(); + List tousseInstances = entry.getValue(); + StorageLocation storageLocation = storageLocationManager.getStorageLocationById(signStorageLoactionId.toString()); + if(storageLocation == null || CollectionUtils.isEmpty(tousseInstances)){ + continue; + } + this.batchPutTousseInstanceIntoStorageLoaction(tousseInstances, storageLocation, storageLocation.getOrgUnitCode(), "签收自动存入", false); + } + } + + /** + * 根据发货单上指定的签收库位,对签收的器械包实例进行分组 + * @param tousseInstanceList 签收的器械包实例 + * @return 签收库位id及待入库器械包实例的map + */ + private Map> getSignStorageLoactionIdTousseInstanceMap(Collection tousseInstanceList) { + Map> signStorageLoactionIdTousseInstanceMap = new HashMap>(); + if(CollectionUtils.isEmpty(tousseInstanceList)){ + return signStorageLoactionIdTousseInstanceMap; + } + List invoiceIdList = new ArrayList(); + for (TousseInstance tousseInstance : tousseInstanceList) { + Long invoiceId = tousseInstance.getLastInvoiceId(); + if(DatabaseUtil.isPoIdValid(invoiceId)){ + invoiceIdList.add(invoiceId); + } + } + if(CollectionUtils.isEmpty(invoiceIdList)){ + return signStorageLoactionIdTousseInstanceMap; + } + //查询发货单id及签收库位id的map + Map invoiceIdSignStorageLocationIdMap = getInvoiceIdSignStorageLocationIdMap(invoiceIdList); + if(MapUtils.isEmpty(invoiceIdSignStorageLocationIdMap)){ + return signStorageLoactionIdTousseInstanceMap; + } + for (TousseInstance tousseInstance : tousseInstanceList) { + Long invoiceId = tousseInstance.getLastInvoiceId(); + if(DatabaseUtil.isPoIdValid(invoiceId)){ + Long signStorageLocationId = invoiceIdSignStorageLocationIdMap.get(invoiceId); + if(DatabaseUtil.isPoIdValid(signStorageLocationId)){ + List mapTousseInstanceList = signStorageLoactionIdTousseInstanceMap.get(signStorageLocationId); + if(mapTousseInstanceList == null){ + mapTousseInstanceList = new ArrayList(); + } + mapTousseInstanceList.add(tousseInstance); + signStorageLoactionIdTousseInstanceMap.put(signStorageLocationId, mapTousseInstanceList); + } + } + } + return signStorageLoactionIdTousseInstanceMap; + } + + /** + * 查询发货单id及签收库位id的map + * @param invoiceIdList 发货单id + * @return 发货单id及签收库位id的map + */ + private Map getInvoiceIdSignStorageLocationIdMap(List invoiceIdList){ + Map invoiceIdSignStorageLocationIdMap = new HashMap(); + if(CollectionUtils.isEmpty(invoiceIdList)){ + return invoiceIdSignStorageLocationIdMap; + } + StringBuffer signStorageLocationIdSql = new StringBuffer(); + signStorageLocationIdSql.append("select id, signStorageLocationId from "); + signStorageLocationIdSql.append(Invoice.class.getSimpleName()); + signStorageLocationIdSql.append(" where "); + signStorageLocationIdSql.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoiceIdList)); + ResultSet rs = null; + try { + rs = objectDao.executeSql(signStorageLocationIdSql.toString()); + while(rs.next()){ + Long id = rs.getLong("id"); + Long signStorageLocationId = rs.getLong("signStorageLocationId"); + if(DatabaseUtil.isPoIdValid(signStorageLocationId)){ + invoiceIdSignStorageLocationIdMap.put(id, signStorageLocationId); + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return invoiceIdSignStorageLocationIdMap; + } + + /** * 查询聚合包子包 * @param waitSignTousseInstanceList * @return @@ -12777,14 +12903,19 @@ return reservationApplicationIds; } + @Override + public void batchPutTousseInstanceIntoStorageLoaction(List tousseInstances, + StorageLocation storageLocation, String orgUnitCode, String operateDetail){ + batchPutTousseInstanceIntoStorageLoaction(tousseInstances, storageLocation, orgUnitCode, operateDetail, true); + } + /** * 器械包实例批量放入库位 * @param allInvoiceTousseInstance * @param storageLocationId */ - @Override public void batchPutTousseInstanceIntoStorageLoaction(List tousseInstances, - StorageLocation storageLocation, String orgUnitCode, String operateDetail) { + StorageLocation storageLocation, String orgUnitCode, String operateDetail, boolean autoSignAfterPutIntoStorageLocation) { if(storageLocation == null){ throw new SystemException("库位id无效!"); } @@ -12804,7 +12935,8 @@ batchSaveInStorageRecord(tousseInstances, storageLocation, operateDetail, null); //新增对存入的器械包进行自动签收操作GDSRMYY-557 SupplyRoomConfig systemParamsObj = supplyRoomConfigManager.getSystemParamsObj(); - if(systemParamsObj != null + if(autoSignAfterPutIntoStorageLocation + && systemParamsObj != null && StringUtils.equals(systemParamsObj.getAutoSignAfterPutInStorage(), Constants.STR_YES)){ List waitSignTousseInstanceList = new ArrayList(); for (TousseInstance tousseInstance : tousseInstances) { @@ -12829,7 +12961,9 @@ sr.setCreateDate(signDate); sr.setRemark("入库自动签收"); objectDao.saveOrUpdate(sr); - batchSignTousseInstance_intenal(waitSignTousseInstanceList, null, null, sr.getId(), signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false); + //入库自动签收,不需要再进行入库操作 + boolean putIntoSignStorageLocation = false; + batchSignTousseInstance_intenal(waitSignTousseInstanceList, null, null, sr.getId(), signOrgUnitCode, signOrgUnitName, signUserCode, signUserFullName, signDate, false, putIntoSignStorageLocation); } catch (Exception e) { throw new SystemException("入库签收失败:" + e.getMessage()); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/Invoice.java =================================================================== diff -u -r39250 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/Invoice.java (.../Invoice.java) (revision 39250) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/Invoice.java (.../Invoice.java) (revision 41525) @@ -263,7 +263,20 @@ * 仓库名称 */ private String warehouseName; + /** + * 发货时指定的签收库位ID + * ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + */ + private Long signStorageLocationId; + + /** + * 发货时指定的签收库位名称(不保存到数据库) + * ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 + */ + private String signStorageLocationName; + + /** * 发货的仓库Id */ private Long sourceWarehouseId; @@ -665,6 +678,23 @@ this.warehouseName = warehouseName; } + public Long getSignStorageLocationId() { + return signStorageLocationId; + } + + public void setSignStorageLocationId(Long signStorageLocationId) { + this.signStorageLocationId = signStorageLocationId; + } + + @Transient + public String getSignStorageLocationName() { + return signStorageLocationName; + } + + public void setSignStorageLocationName(String signStorageLocationName) { + this.signStorageLocationName = signStorageLocationName; + } + public Long getSourceWarehouseId() { return sourceWarehouseId; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java =================================================================== diff -u -r37391 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java (.../StorageLocationManagerImpl.java) (revision 37391) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/service/StorageLocationManagerImpl.java (.../StorageLocationManagerImpl.java) (revision 41525) @@ -350,12 +350,25 @@ objectDao.delete(StorageLocation.class.getSimpleName(), idList); } + @SuppressWarnings("unchecked") @Override - public List findAllStorageLocationByKeyword(String keyword) { - String whereHql = "where id<>0 and name like '%" + keyword + "%' order by orgUnitCode, wareHouseId, id "; - List list = new ArrayList(); - list = objectDao.findBySql(StorageLocation.class.getSimpleName(), whereHql); - return list; + public List findAllStorageLocationByKeyword(String keyword, String orgUnitCode, boolean searchLeafStorageLocation) { + String hql = "where id<>0 "; + List paramList = new ArrayList(); + if(StringUtils.isNotBlank(orgUnitCode)){ + hql += " and orgUnitCode = ? "; + paramList.add(orgUnitCode); + } + if(searchLeafStorageLocation){ + //只查询叶子节点 + hql += " and id not in (select parentId from StorageLocation) "; + } + if(StringUtils.isNotBlank(keyword)){ + hql += " and name like ? "; + paramList.add("%" + keyword + "%"); + } + hql += " order by orgUnitCode, wareHouseId, id "; + return objectDao.findHqlByParam(" from StorageLocation " + hql, paramList.toArray(), -1, -1); } @Override Index: forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java =================================================================== diff -u -r40302 -r41525 --- forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java (.../OrgUnitManagerImpl.java) (revision 40302) +++ forgon-core/src/main/java/com/forgon/directory/service/OrgUnitManagerImpl.java (.../OrgUnitManagerImpl.java) (revision 41525) @@ -715,6 +715,9 @@ //打印发货计划设置的处理科室 sqls.append("update PrintConfig set handleDepart = '" + newOrgName + "' where handleDepartCoding = '" + orgCoding + "';"); + + //库位的所属科室 + sqls.append("update StorageLocation set orgUnitName = '" + newOrgName + "' where orgUnitCode = '" + orgCoding + "';"); String[] sqlArray = sqls.toString().split(";"); if(sqlArray != null && sqlArray.length > 0){ for(String updateSql : sqlArray){ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r40302 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 40302) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 41525) @@ -14,7 +14,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -263,6 +262,12 @@ */ private Map thirdPartyTousseBarcodeMap = new HashMap(); + /** + * 发货时指定的签收库位ID + * ZSYKEQ-23 + */ + private Long signStorageLocationId; + public List getAllGoodsStocksInDB() { return allGoodsStocksInDB; } @@ -818,4 +823,12 @@ this.thirdPartyTousseBarcodeMap = thirdPartyTousseBarcodeMap; } + public Long getSignStorageLocationId() { + return signStorageLocationId; + } + + public void setSignStorageLocationId(Long signStorageLocationId) { + this.signStorageLocationId = signStorageLocationId; + } + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java =================================================================== diff -u -r37391 -r41525 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java (.../StorageLocationAction.java) (revision 37391) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/warehouse/action/StorageLocationAction.java (.../StorageLocationAction.java) (revision 41525) @@ -107,7 +107,11 @@ */ public void searchStorageLocationByKeyword () { String keyword = StrutsParamUtils.getPraramValue("keyword", ""); - List list = storageLocationManager.findAllStorageLocationByKeyword(keyword); + //库位所属科室 + String orgUnitCode = StrutsParamUtils.getPraramValue("orgUnitCode", ""); + //只查询叶子节点的库位 + boolean searchLeafStorageLocation = StrutsParamUtils.getBoolPraramValue("searchLeafStorageLocation", false); + List list = storageLocationManager.findAllStorageLocationByKeyword(keyword, orgUnitCode, searchLeafStorageLocation); JSONArray jsonArr = new JSONArray(); for (StorageLocation storageLocation : list) { JSONObject jsonObj = new JSONObject();