Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManagerImpl.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManagerImpl.java (.../TousseTransitionItemManagerImpl.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManagerImpl.java (.../TousseTransitionItemManagerImpl.java) (revision 17897) @@ -1,7 +1,6 @@ package com.forgon.disinfectsystem.toussetransition.service; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; @@ -15,6 +14,7 @@ import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecord; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; @@ -92,7 +92,7 @@ } @Override - public void save(TousseTransitionRecord record, JSONArray tousseBarcodes,Map map) { + public void save(TousseTransitionRecord record,TousseTransitionRecordItem recordItem,JSONArray tousseBarcodes,Map map) { if(CollectionUtils.isEmpty(tousseBarcodes)){ throw new RuntimeException("器械包条码不能为空"); } @@ -102,7 +102,11 @@ if(map == null){ throw new RuntimeException("未关联申请项"); } - List items = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", record.getTousseTransitionPlanId()); + if(recordItem == null){ + throw new RuntimeException("器械交接记录项不能为空"); + } +// List items = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", +// record.getTousseTransitionPlanId()); for (int i = 0; i < tousseBarcodes.size(); i++) { JSONObject obj = tousseBarcodes.getJSONObject(i); @@ -111,22 +115,25 @@ String tousseName = obj.optString("tousseName"); String idCardInstanceBarcode = obj.optString("idCardInstanceBarcode"); String scanedBarcode = obj.optString("scanedBarcode"); - TousseTransitionItem item = new TousseTransitionItem(); - item.setTousseBarcode(tousseBarcode); + TousseItem ti = map.get(tousseDefineId); if(ti == null){ throw new RuntimeException(String.format("器械包%s未找到申请项", tousseName)); } - TousseTransitionPlanItem planItem = tousseTransitionPlanItemManager.find(items, ti.getId()); - if(planItem == null){ - throw new RuntimeException(String.format("器械交接单不包含%s", tousseName)); - } +// TousseTransitionPlanItem planItem = tousseTransitionPlanItemManager.find(items, ti.getId()); +// if(planItem == null){ +// throw new RuntimeException(String.format("器械交接单不包含%s", tousseName)); +// } + + TousseTransitionItem item = new TousseTransitionItem(); + item.setTousseBarcode(tousseBarcode); item.setTousseItemId(ti.getId()); item.setTousseTransitionRecordId(record.getId()); item.setIdCardInstanceBarcode(idCardInstanceBarcode); item.setScanedBarcode(scanedBarcode); - item.setTousseTransitionPlanItemId(tousseDefineId); - item.setTousseTransitionPlanItemId(planItem.getId()); + item.setTousseTransitionPlanItemId(recordItem.getTousseTransitionPlanItemId()); + item.setTousseTransitionRecordItemId(recordItem.getId()); + save(item); } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManagerImpl.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManagerImpl.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManagerImpl.java (revision 17897) @@ -0,0 +1,53 @@ +package com.forgon.disinfectsystem.toussetransition.service; + +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; + +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; +import com.forgon.tools.hibernate.BasePoManagerImpl; + +public class TousseTransitionRecordItemManagerImpl + extends BasePoManagerImpl + implements TousseTransitionRecordItemManager { + + public TousseTransitionRecordItem build(boolean newAdded, + TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount, Integer scanedAmount, + Integer unscanedAmount, String urgentLevel) { + TousseTransitionRecordItem ttri = new TousseTransitionRecordItem(); + ttri.setAdded(newAdded); + ttri.setRecycleAmount(prepareRecycleAmount); + ttri.setScanedAmount(scanedAmount); + ttri.setTousseTransitionPlanItemId(tousseTransitionPlanItem==null?null:tousseTransitionPlanItem.getId()); + ttri.setUnscanedAmount(unscanedAmount); + ttri.setUrgentLevel(urgentLevel); + return ttri; + } + + @Override + public void save(boolean newAdded, + TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount, Integer scanedAmount, + Integer unscanedAmount, String urgentLevel) throws RuntimeException { + TousseTransitionRecordItem ttri = build(newAdded,tousseTransitionPlanItem,prepareRecycleAmount,scanedAmount, + unscanedAmount,urgentLevel); + save(ttri); + } + + @Override + public TousseTransitionRecordItem find( + List ttris, + Long tousseTransitionPlanItemId) { + return CollectionUtils.find(ttris, new Predicate(){ + @Override + public boolean evaluate(TousseTransitionRecordItem object) { + if(object == null) return false; + if(tousseTransitionPlanItemId == null && object.getTousseTransitionPlanItemId() == null) return true; + if(tousseTransitionPlanItemId != null && tousseTransitionPlanItemId.equals(object.getTousseTransitionPlanItemId())) return true; + return false; + }}); + } +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManagerImpl.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManagerImpl.java (.../TousseTransitionPlanItemManagerImpl.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManagerImpl.java (.../TousseTransitionPlanItemManagerImpl.java) (revision 17897) @@ -1,13 +1,17 @@ package com.forgon.disinfectsystem.toussetransition.service; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlan; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; +import com.forgon.disinfectsystem.entity.useRecord.UseRecordToRecycleApplication; import com.forgon.tools.MathTools; import com.forgon.tools.hibernate.BasePoManagerImpl; @@ -73,4 +77,33 @@ return object != null && tousseItemId.equals(object.getTousseItemId()); }}); } + @Override + public TousseTransitionPlanItem getNotPrerecycledFirst(Long tousseItemId) { + if(tousseItemId == null){ + return null; + } + Map params = new HashMap<>(); +// params.put("recycleAmount", null); + params.put("tousseItemId", tousseItemId); + String condition = "tousseItemId=:tousseItemId and recycleAmount is null"; + List items = getCollection(condition, params); + if(CollectionUtils.isNotEmpty(items)){ + return items.get(0); + }else{ + return getFirst("tousseItemId", tousseItemId.toString()); + } + } + @Override + public TousseTransitionPlanItem get( + UseRecordToRecycleApplication useRecordToRecycleApplication, + TousseItem tousseItem) { + if(tousseItem == null || useRecordToRecycleApplication == null){ + return null; + } + String condition = "tousseItemId=" + tousseItem.getId() + " and tousseTransitionPlanId in (select id from " + + TousseTransitionPlan.class.getSimpleName() + " where invoicePlanId=" + + useRecordToRecycleApplication.getInvoicePlanId() + " and useRecordId=" + + useRecordToRecycleApplication.getUseRecordId() + ")"; + return getFirst(condition); + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/InvoicePlan.java (.../InvoicePlan.java) (revision 17897) @@ -700,6 +700,9 @@ public void setIsPrepareRecycled(Integer isPrepareRecycled) { this.isPrepareRecycled = isPrepareRecycled; } + public boolean prepareRecycled(){ + return SIGNED_TRUE.equals(isPrepareRecycled); + } public String getPrepareRecycleOperator() { return prepareRecycleOperator; Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManager.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManager.java (.../TousseTransitionPlanItemManager.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanItemManager.java (.../TousseTransitionPlanItemManager.java) (revision 17897) @@ -3,8 +3,10 @@ import java.util.Collection; import java.util.List; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlan; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; +import com.forgon.disinfectsystem.entity.useRecord.UseRecordToRecycleApplication; import com.forgon.tools.hibernate.BasePoManager; /** * 器械交接单的明细 @@ -35,4 +37,19 @@ * @return */ public TousseTransitionPlanItem find(Collection items,Long tousseItemId); + /** + * 根据申请项id查找对象,优先查找还没有预回收的对象。如果都已经预回收了,再查找最后一次预回收的 + * @param tousseItemId + * @return + */ + public TousseTransitionPlanItem getNotPrerecycledFirst(Long tousseItemId); + /** + * 在对应的使用记录转申请单中查找某一个申请项对应的交接单明细项 + * @param useRecordToRecycleApplication 使用记录转申请单记录,如果为null,则返回null + * @param tousseItem 申请项,如果为null,返回null + * @return 查找的器械交接单明细项,如果useRecordToRecycleApplication为null 或者 tousseItem为null,返回null + */ + public TousseTransitionPlanItem get( + UseRecordToRecycleApplication useRecordToRecycleApplication, + TousseItem tousseItem); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManagerImpl.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManagerImpl.java (.../UrgentLevelManagerImpl.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManagerImpl.java (.../UrgentLevelManagerImpl.java) (revision 17897) @@ -14,8 +14,15 @@ public class UrgentLevelManagerImpl extends BasePoManagerImpl implements UrgentLevelManager{ - /** + * 获取不加急的那一个对象 + * @return + */ + private UrgentLevel getNotUrgentItem(){ + String condition = " po.urgent='" + Constants.STR_NO + "' and po.enable='" + Constants.STR_YES + "'"; + return getFirst(condition); + } + /** * 添加一个加急级别。如果未设置级别,则设置级别为最大(新添加的级别最大) */ @Override @@ -29,7 +36,13 @@ //名称相同且不是同一个对象,不能保存 throw new RuntimeException(String.format("已经存在名称为%s的加急级别",object.getName())); } - + if(!object.urgent()){ + UrgentLevel notUrgent = getNotUrgentItem(); + if(notUrgent != null && !notUrgent.getId().equals(object.getId())){ + //已经有一个不加急的了,不能再添加不加急 的对象 + throw new RuntimeException(notUrgent.getName() + "已经是不加急的了,不能再设置不加急的级别了"); + } + } UrgentLevel current = object; if(DatabaseUtil.isPoIdValid(object.getId())){ current = getForUpdate(object.getId()); @@ -38,6 +51,7 @@ } current.setEnable(object.getEnable()); current.setName(object.getName()); + current.setUrgent(object.getUrgent()); } if(current.getLevel() == null){ Integer maxlevel = getMaxProperty("level"); @@ -101,5 +115,10 @@ } } } + @Override + public UrgentLevel getByName(String name) { + String condition = "po.name='" + name + "' and po.enable='" + Constants.STR_YES + "'"; + return getFirst(condition); + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionPlanItem.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionPlanItem.java (.../TousseTransitionPlanItem.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionPlanItem.java (.../TousseTransitionPlanItem.java) (revision 17897) @@ -6,6 +6,7 @@ import javax.persistence.Id; import javax.persistence.Table; +import org.apache.commons.lang3.BooleanUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; /** @@ -54,6 +55,10 @@ * 新添加器械包标志 */ private Boolean added; + /** + * 是否已经预回收处理过了 + */ + private Boolean recycled; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { @@ -116,5 +121,13 @@ public void setAdded(Boolean added) { this.added = added; } - + public Boolean getRecycled() { + return recycled; + } + public void setRecycled(Boolean recycled) { + this.recycled = recycled; + } + public boolean recycled(){ + return BooleanUtils.isTrue(recycled); + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 17897) @@ -198,7 +198,7 @@ } public void setUrgentAmount(Integer urgentAmount) { - if(urgentAmount == null){ + if(urgentAmount == null || urgentAmount < 0){ this.urgentAmount = 0; }else{ this.urgentAmount = urgentAmount; Index: ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionModelTestsBase.java =================================================================== diff -u -r17865 -r17897 --- ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionModelTestsBase.java (.../TousseTransitionModelTestsBase.java) (revision 17865) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionModelTestsBase.java (.../TousseTransitionModelTestsBase.java) (revision 17897) @@ -12,12 +12,14 @@ import org.springframework.beans.factory.annotation.Autowired; import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.basedatamanager.urgent.service.UrgentLevelManager; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlan; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; +import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionPlanItemManager; import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionPlanManager; @@ -33,7 +35,30 @@ protected TousseTransitionPlanItemManager tousseTransitionPlanItemManager; @Autowired protected TousseTransitionPlanManager tousseTransitionPlanManager; - + @Autowired + protected UrgentLevelManager urgentLevelManager; + /** + * 准备加急等级的数据 + */ + protected void prepareUrgentLevel(){ + UrgentLevel ul = new UrgentLevel(); + ul.setEnable(com.forgon.Constants.STR_YES); + ul.setName("无"); + ul.setUrgent(com.forgon.Constants.STR_NO); + urgentLevelManager.save(ul); + + UrgentLevel ul1 = new UrgentLevel(); + ul1.setEnable(com.forgon.Constants.STR_YES); + ul1.setName("加急"); + ul1.setUrgent(com.forgon.Constants.STR_YES); + urgentLevelManager.save(ul1); + + UrgentLevel ul2 = new UrgentLevel(); + ul2.setEnable(com.forgon.Constants.STR_YES); + ul2.setName("特急"); + ul2.setUrgent(com.forgon.Constants.STR_YES); + urgentLevelManager.save(ul2); + } protected RecyclingApplication prepareInvoicePlan() { RecyclingApplication ip = new RecyclingApplication(); ip.setDepart(Constants.ORG_UNIT_NAME_WAIKE); @@ -56,17 +81,34 @@ useRecordManager.saveOrUpdate(ur); return ur; } + protected UseRecord prepareUseRecord(String patientName) { + UseRecord ur = new UseRecord(); + ur.setApplicationTime(new Date()); + ur.setDepart(AcegiHelper.getCurrentOrgUnitName()); + ur.setDepartCoding(AcegiHelper.getCurrentOrgUnitCode()); + ur.setEditTime(new Date()); + ur.setEnteringDate(new Date()); + ur.setStatus(UseRecord.STATUS_APPLIED); + ur.setPatientName(patientName); + useRecordManager.saveOrUpdate(ur); + return ur; + } protected TousseItem prepareTousseItem(InvoicePlan ip, Integer amount, Integer urgentAmount) { return prepareTousseItem(ip,amount,urgentAmount,"Test开胸包"); } - protected TousseItem prepareTousseItem(InvoicePlan ip, Integer amount, Integer urgentAmount,String tdName) { + protected TousseItem buildTousseItem(Integer amount, Integer urgentAmount,String tdName){ TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName(tdName); TousseItem ti = new TousseItem(); - ti.setInvoicePlan(ip); ti.setAmount(amount); ti.setUrgentAmount(urgentAmount); ti.setTousseDefinitionId(td.getId()); ti.setTousseType(td.getTousseType()); + ti.setTousseName(td.getName()); + return ti; + } + protected TousseItem prepareTousseItem(InvoicePlan ip, Integer amount, Integer urgentAmount,String tdName) { + TousseItem ti = buildTousseItem(amount,urgentAmount,tdName); + ti.setInvoicePlan(ip); tousseItemManager.save(ti); return ti; } @@ -89,15 +131,9 @@ protected void saveFirst(Set poToDelete, UseRecord ur, InvoicePlan ip, List tis){ - List items = new ArrayList<>(); - for(TousseItem ti : tis){ - List item =prepareTousseTransitionPlanItem(ti.getId(),ti.getAmount(),ti.getUrgentAmount()); - items.addAll(item); - } + saveTousseTransitionPlanAndItems(ur, ip, tis); - tousseTransitionPlanManager.save(ur, ip, items, true); - - List tousseTransitionPlans = tousseTransitionPlanManager.getByProperty("invoicePlanId", ip.getId()); + List tousseTransitionPlans = tousseTransitionPlanManager.getByProperty("useRecordId", ur.getId()); poToDelete.addAll(tousseTransitionPlans); assertEquals(tousseTransitionPlans.size(),1); TousseTransitionPlan tousseTransitionPlan = tousseTransitionPlans.get(0); @@ -107,7 +143,7 @@ assertEquals(tousseTransitionPlan.getHandleDepart(), Constants.ORG_UNIT_NAME_CSSD); assertEquals(tousseTransitionPlan.getHandleDepartCode(), Constants.ORG_UNIT_CODE_CSSD); assertEquals(tousseTransitionPlan.getStatus(), TousseTransitionPlan.STATUS_WAIT_TRANSITION); - assertEquals(tousseTransitionPlan.getUseRecordId(),ur.getId()); + assertEquals(tousseTransitionPlan.getInvoicePlanId(),ip.getId()); List tItems =tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan.getId()); poToDelete.addAll(tItems); @@ -120,6 +156,16 @@ } } + protected void saveTousseTransitionPlanAndItems(UseRecord ur, InvoicePlan ip, + List tis) { + List items = new ArrayList<>(); + for(TousseItem ti : tis){ + List item =prepareTousseTransitionPlanItem(ti.getId(),ti.getAmount(),ti.getUrgentAmount()); + items.addAll(item); + } + + tousseTransitionPlanManager.save(ur, ip, items, true); + } protected void saveFirst(Set poToDelete, UseRecord ur, InvoicePlan ip, TousseItem ti) { List tis = new ArrayList<>(); Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelForm.js =================================================================== diff -u -r17849 -r17897 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelForm.js (.../urgentLevelForm.js) (revision 17849) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelForm.js (.../urgentLevelForm.js) (revision 17897) @@ -23,7 +23,7 @@ id : 'id', name : 'id' },{ - columnWidth : 0.5, + columnWidth : 0.33, layout : 'form', labelWidth:60, items : [{ @@ -35,11 +35,36 @@ anchor : '95%' }] },{ - columnWidth : 0.5, + columnWidth : 0.33, layout : 'form', labelWidth:60, items : [{ xtype : 'combo', + fieldLabel : "是否加急", + id : 'urgent', + name : 'urgent', + minChars : 0, + valueField : 'value', + displayField : 'value', + value:'是', + mode : 'local', + store : enableStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : false, + typeAhead : false, + selectOnFocus :true, + allowBlank : false, + editable:false, + width : 80 + }] + },{ + columnWidth : 0.33, + layout : 'form', + labelWidth:60, + items : [{ + xtype : 'combo', fieldLabel : "是否启用", id : 'enable', name : 'enable', @@ -76,7 +101,7 @@ id : 'urgentLevelWin', layout : 'fit', title : '加急级别信息', - width : 450, + width : 600, border : false, modal : true, autoHeight : true, @@ -92,6 +117,7 @@ success : function(form, action) { top.Ext.getCmp('name').setValue(action.result.data.name); top.Ext.getCmp('enable').setValue(action.result.data.enable); + top.Ext.getCmp('urgent').setValue(action.result.data.urgent); }, failure : function(form, action) { showResult("加载失败"); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/action/UrgentLevelAction.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/action/UrgentLevelAction.java (.../UrgentLevelAction.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/action/UrgentLevelAction.java (.../UrgentLevelAction.java) (revision 17897) @@ -70,6 +70,7 @@ json.put("enable", ul.getEnable()); json.put("level", ul.getLevel()); json.put("name", ul.getName()); + json.put("urgent", ul.getUrgent()); array.add(json); } StrutsResponseUtils.output(array); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerTests.java =================================================================== diff -u -r17865 -r17897 --- ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerTests.java (.../TousseTransitionRecordManagerTests.java) (revision 17865) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerTests.java (.../TousseTransitionRecordManagerTests.java) (revision 17897) @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -12,17 +13,21 @@ import org.springframework.test.annotation.Rollback; import org.testng.annotations.Test; +import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.idcardinstance.IDCardInstance; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlan; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecord; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.entity.useRecord.UseRecordToRecycleApplication; import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionItemManager; +import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionRecordItemManager; import com.forgon.disinfectsystem.toussetransition.service.TousseTransitionRecordManager; import com.forgon.serialnumber.model.SerialNum; @@ -32,138 +37,156 @@ @Autowired private TousseTransitionRecordManager tousseTransitionRecordManager; @Autowired + private TousseTransitionRecordItemManager tousseTransitionRecordItemManager; + @Autowired private TousseTransitionItemManager tousseTransitionItemManager; /** - * 测试保存交接记录 + * 测试保存交接记录。在预回收的时候,添加新的器械包,预回收修改加急等级,tousseItem里面加急数量修改.然后再次合并申请单及预回收单并再预次预回收操作 + * 预回收前:申请单 Test开胸包 2个 加急0个 + * Test开口包 3个 加急1个 + * + * 预回收单 Test开胸包 2个 加急0个 预回收数量null 扫描数量null 未扫数量null 加急等级null + * Test开口包 3个 加急1个 预回收数量null 扫描数量null 未扫数量null 加急等级null + * + * 预回收提交参数 Test开胸包 预回收2个 扫描条码1个 未扫描1个 加急 + * Test开口包 预回收2个 扫描条码0个 未扫描2个 无 + * Test开颅包 预回收2个 扫描条码0个 未扫描2个 无 + * + * 预回收后 申请单 Test开胸包 2个 加急2个 预回收2个 扫描条码1个 未扫描1个 加急 + * Test开口包 3个 加急0个 预回收2个 扫描条码0个 未扫描2个 无 + * Test开颅包 0个 加急0个 预回收2个 扫描条码0个 未扫描2个 无 + * + * 预回收单 Test开胸包 2个 加急0个 预回收数量2个 扫描数量1个 未扫数量1个 加急等级加急 + * Test开口包 3个 加急1个 预回收数量2个 扫描数量0个 未扫数量2个 加急等级无 + * + * 预回收记录 Test开胸包 预回收2个 扫描条码1个 未扫描1个 加急 + * Test开口包 预回收2个 扫描条码0个 未扫描2个 无 + * Test开颅包 预回收2个 扫描条码0个 未扫描2个 无 + * + * 预回收条码 Test开胸包 tousseBarcode xxxxxxxxx(条码) + * + * 再次转换申请单添加 Test穿刺包 3个 加急1个 + * Test开胸包 2个 加急2个 + * + * 生成预回收单 Test穿刺包 3个 加急1个 预回收数量null 扫描数量null 未扫数量null 加急等级null + * Test开胸包 2个 加急2个 预回收数量null 扫描数量null 未扫数量null 加急等级null + * + * 回收前申请单 Test开胸包 4个 加急4个 预回收2个 扫描条码1个 未扫描1个 加急 + * Test开口包 3个 加急0个 预回收2个 扫描条码0个 未扫描2个 无 + * Test开颅包 0个 加急0个 预回收2个 扫描条码0个 未扫描2个 无 + * Test穿刺包 3个 加急1个 预回收数量null 扫描数量null 未扫数量null 加急等级null + * + * 预回收提交参数 Test开口包 预回收1个 扫描条码0个 未扫描1个 加急 + * Test开胸包 预回收2个 扫描条码2个(1个包条码,一个标识牌条码) 未扫0个 加急 + * Test穿刺包 预回收0个 扫描条码0个 未扫描0个 加急 + * + * 再次预回收后 申请单 Test开胸包 4个 加急4个 预回收4个 扫描条码3个 未扫描1个 加急 + * Test开口包 3个 加急1个 预回收3个 扫描条码0个 未扫描3个 加急 + * Test开颅包 0个 加急0个 预回收2个 扫描条码0个 未扫描2个 无 + * Test穿刺包 3个 加急0个 预回收0个 扫描数量0个 未扫数量个 加急 + * + * 预回收单 Test穿刺包 3个 加急1个 预回收数量0 扫描数量0 未扫数量0 加急等级加急 + * Test开胸包 2个 加急2个 预回收数量2 扫描数量2 未扫数量0 加急等级加急 + * + * 预回收记录 Test开口包 预回收1个 扫描条码0个 未扫描1个 加急 + * Test开胸包 预回收2个 扫描条码2个(1个包条码,一个标识牌条码) 未扫0个 加急 + * Test穿刺包 预回收0个 扫描条码0个 未扫描0个 加急 + * + * 预回收条码 Test开胸包 tousseBarcode xxxxxxxxx(条码) + * Test开胸包 idCardBarcode xxxxxxxxx(条码) */ @Test @Rollback(false) - public void testSave(){ + public void testSaveWithAddNewAndChangeUrgent(){ + prepareUrgentLevel(); + //---1、准备使用记录转换申请单后的数据,其中申请单中,Test开胸包2个,加急0个,Test开中包3个,加急1个 Set poToDelete = new HashSet<>(); UseRecord ur = prepareUseRecord(); poToDelete.add(ur); RecyclingApplication ip = prepareInvoicePlan(); - UseRecordToRecycleApplication urtra = new UseRecordToRecycleApplication(); - urtra.setInvoicePlanId(ip.getId()); - urtra.setUseRecordId(ur.getId()); - objectDao.saveOrUpdate(urtra); + useRecordConverRecyclingApplication(ur, ip); ip.setUseRecord(ur); poToDelete.add(ip); TousseInstance ti = prepareTousseInstance(ur,poToDelete); List tis = new ArrayList<>(); - tis.add(prepareTousseItem(ip, 2, 0)); + tis.add(prepareTousseItem(ip, 2, 0,"Test开胸包")); tis.add(prepareTousseItem(ip, 3, 1,"Test开口包")); ip.setApplicationItems(tis); invoicePlanManager.save(ip); saveFirst(poToDelete, ur, ip, tis); + //断言第一个申请项,这个时候,加急等级为null + assertTousseItem(tis.get(0), null, null,null,null,0); + assertTousseItem(tis.get(1), null, null,null,null,1); + //2、开始准备预回收数据 TousseTransitionPlan tousseTransitionPlan = tousseTransitionPlanManager.getFirst("invoicePlanId", ip.getId().toString()); List pItems = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan.getId().toString()); - JSONObject params = new JSONObject(); + JSONArray itemArray = new JSONArray(); TousseTransitionPlanItem pItem = tousseTransitionPlanItemManager.find(pItems, tis.get(0).getId()); - //开胸包 + //2.1 开胸包预回收2个,其中扫描条码1个,未扫条码1个,为加急 JSONObject item = buildPrepareItemParam(pItem,2,1,"加急"); + //2.1.1 准备扫描的器械包条码。开胸包实例1个 + JSONArray tousseBarcodeArray = new JSONArray(); + JSONObject tousseBarcode = buildTousseBarcode(ti,ip.getId()); + + tousseBarcodeArray.add(tousseBarcode); + item.put("tousseBarcodes", tousseBarcodeArray); itemArray.add(item); pItem = tousseTransitionPlanItemManager.find(pItems, tis.get(1).getId()); - //开口包 + //2.2 开口包预回收2个,扫描条码0个,未扫条码2个,加急等级为无 item = buildPrepareItemParam(pItem,2,0,"无"); itemArray.add(item); - //添加一个 Test开颅包 + //2.3 添加一个 Test开颅包,预回收单是没有的 TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); item = buildPrepareItemParam(td,2,0,"无"); itemArray.add(item); + + //保存交接记录 + saveTousseTransitionRecord(tousseTransitionPlan, itemArray); -// item.put("", 1); - - JSONArray tousseBarcodeArray = new JSONArray(); - JSONObject tousseBarcode = buildTousseBarcode(ti,ip.getId()); - tousseBarcode.put("tousseDefineId", tousseBarcode.optLong("tousseDefinitionId")); - tousseBarcode.put("tousseBarcode", tousseBarcode.optString("barcode")); - tousseBarcodeArray.add(tousseBarcode); - - params.put("tousseItems", itemArray); - params.put("app_id", tousseTransitionPlan.getId()); - params.put("comfirmor", "admin全名"); - params.put("comfirmorCode", "admin"); - params.put("operatorCode", "orUser"); - params.put("operator", "or护士"); - params.put("tousseBarcodes", tousseBarcodeArray); - - tousseTransitionRecordManager.save(params); - List records = tousseTransitionRecordManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan.getId()); assertNotNull(records); assertEquals(records.size(), 1); + List ttris = tousseTransitionRecordItemManager.getByProperty("tousseTransitionRecordId", records.get(0).getId()); + assertNotNull(ttris); + assertEquals(ttris.size(), 3); + List planItems = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan.getId()); poToDelete.addAll(planItems); assertNotNull(planItems); - assertEquals(planItems.size(), 3); - TousseTransitionPlanItem barcodePlanItem = null; - for(int index = 0; index <= tis.size()-1;++index){ - TousseItem tousseItem = tis.get(index); - TousseTransitionPlanItem planItem = tousseTransitionPlanItemManager.find(planItems, tousseItem.getId()); - assertEquals(planItem.getAmount(), tousseItem.getAmount()); - Integer scanedAmount = 0; - Integer prepareRecycleAmount = 0; - Integer unscanedAmount = 0; - String urgentLevel; - if(index == 0){ - barcodePlanItem = planItem; - scanedAmount = 1; //第一个开胸包,有扫描一个条码 - unscanedAmount = 1; - prepareRecycleAmount = 2; - urgentLevel = "加急"; - }else{ - scanedAmount = 0; //第二个是开口包,没有扫描条码 - unscanedAmount = 2; - prepareRecycleAmount = 2; - urgentLevel = "无"; - } - assertEquals(planItem.getScanedAmount(), scanedAmount); - assertEquals(planItem.getUnscanedAmount(), unscanedAmount); - assertEquals(planItem.getRecycleAmount(), prepareRecycleAmount); - assertEquals(planItem.getUrgentLevel(), urgentLevel); - - assertEquals(tousseItem.getScanedAmount(), scanedAmount); - assertEquals(tousseItem.getUnscanedAmount(), unscanedAmount); - assertEquals(tousseItem.getPrepareRecycleAmount(), prepareRecycleAmount); - assertEquals(tousseItem.getUrgentLevel(), urgentLevel); - } - //新添加的 Test开颅包 - int newCount = 0; - for(TousseTransitionPlanItem newItem : planItems){ - if(newItem.getAdded() != null && newItem.getAdded()){ - newCount++; - assertEquals(newItem.getScanedAmount(), new Integer(0)); - assertEquals(newItem.getUnscanedAmount(), new Integer(2)); - assertEquals(newItem.getRecycleAmount(), new Integer(2)); - assertEquals(newItem.getUrgentLevel(), "无"); - } - } - assertEquals(newCount,1); + assertEquals(planItems.size(), 2); + //断言第一个申请项的内容(Test开胸包) + assertTousseItem(tis.get(0), 1, 2,1,"加急",2); + TousseTransitionPlanItem planItem1 = tousseTransitionPlanItemManager.find(planItems, tis.get(0).getId()); + assertEquals(planItem1.getAmount().intValue(),2); + TousseTransitionPlanItem barcodePlanItem = planItem1; + assertTousseTransitionPlanItem(planItem1, 1, 2, 1, "加急",2); + TousseTransitionRecordItem ttri = tousseTransitionRecordItemManager.find(ttris,planItem1.getId()); + assertTousseTransitionRecordItem(ttri,2,1,1,"加急"); + //断言第二个申请项的内容(Test开口包) + assertTousseItem(tis.get(1), 0, 2,2,"无",0); + TousseTransitionPlanItem planItem2 = tousseTransitionPlanItemManager.find(planItems, tis.get(1).getId()); + assertEquals(planItem2.getAmount().intValue(),3); + assertTousseTransitionPlanItem(planItem2, 0, 2, 2, "无",0); - //加上新添加的,应该是三个.运行中发现会出现4个,其他后面两个是相同的,同一个id的tousseItem,hashCode也是一样的 - ip = recyclingApplicationManager.getRecyclingApplicationById(ip.getId().toString()); - Set appItems = new HashSet<>(); - appItems.addAll(ip.getApplicationItems()); - assertEquals(appItems.size(),3); - TousseItem newTousseItem = null; - for(TousseItem ttItem : appItems){ - if(ttItem.getTousseDefinitionId().equals(td.getId())){ - newTousseItem = ttItem; - } - } - assertEquals(newTousseItem.getScanedAmount(), new Integer(0)); - assertEquals(newTousseItem.getUnscanedAmount(), new Integer(2)); - assertEquals(newTousseItem.getPrepareRecycleAmount(), new Integer(2)); - assertEquals(newTousseItem.getUrgentLevel(), "无"); + TousseTransitionRecordItem ttri2 = tousseTransitionRecordItemManager.find(ttris,planItem2.getId()); + assertTousseTransitionRecordItem(ttri2,2,0,2,"无"); + //新添加的 Test开颅包,交接计划因为不存在,所以id为null + TousseTransitionRecordItem ttri3 = tousseTransitionRecordItemManager.find(ttris,null); + assertTousseTransitionRecordItem(ttri3,2,0,2,"无"); + + Set appItems = assertApplicationItems(ip,3); + TousseItem newTousseItem = appItems.stream().filter(p->p.getTousseDefinitionId().equals(td.getId())).collect(Collectors.toList()).get(0); + assertTousseItem(newTousseItem, 0, 2, 2, "无", 0); + List ttItems = tousseTransitionItemManager.getByProperty("tousseTransitionRecordId", records.get(0).getId()); poToDelete.addAll(ttItems); assertNotNull(ttItems); @@ -176,8 +199,208 @@ assertEquals(ttItem.getTousseTransitionRecordId(), records.get(0).getId()); assertEquals(ttItem.getTousseTransitionPlanItemId(), barcodePlanItem.getId()); -// clean(poToDelete); + //开始第二次操作 + TousseItem dbTtousseItem_开胸包 = tousseItemManager.find(ip.getApplicationItems(), td_开胸包.getId()); + //1 申请单中添加新的包及修改数量 + TousseItem tousseItem_穿刺包 = buildTousseItem(3, 1,"Test穿刺包"); + TousseItem tousseItem_开胸包 = buildTousseItem(2, 2,"Test开胸包"); + //1.1 开胸包添加2个申请数量,加急添加2个 + dbTtousseItem_开胸包.setAmount(dbTtousseItem_开胸包.getAmount() + 2); + dbTtousseItem_开胸包.setUrgentAmount(dbTtousseItem_开胸包.getUrgentAmount() + 2); + tousseItemManager.save(dbTtousseItem_开胸包); + objectDao.flush(); + tousseItem_开胸包.setId(dbTtousseItem_开胸包.getId()); + //1.2 添加穿刺包到申请单 + tousseItem_穿刺包.setInvoicePlan(ip); + ip.getApplicationItems().add(tousseItem_穿刺包); + tousseItemManager.save(tousseItem_穿刺包); + invoicePlanManager.save(ip); + + + List tis2 = new ArrayList<>(); + tis2.add(tousseItem_开胸包); + tis2.add(tousseItem_穿刺包); + + UseRecord ur2 = prepareUseRecord("李四"); + useRecordConverRecyclingApplication(ur2, ip); + saveFirst(poToDelete, ur2, ip, tis2); + + //2、开始准备预回收数据 + TousseTransitionPlan tousseTransitionPlan2 = tousseTransitionPlanManager.getFirst("useRecordId", ur2.getId().toString()); + List pItems2 = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan2.getId().toString()); + + + JSONArray itemArray2 = new JSONArray(); + + + //2.1 开胸包预回收2个,其中扫描条码2个,未扫条码0个,为加急 + TousseTransitionPlanItem pItem2 = tousseTransitionPlanItemManager.find(pItems2, tis.get(0).getId()); + JSONObject item2 = buildPrepareItemParam(pItem2,2,2,"加急"); + //2.1.1 准备扫描的器械包条码。开胸包实例1个 + TousseInstance ti2 = prepareTousseInstance(ur2,poToDelete); + TousseInstance ti3 = prepareTousseInstance(ur2,poToDelete); + + JSONArray tousseBarcodeArray2 = new JSONArray(); + JSONObject tousseBarcode2 = buildTousseBarcode(ti2,ip.getId()); + JSONObject tousseBarcode3 = buildTousseBarcode(ti3.getIdCardInstanceBarcode(),ip.getId()); + + tousseBarcodeArray2.add(tousseBarcode2); + tousseBarcodeArray2.add(tousseBarcode3); + + item2.put("tousseBarcodes", tousseBarcodeArray2); + itemArray2.add(item2); + + pItem2 = tousseTransitionPlanItemManager.find(pItems2, tis2.get(1).getId()); + //2.2 开口包预回收2个,扫描条码0个,未扫条码2个,加急等级为无 + item2 = buildPrepareItemParam(pItem2,0,0,"加急"); + itemArray2.add(item2); + //2.3 添加一个 Test开颅包,预回收单是没有的 + TousseDefinition td_开口包 = tousseDefinitionManager.getTousseDefinitionByName("Test开口包"); + item2 = buildPrepareItemParam(td_开口包,1,0,"加急"); + itemArray2.add(item2); + + //保存交接记录 + saveTousseTransitionRecord(tousseTransitionPlan2, itemArray2); + + List records2 = tousseTransitionRecordManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan2.getId()); + assertNotNull(records2); + assertEquals(records2.size(), 1); + + List ttris2 = tousseTransitionRecordItemManager.getByProperty("tousseTransitionRecordId", records2.get(0).getId()); + assertNotNull(ttris2); + assertEquals(ttris2.size(), 3); + + List planItems2 = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan2.getId()); + poToDelete.addAll(planItems2); + assertNotNull(planItems2); + assertEquals(planItems2.size(), 2); + //断言第一个申请项的内容(Test开胸包) + assertTousseItem(tousseItemManager.get(tis.get(0).getId()), 3, 4,1,"加急",4); + TousseTransitionPlanItem planItem21 = tousseTransitionPlanItemManager.find(planItems2, tis.get(0).getId()); + assertEquals(planItem21.getAmount().intValue(),2); + TousseTransitionPlanItem barcodePlanItem2 = planItem21; + assertTousseTransitionPlanItem(planItem21, 2, 2, 0, "加急",2); + TousseTransitionRecordItem ttri20 = tousseTransitionRecordItemManager.find(ttris2,planItem21.getId()); + assertTousseTransitionRecordItem(ttri20,2,2,0,"加急"); + + //断言第二个申请项的内容(Test穿刺包) + assertTousseItem(tis2.get(1), 0, 0,0,"加急",0); + TousseTransitionPlanItem planItem22 = tousseTransitionPlanItemManager.find(planItems2, tis2.get(1).getId()); + assertEquals(planItem22.getAmount().intValue(),3); + assertTousseTransitionPlanItem(planItem22, 0, 0, 0, "加急",0); + + TousseTransitionRecordItem ttri22 = tousseTransitionRecordItemManager.find(ttris2,planItem22.getId()); + assertTousseTransitionRecordItem(ttri22,0,0,0,"加急"); + + //新添加的 Test开口包,交接计划取上一张单的 + TousseTransitionRecordItem ttri23 = tousseTransitionRecordItemManager.find(ttris2,planItem2.getId()); //上一张单的交接计划项 + assertTousseTransitionRecordItem(ttri23,1,0,1,"加急"); + + Set appItems2 = assertApplicationItems(ip,4); + TousseItem newTousseItem2 = appItems2.stream().filter(p->p.getTousseDefinitionId().equals(td_开口包.getId())).collect(Collectors.toList()).get(0); + assertTousseItem(newTousseItem2, 0, 3, 3, "加急", 1); + + List ttItems2 = tousseTransitionItemManager.getByProperty("tousseTransitionRecordId", records2.get(0).getId()); + poToDelete.addAll(ttItems2); + assertNotNull(ttItems2); + assertEquals(ttItems2.size(), 2); + + TousseTransitionItem ttItem21 = ttItems2.get(0); + assertEquals(ttItem21.getScanedBarcode(),ti2.getBarcode()); + assertEquals(ttItem21.getTousseBarcode(), ti2.getBarcode()); + assertEquals(ttItem21.getTousseItemId(), tis.get(0).getId()); + assertEquals(ttItem21.getTousseTransitionRecordId(), records2.get(0).getId()); + assertEquals(ttItem21.getTousseTransitionPlanItemId(), barcodePlanItem2.getId()); + + TousseTransitionItem ttItem22 = ttItems2.get(1); + assertEquals(ttItem22.getScanedBarcode(),ti3.getIdCardInstanceBarcode()); + assertEquals(ttItem22.getTousseBarcode(), ti3.getBarcode()); + assertEquals(ttItem22.getTousseItemId(), tis.get(0).getId()); + assertEquals(ttItem22.getTousseTransitionRecordId(), records2.get(0).getId()); + assertEquals(ttItem22.getTousseTransitionPlanItemId(), barcodePlanItem2.getId()); + assertEquals(ttItem22.getIdCardInstanceBarcode(), ti3.getIdCardInstanceBarcode()); + + clean(poToDelete); } + + private void saveTousseTransitionRecord( + TousseTransitionPlan tousseTransitionPlan, JSONArray itemArray) { + JSONObject params = new JSONObject(); + params.put("tousseItems", itemArray); + params.put("app_id", tousseTransitionPlan.getId()); + params.put("comfirmor", "admin全名"); + params.put("comfirmorCode", "admin"); + params.put("operatorCode", "orUser"); + params.put("operator", "or护士"); + + tousseTransitionRecordManager.save(params); + } + + /** + * 断言清洗交接记录项 + * @param tousseTransitionRecordItem + * @param recycleAmount + * @param scanedAmount + * @param unscanedAmount + * @param urgentLevel + */ + private void assertTousseTransitionRecordItem( + TousseTransitionRecordItem tousseTransitionRecordItem, Integer recycleAmount, + Integer scanedAmount, Integer unscanedAmount, String urgentLevel) { + assertEquals(tousseTransitionRecordItem.getRecycleAmount(), recycleAmount); + assertEquals(tousseTransitionRecordItem.getScanedAmount(), scanedAmount); + assertEquals(tousseTransitionRecordItem.getUnscanedAmount(), unscanedAmount); + assertEquals(tousseTransitionRecordItem.getUrgentLevel(),urgentLevel); + } + private Set assertApplicationItems(RecyclingApplication ip,int size) { + //applicationItems中会出现有两个申请项是完全相同的情况,hashCode也一样 + Set appItems = new HashSet<>(); + appItems.addAll(ip.getApplicationItems()); + assertEquals(appItems.size(),size); + return appItems; + } + /** + * 断言器械交接单的项的信息 + * @param planItem + * @param scanedAmount + * @param prepareRecycleAmount + * @param unscanedAmount + * @param urgentLevel + * @param urgentAmount + */ + private void assertTousseTransitionPlanItem( + TousseTransitionPlanItem planItem, Integer scanedAmount, + Integer prepareRecycleAmount, Integer unscanedAmount, + String urgentLevel,Integer urgentAmount) { + assertEquals(planItem.getScanedAmount(), scanedAmount); + assertEquals(planItem.getUnscanedAmount(), unscanedAmount); + assertEquals(planItem.getRecycleAmount(), prepareRecycleAmount); + assertEquals(planItem.getUrgentLevel(), urgentLevel); + } + /** + * 断言申请项中的内容 + * @param tousseItem + * @param scanedAmount + * @param prepareRecycleAmount + * @param unscanedAmount + * @param urgentLevel + */ + private void assertTousseItem(TousseItem tousseItem, Integer scanedAmount, + Integer prepareRecycleAmount, Integer unscanedAmount, + String urgentLevel,Integer urgentAmount) { + assertEquals(tousseItem.getScanedAmount(), scanedAmount); + assertEquals(tousseItem.getUnscanedAmount(), unscanedAmount); + assertEquals(tousseItem.getPrepareRecycleAmount(), prepareRecycleAmount); + assertEquals(tousseItem.getUrgentLevel(), urgentLevel); + assertEquals(tousseItem.getUrgentAmount(), urgentAmount); + } + private void useRecordConverRecyclingApplication(UseRecord ur, + RecyclingApplication ip) { + UseRecordToRecycleApplication urtra = new UseRecordToRecycleApplication(); + urtra.setInvoicePlanId(ip.getId()); + urtra.setUseRecordId(ur.getId()); + objectDao.saveOrUpdate(urtra); + } private JSONObject buildPrepareItemParam(TousseTransitionPlanItem pItem,int prepareRecycleAmount,int scanedAmount,String urgentLevel) { JSONObject item = new JSONObject(); item.put("id", pItem.getId()); @@ -190,25 +413,58 @@ private JSONObject buildPrepareItemParam(TousseDefinition td,int prepareRecycleAmount,int scanedAmount,String urgentLevel){ JSONObject item = new JSONObject(); item.put("td_id", td.getId()); - item.put("prepareRecycleAmount", 2); - item.put("scanedAmount", 0); - item.put("unscanedAmount", 2); - item.put("urgentLevel", "无"); + item.put("prepareRecycleAmount", prepareRecycleAmount); + item.put("scanedAmount", scanedAmount); + item.put("unscanedAmount", prepareRecycleAmount - scanedAmount); + item.put("urgentLevel", urgentLevel); return item; } private TousseInstance prepareTousseInstance(UseRecord ur,Set poToDelete){ TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + IDCardInstance idCardInstance = new IDCardInstance(); + idCardInstance.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); + TousseInstance ti = new TousseInstance(); ti.setTousseDefinition(td); ti.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); ti.setStatus(TousseInstance.STATUS_USED); ti.setUseRecord_id(ur.getId()); + ti.setIdCardInstanceBarcode(idCardInstance.getBarcode()); tousseInstanceManager.save(ti); + idCardInstance.setLastTousseInstanceId(ti.getId()); + objectDao.saveOrUpdate(idCardInstance); + poToDelete.add(ti); + poToDelete.add(idCardInstance); return ti; } + /** + * 获取器械包的信息,返回的内容为PDA在预回收时扫描器械包条码返回的内容 + * @param tousseInstance + * @param recyclingApplicationId + * @return + */ private JSONObject buildTousseBarcode(TousseInstance tousseInstance, Long recyclingApplicationId){ - return tousseTransitionRecordManager.getTousseInfo(tousseInstance,recyclingApplicationId); + JSONObject tousseBarcode = tousseTransitionRecordManager.getTousseInfo(tousseInstance,recyclingApplicationId); + tousseBarcode.put("tousseDefineId", tousseBarcode.optLong("tousseDefinitionId")); + tousseBarcode.put("tousseBarcode", tousseBarcode.optString("barcode")); + return tousseBarcode; } + + private JSONObject buildTousseBarcode(IDCardInstance idcardInstance, Long recyclingApplicationId){ + JSONObject tousseBarcode = tousseTransitionRecordManager.getIdCardInfo(idcardInstance,recyclingApplicationId); + tousseBarcode.put("tousseDefineId", tousseBarcode.optLong("tousseDefinitionId")); + tousseBarcode.put("tousseBarcode", tousseBarcode.optString("barcode")); + return tousseBarcode; + } + private JSONObject buildTousseBarcode(String barcode,Long recyclingApplicationId){ + Object o = objectDao.getByProperty(BarcodeDevice.class.getSimpleName(), "barcode", barcode); + if(o instanceof TousseInstance){ + return buildTousseBarcode((TousseInstance)o,recyclingApplicationId); + }else if(o instanceof IDCardInstance) { + return buildTousseBarcode((IDCardInstance) o,recyclingApplicationId); + } + return null; + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManager.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManager.java (.../TousseTransitionRecordManager.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManager.java (.../TousseTransitionRecordManager.java) (revision 17897) @@ -1,6 +1,5 @@ package com.forgon.disinfectsystem.toussetransition.service; -import net.sf.json.JSONArray; import net.sf.json.JSONObject; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; @@ -19,17 +18,17 @@ */ public TousseTransitionRecord getByTousseInstanceBarcode(String barcode); /** - * 保存交接记录 - * @param plan 申请单,为RecyclingApplication对象 - * @param tousseTransitionPlan - * @param tousseBarcodes tousseBarcodes 扫描的条码信息 - * @param comfirmor 交接人 - * @param comfirmorCode 交接人编码 - * @param operator 接收人 - * @param operatorCode 接收人编码 + * 创建交接记录单 + * @param plan 申请单 + * @param tousseTransitionPlan 器械交接单 + * @param comfirmor 临床科室确认人 + * @param comfirmorCode 临床科室确认人登录名 + * @param operator 供应室接收人 + * @param operatorCode 供应室接收人条码 + * @return 创建的交接记录单,还没有持久化,需要再调用save方法持久化到数据库 */ - public void save(InvoicePlan plan,TousseTransitionPlan tousseTransitionPlan,JSONArray tousseBarcodes, String comfirmor, - String comfirmorCode, String operator, String operatorCode); + public TousseTransitionRecord build(InvoicePlan plan,TousseTransitionPlan tousseTransitionPlan, + String comfirmor,String comfirmorCode, String operator, String operatorCode); /** * 保存交接记录。android pda跟pc都调用这个方法 * @param params Index: forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java =================================================================== diff -u -r17849 -r17897 --- forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 17849) +++ forgon-tools/src/main/java/com/forgon/tools/hibernate/ObjectDaoImpl.java (.../ObjectDaoImpl.java) (revision 17897) @@ -176,7 +176,7 @@ continue; } if(entry.getValue() == null){ - sql.replaceAll(":" + entry.getKey(), " is null "); + sql.replaceAll(entry.getKey() + ".*:" + entry.getKey(), entry.getKey() + " is null "); removeKeys.add(entry.getKey()); } } @@ -195,7 +195,7 @@ new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { - Query query = session.createQuery(buildQuerySql(queryString,params)); + Query query = session.createQuery(queryString); for(Map.Entry entry : params.entrySet()){ if(entry.getValue() instanceof Collection){ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionItem.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionItem.java (.../TousseTransitionItem.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionItem.java (.../TousseTransitionItem.java) (revision 17897) @@ -32,6 +32,10 @@ */ private Long tousseTransitionPlanItemId; /** + * 器械交接记录明细 + */ + private Long tousseTransitionRecordItemId; + /** * 器械包条码 */ private String tousseBarcode; @@ -70,6 +74,12 @@ public void setTousseTransitionPlanItemId(Long tousseTransitionPlanItemId) { this.tousseTransitionPlanItemId = tousseTransitionPlanItemId; } + public Long getTousseTransitionRecordItemId() { + return tousseTransitionRecordItemId; + } + public void setTousseTransitionRecordItemId(Long tousseTransitionRecordItemId) { + this.tousseTransitionRecordItemId = tousseTransitionRecordItemId; + } public String getTousseBarcode() { return tousseBarcode; } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerImpl.java =================================================================== diff -u -r17865 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerImpl.java (.../TousseTransitionRecordManagerImpl.java) (revision 17865) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordManagerImpl.java (.../TousseTransitionRecordManagerImpl.java) (revision 17897) @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import com.forgon.Constants; +import com.forgon.disinfectsystem.basedatamanager.urgent.service.UrgentLevelManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; @@ -22,6 +23,8 @@ import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlan; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecord; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; +import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.entity.useRecord.UseRecordToRecycleApplication; import com.forgon.disinfectsystem.recyclingapplication.service.InvoicePlanManager; @@ -50,7 +53,16 @@ private TousseInstanceManager tousseInstanceManager; private TousseTransitionPlanManager tousseTransitionPlanManager; private TousseTransitionPlanItemManager tousseTransitionPlanItemManager; + private UrgentLevelManager urgentLevelManager; + private TousseTransitionRecordItemManager tousseTransitionRecordItemManager; + public void setTousseTransitionRecordItemManager( + TousseTransitionRecordItemManager tousseTransitionRecordItemManager) { + this.tousseTransitionRecordItemManager = tousseTransitionRecordItemManager; + } + public void setUrgentLevelManager(UrgentLevelManager urgentLevelManager) { + this.urgentLevelManager = urgentLevelManager; + } public void setTousseTransitionPlanItemManager( TousseTransitionPlanItemManager tousseTransitionPlanItemManager) { this.tousseTransitionPlanItemManager = tousseTransitionPlanItemManager; @@ -98,14 +110,9 @@ return ttRecord; } @Override - public void save(InvoicePlan plan, - TousseTransitionPlan tousseTransitionPlan, - JSONArray tousseBarcodes, String comfirmor, String comfirmorCode, - String operator, String operatorCode) { -// if(CollectionUtils.isEmpty(tousseBarcodes)){ -// //没有条码,不保存交接记录 -// return; -// } + public TousseTransitionRecord build(InvoicePlan plan, + TousseTransitionPlan tousseTransitionPlan, String comfirmor, + String comfirmorCode, String operator, String operatorCode) { if(tousseTransitionPlan == null){ throw new RuntimeException("器械交接单不能为空"); } @@ -125,31 +132,83 @@ record.setTakeover(operator); record.setTakeoverCode(operatorCode); record.setTransitionTime(new Date()); - save(record); - //器械包条码为空只保存交接记录,没有条码的交接明细。回收数量信息记录在TousseTransitionPlanItem中 - if(CollectionUtils.isNotEmpty(tousseBarcodes)){ - tousseTransitionItemManager.save(record,tousseBarcodes,getTousseDefineIdTousseItemMap(plan.getApplicationItems())); + return record; + } + private void prepareRecycle(InvoicePlan plan,TousseItem tousseItem,TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount,Integer scanedAmount, + Integer unscanedAmount,String urgentLevel){ + if(plan != null && tousseItem != null){ + UrgentLevel ul = urgentLevelManager.getByName(urgentLevel); + Integer newUrgentAmount = prepareRecycleAmount; + //没有找到对应的加急等级,那加急数量还是原来的加急数量 + if(ul != null){ + if(ul.urgent()){ + if(tousseTransitionPlanItem != null){ + if(!tousseTransitionPlanItem.recycled()){ + //还没有预回收过,由于转换申请单的时候,tousseTransitionPlanItem中的加急数量已经被设置到了tousseItem中,所以需要减掉 + newUrgentAmount = MathTools.sub(prepareRecycleAmount, tousseTransitionPlanItem.getUrgentAmount()).intValue(); + } + } + }else{ + //选了加急等级,但是是不加急的 + if(tousseTransitionPlanItem != null){ + if(!tousseTransitionPlanItem.recycled()){ + //还没有预回收过,由于转换申请单的时候,tousseTransitionPlanItem中的加急数量已经被设置到了tousseItem中,所以需要减掉 + newUrgentAmount = MathTools.sub(0, tousseTransitionPlanItem.getUrgentAmount()).intValue(); + }else{ + newUrgentAmount = 0; + } + }else{ + newUrgentAmount = 0; + } + } + }else{ + newUrgentAmount = 0; + } + newUrgentAmount = MathTools.add(tousseItem.getUrgentAmount(), newUrgentAmount).intValue(); + tousseItem.setUrgentAmount(newUrgentAmount); + tousseItem.setPrepareRecycleAmount(MathTools.add( + tousseItem.getPrepareRecycleAmount(), prepareRecycleAmount).intValue()); + tousseItem.setScanedAmount(MathTools.add(tousseItem.getScanedAmount(), scanedAmount).intValue()); + tousseItem.setUnscanedAmount(MathTools.add(tousseItem.getUnscanedAmount(), unscanedAmount).intValue()); + tousseItem.setUrgentLevel(urgentLevel); } } - @Override public void save(JSONObject params) { if(params != null){ JSONArray array = params.optJSONArray("tousseItems"); if(array != null){ - String tousseTransitionPlanId = params.optString("app_id"); - TousseTransitionPlan tousseTransitionPlan = tousseTransitionPlanManager.get(tousseTransitionPlanId); + TousseTransitionPlan tousseTransitionPlan = tousseTransitionPlanManager.get(params.optString("app_id")); if(tousseTransitionPlan == null){ throw new RuntimeException("器械交接单已经被删除"); } - InvoicePlan plan = invoicePlanManager.getForUpdate(tousseTransitionPlan.getInvoicePlanId()); - String tousseTransitionVersion = CssdUtils.getSystemSetConfigByName("tousseTransitionVersion"); - boolean transitionVersion2 = "2".equals(tousseTransitionVersion); + tousseTransitionPlan.setStatus(TousseTransitionPlan.STATUS_TRANSITED); + + InvoicePlan invoicePlan = invoicePlanManager.getForUpdate(tousseTransitionPlan.getInvoicePlanId()); + if(invoicePlan == null){ + throw new RuntimeException("申请单不存在"); + } + + String comfirmor = params.optString("comfirmor"); + String comfirmorCode = params.optString("comfirmorCode"); + String operatorCode = params.optString("operatorCode"); + String operator = params.optString("operator"); + + updateInvoicePlan(invoicePlan, comfirmor, operator); + TousseTransitionRecord tousseTransitionRecord = build(invoicePlan,tousseTransitionPlan,comfirmor,comfirmorCode,operator,operatorCode); + save(tousseTransitionRecord); + for (int i = 0; i < array.size(); i++) { JSONObject obj = array.getJSONObject(i); String id = obj.optString("id"); + Integer prepareRecycleAmount = obj.optInt("prepareRecycleAmount"); + Integer scanedAmount = obj.optInt("scanedAmount"); + Integer unscanedAmount = obj.optInt("unscanedAmount"); + String urgentLevel = obj.optString("urgentLevel"); + JSONArray tousseBarcodes = obj.optJSONArray("tousseBarcodes"); + boolean newAdded = false; //在器械交接界面新添加的器械包 - boolean prepareAmountAdded = false; TousseTransitionPlanItem tousseTransitionPlanItem = null; TousseItem tousseItem = null; if(StringUtils.isNotBlank(id)){ @@ -158,109 +217,134 @@ throw new RuntimeException("器械交接明细项已经被删除"); } tousseItem = tousseItemManager.getForUpdate(tousseTransitionPlanItem.getTousseItemId()); - } - Integer prepareRecycleAmount = obj - .optInt("prepareRecycleAmount"); - Integer scanedAmount = obj - .optInt("scanedAmount"); - Integer unscanedAmount = obj - .optInt("unscanedAmount"); - String urgentLevel = obj.optString("urgentLevel"); - if(tousseItem == null){ + }else{ String td_id = obj.optString("td_id"); - TousseDefinition td = tousseDefinitionManager - .getTousseDefinitionById(td_id); + String tousseTransitionPlanItemId = obj.optString("tousseTransitionPlanItemId"); + tousseTransitionPlanItem = tousseTransitionPlanItemManager.get(tousseTransitionPlanItemId); + TousseDefinition td = tousseDefinitionManager.getTousseDefinitionById(td_id); if (td != null) { - //先在申请单中看是否能找到包定义对应的申请单,如果没有找到,再合建。 + //先在申请单中看是否能找到包定义对应的申请单,如果没有找到,再创建。 //场景:使用记录1转换申请单,有包1和包2,包1已经预回收,包2预回收数量为0 - //这时候,使用记录2转换申请单,合并到之前的申请单中,这时候需要预回收包2,但是在第二张预见回收单上,是没有包2的 - tousseItem = tousseItemManager.find(plan.getApplicationItems(), td.getId()); + //这时候,使用记录2转换申请单,合并到之前的申请单中,这时候需要预回收包2,但是在第二张预回收单上,是没有包2的 + tousseItem = tousseItemManager.find(invoicePlan.getApplicationItems(), td.getId()); if(tousseItem == null){ - tousseItem = new TousseItem(); - if(transitionVersion2){ - tousseItem.setAmount(0); - }else{ - tousseItem.setAmount(prepareRecycleAmount); + newAdded = true; + tousseItem = newTousseItem(invoicePlan, + prepareRecycleAmount, td); + }else{ + if(tousseTransitionPlanItem == null){ + tousseTransitionPlanItem = tousseTransitionPlanItemManager.getNotPrerecycledFirst(tousseItem.getId()); } } - tousseItem.setPrepareRecycleAmount(MathTools.add( - tousseItem.getPrepareRecycleAmount(), prepareRecycleAmount).intValue()); - prepareAmountAdded = true; - String tousseName = td.getName(); + if (td.isDisinfection()) { - recyclingApplicationManager.addDisinfectTousseItem(plan, prepareRecycleAmount, + recyclingApplicationManager.addDisinfectTousseItem(invoicePlan, prepareRecycleAmount, td,tousseItem); + prepareRecycle(invoicePlan,tousseItem,tousseTransitionPlanItem,prepareRecycleAmount,scanedAmount,unscanedAmount,urgentLevel); + updateTousseTransitionPlanItem(tousseTransitionPlanItem, + prepareRecycleAmount, scanedAmount, unscanedAmount, + urgentLevel); + TousseTransitionRecordItem ttri = tousseTransitionRecordItemManager.build(newAdded, tousseTransitionPlanItem, prepareRecycleAmount, + scanedAmount, unscanedAmount, urgentLevel); + ttri.setTousseTransitionRecordId(tousseTransitionRecord.getId()); + tousseTransitionRecordItemManager.save(ttri); + if(CollectionUtils.isNotEmpty(tousseBarcodes)){ + tousseTransitionItemManager.save(tousseTransitionRecord,ttri, + tousseBarcodes,getTousseDefineIdTousseItemMap(invoicePlan.getApplicationItems())); + } continue; } - tousseItem.setTousseName(tousseName); - tousseItem.setTousseType(td.getTousseType()); - tousseItem.setDiposable("否"); - tousseItem.setTousseDefinitionId(td.getId()); - tousseItem.setIsInvoice(td.getIsInvoice()); - tousseItem.setExpressRecycling(td.getExpressRecycling()); - tousseItem.setIsApplyEntireTousse(td.getIsApplyEntireTousse()); - tousseItem.setIsCleanedEntirely(td.getIsCleanedEntirely()); - boolean isThereIDCard = tousseDefinitionManager.isThereIDCard(td); - tousseItem.setIsThereIdentificationCard(isThereIDCard?"是":"否"); - // 器械包取器械包定义中的价格 - double price = td.getPrice(); - // 消毒物品取材料的消毒价格之和 - if (td.isDisinfection()) { - price = tousseDefinitionManager - .getDisinfectGoodsTotalPrice(td); - } - tousseItem.setPrice(price); - tousseItem.setRowPrice(MathTools.mul(price, - prepareRecycleAmount).doubleValue()); - tousseItem.setInvoicePlan(plan); - plan.getApplicationItems().add(tousseItem); - newAdded = true; + + invoicePlan.getApplicationItems().add(tousseItem); + } else { JSONUtil.buildErrorMsgJsonResult("未找到对应的器械包"); } } - if(!prepareAmountAdded){ - tousseItem.setPrepareRecycleAmount(MathTools.add( - tousseItem.getPrepareRecycleAmount(), prepareRecycleAmount).intValue()); - } - tousseItem.setScanedAmount(MathTools.add(tousseItem.getScanedAmount(), scanedAmount).intValue()); - tousseItem.setUnscanedAmount(MathTools.add(tousseItem.getUnscanedAmount(), unscanedAmount).intValue()); - tousseItem.setUrgentLevel(urgentLevel); + prepareRecycle(invoicePlan,tousseItem,tousseTransitionPlanItem,prepareRecycleAmount, + scanedAmount,unscanedAmount,urgentLevel); + tousseItemManager.saveOrUpdate(tousseItem); - if(newAdded){ - tousseTransitionPlanItem = new TousseTransitionPlanItem(); - tousseTransitionPlanItem.setAdded(newAdded); - //新添加的,申请数量为0 - tousseTransitionPlanItem.setAmount(0); - tousseTransitionPlanItem.setTousseItemId(tousseItem.getId()); - tousseTransitionPlanItem.setTousseTransitionPlanId(tousseTransitionPlan.getId()); + updateTousseTransitionPlanItem(tousseTransitionPlanItem, + prepareRecycleAmount, scanedAmount, unscanedAmount, + urgentLevel); + TousseTransitionRecordItem ttri = tousseTransitionRecordItemManager.build(newAdded, + tousseTransitionPlanItem, prepareRecycleAmount, + scanedAmount, unscanedAmount, urgentLevel); + ttri.setTousseTransitionRecordId(tousseTransitionRecord.getId()); + tousseTransitionRecordItemManager.save(ttri); + //器械包条码为空只保存交接记录,没有条码的交接明细。回收数量信息记录在TousseTransitionPlanItem中 + if(CollectionUtils.isNotEmpty(tousseBarcodes)){ + tousseTransitionItemManager.save(tousseTransitionRecord,ttri, + tousseBarcodes,getTousseDefineIdTousseItemMap(invoicePlan.getApplicationItems())); } - tousseTransitionPlanItem.setRecycleAmount(prepareRecycleAmount); - tousseTransitionPlanItem.setScanedAmount(scanedAmount); - tousseTransitionPlanItem.setUnscanedAmount(unscanedAmount); - tousseTransitionPlanItem.setUrgentLevel(urgentLevel); - tousseTransitionPlanItemManager.save(tousseTransitionPlanItem); } - if (plan != null) { - plan.setIsPrepareRecycled(InvoicePlan.SIGNED_TRUE); - String comfirmor = params.optString("comfirmor"); - String comfirmorCode = params.optString("comfirmorCode"); - String operatorCode = params.optString("operatorCode"); - String operator = params.optString("operator"); - JSONArray tousseBarcodes = params.optJSONArray("tousseBarcodes"); - plan.setPrepareRecycleComfirmor(comfirmor); - plan.setPrepareRecycleOperator(operator); - plan.setPrepareRecycleDateTime(new Date()); - invoicePlanManager.save(plan); - tousseTransitionPlan.setStatus(TousseTransitionPlan.STATUS_TRANSITED); - save(plan,tousseTransitionPlan,tousseBarcodes,comfirmor,comfirmorCode,operator,operatorCode); - } else { - throw new RuntimeException("申请单不存在"); - } } } } + private TousseItem newTousseItem(InvoicePlan invoicePlan, + Integer prepareRecycleAmount, TousseDefinition td) { + TousseItem tousseItem; + tousseItem = new TousseItem(); + String tousseTransitionVersion = CssdUtils.getSystemSetConfigByName("tousseTransitionVersion"); + boolean transitionVersion2 = "2".equals(tousseTransitionVersion); + if(transitionVersion2){ + tousseItem.setAmount(0); + }else{ + tousseItem.setAmount(prepareRecycleAmount); + } + tousseItem.setTousseName(td.getName()); + tousseItem.setTousseType(td.getTousseType()); + tousseItem.setDiposable("否"); + tousseItem.setTousseDefinitionId(td.getId()); + tousseItem.setIsInvoice(td.getIsInvoice()); + tousseItem.setExpressRecycling(td.getExpressRecycling()); + tousseItem.setIsApplyEntireTousse(td.getIsApplyEntireTousse()); + tousseItem.setIsCleanedEntirely(td.getIsCleanedEntirely()); + boolean isThereIDCard = tousseDefinitionManager.isThereIDCard(td); + tousseItem.setIsThereIdentificationCard(isThereIDCard?"是":"否"); + // 器械包取器械包定义中的价格 + double price = td.getPrice(); + // 消毒物品取材料的消毒价格之和 + if (td.isDisinfection()) { + price = tousseDefinitionManager + .getDisinfectGoodsTotalPrice(td); + } + tousseItem.setPrice(price); + tousseItem.setRowPrice(MathTools.mul(price, + prepareRecycleAmount).doubleValue()); + tousseItem.setInvoicePlan(invoicePlan); + return tousseItem; + } + private void updateInvoicePlan(InvoicePlan invoicePlan, String comfirmor, + String operator) { + if (invoicePlan != null) { + invoicePlan.setIsPrepareRecycled(InvoicePlan.SIGNED_TRUE); + invoicePlan.setPrepareRecycleComfirmor(comfirmor); + invoicePlan.setPrepareRecycleOperator(operator); + invoicePlan.setPrepareRecycleDateTime(new Date()); + invoicePlanManager.save(invoicePlan); + } + } + + private void updateTousseTransitionPlanItem( + TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount, Integer scanedAmount, + Integer unscanedAmount, String urgentLevel) { + if(tousseTransitionPlanItem != null){ + tousseTransitionPlanItem.setRecycleAmount( + MathTools.add(tousseTransitionPlanItem.getRecycleAmount(), prepareRecycleAmount).intValue()); + + tousseTransitionPlanItem.setScanedAmount( + MathTools.add(scanedAmount, tousseTransitionPlanItem.getScanedAmount()).intValue()); + tousseTransitionPlanItem.setUnscanedAmount( + MathTools.add(unscanedAmount, tousseTransitionPlanItem.getUnscanedAmount()).intValue()); + tousseTransitionPlanItem.setUrgentLevel(urgentLevel); + tousseTransitionPlanItem.setRecycled(true); + tousseTransitionPlanItemManager.save(tousseTransitionPlanItem); + } + } private Map getTousseDefineIdTousseItemMap(List allTousseItems){ Map map = new HashMap(); @@ -290,7 +374,7 @@ if(tousseInstance.getTousseFixedBarcode()){ throw new RuntimeException(String.format("条码(%s)为固定条码,请扫描唯一条码",tousseInstance.getBarcode())); } - + JSONObject json = JSONUtil.buildJsonObject(true); if(!DatabaseUtil.isPoIdValid(tousseInstance.getUseRecord_id())){ String msg = String.format("条码为%s的器械包未添加使用记录", tousseInstance.getBarcode()); throw new RuntimeException(msg); @@ -304,33 +388,40 @@ break; } } - RecyclingApplication app = null; + RecyclingApplication recyclingApplication = null; if(useRecordToRecycleApplication != null){ //包实例的使用记录,有与当前申请单合并的记录 - app = recyclingApplicationManager.getRecyclingApplicationById(recyclingApplicationId.toString()); + recyclingApplication = recyclingApplicationManager.getRecyclingApplicationById(recyclingApplicationId.toString()); } - if(app == null){ + if(recyclingApplication == null){ String msg = String.format("未找到条码为%s的器械包的使用记录转换的申请单", tousseInstance.getBarcode()); throw new RuntimeException(msg); } + //到这里,说明useRecordToRecycleApplication不为null,否则recyclingApplication一定为null,在上一句就已经抛出异常了 + //如果是按手术间合并,那相同手术间的包实例是可以合并回收的,不同的病人也可以 String mergeRegular = CssdUtils.getSystemSetConfigByName("useRecordConvertRecyclingApplicationMergeRegular"); if(UseRecord.CONVERT_RECYCLINGMANAGER_MERGE_REGULAR_OPERATIONROOM.equals(mergeRegular)){ RecyclingApplication ra = recyclingApplicationManager.getRecyclingApplicationById(recyclingApplicationId.toString()); - if(!StringTools.equals(ra.getOperationRoom(), app.getOperationRoom())){ + if(!StringTools.equals(ra.getOperationRoom(), recyclingApplication.getOperationRoom())){ throw new RuntimeException(String.format("条码为%s的器械包由病人%s使用,手术 间号%s", - tousseInstance.getBarcode(),app.getUseRecord().getPatientName(),app.getOperationRoom())); + tousseInstance.getBarcode(),recyclingApplication.getUseRecord().getPatientName(),recyclingApplication.getOperationRoom())); } }else{ - if(app.getId().longValue() != recyclingApplicationId.longValue()){ - String msg = String.format("条码为%s的器械包由病人%s使用", tousseInstance.getBarcode(),app.getUseRecord().getPatientName()); + if(recyclingApplication.getId().longValue() != recyclingApplicationId.longValue()){ + String msg = String.format("条码为%s的器械包由病人%s使用", tousseInstance.getBarcode(),recyclingApplication.getUseRecord().getPatientName()); throw new RuntimeException(msg); } } + + TousseItem tousseItem = tousseItemManager.find(recyclingApplication.getApplicationItems(),tousseInstance.getTousseDefinition().getId()); + TousseTransitionPlanItem tousseTransitionPlanItem = tousseTransitionPlanItemManager.get(useRecordToRecycleApplication,tousseItem); + if(tousseTransitionPlanItem != null){ + json.put("tousseTransitionPlanItemId", tousseTransitionPlanItem.getId()); + } } - JSONObject json = JSONUtil.buildJsonObject(true); json.put("tousseName", tousseInstance.getTousseName()); json.put("tousseDefinitionId", tousseInstance.getTousseDefinition().getId()); json.put("barcode", tousseInstance.getBarcode()); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManager.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManager.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionRecordItemManager.java (revision 17897) @@ -0,0 +1,45 @@ +package com.forgon.disinfectsystem.toussetransition.service; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; +import com.forgon.tools.hibernate.BasePoManager; + +public interface TousseTransitionRecordItemManager extends BasePoManager { + /** + * 创建清洗交接记录项 + * @param newAdded + * @param tousseTransitionPlanItem + * @param prepareRecycleAmount + * @param scanedAmount + * @param unscanedAmount + * @param urgentLevel + * @return + */ + public TousseTransitionRecordItem build(boolean newAdded, + TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount, Integer scanedAmount, + Integer unscanedAmount, String urgentLevel); + /** + * 创建并保存对象 + * @param newAdded + * @param tousseTransitionPlanItem + * @param prepareRecycleAmount + * @param scanedAmount + * @param unscanedAmount + * @param urgentLevel + */ + public void save(boolean newAdded, + TousseTransitionPlanItem tousseTransitionPlanItem, + Integer prepareRecycleAmount, Integer scanedAmount, + Integer unscanedAmount, String urgentLevel) throws RuntimeException; + /** + * 根据器械交接计划项的id查找对象 + * @param ttris + * @param tousseTransitionPlanItemId + * @return + */ + public TousseTransitionRecordItem find( + List ttris, Long tousseTransitionPlanItemId); +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/urgent/UrgentLevel.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/urgent/UrgentLevel.java (.../UrgentLevel.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/urgent/UrgentLevel.java (.../UrgentLevel.java) (revision 17897) @@ -10,6 +10,7 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import com.forgon.Constants; +import com.forgon.tools.string.StringTools; /** * 加急等级。中山一院的需求,对加急分等级 @@ -33,6 +34,10 @@ * 是否启用 */ private String enable = Constants.STR_YES; + /** + * 是否加急 + */ + private String urgent = Constants.STR_YES; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { @@ -59,4 +64,17 @@ public void setEnable(String enable) { this.enable = enable; } + public String getUrgent() { + return urgent; + } + public void setUrgent(String urgent) { + this.urgent = urgent; + } + /** + * 判断是否加急。不加急的项,应该只有一个 + * @return + */ + public boolean urgent(){ + return StringTools.equals(urgent, Constants.STR_YES); + } } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanManagerImpl.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanManagerImpl.java (.../TousseTransitionPlanManagerImpl.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionPlanManagerImpl.java (.../TousseTransitionPlanManagerImpl.java) (revision 17897) @@ -208,11 +208,11 @@ if(!DatabaseUtil.isPoIdValid(tousseTransitionPlanId)){ return obj; } - TousseTransitionPlan app = get(tousseTransitionPlanId); - if(app != null){ + TousseTransitionPlan tousseTransitionPlan = get(tousseTransitionPlanId); + if(tousseTransitionPlan != null){ String tousseTransitionVersion = CssdUtils.getSystemSetConfigByName("tousseTransitionVersion"); tousseItemArray = new JSONArray(); - List items = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", app.getId()); + List items = tousseTransitionPlanItemManager.getByProperty("tousseTransitionPlanId", tousseTransitionPlan.getId()); if(CollectionUtils.isEmpty(items)){ return obj; } @@ -288,18 +288,18 @@ jsonItem.put("unscanedAmount", unscanedAmount); jsonItem.put("tousseDefineId", tousseItem.getTousseDefinitionId()); jsonItem.put("tousseBarcodes", barcodes); - jsonItem.put("urgentLevel", tousseItem.getUrgent()); + jsonItem.put("urgentLevel", item.getUrgentLevel()); tousseItemArray.add(jsonItem); } } - InvoicePlan invoicePlan = invoicePlanManager.get(app.getInvoicePlanId()); + InvoicePlan invoicePlan = invoicePlanManager.get(tousseTransitionPlan.getInvoicePlanId()); if (invoicePlan.getPrepareRecycleDateTime() != null) { obj.put("prepareRecycleDateTime", Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM.format(invoicePlan .getPrepareRecycleDateTime())); } - UseRecord useRecord = (UseRecord) objectDao.getByProperty(UseRecord.class.getSimpleName(), "id", app.getUseRecordId()); + UseRecord useRecord = (UseRecord) objectDao.getByProperty(UseRecord.class.getSimpleName(), "id", tousseTransitionPlan.getUseRecordId()); - obj.put("applicationTime", app.getCreateTime()); + obj.put("applicationTime", tousseTransitionPlan.getCreateTime()); obj.put("patientName", useRecord.getPatientName()); obj.put("operationRoom", useRecord.getOperationRoom()); obj.put("hospitalNum", useRecord.getHospitalNum()); @@ -309,7 +309,7 @@ obj.put("items", tousseItemArray); obj.put("serialNumber", invoicePlan.getSerialNumber()); obj.put("applicant", invoicePlan.getApplicant()); - obj.put("depart", app.getDepart()); + obj.put("depart", tousseTransitionPlan.getDepart()); } return obj; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManager.java =================================================================== diff -u -r17849 -r17897 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManager.java (.../UrgentLevelManager.java) (revision 17849) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/urgent/service/UrgentLevelManager.java (.../UrgentLevelManager.java) (revision 17897) @@ -20,4 +20,10 @@ * @param items */ public void sortUrgentLevel(String items); + /** + * 根据名称查找对象,此对象需要为启用的对象。如果没有找到,返回null. + * @param name + * @return + */ + public UrgentLevel getByName(String name); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionRecordItem.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionRecordItem.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/toussetransition/TousseTransitionRecordItem.java (revision 17897) @@ -0,0 +1,100 @@ +package com.forgon.disinfectsystem.entity.toussetransition; + +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; + +/** + * 器械交接记录明细。记录在交接的时候,对应的包回收的数量及加急的情况 + * @author kzh + * + */ +@Entity +@Table(name = "TousseTransitionRecordItem") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class TousseTransitionRecordItem { + private Long id; + /** + * 器械交接记录的id + */ + private Long tousseTransitionRecordId; + /** + * 器械交接单的明细id.这个明细可能不包含在tousseTransitionRecordId所对应的交接记录里的那张交接单里。有可能是另一张交接单的 + */ + private Long tousseTransitionPlanItemId; + /** + * 加急等级 + */ + private String urgentLevel; + /** + * 预回收数量。在预回收处理后赋值。recycleAmount = scanedAmount + unscanedAmount + */ + private Integer recycleAmount; + /** + * 扫描条码的数量。在预回收处理后赋值。recycleAmount = scanedAmount + unscanedAmount + */ + private Integer scanedAmount; + /** + * 未扫描的数量。手动修改的数量。recycleAmount = scanedAmount + unscanedAmount + */ + private Integer unscanedAmount; + /** + * 新添加器械包标志 + */ + private Boolean added; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public Long getTousseTransitionRecordId() { + return tousseTransitionRecordId; + } + public void setTousseTransitionRecordId(Long tousseTransitionRecordId) { + this.tousseTransitionRecordId = tousseTransitionRecordId; + } + public Long getTousseTransitionPlanItemId() { + return tousseTransitionPlanItemId; + } + public void setTousseTransitionPlanItemId(Long tousseTransitionPlanItemId) { + this.tousseTransitionPlanItemId = tousseTransitionPlanItemId; + } + public String getUrgentLevel() { + return urgentLevel; + } + public void setUrgentLevel(String urgentLevel) { + this.urgentLevel = urgentLevel; + } + public Integer getRecycleAmount() { + return recycleAmount; + } + public void setRecycleAmount(Integer recycleAmount) { + this.recycleAmount = recycleAmount; + } + public Integer getScanedAmount() { + return scanedAmount; + } + public void setScanedAmount(Integer scanedAmount) { + this.scanedAmount = scanedAmount; + } + public Integer getUnscanedAmount() { + return unscanedAmount; + } + public void setUnscanedAmount(Integer unscanedAmount) { + this.unscanedAmount = unscanedAmount; + } + public Boolean getAdded() { + return added; + } + public void setAdded(Boolean added) { + this.added = added; + } +} Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r17829 -r17897 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 17829) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 17897) @@ -648,6 +648,23 @@ class="com.forgon.disinfectsystem.toussetransition.service.TousseTransitionRecordManagerImpl"> + + + + + + + + PROPAGATION_REQUIRED + + + + + + + Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManager.java =================================================================== diff -u -r17849 -r17897 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManager.java (.../TousseTransitionItemManager.java) (revision 17849) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/toussetransition/service/TousseTransitionItemManager.java (.../TousseTransitionItemManager.java) (revision 17897) @@ -8,6 +8,7 @@ import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionPlanItem; import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecord; +import com.forgon.disinfectsystem.entity.toussetransition.TousseTransitionRecordItem; import com.forgon.tools.hibernate.BasePoManager; /** @@ -41,5 +42,5 @@ * @param tousseBarcodes * @param map */ - public void save(TousseTransitionRecord record, JSONArray tousseBarcodes, Map map); + public void save(TousseTransitionRecord record,TousseTransitionRecordItem recordItem,JSONArray tousseBarcodes,Map map); } Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelView.js =================================================================== diff -u -r17849 -r17897 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelView.js (.../urgentLevelView.js) (revision 17849) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/urgentLevel/urgentLevelView.js (.../urgentLevelView.js) (revision 17897) @@ -16,6 +16,7 @@ {name : 'enable'}, {name : 'name'}, {name : 'level'}, + {name : 'urgent'}, {name : 'newLevel'} ] }); @@ -118,6 +119,12 @@ dataIndex : 'sequence', hidden :true },{ + header : "是否加急", + id : 'urgent', + dataIndex : 'urgent', + width : 200, + hidden :false + },{ header : "是否启用", id : 'enable', dataIndex : 'enable',