Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r40613 -r40875 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 40613) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 40875) @@ -4370,53 +4370,8 @@ return getWaitingforRecyclingInvoicePlans(sql); } @Override - public List getExpressRecyclingTousseVo(Long tousseGroupId, Long departmentGroupId){ - String tousseGroupIdSql = null; - if(DatabaseUtil.isPoIdValid(tousseGroupId)){ - tousseGroupIdSql = " and td.tousseGroupID=" + tousseGroupId; - }else{ - tousseGroupIdSql = ""; - } - String departmentGroupIdSql = ""; - if(DatabaseUtil.isPoIdValid(departmentGroupId)){ - List departCodesList = departmentGroupManager.getProperty("departCodes", "id="+departmentGroupId); - if(CollectionUtils.isNotEmpty(departCodesList)){ - String departCodes = departCodesList.get(0); - departmentGroupIdSql = " and " + SqlUtils.getStringFieldInLargeCollectionsPredicate("ip.departCoding", SqlUtils.splitStringToSet(departCodes, ";")); - } - } - StringBuffer sql = new StringBuffer(1000); - sql.append(" select ip.id,po.tousseDefinitionId,ip.readed,ip.depart,ip.departCoding,ip.version,ip.applicationTime,po.tousseName,po.amount,po.prepareRecycleAmount,po.isCleanedEntirely,po.isApplyEntireTousse,po.tousseType ") - .append(" from ") - .append(TousseItem.class.getSimpleName()) - .append(" po inner join ") - .append(InvoicePlan.class.getSimpleName()) - .append(" ip on ip.id=po.recyclingApplication_ID ") - .append(" left join ") - .append(TousseDefinition.class.getSimpleName()) - .append(" td on td.id=po.tousseDefinitionId ") - .append(" where ip.recyclingStatus in('") - .append(InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE) - .append("','") - .append(InvoicePlan.RECYCLINGSTATUS_PARTRECYCLE) - .append("')") - .append(" and ip.committedStatus=1 ") - .append(tousseGroupIdSql) - .append(" and ip.type != '") - .append(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION) - .append("' and po.tousseType != '") - .append(TousseDefinition.PACKAGE_TYPE_FOREIGN) - .append("' and po.tousseType != '") - .append(TousseDefinition.PACKAGE_TYPE_SPLIT) - .append("' and (ip.includeRecyclingItems is null or ip.includeRecyclingItems =") - .append(InvoicePlan.SIGNED_TRUE) - .append(") and po.expressRecycling = '") - .append(Constants.STR_YES) - .append("' and (po.isThereIdentificationCard is null or po.isThereIdentificationCard='") - .append(Constants.STR_NO) - .append("') and po.recyclingAmount is null ") - .append(departmentGroupIdSql) - .append(" order by po.tousseName asc ").toString(); + public List getExpressRecyclingTousseVo(Long tousseGroupId, Long departmentGroupId, String departCoding){ + StringBuffer sql = getExpressRecyclingSql(tousseGroupId, departmentGroupId, departCoding, " order by po.tousseName asc "); ResultSet rs = null; List quickRecyclingList = new ArrayList(); Set ipIds = new HashSet(); @@ -4427,7 +4382,6 @@ Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); int readed = rs.getInt("readed"); String depart = rs.getString("depart"); - String departCoding = rs.getString("departCoding"); int version = rs.getInt("version"); Date applicationTime = rs.getTimestamp("applicationTime"); String tousseName = rs.getString("tousseName"); @@ -4448,24 +4402,164 @@ vo.setAmount(amount); vo.setPrepareRecycleAmount(prepareRecycleAmount); vo.setTousseDefinitionID(tousseDefinitionId); - vo.setIsCleanedEntirely(StringUtils.isBlank(isCleanedEntirely)?"是":isCleanedEntirely); - vo.setIsApplyEntireTousse(StringUtils.isBlank(isApplyEntireTousse)?"是":isApplyEntireTousse); + vo.setIsCleanedEntirely(StringUtils.isBlank(isCleanedEntirely)?Constants.STR_YES:isCleanedEntirely); + vo.setIsApplyEntireTousse(StringUtils.isBlank(isApplyEntireTousse)?Constants.STR_YES:isApplyEntireTousse); vo.setTousseType(tousseType); - vo.setDepartCoding(departCoding); + vo.setDepartCoding(rs.getString("departCoding")); quickRecyclingList.add(vo); } } catch (SQLException e) { e.printStackTrace(); } finally { DatabaseUtil.closeResultSetAndStatement(rs); } + updateInvoicePlanReaded(ipIds); + return quickRecyclingList; + } + private void updateInvoicePlanReaded(Set ipIds){ //相关申请单改为已查看 if(CollectionUtils.isNotEmpty(ipIds)){ objectDao.excuteSQL("update invoicePlan set readed = "+InvoicePlan.READED+" where " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", ipIds)); } - return quickRecyclingList; - } + private StringBuffer getExpressRecyclingSql(Long tousseGroupId, Long departmentGroupId, String departCoding, String orderBySql){ + String tousseGroupIdSql = null; + if(DatabaseUtil.isPoIdValid(tousseGroupId)){ + tousseGroupIdSql = " and td.tousseGroupID=" + tousseGroupId; + }else{ + tousseGroupIdSql = ""; + } + String departmentGroupIdSql = ""; + if(DatabaseUtil.isPoIdValid(departmentGroupId)){ + List departCodesList = departmentGroupManager.getProperty("departCodes", "id="+departmentGroupId); + if(CollectionUtils.isNotEmpty(departCodesList)){ + String departCodes = departCodesList.get(0); + departmentGroupIdSql = " and " + SqlUtils.getStringFieldInLargeCollectionsPredicate("ip.departCoding", SqlUtils.splitStringToSet(departCodes, ";")); + } + } + StringBuffer sql = new StringBuffer(1000); + sql.append(" select ip.id,ip.serialNumber,po.tousseDefinitionId,ip.readed,ip.depart,ip.departCoding,ip.version,ip.applicationTime,po.tousseName,po.amount,po.prepareRecycleAmount,po.isCleanedEntirely,po.isApplyEntireTousse,po.tousseType ") + .append(" from ") + .append(TousseItem.class.getSimpleName()) + .append(" po inner join ") + .append(InvoicePlan.class.getSimpleName()) + .append(" ip on ip.id=po.recyclingApplication_ID ") + .append(" left join ") + .append(TousseDefinition.class.getSimpleName()) + .append(" td on td.id=po.tousseDefinitionId ") + .append(" where ip.recyclingStatus in('") + .append(InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE) + .append("','") + .append(InvoicePlan.RECYCLINGSTATUS_PARTRECYCLE) + .append("')") + .append(" and ip.committedStatus=1 ") + .append(tousseGroupIdSql); + if(StringUtils.isNotBlank(departCoding)){ + sql.append(" and ip.departCoding='"+ departCoding +"'"); + } + sql.append(" and ip.type != '") + .append(InvoicePlan.TYPE_FOREIGNTOUSSEAPPLIACTION) + .append("' and po.tousseType != '") + .append(TousseDefinition.PACKAGE_TYPE_FOREIGN) + .append("' and po.tousseType != '") + .append(TousseDefinition.PACKAGE_TYPE_SPLIT) + .append("' and (ip.includeRecyclingItems is null or ip.includeRecyclingItems =") + .append(InvoicePlan.SIGNED_TRUE) + .append(") and po.expressRecycling = '") + .append(Constants.STR_YES) + .append("' and (po.isThereIdentificationCard is null or po.isThereIdentificationCard='") + .append(Constants.STR_NO) + .append("') and po.recyclingAmount is null ") + .append(departmentGroupIdSql) + .append(orderBySql); + return sql; + } + @Override + public Map>> getDepartExpressRecyclingTousseVo( + Long tousseGroupId, Long departmentGroupId, String departCoding) { + StringBuffer sql = getExpressRecyclingSql(tousseGroupId, departmentGroupId, departCoding, " order by ip.applicationTime asc, po.tousseName asc "); + ResultSet rs = null; + // 第一个key是applicationTime的年月日 第二个key是tousseName + Map>> resultMap = new LinkedHashMap<>(); + Set ipIds = new HashSet<>(); + + // 缓存变量,利用有序特性减少查找 + String currentDateKey = null; + Map> currentInnerMap = null; + String currentTousseName = null; + List currentVoList = null; + + try { + rs = objectDao.executeSql(sql.toString()); + while (rs.next()) { + Long ipId = rs.getLong("id"); + Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); + int readed = rs.getInt("readed"); + String depart = rs.getString("depart"); + int version = rs.getInt("version"); + Date applicationTime = rs.getTimestamp("applicationTime"); + String tousseName = rs.getString("tousseName"); + int amount = rs.getInt("amount"); + int prepareRecycleAmount = rs.getInt("prepareRecycleAmount"); + String isCleanedEntirely = rs.getString("isCleanedEntirely"); + String isApplyEntireTousse = rs.getString("isApplyEntireTousse"); + String tousseType = rs.getString("tousseType"); + String serialNumber = rs.getString("serialNumber"); + ExpressRecyclingVo vo = new ExpressRecyclingVo(); + if (readed == 0) { + ipIds.add(ipId); + } + vo.setApplicationId(ipId); + vo.setDepart(depart); + vo.setInvoicePlanVersion(version); + vo.setApplicationTime(applicationTime); + vo.setTousseName(tousseName); + vo.setAmount(amount); + vo.setSerialNumber(serialNumber); + vo.setPrepareRecycleAmount(prepareRecycleAmount); + vo.setTousseDefinitionID(tousseDefinitionId); + vo.setIsCleanedEntirely(StringUtils.isBlank(isCleanedEntirely) ? Constants.STR_YES : isCleanedEntirely); + vo.setIsApplyEntireTousse(StringUtils.isBlank(isApplyEntireTousse) ? Constants.STR_YES : isApplyEntireTousse); + vo.setTousseType(tousseType); + vo.setDepartCoding(rs.getString("departCoding")); + + // 格式化日期为年月日格式作为第一层key + String dateKey = DateTools.YMDFORMAT.get().format(applicationTime); + + // 优化:利用有序特性,减少Map查找次数 + if (!dateKey.equals(currentDateKey)) { + // 日期变化,创建新的内层map + currentInnerMap = resultMap.get(dateKey); + if (currentInnerMap == null) { + currentInnerMap = new LinkedHashMap<>(); + resultMap.put(dateKey, currentInnerMap); + } + currentDateKey = dateKey; + currentTousseName = null; // 重置tousseName缓存 + } + + if (!tousseName.equals(currentTousseName)) { + // tousseName变化,创建新的list + currentVoList = currentInnerMap.get(tousseName); + if (currentVoList == null) { + currentVoList = new ArrayList<>(); + currentInnerMap.put(tousseName, currentVoList); + } + currentTousseName = tousseName; + } + + currentVoList.add(vo); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + updateInvoicePlanReaded(ipIds); + return resultMap; + } + /** * 获取科室所属回收分组 * @param departCoding Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java =================================================================== diff -u -r40787 -r40875 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java (.../SupplyRoomConfig.java) (revision 40787) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java (.../SupplyRoomConfig.java) (revision 40875) @@ -645,6 +645,13 @@ */ private String autobasketInsertionConfigInfos; /** + * 快速回收科室配置 + * GDSFYBJY-29 + * enableAddQuickTecoveryOptionForDepartments + * 不保存本表SupplyRoomConfig + */ + private String supplyRoom_type_departexpressrecyclingconfig; + /** * 器械包拍摄图片/视频保留时长(天) * (DGKHYY-29) */ @@ -1703,7 +1710,16 @@ String autobasketInsertionConfigInfos) { this.autobasketInsertionConfigInfos = autobasketInsertionConfigInfos; } + @Transient + public String getSupplyRoom_type_departexpressrecyclingconfig() { + return supplyRoom_type_departexpressrecyclingconfig; + } + public void setSupplyRoom_type_departexpressrecyclingconfig( + String supplyRoom_type_departexpressrecyclingconfig) { + this.supplyRoom_type_departexpressrecyclingconfig = supplyRoom_type_departexpressrecyclingconfig; + } + public Integer getTousseCamImgVidRetentionTime() { return tousseCamImgVidRetentionTime; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java =================================================================== diff -u -r40787 -r40875 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java (.../SupplyRoomConfigAction.java) (revision 40787) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java (.../SupplyRoomConfigAction.java) (revision 40875) @@ -30,9 +30,11 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.basedatamanager.departexpressrecyclingconfig.service.DepartExpressRecyclingConfigManager; import com.forgon.disinfectsystem.basedatamanager.departmentgroupOption.service.DepartmentGroupOptionManager; import com.forgon.disinfectsystem.basedatamanager.invoice.service.InvoiceUtils; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.supplier.RegistrationCertification; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.InstrumentRepairRemindOrgUnit; @@ -79,7 +81,10 @@ private String supplyRoom_type_userecord_to_application_not_invoice; private String supplyRoom_type_tousse_operation; - + /** + * 科室快速回收配置 + */ + private String supplyRoom_type_departexpressrecyclingconfig; private String supplyRoom_type_recycling_application_not_invoice; /** @@ -187,6 +192,11 @@ private DepartmentGroupOptionManager departmentGroupOptionManager; + private DepartExpressRecyclingConfigManager departExpressRecyclingConfigManager; + public void setDepartExpressRecyclingConfigManager( + DepartExpressRecyclingConfigManager departExpressRecyclingConfigManager) { + this.departExpressRecyclingConfigManager = departExpressRecyclingConfigManager; + } public void setDepartmentGroupOptionManager( DepartmentGroupOptionManager departmentGroupOptionManager) { this.departmentGroupOptionManager = departmentGroupOptionManager; @@ -305,6 +315,13 @@ this.supplyRoom_type_tousse_operation = supplyRoom_type_tousse_operation; } + public String getSupplyRoom_type_departexpressrecyclingconfig() { + return supplyRoom_type_departexpressrecyclingconfig; + } + public void setSupplyRoom_type_departexpressrecyclingconfig( + String supplyRoom_type_departexpressrecyclingconfig) { + this.supplyRoom_type_departexpressrecyclingconfig = supplyRoom_type_departexpressrecyclingconfig; + } public String getSupplyRoom_type_recycling_application_not_invoice() { return supplyRoom_type_recycling_application_not_invoice; } @@ -784,7 +801,8 @@ processSupplyRoomCongfig(SupplyRoomConfig.SUPPLYROOM_TYPE_RECYCLING_APPLICATION_NOT_INVOICE, supplyRoom_type_recycling_application_not_invoice, supplyRoomConfigToSave, supplyRoomConfigIdsToDelete,supplyRoomConfigToUpdate); //高值耗材处理科室 processSupplyRoomCongfig(SupplyRoomConfig.SUPPLYROOM_TYPE_EXPENSIVEGOODS_APPLY, supplyRoom_type_ExpensiveGoods, supplyRoomConfigToSave, supplyRoomConfigIdsToDelete,supplyRoomConfigToUpdate); - + //科室快速回收 + departExpressRecyclingConfigManager.processDepartExpressRecyclingConfig(supplyRoom_type_departexpressrecyclingconfig, CssdUtils.getSystemSetConfigByNameBool("enableAddQuickTecoveryOptionForDepartments", false)); // 保存新的SupplyRoomCongfig if(!supplyRoomConfigToSave.isEmpty()){ for (SupplyRoomConfig supplyRoomConfig : supplyRoomConfigToSave) { @@ -1916,20 +1934,22 @@ if (orgUnitList != null && orgUnitCodeArray != null) { for(int i = 0;i < orgUnitCodeArray.length;i++){ for (int j = 0; j < orgUnitList.size(); j++) { - String orgCoding = orgUnitList.get(j).getOrgUnitCoding(); + OrgUnit orgUnit = orgUnitList.get(j); + String orgCoding = orgUnit.getOrgUnitCoding(); if(orgUnitCodeArray[i].equals(orgCoding)){ String orgName = null; if (StringUtils.equals(withoutBaseOrg, "true")) { - orgName = orgUnitList.get(j).getName(); + orgName = orgUnit.getName(); } else { - orgName = orgUnitList.get(j).getCurrentOrgUnitNames(); + orgName = orgUnit.getCurrentOrgUnitNames(); orgName = orgName.replace("组织机构-", ""); } JSONObject obj = new JSONObject(); + obj.put("tableId", orgUnit.getId()); obj.put("id", orgCoding); obj.put("name", orgName); obj.put("orgUnitName", orgName); - if(OrgUnit.STATUS_DISABLED.equals(orgUnitList.get(j).getStatus())){ + if(OrgUnit.STATUS_DISABLED.equals(orgUnit.getStatus())){ obj.put("name",orgName + "(已停用)"); } jsonArray.add(obj); @@ -1942,19 +1962,21 @@ }else{ if (orgUnitList != null) { for (int j = 0; j < orgUnitList.size(); j++) { - String orgCoding = orgUnitList.get(j).getOrgUnitCoding(); + OrgUnit orgUnit = orgUnitList.get(j); + String orgCoding = orgUnit.getOrgUnitCoding(); String orgName = null; if (StringUtils.equals(withoutBaseOrg, "true")) { - orgName = orgUnitList.get(j).getName(); + orgName = orgUnit.getName(); } else { - orgName = orgUnitList.get(j).getCurrentOrgUnitNames(); + orgName = orgUnit.getCurrentOrgUnitNames(); orgName = orgName.replace("组织机构-", ""); } JSONObject obj = new JSONObject(); obj.put("id", orgCoding); + obj.put("tableId", orgUnit.getId()); obj.put("name", orgName); obj.put("orgUnitName", orgName); - if(OrgUnit.STATUS_DISABLED.equals(orgUnitList.get(j).getStatus())){ + if(OrgUnit.STATUS_DISABLED.equals(orgUnit.getStatus())){ obj.put("name",orgName + "(已停用)"); } jsonArray.add(obj); @@ -2360,6 +2382,16 @@ json.put("success", success); StrutsResponseUtils.output(json); } + + public void getAllConfigsJSONArray(){ + try { + JSONObject json = JSONUtil.buildJsonObject(true, departExpressRecyclingConfigManager.getAllConfigsJSONArray()); + StrutsResponseUtils.output(json); + } catch (Exception e) { + JSONObject json = JSONUtil.buildJsonObject(false, e.getMessage()); + StrutsResponseUtils.output(json); + } + } /** * 获取供应室和供应室服务科室Json */ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManagerImpl.java (revision 40875) @@ -0,0 +1,212 @@ +package com.forgon.disinfectsystem.basedatamanager.departexpressrecyclingconfig.service; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.DepartExpressRecyclingConfig; +import com.forgon.exception.SystemException; +import com.forgon.tools.MathTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.SqlUtils; +@Service("departExpressRecyclingConfigManager") +@Transactional +public class DepartExpressRecyclingConfigManagerImpl extends BasePoManagerImpl +implements DepartExpressRecyclingConfigManager{ + @Autowired + private ObjectDao objectDao; + + @Override + public DepartExpressRecyclingConfig getConfigById(Long id) { + return (DepartExpressRecyclingConfig)objectDao.getById(DepartExpressRecyclingConfig.class.getSimpleName(), id); + } + + @Override + public void updateConfig(DepartExpressRecyclingConfig config) { + objectDao.saveOrUpdate(config); + } + + @Override + public void deleteConfig(Long id) { + if(!DatabaseUtil.isPoIdValid(id)){ + return; + } + objectDao.excuteSQL("delete from " + DepartExpressRecyclingConfig.class.getSimpleName() + " where id=" + id); + } + + @Override + public void deleteAll() { + objectDao.excuteSQL("delete from " + DepartExpressRecyclingConfig.class.getSimpleName()); + } + + @Override + public void saveAll( + List departExpressRecyclingConfigs) { + for (DepartExpressRecyclingConfig config : departExpressRecyclingConfigs) { + objectDao.saveOrUpdate(config); + } + } + + @Override + public void deleteAll(List idsToDelete) { + if(CollectionUtils.isEmpty(idsToDelete)){ + return; + } + objectDao.excuteSQL("delete from " + DepartExpressRecyclingConfig.class.getSimpleName() + " where 1=1 " + + SqlUtils.getInLongListSql("id", idsToDelete)); + } + + @Override + public List getAllConfigs(String orderBySql) { + return objectDao.findByHql(" from " + DepartExpressRecyclingConfig.class.getSimpleName() + + (StringUtils.isBlank(orderBySql)?StringUtils.EMPTY:orderBySql)); + } + + @Override + public JSONArray getAllConfigsJSONArray() { + ResultSet rs = null; + String sql = "select der.id, der.sequence, ou.name, ou.orgUnitCoding,der.orgUnitId from " + + DepartExpressRecyclingConfig.class.getSimpleName() + + " der join " + + OrgUnit.class.getSimpleName() + + " ou on ou.id=der.orgUnitId order by der.sequence asc"; + JSONArray arr = new JSONArray(); + try { + rs = objectDao.executeSql(sql); + while (rs.next()) { + JSONObject obj = new JSONObject(); + obj.put("id", rs.getLong("id")); + obj.put("sequence", rs.getInt("sequence")); + obj.put("orgUnitName", rs.getString("name")); // 部门名称 + obj.put("orgUnitCoding", rs.getString("orgUnitCoding")); // 部门编码 + obj.put("orgUnitId", rs.getLong("orgUnitId")); // 部门ID + arr.add(obj); + } + + } catch (Exception e) { + logger.error("获取部门快递回收配置数据失败", e); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return arr; + } + + @Override + public void processDepartExpressRecyclingConfig( + String departExpressRecyclingConfigs, boolean enableAddQuickTecoveryOptionForDepartments) { + + if(!enableAddQuickTecoveryOptionForDepartments){ + return; + } + JSONArray supplyRoomArr = JSONArray.fromObject(departExpressRecyclingConfigs); + + if (CollectionUtils.isEmpty(supplyRoomArr)) { + deleteAll(); + return; + } + + // 获取现有的所有配置 + List existingConfigs = getAllConfigs(null); + Map existingConfigMap = existingConfigs.stream() + .collect(Collectors.toMap(DepartExpressRecyclingConfig::getId, config -> config)); + + // 准备处理新数据 + Set incomingIds = new HashSet<>(); + List configsToSave = new ArrayList<>(); + List configsToUpdate = new ArrayList<>(); + + // 处理传入的配置数据 + for (int i = 0; i < supplyRoomArr.size(); i++) { + JSONObject configJson = supplyRoomArr.getJSONObject(i); + + Long id = configJson.optLong("id", 0); + Integer sequence = configJson.optInt("sequence", 999); + Long orgUnitId = configJson.optLong("orgUnitId", 0); + if(!DatabaseUtil.isPoIdValid(orgUnitId)){ + throw new SystemException("快速回收科室配置参数orgUnitId异常"+orgUnitId); + } + if (id > 0 && existingConfigMap.containsKey(id)) { + // 更新现有配置 + DepartExpressRecyclingConfig existingConfig = existingConfigMap.get(id); + boolean needsUpdate = false; + + if (!existingConfig.getSequence().equals(sequence)) { + existingConfig.setSequence(sequence); + needsUpdate = true; + } + if (!MathTools.equals(existingConfig.getOrgUnitId(), orgUnitId)) { + existingConfig.setOrgUnitId(orgUnitId); + needsUpdate = true; + } + + if (needsUpdate) { + configsToUpdate.add(existingConfig); + } + incomingIds.add(id); + } else { + // 新增配置 + DepartExpressRecyclingConfig newConfig = new DepartExpressRecyclingConfig(); + newConfig.setSequence(sequence); + newConfig.setOrgUnitId(orgUnitId); + configsToSave.add(newConfig); + } + } + + // 找出需要删除的配置(存在于数据库但不在传入数据中) + List idsToDelete = existingConfigs.stream() + .filter(config -> !incomingIds.contains(config.getId())) + .map(DepartExpressRecyclingConfig::getId) + .collect(Collectors.toList()); + + // 执行批量操作 + if (!configsToSave.isEmpty()) { + saveAll(configsToSave); + } + + if (!configsToUpdate.isEmpty()) { + saveAll(configsToUpdate); + } + + if (!idsToDelete.isEmpty()) { + deleteAll(idsToDelete); + } + + // 重新调整所有配置的序号 + adjustConfigSequences(); + } + @Override + public void adjustConfigSequences() { + List allConfigs = getAllConfigs(" order by sequence asc "); + + for (int i = 0; i < allConfigs.size(); i++) { + DepartExpressRecyclingConfig config = allConfigs.get(i); + if (config.getSequence() != i + 1) { + config.setSequence(i + 1); + updateConfig(config); + } + } + } + + @Override + public DepartExpressRecyclingConfig getConfigByOrgUnitId(Long orgUnitId) { + List list = objectDao.findByHql(" from " + DepartExpressRecyclingConfig.class.getSimpleName() + + " where orgUnitId=" + orgUnitId); + return CollectionUtils.isEmpty(list)?null:list.get(0); + } +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingTousseNameGroupVo.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingTousseNameGroupVo.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingTousseNameGroupVo.java (revision 40875) @@ -0,0 +1,48 @@ +package com.forgon.disinfectsystem.recyclingapplication.vo; + +import java.util.ArrayList; +import java.util.List; +/** + * 科室快速回收vo + */ +public class ExpressRecyclingTousseNameGroupVo { + private String tousseName; + /** + * 消毒物品材料 + */ + private String materialName; + + private Integer amount; + /** + * 预回收数量 + */ + private Integer prepareRecycleAmount; + + private List expressRecyclingVos = new ArrayList(); + public String getTousseName() { + return tousseName; + } + public void setTousseName(String tousseName) { + this.tousseName = tousseName; + } + public String getMaterialName() { + return materialName; + } + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + public Integer getAmount() { + return amount; + } + public void setAmount(Integer amount) { + this.amount = amount; + } + + public Integer getPrepareRecycleAmount() { + return prepareRecycleAmount; + } + public void setPrepareRecycleAmount(Integer prepareRecycleAmount) { + this.prepareRecycleAmount = prepareRecycleAmount; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/dwr/table/SupplyRoomConfigTableManager.java =================================================================== diff -u -r40730 -r40875 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/dwr/table/SupplyRoomConfigTableManager.java (.../SupplyRoomConfigTableManager.java) (revision 40730) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/dwr/table/SupplyRoomConfigTableManager.java (.../SupplyRoomConfigTableManager.java) (revision 40875) @@ -4,10 +4,12 @@ import java.util.List; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; import net.sf.json.JSONObject; import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.basedatamanager.departexpressrecyclingconfig.service.DepartExpressRecyclingConfigManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.InstrumentRepairRemindOrgUnit; @@ -25,7 +27,8 @@ private SupplyRoomConfigManager supplyRoomConfigManager; private ObjectDao objectDao; - + @Autowired + private DepartExpressRecyclingConfigManager departExpressRecyclingConfigManager; public void setObjectDao(ObjectDao objectDao) { this.objectDao = objectDao; } @@ -48,6 +51,10 @@ if(enbaleLoadAutomaticallyIntoBasketsAfterAssembly){ supplyRoomConfig.setAutobasketInsertionConfigInfos(supplyRoomConfigManager.getAutobasketInsertionConfig().toString()); } + boolean enableAddQuickTecoveryOptionForDepartments = CssdUtils.getSystemSetConfigByNameBool("enableAddQuickTecoveryOptionForDepartments", false); + if(enableAddQuickTecoveryOptionForDepartments){ + supplyRoomConfig.setSupplyRoom_type_departexpressrecyclingconfig(departExpressRecyclingConfigManager.getAllConfigsJSONArray().toString()); + } loadInstrumentRepairRemindOrgUnit(supplyRoomConfig); return supplyRoomConfig; } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java =================================================================== diff -u -r40556 -r40875 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 40556) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 40875) @@ -378,10 +378,19 @@ * 获取快速回收的待回收申请项。申请单回收状态为待回收和部分回收的。外来器械包申请单不处理(包括通用申请单里的外来器械也不处理)。isThereIdentificationCard为是的也不处理。expressRecycling不为是的也过滤掉 * @param tousseGroupId 器械包分组id * @param departmentGroupId 部门分组id + * @param departCoding 申请科室 * @return */ - public List getExpressRecyclingTousseVo(Long tousseGroupId, Long departmentGroupId); + public List getExpressRecyclingTousseVo(Long tousseGroupId, Long departmentGroupId, String departCoding); /** + * 取部门快速回收的待回收申请项 + * @param tousseGroupId 器械包分组id + * @param departmentGroupId 部门分组id + * @param departCoding 申请科室 + * @return + */ + public Map>> getDepartExpressRecyclingTousseVo(Long tousseGroupId, Long departmentGroupId, String departCoding); + /** * 发货计划列表扫描科室条码或者单号条码,打开对应的发货单。先按条码找科室,找不到科室就按流水号找申请单 * @param barcode 科室条码或者单号条码 * @param departCodings 科室分组中的科室编码 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/departexpressrecyclingconfig/service/DepartExpressRecyclingConfigManager.java (revision 40875) @@ -0,0 +1,51 @@ +package com.forgon.disinfectsystem.basedatamanager.departexpressrecyclingconfig.service; + +import java.util.List; + +import net.sf.json.JSONArray; + +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.DepartExpressRecyclingConfig; + +public interface DepartExpressRecyclingConfigManager { + /** + * 获取快速回收科室配置 + * @param orderBySql + */ + List getAllConfigs(String orderBySql); + /** + * 获取快速回收科室配置 + */ + JSONArray getAllConfigsJSONArray(); + /** + * 获取快速回收科室 + */ + DepartExpressRecyclingConfig getConfigById(Long id); + /** + * 修改快速回收科室 + * @param config + */ + void updateConfig(DepartExpressRecyclingConfig config); + + void deleteConfig(Long id); + + void deleteAll(); + + void saveAll(List departExpressRecyclingConfigs); + + void deleteAll(List idsToDelete); + /** + * 处理快速回收科室保存或修改 + * @param departExpressRecyclingConfigs 新的快速回收科室配置 + * @param enableAddQuickTecoveryOptionForDepartments 是否开启配置项 + */ + void processDepartExpressRecyclingConfig(String departExpressRecyclingConfigs, boolean enableAddQuickTecoveryOptionForDepartments); + /** + * 获取快速回收科室 + * @param orgUnitId 科室id + */ + DepartExpressRecyclingConfig getConfigByOrgUnitId(Long orgUnitId); + /** + * 快速回收科室配置重新整理序号 + */ + void adjustConfigSequences(); +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingDateVo.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingDateVo.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressRecyclingDateVo.java (revision 40875) @@ -0,0 +1,33 @@ +package com.forgon.disinfectsystem.recyclingapplication.vo; + +import java.util.ArrayList; +import java.util.List; +/** + * 科室快速回收vo + */ +public class ExpressRecyclingDateVo { + /** + * 申请时间 + * 年月日 + */ + private String ymdOfApplicationTime; + + private List expressRecyclingTousseNameGroupVos = new ArrayList(); + + public String getYmdOfApplicationTime() { + return ymdOfApplicationTime; + } + + public void setYmdOfApplicationTime(String ymdOfApplicationTime) { + this.ymdOfApplicationTime = ymdOfApplicationTime; + } + + public List getExpressRecyclingTousseNameGroupVos() { + return expressRecyclingTousseNameGroupVos; + } + + public void setExpressRecyclingTousseNameGroupVos( + List expressRecyclingTousseNameGroupVos) { + this.expressRecyclingTousseNameGroupVos = expressRecyclingTousseNameGroupVos; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/DepartExpressRecyclingConfig.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/DepartExpressRecyclingConfig.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/DepartExpressRecyclingConfig.java (revision 40875) @@ -0,0 +1,61 @@ +package com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 科室快速回收科室配置 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(name = "DepartExpressRecyclingConfig") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class DepartExpressRecyclingConfig { + /** + * id + */ + private Long id; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + /** + * 排序 + */ + private Integer sequence; + + /** + * 部门id + */ + private Long orgUnitId; + public Integer getSequence() { + return sequence; + } + + public void setSequence(Integer sequence) { + this.sequence = sequence; + } + + public Long getOrgUnitId() { + return orgUnitId; + } + + public void setOrgUnitId(Long orgUnitId) { + this.orgUnitId = orgUnitId; + } + +}