Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r16644 -r16820 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 16644) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 16820) @@ -2097,8 +2097,11 @@ - - + + + + + Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/GoodFilterConfig.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/GoodFilterConfig.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/GoodFilterConfig.java (revision 16820) @@ -0,0 +1,136 @@ +package com.forgon.disinfectsystem.goodFilterConfig.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Cascade; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author zhonghaowen + * @apiNote 物品黑白过滤名单模板实体类 + * @since 2017-01-11 + */ +@Entity +@Table(name = "GoodFilterConfig") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class GoodFilterConfig { + + /** + * 自增主键 + */ + private Long id; + + /** + * 模板名称 + */ + private String templateName; + + /** + * 操作人 + */ + private String operator; + + /** + * 修改时间 + */ + private Date modifyTime; + + /** + * 模板的类型(白名单或黑名单) + */ + private ListType listType; + + + /** + * 模板下的器械包 + */ + @JsonIgnore + private List tousseDefinitionTemplateItems = new ArrayList<>(); + + /** + * 模板下的部门编号 + */ + @JsonIgnore + private List orgUnitTemplateItems = new ArrayList<>(); + + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + @OneToMany(fetch = FetchType.LAZY) + @Cascade(value = {org.hibernate.annotations.CascadeType.ALL}) + @JoinColumn(name = "goodFilterConfig_id") + public List getTousseDefinitionTemplateItems() { + return tousseDefinitionTemplateItems; + } + + public void setTousseDefinitionTemplateItems(List tousseDefinitionTemplateItems) { + this.tousseDefinitionTemplateItems = tousseDefinitionTemplateItems; + } + + @OneToMany(fetch = FetchType.LAZY) + @Cascade(value = {org.hibernate.annotations.CascadeType.ALL}) + @JoinColumn(name = "goodFilterConfig_id") + public List getOrgUnitTemplateItems() { + return orgUnitTemplateItems; + } + + public void setOrgUnitTemplateItems(List orgUnitTemplateItems) { + this.orgUnitTemplateItems = orgUnitTemplateItems; + } + + @Enumerated(EnumType.STRING) + public ListType getListType() { + return listType; + } + + public void setListType(ListType listType) { + this.listType = listType; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/OrgUnitTemplateItem.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/OrgUnitTemplateItem.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/OrgUnitTemplateItem.java (revision 16820) @@ -0,0 +1,76 @@ +package com.forgon.disinfectsystem.goodFilterConfig.entity; + + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +/** + * @author zhonghaowen + * @apiNote 物品黑白过滤名单模板下的部门实体类 + * @since 2017-01-11 + */ +@Entity +@Table(name = "OrgUnitTemplateItem") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class OrgUnitTemplateItem { + + /** + * 自增id + */ + private Long id; + + /** + * 物品过滤模板 + */ + private GoodFilterConfig goodFilterConfig; + + /** + * 部门编号 + */ + private String orgUnitCoding; + + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getOrgUnitCoding() { + return orgUnitCoding; + } + + public void setOrgUnitCoding(String orgUnitCoding) { + this.orgUnitCoding = orgUnitCoding; + } + + @ManyToOne + @JoinColumn(name = "goodFilterConfig_id") + public GoodFilterConfig getGoodFilterConfig() { + return goodFilterConfig; + } + + public void setGoodFilterConfig(GoodFilterConfig goodFilterConfig) { + this.goodFilterConfig = goodFilterConfig; + } + + @Override + public String toString() { + return "OrgUnitTemplateItem{" + + "id=" + id + + ", orgUnitCoding='" + orgUnitCoding + '\'' + + '}'; + } +} Index: ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.jsp (revision 16820) @@ -0,0 +1,76 @@ +<%@page import="java.util.Date" %> +<%@page import="java.text.SimpleDateFormat" %> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ include file="/common/taglibs.jsp" %> +<% + LoginUserData userData = AcegiHelper.getLoginUser(); + request.setAttribute("userName", userData.getUserFullName()); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + request.setAttribute("today", dateFormat.format(new Date())); + session.setAttribute("userName", userData.getUserFullName()); +//session.setAttribute("today",dateFormat.format(new Date())); +%> + + + + 科室物品过滤模板 + + + + + +<%@ include file="/common/includeExtJsAndCss.jsp" %> + + +<%----%> + + + + + + + + + + + + +
+
+
+ + \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManagerImpl.java (revision 16820) @@ -0,0 +1,304 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import com.beust.jcommander.ParameterException; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.goodFilterConfig.entity.GoodFilterConfig; +import com.forgon.disinfectsystem.goodFilterConfig.entity.OrgUnitTemplateItem; +import com.forgon.disinfectsystem.goodFilterConfig.entity.TousseDefinitionTemplateItems; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.factory.BWHandlerFactory; +import com.forgon.disinfectsystem.goodFilterConfig.vo.GoodFilterConfigVo; +import com.forgon.tools.Constants; +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.google.gson.reflect.TypeToken; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.SQLQuery; +import org.hibernate.Session; +import org.hibernate.type.LongType; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 黑白名单过滤模板服务层接口实现类 + * @since 2017-01-13 + */ +public class GoodFilterConfigManagerImpl implements GoodFilterConfigManager { + + private ObjectDao objectDao; + + protected Logger logger = Logger.getLogger(this.getClass()); + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public void saveOrUpdate(GoodFilterConfigVo goodFilterConfigVo) { + try { + GoodFilterConfig goodFilterConfig = this.getGoodFilterConfig(goodFilterConfigVo); + this.prepareUpdate(goodFilterConfig, goodFilterConfigVo); + objectDao.saveOrUpdate(goodFilterConfig); + } + catch (Exception e) { + logger.error(e); + throw new RuntimeException(e); + } + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public void delete(String ids) { + try { + if (StringUtils.isNotBlank(ids)) { + String[] idLists = ids.split(Constants.IDS_SEPARATOR_COMMA); + List list = Arrays.asList(idLists); + objectDao.delete(GoodFilterConfig.class.getSimpleName(), list); + } + } + catch (Exception e) { + logger.error(e); + throw new RuntimeException(e); + } + } + + @Override + public JSONObject loadGoodFilterById(Long id) { + try { + if (id == null) { + throw new ParameterException("模板id不能为空!"); + } + GoodFilterConfig goodFilterConfig = objectDao.getHt().get(GoodFilterConfig.class, id); + GoodFilterReBuilder instance = GoodFilterReBuilder.getInstance(this); + JSONArray jsonArray = instance.buildAllInfo(goodFilterConfig); + logger.debug(jsonArray); + return instance.buildResult(jsonArray); + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + } + + @Override + public JSONArray getTousseItem(GoodFilterConfig goodFilterConfig) { + JSONArray jsonArray = new JSONArray(); + List tousseItems = goodFilterConfig.getTousseDefinitionTemplateItems(); + for (TousseDefinitionTemplateItems tousseItem : tousseItems) { + TousseDefinition tousseDefinition = tousseItem.getTousseDefinition(); + JSONArray array = new JSONArray(); + array.add(tousseItem.getId()); + array.add(tousseDefinition.getId()); + array.add(tousseDefinition.getName()); + jsonArray.add(array); + } + return jsonArray; + } + + + @Override + public JSONArray getDepart(GoodFilterConfig goodFilterConfig) { + List orgUnitTemplateItems = goodFilterConfig.getOrgUnitTemplateItems(); + StringBuilder code = new StringBuilder(); + for (OrgUnitTemplateItem orgUnitTemplateItem : orgUnitTemplateItems) { + code.append(orgUnitTemplateItem.getOrgUnitCoding()).append(","); + } + JSONArray jsonArray = new JSONArray(); + if (StringUtils.isNotBlank(code)) { + String codes = code.substring(0, code.length() - 1); + String orgUnitCoding = SqlBuilder.createStatus("orgUnitCoding", codes.split(Constants.IDS_SEPARATOR_COMMA)); + String sql = "select po.id as orgUnitTemplateId,ou.orgUnitCoding,ou.name from OrgUnitTemplateItem po,OrgUnit ou where po.orgUnitCoding=ou.orgUnitCoding " + + " and " + orgUnitCoding + " and po.goodFilterConfig.id = " + goodFilterConfig.getId(); + Session session = objectDao.getHibernateSession(); + List list = session.createQuery(sql).list(); + for (Object[] objects : list) { + JSONArray array = JSONArray.fromObject(objects); + jsonArray.add(array); + } + } + return jsonArray; + } + + @Override + public List findFilterGoodByType(ListType listType, String orgUnitCode) { + StringBuilder sb = new StringBuilder(); + sb.append(" select DISTINCT td.id id from GoodFilterConfig gc"); + sb.append(" join OrgUnitTemplateItem ot on gc.id = ot.goodFilterConfig_id "); + sb.append(" join TousseDefinitionTemplateItems tdt on gc.id = tdt.goodFilterConfig_id "); + sb.append(" join TousseDefinition td on tdt.toussedefinition_id = td.id "); + sb.append(" where ot.orgUnitCoding = ? and gc.listType = ? "); + String sql = sb.toString(); + logger.debug("[sql]:" + sql); + SQLQuery query = objectDao.getHibernateSession().createSQLQuery(sql); + query.setParameter(0, orgUnitCode); + query.setParameter(1, listType.name()); + query.addScalar("id", LongType.INSTANCE); + return (List) query.list(); + } + + + @Override + public List> handleBWList(List> needToFilter) { + List whiteList = this.findFilterGoodByType(ListType.WHITE, AcegiHelper.getCurrentOrgUnitCode()); + logger.debug("白名单数量是:" + whiteList.size()); + List blackList = this.findFilterGoodByType(ListType.BLACK, AcegiHelper.getCurrentOrgUnitCode()); + logger.debug("黑名单数量是:" + blackList.size()); + if (CollectionUtils.isNotEmpty(whiteList)) { + if (CollectionUtils.isNotEmpty(blackList)) { + //如果黑白名单不为空,则用白名单减去黑名单 + whiteList = (List) CollectionUtils.subtract(whiteList, blackList); + } + //使用白名单过滤 + return this.filterGoodByWhiteOrBlackList(needToFilter, whiteList, ListType.WHITE); + } + //如果只有黑名单,则用黑名单过滤 + if (CollectionUtils.isEmpty(whiteList) && CollectionUtils.isNotEmpty(blackList)) { + return this.filterGoodByWhiteOrBlackList(needToFilter, blackList, ListType.BLACK); + } + return needToFilter; + } + + @Override + public String buildBWListSql(String whereSql) { + List whiteList = this.findFilterGoodByType(ListType.WHITE, AcegiHelper.getCurrentOrgUnitCode()); + List blackList = this.findFilterGoodByType(ListType.BLACK, AcegiHelper.getCurrentOrgUnitCode()); + if (CollectionUtils.isNotEmpty(whiteList)) { + if (CollectionUtils.isNotEmpty(blackList)) { + //如果黑白名单不为空,则用白名单减去黑名单 + whiteList = (List) CollectionUtils.subtract(whiteList, blackList); + } + //使用白名单过滤 + WhiteOrBlackHandler whiteOrBlackHandler = BWHandlerFactory.createWhiteOrBlackHandler(ListType.WHITE); + return whiteOrBlackHandler.buildWhereSql(whereSql, whiteList); + } + //如果只有黑名单,则用黑名单过滤 + if (CollectionUtils.isEmpty(whiteList) && CollectionUtils.isNotEmpty(blackList)) { + WhiteOrBlackHandler whiteOrBlackHandler = BWHandlerFactory.createWhiteOrBlackHandler(ListType.BLACK); + return whiteOrBlackHandler.buildWhereSql(whereSql, blackList); + } + return whereSql; + } + + + /** + * 根据传进来的ListType来判断是用白名单去过滤还是用黑名单去过滤 + * + * @param needToFilter 需要过滤的数据 + * @param whiteOrBlackList 白名单或者黑名单的列表 + * @param listType 黑白名单的类型 + * @return 过滤好的数据 + */ + private List> filterGoodByWhiteOrBlackList(List> needToFilter, List whiteOrBlackList, ListType listType) { + List> reList = new LinkedList<>(); + WhiteOrBlackHandler whiteOrBlackHandler = BWHandlerFactory.createWhiteOrBlackHandler(listType); + if (whiteOrBlackHandler == null) { + throw new ParameterException("请输入正确的类型!"); + } + for (Map map : needToFilter) { + whiteOrBlackHandler.handleAppGoodList(map, reList, whiteOrBlackList); + } + return reList; + } + + /** + * 根据页面传过来的参数得到GoodFilterConfig对象 + * + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + * @return {@link GoodFilterConfig} + */ + private GoodFilterConfig getGoodFilterConfig(GoodFilterConfigVo goodFilterConfigVo) { + Long templateId = goodFilterConfigVo.getId(); + //如果模板id为空则认为是新增 + if (templateId == null) { + return new GoodFilterConfig(); + } + //如果存在模板id,则从数据库查找该模板 + GoodFilterConfig goodFilterConfig = objectDao.getHt().get(GoodFilterConfig.class, templateId); + if (goodFilterConfig == null) { + throw new ParameterException("找不到对应的模板!"); + } + return goodFilterConfig; + } + + /** + * 设置更新前的数据 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + */ + private void prepareUpdate(GoodFilterConfig goodFilterConfig, GoodFilterConfigVo goodFilterConfigVo) { + this.setGoodFilterConfig(goodFilterConfig, goodFilterConfigVo); + this.setDeptInfo(goodFilterConfig, goodFilterConfigVo); + this.setTousseInfo(goodFilterConfig, goodFilterConfigVo); + } + + /** + * 设置goodFilterConfig的属性 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + */ + private void setGoodFilterConfig(GoodFilterConfig goodFilterConfig, GoodFilterConfigVo goodFilterConfigVo) { + String templateName = goodFilterConfigVo.getTemplateName(); + if (StringUtils.isBlank(templateName)) { + throw new ParameterException("该模板名称不能为空!"); + } + String hql = " where po.templateName = '" + templateName + "'"; + int count = objectDao.countObjectBySql(GoodFilterConfig.class.getSimpleName(), hql); + if (count > 0 && !templateName.equals(goodFilterConfig.getTemplateName())) { + logger.debug(count); + throw new ParameterException("该模板名称已经存在!不能修改"); + } + goodFilterConfig.setModifyTime(new Date()); + goodFilterConfig.setListType(ListType.parseOfDesc(goodFilterConfigVo.getTemplateType())); + goodFilterConfig.setTemplateName(templateName); + goodFilterConfig.setOperator(AcegiHelper.getLoginUser().getUserFullName()); + } + + /** + * 设置该模板下的对应部门 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + */ + private void setDeptInfo(GoodFilterConfig goodFilterConfig, GoodFilterConfigVo goodFilterConfigVo) { + String deptInfo = goodFilterConfigVo.getDeptInfo(); + if (StringUtils.isNotBlank(deptInfo)) { + List orgUnitTemplateItems = JSONUtil.fromJson(deptInfo, new TypeToken>() { + }); + goodFilterConfig.setOrgUnitTemplateItems(orgUnitTemplateItems); + } + } + + /** + * 设置器械包信息 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + */ + private void setTousseInfo(GoodFilterConfig goodFilterConfig, GoodFilterConfigVo goodFilterConfigVo) { + String tousseInfo = goodFilterConfigVo.getTousseInfo(); + if (StringUtils.isNotBlank(tousseInfo)) { + List list = JSONUtil.fromJson(tousseInfo, new TypeToken>() { + }); + goodFilterConfig.setTousseDefinitionTemplateItems(list); + } + } + + +} Index: ssts-web/src/main/webapp/WEB-INF/dwr.xml =================================================================== diff -u -r16644 -r16820 --- ssts-web/src/main/webapp/WEB-INF/dwr.xml (.../dwr.xml) (revision 16644) +++ ssts-web/src/main/webapp/WEB-INF/dwr.xml (.../dwr.xml) (revision 16820) @@ -537,6 +537,12 @@ + + + + + + Index: forgon-tools/src/main/java/com/forgon/tools/util/ObjectUtil.java =================================================================== diff -u -r16279 -r16820 --- forgon-tools/src/main/java/com/forgon/tools/util/ObjectUtil.java (.../ObjectUtil.java) (revision 16279) +++ forgon-tools/src/main/java/com/forgon/tools/util/ObjectUtil.java (.../ObjectUtil.java) (revision 16820) @@ -2,6 +2,8 @@ import org.apache.log4j.Logger; +import java.util.List; + /** * Created by zhonghaowen on 2016/12/9. */ @@ -29,4 +31,19 @@ throw new RuntimeException(); } } + + /** + * 将long类型的list转成string类型的数组 + * + * @param list 要转换的list + * @return + */ + public static String[] listConvertToArray(List list) { + int size = list.size(); + String[] ids = new String[size]; + for (int i = 0; i < size; i++) { + ids[i] = list.get(i).toString(); + } + return ids; + } } Index: ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplate.js (revision 16820) @@ -0,0 +1,158 @@ +var entityName = "科室物品过滤模板"; +var grid; +/** + * 删除模板 + * @param grid + * @returns {boolean} + */ +function deleteTempalate(grid) { + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要删除的模板!"); + return false; + } + var ids = getRowsPropertiesWithComma(records, 'id'); + top.Ext.MessageBox.confirm("请确认", "是否确定要删除选中的模板?", function (button, text) { + if ("yes" == button) { + Ext.Ajax.request({ + url: WWWROOT + '/disinfectSystem/goodFilterConfig/goodFilterAction!deleteGoodFilter.do', + params: {ids: ids}, + success: function (response, options) { + grid.dwrReload(); + showResult('删除成功'); + }, + failure: function (response, options) { + var result = Ext.decode(response.responseText); + showResult(result.cause); + } + }); + } + }); +} +var loadFormData = function (grid) { + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要修改的模板!"); + return false; + } + if (records.length > 1) { + showResult("一次只能修改一个模板!"); + return false; + } + id = records[0].data['id']; + openTemplate(id); +}; + +/** + * 修改记录 + * modifyRecord函数 触发modify函数调用,并传入当前列的值以及record.data对象 + * 页面中需要定义 modify(v,data) 函数 + */ +function modify(v, data) { + loadFormData(grid); +} + +// function dealNullObject(v, p, record) { +// if (record.data.supplier == null) { +// return ""; +// } else { +// return record.data.supplier.companyName; +// } +// } + +Ext.onReady(function () { + Ext.QuickTips.init(); + // 记录cookie(3步) + var columns = [{ + header: "模版名称", + width: 160, + dataIndex: 'templateName', + renderer: modifyRecord + }, { + id: 'operator', + header: "操作人", + width: 240, + dataIndex: 'operator' + }, { + id: 'modifyTime', + header: "最后修改时间", + width: 240, + dataIndex: 'modifyTime', + renderer: myDateFormatByMinute + } + ]; + var filters = new Ext.grid.GridFilters({ + filters: [ + {type: 'string', dataIndex: 'templateName'}, + {type: 'string', dataIndex: 'operator'} + ] + + }); + + var readerDetail = [ + {name: 'id'}, + {name: 'templateName'}, + {name: 'operator'}, + {name: 'modifyTime'} + ]; + + var sign = true; + var tbar = [{ + text: '添加', + hidden: SSTS_GoodsFilterConfig_Update, + iconCls: 'btn_ext_application_add', + handler: function () { + // addAndEditSterilizer(0); + openTemplate(0); + } + }, '-', { + text: '修改', + hidden: SSTS_GoodsFilterConfig_Update, + iconCls: 'btn_ext_application_edit', + id: 'editTbar', + handler: function () { + loadFormData(grid); + } + }, '-', { + text: '删除', + hidden: SSTS_GoodsFilterConfig_Delete, + iconCls: 'btn_ext_application_del', + handler: function () { + deleteTempalate(grid); + } + }]; + var dwrCallParams = null; + + Ext.ux.ForgonPageGrid.prototype.getGridParameterMap = function () { + }; + + grid = new Ext.ux.ForgonPageGrid({ + tbar: tbar, + pageSize: 20, + defaultSortField: 'id', + defaultSortDirection: 'ASC', + title: '科室过滤物品列表', + isCheckboxSelectionModel: true, + isShowSearchField: false,//取消搜索框 + rememberSelected: false,//取消清除已选 + columns: columns, + plugins: filters, + renderTo: 'gridDiv', + frame: false + }, readerDetail, + GoodFilterTableManager.findGoodsFilterTableList, + dwrCallParams // 这个参数只是占位作用 + ); + + var viewport = new Ext.Viewport({ + layout: 'border', + items: [{ + region: 'center', + margins: '0 0 0 0', + layout: 'fit', + items: grid + }] + }); + + +}); \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteListHandler.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteListHandler.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteListHandler.java (revision 16820) @@ -0,0 +1,47 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.util.ObjectUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 白名单处理器 + * @since 2017-01-17 + */ +public class WhiteListHandler implements WhiteOrBlackHandler { + + private static WhiteListHandler ourInstance; + + public static WhiteListHandler getInstance() { + if (ourInstance == null) { + synchronized (WhiteListHandler.class) { + if (ourInstance == null) { + ourInstance = new WhiteListHandler(); + } + } + } + return ourInstance; + } + + private WhiteListHandler() { + } + + @Override + public void handleAppGoodList(Map map, List> reList, List whiteList) { + long id = Long.parseLong(map.get("id").toString()); + if (whiteList.contains(id)) { + reList.add(map); + } + } + + @Override + public String buildWhereSql(String whereSql, List whiteList) { + String[] listIds = ObjectUtil.listConvertToArray(whiteList); + String ids = SqlBuilder.build_IN_Statement("id", SqlBuilder.IN, listIds); + whereSql += " and " + ids; + return whereSql; + } +} Index: ssts-web/src/main/webapp/homepage/menu.jsp =================================================================== diff -u -r16282 -r16820 --- ssts-web/src/main/webapp/homepage/menu.jsp (.../menu.jsp) (revision 16282) +++ ssts-web/src/main/webapp/homepage/menu.jsp (.../menu.jsp) (revision 16820) @@ -1031,6 +1031,12 @@ SSTS_ShiftConfig = false; +var SSTS_GoodFilter = true; + +SSTS_GoodFilter = false; + + + var SSTS_BaseData_Manager = SSTS_ImportBaseData&&SSTS_QualityItem &&SSTS_SerialNumber && SSTS_SupplyRoomType&&SSTS_Expiration && SSTS_Sterilizer && SSTS_Sterilisation &&SSTS_Rinser && SSTS_CleanMethod&&SSTS_Supplier &&SSTS_TaskGroup && SSTS_DiposableGoodsType && SSTS_PackType&& SSTS_ProjectName && SSTS_Operation && SSTS_Container &&SSTS_Material; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/enums/ListType.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/enums/ListType.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/enums/ListType.java (revision 16820) @@ -0,0 +1,41 @@ +package com.forgon.disinfectsystem.goodFilterConfig.enums; + +/** + * @author zhonghaowen + * @apiNote 科室物品过滤模板类型(白名单或黑名单) + * @since 2017-01-13 + */ +public enum ListType { + + WHITE(0, "白名单"), + BLACK(1, "黑名单"); + + private String desc; + private Integer val; + + ListType(Integer val, String desc) { + this.val = val; + this.desc = desc; + } + + public String getDesc() { + return desc; + } + + public Integer getVal() { + return val; + } + + + public static ListType parseOfDesc(String desc) { + ListType[] values = ListType.values(); + for (ListType value : values) { + if (value.getDesc().equals(desc)) { + return value; + } + } + throw new IllegalArgumentException("找不到对应的类型"); + } + + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/TousseDefinitionTemplateItems.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/TousseDefinitionTemplateItems.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/entity/TousseDefinitionTemplateItems.java (revision 16820) @@ -0,0 +1,69 @@ +package com.forgon.disinfectsystem.goodFilterConfig.entity; + +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +/** + * @author zhonghaowen + * @apiNote 物品黑白过滤名单模板下的器械包实体类 + * @since 2017-01-11 + */ +@Entity +@Table(name = "TousseDefinitionTemplateItems") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class TousseDefinitionTemplateItems { + + /** + * 自增id + */ + private Long id; + + /** + * 器械包定义 + */ + private TousseDefinition tousseDefinition; + + /** + * 物品过滤模板 + */ + private GoodFilterConfig goodFilterConfig; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @ManyToOne + @JoinColumn(name = "toussedefinition_id") + public TousseDefinition getTousseDefinition() { + return tousseDefinition; + } + + public void setTousseDefinition(TousseDefinition tousseDefinition) { + this.tousseDefinition = tousseDefinition; + } + + @ManyToOne + @JoinColumn(name = "goodFilterConfig_id") + public GoodFilterConfig getGoodFilterConfig() { + return goodFilterConfig; + } + + public void setGoodFilterConfig(GoodFilterConfig goodFilterConfig) { + this.goodFilterConfig = goodFilterConfig; + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/vo/GoodFilterConfigVo.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/vo/GoodFilterConfigVo.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/vo/GoodFilterConfigVo.java (revision 16820) @@ -0,0 +1,86 @@ +package com.forgon.disinfectsystem.goodFilterConfig.vo; + +/** + * @author zhonghaowen + * @apiNote GoodFilterConfig的vo类,用于封装页面传进来的参数 + * @since 2017-01-13 + */ +public class GoodFilterConfigVo { + + /** + * 模板id + */ + private Long id; + + /** + * 模板类型 + */ + private String templateType; + + /** + * 部门信息 + */ + private String deptInfo; + + /** + * 器械包信息 + */ + private String tousseInfo; + + /** + * 模板名称 + */ + private String templateName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTemplateType() { + return templateType; + } + + public void setTemplateType(String templateType) { + this.templateType = templateType; + } + + + public String getDeptInfo() { + return deptInfo; + } + + public void setDeptInfo(String deptInfo) { + this.deptInfo = deptInfo; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } + + public String getTousseInfo() { + return tousseInfo; + } + + public void setTousseInfo(String tousseInfo) { + this.tousseInfo = tousseInfo; + } + + @Override + public String toString() { + return "GoodFilterConfigVo{" + + "id=" + id + + ", templateType='" + templateType + '\'' + + ", deptInfo='" + deptInfo + '\'' + + ", tousseInfo='" + tousseInfo + '\'' + + ", templateName='" + templateName + '\'' + + '}'; + } +} Index: ssts-web/src/main/webapp/disinfectsystem/config/dgsdhyy/config.js =================================================================== diff -u -r16594 -r16820 --- ssts-web/src/main/webapp/disinfectsystem/config/dgsdhyy/config.js (.../config.js) (revision 16594) +++ ssts-web/src/main/webapp/disinfectsystem/config/dgsdhyy/config.js (.../config.js) (revision 16820) @@ -61,5 +61,7 @@ //是否隐藏同步退货单菜单 hiddSyncGodownReturnEntryMenu : true, //是否隐藏灭菌管理-外部代理灭菌里的申请人和制作人(只有为true时才隐藏,false或不配置都显示) - hideCssdForeignProxyDisinfectionAapplicantAndMaker : true + hideCssdForeignProxyDisinfectionAapplicantAndMaker : true, + //科室申领是否启用黑白名单过滤物品(目前只支持器械包) + appIsUseBwList : true } \ No newline at end of file Index: ssts-web/src/main/resources/systemset/operationDefine.xml =================================================================== diff -u -r16760 -r16820 --- ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 16760) +++ ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 16820) @@ -494,6 +494,10 @@ + + + + Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java =================================================================== diff -u -r16816 -r16820 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 16816) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 16820) @@ -17,6 +17,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; +import com.forgon.tools.SqlBuilder; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -96,11 +99,17 @@ private LogManager appLogManager; + private GoodFilterConfigManager goodFilterConfigManagerImpl; + public TousseDefinitionManagerImpl() { super(TousseDefinition.class); // TODO Auto-generated constructor stub } - + + public void setGoodFilterConfigManagerImpl(GoodFilterConfigManager goodFilterConfigManagerImpl) { + this.goodFilterConfigManagerImpl = goodFilterConfigManagerImpl; + } + public void setAppLogManager(LogManager appLogManager) { this.appLogManager = appLogManager; } @@ -2128,6 +2137,12 @@ whereSql += " and " + predicate; } } + + if (JSONUtil.optBoolean(retObj, "needToBw", false)){ + //黑白名单过滤 + whereSql = goodFilterConfigManagerImpl.buildBWListSql(whereSql); + } + String findSql = String.format(" from %s %s ", TousseDefinition.class.getSimpleName(),whereSql); if(limit > 0){ list = objectDao.findByHql(findSql,start,limit); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterConfigManager.java (revision 16820) @@ -0,0 +1,85 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import com.forgon.disinfectsystem.goodFilterConfig.entity.GoodFilterConfig; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.vo.GoodFilterConfigVo; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 黑白名单过滤模板服务层接口 + * @since 2017-01-13 + */ +public interface GoodFilterConfigManager { + + /** + * 新增或者更新过滤模板 + * + * @param goodFilterConfigVo {@link GoodFilterConfigVo} + */ + void saveOrUpdate(GoodFilterConfigVo goodFilterConfigVo); + + /** + * 删除过滤模板 + * + * @param ids + */ + void delete(String ids); + + /** + * 根据模板id读取对应的过滤模板数据 + * + * @param id 模板id + * @return + */ + JSONObject loadGoodFilterById(Long id); + + /** + * 根据模板获取器械包的id和名称 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return + */ + JSONArray getTousseItem(GoodFilterConfig goodFilterConfig); + + /** + * 根据模板获取对应的部门编号和名称 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return // 页面要以[[部门编号1,部门名称1],[部门编号2,部门名称2]]这样的格式返回 + */ + JSONArray getDepart(GoodFilterConfig goodFilterConfig); + + /** + * 查询该部门已经设置的黑或白名单 + * + * @param listType {@link ListType} + * @param orgUnitCode 部门编号 + * @return 黑或白名单 + */ + List findFilterGoodByType(ListType listType, String orgUnitCode); + + /** + * 处理黑白名单 + * + * @param needToFilter 需要过滤的列表 + * @return 处理好的列表 + */ + List> handleBWList(List> needToFilter); + + /** + * 拼接黑白名单的条件sql + * + * @param whereSql 原来的条件sql + * @return 构造好黑白名单的sql + */ + String buildBWListSql(String whereSql); + + +} + + Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java =================================================================== diff -u -r16719 -r16820 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 16719) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/action/TousseDefinitionAction.java (.../TousseDefinitionAction.java) (revision 16820) @@ -25,6 +25,8 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; @@ -123,7 +125,13 @@ private TousseInstanceManager tousseInstanceManager; private DateQueryAdapter dateQueryAdapter; - + + private GoodFilterConfigManager goodFilterConfigManagerImpl; + + public void setGoodFilterConfigManagerImpl(GoodFilterConfigManager goodFilterConfigManagerImpl) { + this.goodFilterConfigManagerImpl = goodFilterConfigManagerImpl; + } + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { this.dateQueryAdapter = dateQueryAdapter; } @@ -1492,6 +1500,12 @@ // JSONObject json = null; // 根据拼音码、五笔码获取内部器械包(器械包和自制物品) List> mapList = tousseDefinitionManager.searchTousseForBorrowing(spell); + String borrowIsUseBwList = CssdUtils.getSystemSetConfigByName("borrowIsUseBwList"); + if (StringUtils.isNotBlank(borrowIsUseBwList) && "true".equals(borrowIsUseBwList)){ + logger.debug("黑白名单过滤前大小:" + mapList.size()); + mapList = goodFilterConfigManagerImpl.handleBWList(mapList); + logger.debug("黑白名单过滤后大小:" + mapList.size()); + } PageUtil.outPutResult(PageUtil.getPagePara(), mapList); } catch (IOException e) { e.printStackTrace(); @@ -1584,7 +1598,13 @@ OrgUnit cssd = new OrgUnit(); cssd.setOrgUnitCoding(cssdOrgUnitCode); Set predicates = getPredicates(tousseType); - List tousseDefinitiionList = + + String appIsUseBwList = CssdUtils.getSystemSetConfigByName("appIsUseBwList"); + if (StringUtils.isNotBlank(appIsUseBwList) && "true".equals(appIsUseBwList)){ + //开启器械包黑白名单过滤 + retObj.put("needToBw", true); + } + List tousseDefinitiionList = tousseDefinitionManager.getCssdHandleTousseDefinitionList(cssd,spell,start,limit,predicates,retObj); if(CollectionUtils.isNotEmpty(tousseDefinitiionList)){ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterReBuilder.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterReBuilder.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/GoodFilterReBuilder.java (revision 16820) @@ -0,0 +1,113 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import com.forgon.disinfectsystem.goodFilterConfig.entity.GoodFilterConfig; +import com.forgon.tools.util.ForgonDateUtils; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +/** + * @author zhonghaowen + * @apiNote 物品过滤结果构造器(用于构造返回页面的参数) + * @since 2017-01-13 + */ +public class GoodFilterReBuilder { + + public static GoodFilterReBuilder ourInstance; + + private static GoodFilterConfigManager goodFilterConfigManager; + + public static GoodFilterReBuilder getInstance(GoodFilterConfigManager goodFilterConfigManagerImpl) { + if (ourInstance == null) { + synchronized (GoodFilterReBuilder.class) { + if (ourInstance == null) { + ourInstance = new GoodFilterReBuilder(); + } + } + } + if (goodFilterConfigManager == null) { + synchronized (GoodFilterReBuilder.class) { + if (goodFilterConfigManager == null) { + goodFilterConfigManager = goodFilterConfigManagerImpl; + } + } + } + return ourInstance; + } + + private GoodFilterReBuilder() { + } + + /** + * 构建最终返回页面的结果集 + * + * @param jsonArray 最终的结果集 + * @return + */ + public JSONObject buildResult(JSONArray jsonArray) { + JSONObject result = new JSONObject(); + result.put("success", true); + result.put("data", jsonArray); + return result; + } + + + /** + * 构建所有返回数据 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return 返回的信息包括基础信息, 部门信息, 器械包信息 + */ + public JSONArray buildAllInfo(GoodFilterConfig goodFilterConfig) { + JSONArray jsonArray = new JSONArray(); + jsonArray.add(this.buildBaseInfo(goodFilterConfig)); + jsonArray.add(this.buildDepartInfo(goodFilterConfig)); + jsonArray.add(this.buildTousseInfo(goodFilterConfig)); + return jsonArray; + } + + /** + * 构建基础信息的返回数据 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return 返回基础信息 + */ + private JSONObject buildBaseInfo(GoodFilterConfig goodFilterConfig) { + JSONObject baseInfo = new JSONObject(); + JSONObject json = new JSONObject(); + json.put("templateName", goodFilterConfig.getTemplateName()); + json.put("modifyTime", ForgonDateUtils.safelyFormatDate(goodFilterConfig.getModifyTime(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMM, "")); + json.put("operator", goodFilterConfig.getOperator()); + json.put("listType", goodFilterConfig.getListType()); + baseInfo.put("baseInfo", json); + return baseInfo; + } + + + /** + * 构建部门返回的数据 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return 返回部门信息 + */ + private JSONObject buildDepartInfo(GoodFilterConfig goodFilterConfig) { + JSONArray json = goodFilterConfigManager.getDepart(goodFilterConfig); + JSONObject departInfo = new JSONObject(); + departInfo.put("departInfo", json); + return departInfo; + } + + /** + * 构建器械包返回结果 + * + * @param goodFilterConfig {@link GoodFilterConfig} + * @return 返回器械包信息 + */ + private JSONObject buildTousseInfo(GoodFilterConfig goodFilterConfig) { + JSONArray json = goodFilterConfigManager.getTousseItem(goodFilterConfig); + JSONObject tousseInfo = new JSONObject(); + tousseInfo.put("tousseInfo", json); + return tousseInfo; + } + + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/dwr/table/GoodFilterTableManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/dwr/table/GoodFilterTableManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/dwr/table/GoodFilterTableManager.java (revision 16820) @@ -0,0 +1,33 @@ +package com.forgon.disinfectsystem.goodFilterConfig.dwr.table; + +import com.forgon.component.grid.GridManager; +import com.forgon.disinfectsystem.goodFilterConfig.entity.GoodFilterConfig; +import com.forgon.tools.util.ExtJsUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 物品黑白名单过滤dwr查询类 + * @since 2017-01-13 + */ +@Service(value = "goodFilterTableManager") +public class GoodFilterTableManager { + + @Resource + private GridManager gridManager; + + /** + * 查找出所有需要过滤的物品 + * + * @param parameterMap grid传进来的参数 + * @return + */ + public String findGoodsFilterTableList(Map> parameterMap) { + ExtJsUtil.setGridSearchQuery(parameterMap); + return gridManager.renderGrid(parameterMap, GoodFilterConfig.class.getSimpleName(), null, new String[]{}); + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/action/GoodFilterAction.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/action/GoodFilterAction.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/action/GoodFilterAction.java (revision 16820) @@ -0,0 +1,92 @@ +package com.forgon.disinfectsystem.goodFilterConfig.action; + +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; +import com.forgon.disinfectsystem.goodFilterConfig.vo.GoodFilterConfigVo; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; +import net.sf.json.JSONObject; +import org.apache.log4j.Logger; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +/** + * @author zhonghaowen + * @apiNote 黑白名单过滤模块控制层 + * @since 2017-01-13 + */ +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem/goodFilterConfig") +@Action(value = "goodFilterAction") +public class GoodFilterAction implements ModelDriven, Preparable { + + private Logger logger = Logger.getLogger(this.getClass()); + + private GoodFilterConfigManager goodFilterConfigManagerImpl; + + private GoodFilterConfigVo goodFilterConfigVo = new GoodFilterConfigVo(); + + public void setGoodFilterConfigManagerImpl(GoodFilterConfigManager goodFilterConfigManagerImpl) { + this.goodFilterConfigManagerImpl = goodFilterConfigManagerImpl; + } + + /** + * 根据模板id来获取对应模板的相关信息 + */ + public void loadGoodFilterById() { + try { + Long id = StrutsParamUtils.getPraramLongValue("id", null); + JSONObject jsonObject = goodFilterConfigManagerImpl.loadGoodFilterById(id); + StrutsResponseUtils.output(jsonObject); + } + catch (Exception e) { + logger.error(e, e); + StrutsResponseUtils.output(false, "获取对应模板的信息失败!"); + } + } + + + /** + * 新增或者保存模板 + */ + public void saveOrUpdateGoodFilter() { + try { + logger.debug(goodFilterConfigVo); + goodFilterConfigManagerImpl.saveOrUpdate(goodFilterConfigVo); + StrutsResponseUtils.output(true); + } + catch (Exception e) { + logger.error(e, e); + StrutsResponseUtils.output(false, "保存失败!" + e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * 删除对应的模板 + */ + public void deleteGoodFilter() { + try { + String ids = StrutsParamUtils.getPraramValue("ids", null); + goodFilterConfigManagerImpl.delete(ids); + StrutsResponseUtils.output(true); + } + catch (Exception e) { + logger.error(e, e); + StrutsResponseUtils.output(false, "删除失败!" + e.getMessage()); + throw new RuntimeException(e); + } + } + + @Override + public GoodFilterConfigVo getModel() { + return goodFilterConfigVo; + } + + @Override + public void prepare() throws Exception { + + } +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java =================================================================== diff -u -r16167 -r16820 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java (.../TousseDefinitionHelper.java) (revision 16167) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionHelper.java (.../TousseDefinitionHelper.java) (revision 16820) @@ -42,54 +42,54 @@ this.tousseDefinitionManager = tousseDefinitionManager; } - /** - * 根据过滤的类型来过滤对应的物品 - * - * @param tousseType 器械包类型 - * @param tousseDefinition 要过滤的物品po - * @return 过滤好的结果 - */ - @Deprecated -/* public Map filterResultByTousseType(String tousseType, TousseDefinition tousseDefinition) { - Map map = null; - Double price = tousseDefinition.getPrice(); - //如果类型为消毒物品,则只保留类型为消毒物品的数据 - if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { - if (tousseDefinition.isDisinfection()) { - price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); - map = this.setReturnResult(tousseDefinition, price); - } - } - //如果类型为敷料包,则只保留类型为敷料包的数据 - else if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType)) { - if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseDefinition.getTousseType())) { - map = this.setReturnResult(tousseDefinition, price); - } - } - //如果类型为组合申请单或者器械包申请单,则保留类型为器械包,消毒物品,敷料包(组合申请单后面会添加一次性物品,器械包申请单则不会) - else if ("combo".equals(tousseType) || TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) { - String type = tousseDefinition.getTousseType(); - //器械包和敷料包 - if (tousseDefinition.PACKAGE_TYPE_INSIDE.equals(type) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(type)) { - map = this.setReturnResult(tousseDefinition, price); - } - //消毒物品 - else if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(type)){ - price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); - map = this.setReturnResult(tousseDefinition, price); - } - } - //如果器械包分组为专科器械组,则只保留类型为专科器械组的数据 - else if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseType)) { - if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseDefinition.getTousseGroupName())) { - map = this.setReturnResult(tousseDefinition, price); - } - } - else { - map = this.setReturnResult(tousseDefinition, price); - } - return map; - }*/ + // /** + // * 根据过滤的类型来过滤对应的物品 + // * + // * @param tousseType 器械包类型 + // * @param tousseDefinition 要过滤的物品po + // * @return 过滤好的结果 + // */ + // @Deprecated + // public Map filterResultByTousseType(String tousseType, TousseDefinition tousseDefinition) { + // Map map = null; + // Double price = tousseDefinition.getPrice(); + // //如果类型为消毒物品,则只保留类型为消毒物品的数据 + // if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { + // if (tousseDefinition.isDisinfection()) { + // price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); + // map = this.setReturnResult(tousseDefinition, price); + // } + // } + // //如果类型为敷料包,则只保留类型为敷料包的数据 + // else if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseType)) { + // if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(tousseDefinition.getTousseType())) { + // map = this.setReturnResult(tousseDefinition, price); + // } + // } + // //如果类型为组合申请单或者器械包申请单,则保留类型为器械包,消毒物品,敷料包(组合申请单后面会添加一次性物品,器械包申请单则不会) + // else if ("combo".equals(tousseType) || TousseDefinition.PACKAGE_TYPE_INSIDE.equals(tousseType)) { + // String type = tousseDefinition.getTousseType(); + // //器械包和敷料包 + // if (tousseDefinition.PACKAGE_TYPE_INSIDE.equals(type) || TousseDefinition.PACKAGE_TYPE_DRESSING.equals(type)) { + // map = this.setReturnResult(tousseDefinition, price); + // } + // //消毒物品 + // else if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(type)){ + // price = tousseDefinitionManager.getDisinfectGoodsPrice(tousseDefinition); + // map = this.setReturnResult(tousseDefinition, price); + // } + // } + // //如果器械包分组为专科器械组,则只保留类型为专科器械组的数据 + // else if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseType)) { + // if (TousseDefinition.TOUSSE_GROUP_SPECIALIZED_INSTRUMENT.equals(tousseDefinition.getTousseGroupName())) { + // map = this.setReturnResult(tousseDefinition, price); + // } + // } + // else { + // map = this.setReturnResult(tousseDefinition, price); + // } + // return map; + // } public Map filterResultByTousseType2(String tousseType, TousseDefinition tousseDefinition) { Map map = null; Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/factory/BWHandlerFactory.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/factory/BWHandlerFactory.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/factory/BWHandlerFactory.java (revision 16820) @@ -0,0 +1,31 @@ +package com.forgon.disinfectsystem.goodFilterConfig.factory; + +import com.forgon.disinfectsystem.goodFilterConfig.enums.ListType; +import com.forgon.disinfectsystem.goodFilterConfig.service.BlackListHandler; +import com.forgon.disinfectsystem.goodFilterConfig.service.WhiteListHandler; +import com.forgon.disinfectsystem.goodFilterConfig.service.WhiteOrBlackHandler; + +/** + * @author zhonghaowen + * @apiNote 黑白名单处理器工厂 + * @since 2017-01-17 + */ +public class BWHandlerFactory { + + /** + * 根据传进来的类型来实例化对应的处理器 + * + * @param listType {@link ListType} + * @return 返回对应的处理器 + */ + public static WhiteOrBlackHandler createWhiteOrBlackHandler(ListType listType) { + WhiteOrBlackHandler whiteOrBlackHandler = null; + if (listType.equals(ListType.BLACK)) { + whiteOrBlackHandler = BlackListHandler.getInstance(); + } + else if (listType.equals(ListType.WHITE)) { + whiteOrBlackHandler = WhiteListHandler.getInstance(); + } + return whiteOrBlackHandler; + } +} Index: ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/config.js =================================================================== diff -u -r16651 -r16820 --- ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/config.js (.../config.js) (revision 16651) +++ ssts-web/src/main/webapp/disinfectsystem/config/zsszyy/config.js (.../config.js) (revision 16820) @@ -87,5 +87,7 @@ //使用记录扫描条码,是否提示更接近失效期的包实例 olderTousseComfirmForUserecord:true, //使用记录是否启用是否真正使用的功能。如果是否真正使用属性为否,则需要转换申请单 - enableActualUsed:true + enableActualUsed:true, + //借物单申请是否使用黑白名单过滤(目前只支持器械包) + borrowIsUseBwList : true } \ No newline at end of file Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r16337 -r16820 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 16337) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 16820) @@ -602,7 +602,8 @@ {hidden :SSTS_ImportBaseData,text:"导入导出基础数据",href:WWWROOT+'/disinfectsystem/basedatamanager/importbasedata/importBasedata.mhtml',hrefTarget:linkTarget,leaf:true}, {hidden :!(SSTS_IPAndOrgUnitMapping || sstsConfig.enableIPAndOrgUnitMapping),text:"IP对应的默认科室配置",href:WWWROOT+'/disinfectsystem/basedatamanager/iPAndOrgUnitMapping/iPAndOrgUnitMappingView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_GoodsBindingConfig,text:"物品绑定",href:WWWROOT+ '/disinfectsystem/goodsBindingConfig/goodsBindingConfigView.jsp',hrefTarget:linkTarget,leaf:true}, - {hidden :SSTS_SupplyRoomType,text:"科室供应室设置",href:WWWROOT+'/disinfectsystem/basedatamanager/supplyroomtype/supplyRoomTypeView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true} + {hidden :SSTS_SupplyRoomType,text:"科室供应室设置",href:WWWROOT+'/disinfectsystem/basedatamanager/supplyroomtype/supplyRoomTypeView.jsp?editMode=true',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_GoodFilter,text:"物品黑白名单过滤设置",href:WWWROOT+'/disinfectsystem/goodFilterConfig/goodFilterTemplate.jsp',hrefTarget:linkTarget,leaf:true} // {hidden :false,text:"打印表单模板设置",href:WWWROOT+'/disinfectsystem/print/printForm.jsp',hrefTarget:linkTarget,leaf:true} ] },{ Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteOrBlackHandler.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteOrBlackHandler.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/WhiteOrBlackHandler.java (revision 16820) @@ -0,0 +1,30 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 黑白名单处理器接口 + * @since 2017-01-17 + */ +public interface WhiteOrBlackHandler { + + /** + * 处理对应的列表(申请物品) + * + * @param map 待处理的数据 + * @param reList 最终处理好的列表数据 + * @param whiteOrBlackList 黑名单列表或者白名单列表 + */ + void handleAppGoodList(Map map, List> reList, List whiteOrBlackList); + + /** + * 根据传进来的黑名单或者白名单列表构造对应的黑或白名单条件sql + * + * @param whereSql 原来的条件sql + * @param list 黑名单后者白名单列表 + * @return 返回拼接好的条件sql + */ + String buildWhereSql(String whereSql, List list); +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/BlackListHandler.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/BlackListHandler.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/goodFilterConfig/service/BlackListHandler.java (revision 16820) @@ -0,0 +1,47 @@ +package com.forgon.disinfectsystem.goodFilterConfig.service; + +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.util.ObjectUtil; + +import java.util.List; +import java.util.Map; + +/** + * @author zhonghaowen + * @apiNote 黑名单处理器 + * @since 2017-01-17 + */ +public class BlackListHandler implements WhiteOrBlackHandler { + + private static BlackListHandler ourInstance; + + public static BlackListHandler getInstance() { + if (ourInstance == null) { + synchronized (BlackListHandler.class) { + if (ourInstance == null) { + ourInstance = new BlackListHandler(); + } + } + } + return ourInstance; + } + + private BlackListHandler() { + } + + @Override + public void handleAppGoodList(Map map, List> reList, List blackList) { + long id = Long.parseLong(map.get("id").toString()); + if (!blackList.contains(id)) { + reList.add(map); + } + } + + @Override + public String buildWhereSql(String whereSql, List blackList) { + String[] listIds = ObjectUtil.listConvertToArray(blackList); + String ids = SqlBuilder.build_IN_Statement("id", SqlBuilder.NOT_IN, listIds); + whereSql += " and " + ids; + return whereSql; + } +} Index: ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplateForm.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplateForm.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/goodFilterConfig/goodFilterTemplateForm.js (revision 16820) @@ -0,0 +1,866 @@ +var id; +var formObj; +var goodFilterWin; +var productMode = true; +function removeGridItem(gridName) { + var configGrid = top.Ext.getCmp(gridName); + var rows = configGrid.getSelectionModel().getSelections();// 返回值为 Record 数组 + if (rows) { + for (var i = 0; i < rows.length; i++) { + configGrid.getStore().remove(rows[i]); + } + } +} +var templateTypeStore = new Ext.data.SimpleStore({ + fields: ['key', 'val'], + data: [['WHITE', '白名单'], ['BLACK', '黑名单']] +}); + + +/** + * 创建基础信息 + * @returns + */ +function createBaseInfo() { + var baseInfoItems = [{ + layout: 'form', + columnWidth: .25, + labelWidth: 70, + items: [{ + xtype: 'textfield', + fieldLabel: "模板名称", + allowBlank: false, + name: 'templateName', + id: 'templateName', + width: 280 + }] + }, { + layout: 'form', + columnWidth: .25, + labelWidth: 50, + items: [{ + xtype: 'textfield', + fieldLabel: "时间", + allowBlank: false, + name: 'modifyTime', + id: 'modifyTime', + width: 150, + value: today, + // renderer: dateTest, + readOnly: true, + cls: 'fieldReadOnlyNoRemove' + }] + }, { + layout: 'form', + columnWidth: .2, + labelWidth: 50, + items: [{ + xtype: 'textfield', + fieldLabel: "操作人", + allowBlank: false, + name: 'operator', + id: 'operator', + width: 100, + value: userName, + readOnly: true, + cls: 'fieldReadOnlyNoRemove' + }] + }, { + layout: 'form', + columnWidth: 0.3, + labelWidth: 60, + items: [{ + xtype: 'combo', + fieldLabel: '模板类型', + id: 'templateType', + name: 'templateType', + width: 130, + valueField: 'key', + displayField: 'val', + store: templateTypeStore, + forceSelection: true, + editable: false, + allowBlank: false, + mode: 'local', + triggerAction: 'all', + anchor: '95%' + }] + }]; + var baseInfo = { + xtype: "fieldset", + layout: 'column', + title: '基础信息', + autoHeight: true, + columnWidth: 1, + items: baseInfoItems + }; + return baseInfo; +} + + +/** + * 创建该该模板下部门的数据源 + * @returns {Ext.data.SimpleStore} + */ +function createDepartmentStore() { + var departmentStore = new Ext.data.SimpleStore({ + fields: [ + {name: 'orgUnitTemplateId'}, + {name: 'id'}, + {name: 'departName'} + ] + }); + return departmentStore; +} +/** + * 部门下拉框 + * @returns {Ext.data.Store} + */ +function createDepartJsonStore() { + return new Ext.data.Store({ + pageSize: 100, + proxy: new Ext.data.HttpProxy({ + url: WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do', + method: 'POST' + }), + reader: new Ext.data.JsonReader({ + root: 'data', + totalProperty: 'totalCount' + }, [ + {name: 'id', mapping: 'id'}, + {name: 'name', mapping: 'name'} + ] + ) + }); +} +/** + * 获取添加到该模板的部门相关信息 + * @returns {Array} + */ +function getDeptInfo() { + var deptInfo = []; + // 停止编辑 + var deptGrid = top.Ext.getCmp('configGrid'); + deptGrid.stopEditing(); + var deptStore = deptGrid.getStore(); + deptStore.each(function (item) { + deptInfo.push({ + id: item.get('orgUnitTemplateId'), + orgUnitCoding: item.get('id') + }); + }) + return deptInfo; +} +/** + * 创建部门的列 + * @returns {Ext.grid.ColumnModel} + */ +function createDepartCm() { + return new top.Ext.grid.ColumnModel([{ + id: 'orgUnitTemplateId', + name: 'orgUnitTemplateId', + header: "orgUnitTemplateId", + hidden: productMode, + dataIndex: 'orgUnitTemplateId' + }, { + id: 'id', + id: 'id', + header: "科室id", + hidden: productMode, + dataIndex: 'id' + }, { + id: 'departName', + header: "科室名称", + width: 240, + dataIndex: 'departName' + }, { + id: 'deleteItem', + header: '删除操作', + renderer: function (v, p, record) { + var str = ""; + return str; + }, + dataIndex: 'button' + }]); +} +/** + * 创建部门model + * @returns {Function} + */ +function createDepartItem() { + return Ext.data.Record.create([ + {name: 'id'}, + {name: 'departName'} + ]); +} + + +/** + * 获取添加到该模板的器械包相关信息 + * @returns {Array} + */ +function getTousseInfo() { + var tousseInfo = []; + // 停止编辑 + var tousseStore = top.Ext.getCmp('configGrid2').getStore(); + tousseStore.each(function (item) { + tousseInfo.push({ + id: item.get('tousseDefinitionTemplateId'), + tousseDefinition: { + id: item.get('id') + } + }); + }) + return tousseInfo; +} +/** + * 创建器械包数据源 + * @returns {Ext.data.Store} + */ +function createTousseStore() { + return new Ext.data.Store({ + pageSize: 100, + proxy: new Ext.data.HttpProxy({ + url: WWWROOT + '/disinfectSystem/baseData/tousseDefinitionAction!searchComboTousseData.do', + method: 'POST' + }), + reader: new Ext.data.JsonReader({ + totalProperty: 'totalCount', + root: 'data' + }, [ + {name: 'id', mapping: 'id'}, + {name: 'spelling', mapping: 'spelling'}, + {name: 'name', mapping: 'name'}, + {name: 'displayName', mapping: 'displayName'}, + {name: 'amount', mapping: 'amount'} + ] + ) + }); +} + +/** + * 创建器械包的列 + * @returns {Ext.grid.ColumnModel} + */ +function createTousseCm() { + return new top.Ext.grid.ColumnModel([{ + id: 'tousseDefinitionTemplateId', + name: 'tousseDefinitionTemplateId', + header: "器械包模板id", + hidden: productMode, + dataIndex: 'tousseDefinitionTemplateId' + }, { + id: 'id', + name: 'id', + header: "器械包id", + hidden: productMode, + dataIndex: 'id' + }, { + id: 'tousseName', + header: "器械包名称", + dataIndex: 'tousseName', + width: 330 + }, { + id: 'deleteItem', + header: '删除操作', + renderer: function (v, p, record) { + var str = ""; + return str; + }, + dataIndex: 'button' + }]); +} + +/** + * 创建该模板的拥有的器械包数据源 + * @returns {Ext.data.SimpleStore} + */ +function createTousseItemsStore() { + return new Ext.data.SimpleStore({ + fields: [ + {name: 'tousseDefinitionTemplateId'}, + {name: 'id'}, + {name: 'tousseName'} + ] + }); +} + +/** + * 创建器械包model + * @returns {Function} + */ +function createTousseItem() { + return Ext.data.Record.create([{ + name: 'id', + name: 'tousseName', + name: 'sortNumber' + }]); +} + + +function getApplicationDiposableGoodsIds() { + var result = ''; + var configGrid3 = top.Ext.getCmp('configGrid3').getStore(); + for (var i = 0; i < configGrid3.getCount(); i++) { + var recordId = configGrid3.getAt(i).data.id; + var recordSort = configGrid3.getAt(i).data.sortNumber; + if (result == '') { + result = recordId + ";" + recordSort; + } else { + result += (',' + recordId + ";" + recordSort); + } + } + return result; +} + + +/** + * 创建一次性物品数据源 + * @returns {Ext.data.Store} + */ +function createDiposableGoodsStore() { + return new Ext.data.Store({ + pageSize: 100, + proxy: new Ext.data.HttpProxy({ + url: WWWROOT + '/disinfectSystem/diposableGoodsAction!getDiposableGoodsData.do?allItems=no', + method: 'POST' + }), + reader: new Ext.data.JsonReader({ + totalProperty: 'totalCount', + root: 'data' + }, [ + {name: 'id', mapping: 'id'}, + {name: 'spelling', mapping: 'spelling'}, + {name: 'name', mapping: 'name'}, + {name: 'externalCode', mapping: 'externalCode'}, + {name: 'displayName', mapping: 'displayName'}, + {name: 'amount', mapping: 'amount'} + ] + ) + }); +} + +/** + * 创建该模板的拥有的一次性物品数据源 + * @returns {Ext.data.SimpleStore} + */ +function createDiposableGoodsItemsStore() { + return new Ext.data.SimpleStore({ + fields: [ + {name: 'tousseDefinitionTemplateId'}, + {name: 'id'}, + {name: 'diposableGoodsName'} + ] + }); +} + +/** + * 创建一次性物品的列 + * @returns {Ext.grid.ColumnModel} + */ +function createDiposableGoodsCm() { + return new top.Ext.grid.ColumnModel([{ + id: 'id', + name: 'id', + hidden: productMode, + dataIndex: 'id' + }, { + id: 'diposableGoodsName', + header: "一次性物品名称", + dataIndex: 'diposableGoodsName', + width: 330 + }, { + id: 'deleteItem', + header: '删除操作', + renderer: function (v, p, record) { + var str = ""; + return str; + }, + dataIndex: 'button' + }]); +} + +/** + * 创建一次性物品model + * @returns {Function} + */ +function createDiposableGoodsConfig() { + return Ext.data.Record.create([{ + name: 'id', + name: 'diposableGoodsName', + name: 'sortNumber' + }]); +} + + +/** + * 校验是否已经重复 + * @param gridName + * @param id + * @returns {boolean} + */ +function isRepeat(gridName, id) { + var configGrid = top.Ext.getCmp(gridName).getStore(); + var repeat = false; + for (var i = 0; i < configGrid.getCount(); i++) { + var recordId = configGrid.getAt(i).data.id; + if (recordId == id) { + repeat = true; + } + } + return repeat; +} + + +/** + * 创建物品过滤模板 + * @returns {*} + */ +function createGoodFilterWin() { + return new top.Ext.Window({ + id: 'goodFilterWin', + layout: 'fit', + title: '物品过滤模板信息', + width: 900, + border: false, + modal: true, + autoHeight: true, + plain: true, + items: [formObj] + }); +} + +/** + * 创建按钮 + * @returns {[*,*]} + */ +function createButtons() { + return [{ + id: 'saveBtn', + text: '保存', + hidden: SSTS_GoodsFilterConfig_Update, + handler: save + }, { + text: '取消', + id: 'saveAndNewBtn', + handler: cancel + }]; +} + +function openTemplate(id) { + this.id = id; + //部门数据源 + var departmentStore = createDepartmentStore(); + var departItem = createDepartItem(); + var departJsonStore = createDepartJsonStore(); + var cm = createDepartCm(); + //器械包数据源 + var tousseStore = createTousseStore(); + var tousseItem = createTousseItem(); + var tousseItemsStore = createTousseItemsStore(); + var tousseCm = createTousseCm(); + //一次性物品数据源 + var diposableGoodsStore = createDiposableGoodsStore(); + var diposableGoodsItemsStore = createDiposableGoodsItemsStore(); + var diposableGoodsCm = createDiposableGoodsCm(); + var diposableGoodsConfig = createDiposableGoodsConfig(); + + formObj = new top.Ext.FormPanel({ + id: 'goodFilterForm', + frame: true, + labelSeparator: ':', + bodyStyle: 'padding:5px 5px 0px 5px', + labelAlign: 'right', + labelWidth: 80, + autoHeight: true, + autoScroll: true, + items: [{ + xtype: 'hidden', + name: 'id', + id: 'id' + }, { + layout: 'column', + items: [createBaseInfo(), { + columnWidth: 1, + layout: 'form', + labelWidth: 70, + items: [ + new top.Ext.grid.EditorGridPanel({ + id: 'configGrid', + store: departmentStore, + cm: cm, + width: 200, + height: 150, + frame: false, + viewConfig: { + forceFit: true + }, + bodyStyle: 'border:1px solid #afd7af', + autoExpandColumn: 'departName', + anchor: '100%', + clicksToEdit: 1,//设置点击几次才可编辑 + selModel: new top.Ext.grid.RowSelectionModel({ + singleSelect: false + }), + tbar: [{ + text: '申请科室 :' + }, { + xtype: 'combo', + id: 'departName', + name: 'departName', + queryParam: 'spell', + minChars: 0, + valueField: 'id', + displayField: 'name', + width: 285, + store: departJsonStore, + pageSize: 100, + listConfig: {width: 300}, + forceSelection: true, + lazyInit: true, + triggerAction: 'all', + hideTrigger: true, + typeAhead: false, + allowBlank: true, + anchor: '97%', + listeners: { + specialkey: function (field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + var n = top.Ext.getCmp('configGrid').getStore().getCount();// 获得总行数 + var departId = top.Ext.getCmp('departName').getValue(); + var departName = top.Ext.getCmp('departName').getRawValue(); + if (isRepeat('configGrid', departId) == false) { + if (departId > 0) { + var p = new departItem({ + id: departId, + departName: departName + }); + top.Ext.getCmp('configGrid').stopEditing();// 停止编辑 + departmentStore.add(p); + } + } else { + showResult(departName + ",已存在!"); + } + top.Ext.getCmp('departName').setValue(""); + top.Ext.getCmp('departName').setRawValue(""); + } + } + } + }, { + text: '添加', + handler: function () { + var n = top.Ext.getCmp('configGrid').getStore().getCount();// 获得总行数 + var departId = top.Ext.getCmp('departName').getValue(); + var departName = top.Ext.getCmp('departName').getRawValue(); + if (isRepeat('configGrid', departId) == false) { + if (departId != "" && departId != null) { + var p = new departItem({ + id: departId, + departName: departName + }); + top.Ext.getCmp('configGrid').stopEditing();// 停止编辑 + departmentStore.add(p); + } + } else { + showResult(departName + ",已存在!"); + } + top.Ext.getCmp('departName').setValue(""); + top.Ext.getCmp('departName').setRawValue(""); + } + }, { + text: '添加全部', + iconCls: 'icon_systemset', + handler: function () { + Ext.Ajax.request({ + url: WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do', + success: function (response, options) { + var result = Ext.decode(response.responseText); + var lenth = result.data.length; + for (var index = 0; index < lenth; index++) { + var name = result.data[index].name; + var departId = result.data[index].id; + var b = isRepeat('configGrid', departId); + if (b) { + showResult('科室:[' + name + '] 已存在!'); + continue; + } + var f = (name == "" ? false : true); + if (f) { + var p = new departItem({ + id: departId, + departName: name + }); + top.Ext.getCmp('configGrid').stopEditing();// 停止编辑 + departmentStore.add(p); + } + } + }, + failure: function (response, options) { + } + }); + } + }] + })] + }, { + columnWidth: 0.5, + layout: 'form', + labelWidth: 70, + items: [new top.Ext.grid.EditorGridPanel({ + id: 'configGrid2', + store: tousseItemsStore, + cm: tousseCm, + width: 200, + height: 400, + frame: false, + viewConfig: { + forceFit: true + }, + bodyStyle: 'border:1px solid #afd7af', + anchor: '99%', + clicksToEdit: 1,//设置点击几次才可编辑 + selModel: new top.Ext.grid.RowSelectionModel({ + singleSelect: false + }), + tbar: [{ + text: '器械包名称:' + }, { + xtype: 'combo', + id: 'package', + name: 'package', + queryParam: 'spell', + minChars: 0, + valueField: 'id', + displayField: 'displayName', + width: 280, + store: tousseStore, + pageSize: 100, + listConfig: {width: 300}, + forceSelection: true, + lazyInit: true, + triggerAction: 'all', + hideTrigger: true, + typeAhead: false, + allowBlank: true, + anchor: '97%', + listeners: { + specialkey: function (field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + var n = top.Ext.getCmp('configGrid2').getStore().getCount();// 获得总行数 + var tousseId = top.Ext.getCmp('package').getValue(); + var tousseName = top.Ext.getCmp('package').getRawValue(); + if (isRepeat('configGrid2', tousseId) == false) { + if (tousseId > 0) { + var p = new tousseItem({ + id: tousseId, + tousseName: tousseName + }); + top.Ext.getCmp('configGrid2').stopEditing();// 停止编辑 + tousseItemsStore.add(p);// 插入到最后一行 + } + } else { + showResult(tousseName + ",已存在!"); + } + top.Ext.getCmp('package').setValue(""); + top.Ext.getCmp('package').setRawValue(""); + } + } + } + }, { + text: '添加', + handler: function () { + var n = top.Ext.getCmp('configGrid2').getStore().getCount();// 获得总行数 + var tousseId = top.Ext.getCmp('package').getValue(); + var tousseName = top.Ext.getCmp('package').getRawValue(); + if (isRepeat('configGrid2', tousseId) == false) { + if (tousseId > 0) { + var p = new tousseItem({ + id: tousseId, + tousseName: tousseName + }); + top.Ext.getCmp('configGrid2').stopEditing();// 停止编辑 + tousseItemsStore.add(p);// 插入到最后一行 + } + } else { + showResult(tousseName + ",已存在!"); + } + top.Ext.getCmp('package').setValue(""); + top.Ext.getCmp('package').setRawValue(""); + } + }] + })] + } + // , { + // columnWidth: 0.5, + // layout: 'form', + // labelWidth: 70, + // items: [new top.Ext.grid.EditorGridPanel({ + // id: 'configGrid3', + // store: diposableGoodsItemsStore, + // cm: diposableGoodsCm, + // width: 200, + // height: 400, + // frame: false, + // viewConfig: { + // forceFit: true + // }, + // bodyStyle: 'border:1px solid #afd7af', + // autoExpandColumn: 'cleaningMethodModel', + // anchor: '100%', + // clicksToEdit: 1,//设置点击几次才可编辑 + // selModel: new top.Ext.grid.RowSelectionModel({ + // singleSelect: false + // }), + // tbar: [{ + // text: '一次性物品名称:' + // }, { + // xtype: 'hidden', + // id: 'goodsId', + // name: 'goodsId' + // }, { + // xtype: 'combo', + // id: 'diposableGoods', + // name: 'diposableGoods', + // queryParam: 'spell', + // minChars: 0, + // listWidth: 550, + // valueField: 'id', + // displayField: 'displayName', + // width: 280, + // store: diposableGoodsStore, + // pageSize: 100, + // listConfig: {width: 300}, + // forceSelection: true, + // lazyInit: true, + // triggerAction: 'all', + // hideTrigger: true, + // typeAhead: false, + // allowBlank: true, + // anchor: '97%', + // listeners: { + // select: function (combo, record, index) { + // top.Ext.getCmp('diposableGoods').setValue(record.data.name); + // top.Ext.getCmp('goodsId').setValue(record.data.id); + // }, + // specialkey: function (field, ee) { + // if (ee.getKey() == Ext.EventObject.ENTER) { + // var n = top.Ext.getCmp('configGrid3').getStore().getCount();// 获得总行数 + // var diposableGoodsId = top.Ext.getCmp('goodsId').getValue(); + // var diposableGoodsName = top.Ext.getCmp('diposableGoods').getRawValue(); + // if (isRepeat('configGrid3', diposableGoodsId) == false) { + // if (diposableGoodsId > 0) { + // var p = new diposableGoodsConfig({ + // id: diposableGoodsId, + // diposableGoodsName: diposableGoodsName + // }); + // top.Ext.getCmp('configGrid3').stopEditing();// 停止编辑 + // diposableGoodsItemsStore.add(p);// 插入到最后一行 + // } + // } else { + // showResult(diposableGoodsName + ",已存在!"); + // } + // top.Ext.getCmp('diposableGoods').setValue(""); + // top.Ext.getCmp('diposableGoods').setRawValue(""); + // } + // } + // } + // }, { + // text: '添加', + // handler: function () { + // var n = top.Ext.getCmp('configGrid3').getStore().getCount();// 获得总行数 + // var diposableGoodsId = top.Ext.getCmp('goodsId').getValue(); + // var diposableGoodsName = top.Ext.getCmp('diposableGoods').getRawValue(); + // if (isRepeat('configGrid3', diposableGoodsId) == false) { + // if (diposableGoodsId > 0) { + // var p = new diposableGoodsConfig({ + // id: diposableGoodsId, + // diposableGoodsName: diposableGoodsName + // }); + // top.Ext.getCmp('configGrid3').stopEditing(); + // diposableGoodsItemsStore.add(p); + // } + // } else { + // showResult(diposableGoodsName + ",已存在!"); + // } + // top.Ext.getCmp('diposableGoods').setValue(""); + // top.Ext.getCmp('diposableGoods').setRawValue(""); + // } + // }] + // })] + // } + ] + }], + buttons: createButtons() + }); + goodFilterWin = createGoodFilterWin(); + goodFilterWin.show(); + if (id != 0) { + formObj.form.load({ + // url: WWWROOT + '/disinfectSystem/baseData/departmentAppTemplateAction!loadAppTemplate.do', + url: WWWROOT + '/disinfectSystem/goodFilterConfig/goodFilterAction!loadGoodFilterById.do', + method: 'GET', + params: {id: id}, + waitMsg: '正在加载数据,请稍候', + success: function (form, action) { + var baseInfo = action.result.data[0].baseInfo; + top.Ext.getCmp('templateName').setValue(baseInfo.templateName); + top.Ext.getCmp('modifyTime').setValue(baseInfo.modifyTime); + top.Ext.getCmp('operator').setValue(baseInfo.operator); + top.Ext.getCmp('templateType').setValue(baseInfo.listType); + var departInfo = action.result.data[1].departInfo; + departmentStore.loadData(departInfo); + var tousseInfo = action.result.data[2].tousseInfo; + tousseItemsStore.loadData(tousseInfo); + top.Ext.getCmp('id').setValue(id); + }, + failure: function (form, action) { + alert('失败'); + } + }); + } +} + +function validateAndSubmit() { + //申请部门 + var deptInfo = getDeptInfo(); + //申请的器械包 + var tousseInfo = getTousseInfo(); + // var baseInfo = { + // id: top.Ext.getCmp('id').getValue(), + // listType: top.Ext.getCmp('templateType').getValue() + // } + formObj.form.submit({ + url: WWWROOT + '/disinfectSystem/goodFilterConfig/goodFilterAction!saveOrUpdateGoodFilter.do', + params: { + deptInfo: Ext.encode(deptInfo), + // tousseInfo: JSON.stringify(tousseInfo) + tousseInfo: Ext.encode(tousseInfo) + }, + method: 'POST', + waitMsg: '正在保存数据,请稍候', + waitTitle: '提交表单', + success: function (form, action) { + goodFilterWin.close(); + showResult('保存成功'); + grid.dwrReload(); + }, + failure: function (form, action) { + showResult(action.result.message); + top.Ext.getCmp('saveBtn').enable(); + top.Ext.getCmp('saveAndPrint').enable(); + } + }); +} + +function save() { + this.disable();//使保存按钮不可用 + if (!formObj.form.isValid()) { + showResult('请正确填写表单各值'); + this.enable(); + return false; + } + validateAndSubmit(); +} + +function cancel() { + goodFilterWin.close(); +}