Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r31060 -r31074 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 31060) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 31074) @@ -3841,6 +3841,8 @@ String remark = JSONUtil.optString(paramsObj, "remark", null); String errorDamageRemarkInfo = JSONUtil.optString(paramsObj, "errorDamageRemarkInfo", null); String errorDamageRemarkId = JSONUtil.optString(paramsObj, "errorDamageRemarkId", null); + boolean partialSplitForeignTousse = JSONUtil.optBoolean(paramsObj, "partialSplitForeignTousse", false); + boolean partialSplitForeignTousseEnd = JSONUtil.optBoolean(paramsObj, "partialSplitForeignTousseEnd", false); //noUserFormSterilizationInfo=true是才使用包定义的灭菌程序和包装类型 boolean noUserFormSterilizationInfo = JSONUtil.optBoolean(paramsObj, "noUserFormSterilizationInfo", false); ErrorDamageRemark errorDamageRemark = null; @@ -4217,7 +4219,7 @@ // 外来器械包装配,拆包装配的处理 splits = JSONArray.fromObject(splitPackages); // 页面已经拆包,设置价格 - if(foreignTousseSplitPriceType == TousseDefinition.FOREIGNTOUSSE_SPLIT_PRICE_TYPE_AVG){ + if(!partialSplitForeignTousse && foreignTousseSplitPriceType == TousseDefinition.FOREIGNTOUSSE_SPLIT_PRICE_TYPE_AVG){ if(splits.size() == 0){ throw new RuntimeException("外来器械拆包数量不能为0"); } @@ -4479,7 +4481,7 @@ } //更新清洗明细记录及修改删除对应的装配任务 - updatePackingTask(currentPackingTaskAsList, packingAmountForThisTask , tousseName,tousseInstances.size()); + updatePackingTask(currentPackingTaskAsList, packingAmountForThisTask , tousseName,tousseInstances.size(),partialSplitForeignTousseEnd,partialSplitForeignTousse); //判断如果配置二级供应室是否自动发货不为否才自动发货,否则不自动发货 if(supplyRoomConfig.getSupplyRoomType() == SupplyRoomConfig.SUPPLYROOM_TYPE_SECOND_SUPPLYROOM @@ -5330,7 +5332,7 @@ * @param tousseName 器械包名称 * @param basketBarcode 清洗篮筐条码 */ - private void updatePackingTask(List packingTaskList, Integer currentPackAmount , String tousseName,int tousseSize){ + private void updatePackingTask(List packingTaskList, Integer currentPackAmount , String tousseName,int tousseSize, boolean partialSplitForeignTousseEnd, boolean partialSplitForeignTousse){ int leftAmount = currentPackAmount; boolean allowForeignToussePartiallyPacking = CssdUtils.getSystemSetConfigByNameBool("allowForeignToussePartiallyPacking"); int reducedAmount = 0; @@ -5350,6 +5352,10 @@ // 部分装配的外来器械,并且还未装完。 break; } + if(partialSplitForeignTousse && !partialSplitForeignTousseEnd){ + //外来器械部分拆包,不是最后一次拆包都不删除装配任务 + break; + } if(leftAmount >= unPackAmount){ leftAmount -= unPackAmount; //待补充数量 Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r30899 -r31074 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 30899) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 31074) @@ -115,6 +115,7 @@ import com.forgon.disinfectsystem.stockmanage.departmentstock.service.DepartmentStockManager; import com.forgon.disinfectsystem.stockmanage.departmentstock.vo.TousseInstanceVo; import com.forgon.disinfectsystem.tousse.cssdhandletousses.service.CssdHandleTousseManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.vo.SplitForeignTousseVo; import com.forgon.disinfectsystem.tousse.toussedefinition.vo.TousseInstanceExportVo; import com.forgon.disinfectsystem.tousse.toussedefinition.vo.TousseOperationVo; import com.forgon.disinfectsystem.vo.ItemDefinitionVO; @@ -8762,4 +8763,131 @@ SplitForeignTousseName splitForeignTousseNameObj = new SplitForeignTousseName(splitForeignTousseName); objectDao.save(splitForeignTousseNameObj); } + @Override + public Collection queryPackedTousseInstanceInfo(Long packingTaskId, Long parentID) { + if(!DatabaseUtil.isPoIdValid(packingTaskId)){ + return new ArrayList(); + } + PackingTask pt = (PackingTask)objectDao.getById(PackingTask.class.getSimpleName(), packingTaskId); + if(pt == null){ + return new ArrayList(); + } + String classifyBasketIdsSql = null; + if(StringUtils.isNotBlank(pt.getClassifyBasketIds())){ + classifyBasketIdsSql = " ti.classifyBasketIds='" + pt.getClassifyBasketIds() + "' "; + }else{ + classifyBasketIdsSql = " ti.classifyBasket_id=" + pt.getClassifyBasket_id(); + } + String querySql = String.format("select ti.id tousseInstanceId,td.name tousseDefinitionName,td.isBigPackage,ti.packageType,ti.sterilingType,md.name materialDefinitionName,mi.count,md.isImplant " + + "from %s ti join %s td on td.id=ti.tousseDefinition_id join %s mi on mi.tousse_id=td.id join %s md on md.id=mi.materialDefinition_id where td.parentID=%s and %s order by ti.id desc ", + TousseInstance.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + MaterialInstance.class.getSimpleName(), + MaterialDefinition.class.getSimpleName(), + parentID, + classifyBasketIdsSql); + ResultSet rs = null; + Map splitForeignTousseVoMap = new HashMap(); + try{ + rs = objectDao.executeSql(querySql); + while(rs.next()){ + Long tousseInstanceId = rs.getLong("tousseInstanceId"); + SplitForeignTousseVo vo = null; + if(splitForeignTousseVoMap.containsKey(tousseInstanceId)){ + vo = splitForeignTousseVoMap.get(tousseInstanceId); + }else{ + vo = new SplitForeignTousseVo(tousseInstanceId, rs.getString("tousseDefinitionName"), rs.getString("isBigPackage"), rs.getString("packageType"), rs.getString("sterilingType")); + splitForeignTousseVoMap.put(tousseInstanceId, vo); + } + String materialDefinitionName = rs.getString("materialDefinitionName"); + int count = rs.getInt("count"); + String isImplant = rs.getString("isImplant"); + String containMaterialInfo = vo.getContainMaterialInfo(); + if(StringUtils.isBlank(vo.getContainMaterialInfo())){ + containMaterialInfo = materialDefinitionName; + }else{ + containMaterialInfo += ";" + materialDefinitionName; + } + if(Constants.STR_YES.equals(isImplant)){//植入物 + containMaterialInfo += "[是]x"; + vo.setImplantCount(count + vo.getImplantCount()); + }else{ + containMaterialInfo += "[否]x"; + vo.setToolCount(count + vo.getToolCount()); + } + containMaterialInfo += count; + vo.setContainMaterialInfo(containMaterialInfo); + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return splitForeignTousseVoMap.values(); + } + @Override + public Map queryPackedMaterialInstanceCount( + Long packingTaskId, Long parentID) { + if(!DatabaseUtil.isPoIdValid(packingTaskId)){ + return new HashMap(); + } + PackingTask pt = (PackingTask)objectDao.getById(PackingTask.class.getSimpleName(), packingTaskId); + if(pt == null){ + return new HashMap(); + } + String classifyBasketIdsSql = null; + if(StringUtils.isNotBlank(pt.getClassifyBasketIds())){ + classifyBasketIdsSql = " ti.classifyBasketIds='" + pt.getClassifyBasketIds() + "' "; + }else{ + classifyBasketIdsSql = " ti.classifyBasket_id=" + pt.getClassifyBasket_id(); + } + String querySql = String.format("select mi.materialDefinition_id id,sum(mi.count) count " + + "from %s ti join %s td on td.id=ti.tousseDefinition_id join %s mi on mi.tousse_id=td.id where td.parentID=%s and %s group by mi.materialDefinition_id ", + TousseInstance.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + MaterialInstance.class.getSimpleName(), + parentID, + classifyBasketIdsSql); + ResultSet rs = null; + Map packedMaterialInstanceCountMap = new HashMap(); + try{ + rs = objectDao.executeSql(querySql); + while(rs.next()){ + Long id = rs.getLong("id"); + int count = rs.getInt("count"); + packedMaterialInstanceCountMap.put(id, count); + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return packedMaterialInstanceCountMap; + } + @Override + public Map queryPackedMaterialInstanceCount(String foreignTousseAppId, + Long parentId) { + String querySql = String.format("select mi.materialDefinition_id id,sum(mi.count) count " + + "from %s ti join %s td on td.id=ti.tousseDefinition_id join %s mi on mi.tousse_id=td.id where ti.foreignTousseApp_id=%s and td.parentID=%s group by mi.materialDefinition_id ", + TousseInstance.class.getSimpleName(), + TousseDefinition.class.getSimpleName(), + MaterialInstance.class.getSimpleName(), + foreignTousseAppId, + parentId); + Map packedMaterialInstanceCountMap = new HashMap(); + ResultSet rs = null; + try{ + rs = objectDao.executeSql(querySql); + while(rs.next()){ + Long id = rs.getLong("id"); + int count = rs.getInt("count"); + packedMaterialInstanceCountMap.put(id, count); + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + return packedMaterialInstanceCountMap; + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java =================================================================== diff -u -r30958 -r31074 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 30958) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 31074) @@ -15,6 +15,7 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; @@ -1555,6 +1556,37 @@ //如果该申请项未发现有不满足拆分的条件并且同时有对应的包实例时 if(tousseItemCanSplit && existsTousseInstanceOfTousseItem){ TousseDefinition td = tousseDefinitionMap.get(tousseItem.getTousseDefinitionId()); + Map packedMaterialInstanceCountMap = tousseInstanceManager.queryPackedMaterialInstanceCount(applicationId, tousseItem.getTousseDefinitionId()); + if(MapUtils.isNotEmpty(packedMaterialInstanceCountMap)){ + List materialInstances = td.getMaterialInstances(); + if(CollectionUtils.isNotEmpty(materialInstances)){ + for(MaterialInstance mi : materialInstances){ + if(!packedMaterialInstanceCountMap.containsKey(mi.getMaterialDefinitionId())){ + if(message == null){ + message = td.getName() + "还有部分材料未拆包"; + }else{ + message += "," + td.getName() + "还有部分材料未拆包"; + } + message = td.getName() + "还有部分材料未拆包"; + tousseItemCanSplit = false; + break; + } + int count = packedMaterialInstanceCountMap.get(mi.getMaterialDefinitionId()); + if(count != mi.getCount()){ + if(message == null){ + message = td.getName() + "还有部分材料未拆包"; + }else{ + message += "," + td.getName() + "还有部分材料未拆包"; + } + tousseItemCanSplit = false; + break; + } + } + } + } + if(!tousseItemCanSplit){ + continue; + } JSONObject data = new JSONObject(); data.put("tousseItemId", tousseItem.getId()); data.put("tousseName", td.getName()); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r30869 -r31074 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 30869) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 31074) @@ -27,6 +27,7 @@ import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; import com.forgon.disinfectsystem.stockmanage.departmentstock.vo.TousseInstanceVo; +import com.forgon.disinfectsystem.tousse.toussedefinition.vo.SplitForeignTousseVo; import com.forgon.disinfectsystem.vo.TousseSimpleVO; import com.forgon.tools.hibernate.BasePoManager; @@ -1135,5 +1136,26 @@ * @param splitForeignTousseName */ public void saveSplitForeignTousseName(String splitForeignTousseName); + /** + * 查询已经部分拆包装配的外来器械拆分小包信息 供已拆包列表使用(BJ307YY-76) + * @param packingTaskId 装配任务id + * @param parentID 父包id + * @return + */ + public Collection queryPackedTousseInstanceInfo(Long packingTaskId, Long parentID); + /** + * 查询已经部分拆包装配的外来器械拆分包的材料数量 + * @param packingTaskId 装配任务id + * @param parentID 父包id + * @return + */ + public Map queryPackedMaterialInstanceCount(Long packingTaskId, Long parentID); + /** + * 查询已经部分拆包装配的外来器械拆分小包的材料数量 + * @param foreignTousseAppId 外来器械申请单的id + * @param parentId 父包id + * @return + */ + public Map queryPackedMaterialInstanceCount(String foreignTousseAppId, Long parentId); } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java =================================================================== diff -u -r30934 -r31074 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 30934) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 31074) @@ -24,6 +24,7 @@ import net.sf.json.JsonConfig; import net.sf.json.util.PropertyFilter; +import org.apache.commons.collections.MapUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.StringEscapeUtils; @@ -42,7 +43,6 @@ import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; -import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.SplitForeignTousseName; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.materialerrordamage.MaterialErrorDamageDetail; @@ -477,6 +477,27 @@ if (packTask != null) { TousseDefinition td = packTask.getTousseDefinition(); array = tousseDefinitionManager.getMaterialsOfTousseDefinition(td); + Map packedMaterialInstanceCountMap = null; + if(td.isForeignTousse() && CollectionUtils.isNotEmpty(array)){ + //扣减已部分拆包装配的外来器械材料 + packedMaterialInstanceCountMap = tousseInstanceManager.queryPackedMaterialInstanceCount(packTask.getId(), td.getId()); + if(MapUtils.isNotEmpty(packedMaterialInstanceCountMap)){ + Iterator it = array.iterator(); + while(it.hasNext()){ + JSONObject material = it.next(); + Long materialId = material.optLong("materialId"); + if(packedMaterialInstanceCountMap.containsKey(materialId)){ + int unPackCount = material.optInt("materialAmount") - packedMaterialInstanceCountMap.get(materialId); + if(unPackCount <= 0){ + it.remove(); + }else{ + material.put("splitAmount", unPackCount); + material.put("materialAmount", unPackCount); + } + } + } + } + } } }else{ String applicationId = StrutsParamUtils.getPraramValue("applicationId", ""); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java =================================================================== diff -u -r30837 -r31074 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java (.../ForeignTousseApplicationTableManager.java) (revision 30837) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/dwr/table/ForeignTousseApplicationTableManager.java (.../ForeignTousseApplicationTableManager.java) (revision 31074) @@ -2,6 +2,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -23,6 +24,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.foreigntousseapplication.service.ForeignTousseApplicationManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.vo.SplitForeignTousseVo; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; @@ -217,15 +219,16 @@ * @param tousseDefinitionId * @return */ - public String findForeignTousseAndApplicationInfo(String foreignTousseAppID, Long tousseDefinitionId) { + public String findForeignTousseAndApplicationInfo(String foreignTousseAppID, Long tousseDefinitionId, Long packingTaskIdForSplitForeignTousse) { if(!DatabaseUtil.isPoIdValid(tousseDefinitionId)){ return findForeignTousseApplication(foreignTousseAppID); } if(!DatabaseUtil.isPoIdValid(foreignTousseAppID)){ return ""; } JSONObject obj = foreignTousseApplicationManager.getMiscInfoById(foreignTousseAppID,tousseDefinitionId); - + Collection vos = tousseInstanceManager.queryPackedTousseInstanceInfo(packingTaskIdForSplitForeignTousse, tousseDefinitionId); + obj.put("packedSplitForeignTousseArr", JSONArray.fromObject(vos));//已经部分拆包装配的外来器械拆分小包信息 return obj.toString(); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/SplitForeignTousseVo.java =================================================================== diff -u --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/SplitForeignTousseVo.java (revision 0) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/vo/SplitForeignTousseVo.java (revision 31074) @@ -0,0 +1,98 @@ +package com.forgon.disinfectsystem.tousse.toussedefinition.vo; +/** + * 外来器械部分拆分装配拆包vo + * @author zc.li 2021/01/14 + * + */ +public class SplitForeignTousseVo { + /** + * 拆分产生的外来器械拆分小包实例id + */ + private Long tousseInstanceId; + /** + * 外来器械拆分小包包名 + */ + private String tousseDefinitionName; + /** + * 是否超大超重包 + */ + private String isBigPackage; + /** + * 包装类型 + */ + private String packageType; + /** + * 灭菌程序 + */ + private String sterilingType; + /** + * 包含的材料信息 + */ + private String containMaterialInfo = ""; + /** + * 植入物数量 + */ + private Integer implantCount = 0; + /** + * 工具数量 + */ + private Integer toolCount = 0; + + public SplitForeignTousseVo(){} + public SplitForeignTousseVo(Long tousseInstanceId, String tousseDefinitionName, String isBigPackage, String packageType, String sterilingType){ + this.tousseInstanceId = tousseInstanceId; + this.tousseDefinitionName = tousseDefinitionName; + this.isBigPackage = isBigPackage; + this.packageType = packageType; + this.sterilingType = sterilingType; + } + public Long getTousseInstanceId() { + return tousseInstanceId; + } + public void setTousseInstanceId(Long tousseInstanceId) { + this.tousseInstanceId = tousseInstanceId; + } + public String getTousseDefinitionName() { + return tousseDefinitionName; + } + public void setTousseDefinitionName(String tousseDefinitionName) { + this.tousseDefinitionName = tousseDefinitionName; + } + public String getIsBigPackage() { + return isBigPackage; + } + public void setIsBigPackage(String isBigPackage) { + this.isBigPackage = isBigPackage; + } + public String getPackageType() { + return packageType; + } + public void setPackageType(String packageType) { + this.packageType = packageType; + } + public String getSterilingType() { + return sterilingType; + } + public void setSterilingType(String sterilingType) { + this.sterilingType = sterilingType; + } + public String getContainMaterialInfo() { + return containMaterialInfo; + } + public void setContainMaterialInfo(String containMaterialInfo) { + this.containMaterialInfo = containMaterialInfo; + } + public Integer getImplantCount() { + return implantCount; + } + public void setImplantCount(Integer implantCount) { + this.implantCount = implantCount; + } + public Integer getToolCount() { + return toolCount; + } + public void setToolCount(Integer toolCount) { + this.toolCount = toolCount; + } + +}