Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java =================================================================== diff -u -r29695 -r29808 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 29695) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 29808) @@ -5,9 +5,11 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -22,7 +24,6 @@ import net.sf.json.util.PropertyFilter; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.struts2.convention.annotation.Action; @@ -51,6 +52,7 @@ import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.packing.vo.PackingTaskVoForContainer; import com.forgon.disinfectsystem.packing.vo.ReviewerVo; +import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskInfoVo; import com.forgon.disinfectsystem.tousse.comboTousse.service.ComboTousseManager; import com.forgon.disinfectsystem.tousse.imagefilemanager.service.ImageFileManager; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; @@ -1055,46 +1057,58 @@ if (comboTousseTD == null) { throw new RuntimeException("聚合包定义已不存在!"); } - List> list = comboTousseManagerImpl.getComboTousseOrgUnitByTdId(comboTousseDefinitionId); - if (CollectionUtils.isEmpty(list)) { - throw new RuntimeException("该聚合包未定义所属科室"); + List> list = null; + if(StringUtils.isBlank(departCoding)){ + list = comboTousseManagerImpl.getComboTousseOrgUnitByTdId(comboTousseDefinitionId); + if (CollectionUtils.isEmpty(list)) { + throw new RuntimeException("该聚合包未定义所属科室"); + } } array = JSONArray.fromObject(includeTousseString); String handlerDepartCode = AcegiHelper.getLoginUser() .getOrgUnitCodingFromSupplyRoomConfig(); - SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); - //清洗完成后装配 - boolean isPackingAfterWashTimeEnd = true; - if(config != null){ - isPackingAfterWashTimeEnd = BooleanUtils.toBooleanDefaultIfNull(config.getIsPackingAfterWashTimeEnd(), true); + Set tousseDefinitionIds = new HashSet(); + for (int i = 0; i < array.size(); i++) { + JSONObject item = array.optJSONObject(i); + Long tousseDefinitionId = item.optLong("id"); + tousseDefinitionIds.add(tousseDefinitionId); } + List WaitPackingTaskInfoVos = null; + if(StringUtils.isNotBlank(departCoding)){ + WaitPackingTaskInfoVos = packingManager.getWaitPackingTaskInfoVosForPackingComTousse(tousseDefinitionIds, handlerDepartCode, Collections.singletonList(departCoding)); + }else{ + List orgUnitCodingList = new ArrayList(); + for (Map map : list) { + String code = (String)map.get("unitCode"); + if(StringUtils.isEmpty(code)){ + throw new RuntimeException("comboTousseDefinitionId:"+comboTousseDefinitionId+"的聚合包定义所属科室数据异常!"); + } + orgUnitCodingList.add(code); + } + WaitPackingTaskInfoVos = packingManager.getWaitPackingTaskInfoVosForPackingComTousse(tousseDefinitionIds, handlerDepartCode, orgUnitCodingList); + } for (int i = 0; i < array.size(); i++) { JSONObject item = array.optJSONObject(i); Long tousseDefinitionId = item.optLong("id"); - List taskList = packingManager - .findPackingTaskBySQL(tousseDefinitionId, - handlerDepartCode, list); - if (taskList != null) { - int totalAmount = 0; - int unWashAmount = 0; + if (WaitPackingTaskInfoVos != null) { + int totalUnPackAmount = 0; + int unWashSumAmount = 0; List taskIds = new ArrayList(); - for (PackingTask packingTask : taskList) { - if(StringUtils.isNotBlank(departCoding) && !StringUtils.equals(departCoding, packingTask.getDepartCoding())){ + for (WaitPackingTaskInfoVo waitPackingTaskInfoVo : WaitPackingTaskInfoVos) { + if(tousseDefinitionId.longValue() != waitPackingTaskInfoVo.getTousseDefinitionId()){ continue; } - if (isPackingAfterWashTimeEnd - && PackingTask.TASK_RECYCLINGRECORD - .equals(packingTask.getTaskType()) - && StringUtils.isBlank(packingTask - .getWashTime())) { - unWashAmount += packingTask.getUnPackAmount(); - } else { - totalAmount += packingTask.getUnPackAmount(); - taskIds.add(packingTask.getId()); + Integer unPackAmount = waitPackingTaskInfoVo.getUnPackAmount(); + Integer unWashAmount = waitPackingTaskInfoVo.getUnWashAmount(); + if(unPackAmount > 0){ + totalUnPackAmount += unPackAmount; + taskIds.add(waitPackingTaskInfoVo.getPackingTaskId()); + }else if(unWashAmount > 0){ + unWashSumAmount += unWashAmount; } } - item.put("currrentTaskAmount", totalAmount); - item.put("unWashAmount", unWashAmount); + item.put("currrentTaskAmount", totalUnPackAmount); + item.put("unWashAmount", unWashSumAmount); getTaskErrorAndDamageAmount(taskIds,item); } } @@ -1108,7 +1122,6 @@ result.put("data", array); StrutsResponseUtils.output(result); } - /** * 获取装配任务丢失、报损数量 * @return Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/vo/WaitPackingTaskInfoVo.java =================================================================== diff -u --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/vo/WaitPackingTaskInfoVo.java (revision 0) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/vo/WaitPackingTaskInfoVo.java (revision 29808) @@ -0,0 +1,59 @@ +package com.forgon.disinfectsystem.packing.vo; +/** + * 装配管理模块聚合包装配用的vo + * @author zc.li 2020.12.07 + */ +public class WaitPackingTaskInfoVo { + /** + * 装配任务id + */ + private Long packingTaskId; + /** + * 申请科室编码 + */ + private String departCoding; + /** + * 包定义id + */ + private Long tousseDefinitionId; + /** + * 未装配数量 + */ + private Integer unPackAmount = 0; + /** + * 未清洗数量 + */ + private Integer unWashAmount = 0; + public Long getPackingTaskId() { + return packingTaskId; + } + public void setPackingTaskId(Long packingTaskId) { + this.packingTaskId = packingTaskId; + } + public String getDepartCoding() { + return departCoding; + } + public void setDepartCoding(String departCoding) { + this.departCoding = departCoding; + } + public Long getTousseDefinitionId() { + return tousseDefinitionId; + } + public void setTousseDefinitionId(Long tousseDefinitionId) { + this.tousseDefinitionId = tousseDefinitionId; + } + public Integer getUnPackAmount() { + return unPackAmount; + } + public void setUnPackAmount(Integer unPackAmount) { + this.unPackAmount = unPackAmount; + } + public Integer getUnWashAmount() { + return unWashAmount; + } + public void setUnWashAmount(Integer unWashAmount) { + this.unWashAmount = unWashAmount; + } + + +} Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r29751 -r29808 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 29751) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 29808) @@ -130,6 +130,7 @@ import com.forgon.disinfectsystem.packing.vo.PackingTaskForDisplay; import com.forgon.disinfectsystem.packing.vo.PackingTaskVoForContainer; import com.forgon.disinfectsystem.packing.vo.ReviewerVo; +import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskInfoVo; import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskItemVo; import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskVo; import com.forgon.disinfectsystem.packingrecordclassifybasket.service.PackingRecordClassifyBasketManager; @@ -165,6 +166,7 @@ import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.excel.ExcelCellStyle; import com.forgon.tools.excel.ExcelHelper; +import com.forgon.tools.format.ConvertNumber; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.string.StringTools; @@ -6882,6 +6884,7 @@ Map sterilingTypeToSterilingModeMap = new HashMap(); //待发送刷新消息的任务组集合 List waitSendRefreshMessageTaskGroupList = new ArrayList(); + String departCoding = JSONUtil.optString(paramsObj, "departCoding", ""); for (int i = 0; i < comboTousseJsonArray.size(); i++) { JSONObject comboTousseJson = comboTousseJsonArray.optJSONObject(i); @@ -6892,7 +6895,7 @@ throw new RuntimeException(comboTousseName + "定义已不存在!"); } //验证数据 - comboTousseDataValidate(comboTousseTD,comboTousseJson,sterileDate); + comboTousseDataValidate(comboTousseTD,comboTousseJson,sterileDate, departCoding); if(StringUtils.equals(Constants.STR_YES, comboTousseTD.getIsReview())){ String taskGroupOfComboTousse = comboTousseTD.getTaskGroupFromCssdHandleTousse(AcegiHelper.getCurrentOrgUnitCode(), objectDao); if(StringUtils.isNotBlank(taskGroupOfComboTousse) @@ -7057,17 +7060,24 @@ * @param comboTousseJsonArray * @return */ - private void comboTousseDataValidate(TousseDefinition comboTousseTD,JSONObject tousseItem,Long produceDate){ + private void comboTousseDataValidate(TousseDefinition comboTousseTD,JSONObject tousseItem,Long produceDate, String departCoding){ String handlerDepartCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); String comboTousseName = tousseItem.optString("tousseName"); String packageType = tousseItem.optString("packageType"); if(StringUtils.isBlank(packageType)){ throw new RuntimeException(comboTousseName + ",未设置包装类型!"); } //聚合包属于哪个临床科室 - List> list = comboTousseManagerImpl.getComboTousseOrgUnitByTdId(comboTousseTD.getId()); - if (CollectionUtils.isEmpty(list)) { - throw new RuntimeException(comboTousseName + ",包定义未设置所属科室!"); + List> list = null; + List orgUnitCodingList = null; + if(StringUtils.isNotBlank(departCoding)){ + orgUnitCodingList = new ArrayList(); + orgUnitCodingList.add(departCoding); + }else{ + list = comboTousseManagerImpl.getComboTousseOrgUnitByTdId(comboTousseTD.getId()); + if (CollectionUtils.isEmpty(list)) { + throw new RuntimeException(comboTousseName + ",包定义未设置所属科室!"); + } } //验证失效期 validateExpirationDate(produceDate, packageType,tousseItem); @@ -7083,7 +7093,12 @@ Integer packingAmount = tousseJson.optInt("amount"); Integer amount = tousseJson.optInt("amount"); if(amount > 0){ - List taskList = findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, list,true); + List taskList = null; + if(StringUtils.isNotBlank(departCoding)){ + taskList = findPackingTaskBySQL(Collections.singletonList(tousseDefinitionId),handlerDepartCode,orgUnitCodingList,true,true); + }else{ + taskList = findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, list,true); + } String ids = ""; if(taskList != null){ for (PackingTask packingTask : taskList) { @@ -7124,10 +7139,10 @@ orgUnitCodingList.add(code); } - return findPackingTaskBySQL(Collections.singletonList(tousseDefinitionId),handlerDepartCode,orgUnitCodingList,forUpdate); + return findPackingTaskBySQL(Collections.singletonList(tousseDefinitionId),handlerDepartCode,orgUnitCodingList,false,forUpdate); } - - public List findPackingTaskBySQL(Collection tousseDefinitionIds,String handlerDepartCode,List departCodingList,boolean forUpdate){ + @Override + public List findPackingTaskBySQL(Collection tousseDefinitionIds,String handlerDepartCode,List departCodingList,boolean isWashed,boolean forUpdate){ if(CollectionUtils.isEmpty(tousseDefinitionIds)){ return null; } @@ -7139,10 +7154,31 @@ throw new RuntimeException("ID="+tousseDefinitionIds+"的聚合包定义所属科室数据异常!"); } } - + String washRecord_idSql = ""; + if(isWashed){ + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + //清洗完成后装配 + boolean isPackingAfterWashTimeEnd = true; + if(config != null){ + isPackingAfterWashTimeEnd = BooleanUtils.toBooleanDefaultIfNull(config.getIsPackingAfterWashTimeEnd(), true); + } + if(isPackingAfterWashTimeEnd){ + String databaseNowTimeSql = ""; + String databaseNowTime = "GETDATE()"; + if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + databaseNowTime = "SYSDATE"; + } + databaseNowTimeSql = " and endDate<" + databaseNowTime; + washRecord_idSql = String.format(" and ((po.taskType is null or po.taskType<> %s) or po.taskType=%s and po.washRecord_id in (select id from WashAndDisinfectRecord where washStatus='%s' %s)) ", + PackingTask.TASK_RECYCLINGRECORD, + PackingTask.TASK_RECYCLINGRECORD, + WashAndDisinfectRecord.STATUS_WASHED, + databaseNowTimeSql); + } + } String sql = String.format("where %s and po.orgUnitCoding = '%s' " - + "and %s and po.status = '%s'", SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinition.id", tousseDefinitionIds),handlerDepartCode, - SqlUtils.getStringFieldInLargeCollectionsPredicate("po.departCoding", departCodingList),PackingTask.STATUS_AWAIT_PACKING); + + "and %s and po.status = '%s' %s", SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinition.id", tousseDefinitionIds),handlerDepartCode, + SqlUtils.getStringFieldInLargeCollectionsPredicate("po.departCoding", departCodingList),PackingTask.STATUS_AWAIT_PACKING,washRecord_idSql); if(StringUtils.isNotBlank(sql)){ if(forUpdate){ return objectDao.findBySql_ForUpdate(PackingTask.class.getSimpleName(), sql); @@ -7152,6 +7188,78 @@ } return null; } + @Override + public List getWaitPackingTaskInfoVosForPackingComTousse(Set tousseDefinitionIds, String handlerDepartCode,List departCodingList){ + ResultSet rs = null; + List vos = new ArrayList(); + try { + String washRecord_idSql = ""; + String joinWashAndDisinfectRecordSql = ""; + //清洗完成后装配 + boolean isPackingAfterWashTimeEnd = true; + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + if(config != null){ + isPackingAfterWashTimeEnd = BooleanUtils.toBooleanDefaultIfNull(config.getIsPackingAfterWashTimeEnd(), true); + } + String databaseNowTimeSql = null; + if(isPackingAfterWashTimeEnd){ + String databaseNowTime = "GETDATE()"; + if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + databaseNowTime = "SYSDATE"; + } + databaseNowTimeSql = "or wd.endDate>" + databaseNowTime; + }else{ + databaseNowTimeSql = ""; + } + washRecord_idSql = String.format(", case when po.taskType=%s and (po.washRecord_id is null or wd.washStatus is null or wd.washStatus<>'%s' %s) then 0 else 1 end as isWashTimeEnd ", + PackingTask.TASK_RECYCLINGRECORD, + WashAndDisinfectRecord.STATUS_WASHED, + databaseNowTimeSql); + joinWashAndDisinfectRecordSql = String.format(" left join %s wd on wd.id=po.washRecord_id ", + WashAndDisinfectRecord.class.getSimpleName()); + String departCodingSql = null; + if(CollectionUtils.isNotEmpty(departCodingList)){ + departCodingSql = " and " + SqlUtils.getStringFieldInLargeCollectionsPredicate("po.departCoding", departCodingList); + }else{ + departCodingSql = ""; + } + String sql = String.format("select po.departCoding,po.tousseDefinition_id, po.id,po.unPackAmount %s from %s po %s where %s and po.orgUnitCoding = '%s' " + + " %s and po.status = '%s' and po.unPackAmount > 0 ", + washRecord_idSql, + PackingTask.class.getSimpleName(), + joinWashAndDisinfectRecordSql, + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinition_id", tousseDefinitionIds), + handlerDepartCode, + departCodingSql, + PackingTask.STATUS_AWAIT_PACKING); + rs = objectDao.executeSql(sql); + while(rs.next()){ + Long packingTaskId = rs.getLong("id"); + if(!DatabaseUtil.isPoIdValid(packingTaskId)){ + continue; + } + WaitPackingTaskInfoVo vo = new WaitPackingTaskInfoVo(); + vo.setPackingTaskId(packingTaskId); + vo.setTousseDefinitionId(rs.getLong("tousseDefinition_id")); + vo.setDepartCoding(rs.getString("departCoding")); + Integer unPackAmount = ConvertNumber.getNumberIntValue(rs.getObject("unPackAmount"), 0); + Integer isWashTimeEnd = ConvertNumber.getNumberIntValue(rs.getObject("isWashTimeEnd"), -1); + if(MathTools.equals(isWashTimeEnd, 0)){//未清洗或清洗结束时间未到 + vo.setUnWashAmount(unPackAmount); + }else if(MathTools.equals(isWashTimeEnd, 1)){//已清洗 + vo.setUnPackAmount(unPackAmount); + }else{ + throw new RuntimeException("查询未清洗数量异常");//理论上不会执行到此 + } + vos.add(vo); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return vos; + } private void validateExpirationDate(Long sterileDate, String packingType,JSONObject tousseItem) { try{ @@ -8312,7 +8420,7 @@ isPackingAfterWashTimeEnd = BooleanUtils.toBooleanDefaultIfNull(config.getIsPackingAfterWashTimeEnd(), true); } // 查找所有装配任务 - List list = findPackingTaskBySQL(allTousseIdSet,handlerDepartCode,new ArrayList(departCodingSet),false); + List list = findPackingTaskBySQL(allTousseIdSet,handlerDepartCode,new ArrayList(departCodingSet),false,false); if(CollectionUtils.isEmpty(list)){ comboTousses = new JSONArray(); }else{ Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java =================================================================== diff -u -r29688 -r29808 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 29688) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 29808) @@ -26,6 +26,7 @@ import com.forgon.disinfectsystem.packing.vo.PackingTaskForDisplay; import com.forgon.disinfectsystem.packing.vo.PackingTaskVoForContainer; import com.forgon.disinfectsystem.packing.vo.ReviewerVo; +import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskInfoVo; import com.forgon.disinfectsystem.packing.vo.WaitPackingTaskVo; import com.forgon.tools.hibernate.BasePoManager; @@ -225,9 +226,16 @@ * @return */ public List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,List> departCodingList); - - public List findPackingTaskBySQL(Collection tousseDefinitionIds,String handlerDepartCode,List departCodingList,boolean forUpdate); /** + * 查找某个临床科室某个包的所有装配任务 + * @param tousseDefinitionId 包定义id + * @param handlerDepartCode 处理科室 + * @param departCoding 申请科室 + * @param isWashed 是否只查询清洗完成的 + * @return + */ + public List findPackingTaskBySQL(Collection tousseDefinitionIds,String handlerDepartCode,List departCodingList,boolean isWashed, boolean forUpdate); + /** * 设置器械包未补充的材料明细 */ public void setTousseInstanceUnSupplementMaterialDetail(List taskList, List tousseList,boolean allowPackingWhenUnSupplement); @@ -329,4 +337,12 @@ * @return */ public Set filterDepartmentsWithoutTousses(Set departCodesSet); + /** + * 获取待装配的任务数量和未清洗的装配数量 + * @param tousseDefinitionIds 装配任务包定义ids + * @param handlerDepartCode 处理科室 + * @param departCodingList 申请科室list + * @return + */ + public List getWaitPackingTaskInfoVosForPackingComTousse(Set tousseDefinitionIds, String handlerDepartCode,List departCodingList); }