Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java =================================================================== diff -u -r16375 -r16376 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 16375) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/action/InvoiceAction.java (.../InvoiceAction.java) (revision 16376) @@ -1366,6 +1366,24 @@ } } + public void getTousseInstancesForAuxiliaryInvoice() { + JSONObject params = new JSONObject(); + String departCode = StrutsParamUtils.getPraramValue("orgUnitCoding", ""); + String depart = StrutsParamUtils.getPraramValue("depart", ""); + String mode = StrutsParamUtils.getPraramValue("mode", Invoice.INVOICE_MODE_DEPART); + String sterileStartTime = StrutsParamUtils.getPraramValue("sterileStartTime", ""); + String sterileEndTime = StrutsParamUtils.getPraramValue("sterileEndTime", ""); + + params.put("mode", mode); + params.put("departCode", departCode); + params.put("depart", depart); + params.put("sterileStartTime", sterileStartTime); + params.put("sterileEndTime", sterileEndTime); + + JSONArray jsonArray = invoiceManager.getTousseInstancesForAuxiliaryInvoice(params); + StrutsResponseUtils.output(jsonArray); + } + /** * 根据传入的条码/虚拟篮筐编号加载相关符合发货条件的器械包 * request params: Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r16160 -r16376 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 16160) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 16376) @@ -178,6 +178,7 @@ public List getForeignTousseTousseInstance(String appid); public List getBySql_ForUpdate(String sql); + public List getBySql(String sql); public List getByIDs_ForUpdate(String ids); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java =================================================================== diff -u -r16373 -r16376 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 16373) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/toussedefinition/TousseInstance.java (.../TousseInstance.java) (revision 16376) @@ -367,6 +367,11 @@ this.sterileEndTime = sterileEndTime; } + @Transient + public String getSterileEndDate() { + return TousseInstanceUtils.safelyGetSterileEndDateStr(this); + } + public String getTousseName() { return tousseName; } Index: ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedForm.js =================================================================== diff -u -r16375 -r16376 --- ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedForm.js (.../invoicePlanExtractedForm.js) (revision 16375) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedForm.js (.../invoicePlanExtractedForm.js) (revision 16376) @@ -954,7 +954,7 @@ // 一定要事务提交成功才返回发货计划列表界面 showResult(action.result.message); if(action.result.success){ - window.close(); + invoiceFormWindow.close(); grid.getStore().reload(); } }, @@ -963,13 +963,13 @@ showResult(action.result.message); }else{ showResult("发货超时,请稍后查看发货单以确定发货是否成功,避免重复发货!"); - window.close(); + invoiceFormWindow.close(); grid.getStore().reload(); } } }); } - var barcodeBtn = new BarcodeBtn(function(){doSaveAction();},function(){window.close();}); + var barcodeBtn = new BarcodeBtn(function(){doSaveAction();},function(){invoiceFormWindow.close();}); var form = new top.Ext.FormPanel({ id : 'recyclingApplicationForm', frame : true, @@ -1488,8 +1488,17 @@ handler : function() { //切记注意:按取消关闭window后,一定要把已选择的申请单号变量清空 selectedInvoicePlanId = ""; - window.close(); + invoiceFormWindow.close(); } + }, { + text : '辅助发货', + hidden: !sstsConfig.showAuxiliaryInvoiceBtn, + handler : function() { + + selectedInvoicePlanId = ""; + invoiceFormWindow.close(); + openAuxiliaryInvoiceForm(orgUnitCoding,depart,invoicePlanId); + } }] }); @@ -1517,7 +1526,7 @@ top.Ext.getCmp('personInChargeCode').setValue(cookiePersonInChargeCode); } - var window = new top.Ext.Window( { + var invoiceFormWindow = new top.Ext.Window( { id : 'recyclingApplicationWin', layout : 'fit', title : '发货单', @@ -1529,14 +1538,14 @@ items : [form] }); - window.on('close',function(w){ + invoiceFormWindow.on('close',function(w){ //切记注意:按取消关闭window后,一定要把已选择的申请单号变量清空 selectedInvoicePlanId = ""; invoicePlanFormOpened = false; top.getCurrentTab().focus(); }); - window.show(); + invoiceFormWindow.show(); if(project == 'gdsy'){ if(openMode == INVOICE_FORM_OPEN_MODE_SCANBARCODE){ var sender = top.Ext.getCmp('sender').getValue(); @@ -1606,7 +1615,7 @@ frame:false }); - var window = new top.Ext.Window({ + var invoiceFormWindow = new top.Ext.Window({ title : tousseName + '信息', width : 400, height :200, @@ -1616,7 +1625,7 @@ modal : true, items : [materialGrid] }); - window.show(); + invoiceFormWindow.show(); } //获取扫描的物品 Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r16168 -r16376 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 16168) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 16376) @@ -1777,6 +1777,12 @@ TousseInstance.class.getSimpleName(), sql); return retList; } + + public List getBySql(String sql){ + List retList = objectDao.findBySql( + TousseInstance.class.getSimpleName(), sql); + return retList; + } public List getByIDs_ForUpdate(String ids){ if(StringUtils.isBlank(ids)){ Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r16375 -r16376 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 16375) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 16376) @@ -41,6 +41,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.log4j.Logger; +import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; @@ -1624,12 +1625,6 @@ } } } - - /** - * 修改TousseInstance的isRoutine属性 - * @param tousseInstancesToUpdate - * @param submitInvoiceItems - */ private void updateTousseInstanceStatus( Set tousseInstancesToUpdate, List submitInvoiceItems) { @@ -8008,51 +8003,49 @@ return list; } + /** - * 批量获取器械包的生物监测的信息,信息具体如下:
- * noBiologicalMonitoring:没做生物监测
- * biologicalMonitoringNoResult:生物监测的结果为无
- * biologicalMonitoringFail:生物监测的结果是不合格
- * urgentDelivery:紧急发货 + * 验证器械包是否常规发货,以及生物监测的情况,返回值JSONObject对象的三个元素的具体如下:
+ * biologicalMonitoringNoResult:生物监测结果为无的器械包集合,用分号分隔
+ * noBiologicalMonitoringForeignTousses:没做生物监测的器械包集合,用分号分隔
+ * unconventionalForeignTousses生物监测没结束就要发货的器械包集合,用分号分隔
+ * isUnqualified:生物监测结果为"不合格"的器械包集合,用分号分隔 * - * @param tousseBarcodes 器械包条码集合的字符串,用分号分隔 + * @param tousseBarcodes:器械包条码集合的字符串,用分号分隔 * @return */ @Override - public JSONObject getBiologicalMonitoringInfo(String tousseBarcodes) { + public JSONObject isRoutine(String tousseBarcodes) { List> list = getTousseIntoForBarcodes(tousseBarcodes); - JSONObject vos = new JSONObject(); - if (CollectionUtils.isNotEmpty(list)) { + String biologicalMonitoringNoResult = ""; + String noBiologicalMonitoringForeignTousses = ""; + String unconventionalForeignTousses = ""; + String isUnqualified = ""; + + if (list.size() > 0) { for (Map map : list) { - String noBiologicalMonitoring = ""; - String biologicalMonitoringNoResult = ""; - String biologicalMonitoringFail = ""; - String urgentDelivery = ""; - - String barcode = map.get("barcode"); //器械包条码 String endDate = map.get("endDate"); //灭菌的结束时间 String biologyResult = map.get("biologyResult"); //生物监测的结果 String biologicalMonitoringEndDate = map.get("biologicalMonitoringEndDate"); //生物监测的结束时间 String biologicalMonitoringTimeString = map.get("biologicalMonitoringTime"); //对应灭菌炉配置的生物监测默认时间 String lagTimeString = map.get("lagTime"); //对应灭菌炉配置的灭菌与生物监测间隔时间 - ///// long nowTime = System.currentTimeMillis(); if (SterilizationRecord.MONITOR_RESULT_NO.equals(biologyResult)) { - biologicalMonitoringNoResult = barcode; + biologicalMonitoringNoResult += map.get("barcode") + ";"; if (StringUtils.isNotBlank(biologicalMonitoringEndDate)) { //填了生物监测的结束时间,这种情况就相当于,进行中 try { long biologicalMonitoringEndDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(biologicalMonitoringEndDate).getTime(); if (biologicalMonitoringEndDateTime > nowTime) { - urgentDelivery = barcode; + unconventionalForeignTousses += map.get("barcode") + ";"; } } catch (ParseException e) { logger.debug("生物监测结束时间格式有误先不处理"); } } else { //没填生物监测的结束时间,这种情况,可能是漏填(只提示他结果为无即可,但是是否紧急发货还是要根据对应的灭菌炉配置的参数来判断) - noBiologicalMonitoring = barcode; + noBiologicalMonitoringForeignTousses += map.get("barcode") + ";"; if (StringUtils.isNotBlank(lagTimeString) && StringUtils.isNotBlank(biologicalMonitoringTimeString)) { //在对应的灭菌炉"灭菌与生物监测间隔时间"和"生物监测持续时间"两个参数都要有配才会去判断是否紧急发货,否则默认常规 try { Integer lagTime = new Integer(lagTimeString)*60*1000; @@ -8061,7 +8054,7 @@ long biologicalMonitoringEndDateTime = endDateTime + lagTime + biologicalMonitoringTime; if (biologicalMonitoringEndDateTime > nowTime) { - urgentDelivery = barcode; + unconventionalForeignTousses += map.get("barcode") + ";"; } } catch (ParseException e) { logger.debug("灭菌结束时间格式有误先不处理"); @@ -8076,25 +8069,34 @@ logger.debug("生物监测结束时间格式有误先不处理"); } if (SterilizationRecord.MONITOR_RESULT_UNQUALIFIED.equals(biologyResult)) { //如果生物监测的结果不合格,强制不让发货 - biologicalMonitoringFail = barcode; + isUnqualified += map.get("barcode") + ";"; } if (SterilizationRecord.MONITOR_RESULT_UNQUALIFIED.equals(biologyResult) || biologicalMonitoringEndDateTime > nowTime) { //生物监测没结束就发货 - urgentDelivery = barcode; + unconventionalForeignTousses += map.get("barcode") + ";"; } } - - JSONObject vo = new JSONObject(); - vo.put("noBiologicalMonitoring", noBiologicalMonitoring); - vo.put("biologicalMonitoringNoResult", biologicalMonitoringNoResult); - vo.put("biologicalMonitoringFail", biologicalMonitoringFail); - vo.put("urgentDelivery", urgentDelivery); - vos.put(barcode, vo); - ///// } } - return vos; + biologicalMonitoringNoResult = biologicalMonitoringNoResult.equals("") ? "" : + biologicalMonitoringNoResult.substring(0, biologicalMonitoringNoResult.length() - 1); + noBiologicalMonitoringForeignTousses = noBiologicalMonitoringForeignTousses.equals("") ? "" : + noBiologicalMonitoringForeignTousses.substring(0, noBiologicalMonitoringForeignTousses.length() - 1); + unconventionalForeignTousses = unconventionalForeignTousses.equals("") ? "" : + unconventionalForeignTousses.substring(0, unconventionalForeignTousses.length() - 1); + isUnqualified = isUnqualified.equals("") ? "" : + isUnqualified.substring(0, isUnqualified.length() - 1); + + + + JSONObject jsonObj = new JSONObject(); + jsonObj.put("biologicalMonitoringNoResult", biologicalMonitoringNoResult); + jsonObj.put("noBiologicalMonitoringForeignTousses", noBiologicalMonitoringForeignTousses); + jsonObj.put("unconventionalForeignTousses", unconventionalForeignTousses); + jsonObj.put("isUnqualified", isUnqualified); + return jsonObj; + } @Override @@ -8108,4 +8110,104 @@ } return null; } + + public JSONArray getTousseInstancesForAuxiliaryInvoice(JSONObject params) { + JSONArray jsonArray = new JSONArray(); + String invoicePlanIds = JSONUtil.optString(params, "invoicePlanIds", + null); + String sterileStartTime = JSONUtil.optString(params, + "sterileStartTime", null); + String sterileEndTime = JSONUtil.optString(params, "sterileEndTime", + null); + String departCode = JSONUtil.optString(params, "departCode", null); + + Set tousseDefinitionIdSet = new HashSet(); + List invoicePlanList = invoicePlanManager + .getInvoicePlanListByOrgUnitCodingsAndTousseType( + Arrays.asList(departCode), null, "普通器械包,外来器械包"); + if (invoicePlanList != null) { + for (InvoicePlan invoicePlan : invoicePlanList) { + List tousseItemList = invoicePlan + .getApplicationItems(); + if (tousseItemList != null) { + for (TousseItem tousseItem : tousseItemList) { + if (!tousseItem.isInsideTousse() + && !tousseItem.isForeignTousse()) { + continue; + } + Long tousseDefinitionId = tousseItem + .getTousseDefinitionId(); + if (!DatabaseUtil.isPoIdValid(tousseDefinitionId)) { + continue; + } + tousseDefinitionIdSet.add(tousseDefinitionId); + } + } + } + if (!tousseDefinitionIdSet.isEmpty()) { + StringBuilder tousseInstanceSql = new StringBuilder(); + tousseInstanceSql + .append(String.format(" where %s and %s", SqlUtils + .getNonStringFieldInCollectionsPredicate( + "po.tousseDefinition.id", + tousseDefinitionIdSet),SqlUtils.getStringFieldPredicate("po.status", TousseInstance.STATUS_STERILED))); + if (StringUtils.isNotBlank(sterileStartTime)) { + tousseInstanceSql + .append(String.format( + " and po.sterileEndTime >= '%s'", + sterileStartTime)); + } + if (StringUtils.isNotBlank(sterileEndTime)) { + tousseInstanceSql.append(String.format( + " and po.sterileEndTime <= '%s'", sterileEndTime)); + } + List tousseInstanceList = tousseInstanceManager + .getBySql(tousseInstanceSql.toString()); + if (tousseInstanceList != null) { + for (TousseInstance tousseInstance : tousseInstanceList) { + TousseDefinition td = tousseInstance.getTousseDefinition(); + if(td == null){ + continue; + } + JSONObject obj = new JSONObject(); + obj.put("id", tousseInstance.getId()); + obj.put("showTousseName", + tousseInstance.getShowTousseName()); + obj.put("name", tousseInstance.getTousseName()); + obj.put("tousseType", td.getTousseType()); + obj.put("barcode", tousseInstance.getBarcode()); + obj.put("status", tousseInstance.getStatus()); + obj.put("sterileStartTime", tousseInstance.getSterileStartTime()); + obj.put("sterileStartDate", tousseInstance.getSterileStartDate()); + obj.put("sterileEndTime", tousseInstance.getSterileEndTime()); + obj.put("sterileEndDate", tousseInstance.getSterileEndDate()); + obj.put("sterilizationUser", tousseInstance.getSterilizationUser()); + obj.put("storage", 1); + obj.put("diposable", TousseItem.DIPOSABLE_NO); + obj.put("isRoutine", TousseInstance.ROUTINE_YES); + obj.put("noBiologicalMonitoring", false); + obj.put("isUnqualified", false); + + // 估计会有严重的性能问题 + JSONObject jsonObj = isRoutine(tousseInstance.getBarcode()); //判断是否常规发货(cjr) + String noBiologicalMonitoringForeignTousse = jsonObj.optString("noBiologicalMonitoringForeignTousses"); + String unconventionalForeignTousse = jsonObj.optString("unconventionalForeignTousses"); + String isUnqualified = jsonObj.optString("isUnqualified"); + if (!StringTools.isBlank(noBiologicalMonitoringForeignTousse)) { //此器械包没做生物监测 + obj.put("noBiologicalMonitoring", TousseInstance.ROUTINE_NO); + } + if (!StringTools.isBlank(unconventionalForeignTousse)) { //此器械包做了生物监测,但是没结束就要发货了 + obj.put("isRoutine", TousseInstance.ROUTINE_NO); + } + if (!StringTools.isBlank(isUnqualified)) { //此器械包做了生物监测,但是结果为"不合格"就要发货了,必须强制不让其发货 + obj.put("isUnqualified", TousseInstance.ROUTINE_NO); + } + jsonArray.add(obj); + } + } + } + } + + return jsonArray; + } } \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/invoice/auxiliaryInvoiceForm.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/invoice/auxiliaryInvoiceForm.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/auxiliaryInvoiceForm.js (revision 16376) @@ -0,0 +1,834 @@ + + +//删除发货扫描的物品 +function auxiliaryInvoice_removeSendOutGoods(id){ + var rows = top.Ext.getCmp('sendOutGoods').getSelectionModel().getSelections();// 返回值为 + if (rows) { + for ( var i = 0; i < rows.length; i++) { + sendOutGoodsStore.remove(rows[i]); + auxiliaryInvoice_refreshTotalAmount(); + var record = findRecordByNameAndValueFromStore(recyclingapplicationStore,'barcode',rows[i].data.barcode); + if(record != null){ + record.set('added',false); + } + } + } +} + + +var auxiliaryInvoice_addGridItem = Ext.data.Record.create([ + {name : 'id'}, + {name : 'barcode'}, + {name : 'name'}, + {name : 'showTousseName'}, + {name : 'count'}, + {name : 'diposable'}, + {name : 'price'}, + {name : 'fluctuationPrice'}, + {name : 'storage'}, + {name : 'batchNumber'}, + {name : 'tousseType'}, + {name : 'typeInfoOnScanned'}, + {name : 'sterilizerName'}, + {name : 'frequency'}, + {name : 'isTracable'}, + {name : 'tousseDefinitionId'} + ]); + + +// 刷新总包数 +function auxiliaryInvoice_refreshTotalAmount(){ + var appAmount = 0; + var scannedAmount = 0; + var text = '已扫总包数:'+sendOutGoodsStore.getCount(); + var amountElement = top.Ext.getCmp('tousseAmountInfo'); + if(amountElement != null){ + amountElement.setText(text); + } +} +/** + * 发货单窗口 + * @param orgUnitCoding 科室编码 + * @param depart 科室名称 + * @param invoicePlanId 发货计划id + */ +var auxiliaryInvoiceFormOpened = false; +function openAuxiliaryInvoiceForm(orgUnitCoding,depart,invoicePlanId) { + if(auxiliaryInvoiceFormOpened){ + return; + } + auxiliaryInvoiceFormOpened = true; + lastLoadWarehouseId = null; + defaultFocusedFieldOnInvoiceForm = getStrValueFromJs('sstsConfig.defaultFocusedFieldOnInvoiceForm',defaultFocusedFieldOnInvoiceForm); + // 发货物品 + sendOutGoodsStore = new Ext.data.Store({ + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'id'}, + {name : 'barcode'}, + {name : 'name'}, + {name : 'showTousseName'}, + {name : 'count'}, + {name : 'diposable'}, + {name : 'price'}, + {name : 'fluctuationPrice'}, + {name : 'storage'}, + {name : 'batchNumber'}, + {name : 'sterilizerName'}, + {name : 'frequency'}, + {name : 'externalCode'} + ] + }) + }); + + var rd = new Ext.data.JsonReader( { + fields : [ + {name : 'id'}, + {name : 'barcode'}, + {name : 'name'}, + {name : 'showTousseName'}, + {name : 'added'}, + {name : 'count'}, + {name : 'middlePackageAmount'}, + {name : 'diposable'}, + {name : 'tousseType'}, + {name : 'price'}, + {name : 'urgentAmount'}, + {name : 'tempAmount'}, + {name : 'errorAmount'}, + {name : 'storage'}, + {name : 'amount'}, + {name : 'status'}, + {name : 'sterileStartTime'}, + {name : 'sterileStartDate'}, + {name : 'sterileEndTime'}, + {name : 'sterileEndDate'}, + {name : 'sterilizationUser'}, + {name : 'applicationAmount'}, + {name : 'isRoutine'}, + {name : 'noBiologicalMonitoring'}, + {name : 'isUnqualified'}, + {name : 'disposableGoodsIdSet'}, + {name : 'invoicePlanIDList'}, + {name : 'invoicePlanType'} + ] + }); + //科室申请单的store + var departApplicationStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/invoicePlanAction!getInvoicePlansByOrgAndTousseType.do?departCode=' + + orgUnitCoding + '&applyDate=' + + selectedApplyDate + '&tousseType=' + + encodeURI(selectedTousseType), + method : 'POST' + }), + reader : new Ext.data.JsonReader({fields : [{name : 'id'},{name : 'typeAndserialNumber'}]}), + listeners: { + load: function(thiz,records,options){ + if(records.length > 0 && invoicePlanId){ + var index; + for(var index = 0; index < records.length;++index){ + if(records[index].data.id == invoicePlanId){ + break; + } + } + if(index < records.length){ + var combo = top.Ext.getCmp('invoicePlanId'); + combo.setValue(records[index].data.id); + combo.fireEvent('select', combo,records[index],index); + } + } + } + } + }); + + //申请物品 + recyclingapplicationStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/invoiceAction!getTousseInstancesForAuxiliaryInvoice.do', + method : 'POST' + }), + reader : rd, + listeners: { + load: function(thiz,records,options){ + var sourceWarehouseIdCmp = top.Ext.getCmp('sourceWarehouseId'); + if(sourceWarehouseIdCmp != null){ + var sourceWarehouseId = sourceWarehouseIdCmp.getValue(); + auxiliaryInvoice_refreshTotalAmount(); + } + } + } + }); + + recyclingapplicationStore.removeAll(); + recyclingapplicationStore.on("beforeload", function(thiz, options) { + thiz.baseParams["orgUnitCoding"] = orgUnitCoding; + var sterileStartTime = ''; + var sterileEndTime = ''; + var query_startDate = top.Ext.getCmp('query_startDate'); + var query_endDate = top.Ext.getCmp('query_endDate'); + if(query_startDate){ + sterileStartTime = query_startDate.getRawValue(); + } + if(query_endDate){ + sterileEndTime = query_endDate.getRawValue(); + } + recyclingapplicationStore.baseParams['invoicePlanId'] = selectedInvoicePlanId; + recyclingapplicationStore.baseParams['applyDate'] = selectedApplyDate; + recyclingapplicationStore.baseParams['tousseType'] = encodeURI(selectedTousseType); + recyclingapplicationStore.baseParams['sterileStartTime'] = sterileStartTime; + recyclingapplicationStore.baseParams['sterileEndTime'] = sterileEndTime; + }); + + recyclingapplicationStore.load(); +// sendOutGoodsStore.removeAll(); +// sendOutGoodsStore.on("beforeload", function(thiz, options) { +// thiz.baseParams["orgUnitCoding"] = orgUnitCoding; +// }); +// sendOutGoodsStore.load(); + + var recyclingapplicationCm = new Ext.grid.ColumnModel([ +// {header : "id",id : 'id',dataIndex : 'id',width : 50,hidden : true,menuDisabled: true}, + {header : "条码",dataIndex : 'barcode',width : 120,menuDisabled: true}, + {header : "名称",id : 'showTousseName',dataIndex : 'showTousseName',width : 150,menuDisabled: true}, + {header : "器械包状态",dataIndex : 'status',width : 80,menuDisabled: true}, + {header : "灭菌日期",dataIndex : 'sterileEndDate',width : 100,menuDisabled: true}, + {header : "灭菌员",dataIndex : 'sterilizationUser',width : 80,menuDisabled: true} + ]); + + var cm = new Ext.grid.ColumnModel([ + {header : "条码",dataIndex : 'barcode',width : 65,menuDisabled: true}, + {header : "物品名称",dataIndex : 'showTousseName',width : 190,menuDisabled: true}, + {header : "name",dataIndex : 'name',hidden : true,menuDisabled: true}, + {id : 'deleteItem',header:'删除',width : 25, align:'center', menuDisabled: true, + renderer: function(v,p,record){ + var str = ""; + return str; + }, + dataIndex:'button' + }]); + function doSaveAction(){ + if (!form.getForm().isValid()) { + showResult('请正确填写表单各值'); + return false; + } + //验证发货物品表格 + if(!sendOutGoodsStore || sendOutGoodsStore.getCount() == 0){ + showResult('发货物品不能为空!'); + return false; + } + /*var b = validTousseGridData(); + if(!b){ + return false; + }*/ + + getTousseGridData(); + form.form.submit( { + //url : WWWROOT + '/disinfectSystem/invoiceAction!saveDepartInvoice.do', + url : WWWROOT + '/disinfectSystem/invoiceAction!saveInvoiceByDepartOrInvoicePlanId.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + success : function(form, action) { + // 一定要事务提交成功才返回发货计划列表界面 + showResult(action.result.message); + if(action.result.success){ + auxiliaryInvoiceFormWindow.close(); + grid.getStore().reload(); + } + }, + failure : function(form, action) { + if(!isUndefinedOrNullOrEmpty(action.result) && !isUndefinedOrNullOrEmpty(action.result.message)){ + showResult(action.result.message); + }else{ + showResult("发货超时,请稍后查看发货单以确定发货是否成功,避免重复发货!"); + auxiliaryInvoiceFormWindow.close(); + grid.getStore().reload(); + } + } + }); + } + var barcodeBtn = new BarcodeBtn(function(){doSaveAction();},function(){auxiliaryInvoiceFormWindow.close();}); + + + var form = new top.Ext.FormPanel({ + id : 'recyclingApplicationForm', + frame : true, + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 5px', + width : 1020, + autoHeight : true, + autoScroll : true, + labelAlign:'right', + layout : 'form', + items : [{ + xtype : "fieldset", + title : "基础数据", + layout : 'column', + style: 'padding:0px', + autoHeight : true, + items : [{ + layout : 'column', + columnWidth :1, + items:[{ + xtype : 'hidden', + name : 'id', + id : 'id' + },{ + xtype : 'hidden', + name : 'sendOutGoodsStoreData', + id : 'sendOutGoodsStoreData' + },{ + xtype :'hidden', + name : 'recyclingappStoreData', + id : 'recyclingappStoreData' + },{ + xtype :'hidden', + name : 'status', + id : 'status' + },{ + xtype :'hidden', + name : 'orgUnitCoding', + id : 'orgUnitCoding', + value:orgUnitCoding + },{ + xtype :'hidden', + name : 'applyDate', + id : 'applyDateHidden', + value:selectedApplyDate + },{ + xtype :'hidden', + name : 'tousseType', + id : 'tousseTypeHidden', + value:selectedTousseType + },{ + xtype :'hidden', + name : 'invoicePlanId', + id : 'invoicePlanIdHidden', + value:selectedInvoicePlanId + },{ + xtype :'hidden', + name : 'personInChargeCode', + id : 'personInChargeCode' + },{ + xtype : 'hidden', + name : 'sourceWarehouseId', + id : 'sourceWarehouseId' + },{ + xtype : 'hidden', + name : 'sourceWarehouseName', + id : 'sourceWarehouseName' + },{ + xtype : 'hidden', + name : 'warehouseID', + id : 'warehouseID' + },{ + xtype : 'hidden', + name : 'warehouseName', + id : 'warehouseName' + },{ + layout : 'form', + labelWidth :70, + columnWidth :.33, + items : [{ + xtype : 'textfield', + fieldLabel : '申请科室', + maxLength : '100', + id : 'depart2', + name : 'depart', + value : depart, + readOnly:true, + anchor : '99%', + cls:'fieldReadOnlyNoRemove' + + }] + },{ + layout : 'form', + labelWidth :70, + columnWidth :.67, + items : [{ + xtype : 'textfield', + fieldLabel : '发货员', + maxLength : '41', + id : 'deliveryPerson', + name : 'deliveryPerson', + readOnly:true, + allowBlank : false, + anchor : '99%', + value:$Id('userName').value, + cls:'fieldReadOnlyNoRemove' + }] + },{ + layout : 'form', + labelWidth :70, + columnWidth :.33, + items : [{ + xtype : 'textfield', + fieldLabel : '核对员条码', + maxLength : '16', + id : 'senderBarcode', + name : 'senderBarcode', + anchor : '99%', + listeners : { + render : function(p) { + p.getEl().on('keypress',function(e) { + if (e.getKey() == 13) {//回车键 + InvoiceTableManager.getUserNameOfCurrentLoginUserOrgsByBarcode( + top.Ext.getCmp('senderBarcode').getValue(),function(userName) { + if (userName != null) { + var resultArray = userName.split(":"); + if(resultArray[0] == "success"){ + top.Ext.getCmp('sender').setValue(resultArray[1]); + Ext.state.Manager.getProvider().set('cookieSender',resultArray[1]); + }else{ + showResult(resultArray[1]); + top.Ext.getCmp('sender').setValue(""); + } + } + top.Ext.getCmp('senderBarcode').setValue(""); + top.Ext.getCmp('personInChargeBarcode').focus(); + }); + } + }); + } + } + }] + },{ + layout : 'form', + labelWidth :70, + columnWidth :.33, + items : [{ + xtype : 'textfield', + fieldLabel : '核对员', + maxLength : '41', + id : 'sender', + name : 'sender', + readOnly:true, + allowBlank : false, + anchor : '99%', + cls:'x-item-disabled' + }] + },{ + layout : 'form', + labelWidth :90, + columnWidth :.33, + items : [{ + xtype : 'textfield', + fieldLabel : '下送责任人条码', + maxLength : '16', + id : 'personInChargeBarcode', + name : 'personInChargeBarcode', + anchor : '99%', + listeners : { + render : function(p) { + p.getEl().on('keypress',function(e) { + if (e.getKey() == 13) {//回车键 + var barcode = top.Ext.getCmp('personInChargeBarcode').getValue(); + top.Ext.getCmp('personInChargeBarcode').setValue(""); + UserTableManager.getUserByBarcode(barcode,function(responseText){ + if(!isUndefinedOrNullOrEmpty(responseText)){ + var result = top.Ext.decode(responseText); + if(!result.success){ + result.isNotSameOrgUnit?showResult("不允许登记非本科室人员,请扫描本科室人员条码"):showResult("输入的条码有误!"); + return; + } + Ext.state.Manager.getProvider().set('cookiePersonInCharge',result.fullName); + Ext.state.Manager.getProvider().set('cookiePersonInChargeCode',result.name); + top.Ext.getCmp('personInCharge').setValue(result.fullName); + top.Ext.getCmp('personInChargeCode').setValue(result.name); + top.Ext.getCmp('scanText').focus(); + }else{ + showResult('找不到该条码所对应的人员信息'); + } + }); + } + }); + } + } + }] + },{ + layout : 'form', + labelWidth :70, + columnWidth :.33, + items : [{ + xtype : 'textfield', + fieldLabel : '下送责任人', + maxLength : '41', + id : 'personInCharge', + name : 'personInCharge', + readOnly:true, + anchor : '99%', + cls:'x-item-disabled' + }] + },{ + layout : 'form', + labelWidth :70, + columnWidth :.33, + items : [{ + xtype : 'datefieldWithMin', + fieldLabel : '发货时间', + id : 'sendTime', + name : 'sendTime', + allowBlank : false, + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', + format:'Y-m-d H:i', +// value:new Date(), + anchor : '99%', + listeners : { + render : function() { + setStartDate(top.Ext, 'yyyy/MM/dd HH:mm', 'sendTime'); //(设置发货时间,取服务器时间 cjr) + } + } + + }] + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 90, + columnWidth :.33, + items:[{ + xtype : 'combo', + fieldLabel : '仓库', + id : 'warehouse', + name : 'warehouse', + minChars : 0, + valueField : 'id', + displayField : 'name', + store : wareHouseStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : false, + anchor : '99%', + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('warehouse').setValue(record.data.name); + top.Ext.getCmp('sourceWarehouseId').setValue(record.data.id); + top.Ext.getCmp('sourceWarehouseName').setValue(record.data.name); + // 刷新库存数据 +// top.Ext.getCmp('remark2').focus(); + }, + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { +// top.Ext.getCmp('remark2').focus(); + } + } + } + }] + },{ + layout : 'form', + columnWidth : 1, + labelWidth :70, + items : [{ + xtype : 'textarea', + fieldLabel : '备注', + id : 'remark2', + name : 'remark', + anchor : '98.5%', + height : 40, + readOnly:true + }] + }] + }] + },{ +// region : 'north', +// columnWidth : 1, + labelWidth : 30, +// buttonAlign : 'center', +// labelAlign : 'right', +// split : true, +// border : 0, +// frame : true, +// bodyStyle : 'padding:0px auto;margin:0px',// padding:1px;padding-top:5px; + height : 60, + layout : 'form', + items : [{ + layout : 'column', + height : 40, + labelWidth : 100, + items : [{ + columnWidth : .3, + layout : 'form', + labelWidth : 100, + items : [{ + xtype : 'datefieldWithMin', + id:'query_startDate', + name : 'query_startDate', + fieldLabel : '灭菌开始时间', + format : 'Y-m-d H:i:s', +// value : startDate, + anchor : '95%', + listeners : { + specialkey : function(field, e) { + + } + } + }] + },{ + columnWidth : .3, + layout : 'form', + labelWidth : 100, + items : [{ + xtype : 'datefieldWithMin', + id:'query_endDate', + name : 'query_endDate', + fieldLabel : '灭菌结束时间', + format : 'Y-m-d H:i:s', +// value : new Date(), + anchor : '95%' + }] + }] + }], + buttonAlign :'center', + buttons:[{ + text : '今天', + minWidth : 70, + handler : function() { + var startDate = top.Ext.getCmp('query_startDate'); + var endTime = top.Ext.getCmp('query_endDate'); + startDate.setValue((new Date()).clearTime()); + endTime.setValue((new Date()).clearTime().add(Date.DAY,1).add(Date.SECOND,-1) ); + } + },{ + text : '昨天', + minWidth : 70, + handler : function() { + var startDate = top.Ext.getCmp('query_startDate'); + var endTime = top.Ext.getCmp('query_endDate'); + startDate.setValue((new Date()).clearTime().add(Date.DAY,-1)); + endTime.setValue((new Date()).clearTime().add(Date.DAY,0).add(Date.SECOND,-1) ); + + } + },{ + text : '最近三天', + minWidth : 70, + handler : function() { + var startDate = top.Ext.getCmp('query_startDate'); + var endTime = top.Ext.getCmp('query_endDate'); + startDate.setValue((new Date()).clearTime().add(Date.DAY,-2)); + endTime.setValue((new Date()).clearTime().add(Date.DAY,1).add(Date.SECOND,-1) ); + + } + },{ + text : '查询', + minWidth : 70, + iconCls : 'icon_search', + handler : function() { + reLoadTousses(); + } + },{ + + text : '重置', + minWidth : 70, + iconCls : 'icon_set', + handler : function() { + top.Ext.getCmp('query_startDate').setValue(''); + top.Ext.getCmp('query_endDate').setValue(''); + } + }] + },{ + layout:'column', + items:[{ + layout : 'form', + columnWidth : 0.40, + items:[ + new top.Ext.grid.EditorGridPanel({ + id : 'sendOutGoods', + store : sendOutGoodsStore, + columnWidth : 0.5, + cm : cm, + width : 385, + height : 425, + autoExpandColumn : 'deleteItem', + enableHdMenu : false, + frame : false, + bodyStyle : 'border:1px solid #afd7af', + viewConfig: { + autoFit:true + }, + clicksToEdit : 1,// 设置点击几次才可编辑 + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }) + } + )] + },{ + layout : 'form', + columnWidth : 0.60, + items:[new top.Ext.grid.EditorGridPanel({ + id : 'auxiliaryInvoice_sendOutGoodsDetail', + title : '待发货器械包', + store : recyclingapplicationStore, + cm : recyclingapplicationCm, + enableHdMenu : false, + width :590, + height :425, + loadMask : true, + tbar:[{ + text: "添加", + id : 'addTousseInstanceBtn', + handler : function(){ + addTousse(); + } + },{ + text: "", + id : 'tousseAmountInfo' + }], + autoExpandColumn : 'showTousseName', + frame : false, + bodyStyle : 'border:1px solid #afd7af', + viewConfig: { + autoFit:true, + getRowClass : function(record,rowIndex,rowParams,store){ + if(record.data.added){ + return 'my_row_green'; + }else{ + return 'my_row_yellow'; + } + } + }, + clicksToEdit:1, + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }), + listeners:{ + validateedit : function(o){ + if(!isPositiveInteger(o.value))return false; + } + } + })] + } + ] + }], + buttons : [{ + text : '保存', + id:'saveButton', + handler : function(){doSaveAction();} + }, { + text : '取消', + handler : function() { + //切记注意:按取消关闭window后,一定要把已选择的申请单号变量清空 + selectedInvoicePlanId = ""; + auxiliaryInvoiceFormWindow.close(); + } + }] + }); + + Ext.Ajax.request({ + url : WWWROOT + '/disinfectSystem/invoicePlanAction!loadDepartApplicationInfo.do', + params : {orgUnitCoding : orgUnitCoding}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + var remark = result.remark; + top.Ext.getCmp('remark2').setValue(remark); + }, + failure : function(form, action) { + } + }); + var cookieSender = Ext.state.Manager.getProvider().get('cookieSender'); + if(cookieSender){ + top.Ext.getCmp('sender').setValue(cookieSender); + } + var cookiePersonInCharge = Ext.state.Manager.getProvider().get('cookiePersonInCharge'); + var cookiePersonInChargeCode = Ext.state.Manager.getProvider().get('cookiePersonInChargeCode'); + if(cookiePersonInCharge){ + top.Ext.getCmp('personInCharge').setValue(cookiePersonInCharge); + } + if(cookiePersonInChargeCode){ + top.Ext.getCmp('personInChargeCode').setValue(cookiePersonInChargeCode); + } + + var auxiliaryInvoiceFormWindow = new top.Ext.Window( { + id : 'recyclingApplicationWin', + layout : 'fit', + title : '发货单', + width : 1020, + height : 730, + border : false, + modal : true, + plain : true, + items : [form] + }); + + auxiliaryInvoiceFormWindow.on('close',function(w){ + //切记注意:按取消关闭window后,一定要把已选择的申请单号变量清空 + selectedInvoicePlanId = ""; + auxiliaryInvoiceFormOpened = false; + top.getCurrentTab().focus(); + }); + + auxiliaryInvoiceFormWindow.show(); + + if(project == 'gdsy'){ + if(openMode == INVOICE_FORM_OPEN_MODE_SCANBARCODE){ + var sender = top.Ext.getCmp('sender').getValue(); + var personInCharge = top.Ext.getCmp('personInCharge').getValue(); + if(isUndefinedOrNullOrEmpty(sender)){ + top.Ext.getCmp('senderBarcode').focus(false, 100); + }else{ + if(isUndefinedOrNullOrEmpty(personInCharge)){ + top.Ext.getCmp('personInChargeBarcode').focus(false, 100); + }else{ + top.Ext.getCmp('scanText').focus(false, 100); + } + } + }else{ + top.Ext.getCmp('senderBarcode').focus(false, 100); + } + }else{ + top.Ext.getCmp(defaultFocusedFieldOnInvoiceForm).focus(false, 100); + } + +// top.Ext.getCmp('senderBarcode').focus(false, 100); + + var sendOutGoodsDetailGrid = top.Ext.getCmp('auxiliaryInvoice_sendOutGoodsDetail'); + wareHouseStore.load(); + departApplicationStore.load(); +} +function reLoadTousses(){ + recyclingapplicationStore.load(); +} +function addTousse(){ + var rows = top.Ext.getCmp('auxiliaryInvoice_sendOutGoodsDetail').getSelectionModel().getSelections();// 返回值为 + if (rows) { + for ( var i = 0; i < rows.length; i++) { +// var name = rows[i].data['name']; +// var amount = rows[i].data['count']; +// recyclingapplicationStore.remove(rows[i]); + addOneTousse(rows[i]); + rows[i].set('added',true); + } + auxiliaryInvoice_refreshTotalAmount(); + top.Ext.getCmp('auxiliaryInvoice_sendOutGoodsDetail').getSelectionModel().clearSelections(); + } +} +function addOneTousse(r){ + var tousse = r.data; + var goods = getSendOutGoodsByBarcode(tousse.barcode); + if(goods != null){ + showResult('条形码:'+tousse.barcode+' 已经存在!'); + return false; + } + var record = new auxiliaryInvoice_addGridItem({ + id : tousse.id, + barcode : tousse.barcode, + name : tousse.name, + showTousseName : tousse.showTousseName, + count : 1, + diposable : tousse.diposable, +// price : price, +// fluctuationPrice : goods.fluctuationPrice, + storage : 1, +// batchNumber : goods.batchNumber, + tousseType : tousse.tousseType, +// typeInfoOnScanned : goods.typeInfoOnScanned, + sterilizerName : tousse.sterilizerName, + frequency : tousse.frequency, +// isTracable : tousse.isTracable, + tousseDefinitionId : tousse.tousseDefinitionId, + isRoutine : tousse.isRoutine + }); + sendOutGoodsStore.add(record); +} Index: ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/foreignProxyDisinfectionView.js =================================================================== diff -u -r16256 -r16376 --- ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/foreignProxyDisinfectionView.js (.../foreignProxyDisinfectionView.js) (revision 16256) +++ ssts-web/src/main/webapp/disinfectsystem/sterilizationmanager/sterilizationrecord/foreignProxyDisinfectionView.js (.../foreignProxyDisinfectionView.js) (revision 16376) @@ -1314,7 +1314,7 @@ success : function(form, action) { if(action.result.success){ showResult("保存成功。"); - window.close(); + foreignProxyDisinfectionFormWindow.close(); grid.dwrReload(); }else{ top.Ext.getCmp('saveBtn').enable(); @@ -1364,13 +1364,13 @@ }else{ showResult(action.result.msg); } - window.close(); + foreignProxyDisinfectionFormWindow.close(); grid.dwrReload(); }, failure : function(form, action) { if(!isUndefinedOrNullOrEmpty(action.result) && !isUndefinedOrNullOrEmpty(action.result.msg)){ showResult(action.result.msg); - window.close(); + foreignProxyDisinfectionFormWindow.close(); grid.dwrReload(); }else{ showResult("操作失败!"); @@ -1412,7 +1412,7 @@ }else{ showResult(action.result.msg); } - window.close(); + foreignProxyDisinfectionFormWindow.close(); }, failure : function(form, action) { if(!isUndefinedOrNullOrEmpty(action.result) && !isUndefinedOrNullOrEmpty(action.result.msg)){ @@ -1442,12 +1442,12 @@ },{ text : '取消', handler : function() { - window.close(); + foreignProxyDisinfectionFormWindow.close(); } }] }); - var window = new top.Ext.Window( { + var foreignProxyDisinfectionFormWindow = new top.Ext.Window( { id : 'foreignProxyDisinfectionWin', layout : 'fit', title : entityName + '单信息', @@ -1459,7 +1459,7 @@ items : [ form ] }); - window.show(); + foreignProxyDisinfectionFormWindow.show(); top.Ext.getCmp('scanBarcode').focus(false, 100); if(id){ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java =================================================================== diff -u -r16230 -r16376 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 16230) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/tousseitem/TousseItem.java (.../TousseItem.java) (revision 16376) @@ -467,6 +467,14 @@ } @Transient + public boolean isForeignTousse(){ + if(StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_FOREIGN) || StringUtils.equals(tousseType, TousseDefinition.PACKAGE_TYPE_SPLIT)){ + return true; + } + return false; + } + + @Transient public boolean isMaterialsLostOrDamage() { boolean materialsLost = false;// 是否有丢失材料 if (recyclingErrors != null) { Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java =================================================================== diff -u -r16309 -r16376 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java (.../TousseInstanceUtils.java) (revision 16309) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/toussedefinition/service/TousseInstanceUtils.java (.../TousseInstanceUtils.java) (revision 16376) @@ -177,6 +177,16 @@ return sterileStartDate; } + + public static String safelyGetSterileEndDateStr(TousseInstance tousseInstance) { + Date sterileEndDate = safelyGetSterileEndDate(tousseInstance); + String sterileStartDateStr = ""; + if (sterileEndDate != null) { + sterileStartDateStr = Constants.SIMPLEDATEFORMAT_YYYYMMDD + .format(sterileEndDate); + } + return sterileStartDateStr; + } /** * 将tousseInstance转换为json字符串。 * @param dateFormat 签收时间、审核时间、操作时间的显示格式 Index: ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedView.jsp =================================================================== diff -u -r16228 -r16376 --- ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedView.jsp (.../invoicePlanExtractedView.jsp) (revision 16228) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/invoicePlanExtractedView.jsp (.../invoicePlanExtractedView.jsp) (revision 16376) @@ -68,7 +68,7 @@ - +