Index: ssts-web/src/test/java/test/forgon/disinfectsystem/signrecord/SignRecordManagerTests.java =================================================================== diff -u -r31905 -r35636 --- ssts-web/src/test/java/test/forgon/disinfectsystem/signrecord/SignRecordManagerTests.java (.../SignRecordManagerTests.java) (revision 31905) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/signrecord/SignRecordManagerTests.java (.../SignRecordManagerTests.java) (revision 35636) @@ -6,7 +6,6 @@ import org.apache.commons.lang3.StringUtils; import org.junit.Test; -import org.junit.runner.RunWith; import org.testng.AssertJUnit; import com.forgon.disinfectsystem.entity.basedatamanager.signRecord.SignRecord; @@ -110,7 +109,7 @@ tousseInstance_雾化器.setInvoiceSendTime(invoice.getSendTime()); tousseInstance_雾化器.setLocation(invoice.getDepartCoding()); tousseInstance_雾化器.setLocationForDisplay(invoice.getDepart()); - tousseInstanceManager.save(tousseInstance_开口包1); + tousseInstanceManager.save(tousseInstance_雾化器); Long signRecordId = null; // 单个器械包实例签收 @@ -140,31 +139,44 @@ tousseInstanceManager.batchSignTousseInstanceByBarcode(tousseInstance_呼吸机.getBarcode(), signRecordId, "", ""); // 器械包状态为“已签收” AssertJUnit.assertEquals(tousseInstance_呼吸机.getStatus(), TousseInstance.STATUS_SIGNED); - // 签收了1个追溯的开口包(器械包)、1个追溯的敷料包A(敷料包)、1个追溯的呼吸机(消毒物品),剩下的1个不追溯的雾化器(消毒物品)不需要签收,发货单签收状态为“已签收” - AssertJUnit.assertEquals(Invoice.SIGNSTATUS_SIGNED, invoice.getSignStatus()); + // 发货单签收状态为“部分签收” + AssertJUnit.assertEquals(Invoice.SIGNSTATUS_PARTSIGNED, invoice.getSignStatus()); // 签收记录的签收数量为3 AssertJUnit.assertEquals(3, signRecord.getSignAmount()); - // 不追溯的消毒物品tousseInstance_雾化器不需要签收,器械包状态为“已发货” + // 不追溯的消毒物品tousseInstance_雾化器签收失败,需要扫固定条码签收 + tousseInstanceManager.batchSignTousseInstanceByBarcode(tousseInstance_雾化器.getBarcode(), signRecordId, "", ""); + // 器械包状态为“已发货” AssertJUnit.assertEquals(tousseInstance_雾化器.getStatus(), TousseInstance.STATUS_SHIPPED); + // 发货单签收状态为“部分签收” + AssertJUnit.assertEquals(Invoice.SIGNSTATUS_PARTSIGNED, invoice.getSignStatus()); + // 不追溯的消毒物品tousseInstance_雾化器需要扫固定条码签收 + String fixedBarcode = tousseInstanceManager.getOrCreateTousseDefinitionFixedBarcode(td_雾化器.getId()); + // 扫固定条码签收tousseInstance_雾化器 + tousseInstanceManager.batchSignTousseInstanceByBarcode(fixedBarcode, signRecordId, "", ""); + // 器械包状态为“已签收” + AssertJUnit.assertEquals(tousseInstance_雾化器.getStatus(), TousseInstance.STATUS_SIGNED); + // 发货单签收状态为“已签收” + AssertJUnit.assertEquals(Invoice.SIGNSTATUS_SIGNED, invoice.getSignStatus()); + // 签收记录的签收数量为4 + AssertJUnit.assertEquals(4, signRecord.getSignAmount()); }else if(SignRecord.TYPE_INVOICE.equals(signType)){ // 整单签收 tousseInstanceManager.batchSignTousseInstanceByBarcode(invoice.getSerialNumber(), signRecordId, "", ""); - // 签收了1个追溯的开口包(器械包)、1个追溯的敷料包A(敷料包)、1个追溯的呼吸机(消毒物品),剩下的1个不追溯的雾化器(消毒物品)不需要签收,发货单签收状态为“已签收” + // 发货单签收状态为“已签收” AssertJUnit.assertEquals(Invoice.SIGNSTATUS_SIGNED, invoice.getSignStatus()); // 整单签收,发货单和签收记录直接关联 AssertJUnit.assertNotNull(invoice.getSignRecordId()); // 器械包状态为“已签收” - AssertJUnit.assertEquals(tousseInstance_呼吸机.getStatus(), TousseInstance.STATUS_SIGNED); + AssertJUnit.assertEquals(tousseInstance_开口包1.getStatus(), TousseInstance.STATUS_SIGNED); AssertJUnit.assertEquals(tousseInstance_敷料包A.getStatus(), TousseInstance.STATUS_SIGNED); AssertJUnit.assertEquals(tousseInstance_呼吸机.getStatus(), TousseInstance.STATUS_SIGNED); - // 不追溯的消毒物品tousseInstance_雾化器不需要签收,器械包状态为“已发货” - AssertJUnit.assertEquals(tousseInstance_雾化器.getStatus(), TousseInstance.STATUS_SHIPPED); + AssertJUnit.assertEquals(tousseInstance_雾化器.getStatus(), TousseInstance.STATUS_SIGNED); // 签收生成签收记录 signRecordId = tousseInstance_开口包1.getSignRecordId(); SignRecord signRecord = (SignRecord) objectDao.getById(SignRecord.class.getSimpleName(), signRecordId); AssertJUnit.assertNotNull(signRecord); - // 整单签收发货单上的可签收物品,签收记录的签收数量为3 - AssertJUnit.assertEquals(3, signRecord.getSignAmount()); + // 整单签收发货单上的可签收物品,签收记录的签收数量为4 + AssertJUnit.assertEquals(4, signRecord.getSignAmount()); } } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r35570 -r35636 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 35570) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 35636) @@ -3407,7 +3407,7 @@ Long tiSignRecordId = ti.getSignRecordId(); if (DatabaseUtil.isPoIdValid(tiSignRecordId)) { signedAmount++; - }else{ + }/*else{ // 不追溯的消毒物品 不需要进行签收 SZYK-45 TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( @@ -3417,7 +3417,7 @@ signedAmount++; } } - } + }*/ } // 修改发货单状态(部分签收/已签收) if (tousseInstanceList != null) { @@ -3471,7 +3471,7 @@ @Override public boolean canSign(TousseInstance tousseInstance,String signerOrgUnitCoding, String beginDateStr, String endDateStr) { - if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( + /*if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( tousseInstance.getTousseDefinition().getTousseType())){ TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); while(!tousseDefinition.getId().equals(tousseDefinition.getAncestorID())) { @@ -3480,7 +3480,7 @@ throw new RuntimeException("不能签收不追溯的消毒物品"); } } - } + }*/ String location = tousseInstance.getLocation(); String locationForDisplay = tousseInstance.getLocationForDisplay(); String location_2 = tousseInstance.getLocation_2(); @@ -3543,14 +3543,22 @@ /** * 根据器械包定义id获取待签收的包实例集合 * @param tdId 器械包定义id + * @param endDate + * @param beginDate * @return List */ - private List getCanSignTousseInstanceListByTousseDefinitionId(Long tdId){ + private List getCanSignTousseInstanceListByTousseDefinitionId(Long tdId, String beginDateStr, String endDateStr){ List canSignTis = new ArrayList(); if(DatabaseUtil.isPoIdValid(tdId)){ //根据器械包定义id,器械包实例状态,是否有签收人过滤 - String hql = String.format(" po.signedUser is null and po.status = '%s' and po.tousseDefinition.id = %s ", + String hql = String.format(" po.signedUser is null and po.status = '%s' and po.tousseDefinition.ancestorID = %s ", TousseInstance.STATUS_SHIPPED,tdId); + + // 第二个版本签收需要根据时间判断是否可以签收,第一个版本的不需要做判断 + if (StringUtils.isNotEmpty(beginDateStr) && StringUtils.isNotEmpty(endDateStr)) { + hql += " and " + dateQueryAdapter.dateAreaSql("po.invoiceSendTime", beginDateStr, endDateStr); + } + List tis = this.getByHql(hql); if(CollectionUtils.isNotEmpty(tis)){ //根据当前科室过滤 @@ -5154,7 +5162,7 @@ //若为不可追溯物品则: if(!td.traceable()){ //根据器械包定义获取待签收的器械包实例 - List canSignTis = this.getCanSignTousseInstanceListByTousseDefinitionId(td.getId()); + List canSignTis = this.getCanSignTousseInstanceListByTousseDefinitionId(td.getId(), beginDate, endDate); //每次扫描数量 Integer scanAmount = td.getScanAmount(); //根据器械包定义的每次扫描数量:获得这次扫描最多能签收的器械包实例 @@ -5274,14 +5282,14 @@ for (TousseInstance ti : tousseInstanceList) { TousseDefinition td = ti.getTousseDefinition(); - if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( + /*if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( td.getTousseType())){ td = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), td.getAncestorID()); if(!td.traceable()){ // 不能签收不追溯的消毒物品,整单签收时,需要忽略此类物品 continue; } - } + }*/ msg = signTousseInstance(ti, loginUserFullName, currentOrgUnitCode, new Date(), beginDate, endDate, false, signRecord); //签收成功 @@ -5307,7 +5315,6 @@ if(MapUtils.isNotEmpty(tousseNameAndIdMap) && isSuccess){ departmentStockManager.instrumentSetToBeAdded(currentOrgUnitName, currentOrgUnitCode, tousseNameAndIdMap); } - objectDao.flush(); // 查询器械包待签收数量 tIInfoJSONArray = setWaitSignAmountForTousseInstance(tIInfoJSONArray, tousseInstanceList, currentOrgUnitCode, beginDate, endDate, dateFormat, dateFormat2); } @@ -5327,14 +5334,29 @@ if(isSuccess){ // 修改发货单签收状态 + List invoiceIdList = new ArrayList(); for (Invoice invoice : tousseInstanceMap.keySet()) { invoice.setSignStatus(Invoice.SIGNSTATUS_SIGNED); invoice.setSignRecordId(signRecordId); // 扫描发货单号集合码或发货单号签收后,对应发货单的签收人和签收时间字段可通过获取单里的任意一个物品的签收人和签收时间来进行赋值。 invoice.setReceiptor(loginUserFullName); invoice.setReceiptingTime(new Date()); + invoiceIdList.add(invoice.getId()); } + if(CollectionUtils.isNotEmpty(invoiceIdList)){ + String updateSql = String.format("update %s set signStatus = '%s', signRecordId = %s" + + ", receiptor = '%s', receiptingTime = %s " + + "where %s", + Invoice.class.getSimpleName(), + Invoice.SIGNSTATUS_SIGNED, + signRecordId, + loginUserFullName, + dateQueryAdapter.getTodayAdapter(), + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", invoiceIdList)); + objectDao.excuteSQL(updateSql); + } + // 返回签收信息 msg = ""; if(signAmount > 0){ @@ -5593,12 +5615,12 @@ if(td != null){ tousseDefinitionIdList.add(td.getId()); } + objectDao.saveOrUpdate(ti); } } if(CollectionUtils.isEmpty(tousseDefinitionIdList)){ return tIInfoJSONArray; } - objectDao.batchSaveOrUpdate(allTousseInstanceList); String sql = "select ti.tousseName, count(0) waitSignAmount from " + TousseInstance.class.getSimpleName() + " ti where (1=1) and " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.tousseDefinition_id", tousseDefinitionIdList) + " and ti.status = '" + TousseInstance.STATUS_SHIPPED + "' "