Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManagerImpl.java =================================================================== diff -u -r21258 -r21546 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManagerImpl.java (.../DepartmentAppTemplateManagerImpl.java) (revision 21258) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManagerImpl.java (.../DepartmentAppTemplateManagerImpl.java) (revision 21546) @@ -1,31 +1,46 @@ package com.forgon.disinfectsystem.departmentapplicationtemplate.service; +import java.sql.ResultSet; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; -import com.forgon.tools.string.StringTools; import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.BooleanUtils; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.CssdHandleTousses; +import com.forgon.directory.model.CssdServiceDepts; +import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DepartmentAppTemplate; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DiposableGoodsTemplateItem; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.TousseDefinitionTemplateItem; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; +import com.forgon.exception.SystemException; import com.forgon.tools.MathTools; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; public class DepartmentAppTemplateManagerImpl implements DepartmentAppTemplateManager { @@ -37,6 +52,8 @@ private DiposableGoodsManager diposableGoodsManager; + private DateQueryAdapter dateQueryAdapter; + public void setTousseDefinitionManager( TousseDefinitionManager tousseDefinitionManager) { this.tousseDefinitionManager = tousseDefinitionManager; @@ -55,6 +72,14 @@ this.diposableGoodsManager = diposableGoodsManager; } + public DateQueryAdapter getDateQueryAdapter() { + return dateQueryAdapter; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + @Override public boolean verifyAppTemplate(String id, String name) { String sql = "where po.title = '" + name + "'"; @@ -480,12 +505,155 @@ } @Override + public void dynamicGenerateDepartTousseApplyTemplate() { + Calendar calendar = Calendar.getInstance(); + Date now = calendar.getTime(); + //一个月前 + calendar.add(Calendar.MONTH, -1); + Date lastMonthDate = calendar.getTime(); + String currentOrgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); + String operator = AcegiHelper.getLoginUserFullName(); + //1.统计近一个月内所有回收记录有关的科室及器械包(按回收次数由大到小降序),结果保存至List或jsonArray集合中 + String departTousseRecycCountSql = "select rr.departCode,cht.tousseDefinitionId from "+ RecyclingRecord.class.getSimpleName() +" rr " + + "join "+ RecyclingItem.class.getSimpleName() +" ri on rr.id=ri.recyclingRecord_id " + + "join "+ CssdServiceDepts.class.getSimpleName() +" csd on csd.clinicOrgUnitCode=rr.departCode " + + "join "+ OrgUnit.class.getSimpleName() +" ou on rr.id=ri.recyclingRecord_id " + + "join "+ TousseDefinition.class.getSimpleName() +" td on td.id=ri.tousseDefinitionId " + + "join "+ TousseDefinition.class.getSimpleName() +" tdAncestor on tdAncestor.id=td.ancestorID " + + "join "+ CssdHandleTousses.class.getSimpleName() +" cht on cht.tousseDefinitionId=tdAncestor.id " + + "where rr.orgUnitCoding='"+ currentOrgUnitCode +"' and csd.cssdOrgUnitCode='"+ currentOrgUnitCode +"' and cht.orgUnitCode='"+ currentOrgUnitCode +"' " + + "and recyclingTime between "+ dateQueryAdapter.dateAdapter(lastMonthDate) +" and "+ dateQueryAdapter.dateAdapter(now) +" " + + "and rr.departCode is not null and ri.tousseDefinitionId is not null " + + "and tdAncestor.tousseType in ('"+ TousseDefinition.PACKAGE_TYPE_INSIDE +"','"+ TousseDefinition.PACKAGE_TYPE_DISINFECTION +"') " + + "group by rr.departCode,cht.tousseDefinitionId " + + "order by rr.departCode , count(0) desc"; + //map的key为科室编码,value为器械包定义id + Map> departTousseRecycCountMap = new HashMap>(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(departTousseRecycCountSql); + while(rs.next()){ + String departCode = rs.getString("departCode"); + Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); + if(StringUtils.isBlank(departCode) || !DatabaseUtil.isPoIdValid(tousseDefinitionId)){ + continue; + } + //1.判断科室编码在外层的map是否已经存在 + if(departTousseRecycCountMap.containsKey(departCode)){ + //如果存在,则查询该key的value是否为空 + List tousseList = departTousseRecycCountMap.get(departCode); + if(tousseList == null){ + //如果为空需要重新创建 + tousseList = new ArrayList(); + tousseList.add(tousseDefinitionId); + departTousseRecycCountMap.put(departCode, tousseList); + }else{ + //如果不为空则直接赋值 + tousseList.add(tousseDefinitionId); + departTousseRecycCountMap.put(departCode, tousseList); + } + }else{ + //如果不存在,map需要重新创建 + List tousseList = new ArrayList(); + tousseList.add(tousseDefinitionId); + departTousseRecycCountMap.put(departCode, tousseList); + } + } + } catch (Exception e) { + e.printStackTrace(); + }finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + + //3.遍历所有的科室,查出各科室的第一个单独的模板,如果没有则新建 + if(departTousseRecycCountMap.size() > 0){ + //只取回收次数前10的 + int topNumber = 10; + for (String departCode : departTousseRecycCountMap.keySet()) { + OrgUnit orgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", departCode); + if(orgUnit == null){ + + continue; + } + String database = CssdUtils.getConfigProperty("database"); + String condition = ""; + if(DatabaseUtil.isSqlServer(database)){ + condition = "where convert(varchar , orgUnitCode)='"+ departCode +"'"; + }else if(DatabaseUtil.isOracle(database)){ + condition = "where to_char(orgUnitCode)='"+ departCode +"'"; + }else{ + throw new SystemException("不支持的数据库类型:" + database); + } + DepartmentAppTemplate departmentAppTemplate = + (DepartmentAppTemplate)objectDao.getBySql(DepartmentAppTemplate.class.getSimpleName(), + condition + " order by operationTime"); + + Integer lastTousseDefinitionTemplateItemSequence = 0; + List orginalTousseDefinitionTemplateItems = null; + List tousseDefinitionTemplateItems = new ArrayList(); + if(departmentAppTemplate == null){ + //创建该科室的申领模板 + departmentAppTemplate = new DepartmentAppTemplate(); + departmentAppTemplate.setOperationTime(now); + departmentAppTemplate.setOperator(operator); + departmentAppTemplate.setOrgUnitCode(departCode); + departmentAppTemplate.setSequence(1); + departmentAppTemplate.setTemplateType(DepartmentAppTemplate.TEMPLATE_TYPE_TOUSSE1); + departmentAppTemplate.setTitle("【自动生成】" + orgUnit.getName()); + }else { + orginalTousseDefinitionTemplateItems = departmentAppTemplate.getTousseDefinitionTemplateItems(); + if(CollectionUtils.isNotEmpty(orginalTousseDefinitionTemplateItems)){ + tousseDefinitionTemplateItems.addAll(orginalTousseDefinitionTemplateItems); + //对集合内的元素按序号排序 + Collections.sort(orginalTousseDefinitionTemplateItems); + lastTousseDefinitionTemplateItemSequence = orginalTousseDefinitionTemplateItems.get(0).getSortNumber(); + if(lastTousseDefinitionTemplateItemSequence == null){ + lastTousseDefinitionTemplateItemSequence = 0; + } + } + } + + //该科室的器械包 + List tousseList = departTousseRecycCountMap.get(departCode); + int loopNumber = Math.min(tousseList.size(), topNumber); + int index = 1; + for(Long tousseDefinitionId : tousseList){ + if(index++ > loopNumber){ + break; + } + //判断该器械包定义id是否已经存在于该科室的器械包模板里,如果已经存在则continue + boolean existsInTemplate = false; + if(CollectionUtils.isNotEmpty(orginalTousseDefinitionTemplateItems)){ + for (TousseDefinitionTemplateItem tousseDefinitionTemplateItem : orginalTousseDefinitionTemplateItems) { + if(tousseDefinitionId.longValue() == tousseDefinitionTemplateItem.getTousseDefinition().getId().longValue()){ + existsInTemplate = true; + break; + } + } + if(existsInTemplate){ + continue; + } + } + //4.将各科室回收次数排名前10(不足10个的有几个算几个)的器械包添加到模板中(如果模板已有,则追加到后面) + TousseDefinitionTemplateItem tousseDefinitionTemplateItem = new TousseDefinitionTemplateItem(); + tousseDefinitionTemplateItem.setSortNumber(++lastTousseDefinitionTemplateItemSequence); + tousseDefinitionTemplateItem.setTousseDefinition((TousseDefinition)objectDao.getByProperty(TousseDefinition.class.getSimpleName(), "id", tousseDefinitionId)); + tousseDefinitionTemplateItem.setDepartmentAppTemplate(departmentAppTemplate); + tousseDefinitionTemplateItems.add(tousseDefinitionTemplateItem); + departmentAppTemplate.setTousseDefinitionTemplateItems(tousseDefinitionTemplateItems); + objectDao.saveOrUpdate(departmentAppTemplate); + } + + } + } + } + + @Override public DepartmentAppTemplate getAppTemplateByTitle(String title) { if(StringUtils.isNotBlank(title)){ return (DepartmentAppTemplate)objectDao.getByProperty(DepartmentAppTemplate.class.getSimpleName(), "title", title); } return null; } - } Index: ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/config.js =================================================================== diff -u -r21395 -r21546 --- ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/config.js (.../config.js) (revision 21395) +++ ssts-web/src/main/webapp/disinfectsystem/config/jmszxyy/config.js (.../config.js) (revision 21546) @@ -1,4 +1,4 @@ -var sstsConfig = { +var sstsConfig = { // 禁用标识牌功能 disableIdCard : true, // 回收时科室显示结算科室 @@ -42,7 +42,7 @@ //只有装配完成才能使用清洗篮筐回收 recycleClassifyBasketAfterPacked:false, //物品签收支持哪种单扫描:申请单(1)或发货单(2),只能选其一 - serialNumberSignType : 2 - - + serialNumberSignType : 2, + //是否启用根据器械包回收次数生成科室的器械包模板按钮 + enableDynamicGenerateDepartTousseApplyTemplateButton : true } \ No newline at end of file Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManager.java =================================================================== diff -u -r20903 -r21546 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManager.java (.../DepartmentAppTemplateManager.java) (revision 20903) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/service/DepartmentAppTemplateManager.java (.../DepartmentAppTemplateManager.java) (revision 21546) @@ -6,7 +6,6 @@ import net.sf.json.JSONObject; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; -import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DepartmentAppTemplate; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DiposableGoodsTemplateItem; import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.TousseDefinitionTemplateItem; @@ -62,8 +61,14 @@ String departmentAppTempalteId); public void deleteAppTemplate(String id); - + /** + * 根据科室的器械包回收次数生该该科室的器械包申请模板(如果该科室已有单独的申领模板,则在原模板后面追加器械包、否则生成新的模板) + * 供应室用户只对自己科室回收的科室的器械包回收次数进行统计,根据统计结果生成申领模板 + */ + public void dynamicGenerateDepartTousseApplyTemplate(); + + /** * 获取模版里面配置的器械包. * @param templates * @return Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.jsp =================================================================== diff -u -r17150 -r21546 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.jsp (.../departmentAppTemplateView.jsp) (revision 17150) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.jsp (.../departmentAppTemplateView.jsp) (revision 21546) @@ -25,6 +25,7 @@ + Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/action/DepartmentAppTemplateAction.java =================================================================== diff -u -r19824 -r21546 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/action/DepartmentAppTemplateAction.java (.../DepartmentAppTemplateAction.java) (revision 19824) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/departmentapplicationtemplate/action/DepartmentAppTemplateAction.java (.../DepartmentAppTemplateAction.java) (revision 21546) @@ -33,8 +33,11 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; +import com.forgon.exception.SystemException; import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; @@ -392,6 +395,23 @@ } } + /** + * 根据科室的器械包回收次数生该该科室的器械包申请模板(如果该科室已有单独的申领模板,则在原模板后面追加器械包、否则生成新的模板) + */ + public void dynamicGenerateDepartTousseApplyTemplate(){ + JSONObject result = JSONUtil.buildJsonObject(false); + try{ + departmentAppTemplateManager.dynamicGenerateDepartTousseApplyTemplate(); + JSONUtil.addLogProperty(result, JSONUtil.JSON_KEY_SUCCESS, true); + }catch(SystemException se){ + JSONUtil.addLogProperty(result, JSONUtil.JSON_KEY_MESSAGE, se.getMessage()); + }catch (Exception e) { + JSONUtil.addLogProperty(result, JSONUtil.JSON_KEY_MESSAGE, "操作失败!"); + }finally{ + StrutsResponseUtils.output(result); + } + } + @Override public void prepare() throws Exception { String id = StrutsParamUtils.getPraramValue("id", ""); Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.js =================================================================== diff -u -r20440 -r21546 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.js (.../departmentAppTemplateView.js) (revision 20440) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/departmentapptemplate/departmentAppTemplateView.js (.../departmentAppTemplateView.js) (revision 21546) @@ -38,6 +38,46 @@ }); } + +//根据科室的器械包回收次数生该该科室的器械包申请模板(如果该科室已有单独的申领模板,则在原模板后面追加器械包、否则生成新的模板) +function dynamicGenerateDepartTousseApplyTemplateOrderByRecycCount(){ + top.Ext.MessageBox.confirm("请确认", "是否确定要按器械包回收次数生成模板?", + function(button, text) { + if ("yes" == button){ + var mask = new Ext.LoadMask(Ext.getBody(), { + msg : "后台处理中,请稍候..." + }); + mask.show(); + //设置ext ajax超时时间为两分钟(设置后会对所有的ajax request请求都有效,所以本次请求完成后需设置回默认值) + Ext.Ajax.timeout = 120 * 1000;//120秒(2分钟) + Ext.Ajax.request({ + url : WWWROOT + '/disinfectSystem/baseData/departmentAppTemplateAction!dynamicGenerateDepartTousseApplyTemplate.do', + //timeout : 60 * 1000,//发现并不生效 + params : { + + },success : function(response, options) { + mask.hide(); + grid.dwrReload(); + showResult('模板生成成功'); + //恢复设置ext ajax超时时间为30秒 + Ext.Ajax.timeout = 30 * 1000;//30秒 + }, + failure : function(response, options) { + mask.hide(); + var result = Ext.decode(response.responseText); + if(result && result.message){ + showResult(result.message); + }else{ + showResult("服务器繁忙,请稍后再试!"); + //恢复设置ext ajax超时时间为30秒 + Ext.Ajax.timeout = 30 * 1000;//30秒 + } + } + }); + } + }); +} + var loadFormData = function(grid) { var records = grid.getSelectionModel().getSelections(); if (records.length == 0) { @@ -134,6 +174,14 @@ handler : function() { deleteTempalate(grid); } + }, '-', { + text : '生成科室器械包申请模板', + hidden : sstsConfig.enableDynamicGenerateDepartTousseApplyTemplateButton != true, + iconCls : 'btn_ext_application_edit', + handler : function() { + //根据科室的器械包回收次数生该该科室的器械包申请模板(如果该科室已有单独的申领模板,则在原模板后面追加器械包、否则生成新的模板) + dynamicGenerateDepartTousseApplyTemplateOrderByRecycCount(); + } }]; var dwrCallParams = null;