Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java =================================================================== diff -u -r20495 -r20529 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 20495) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManagerImpl.java (.../InvoicePlanManagerImpl.java) (revision 20529) @@ -66,13 +66,18 @@ import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyItem; +import com.forgon.disinfectsystem.entity.sterilizationmanager.proxydisinfection.ProxyDisinfection; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.idpredicate.IDOperators; import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.recyclingapplication.factory.DeliverManagerFactory; import com.forgon.disinfectsystem.recyclingapplication.updateLog.ApplicationLogManager; +import com.forgon.disinfectsystem.recyclingapplication.vo.ApplicationGoodsVo; +import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceInvoicePlanVo; import com.forgon.disinfectsystem.recyclingapplication.vo.GridDataVo; import com.forgon.disinfectsystem.recyclingapplication.vo.InvoicePlanVo; +import com.forgon.disinfectsystem.recyclingapplication.vo.MaterialVO; +import com.forgon.disinfectsystem.recyclingapplication.vo.TousseItemVoForApplicationGoodsVo; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; @@ -264,6 +269,91 @@ return resultCol; } + public Collection getExpressInvoiceInvoiePlans(Collection departCodes, String applyDate, String tousseType){ + Map expressInvoiceInvoicePlanVoMap = new HashMap(); + List tousseDefinitionIdList = tousseDefinitionManager.getProperty("id", String.format("expressInvoice='%s'", Constants.STR_YES)); + List expressInvoiceInvoicePlanVoList = new ArrayList(); + if(CollectionUtils.isEmpty(tousseDefinitionIdList)){ + return expressInvoiceInvoicePlanVoList; + } + Set tousseDefinitionIdSet = new HashSet(tousseDefinitionIdList); + String sql = + buildSqlForGetInvoicePlanByOrgUnitCodingsAndTousseType(departCodes, applyDate, tousseType); + String tousseSql = String.format(" po.id in (select invoicePlan.id from TousseItem where (%s) )",SqlUtils.getNonStringFieldInCollectionsPredicate("tousseDefinitionId", tousseDefinitionIdList)); +// sql += " ORDER BY sequence, applicationTime"; + +// return objectDao.findBySql(InvoicePlan.class.getSimpleName(), sql); + String hql = String.format("select distinct po from %s po inner join fetch po.applicationItems %s and %s", InvoicePlan.class.getSimpleName(),sql,tousseSql); + List list = objectDao.findByHql(hql); + if(CollectionUtils.isEmpty(list)){ + return expressInvoiceInvoicePlanVoList; + } + SupplyRoomConfig config = supplyRoomConfigManager.getSystemParamsObj(); + String invoiceOrigin = config.getInvoiceOrigin(); + boolean recycledDeliver = config.getAfterRecyclingTousseDeliver(); + for (InvoicePlan invoicePlan : list) { + List applicationItems = invoicePlan.getApplicationItems(); + if(CollectionUtils.isEmpty(applicationItems)){ + continue; + } + Long invoicePlanId = invoicePlan.getId(); + String departCoding = invoicePlan.getDepartCoding(); + for (TousseItem applicationItem : applicationItems) { + if(applicationItem.isDisinfection()){ + continue;// 不包括消毒物品 + } + if(!applicationItem.traceable()){ + continue;// 只包括不追溯的物品 + } + Long tousseDefinitionId = applicationItem.getTousseDefinitionId(); + if(!tousseDefinitionIdSet.contains(tousseDefinitionId)){ + continue; + } + if(TousseItemUtils.filterTousseItem(config, invoicePlan, applicationItem)){ + continue; + } + String tousseName = applicationItem.getTousseName(); + + int appAmount = 0; + if(invoicePlan.isOperationReservationApplication() + || invoicePlan instanceof ProxyDisinfection + || invoicePlan instanceof ForeignProxyDisinfection){ + appAmount = applicationItem.getAmount(); + }else{ + appAmount = CssdUtils.getWaitDeliverAmount(applicationItem, + invoiceOrigin, recycledDeliver, invoicePlan, objectDao); + } + // 验证未发货或部分发货的物品 + if (appAmount == 0) + continue; + + Integer sendOutAmount = applicationItem.getSendOutAmount(); + if (sendOutAmount == null) + continue; + // 未发数量 = 申请数量-发货数量 + int notSendAmount = appAmount - sendOutAmount; + if (notSendAmount <= 0) + continue; + + ExpressInvoiceInvoicePlanVo vo = expressInvoiceInvoicePlanVoMap.get(tousseDefinitionId); + if(vo == null){ + vo = new ExpressInvoiceInvoicePlanVo(); + vo.setTousseDefinitionId(tousseDefinitionId); + vo.setTousseName(tousseName); + expressInvoiceInvoicePlanVoMap.put(tousseDefinitionId, vo); + } + vo.getInvoicePlanIdSet().add(invoicePlanId); + vo.getDepartCodingSet().add(departCoding); + vo.setAppAmount(vo.getAppAmount()+notSendAmount); + } + } + if(!expressInvoiceInvoicePlanVoMap.isEmpty()){ + expressInvoiceInvoicePlanVoList = new ArrayList(expressInvoiceInvoicePlanVoMap.values()); + } + + return expressInvoiceInvoicePlanVoList; + } + private void filterEmptyInvoicePlan(Collection invoicePlans){ if(invoicePlans != null){ List delList = new LinkedList(); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java =================================================================== diff -u -r20495 -r20529 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 20495) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/InvoicePlanManager.java (.../InvoicePlanManager.java) (revision 20529) @@ -17,6 +17,7 @@ import com.forgon.disinfectsystem.entity.invoicemanager.LostMaterialItem; import com.forgon.disinfectsystem.entity.invoicemanager.TimeQuantum; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceInvoicePlanVo; import com.forgon.disinfectsystem.recyclingapplication.vo.InvoicePlanVo; import com.forgon.disinfectsystem.vo.ApplicationItemVO; import com.forgon.disinfectsystem.vo.RecyclingApplicationVo; @@ -42,6 +43,10 @@ */ public Collection getDepartInvoicePlan(Collection departCodes, String applyDate, String tousseType); + public Collection getExpressInvoiceInvoiePlans(Collection departCodes, String applyDate, String tousseType); + + + /** * 按条件查询科室的待发货以及部分发货的发货计划单,不进行分组统计 * 根据科室分组(科室编码间采用分号分隔),申请日期(开始日期与结束日期间采用分号分隔),物品类型等查询发货计划 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressInvoiceInvoicePlanVo.java =================================================================== diff -u -r20517 -r20529 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressInvoiceInvoicePlanVo.java (.../ExpressInvoiceInvoicePlanVo.java) (revision 20517) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/vo/ExpressInvoiceInvoicePlanVo.java (.../ExpressInvoiceInvoicePlanVo.java) (revision 20529) @@ -3,6 +3,9 @@ */ package com.forgon.disinfectsystem.recyclingapplication.vo; +import java.util.HashSet; +import java.util.Set; + /** * @author jeffli 2017年10月26日 下午5:15:15 * @@ -20,54 +23,55 @@ /** * 科室总数 */ - private String departAmount; + private int departAmount; /** * 申请单总数 */ - private String invoicePlanAmount; + private int invoicePlanAmount; /** * 申请总数 */ - private String appAmount; - + private int appAmount; + + private Set invoicePlanIdSet = new HashSet(); + private Set departCodingSet = new HashSet(); + public Long getTousseDefinitionId() { return tousseDefinitionId; } - - public void setTousseDefinitionId(Long tousseDefinitionId) { - this.tousseDefinitionId = tousseDefinitionId; - } - public String getTousseName() { return tousseName; } - - public String getDepartAmount() { - return departAmount; + public int getDepartAmount() { + return departCodingSet.size(); } - - public String getInvoicePlanAmount() { - return invoicePlanAmount; + public int getInvoicePlanAmount() { + return invoicePlanIdSet.size(); } - - public String getAppAmount() { + public int getAppAmount() { return appAmount; } - + public void setTousseDefinitionId(Long tousseDefinitionId) { + this.tousseDefinitionId = tousseDefinitionId; + } public void setTousseName(String tousseName) { this.tousseName = tousseName; } - - public void setDepartAmount(String departAmount) { + public void setDepartAmount(int departAmount) { this.departAmount = departAmount; } - - public void setInvoicePlanAmount(String invoicePlanAmount) { + public void setInvoicePlanAmount(int invoicePlanAmount) { this.invoicePlanAmount = invoicePlanAmount; } - - public void setAppAmount(String appAmount) { + public void setAppAmount(int appAmount) { this.appAmount = appAmount; } + public Set getInvoicePlanIdSet() { + return invoicePlanIdSet; + } + public Set getDepartCodingSet() { + return departCodingSet; + } + } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java =================================================================== diff -u -r20495 -r20529 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java (.../InvoicePlanAction.java) (revision 20495) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/InvoicePlanAction.java (.../InvoicePlanAction.java) (revision 20529) @@ -46,6 +46,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyDisinfection; import com.forgon.disinfectsystem.entity.sterilizationmanager.foreignproxydisinfection.ForeignProxyItem; import com.forgon.disinfectsystem.recyclingapplication.service.InvoicePlanManager; +import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceInvoicePlanVo; import com.forgon.disinfectsystem.recyclingapplication.vo.InvoicePlanVo; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousseitem.service.TousseItemManager; @@ -380,6 +381,23 @@ } /** + * 快速发货列表 + */ + public void getExpressInvoiceInvoiePlansByDepartCodes() { + String departCode = StrutsParamUtils.getPraramValue("departCode", ""); + String[] departCodes = StringUtils.split(departCode, ';'); + + String applyDate = StrutsParamUtils.getPraramValue("applyDate", ""); + + String tousseType = StrutsParamUtils.getPraramValue("tousseType", ""); + + Collection vos = invoicePlanManager + .getExpressInvoiceInvoiePlans(Arrays.asList(departCodes),applyDate ,tousseType); + + StrutsResponseUtils.output(JSONArray.fromObject(vos)); + } + + /** * 只查询发货计划单(不按部门及申请单类型统计) * request请求参数 * 1.departCode 分组(科室编码组,中间采用分号分隔),一般只会传一个科室编码 Index: ssts-web/src/main/webapp/disinfectsystem/invoice/expressInvoiceView.js =================================================================== diff -u -r20509 -r20529 --- ssts-web/src/main/webapp/disinfectsystem/invoice/expressInvoiceView.js (.../expressInvoiceView.js) (revision 20509) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/expressInvoiceView.js (.../expressInvoiceView.js) (revision 20529) @@ -195,7 +195,7 @@ function getTimeComboData() { var dateHelper = new DateHelper(); var applyDateDataArray = [['全部', '']]; - var format = sstsConfig.timeSearchFmt ? 'yyyy-MM-dd HH:mm' : 'yyyy-MM-dd'; + var format = sstsConfig.expressInvoiceViewTimeSearchFmt ? 'yyyy-MM-dd HH:mm' : 'yyyy-MM-dd'; var url = WWWROOT + '/system/serverTimeAction!getInvoicePlanComboTime.do'; dateHelper.getServerTimeByJQ(format, Ext, url, function (result) { var time = result.time; @@ -246,47 +246,42 @@ store : new Ext.data.Store({ autoLoad: false, proxy : new Ext.data.HttpProxy({ - url : WWWROOT + '/disinfectSystem/invoicePlanAction!getDepartInvoiePlansByDepartCodes.do', + url : WWWROOT + '/disinfectSystem/invoicePlanAction!getExpressInvoiceInvoiePlansByDepartCodes.do', method : 'POST' }), reader : new Ext.data.JsonReader({ fields : [ - {name : 'departCode'} - ,{name : 'depart'} - ,{name : 'remark'} - ,{name : 'urgency'} + {name : 'tousseName'} + ,{name : 'departAmount'} + ,{name : 'invoicePlanAmount'} + ,{name : 'appAmount'} ] }) , sortInfo: { - field: 'urgency', - direction: 'DESC' // 'ASC'or 'DESC' + field: 'tousseName', + direction: 'ASC' // 'ASC'or 'DESC' } }), height : 325, width : 485, bodyStyle : 'border:1px solid #afd7af', sm : selectModel, cm : new top.Ext.grid.ColumnModel([selectModel, - {header : "紧急度",width : 20,dataIndex : 'urgency', renderer : urgencyIconRender3}, - {header : "科室",width : 50,dataIndex : 'depart',menuDisabled:true,renderer : renderCallModifyFunction}, - {id:'remark',header : "备注",width : 130,dataIndex : 'remark',menuDisabled:true} + {id:'tousseName',header : "物品名称",width : 50,dataIndex : 'tousseName',menuDisabled:true,renderer : renderCallModifyFunction}, + {header : "科室总数",width : 50,dataIndex : 'departAmount',menuDisabled:true}, + {header : "申请单总数",width : 50,dataIndex : 'invoicePlanAmount',menuDisabled:true}, + {header : "发货总数",width : 50,dataIndex : 'appAmount',menuDisabled:true} ]), - autoExpandColumn : 'remark', + autoExpandColumn : 'tousseName', frame : false, viewConfig: { forceFit:true, //是否隔行换色 stripeRows: false, - getRowClass : function(record,rowIndex,rowParams,store){ - //借物单高亮 - var remark = record.get('remark'); - if (remark.indexOf("借物单") != -1){ - return 'BorrowList'; - } - } + getRowClass : function(record,rowIndex,rowParams,store){} }, loadMask:{msg:'正在加载,请稍候...'}, - title : '发货计划列表', + title : '快速发货列表', tbar : [{ text : '科室分组:' },{ @@ -334,32 +329,34 @@ }, anchor : '95%' },{ - text : '开始日期:' + text : '开始日期 :' },{ - xtype : sstsConfig.timeSearchFmt ? 'datefieldWithMin' : 'datefield', + xtype : sstsConfig.expressInvoiceViewTimeSearchFmt ? 'datefieldWithMin' : 'datefield', fieldLabel : '开始日期', name : 'startDate', - format : sstsConfig.timeSearchFmt || 'Y-m-d', + format : sstsConfig.expressInvoiceViewTimeSearchFmt || 'Y-m-d', id : 'startDate', readOnly : false, editable : false, - width : sstsConfig.timeSearchFmt ? 150 : 100 + width : sstsConfig.expressInvoiceViewTimeSearchFmt ? 150 : 100 },{ text : '结束日期:' },{ - xtype : sstsConfig.timeSearchFmt ? 'datefieldWithMin' : 'datefield', + xtype : sstsConfig.expressInvoiceViewTimeSearchFmt ? 'datefieldWithMin' : 'datefield', fieldLabel : '结束日期', name : 'endDate', id : 'endDate', readOnly : false, editable : false, - // altFormats: sstsConfig.timeSearchFmt || '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 : sstsConfig.timeSearchFmt || 'Y-m-d', - width : sstsConfig.timeSearchFmt ? 150 : 100 + // altFormats: sstsConfig.expressInvoiceViewTimeSearchFmt || '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 : sstsConfig.expressInvoiceViewTimeSearchFmt || 'Y-m-d', + width : sstsConfig.expressInvoiceViewTimeSearchFmt ? 150 : 100 }, { - text : '物品类型:' + text : '物品类型:', + hidden: true },{ xtype : 'multiSelect', + hidden: true, id : 'tousseType', name : 'tousseType', valueField : 'value', @@ -391,6 +388,44 @@ }], listeners: { render : function() { + var tbar2 = new Ext.Toolbar ({ + hidden: true, + items : [{ + text : '申请单类型:' + }, + createAppFormCombo() + ,{ + text : '申请科室:' + }, + { + xtype : 'combo', + id : 'appDepart', + name : 'appDepart', + queryParam : 'spell', + minChars : 0, + valueField : 'departCode', + displayField : 'name', + store : appDepartJsonStore, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', +// hideTrigger : true, + typeAhead : false, + allowBlank : true, +// anchor : '99%', + listeners:{ + select:function(combo, record, index){ + + refreshList(); + }, + focus : function(thiz){ + thiz.selectText(); + } + } + } + ] + }); + tbar2.render(grid.tbar); // 自动加载列表 Ext.getCmp('tousseType').selectAll(); refreshList();