Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java =================================================================== diff -u -r32634 -r36477 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java (.../RecyclingRecordManager.java) (revision 32634) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java (.../RecyclingRecordManager.java) (revision 36477) @@ -15,6 +15,7 @@ import com.forgon.disinfectsystem.recyclingrecord.vo.CustomIntoBasket; import com.forgon.disinfectsystem.recyclingrecord.vo.RecyclingBasketItemVo; import com.forgon.disinfectsystem.recyclingrecord.vo.RecyclingContext; +import com.forgon.disinfectsystem.recyclingrecord.vo.RecyclingSumInfoVo; import com.forgon.disinfectsystem.recyclingrecord.vo.UrgentTousseItem; import com.forgon.disinfectsystem.vo.TousseItemVo; import com.forgon.tools.hibernate.BasePoManager; @@ -168,7 +169,8 @@ * @param tousseDefIdTousseItemVoMap 包定义Id跟TousseItemVo的映射 */ public void voluntarilyUrgent(String department, List tousseItemJson, - List urgentTousseItems, JSONObject params,Map tousseDefIdTousseItemVoMap); + List urgentTousseItems, JSONObject params,Map tousseDefIdTousseItemVoMap, + RecyclingSumInfoVo recyclingSumInfoVo); /** * 干预修改回收记录的时间 Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java =================================================================== diff -u -r36194 -r36477 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 36194) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 36477) @@ -4,6 +4,7 @@ import java.util.Map; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; /** * 回收汇总信息vo @@ -24,4 +25,18 @@ public void setTdMap(Map tdMap) { this.tdMap = tdMap; } + /** + * 通过包定义id获取包定义 如果存在于tdMap中,则从tdMap获取 如果不存在tdMap中,则查询数据并加入tdMap中 + * @param tdId + * @param tousseDefinitionManager + * @return + */ + public TousseDefinition getTdByTdId(Long tdId, TousseDefinitionManager tousseDefinitionManager){ + if(tdMap.containsKey(tdId)){ + return tdMap.get(tdId); + } + TousseDefinition td = tousseDefinitionManager.get(tdId); + tdMap.put(tdId, td); + return td; + } } Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r36327 -r36477 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 36327) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 36477) @@ -1,8 +1,10 @@ package com.forgon.disinfectsystem.recyclingrecord.service; import java.math.BigDecimal; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -36,6 +38,8 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; import com.forgon.Constants; import com.forgon.databaseadapter.service.DateQueryAdapter; @@ -244,6 +248,10 @@ private StorageRecordManager storageRecordManager; @Autowired private DataHelperForRecyclingRecord dataHelperForRecyclingRecord; + private JdbcTemplate jdbcTemplate; + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } public void setStorageRecordManager(StorageRecordManager storageRecordManager) { this.storageRecordManager = storageRecordManager; } @@ -402,7 +410,10 @@ if (recyclingBasketItems != null) { Map tousseMap = getRecycleTousseItemMap(recyclingBasketItems); StringBuffer errorMessage = new StringBuffer(); - + //批量处理一些数据 + Set deleteRecyclingItemIds = new HashSet();//被删除的RecyclingItem.id + Map idCardInstanceBarcodesMap = new HashMap();//扫描回收的标识牌 + Map updateAmountMap = new HashMap();//数量有变动的RecyclingItem,需要批量修改和批量保存修改日志 for(Entry entry : tousseMap.entrySet()){ Long tousseDefinitionID = entry.getKey(); Integer amount = entry.getValue(); @@ -443,25 +454,15 @@ oldRecyclingAmount = 0; } recyclingItem.setAmount(oldRecyclingAmount + amount); - if(saveLogForUpdateRecyAmount(oldRecyclingAmount, recyclingItem) && StringUtils.isNotBlank(td.getTaskGroup())){ + if(saveLogForUpdateRecyAmount(oldRecyclingAmount, recyclingItem, updateAmountMap) && StringUtils.isNotBlank(td.getTaskGroup())){ taskGroupOfModifiedNumOfTousse.add(td.getTaskGroup()); } if(recyclingItem.getAmount() <= 0){ recyclingItem.setRecyclingRecord(null); items.remove(recyclingItem); if(recyclingItem.getId() != null){ objectDao.delete(recyclingItem); - //也要对应删除相关联的包实例的recyclingItemId的值 - List updateList = objectDao.findByProperty(TousseInstance.class.getSimpleName(), "recyclingItemId", recyclingItem.getId().toString()); - if (CollectionUtils.isNotEmpty(updateList)) { - for (TousseInstance ti : updateList) { - ti.setRecyclingItemId(null); - ti.setRecyclingStatus(""); - objectDao.save(ti); - useRecordIds.add(ti.getUseRecord_id()); - } - } -// objectDao.excuteSQL("update "+ TousseInstance.class.getSimpleName() +" set recyclingItemId=null,recyclingStatus='' where recyclingItemId = " + recyclingItem.getId()); + deleteRecyclingItemIds.add(recyclingItem.getId()); } } else { TousseItemVo tousseItemVo = tousseDefIdTousseItemVoMap.get(tousseDefinitionID); @@ -475,34 +476,90 @@ String tousseOrIDCardInstanceBarcodes = tousseItemVo.getTousseOrIDCardInstanceBarcodes(); //设置对应包实例的“回收状态”和“回收项id” if (StringTools.isNotBlank(tousseOrIDCardInstanceBarcodes)) { - String[] arr = tousseOrIDCardInstanceBarcodes.split(";"); - int length = arr.length; - if (length > amount) { - length = amount; - } - for (int i = 0; i < length; i++) { - BarcodeDevice barcodeDevice = barcodeManager.getBarcodeByBarcode(arr[i]); - TousseInstance ti = null; - if (barcodeDevice instanceof TousseInstance) { - ti = (TousseInstance) barcodeDevice; - } else if (barcodeDevice instanceof IDCardInstance) { - IDCardInstance idCardInstance = (IDCardInstance) barcodeDevice; - ti = IDCardInstanceUtils.getLastOperatedTousseInstance(objectDao, idCardInstance); - } - if (ti != null && StringTools.equals(ti.getTousseDefinition().getIsRecycling(), Constants.STR_YES)) { - ti.setRecyclingItemId(recyclingItem.getId()); - ti.setRecyclingStatus(TousseInstance.STATUS_RECYCLED); - objectDao.save(ti); - useRecordIds.add(ti.getUseRecord_id()); - } - } + idCardInstanceBarcodesMap.put(recyclingItem.getId(), tousseOrIDCardInstanceBarcodes); } } } } + + batchSaveLogForUpdateRecyAmount(updateAmountMap); if(errorMessage.length() > 0){ throw new SystemException(recyclingRecord.getDepart() + "的" + errorMessage.toString() + "已经被回收,不会被快速回收!"); } + StringBuffer sbf = new StringBuffer(); + if(CollectionUtils.isNotEmpty(deleteRecyclingItemIds)){ + sbf.setLength(0); + sbf.append("select useRecord_id from "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" where "); + sbf.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("recyclingItemId", deleteRecyclingItemIds)); + useRecordIds.addAll(objectDao.getLongSet(sbf.toString())); + sbf.setLength(0); + sbf.append("update "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" set recyclingItemId=null,recyclingStatus=null where "); + sbf.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("recyclingItemId", deleteRecyclingItemIds)); + objectDao.excuteSQL(sbf.toString()); + } + if(MapUtils.isNotEmpty(idCardInstanceBarcodesMap)){//totalBarcodes只有标识牌条码才会传值了 + sbf.setLength(0); + Set totalBarcodes = new HashSet(); + for (Entry entry : idCardInstanceBarcodesMap.entrySet()) { + Set thisBarcodes = SqlUtils.splitStringToSet(entry.getValue(), Constants.IDS_SEPARATOR); + totalBarcodes.addAll(thisBarcodes); + String barcodeSql = SqlUtils.getStringFieldInLargeCollectionsPredicate("bd.barcode", thisBarcodes); +/* sbf.append("update "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" set recyclingItemId="); + sbf.append(entry.getKey()); + sbf.append(" ,recyclingStatus='"); + sbf.append(TousseInstance.STATUS_RECYCLED); + sbf.append("' where id in (select bd.id from "); + sbf.append(BarcodeDevice.class.getSimpleName()); + sbf.append(" bd where "); + sbf.append(barcodeSql); + sbf.append(");");*/ + sbf.append("update "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" set recyclingItemId="); + sbf.append(entry.getKey()); + sbf.append(" ,recyclingStatus='"); + sbf.append(TousseInstance.STATUS_RECYCLED); + sbf.append("' where id in (select ii.lastTousseInstanceId from "); + sbf.append(BarcodeDevice.class.getSimpleName()); + sbf.append(" bd join "); + sbf.append(IDCardInstance.class.getSimpleName()); + sbf.append(" ii on ii.id=bd.id where "); + sbf.append(barcodeSql); + sbf.append(") and tousseDefinition_id in(select id from "); + sbf.append(TousseDefinition.class.getSimpleName()); + sbf.append(" where isRecycling='是');"); + } + jdbcTemplate.execute(sbf.toString()); + sbf.setLength(0); + String totalBarcodeSql = SqlUtils.getNonStringFieldInLargeCollectionsPredicate("bd.barcode", totalBarcodes); + /*sbf.append("select ti.useRecord_id from "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" ti join "); + sbf.append(TousseDefinition.class.getSimpleName()); + sbf.append(" td on td.id=ti.tousseDefinition_id join "); + sbf.append(BarcodeDevice.class.getSimpleName()); + sbf.append(" bd on bd.id=ti.id where td.isRecycling='是' and ti.useRecord_id is not null and "); + sbf.append(totalBarcodeSql); + sbf.append(" union all ");*/ + sbf.append(" select ti.useRecord_id from "); + sbf.append(TousseInstance.class.getSimpleName()); + sbf.append(" ti join "); + sbf.append(TousseDefinition.class.getSimpleName()); + sbf.append(" td on td.id=ti.tousseDefinition_id join "); + sbf.append(IDCardInstance.class.getSimpleName()); + sbf.append(" ii on ii.lastTousseInstanceId=ti.id join "); + sbf.append(BarcodeDevice.class.getSimpleName()); + sbf.append(" bd on bd.id=ii.id where td.isRecycling='是' and ti.useRecord_id is not null and "); + sbf.append(totalBarcodeSql); + sbf.append(";"); + useRecordIds.addAll(objectDao.getLongSet(sbf.toString())); + } } //更新使用记录的recyclingStatus属性 @@ -583,26 +640,91 @@ } } /** + * 批量修改回收数量和批量保存修改日志 + * @param updateAmountInfo value:旧的数量 + */ + private void batchSaveLogForUpdateRecyAmount(Map updateAmountInfo){ + if(updateAmountInfo.size() > 0){ + List recyclingItems = new ArrayList(); + for (Entry entry : updateAmountInfo.entrySet()) { + recyclingItems.add(entry.getKey()); + } + StringBuffer sql = new StringBuffer(); + sql.append("update "); + sql.append(TousseItem.class.getSimpleName()); + sql.append(" set recyclingAmount=?,recyclingTempAmout=? where recyclingApplication_ID in(select rr.recyclingApplication_id from "); + sql.append(RecyclingItem.class.getSimpleName()); + sql.append(" ri inner join "); + sql.append(RecyclingRecord.class.getSimpleName()); + sql.append(" rr on ri.recyclingRecord_id=rr.id where ri.id=?) and tousseDefinitionId =?;"); + jdbcTemplate.batchUpdate(sql.toString(), new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + RecyclingItem recyclingItem = recyclingItems.get(i); + ps.setInt(1, recyclingItem.getAmount()); + ps.setInt(2, recyclingItem.getAmount()); + ps.setLong(3, recyclingItem.getId()); + ps.setLong(4, recyclingItem.getTousseDefinitionId()); + } + + @Override + public int getBatchSize() { + return recyclingItems.size(); + } + }); + sql.setLength(0); + LoginUserData loginUser = AcegiHelper.getLoginUser(); + String idColumnName = ""; + String idColumnValue = ""; + if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + idColumnName = "id,"; + idColumnValue = "hibernate_sequence.nextval,"; + } + Timestamp newDate = new Timestamp(new Date().getTime()); + String logSql = String.format("insert into %s (%s logDateTime,userName, userId, userIp, model, operationType, operationDescription, clientType, clientVersion, sessionID)" + + "values (%s ?,?,?,?,?,?,?,?,?,?)", Log.class.getSimpleName(), idColumnName, idColumnValue); + String userId = loginUser.getUserId() == null?null:loginUser.getUserId().toString(); + jdbcTemplate.batchUpdate(logSql, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + RecyclingItem recyclingItem = recyclingItems.get(i); + Integer oldRecyclingAmount = updateAmountInfo.get(recyclingItem); + String updateMsg = null; + if(oldRecyclingAmount > recyclingItem.getAmount()){ + updateMsg = String.format("减少了回收数量,物品名称:%s,包定义id:%s,修改前数量:%s,修改后数量:%s", recyclingItem.getTousseName(),recyclingItem.getTousseDefinitionId(),oldRecyclingAmount,recyclingItem.getAmount()); + }else{ + updateMsg = String.format("增加了回收数量,物品名称:%s,包定义id:%s,修改前数量:%s,修改后数量:%s", recyclingItem.getTousseName(),recyclingItem.getTousseDefinitionId(),oldRecyclingAmount,recyclingItem.getAmount()); + } + ps.setTimestamp(1, newDate); + ps.setString(2, loginUser.getUserFullName()); + ps.setString(3, userId); + ps.setString(4, loginUser.getUserIP()); + ps.setString(5, Log.MODEL_RECYCLINGRECORD); + ps.setString(6, Log.TYPE_UPDATE); + ps.setString(7, updateMsg); + ps.setString(8, loginUser.getClientType()); + ps.setString(9, loginUser.getClientVersion()); + ps.setString(10, loginUser.getSessionID()); + } + + @Override + public int getBatchSize() { + return recyclingItems.size(); + } + }); + } + } + /** * * 保存修改回收数量的日志 * @param oldRecyclingAmount 修改前数量 * @param recyclingItem 修改的RecyclingItem * @return 是否修改了数量 用于刷新装配页面 */ - private boolean saveLogForUpdateRecyAmount(Integer oldRecyclingAmount, RecyclingItem recyclingItem){ + private boolean saveLogForUpdateRecyAmount(Integer oldRecyclingAmount, RecyclingItem recyclingItem, Map updateAmountInfo){ if(!oldRecyclingAmount.equals(recyclingItem.getAmount())){ - String updateMsg = null; - String sql = String.format("update %s set recyclingAmount=%s,recyclingTempAmout=%s where recyclingApplication_ID in(select rr.recyclingApplication_id from RecyclingItem ri inner join RecyclingRecord rr on ri.recyclingRecord_id=rr.id where ri.id=%s) and tousseDefinitionId =%s ", - TousseItem.class.getSimpleName(),recyclingItem.getAmount(),recyclingItem.getAmount(),recyclingItem.getId(), - recyclingItem.getTousseDefinitionId()); - if(oldRecyclingAmount > recyclingItem.getAmount()){ - updateMsg = String.format("减少了回收数量,物品名称:%s,包定义id:%s,修改前数量:%s,修改后数量:%s", recyclingItem.getTousseName(),recyclingItem.getTousseDefinitionId(),oldRecyclingAmount,recyclingItem.getAmount()); - - }else{ - updateMsg = String.format("增加了回收数量,物品名称:%s,包定义id:%s,修改前数量:%s,修改后数量:%s", recyclingItem.getTousseName(),recyclingItem.getTousseDefinitionId(),oldRecyclingAmount,recyclingItem.getAmount()); - } - objectDao.excuteSQL(sql); - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_RECYCLINGRECORD, Log.TYPE_UPDATE, updateMsg); + updateAmountInfo.put(recyclingItem, oldRecyclingAmount); return true; } return false; @@ -678,13 +800,14 @@ * {detailId:1,tousseDefinitionID:1,tousseName:'开胸包',materialDefinitionId:12,materialName:'镊子[12cm]',amount:3,errorType:'缺失',itemType:'报损',tousseBarcode:'010000100'} * 说明: 丢失和报损一定要确认了之后,装配那里才能补充,回收未确认装配任务的状是【待确认】状态 */ - private void setMaterialErrorDamageDetail(RecyclingRecord record,List errorJsonArray,boolean confirmation) { + private void setMaterialErrorDamageDetail(RecyclingRecord record,List errorJsonArray,boolean confirmation, RecyclingSumInfoVo recyclingSumInfoVo) { if(errorJsonArray != null){ LoginUserData loginUser = AcegiHelper.getLoginUser(); Map tousseDefinitionIdRecyclingItemMap = getTousseDefinitionIdRecyclingItemMap(record); Map toSplitIdCardMap = new HashMap(); boolean tousseMaterialsLostMustConfirm = CssdUtils.getSystemSetConfigByNameBool("tousseMaterialsLostMustConfirm",true); Map departCodingToSettleDepartMap = new HashMap();//科室对应的默认结算科室 + JSONObject applyDepartDefaultSettleDepartJSON = null; for (int i = 0; i < errorJsonArray.size(); i++) { MaterialErrorDamageDetailVo obj = errorJsonArray.get(i); Long detailId = obj.getDetailId(); @@ -749,7 +872,10 @@ if(departCodingToSettleDepartMap.containsKey(record.getDepartCode())){ settleDepart = departCodingToSettleDepartMap.get(record.getDepartCode()); }else{ - settleDepart = supplyRoomConfigManager.getApplyDepartDefaultSettleDepartJSON(record.getDepartCode()); + if(applyDepartDefaultSettleDepartJSON == null){ + applyDepartDefaultSettleDepartJSON = supplyRoomConfigManager.getApplyDepartDefaultSettleDepartJSON(record.getDepartCode()); + } + settleDepart = applyDepartDefaultSettleDepartJSON; departCodingToSettleDepartMap.put(record.getDepartCode(), settleDepart); } detail.setSettleAccountsDepart(settleDepart.optString("name")); @@ -766,7 +892,7 @@ detail.setMaterialDefinitionId(materialDefinitionId); detail.setType(itemType); if(recyclingItem == null){ - TousseDefinition td = tousseDefinitionManager.get(tousseDefinitionID); + TousseDefinition td = recyclingSumInfoVo.getTdByTdId(tousseDefinitionID, tousseDefinitionManager); if(td == null){ throw new RuntimeException("未找到"+ tousseDefinitionID +"的包定义"); } @@ -1336,34 +1462,20 @@ } } //移除空篮筐 + Set findIds = objectDao.getLongSet("select cb.id from " + + ClassifyBasket.class.getSimpleName() + +" cb join " + + ClassifiedItem.class.getSimpleName() + +" ci on ci.classifybasket_id=cb.id where ci.recyclingRecordId=" + +record.getId()); Iterator itr2 = baskets.iterator(); while(itr2.hasNext()){ - boolean removeBasket = true; - for (ClassifiedItem ci : itr2.next().getClassfiedItems()) { - if (record.getId().equals(ci.getRecyclingRecordId())) { - removeBasket = false; - break; - } - } - if(removeBasket){ + ClassifyBasket item = itr2.next(); + if(CollectionUtils.isEmpty(findIds) || !findIds.contains(item.getId())){ itr2.remove(); } } - if(CollectionUtils.isNotEmpty(baskets) && CollectionUtils.isNotEmpty(basketSizeArr)){ - for (int i = 0; i < basketSizeArr.size(); i++) { - JSONObject basketObj = (JSONObject)basketSizeArr.get(i); - String basketBarcode = basketObj.optString("basketBarcode"); - if(StringUtils.isBlank(basketBarcode)){ - continue; - } - for (ClassifyBasket cb : baskets) { - if(basketBarcode.equals(cb.getContainerBarcode())){ - cb.setBasketSize(basketObj.optString("basketSize")); - classifyBasketManager.save(cb); - } - } - } - } + batchUpdateBasketSize(baskets, basketSizeArr); record.setClassifyBaskets(baskets); updateIdCardInstanceItems(record); } @@ -1379,31 +1491,72 @@ if(CollectionUtils.isEmpty(baskets)){ return; } - Map> idCardBarcodeMapClassifiedItem = new HashMap>(); + Set basketIds = new HashSet(); for(ClassifyBasket basket : baskets){ if(basket == null){ continue; } - for(ClassifiedItem item : basket.getClassfiedItems()){ - if(StringTools.isNotBlank(item.getIdCardBarcode())){ - Set itemSet = idCardBarcodeMapClassifiedItem.get(item.getIdCardBarcode()); - if(itemSet == null){ - itemSet = new HashSet(); - idCardBarcodeMapClassifiedItem.put(item.getIdCardBarcode(), itemSet); - } - itemSet.add(item); - } - + if(DatabaseUtil.isPoIdValid(basket.getId())){ + basketIds.add(basket.getId()); } } - String where = SqlUtils.getStringFieldInLargeCollectionsPredicate("po.barcode", idCardBarcodeMapClassifiedItem.keySet()); - List idCards = idCardInstanceManager.getByHql(where); - if(CollectionUtils.isNotEmpty(idCards)){ - for(IDCardInstance idCard : idCards){ - idCard.safelySetLastClassifiedItemIds(idCardBarcodeMapClassifiedItem.get(idCard.getBarcode())); - idCardInstanceManager.save(idCard); + StringBuffer sbf = new StringBuffer(); + sbf.append("select ci.id,ci.idCardBarcode from "); + sbf.append(ClassifiedItem.class.getSimpleName()); + sbf.append(" ci where "); + sbf.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ci.classifybasket_id", basketIds)); + sbf.append(SqlUtils.getIsNotNullSql(dbConnection, "ci.idCardBarcode")); + Map> idCardBarcodeMap = new HashMap>(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sbf.toString()); + while (rs.next()){ + List ciIds = null; + String idCardBarcode = rs.getString("idCardBarcode"); + if(StringUtils.isBlank(idCardBarcode)){ + continue; + } + if(idCardBarcodeMap.containsKey(idCardBarcode)){ + idCardBarcodeMap.get(idCardBarcode); + }else{ + ciIds = new ArrayList(); + idCardBarcodeMap.put(idCardBarcode, ciIds); + } + Long id = rs.getLong("id"); + ciIds.add(id); } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); } + if(MapUtils.isEmpty(idCardBarcodeMap)){ + return; + } + List>> paraMapList = new ArrayList>>(); + for(Entry> entry : idCardBarcodeMap.entrySet()){ + Map> paraMap = new HashMap>(); + paraMap.put(entry.getKey(), entry.getValue()); + paraMapList.add(paraMap); + } + String sql = "update " + IDCardInstance.class.getSimpleName()+" set lastClassifiedItemIds=? where id=(select id from BarcodeDevice where barcode=?)"; + jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + Map> paraMap = paraMapList.get(i); + for (Entry> entry : paraMap.entrySet()) { + ps.setString(1, StringTools.join(entry.getValue(), ";")); + ps.setString(2, entry.getKey()); + } + + } + + @Override + public int getBatchSize() { + return paraMapList.size(); + } + }); } private ClassifiedItem getExistClassifiedItem(Long recordId, String itemType, String name, Long tousseDefinitionId, @@ -1781,7 +1934,11 @@ //包定义Id集合 Collection tousseDefIds = CollectionUtils.union(tousseDefIdTousseItemVoMap.keySet(), basketItemJson.stream().map(p->p.getTousseDefinitionID()).collect(Collectors.toSet())); //包定义集合 - List tousseDefinitions = tousseDefinitionManager.getCollection(tousseDefIds); + @SuppressWarnings("unchecked") + List tousseDefinitions = objectDao.findByHql("select distinct po from " + + TousseDefinition.class.getSimpleName() + + " po left join fetch po.materialInstances where " + +SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", tousseDefIds)); tousseDefinitionManager.initTousseGoods(tousseDefinitions); //验证回收时的包定义 verifyTousseAtRecycling(record, tousseDefIds,recyclingContext); @@ -1828,7 +1985,10 @@ } tousseDefIdTousseItemVoMap = tousseDefIdTousseItemVoMapNew; tousseDefIds = CollectionUtils.union(tousseDefIdTousseItemVoMap.keySet(), basketItemJson.stream().map(p->p.getTousseDefinitionID()).collect(Collectors.toSet())); - tousseDefinitions = tousseDefinitionManager.getCollection(tousseDefIds); + tousseDefinitions = objectDao.findByHql("select po from " + + TousseDefinition.class.getSimpleName() + + " po left join fetch po.materialInstances where " + +SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.id", tousseDefIds)); tousseDefinitionManager.initTousseGoods(tousseDefinitions); //申请还物单的id List borrowRecyclingApplicationIds = returnGoodsVo.getNewBorrowingRecyclingApplicationIds(); @@ -1909,7 +2069,7 @@ } } if (CssdUtils.getSystemSetConfigByNameBool("enableTousseVoluntarilyUrgent", false)) { - voluntarilyUrgent(record.getDepart(),tousseItemJson, urgentTousseItems, params, tousseDefIdTousseItemVoMap); + voluntarilyUrgent(record.getDepart(),tousseItemJson, urgentTousseItems, params, tousseDefIdTousseItemVoMap,recyclingSumInfoVo); } //是否外来器械申请单 @@ -1932,10 +2092,7 @@ addLogInfo(params,record.getId()); boolean isChangeApplyDepart = isChangeApplyDepartment(record); - List tousseOfTousseItems = getTousseDefinitionsOfTousseItems(record.getRecyclingApplication()); - if(CollectionUtils.isNotEmpty(tousseOfTousseItems)){ - tousseDefinitions.addAll(tousseOfTousseItems); - } + getTousseDefinitionsOfTousseItems(record.getRecyclingApplication(), tousseDefinitions); seTdMapOfRecyclingSumInfoVo(tousseDefinitions, recyclingSumInfoVo); //更新申请单(如果是回收页面直接产添加回收记录则创建申请单) updateInvoicePlan(record,recyclingContext, tousseItemJson, deleteTousseItems, tousseDefinitions, @@ -1960,7 +2117,7 @@ //设置回收物品 setRecylingItems(recyclingContext, record, tousseItemJson,tousseDefinitions,urgentTousseItems,tousseDefIdTousseItemVoMap,taskGroupOfModifiedNumOfTousse, cameraPhotoInfo); //设置回收误差、器械报损 - setMaterialErrorDamageDetail(record, errorDamageDetail,confirmation); + setMaterialErrorDamageDetail(record, errorDamageDetail,confirmation,recyclingSumInfoVo); //设置回收记录状态 setRecyclingRecordStatus(record,confirmation); //设置装配任务 @@ -2094,20 +2251,31 @@ } } /** - * 一次性查询申请单里的包定义 + * 一次性查询申请单里的没查过的包定义 * @param invoicePlan + * @param tds 已经查询过的包定义 * @return */ - private List getTousseDefinitionsOfTousseItems(InvoicePlan invoicePlan){ - List tds = null; + private void getTousseDefinitionsOfTousseItems(InvoicePlan invoicePlan, List tds){ if(invoicePlan != null && CollectionUtils.isNotEmpty(invoicePlan.getApplicationItems())){ Set tdIds = new HashSet(); for (TousseItem ti : invoicePlan.getApplicationItems()) { + boolean find = false; + for (TousseDefinition td : tds) { + if(MathTools.equals(td.getId(), ti.getTousseDefinitionId())){ + find = true; + break; + } + } + if(find){ + continue; + } tdIds.add(ti.getTousseDefinitionId()); } - tds = tousseDefinitionManager.getCollection(tdIds); + if(tdIds.size() > 0){ + tds.addAll(tousseDefinitionManager.getCollection(tdIds)); + } } - return tds; } /** * 设置回收拍照信息 @@ -2579,7 +2747,7 @@ } } if (CssdUtils.getSystemSetConfigByNameBool("enableTousseVoluntarilyUrgent", false)) { - voluntarilyUrgent(record.getDepart(),tousseItemJson, urgentTousseItems,params, tousseDefIdTousseItemVoMap); + voluntarilyUrgent(record.getDepart(),tousseItemJson, urgentTousseItems,params, tousseDefIdTousseItemVoMap,recyclingSumInfoVo); } if(CollectionUtils.isEmpty(tousseItemJson) && (tousseDefIdTousseItemVoMap == null || tousseDefIdTousseItemVoMap.size() == 0)){ @@ -2638,7 +2806,7 @@ if(true){ //设置回收误差、器械报损 - setMaterialErrorDamageDetail(record, errorDamageDetail,confirmation); + setMaterialErrorDamageDetail(record, errorDamageDetail,confirmation,recyclingSumInfoVo); //设置回收记录状态 setRecyclingRecordStatus(record,confirmation); //设置装配任务 @@ -3265,7 +3433,8 @@ } @Override public void voluntarilyUrgent(String department, List tousseItemJson, - List urgentTousseItems, JSONObject params, Map tousseDefIdTousseItemVoMap) { + List urgentTousseItems, JSONObject params, Map tousseDefIdTousseItemVoMap + ,RecyclingSumInfoVo recyclingSumInfoVo) { //先把tousseItemJson里面的启用标识牌的器械包合并 Collection tousseItemJsonTemp = mergeIdCardTousse(tousseItemJson); JSONArray voluntarilyUrgentItems = new JSONArray(); @@ -3287,15 +3456,15 @@ } } if (CollectionUtils.isNotEmpty(tousseItemJsonTemp)) { + String orgUnitCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); for (RecyclingBasketItemVo json : tousseItemJsonTemp) { Long tousseDefinitionID = json.getTousseDefinitionID(); String tousseName = json.getTousseName(); - String orgUnitCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); //回收的数量 int amount = json.getAmount(); //回收的数量+处于供应室的数量 int amount2 = amount; - TousseDefinition td = tousseDefinitionManager.get(tousseDefinitionID); + TousseDefinition td = recyclingSumInfoVo.getTdByTdId(tousseDefinitionID, tousseDefinitionManager); if (td == null) { throw new RuntimeException(String.format("器械包【%s】包定义不存在!", tousseName)); } @@ -9686,4 +9855,50 @@ } return tdMap; } + /** + * 批量修改篮筐大小 + * @param baskets + * @param basketSizeArr 修改篮筐大小的参数 + */ + private void batchUpdateBasketSize(List baskets, JSONArray basketSizeArr){ + if(CollectionUtils.isNotEmpty(baskets) && CollectionUtils.isNotEmpty(basketSizeArr)){ + List> basketSizeList = new ArrayList>(); + for (int i = 0; i < basketSizeArr.size(); i++) { + JSONObject basketObj = (JSONObject)basketSizeArr.get(i); + String basketBarcode = basketObj.optString("basketBarcode"); + if(StringUtils.isBlank(basketBarcode)){ + continue; + } + for (ClassifyBasket cb : baskets) { + if(basketBarcode.equals(cb.getContainerBarcode())){ + Map basketSizeMap = new HashMap(); + String basketSize = basketObj.optString("basketSize"); + basketSizeMap.put(cb.getId(), basketObj.optString("basketSize")); + cb.setBasketSize(basketSize); + basketSizeList.add(basketSizeMap); + } + } + } + if(basketSizeList.size() > 0){ + String sql = "update " + ClassifyBasket.class.getSimpleName()+" set basketSize=? where id=?;"; + jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + Map basketSizeMap = basketSizeList.get(i); + for (Entry entry : basketSizeMap.entrySet()) { + ps.setString(1, entry.getValue()); + ps.setLong(2, entry.getKey()); + } + + } + + @Override + public int getBatchSize() { + return basketSizeList.size(); + } + }); + } + } + } }