Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentinstance/InstrumentInstance.java =================================================================== diff -u -r39250 -r40852 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentinstance/InstrumentInstance.java (.../InstrumentInstance.java) (revision 39250) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentinstance/InstrumentInstance.java (.../InstrumentInstance.java) (revision 40852) @@ -2,6 +2,7 @@ import java.util.Date; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -84,6 +85,43 @@ * UDI码 */ private String udi; + + /** + * 器械实例维修状态 + * BJDXZLYY-70 + */ + private String repairStatus = REPAIR_STATUS_WAITE_USE; + + /** + * 没有登记维修记录或者维修状态为已维修(器械回科)时,并且没有放置到任何器械包中的器械,状态为"待使用" + */ + public static final String REPAIR_STATUS_WAITE_USE = "待使用"; + + /** + * 没有登记维修记录或者维修状态为已维修(器械回科)时,并且被放置到器械包中的器械,状态为"使用中" + */ + public static final String REPAIR_STATUS_IN_USE = "使用中"; + + /** + * 登记了维修记录,对应的登记时间最晚的维修记录中的字段“状态”的值为"待维修"时,状态为"待维修" + */ + public static final String REPAIRSTATUS_WAITE_REPAIR = "待维修"; + + /** + * 登记了维修记录,对应的登记时间最晚的维修记录中的字段“状态”的值为"维修中"时,状态为"维修中" + */ + public static final String REPAIR_STATUS_IN_REPAIR = "维修中"; + + /** + * 登记了维修记录,对应的登记时间最晚的维修记录中的字段“状态”的值为"报废"时,状态为"报废" + */ + public static final String REPAIR_STATUS_DISCARD = "报废"; + + /** + * 器械实例关联的登记时间最晚的一条器械维修记录 + * BJDXZLYY-70 + */ + private Long lastInstrumentRepairId; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -183,4 +221,21 @@ this.registUser = registUser; } + @Column(columnDefinition=" varchar(255) default '" + REPAIR_STATUS_WAITE_USE + "' not null ") + public String getRepairStatus() { + return repairStatus; + } + + public void setRepairStatus(String repairStatus) { + this.repairStatus = repairStatus; + } + + public Long getLastInstrumentRepairId() { + return lastInstrumentRepairId; + } + + public void setLastInstrumentRepairId(Long lastInstrumentRepairId) { + this.lastInstrumentRepairId = lastInstrumentRepairId; + } + } Index: forgon-tools/src/main/java/com/forgon/Constants.java =================================================================== diff -u -r40742 -r40852 --- forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 40742) +++ forgon-tools/src/main/java/com/forgon/Constants.java (.../Constants.java) (revision 40852) @@ -29,7 +29,7 @@ "4.9.63","4.9.64","4.9.65","4.9.66","4.9.67","4.9.68","4.9.69","4.9.70","4.9.71","4.9.72","4.9.73","4.9.74","4.9.75","4.9.76","4.9.77","4.9.78","4.9.79","4.9.80","4.9.81","4.9.82","4.9.83","4.9.84","4.9.85", "4.9.86","4.9.87","4.9.88","4.9.89","4.9.90","4.9.91","4.9.92","4.9.93","4.9.94","4.9.95","4.9.96","4.9.97","4.9.98","4.9.99","5.0.0","5.0.1","5.0.2","5.0.3","5.0.4","5.0.5","5.0.6","5.0.7", "5.0.8","5.0.9","5.0.10","5.0.11","5.0.12","5.0.13","5.0.14","5.0.15","5.0.16","5.0.17","5.0.18","5.0.19","5.0.20","5.0.21","5.0.22","5.0.23","5.0.24","5.0.25","5.0.26","5.0.27","5.0.28","5.0.29","5.0.30","5.0.31", - "5.0.32","5.0.33","5.0.34","5.0.35","5.0.36","5.0.37","5.0.38","5.0.39","5.0.40","5.0.41","5.0.42","5.0.43","5.0.44","5.0.45","5.0.46","5.0.47","5.0.48","5.0.49"}; + "5.0.32","5.0.33","5.0.34","5.0.35","5.0.36","5.0.37","5.0.38","5.0.39","5.0.40","5.0.41","5.0.42","5.0.43","5.0.44","5.0.45","5.0.46","5.0.47","5.0.48","5.0.49","5.0.50"}; // 版本列表(4.0版本升级4.1版需要分两步:先从4.0升到4.1.0、然后从4.1.0升级4.1最新版本) /*public final static String[] SOFTWARE_VERSION_ARRAY = new String[] { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/materialdefinition/MaterialDefinition.java =================================================================== diff -u -r40683 -r40852 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/materialdefinition/MaterialDefinition.java (.../MaterialDefinition.java) (revision 40683) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/materialdefinition/MaterialDefinition.java (.../MaterialDefinition.java) (revision 40852) @@ -253,6 +253,13 @@ * FSEYEQ-27 */ private String whetherTakeInventory; + + /** + * 是否管理生命周期 + * 用于管理器械材料是否在【器械生命周期管理】的“器械材料列表”中显示和查看;选项为“是”、“否”,默认值为“是” + * BJDXZLYY-70 + */ + private String manageLifecycle = Constants.STR_YES; public static Map ColumnNameAndPoPropertyNameMap = new LinkedHashMap(13); @@ -792,4 +799,13 @@ this.whetherTakeInventory = whetherTakeInventory; } + @Column(columnDefinition=" varchar(20) default '" + Constants.STR_YES + "' not null ") + public String getManageLifecycle() { + return manageLifecycle; + } + + public void setManageLifecycle(String manageLifecycle) { + this.manageLifecycle = manageLifecycle; + } + } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManager.java =================================================================== diff -u -r37872 -r40852 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManager.java (.../InstrumentInstanceManager.java) (revision 37872) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManager.java (.../InstrumentInstanceManager.java) (revision 40852) @@ -9,6 +9,7 @@ import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; import com.forgon.disinfectsystem.vo.InstrumentInstanceVo; +import com.forgon.entity.PageEntity; import com.forgon.tools.hibernate.BasePoManager; /** @@ -108,22 +109,51 @@ /** * 加载器械实例列表 - * @param materialDefinitonName - * @param materialDefinitonId - * @param udi - * @param instrumentBarcode - * @param pageSize - * @param pageNum - * @return + * @param materialDefinitonName 材料名称 + * @param materialDefinitonId 材料定义 + * @param udi udi码 + * @param instrumentBarcode 材料实例编码 + * @param tousseName 所属器械包定义名称支持模糊查询 + * @param idCardInstanceBarcode 标识牌实例条码 + * @param repairStatus 所属的器械包维修状态 + * @param pageSize 页查询大小 + * @param pageNum 页码 + * @return JSONObject */ public JSONObject loadInstrumentInstanceList(String materialDefinitonName, - Long materialDefinitonId, String udi, String instrumentBarcode, + Long materialDefinitonId, String udi, String instrumentBarcode, String tousseName, String idCardInstanceBarcode, String repairStatus, Integer pageSize, Integer pageNum); /** * 保存器械实例 * @param vo */ public void saveInstrumentInstance(InstrumentInstanceVo vo); + + /** + * 查询器械实例的维修记录BJDXZLYY-70 + * @param instrumentInstanceId 器械实例id + * @param spell 查询关键字 + * @param page 分页查询参数 + * @return JSONObject + */ + public JSONObject loadInstrumentRepairRecord(Long instrumentInstanceId, String spell, PageEntity page); + + /** + * 查询器械实例的保养记录BJDXZLYY-70 + * @param instrumentInstanceId 器械实例id + * @param spell 查询关键字 + * @param page 分页查询参数 + * @return JSONObject + */ + public JSONObject loadInstrumentTousseMaintain(Long instrumentInstanceId, String spell, PageEntity page); + + /** + * 根据器械条码查询器械实例信息BJDXZLYY-70 + * @param instrumentBarcode 器械条码 + * @param idCardInstanceBarcode 标识牌条码 + * @return JSONObject + */ + public JSONObject loadInstrumentInstanceByBarcode(String instrumentBarcode, String idCardInstanceBarcode); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java =================================================================== diff -u -r38737 -r40852 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 38737) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/service/InstrumentInstanceManagerImpl.java (.../InstrumentInstanceManagerImpl.java) (revision 40852) @@ -31,16 +31,20 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentinstance.InstrumentCycleInstance; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentinstance.InstrumentCycleInstanceWash; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentinstance.InstrumentInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.instrumentrepair.InstrumentRepair; +import com.forgon.disinfectsystem.entity.basedatamanager.instrumentrepair.InstrumentRepairGoods; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.signRecord.SignRecord; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.entity.basedatamanager.tousseMaintain.TousseMaintain; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; @@ -60,6 +64,7 @@ import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.vo.InstrumentInstanceVo; import com.forgon.disinfectsystem.vo.UseRecordVo; +import com.forgon.entity.PageEntity; import com.forgon.exception.SystemException; import com.forgon.tools.MathTools; import com.forgon.tools.Tools; @@ -68,6 +73,7 @@ import com.forgon.tools.db.InitDbConnection; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.DateJsonValueProcessor; +import com.forgon.tools.json.JSONUtil; import com.forgon.tools.string.StringTools; import com.forgon.tools.util.SqlUtils; @@ -83,7 +89,13 @@ private DateQueryAdapter dateQueryAdapter; - public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + private BarcodeManager barcodeManager; + + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { this.dateQueryAdapter = dateQueryAdapter; } @@ -1213,7 +1225,6 @@ @Override public Long getKey() { - // TODO Auto-generated method stub return mdId; } }; @@ -1223,7 +1234,7 @@ //3.批量生成器械实例数据 String batchInsertSql = - String.format("insert into %s(%s materialDefinitionId,materialEntryId,validStatus,instrumentBarcode) values(%s ?,?,?,?)", + String.format("insert into %s(%s materialDefinitionId,materialEntryId,validStatus,instrumentBarcode, repairStatus) values(%s ?,?,?,?,?)", InstrumentInstance.class.getSimpleName(),idColumnName,idColumnValue); jdbcTemplate.batchUpdate(batchInsertSql, new BatchPreparedStatementSetter() { @@ -1234,11 +1245,11 @@ ps.setLong(2, inEntry.getId()); ps.setString(3, Constants.STR_YES); ps.setString(4, mdIdToInstrumentBarcodeEntry.getValue()); + ps.setString(5, InstrumentInstance.REPAIR_STATUS_WAITE_USE); } @Override public int getBatchSize() { - // TODO Auto-generated method stub return CollectionUtils.size(mdIdToInstrumentBarcodeEntryList); } }); @@ -1828,28 +1839,49 @@ @Override public JSONObject loadInstrumentInstanceList(String materialDefinitonName, - Long materialDefinitonId, String udi, String instrumentBarcode, + Long materialDefinitonId, String udi, String instrumentBarcode, String tousseName, String idCardInstanceBarcode, String repairStatus, Integer pageSize, Integer pageNum) { + String idCardInstanceJoinSql = ""; + String idCardInstanceWhereSql = ""; + //根据标识牌条码查询 + if(StringUtils.isNotBlank(idCardInstanceBarcode)){ + idCardInstanceWhereSql += " and icibd.barcode = '" + idCardInstanceBarcode + "' "; + } + //根据标识牌关联的器械包定义名称查询 + if(StringUtils.isNotBlank(tousseName)){ + idCardInstanceWhereSql += " and ici.tousseName like '%" + tousseName + "%' "; + } + if(StringUtils.isNotBlank(idCardInstanceWhereSql)){ + idCardInstanceJoinSql = String.format(" join %s ici on ici.id = ii.idCardInstanceId join %s icibd on icibd.id = ici.id ", IDCardInstance.class.getSimpleName(), BarcodeDevice.class.getSimpleName()); + } String fromSql = String.format(" from %s ii " + "join %s md on md.id = ii.materialDefinitionId " + "left join %s me on me.id = ii.materialEntryId " + + idCardInstanceJoinSql + "where 1=1 ", InstrumentInstance.class.getSimpleName(), MaterialDefinition.class.getSimpleName(), MaterialEntry.class.getSimpleName()); - if(StringUtils.isNotBlank(materialDefinitonName) && !DatabaseUtil.isPoIdValid(materialDefinitonId)){ - fromSql += " and md.name like '%" + materialDefinitonName + "%' "; + //根据标识牌关联的器械维修记录维修状态查询 + if(StringUtils.isNotBlank(repairStatus) && !StringUtils.equals(repairStatus, "全部")){ + fromSql += String.format(" and %s ", SqlUtils.getStringFieldInLargeCollectionsPredicate("ii.repairStatus", StringTools.toCollectionIgnoreNullAndBlank(repairStatus, ", "))); } if(DatabaseUtil.isPoIdValid(materialDefinitonId)){ fromSql += " and md.id = " + materialDefinitonId + " "; } + if(StringUtils.isNotBlank(materialDefinitonName)){ + fromSql += " and md.name like '%" + materialDefinitonName + "%' "; + } if(StringUtils.isNotBlank(udi)){ fromSql += " and ii.udi like '%" + udi + "%' "; } if(StringUtils.isNotBlank(instrumentBarcode)){ fromSql += " and ii.instrumentBarcode like '%" + instrumentBarcode + "%' "; } + if(StringUtils.isNotBlank(idCardInstanceWhereSql)){ + fromSql += idCardInstanceWhereSql; + } if(pageSize == null || pageSize <= 0){ pageSize = 20; @@ -1948,4 +1980,171 @@ objectDao.saveOrUpdate(instrumentInstance); } + @SuppressWarnings("unchecked") + @Override + public JSONObject loadInstrumentRepairRecord(Long instrumentInstanceId, String spell, PageEntity page) { + + if(!DatabaseUtil.isPoIdValid(instrumentInstanceId)){ + throw new SystemException("参数异常"); + } + + int firstIndex = 0; + int maxResults = 0; + if(page != null){ + firstIndex = page.getStart(); + maxResults = page.getLimit(); + } + if(firstIndex <= 0){ + firstIndex = 0; + } + if(maxResults <= 0){ + maxResults = 20; + } + + InstrumentInstance instrumentInstance = this.get(instrumentInstanceId); + if(instrumentInstance == null){ + throw new SystemException("器械实例不存在或者已被删除!"); + } + + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append(" where id in (select instrumentRepair.id from "); + sqlBuffer.append(InstrumentRepairGoods.class.getSimpleName()); + sqlBuffer.append(" where instrumentBarcode = '" + instrumentInstance.getInstrumentBarcode() + "') "); + if(StringUtils.isNotBlank(spell)){ + sqlBuffer.append(" and (repairStatus like '%" + spell + "%' "); + sqlBuffer.append(" or registrantName like '%" + spell + "%' "); + sqlBuffer.append(" or id in (select instrumentRepair.id from "); + sqlBuffer.append(InstrumentRepairGoods.class.getSimpleName()); + sqlBuffer.append(" where instrumentBarcode = '" + instrumentInstance.getInstrumentBarcode() + "'"); + sqlBuffer.append(" and tousseDefinitionName like '%" + spell + "%')"); + sqlBuffer.append(") "); + } + String countSql = String.format("select count(*) from %s %s ", InstrumentRepair.class.getSimpleName(), sqlBuffer.toString()); + int rowCount = objectDao.countBySql(countSql); + if(rowCount > 0){ + List instrumentRepairList = objectDao.findBySql(InstrumentRepair.class.getSimpleName(), sqlBuffer.toString(), firstIndex, maxResults, "registerDateTime desc"); + page.setList(instrumentRepairList); + } + page.setCount(rowCount); + + JsonConfig jsonConfig = new JsonConfig(); + jsonConfig.setExcludes(new String[]{"instrumentRepairGoodsList"}); + jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm")); + + return JSONUtil.buildJsonObject(true, JSONObject.fromObject(page, jsonConfig)); + } + + @SuppressWarnings("unchecked") + @Override + public JSONObject loadInstrumentTousseMaintain(Long instrumentInstanceId, String spell, PageEntity page) { + if(!DatabaseUtil.isPoIdValid(instrumentInstanceId)){ + throw new SystemException("参数异常"); + } + int firstIndex = 0; + int maxResults = 0; + if(page != null){ + firstIndex = page.getStart(); + maxResults = page.getLimit(); + } + if(firstIndex <= 0){ + firstIndex = 0; + } + if(maxResults <= 0){ + maxResults = 20; + } + + InstrumentInstance instrumentInstance = this.get(instrumentInstanceId); + if(instrumentInstance == null){ + throw new SystemException("器械实例不存在或者已被删除!"); + } + + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append(" where instrumentBarcode = '"); + sqlBuffer.append(instrumentInstance.getInstrumentBarcode() + "' "); + if(StringUtils.isNotBlank(spell)){ + sqlBuffer.append(" and (tousseName like '%" + spell + "%' "); + sqlBuffer.append(" or maintainUser like '%" + spell + "%') "); + } + String countSql = String.format("select count(*) from %s %s ", TousseMaintain.class.getSimpleName(), sqlBuffer.toString()); + int rowCount = objectDao.countBySql(countSql); + if(rowCount > 0){ + List tousseMaintainList = objectDao.findBySql(TousseMaintain.class.getSimpleName(), sqlBuffer.toString(), firstIndex, maxResults, "id"); + page.setList(tousseMaintainList); + } + page.setCount(rowCount); + + JsonConfig jsonConfig = new JsonConfig(); + jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm")); + + return JSONUtil.buildJsonObject(true, JSONObject.fromObject(page, jsonConfig)); + } + + @Override + public JSONObject loadInstrumentInstanceByBarcode(String instrumentBarcode, String idCardInstanceBarcode) { + if(StringUtils.isBlank(instrumentBarcode)){ + throw new SystemException("器械实例条码无效!"); + } + if(StringUtils.isBlank(idCardInstanceBarcode)){ + throw new SystemException("所属标识牌条码无效!"); + } + BarcodeDevice barcodeDevice = barcodeManager.getBarcodeDeviceByBarcode(idCardInstanceBarcode); + if (barcodeDevice == null) { + throw new SystemException("所属标识牌条码无效!"); + } + if (!(barcodeDevice instanceof IDCardInstance)) { + throw new SystemException("所属标识牌条码无效!"); + } + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select ii.id, ii.instrumentBarcode"); + sqlBuffer.append(", md.id materialDefinitionId, md.name materialDefinitionName, md.specification"); + sqlBuffer.append(", td.id tousseDefinitionId, td.ancestorID, td.name tousseDefinitionName, td.tousseType from "); + sqlBuffer.append(InstrumentInstance.class.getSimpleName()); + sqlBuffer.append(" ii join "); + sqlBuffer.append(MaterialDefinition.class.getSimpleName()); + sqlBuffer.append(" md on md.id = ii.materialDefinitionId join "); + sqlBuffer.append(IDCardInstance.class.getSimpleName()); + sqlBuffer.append(" ici on ici.id = ii.idCardInstanceId join "); + sqlBuffer.append(BarcodeDevice.class.getSimpleName()); + sqlBuffer.append(" bd on bd.id = ici.id join "); + sqlBuffer.append(IDCardDefinition.class.getSimpleName()); + sqlBuffer.append(" icd on icd.id = ici.idCardDefinitionID join "); + sqlBuffer.append(TousseDefinition.class.getSimpleName()); + sqlBuffer.append(" td on td.id = icd.tousseDefinitionID where ii.instrumentBarcode = '"); + sqlBuffer.append(instrumentBarcode); + sqlBuffer.append("' and bd.barcode = '"); + sqlBuffer.append(barcodeDevice.getBarcode()); + sqlBuffer.append("'"); + + Map resultMap = new HashMap(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sqlBuffer.toString()); + while(rs.next()){ + resultMap.put("id", rs.getLong("id")); + resultMap.put("instrumentBarcode", rs.getString("instrumentBarcode")); + resultMap.put("materialDefinitionId", rs.getLong("materialDefinitionId")); + String materialDefinitionName = rs.getString("materialDefinitionName"); + String specification = rs.getString("specification"); + String materialShowName = materialDefinitionName; + if(StringUtils.isNotBlank(specification)){ + materialShowName += "[" + specification + "]"; + } + resultMap.put("materialDefinitionName", materialDefinitionName); + resultMap.put("specification", specification); + resultMap.put("materialShowName", materialShowName); + resultMap.put("tousseDefinitionId", rs.getLong("tousseDefinitionId")); + resultMap.put("ancestorID", rs.getLong("ancestorID")); + resultMap.put("tousseDefinitionName", rs.getString("tousseDefinitionName")); + resultMap.put("tousseType", rs.getString("tousseType")); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + return JSONObject.fromObject(resultMap); + } + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/tousseMaintain/TousseMaintain.java =================================================================== diff -u -r39250 -r40852 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/tousseMaintain/TousseMaintain.java (.../TousseMaintain.java) (revision 39250) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/tousseMaintain/TousseMaintain.java (.../TousseMaintain.java) (revision 40852) @@ -30,6 +30,25 @@ */ private String idCardInstanceIDBarcode; /** + * 器械实例条码 + * 支持扫器械实例条码方式添加保养器械 + * BJDXZLYY-70 + */ + private String instrumentBarcode; + + /** + * 器械名称 + * BJDXZLYY-70 + */ + private String instrumentName; + + /** + * 器械包定义id + * BJDXZLYY-70 + */ + private Long tousseDefinitionId; + + /** * 器械包名称 */ private String tousseName; @@ -102,6 +121,24 @@ public void setIdCardInstanceIDBarcode(String idCardInstanceIDBarcode) { this.idCardInstanceIDBarcode = idCardInstanceIDBarcode; } + public String getInstrumentBarcode() { + return instrumentBarcode; + } + public void setInstrumentBarcode(String instrumentBarcode) { + this.instrumentBarcode = instrumentBarcode; + } + public String getInstrumentName() { + return instrumentName; + } + public void setInstrumentName(String instrumentName) { + this.instrumentName = instrumentName; + } + public Long getTousseDefinitionId() { + return tousseDefinitionId; + } + public void setTousseDefinitionId(Long tousseDefinitionId) { + this.tousseDefinitionId = tousseDefinitionId; + } public String getTousseName() { return tousseName; } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/controller/MaterialDefinitionController.java =================================================================== diff -u -r34704 -r40852 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/controller/MaterialDefinitionController.java (.../MaterialDefinitionController.java) (revision 34704) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/controller/MaterialDefinitionController.java (.../MaterialDefinitionController.java) (revision 40852) @@ -133,6 +133,7 @@ pageNum = 1; } String whereSql = String.format(" 1=1 "); + whereSql += String.format(" and manageLifecycle = '%s' ", Constants.STR_YES); if(StringUtils.isNotBlank(spell)){ whereSql += " and name like '%" + spell + "%' "; } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/controller/InstrumentInstanceController.java =================================================================== diff -u -r37872 -r40852 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/controller/InstrumentInstanceController.java (.../InstrumentInstanceController.java) (revision 37872) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentinstance/controller/InstrumentInstanceController.java (.../InstrumentInstanceController.java) (revision 40852) @@ -14,6 +14,7 @@ import com.forgon.disinfectsystem.tousse.instrumentinstance.service.InstrumentInstanceManager; import com.forgon.disinfectsystem.vo.InstrumentInstanceVo; +import com.forgon.entity.PageEntity; import com.forgon.tools.date.DateTools; import com.forgon.tools.json.DateJsonValueProcessor; import com.forgon.tools.json.JSONUtil; @@ -108,20 +109,23 @@ /** * 追溯器械列表 - * @param materialDefinitonName - * @param materialDefinitonId - * @param udi - * @param instrumentBarcode - * @param pageSize - * @param pageNum + * @param materialDefinitonName 材料名称 + * @param materialDefinitonId 材料定义id + * @param udi udi码 + * @param instrumentBarcode 器械实例条码 + * @param tousseName 器械包名称 + * @param idCardInstanceBarcode 标识牌条码 + * @param repairStatus 维修状态,多选框,多个状态用,分割 + * @param pageSize 页大小 + * @param pageNum 页码 * @return */ @RequestMapping("/loadInstrumentInstanceList") public String loadInstrumentInstanceList(String materialDefinitonName, Long materialDefinitonId, - String udi, String instrumentBarcode, Integer pageSize, Integer pageNum){ + String udi, String instrumentBarcode, String tousseName, String idCardInstanceBarcode, String repairStatus, Integer pageSize, Integer pageNum){ JSONObject result = JSONUtil.buildJsonObject(true); try { - result = instrumentInstanceManager.loadInstrumentInstanceList(materialDefinitonName, materialDefinitonId, udi, instrumentBarcode, pageSize, pageNum); + result = instrumentInstanceManager.loadInstrumentInstanceList(materialDefinitonName, materialDefinitonId, udi, instrumentBarcode, tousseName, idCardInstanceBarcode, repairStatus, pageSize, pageNum); } catch (Exception e) { result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); } @@ -164,4 +168,61 @@ return result.toString(); } + /** + * 加载器械实例维修记录BJDXZLYY-70 + * @param instrumentInstanceId 器械实例ID + * @param spell 模糊查询的关键字 + * @param page 分页参数 + * @return + */ + @RequestMapping("/loadInstrumentRepairRecord") + public String loadInstrumentRepairRecord(Long instrumentInstanceId, String spell, PageEntity page){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + result = instrumentInstanceManager.loadInstrumentRepairRecord(instrumentInstanceId, spell, page); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 加载器械实例“保养记录”BJDXZLYY-70 + * @param instrumentInstanceId 器械实例ID + * @param spell 模糊查询的关键字 + * @param page 分页参数 + * @return + */ + @RequestMapping("/loadInstrumentTousseMaintain") + public String loadInstrumentTousseMaintain(Long instrumentInstanceId, String spell, PageEntity page){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + result = instrumentInstanceManager.loadInstrumentTousseMaintain(instrumentInstanceId, spell, page); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 获取器械实例信息BJDXZLYY-70 + * @param instrumentBarcode 器械条码 + * @param idCardInstanceBarcode 标识牌条码 + * @return + */ + @RequestMapping("/loadInstrumentInstanceByBarcode") + public String loadInstrumentInstanceByBarcode(String instrumentBarcode, String idCardInstanceBarcode){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + JSONObject data = instrumentInstanceManager.loadInstrumentInstanceByBarcode(instrumentBarcode, idCardInstanceBarcode); + result = JSONUtil.buildJsonObject(true, data); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); + } + return result.toString(); + } + } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java =================================================================== diff -u -r36001 -r40852 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java (.../InstrumentRepairManagerImpl.java) (revision 36001) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/instrumentrepair/service/InstrumentRepairManagerImpl.java (.../InstrumentRepairManagerImpl.java) (revision 40852) @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,6 +16,7 @@ import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.basedatamanager.instrumentinstance.InstrumentInstance; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentrepair.InstrumentRepair; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentrepair.InstrumentRepairGoods; import com.forgon.disinfectsystem.entity.basedatamanager.instrumentrepair.InstrumentRepairRemindRecord; @@ -46,6 +48,16 @@ private InitDbConnection dbConnection; + /** + * 保存操作 + */ + public final static Integer ACTION_TYPE_SAVE = 1; + + /** + * 删除操作 + */ + public final static Integer ACTION_TYPE_DELETE = 0; + public void setDbConnection(InitDbConnection dbConnection) { this.dbConnection = dbConnection; } @@ -100,32 +112,156 @@ //新增可提醒用户的器械维修记录版本功能CDSLQYQYYY-118 String InstrumentRepairManagementVersion = ConfigUtils.getSystemSetConfigByName("InstrumentRepairManagementVersion"); - if(!StringUtils.equals(InstrumentRepairManagementVersion, "2")){ - return; + if(StringUtils.equals(InstrumentRepairManagementVersion, "2")){ + if(StringUtils.equals(instrumentRepair.getRepairResult(), InstrumentRepair.REPAIR_STATUS_DISCARD) + && instrumentRepair.getDiscardDateTime() == null){ + throw new SystemException("报废时间不能为空!"); + } + + /** + * CDSLQYQYYY-118新增可提醒用户的器械维修记录版本 + * 在此版本中,此字段的根据以下规则来取值: + * 若“维修结果”的值不为空,则维修状态跟随“维修结果”的值; + * 若“维修结果”为空,则判断“出科时间”是否为空,为空则取值“待维修”,不为空则取值“维修中”; + */ + String repairStatusVersion2 = instrumentRepair.calRepairStatusVersion2(); + instrumentRepair.setRepairStatus(repairStatusVersion2); + + //设置“维修信息接收者” + saveInstrumentRepairRemindUser(instrumentRepair); + + //维修状态改变时,删除维修信息提醒记录,提醒用户或者提醒科室下次还能继续收到通知 + deleteInstrumentRepairRemindRecord(instrumentRepair, originalRepairStatusVesrion2); } - if(StringUtils.equals(instrumentRepair.getRepairResult(), InstrumentRepair.REPAIR_STATUS_DISCARD) - && instrumentRepair.getDiscardDateTime() == null){ - throw new SystemException("报废时间不能为空!"); + //修改器械实例的状态BJDXZLYY-70 + updateInstrumentInstanceRepairStatus(instrumentRepair, ACTION_TYPE_SAVE); + } + + /** + * 修改器械实例的状态BJDXZLYY-70 + * @param instrumentRepair 器械维修管理 + * @param actionType 操作类型 + */ + @SuppressWarnings("unchecked") + private void updateInstrumentInstanceRepairStatus(InstrumentRepair instrumentRepair, int actionType) { + boolean enableInstrumentLifeCycleTraceabilityManagement = ConfigUtils.getSystemSetConfigByNameBool("enableInstrumentLifeCycleTraceabilityManagement"); + if(!enableInstrumentLifeCycleTraceabilityManagement){ + return; } + if(instrumentRepair == null || CollectionUtils.isEmpty(instrumentRepair.getInstrumentRepairGoodsList())){ + return; + } + List repairInstrumentBarcodeList = new ArrayList(); + List instrumentRepairGoodsList = instrumentRepair.getInstrumentRepairGoodsList(); + for (InstrumentRepairGoods instrumentRepairGoods : instrumentRepairGoodsList) { + String instrumentBarcode = instrumentRepairGoods.getInstrumentBarcode(); + if(StringUtils.isNotBlank(instrumentBarcode)){ + if(repairInstrumentBarcodeList.contains(instrumentBarcode)){ + throw new SystemException(String.format("重复的器械条码%s!", instrumentBarcode)); + } + repairInstrumentBarcodeList.add(instrumentBarcode); + } + } + if(CollectionUtils.isEmpty(repairInstrumentBarcodeList)){ + return; + } + List repairInstrumentInstanceList = objectDao.getCollection(InstrumentInstance.class.getSimpleName(), "instrumentBarcode", repairInstrumentBarcodeList); + if(CollectionUtils.isEmpty(repairInstrumentInstanceList)){ + return; + } - /** - * CDSLQYQYYY-118新增可提醒用户的器械维修记录版本 - * 在此版本中,此字段的根据以下规则来取值: - * 若“维修结果”的值不为空,则维修状态跟随“维修结果”的值; - * 若“维修结果”为空,则判断“出科时间”是否为空,为空则取值“待维修”,不为空则取值“维修中”; - */ - String repairStatusVersion2 = instrumentRepair.calRepairStatusVersion2(); - instrumentRepair.setRepairStatus(repairStatusVersion2); + //查询器械实例的最新维修记录 + Map instrumentInstanceBarcodeLastInstrumentRepairMap = getInstrumentInstanceBarcodeLastInstrumentRepairMap(repairInstrumentBarcodeList, actionType, instrumentRepair); - //设置“维修信息接收者” - saveInstrumentRepairRemindUser(instrumentRepair); - - //维修状态改变时,删除维修信息提醒记录,提醒用户或者提醒科室下次还能继续收到通知 - deleteInstrumentRepairRemindRecord(instrumentRepair, originalRepairStatusVesrion2); + if(ACTION_TYPE_SAVE == actionType){ + //保存或者修改维修记录 + for (InstrumentInstance instrumentInstance : repairInstrumentInstanceList) { + InstrumentRepair lastInstrumentRepair = instrumentInstanceBarcodeLastInstrumentRepairMap.get(instrumentInstance.getInstrumentBarcode()); + if(lastInstrumentRepair != null && lastInstrumentRepair.getRegisterDateTime().after(instrumentRepair.getRegisterDateTime())){ + //根据最新维修记录,为器械实例状态赋值 + updateInstrumentInstanceStatueByInstrumentRepair(instrumentInstance, lastInstrumentRepair); + }else{ + //根据最新维修记录,为器械实例状态赋值 + updateInstrumentInstanceStatueByInstrumentRepair(instrumentInstance, instrumentRepair); + } + objectDao.saveOrUpdate(instrumentInstance); + } + } else if(ACTION_TYPE_DELETE == actionType){ + //删除维修记录 + for (InstrumentInstance instrumentInstance : repairInstrumentInstanceList) { + InstrumentRepair lastInstrumentRepair = instrumentInstanceBarcodeLastInstrumentRepairMap.get(instrumentInstance.getInstrumentBarcode()); + if(lastInstrumentRepair != null){ + //根据最新维修记录,为器械实例状态赋值 + updateInstrumentInstanceStatueByInstrumentRepair(instrumentInstance, lastInstrumentRepair); + }else{ + if(DatabaseUtil.isPoIdValid(instrumentInstance.getIdCardInstanceId())){ + //器械实例绑定标识牌,状态为使用中 + instrumentInstance.setRepairStatus(InstrumentInstance.REPAIR_STATUS_IN_USE); + }else{ + //器械实例没有绑定标识牌,状态为待使用 + instrumentInstance.setRepairStatus(InstrumentInstance.REPAIR_STATUS_WAITE_USE); + } + instrumentInstance.setLastInstrumentRepairId(null); + } + objectDao.saveOrUpdate(instrumentInstance); + } + } } /** + * 根据最新维修记录,为器械实例状态赋值 + * @param instrumentInstance 器械实例 + * @param instrumentRepair 器械维修记录 + */ + private void updateInstrumentInstanceStatueByInstrumentRepair(InstrumentInstance instrumentInstance, InstrumentRepair instrumentRepair) { + if(StringUtils.equals(instrumentRepair.getRepairStatus(), InstrumentRepair.REPAIR_STATUS_REPAIRED)){ + //最新一条维修记录状态为“已维修”时,根据是否绑定标识牌,设置状态为使用中、待使用 + if(DatabaseUtil.isPoIdValid(instrumentInstance.getIdCardInstanceId())){ + //器械实例绑定标识牌,状态为使用中 + instrumentInstance.setRepairStatus(InstrumentInstance.REPAIR_STATUS_IN_USE); + }else{ + //器械实例没有绑定标识牌,状态为待使用 + instrumentInstance.setRepairStatus(InstrumentInstance.REPAIR_STATUS_WAITE_USE); + } + instrumentInstance.setLastInstrumentRepairId(null); + }else{ + //器械实例状态为最新一条维修记录状态 + instrumentInstance.setRepairStatus(instrumentRepair.getRepairStatus()); + //器械实例关联最新一条维修记录 + instrumentInstance.setLastInstrumentRepairId(instrumentRepair.getId()); + } + } + + /** + * 查询器械实例关联的最新维修记录 + * @param repairInstrumentBarcodeList 器械实例 + * @param actionType 操作类型 + * @param instrumentRepair 当前维修记录 + * @return 器械实例id-最新维修记录的map + */ + @SuppressWarnings("unchecked") + private Map getInstrumentInstanceBarcodeLastInstrumentRepairMap(List repairInstrumentBarcodeList, int actionType, InstrumentRepair instrumentRepair) { + Map instrumentInstanceBarcodeLastInstrumentRepairMap = new HashMap(); + //器械实例绑定标识牌 + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append(" where " + SqlUtils.getStringFieldInLargeCollectionsPredicate("instrumentBarcode", repairInstrumentBarcodeList)); + //只查询登记时间最晚的记录 + sqlBuffer.append(" and instrumentRepair.registerDateTime in (select max(irg.instrumentRepair.registerDateTime) from InstrumentRepairGoods irg where " + SqlUtils.getStringFieldInLargeCollectionsPredicate("irg.instrumentBarcode", repairInstrumentBarcodeList)); + if(instrumentRepair != null){ + sqlBuffer.append(" and irg.instrumentRepair.id <> " + instrumentRepair.getId()); + } + sqlBuffer.append(" group by irg.instrumentBarcode)"); + List instrumentRepairGoodsList = objectDao.findBySql(InstrumentRepairGoods.class.getSimpleName(), sqlBuffer.toString()); + if(CollectionUtils.isNotEmpty(instrumentRepairGoodsList)){ + for (InstrumentRepairGoods instrumentRepairGoods : instrumentRepairGoodsList) { + instrumentInstanceBarcodeLastInstrumentRepairMap.put(instrumentRepairGoods.getInstrumentBarcode(), instrumentRepairGoods.getInstrumentRepair()); + } + } + return instrumentInstanceBarcodeLastInstrumentRepairMap; + } + + /** * 维修状态改变时,删除维修信息提醒记录 * @param instrumentRepair * @param originalRepairStatusVesrion2 @@ -288,7 +424,11 @@ } List instrumentRepairList = this.getCollection(ids, ";"); if(CollectionUtils.isNotEmpty(instrumentRepairList)){ - objectDao.deleteAll(instrumentRepairList); + for (InstrumentRepair instrumentRepair : instrumentRepairList) { + //修改器械实例的状态BJDXZLYY-70 + updateInstrumentInstanceRepairStatus(instrumentRepair, ACTION_TYPE_DELETE); + objectDao.delete(instrumentRepair); + } } //删除维修信息接收者及提示信息 Collection idColl = StringTools.parseToLongs(ids, ";"); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseMaintainTableManager.java =================================================================== diff -u -r40302 -r40852 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseMaintainTableManager.java (.../TousseMaintainTableManager.java) (revision 40302) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/TousseMaintainTableManager.java (.../TousseMaintainTableManager.java) (revision 40852) @@ -11,6 +11,7 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.entity.basedatamanager.tousseMaintain.TousseMaintain; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.tools.hibernate.ObjectDao; @@ -128,9 +129,10 @@ if(barcodeDevice instanceof IDCardInstance) { IDCardInstance idcardInstance = (IDCardInstance)barcodeDevice; - String tousseName = idcardInstance.getIDCardDefinition(objectDao).getTousseDefinition(objectDao).getName(); + TousseDefinition tousseDefinition = idcardInstance.getIDCardDefinition(objectDao).getTousseDefinition(objectDao); Long useAmount = idcardInstance.getIDCardDefinition(objectDao).getUseAmount(); - obj.put("tousseName", tousseName); + obj.put("tousseDefinitionId", tousseDefinition.getAncestorID()); + obj.put("tousseName", tousseDefinition.getName()); obj.put("useAmount", useAmount); //不管idCardBarcode是自定义唯一码还是标识牌条码,最终都返回标识牌条码 obj.put("idCardBarcode", barcodeDevice.getBarcode()); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentrepair/InstrumentRepairGoods.java =================================================================== diff -u -r39250 -r40852 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentrepair/InstrumentRepairGoods.java (.../InstrumentRepairGoods.java) (revision 39250) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/instrumentrepair/InstrumentRepairGoods.java (.../InstrumentRepairGoods.java) (revision 40852) @@ -66,6 +66,18 @@ * 维修器械关联的器械维修记录 */ private InstrumentRepair instrumentRepair; + + /** + * 标识牌条码 + * BJDXZLYY-70 + */ + private String idCardInstanceBarcode; + + /** + * 器械实例条码 + * BJDXZLYY-70 + */ + private String instrumentBarcode; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -138,4 +150,20 @@ this.instrumentSpecificName = instrumentSpecificName; } + public String getIdCardInstanceBarcode() { + return idCardInstanceBarcode; + } + + public void setIdCardInstanceBarcode(String idCardInstanceBarcode) { + this.idCardInstanceBarcode = idCardInstanceBarcode; + } + + public String getInstrumentBarcode() { + return instrumentBarcode; + } + + public void setInstrumentBarcode(String instrumentBarcode) { + this.instrumentBarcode = instrumentBarcode; + } + } Index: ssts-web/src/main/webapp/dataUpdater/sqls/5.0.49_5.0.50.sql =================================================================== diff -u --- ssts-web/src/main/webapp/dataUpdater/sqls/5.0.49_5.0.50.sql (revision 0) +++ ssts-web/src/main/webapp/dataUpdater/sqls/5.0.49_5.0.50.sql (revision 40852) @@ -0,0 +1,2 @@ +update InstrumentInstance set repairStatus = '使用中' where idCardInstanceId is not null and lastInstrumentRepairId is null and repairStatus = '待使用'; +update TousseMaintain set tousseDefinitionId = (select icd.tousseDefinitionID from IDCardInstance ici join IDCardDefinition icd on icd.id = ici.idCardDefinitionID where ici.id = TousseMaintain.idCardInstanceID) where idCardInstanceID is not null; \ No newline at end of file