Index: ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java =================================================================== diff -u -r37898 -r38066 --- ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 37898) +++ ssts-wash/src/main/java/com/forgon/disinfectsystem/washanddisinfectmanager/washanddisinfectrecord/service/WashAndDisinfectRecordManagerImpl.java (.../WashAndDisinfectRecordManagerImpl.java) (revision 38066) @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -20,7 +21,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -41,6 +41,8 @@ import org.hibernate.Query; import org.hibernate.Session; 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; @@ -211,7 +213,10 @@ InstrumentInstanceManager instrumentInstanceManager) { this.instrumentInstanceManager = instrumentInstanceManager; } - + private JdbcTemplate jdbcTemplate; + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } public void setOperationManager(OperationManager operationManager) { this.operationManager = operationManager; } @@ -1465,34 +1470,100 @@ } // 更新装配任务的清洗信息 - private void updatePackingTaskWashInfo(WashAndDisinfectRecord washRecord) { + private void updatePackingTaskWashInfo(WashAndDisinfectRecord washRecord){ List classifyBaskets = washRecord.getClassifyBaskets(); if (classifyBaskets == null || classifyBaskets.size() == 0) { return; } -// Set classifyBasketIDSet = new HashSet(); - for (ClassifyBasket classifyBasket : classifyBaskets) { - Long classifyBasketID = classifyBasket.getId(); -// classifyBasketIDSet.add(classifyBasketID); - String sql = String - .format("update packingTask set washTime = '%s',classifyBasket_id = %s ,washRecord_id =%s where basketBarcode like '%%%s%%' " - + "and (washRecord_id is null " - //如果清洗记录进行了重新清洗,装配任务应不再关联清洗失败的清洗记录,并关联重新清洗新增的清洗记录。SSTS-569 - + "or washRecord_id in (select wdr.id from %s wdr join ClassifyBasket_WashRecord cbwr on cbwr.washanddisinfectrecord_id = wdr.id " - + "where cbwr.classifybasket_id = %s and wdr.washstatus = '%s' and wdr.id < %s)" - + ")", - washRecord.getStartDateStr(), classifyBasketID, - washRecord.getId(), - classifyBasket.getContainerBarcode(), - WashAndDisinfectRecord.class.getSimpleName(), - classifyBasketID, - WashAndDisinfectRecord.STATUS_WASHFAILD, - washRecord.getId()); - objectDao.excuteSQL(sql); + Set cbIds = new HashSet(); + StringBuffer barcodeSql = new StringBuffer(); + barcodeSql.append(" and ("); + for (int i = 0; i < classifyBaskets.size(); i++) { + ClassifyBasket cb = classifyBaskets.get(i); + cbIds.add(cb.getId()); + if(i == 0){ + barcodeSql.append(" basketBarcode like '%"+ cb.getContainerBarcode() +"%' "); + }else{ + barcodeSql.append(" or basketBarcode like '%"+ cb.getContainerBarcode() +"%' "); + } } -// if(classifyBasketIDSet.size() == 0){ -// return; -// } + barcodeSql.append(" ) "); + List pts = objectDao.findByHql("select po from "+ PackingTask.class.getSimpleName() + " po where washRecord_id is null "+barcodeSql); + String ptIdsOfWashfaildSql = "select po.id from "+ PackingTask.class.getSimpleName() + + " po where exists (select 1 from " + + WashAndDisinfectRecord.class.getSimpleName() + +" wr join ClassifyBasket_WashRecord cw on cw.WashAndDisinfectRecord_ID=wr.id where po.washRecord_id=wr.id and wr.washStatus='" + + WashAndDisinfectRecord.STATUS_WASHFAILD + +"' " + + SqlUtils.getInLongListSql("cw.ClassifyBasket_ID", cbIds) + +" ) "; + Set ptIdsOfWashfaild = objectDao.getLongSet(ptIdsOfWashfaildSql); + if(!CollectionUtils.isEmpty(ptIdsOfWashfaild)){ + List ptsOfWashfaild = objectDao.findByHql("select po from "+ PackingTask.class.getSimpleName() + + " po where 1=1 "+SqlUtils.getInLongListSql("po.id", ptIdsOfWashfaild)); + pts.addAll(ptsOfWashfaild); + } + if(CollectionUtils.isEmpty(pts)){ + return; + } + JSONArray arr = new JSONArray(); + for (PackingTask pt : pts) { + if(StringUtils.isBlank(pt.getBasketBarcode())){ + continue; + } + String[] barcodes = pt.getBasketBarcode().contains(";")?pt.getBasketBarcode().split(";"):null; + Long classifyBasket_id = null; + out : for (ClassifyBasket cb : classifyBaskets) { + if(barcodes != null){ + for (int i = 0; i < barcodes.length; i++) { + if(StringUtils.isNotBlank(barcodes[i]) && cb.getContainerBarcode().equals(barcodes[i])){ + classifyBasket_id = cb.getId(); + break out; + } + } + }else if(pt.getBasketBarcode().equals(cb.getContainerBarcode())){ + classifyBasket_id = cb.getId(); + break out; + } + } + if(!DatabaseUtil.isPoIdValid(classifyBasket_id)){ + continue;//一般来说不会进这里 + } + if(DatabaseUtil.isPoIdValid(pt.getWashRecord_id()) && !ptIdsOfWashfaild.contains(pt.getId())){//没清洗记录的话 清洗失败也可以 + continue; + } + if(!cbIds.contains(classifyBasket_id)){//不是此清洗记录的篮筐不改 + continue; + } + + JSONObject obj = new JSONObject(); + obj.put("ptId", pt.getId()); + obj.put("classifyBasket_id", classifyBasket_id); + arr.add(obj); + } + if(arr.size() > 0){ + StringBuffer sql = new StringBuffer(); + String startDate = washRecord.getStartDateStr(); + sql.append("update "); + sql.append(PackingTask.class.getSimpleName()); + sql.append(" set washTime =?,classifyBasket_id=?,washRecord_id=? where id=?"); + jdbcTemplate.batchUpdate(sql.toString(), new BatchPreparedStatementSetter() { + + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + JSONObject obj = arr.getJSONObject(i); + ps.setString(1, startDate); + ps.setLong(2, obj.optLong("classifyBasket_id")); + ps.setLong(3, washRecord.getId()); + ps.setLong(4, obj.optLong("ptId")); + } + + @Override + public int getBatchSize() { + return arr.size(); + } + }); + } // TODO 以后可能可以改为根据classifyBasket_id去更新装配任务 }