Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java =================================================================== diff -u -r28701 -r29045 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 28701) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 29045) @@ -507,7 +507,7 @@ String type = obj.optString("tousseType"); String count = obj.optString("count"); Integer sequence = JSONUtil.optInteger(obj, "sequence", 0); - if ("器械".equals(type) || MaterialDefinition.TYPE_NAME.equals(type)) { + if ("器械材料".equals(type) || "器械".equals(type) || MaterialDefinition.TYPE_NAME.equals(type)) { MaterialInstance materialInstance = new MaterialInstance(); MaterialDefinition materialDefinition = null; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java =================================================================== diff -u -r27811 -r29045 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 27811) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 29045) @@ -339,6 +339,14 @@ * 包定义id赋值时,包定义的材料数量 */ private Integer materialAmount; + + /** + * 判断是否需要修改装配任务,不保存到数据库(JMSZXYY-89自定义器械包申请单可以修改【是否回收属性】) + * 非自定义器械包申请单保存已经提交的申请单时,如果数量不变,就不会调整装配任务数量; + * 自定义器械包申请单保存已经提交的申请单并且【是否回收】由“是”改为“否”时,需要创建装配任务 + */ + private Boolean modifyPackingTask = false; + public String getSpelling() { return spelling; } @@ -896,7 +904,7 @@ public Integer getUpdateAmount(Boolean thisInvoicePlanIsCommit){ Integer updateAmount = null; //旧申请单已提交、再次提交 - if(thisInvoicePlanIsCommit != null && thisInvoicePlanIsCommit){ + if(thisInvoicePlanIsCommit != null && thisInvoicePlanIsCommit && !this.getModifyPackingTask()){ Integer tmpAmount = this.getAmount(); if(tmpAmount == null){ tmpAmount = 0; @@ -1109,6 +1117,17 @@ this.materialAmount = materialAmount; } + @Transient + public Boolean getModifyPackingTask() { + return modifyPackingTask; + } + + + public void setModifyPackingTask(Boolean modifyPackingTask) { + this.modifyPackingTask = modifyPackingTask; + } + + @Override public String toString() { return "{id:" + id + ", tousseName:'" + tousseName Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/CustomRecyclingApplicationAction.java =================================================================== diff -u -r27331 -r29045 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/CustomRecyclingApplicationAction.java (.../CustomRecyclingApplicationAction.java) (revision 27331) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/CustomRecyclingApplicationAction.java (.../CustomRecyclingApplicationAction.java) (revision 29045) @@ -15,12 +15,14 @@ import net.sf.json.util.CycleDetectionStrategy; import net.sf.json.util.PropertyFilter; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.springframework.beans.BeanUtils; +import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.CssdHandleTousses; import com.forgon.directory.model.OrgUnit; @@ -32,9 +34,12 @@ import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.taskGroup.TaskGroup; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.packing.PackingTask; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousseitem.service.TousseItemManager; @@ -45,6 +50,7 @@ import com.forgon.tools.GB2WB; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; @@ -79,6 +85,8 @@ private OrgUnitManager orgUnitManager; + private PackingManager packingManager; + public void setObjectDao(ObjectDao objectDao) { this.objectDao = objectDao; } @@ -119,11 +127,17 @@ public void setOrgUnitManager(OrgUnitManager orgUnitManager) { this.orgUnitManager = orgUnitManager; } + + public void setPackingManager(PackingManager packingManager) { + this.packingManager = packingManager; + } + /** * 保存自定义申请单 * * @return */ + @SuppressWarnings("unchecked") public String saveCustomRecyclingApplication() { String customTousseInfo = StrutsParamUtils.getPraramValue("customTousseInfo", ""); JSONArray jsonArray = JSONArray.fromObject(customTousseInfo); @@ -165,6 +179,26 @@ recyclingApplication.setSequence(supplyRoomConfigManager.getOrgUnitSequence(recyclingApplication.getDepartCoding())); recyclingApplicationManager.saveOrUpdate(recyclingApplication); } + + // 装配产生的器械包实例,用于判断申请单物品是否已经装配 + Map> idToTousseMap = new HashMap>(); + if(DatabaseUtil.isPoIdValid(recyclingApplication.getId())){ + // 原来的器械包定义【是否回收】为否,现在改成是时,需要检查器械包是否被装配,器械包被装配就不允许修改【是否回收】 + List tousseInstances = objectDao.findBySql( + TousseInstance.class.getSimpleName(), String.format("where invoicePlanID=%s ", recyclingApplication.getId())); + if(CollectionUtils.isNotEmpty(tousseInstances)){ + for (TousseInstance tousseInstance : tousseInstances) { + TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); + List tousseInsatnceList = idToTousseMap.get(tousseDefinition.getId()); + if(CollectionUtils.isEmpty(tousseInsatnceList)){ + tousseInsatnceList = new ArrayList(); + } + tousseInsatnceList.add(tousseInstance); + idToTousseMap.put(tousseDefinition.getId(), tousseInsatnceList); + } + } + } + if (jsonArray != null) { Long appid = recyclingApplication.getId(); List items = new ArrayList(); @@ -181,11 +215,17 @@ price = config.getCustomToussePrice(); } Integer amount = json.getInt("amount"); + String isRecycle = json.optString("isRecycling"); + if(!(StringUtils.equals(isRecycle, TousseDefinition.STR_YES) || StringUtils.equals(isRecycle, TousseDefinition.STR_NO))){ + throw new RuntimeException("【是否回收】必须为“是”或者“否”!"); + } + // 已经提交的申请单,【是否回收】由“是”改为“否”时,装配时需要产生装配任务 + // 非自定义器械包申请单保存已经提交的申请单时,如果数量不变,就不会调整装配任务数量 + Boolean modifyPackingTask = false; String materialsStr = json.getString("materials"); //申请单的包定义id TousseDefinition tousseDefinition = tousseDefinitionManager.getTousseDefinitionByNameTypeAndAPPID(tousseName, TousseDefinition.PACKAGE_TYPE_CUSTOM, appid.toString()); String sql = String.format(" where tousseType='%s' and forDisplay=1 and name='%s' order by id desc", TousseDefinition.PACKAGE_TYPE_CUSTOM,tousseName); - @SuppressWarnings("unchecked") List ustomTDList = objectDao.findBySql(TousseDefinition.class.getSimpleName(), sql); TousseDefinition firstTD = null; if(ustomTDList != null && ustomTDList.size() > 0){ @@ -197,6 +237,11 @@ if(appid == 0 || appid == null){ throw new RuntimeException("申请单id不能为空!"); } + + if(price.isNaN()){ + price = tousseDefinition.getPrice(); + } + tousseDefinition.setPrice(price); tousseDefinition.setDiscountPrice(price); if("是".equals(isImplant)){ @@ -205,12 +250,43 @@ tousseDefinition.setIncludeImplant(TousseDefinition.UNINCLUDE_IMPLANT); } if(firstTD != null){ + boolean isModifyIsRecycle = false; + // 申请单有对应的包定义 ,则比较包定义的【是否回收】属性 + if(DatabaseUtil.isPoIdValid(appid) && DatabaseUtil.isPoIdValid(tousseDefinition.getId())){ + if(!StringUtils.equals(tousseDefinition.getIsRecycling(), isRecycle)){ + isModifyIsRecycle = true; + } + } + if(isModifyIsRecycle){ + // 自定义器械包申请单的状态是“待回收”、“待发货”,以及是否已打印为“否”,并且【是否回收】为否的器械包没有装配时,打开申请单,要求可以修改【是否回收】(JMSZXYY-89) + if((InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE.equals(recyclingApplication.getRecyclingStatus()) || recyclingApplication.getRecyclingStatus() == null) + && (InvoicePlan.DELIVERSTATUS_AWAITDELIVER.equals(recyclingApplication.getDeliverStatus()) || recyclingApplication.getDeliverStatus() == null) + && InvoicePlan.PRINT_STATUS_UNPRINT == recyclingApplication.getPrinted() + && CollectionUtils.isEmpty(idToTousseMap.get(tousseDefinition.getId()))){ + // 1、【是否回收】由“否”改为“是”时,需要删除原来的装配任务 + if(StringUtils.equals(isRecycle,Constants.STR_YES)){ + PackingTask task = packingManager + .getUnfinishedTask(appid, + null, tousseDefinition.getId(), + PackingTask.TASK_APPLICATION); + objectDao.delete(task); + }else{ + // 2、【是否回收】由“是”改为“否”时,需要创建装配任务 + modifyPackingTask = true; + } + }else{ + throw new RuntimeException("不允许修改" + tousseName + "的【是否回收】!"); + } + } + // 修改包定义的【是否回收】 + tousseDefinition.setIsRecycling(isRecycle); List propertiesNotToCopy = new ArrayList(); propertiesNotToCopy.add("id"); propertiesNotToCopy.add("forDisplay"); propertiesNotToCopy.add("materialInstances"); propertiesNotToCopy.add("price"); propertiesNotToCopy.add("includeImplant"); + propertiesNotToCopy.add("isRecycling"); ReflectUtil.copyProperties(firstTD, tousseDefinition, false, propertiesNotToCopy); }else{ tousseDefinition.setPackageType(config.getCtDefaultPackageType()); @@ -230,10 +306,11 @@ if(StringUtils.isNotBlank(isReview)){ tousseDefinition.setIsReview(isReview); } - String isRecycling = config.getCustomTousseNeedRecycle(); + /*String isRecycling = config.getCustomTousseNeedRecycle(); if(StringUtils.isNotBlank(isRecycling)){ tousseDefinition.setIsRecycling(isRecycling); - } + }*/ + tousseDefinition.setIsRecycling(isRecycle); tousseDefinition.setTaskGroup(supplyRoomConfigManager.getCustomTousseDefaultTaskGroup()); tousseDefinition.setWorkLoadStatisticalMethod(TousseDefinition.WORKLOAD_STATISTICAL_METHOD_PACK); if(taskGroup != null){ @@ -285,6 +362,8 @@ tousseItem.setInvoicePlanID(appid); tousseItem.setIsInvoice(tousseDefinition.getIsInvoice()); tousseItem.setEditAmount(amount); + // 已经提交的申请单,【是否回收】由“是”改为“否”时,装配时需要产生装配任务 + tousseItem.setModifyPackingTask(modifyPackingTask); tousseItem.setDiposable("否"); tousseItem.setInvoicePlan(recyclingApplication); tousseItem.setTousseType(TousseDefinition.PACKAGE_TYPE_CUSTOM); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemManagerImpl.java =================================================================== diff -u -r27459 -r29045 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemManagerImpl.java (.../TousseItemManagerImpl.java) (revision 27459) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousseitem/service/TousseItemManagerImpl.java (.../TousseItemManagerImpl.java) (revision 29045) @@ -24,6 +24,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; @@ -250,7 +251,26 @@ InvoicePlan invoicePlan = (InvoicePlan)objectDao.getById(InvoicePlan.class.getSimpleName(), invoicePlanId); JSONObject invoicePlanObj = JSONUtil.toJSONObjectWithInclude(invoicePlan, new String[] { "applicant", "urgency", "applicationTimeStr", "depart", "settleAccountsDepart", - "remark", "recyclingStatus"}); + "remark", "recyclingStatus", "deliverStatus", "printed"}); + // 装配产生的器械包实例,用于判断申请单物品是否已经装配(JMSZXYY-89已经装配的物品不允许修改【是否回收】) + Boolean isPacked = false; + Map> idToTousseMap = new HashMap>(); + @SuppressWarnings("unchecked") + List tousseInstances = objectDao.findBySql( + TousseInstance.class.getSimpleName(), String.format("where invoicePlanID=%s ", invoicePlan.getId())); + if(CollectionUtils.isNotEmpty(tousseInstances)){ + isPacked = true; + for (TousseInstance tousseInstance : tousseInstances) { + TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); + List tousseInsatnceList = idToTousseMap.get(tousseDefinition.getId()); + if(CollectionUtils.isEmpty(tousseInsatnceList)){ + tousseInsatnceList = new ArrayList(); + } + tousseInsatnceList.add(tousseInstance); + idToTousseMap.put(tousseDefinition.getId(), tousseInsatnceList); + } + } + invoicePlanObj.put("isPacked", isPacked); List tousseItemList = invoicePlan.getApplicationItems(); for (int i = 0; i < tousseItemList.size(); i++) { TousseItem ti = tousseItemList.get(i); @@ -264,6 +284,8 @@ } jsonObject.put("isImplant", isImplant); jsonObject.put("materials", materialsJsonArray); + jsonObject.put("isRecycling", td.getIsRecycling()); + jsonObject.put("isPacked", CollectionUtils.isNotEmpty(idToTousseMap.get(td.getId()))); tousseItemsArray.add(jsonObject); } invoicePlanObj.put("applicationItems", tousseItemsArray);