Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManagerImpl.java (revision 38528) @@ -0,0 +1,671 @@ +package com.forgon.disinfectsystem.basedatamanager.borrow.service; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.borrow.BorrowCardinality; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.vo.BorrowCardinalityVo; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.entity.PageEntity; +import com.forgon.exception.SystemException; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.util.SqlUtils; + +/** + * 【借物基数管理设置】ZSWY-233 + */ +public class BorrowCardinalityManagerImpl extends BasePoManagerImpl implements BorrowCardinalityManager{ + + private InitDbConnection dbConnection; + + private OrgUnitManager orgUnitManager; + + private SupplyRoomConfigManager supplyRoomConfigManager; + + private DateQueryAdapter dateQueryAdapter; + + public void setSupplyRoomConfigManager( + SupplyRoomConfigManager supplyRoomConfigManager) { + this.supplyRoomConfigManager = supplyRoomConfigManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setOrgUnitManager(OrgUnitManager orgUnitManager) { + this.orgUnitManager = orgUnitManager; + } + + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + + @Override + public void loadBorrowCardinalityList(String tousseName, String queryMode, Long tousseGroupId, PageEntity page) { + + OrgUnit orgUnit = orgUnitManager.getByCode(AcegiHelper.getCurrentOrgUnitCode()); + if(orgUnit == null){ + throw new SystemException("当前登录科室不存在!"); + } + StringBuffer fromSql = new StringBuffer(); + fromSql.append(" from "); + fromSql.append(BorrowCardinality.class.getSimpleName()); + fromSql.append(" bc join "); + fromSql.append(OrgUnit.class.getSimpleName()); + fromSql.append(" ou on ou.id = bc.orgUnitId "); + fromSql.append(" join "); + fromSql.append(TousseDefinition.class.getSimpleName()); + fromSql.append(" td on td.id = bc.tousseDefinitionId "); + fromSql.append(" where bc.orgUnitId = "); + fromSql.append(orgUnit.getId()); + + if(StringUtils.isNotBlank(tousseName)){ + if(StringUtils.equals(queryMode, "精确查询")){ + fromSql.append(String.format(" and td.name = '%s' ", tousseName)); + }else if(StringUtils.equals(queryMode, "模糊查询")){ + fromSql.append(" and td.name like '%" + tousseName + "%' "); + } + } + if(DatabaseUtil.isPoIdValid(tousseGroupId)){ + fromSql.append(" and td.tousseGroupID = " + tousseGroupId); + } + + int count = objectDao.countBySql("select count(1) " + fromSql.toString()); + if(count == 0){ + return; + } + page.setCount(count); + int firstIndex = 0; + int maxResults = 0; + if(page != null){ + firstIndex = page.getStart(); + maxResults = page.getLimit(); + } + if(firstIndex <= 0){ + firstIndex = 0; + } + if(maxResults <= 0){ + maxResults = 20; + } + + StringBuffer querySql = new StringBuffer(); + querySql.append("select bc.id, bc.cardinalNum "); + querySql.append(", ou.id orgUnitId, ou.name orgUnitName "); + querySql.append(", td.id tousseDefinitionId, td.name tousseDefinitionName "); + querySql.append(fromSql.toString()); + + String sql = ""; + if(dbConnection.isSqlServer()){ + sql = getSqlServerQuerySqlByPage(querySql.toString(), firstIndex, maxResults, "id", " order by id "); + }else if(dbConnection.isOracle()){ + sql = SqlUtils.getOracleQuerySqlByPage(querySql.toString(), firstIndex, maxResults); + }else{ + return; + } + + List voList = new ArrayList(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql); + while(rs.next()){ + Long id = rs.getLong("id"); + Integer cardinalNum = rs.getInt("cardinalNum"); + Long orgUnitId = rs.getLong("orgUnitId"); + String orgUnitName = rs.getString("orgUnitName"); + Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); + String tousseDefinitionName = rs.getString("tousseDefinitionName"); + BorrowCardinalityVo vo = new BorrowCardinalityVo(); + vo.setId(id); + vo.setCardinalNum(cardinalNum); + vo.setOrgUnitId(orgUnitId); + vo.setOrgUnitName(orgUnitName); + vo.setTousseDefinitionId(tousseDefinitionId); + vo.setTousseDefinitionName(tousseDefinitionName); + voList.add(vo); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + //查询已借基数 + setBorrowedCardinalNum(voList, orgUnit); + page.setList(voList); + } + + /** + * 查询已借基数 + * @param voList + * @param orgUnit + */ + private void setBorrowedCardinalNum(List voList, OrgUnit orgUnit) { + if(CollectionUtils.isEmpty(voList) || orgUnit == null){ + return; + } + List tousseDefinitionIdList = voList.stream().map(vo -> vo.getTousseDefinitionId()).collect(Collectors.toList()); + //查询已经借出数量 + Map unReturnAmountMap = getUnReturnAmountMap(tousseDefinitionIdList, orgUnit.getOrgUnitCoding()); + if(MapUtils.isEmpty(unReturnAmountMap)){ + return; + } + for (BorrowCardinalityVo vo : voList) { + vo.setBorrowedCardinalNum(unReturnAmountMap.get(vo.getTousseDefinitionId())); + } + } + + /** + * 查询已经借出数量 + * @param tousseDefinitionIdList + * @param orgUnitCoding + * @return + */ + @Override + public Map getUnReturnAmountMap(List tousseDefinitionIdList, String orgUnitCoding) { + + if(CollectionUtils.isEmpty(tousseDefinitionIdList) || StringUtils.isBlank(orgUnitCoding)){ + throw new SystemException("参数异常"); + } + //1、查询归还状态为“未归还”、“部分归还”、“归还待确认”借物单的器械包发货数量 + Map borrowedAmountMap = new HashMap(); + StringBuffer borrowedAmountSql = new StringBuffer(); + borrowedAmountSql.append("select ti.ancestorID, ti.sendOutAmount "); + borrowedAmountSql.append(" from "); + borrowedAmountSql.append(InvoicePlan.class.getSimpleName()); + borrowedAmountSql.append(" ip join "); + borrowedAmountSql.append(TousseItem.class.getSimpleName()); + borrowedAmountSql.append(" ti on ti.recyclingApplication_ID = ip.id "); + borrowedAmountSql.append(String.format(" where ip.type = '%s' ", InvoicePlan.TYPE_BORROWINGSINGLE)); + borrowedAmountSql.append(String.format(" and ip.handleDepartCoding = '%s' ", orgUnitCoding)); + borrowedAmountSql.append(String.format(" and ip.returnStatus in ('%s','%s','%s') ", InvoicePlan.RETURN_STATUS_UNRETURNED, InvoicePlan.RETURN_STATUS_PARTIALLY_RETURNED, InvoicePlan.RETURN_STATUS_AWAITCONFIRM)); + borrowedAmountSql.append(" and " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.ancestorID", tousseDefinitionIdList)); + //borrowedAmountSql.append(" and (ti.isTerminated is null or ti.isTerminated <> 1) "); + ResultSet rs = null; + try { + rs = objectDao.executeSql(borrowedAmountSql.toString()); + while(rs.next()){ + Long ancestorID = rs.getLong("ancestorID"); + Integer amount = rs.getInt("sendOutAmount"); + if(ancestorID == null || amount == null){ + continue; + } + Integer borrowedAmount = borrowedAmountMap.get(ancestorID); + if(borrowedAmount == null){ + borrowedAmount = 0; + } + borrowedAmount += amount; + borrowedAmountMap.put(ancestorID, borrowedAmount); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + if(MapUtils.isEmpty(borrowedAmountMap)){ + return borrowedAmountMap; + } + + //2、减去归还状态为部分归还、归还待确认的借物单上,已经归还的物品数量 + StringBuffer returnAmountSql = new StringBuffer(); + returnAmountSql.append("select ti.ancestorID, ti.recyclingAmount "); + returnAmountSql.append(" from "); + returnAmountSql.append(InvoicePlan.class.getSimpleName()); + returnAmountSql.append(" ip join "); + returnAmountSql.append(RecyclingApplication.class.getSimpleName()); + returnAmountSql.append(" rIp on rIp.recyclingApplication_id = ip.id "); + returnAmountSql.append(" join "); + returnAmountSql.append(TousseItem.class.getSimpleName()); + returnAmountSql.append(" ti on ti.recyclingApplication_ID = rIp.id "); + returnAmountSql.append(String.format(" where ip.type = '%s' ", InvoicePlan.TYPE_BORROWINGSINGLE)); + returnAmountSql.append(String.format(" and ip.handleDepartCoding = '%s' ", orgUnitCoding)); + returnAmountSql.append(String.format(" and ip.returnStatus in ('%s','%s') ", InvoicePlan.RETURN_STATUS_PARTIALLY_RETURNED, InvoicePlan.RETURN_STATUS_AWAITCONFIRM)); + returnAmountSql.append(" and " + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("ti.ancestorID", tousseDefinitionIdList)); + //returnAmountSql.append(" and (ti.isTerminated is null or ti.isTerminated <> 1) "); + ResultSet returnAmountRs = null; + try { + returnAmountRs = objectDao.executeSql(returnAmountSql.toString()); + while(returnAmountRs.next()){ + Long ancestorID = returnAmountRs.getLong("ancestorID"); + Integer recyclingAmount = returnAmountRs.getInt("recyclingAmount"); + if(ancestorID == null || recyclingAmount == null){ + continue; + } + Integer borrowedAmount = borrowedAmountMap.get(ancestorID); + if(borrowedAmount == null){ + continue; + } + borrowedAmount -= recyclingAmount; + if(borrowedAmount < 0){ + borrowedAmount = 0; + } + borrowedAmountMap.put(ancestorID, borrowedAmount); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(returnAmountRs); + } + + return borrowedAmountMap; + } + + /** + * 根据sql语句拼接分页查询语句 + * @param sql 原查询语句(可包含查询条件、排序等) + * @param start 开始记录,即从第多少开始 + * @param limit 查询偏移量,即查询多少个 + * @param pageColumnName + * @return + */ + public String getSqlServerQuerySqlByPage(String querySql, int start, int limit, String pageColumnName, String orderSql){ + StringBuffer querySqlByPage = new StringBuffer(); + if(start == 0){ + querySqlByPage.append("select top "+ limit +" * from ("+ querySql +") t"); + }else{ + querySqlByPage.append("select top "+ limit +" * from ("+ querySql +") t "); + querySqlByPage.append("where "+ pageColumnName +" not in (select top "+ (start) +" "+ pageColumnName +" from ("+ querySql +") t0 " + orderSql + " )"); + } + querySqlByPage.append(orderSql); + return querySqlByPage.toString(); + } + + @Override + public void saveBorrowCardinality(BorrowCardinalityVo borrowCardinalityVo) { + + BorrowCardinality borrowCardinality = null; + if(DatabaseUtil.isPoIdValid(borrowCardinalityVo.getId())){ + borrowCardinality = this.get(borrowCardinalityVo.getId()); + } + if(borrowCardinality == null){ + borrowCardinality = new BorrowCardinality(); + //科室为当前登录科室 + OrgUnit orgUnit =orgUnitManager.getByCode(AcegiHelper.getCurrentOrgUnitCode()); + if(orgUnit != null){ + borrowCardinality.setOrgUnitId(orgUnit.getId()); + } + } + borrowCardinality.setCardinalNum(borrowCardinalityVo.getCardinalNum()); + borrowCardinality.setTousseDefinitionId(borrowCardinalityVo.getTousseDefinitionId()); + + if(!DatabaseUtil.isPoIdValid(borrowCardinality.getOrgUnitId())){ + throw new SystemException("科室id无效"); + } + if(!DatabaseUtil.isPoIdValid(borrowCardinality.getTousseDefinitionId())){ + throw new SystemException("器械包定义ID无效"); + } + if(borrowCardinality.getCardinalNum() == null || borrowCardinality.getCardinalNum().intValue() <= 0){ + throw new SystemException("基数必须大于0"); + } + TousseDefinition td = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), borrowCardinality.getTousseDefinitionId()); + if(td == null){ + throw new SystemException("器械包定义ID无效"); + } + if(!td.getForDisplay()){ + throw new SystemException("器械包定义ID无效"); + } + if(!td.isDisinfection() && !td.isInsideTousse() && !td.isHomeMadeTousse()){ + throw new SystemException(td.getTousseType() + "不支持借物"); + } + OrgUnit orgUnit = orgUnitManager.get(borrowCardinality.getOrgUnitId()); + if(orgUnit == null){ + throw new SystemException("科室id无效"); + } + //判断是否有重复基数,orgUnitId+tousseDefinitionId为唯一主键 + StringBuffer sql = new StringBuffer(); + sql.append("select count(1) from "); + sql.append(BorrowCardinality.class.getSimpleName()); + sql.append(" where orgUnitId = "); + sql.append(borrowCardinality.getOrgUnitId()); + sql.append(" and tousseDefinitionId = "); + sql.append(borrowCardinality.getTousseDefinitionId()); + if(DatabaseUtil.isPoIdValid(borrowCardinality.getId())){ + sql.append(" and id <> "); + sql.append(borrowCardinality.getId()); + } + if(objectDao.countBySql(sql.toString()) > 0){ + throw new SystemException(String.format("当前登录科室已经存在%s的基数设置", td.getName())); + } + + //判断当前科室借出当前物品的数量是否大于基数 + List tousseDefinitionIdList = new ArrayList(); + tousseDefinitionIdList.add(borrowCardinality.getTousseDefinitionId()); + Map unReturnAmountMap = getUnReturnAmountMap(tousseDefinitionIdList , orgUnit.getOrgUnitCoding()); + if(MapUtils.isNotEmpty(unReturnAmountMap)){ + Integer unReturnAmount = unReturnAmountMap.get(borrowCardinality.getTousseDefinitionId()); + if(unReturnAmount != null && unReturnAmount > borrowCardinality.getCardinalNum()){ + throw new SystemException(String.format("%s的已经被借走尚未归还的数量为%s,大于基数%s", td.getName(), unReturnAmount, borrowCardinality.getCardinalNum())); + } + } + + this.save(borrowCardinality); + } + + @Override + public void borrowAmountExceedCardinalNum(RecyclingApplication recyclingApplication, Collection srcTousseItemVoList) { + if(CollectionUtils.isEmpty(srcTousseItemVoList)){ + return; + } + OrgUnit handleDepart = orgUnitManager.getByCode(recyclingApplication.getHandleDepartCoding()); + if(handleDepart == null){ + throw new SystemException("借物单处理科室不存在!"); + } + //器械包借物数量map + Map borrowAmountMap = buildBorrowAmountMap(srcTousseItemVoList); + if(MapUtils.isEmpty(borrowAmountMap)){ + return; + } + List tousseAncestorIDList = new ArrayList(); + tousseAncestorIDList.addAll(borrowAmountMap.keySet()); + //器械包借物基数map + Map cardinalNumMap = getCardinalNumMap(tousseAncestorIDList, handleDepart); + if(MapUtils.isEmpty(cardinalNumMap)){ + return; + } + for (Entry entry : borrowAmountMap.entrySet()) { + Long tousseAncestorID = entry.getKey(); + Integer borrowAmount = entry.getValue(); + Integer cardinalNum = cardinalNumMap.get(tousseAncestorID); + if(borrowAmount == null || borrowAmount.intValue() <= 0){ + continue; + } + if(cardinalNum == null || cardinalNum.intValue() <= 0){ + //没用设置借用基数 + continue; + } + //单次申请数量不可超过X + if(borrowAmount > cardinalNum){ + throw new SystemException(String.format("单次申请数量不可超过%s", cardinalNum)); + } + } + } + + /** + * 返回借物数量 + * @param srcTousseItemVoList + * @return + */ + private Map buildBorrowAmountMap(Collection srcTousseItemVoList) { + Map borrowAmountMap = new HashMap(); + for (TousseItemVo tousseItemVo : srcTousseItemVoList) { + Integer amount = tousseItemVo.getAmount(); + Long ancestorId = tousseItemVo.getAncestorId(); + if(DatabaseUtil.isPoIdValid(ancestorId)){ + Integer borrowAmount = borrowAmountMap.get(ancestorId); + if(borrowAmount == null){ + borrowAmount = 0; + } + borrowAmount += amount; + borrowAmountMap.put(ancestorId, borrowAmount); + } + } + return borrowAmountMap; + } + + /** + * 查询器械包借物基数 + * @param tousseAncestorIDList + * @param handleDepart + * @return + */ + @Override + public Map getCardinalNumMap(List tousseAncestorIDList, OrgUnit handleDepart) { + if(CollectionUtils.isEmpty(tousseAncestorIDList) || handleDepart == null){ + throw new SystemException("参数异常!"); + } + Map cardinalNumMap = new HashMap(); + StringBuffer sql = new StringBuffer(); + sql.append("select bc.tousseDefinitionId, bc.cardinalNum "); + sql.append(" from "); + sql.append(BorrowCardinality.class.getSimpleName()); + sql.append(" bc where bc.orgUnitId = "); + sql.append(handleDepart.getId()); + sql.append(" and "); + sql.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("bc.tousseDefinitionId", tousseAncestorIDList)); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql.toString()); + while(rs.next()){ + Long tousseDefinitionId = rs.getLong("tousseDefinitionId"); + Integer cardinalNum = rs.getInt("cardinalNum"); + cardinalNumMap.put(tousseDefinitionId, cardinalNum); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return cardinalNumMap; + } + + @Override + public void borrowAmountExceedAvailableCardinalNum(RecyclingApplication recyclingApplication, Collection srcTousseItemVoList) { + if(CollectionUtils.isEmpty(srcTousseItemVoList)){ + return; + } + OrgUnit handleDepart = orgUnitManager.getByCode(recyclingApplication.getHandleDepartCoding()); + if(handleDepart == null){ + throw new SystemException("借物单处理科室不存在!"); + } + //器械包借物数量map + Map borrowAmountMap = buildBorrowAmountMap(srcTousseItemVoList); + if(MapUtils.isEmpty(borrowAmountMap)){ + return; + } + List tousseAncestorIDList = new ArrayList(); + tousseAncestorIDList.addAll(borrowAmountMap.keySet()); + + //可借基数map + Map availableCardinalNumMap = getAvailableCardinalNumMap(tousseAncestorIDList, handleDepart); + for (Entry entry : borrowAmountMap.entrySet()) { + Long tousseAncestorID = entry.getKey(); + Integer borrowAmount = entry.getValue(); + Integer availableCardinalNum = availableCardinalNumMap.get(tousseAncestorID); + if(borrowAmount == null || borrowAmount.intValue() <= 0){ + continue; + } + if(availableCardinalNum == null || availableCardinalNum.intValue() <= 0){ + throw new SystemException("本次借出物品超过可借基数,发货时间未定,是否继续?"); + } + //单次申请数量不可超过X + if(borrowAmount > availableCardinalNum){ + throw new SystemException("本次借出物品超过可借基数,发货时间未定,是否继续?"); + } + } + } + + /** + * 查询器械包可用借物基数 + * @param tousseAncestorIDList + * @param handleDepart + * @return + */ + @Override + public Map getAvailableCardinalNumMap(List tousseAncestorIDList, OrgUnit handleDepart) { + //可借基数map + Map availableCardinalNumMap = new HashMap(); + //器械包借物基数map + Map cardinalNumMap = getCardinalNumMap(tousseAncestorIDList, handleDepart); + if(MapUtils.isEmpty(cardinalNumMap)){ + return availableCardinalNumMap; + } + //只查有设置借物基数的包的已借出、待归还数量 + List newTousseAncestorIDList = new ArrayList(); + newTousseAncestorIDList.addAll(cardinalNumMap.keySet()); + //器械包已借出、待归还数量map + Map unReturnAmountMap = getUnReturnAmountMap(newTousseAncestorIDList, handleDepart.getOrgUnitCoding()); + //可借基数map + availableCardinalNumMap = buildAvailableCardinalNumMap(cardinalNumMap, unReturnAmountMap); + return availableCardinalNumMap; + } + + /** + * 返回可借基数,可借基数 = 基数 – 已借基数 + * @param cardinalNumMap + * @param unReturnAmountMap + * @return + */ + private Map buildAvailableCardinalNumMap(Map cardinalNumMap, Map unReturnAmountMap) { + Map availableCardinalNumMap = new HashMap(); + if(MapUtils.isEmpty(cardinalNumMap)){ + return availableCardinalNumMap; + } + if(MapUtils.isEmpty(unReturnAmountMap)){ + return cardinalNumMap; + } + for (Entry entry : cardinalNumMap.entrySet()) { + Long tousseAncestorID = entry.getKey(); + Integer cardinalNum = entry.getValue(); + Integer unReturnAmount = unReturnAmountMap.get(tousseAncestorID); + if(unReturnAmount != null && unReturnAmount.intValue() > 0){ + availableCardinalNumMap.put(tousseAncestorID, cardinalNum - unReturnAmount); + }else{ + availableCardinalNumMap.put(tousseAncestorID, cardinalNum); + } + + } + return availableCardinalNumMap; + } + + @Override + public JSONArray borrowRemind(String handleDepartCode) { + JSONArray result = new JSONArray(); + if(!supplyRoomConfigManager.isFirstOrSecondSupplyRoomOrgUnit(handleDepartCode)){ + return result; + } + + //1、查询归还状态为“未归还”、“部分归还”、“归还待确认”的借物单,待发货器械包数量 + StringBuffer sql = new StringBuffer(); + sql.append("select ip.applicationTime, ip.serialNumber, ip.depart, ip.applicant, ti.tousseName, ti.amount, ti.sendOutAmount "); + sql.append(" from "); + sql.append(InvoicePlan.class.getSimpleName()); + sql.append(" ip join "); + sql.append(TousseItem.class.getSimpleName()); + sql.append(" ti on ti.recyclingApplication_ID = ip.id "); + sql.append(String.format(" where ip.type = '%s' ", InvoicePlan.TYPE_BORROWINGSINGLE)); + sql.append(String.format(" and ip.handleDepartCoding = '%s' ", handleDepartCode)); + sql.append(String.format(" and ip.returnStatus in ('%s','%s','%s') ", InvoicePlan.RETURN_STATUS_UNRETURNED, InvoicePlan.RETURN_STATUS_PARTIALLY_RETURNED, InvoicePlan.RETURN_STATUS_AWAITCONFIRM)); + String[] defaultQueryStartDateAndEndDateArray = CssdUtils.getQueryPeroidOfModule(CssdUtils.getQueryPeroidOfModule("borrow_AlarmWindow")); + if(defaultQueryStartDateAndEndDateArray != null){ + sql.append( " and " + dateQueryAdapter.dateAreaSql("ip.applicationTime", defaultQueryStartDateAndEndDateArray[0] + " 00:00:00", defaultQueryStartDateAndEndDateArray[1] + " 23:59:59")); + } + //sql.append(" and (ti.isTerminated is null or ti.isTerminated <> 1) "); + Map invoicePlanMap = new LinkedHashMap(); + ResultSet rs = null; + try { + rs = objectDao.executeSql(sql.toString()); + while(rs.next()){ + String serialNumber = rs.getString("serialNumber"); + String depart = rs.getString("depart"); + String applicant = rs.getString("applicant"); + String tousseName = rs.getString("tousseName"); + Integer amount = rs.getInt("amount"); + Integer sendOutAmount = rs.getInt("sendOutAmount"); + Date applicationTime = rs.getTimestamp("applicationTime"); + amount = (amount == null ? 0 : amount); + sendOutAmount = (sendOutAmount == null ? 0 : sendOutAmount); + if(amount <= sendOutAmount){ + //全部发货的不用提醒 + continue; + } + InvoicePlan ip = invoicePlanMap.get(serialNumber); + if(ip == null){ + ip = new InvoicePlan(); + } + ip.setSerialNumber(serialNumber); + ip.setDepart(depart); + ip.setApplicant(applicant); + ip.setApplicationTime(applicationTime); + List applicationItems = ip.getApplicationItems(); + if(applicationItems == null){ + applicationItems = new ArrayList(); + } + TousseItem ti = new TousseItem(); + ti.setTousseName(tousseName); + //ti.setAmount(amount - sendOutAmount); + ti.setAmount(amount); + applicationItems.add(ti); + ip.setApplicationItems(applicationItems); + invoicePlanMap.put(serialNumber, ip); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + + if(MapUtils.isEmpty(invoicePlanMap)){ + return result; + } + + for (Entry entry : invoicePlanMap.entrySet()) { + InvoicePlan ip = entry.getValue(); + JSONObject json = new JSONObject(); + json.put("serialNumber", ip.getSerialNumber()); + json.put("applicationTime", DateTools.getFormatDateStr(ip.getApplicationTime(), DateTools.COMMON_DATE_HM)); + json.put("depart", ip.getDepart()); + json.put("applicant", ip.getApplicant()); + String lendGoodsBrief = buildLendGoodsBrief(ip.getApplicationItems()); + json.put("lendGoodsBrief", lendGoodsBrief); + result.add(json); + } + + return result; + } + + /** + * 返回物品简要 + * @param applicationItems + * @return + */ + private String buildLendGoodsBrief(List applicationItems) { + if(CollectionUtils.isEmpty(applicationItems)){ + return ""; + } + Map tousseAmountMap = new HashMap(); + for (TousseItem tousseItem : applicationItems) { + String tousseName = tousseItem.getTousseName(); + Integer amount = tousseItem.getAmount(); + Integer tousseAmount = tousseAmountMap.get(tousseName); + if(tousseAmount == null){ + tousseAmount = 0; + } + tousseAmount += amount; + tousseAmountMap.put(tousseName, tousseAmount); + } + List lendGoodsBriefList = new ArrayList(); + for(Entry entry : tousseAmountMap.entrySet()){ + lendGoodsBriefList.add(entry.getKey() + "x" + entry.getValue()); + } + return StringUtils.join(lendGoodsBriefList, ","); + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/service/BorrowCardinalityManager.java (revision 38528) @@ -0,0 +1,86 @@ +package com.forgon.disinfectsystem.basedatamanager.borrow.service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.borrow.BorrowCardinality; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.disinfectsystem.vo.BorrowCardinalityVo; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.entity.PageEntity; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * 【借物基数管理设置】ZSWY-233 + */ +public interface BorrowCardinalityManager extends BasePoManager{ + + /** + * 分页展示借物基数管理设置,只查询当前登录科室相关的设置 + * @param tousseName 器械包名称 + * @param queryMode 查询模式:精确查询或者模糊查询 + * @param tousseGroupId 器械包分组Id + * @param page 分页参数 + */ + public void loadBorrowCardinalityList(String tousseName, String queryMode, Long tousseGroupId, + PageEntity page); + + /** + * 保存借物基数管理设置 + * @param borrowCardinality + */ + public void saveBorrowCardinality(BorrowCardinalityVo borrowCardinalityVo); + + /** + * 查询已经借出数量: + * 归还状态为“未归还”、“部分归还”、“归还待确认”借物单已经发货物品数量-归还状态为“部分归还”、“归还待确认”借物单已经归还物品数量 + * @param tousseDefinitionIdList 器械包定义的祖先包id + * @param orgUnitCoding 申请单的处理科室 + * @return + */ + public Map getUnReturnAmountMap(List tousseDefinitionIdList, String orgUnitCoding); + + /** + * 借物单物品的借用数量不能超过借用基数 + * @param recyclingApplication 借物单 + * @param srcTousseItemVoList 申请物品 + */ + public void borrowAmountExceedCardinalNum(RecyclingApplication recyclingApplication, + Collection srcTousseItemVoList); + + /** + * 借物单物品的借用数量不能超过可借用基数,可借基数 = 基数 – 已借基数 + * @param recyclingApplication 借物单 + * @param srcTousseItemVoList 申请物品 + */ + public void borrowAmountExceedAvailableCardinalNum(RecyclingApplication recyclingApplication, + Collection srcTousseItemVoList); + + /** + * 查询器械包可借基数(器械包未设置借物基数时,可借基数=null) + * @param tousseAncestorIDList 器械包定义祖先包id + * @param handleDepart 处理科室 + * @return 器械包定义祖先包id-可借基数的map + */ + public Map getAvailableCardinalNumMap(List tousseAncestorIDList, OrgUnit handleDepart); + + /** + * 查询器械包借物基数(器械包未设置借物基数时,可借基数=null) + * @param tousseAncestorIDList + * @param handleDepart + * @return + */ + public Map getCardinalNumMap(List tousseAncestorIDList, OrgUnit handleDepart); + + /** + * 借物弹窗提示 + * @param handleDepartCode 处理科室编码 + * @return + */ + public JSONArray borrowRemind(String handleDepartCode); + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r38160 -r38528 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 38160) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 38528) @@ -55,6 +55,7 @@ import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.basedatamanager.borrow.service.BorrowCardinalityManager; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; import com.forgon.disinfectsystem.basedatamanager.supplier.service.SupplierManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; @@ -218,7 +219,13 @@ private PushRecordManager pushRecordManager; private UrgentNotificationManager urgentNotificationManager; + + private BorrowCardinalityManager borrowCardinalityManager; + public void setBorrowCardinalityManager(BorrowCardinalityManager borrowCardinalityManager) { + this.borrowCardinalityManager = borrowCardinalityManager; + } + public void setUrgentNotificationManager(UrgentNotificationManager urgentNotificationManager) { this.urgentNotificationManager = urgentNotificationManager; } @@ -4512,7 +4519,8 @@ @Override public JSONObject submitRecyclingApplication(RecyclingApplication recyclingApplication,RecyclingApplicationVo oldRecyclingApplication,boolean committedStatus, - String isInterveneAmount,String specifyDisposableTypes,String appGoodsStr,String tousseInstanceInfos,boolean autoReturnTheBorrowingTousse, boolean allowBorrowingTousseExceedingSpecifiedQuantity) throws RecyclingRecordException { + String isInterveneAmount,String specifyDisposableTypes,String appGoodsStr,String tousseInstanceInfos,boolean autoReturnTheBorrowingTousse, boolean allowBorrowingTousseExceedingSpecifiedQuantity, + boolean allowBorrowingTousseExceedingCardinalNum) throws RecyclingRecordException { // 已停用的科室不能进行科室申领 String orgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); OrgUnit ou = orgUnitManager.getByCode(orgUnitCode); @@ -4552,10 +4560,10 @@ if(enableAccordingTousseIsUrgentToMergeTheApplicationFunction && !DatabaseUtil.isPoIdValid(recyclingApplication.getId()) && StringUtils.isNotBlank(tousseInstanceInfos)){ - return accordingUrgentStatusSplitRecyclingApplication(recyclingApplication, oldRecyclingApplication,appGoodsStr, tousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus,allowBorrowingTousseExceedingSpecifiedQuantity); + return accordingUrgentStatusSplitRecyclingApplication(recyclingApplication, oldRecyclingApplication,appGoodsStr, tousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus,allowBorrowingTousseExceedingSpecifiedQuantity, allowBorrowingTousseExceedingCardinalNum); } - jsonObject = createReturnApplicationOrRecyclingApplication(recyclingApplication, oldRecyclingApplication,appGoodsStr, tousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus,allowBorrowingTousseExceedingSpecifiedQuantity); + jsonObject = createReturnApplicationOrRecyclingApplication(recyclingApplication, oldRecyclingApplication,appGoodsStr, tousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus,allowBorrowingTousseExceedingSpecifiedQuantity, allowBorrowingTousseExceedingCardinalNum); Collection srcTousseItemVoList = getTousseItemVos(appGoodsStr, tousseInstanceInfos); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_APPLICATION, Log.TYPE_ADD, "保存申请单:recyclingApplication=" + JSONUtil.toJsonObjecttWithSimpleProperty(recyclingApplication) @@ -4578,7 +4586,8 @@ * @param committedStatus * @return */ - private JSONObject accordingUrgentStatusSplitRecyclingApplication(RecyclingApplication recyclingApplication, RecyclingApplicationVo oldRecyclingApplication, String appGoodsStr, String tousseInstanceInfos, String specifyDisposableTypes, boolean autoReturnTheBorrowingTousse, boolean committedStatus, boolean allowBorrowingTousseExceedingSpecifiedQuantity) { + private JSONObject accordingUrgentStatusSplitRecyclingApplication(RecyclingApplication recyclingApplication, RecyclingApplicationVo oldRecyclingApplication, String appGoodsStr, String tousseInstanceInfos, String specifyDisposableTypes, boolean autoReturnTheBorrowingTousse, boolean committedStatus, + boolean allowBorrowingTousseExceedingSpecifiedQuantity, boolean allowBorrowingTousseExceedingCardinalNum) { JSONObject jsonObject = new JSONObject(); Set messageSet = new HashSet(); if(!DatabaseUtil.isPoIdValid(recyclingApplication.getId()) @@ -4606,7 +4615,7 @@ e.printStackTrace(); throw new RecyclingRecordException(e.getMessage()); } - splitJsonObject = createReturnApplicationOrRecyclingApplication(splitRecyclingApplication, splitOldRecyclingApplication,splitTousseInstanceInfos, splitTousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus, allowBorrowingTousseExceedingSpecifiedQuantity); + splitJsonObject = createReturnApplicationOrRecyclingApplication(splitRecyclingApplication, splitOldRecyclingApplication,splitTousseInstanceInfos, splitTousseInstanceInfos,specifyDisposableTypes, autoReturnTheBorrowingTousse,committedStatus, allowBorrowingTousseExceedingSpecifiedQuantity, allowBorrowingTousseExceedingCardinalNum); if(splitJsonObject != null && !splitJsonObject.optBoolean("success", false)){ throw new RecyclingRecordException(splitJsonObject.optString("message")); } @@ -4774,22 +4783,37 @@ */ private JSONObject createReturnApplicationOrRecyclingApplication(RecyclingApplication recyclingApplication, RecyclingApplicationVo oldRecyclingApplication,String appGoodsStr,String tousseInstanceInfos, - String specifyDisposableTypes,boolean autoReturnTheBorrowingTousse,boolean committedStatus, boolean allowBorrowingTousseExceedingSpecifiedQuantity) { + String specifyDisposableTypes,boolean autoReturnTheBorrowingTousse,boolean committedStatus, + boolean allowBorrowingTousseExceedingSpecifiedQuantity, boolean allowBorrowingTousseExceedingCardinalNum) { Collection srcTousseItemVoList = getTousseItemVos(appGoodsStr, tousseInstanceInfos); /*appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_APPLICATION, Log.TYPE_ADD, "保存申请单:recyclingApplication=" + JSONUtil.toJsonObjecttWithSimpleProperty(recyclingApplication) + ",tousseItems=" + JSONUtil.toJsonArraytWithSimpleProperty(srcTousseItemVoList));*/ - //在借物模块提交借物单时,禁止申请的包数量超过状态为已灭菌的数量 - boolean prohibitTousseExceedingSpecifiedQuantity = CssdUtils.getSystemSetConfigByNameBool("prohibitTousseExceedingSpecifiedQuantity", false); - if((prohibitTousseExceedingSpecifiedQuantity || !allowBorrowingTousseExceedingSpecifiedQuantity) && InvoicePlan.TYPE_BORROWINGSINGLE.equals(recyclingApplication.getType()) && recyclingApplication.getId() == null){ - JSONObject checkResult = checkTousseAmountInBorrow(recyclingApplication, srcTousseItemVoList); - if(checkResult != null){ - if(!prohibitTousseExceedingSpecifiedQuantity && !allowBorrowingTousseExceedingSpecifiedQuantity){ - //需要前端确认是否继续提交库存不足的借物单的提示信息 - return JSONUtil.buildJsonObject(false, "申请借用物品库存数量不足,发货时间不定,是否继续借用?"); + //在借物模块提交借物单时 + if(InvoicePlan.TYPE_BORROWINGSINGLE.equals(recyclingApplication.getType()) && recyclingApplication.getId() == null){ + //【借物单管理】新增申请基数限制ZSWY-233 + boolean enableCardinalityManagementOfBorrow = CssdUtils.getSystemSetConfigByNameBool("enableCardinalityManagementOfBorrow", false); + if(enableCardinalityManagementOfBorrow){ + //用户单次借物数量,不能超过物品基数 + borrowCardinalityManager.borrowAmountExceedCardinalNum(recyclingApplication, srcTousseItemVoList); + //用户借物数量,不能超过可借基数,超过则弹窗提醒,用户确认继续操作时,允许提交借物单 + if(!allowBorrowingTousseExceedingCardinalNum){ + borrowCardinalityManager.borrowAmountExceedAvailableCardinalNum(recyclingApplication, srcTousseItemVoList); } - return checkResult; } + + //在借物模块提交借物单时,禁止申请的包数量超过状态为已灭菌的数量 + boolean prohibitTousseExceedingSpecifiedQuantity = CssdUtils.getSystemSetConfigByNameBool("prohibitTousseExceedingSpecifiedQuantity", false); + if((prohibitTousseExceedingSpecifiedQuantity || !allowBorrowingTousseExceedingSpecifiedQuantity)){ + JSONObject checkResult = checkTousseAmountInBorrow(recyclingApplication, srcTousseItemVoList); + if(checkResult != null){ + if(!prohibitTousseExceedingSpecifiedQuantity && !allowBorrowingTousseExceedingSpecifiedQuantity){ + //需要前端确认是否继续提交库存不足的借物单的提示信息 + return JSONUtil.buildJsonObject(false, "申请借用物品库存数量不足,发货时间不定,是否继续借用?"); + } + return checkResult; + } + } } //物品预约单改进为支持显示库存数量以及可限制预约数量不能大于库存数量(已灭菌或者已消毒状态的物品的数量)SZYK-35 Index: ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r38383 -r38528 --- ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 38383) +++ ssts-web/src/main/webapp/WEB-INF/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 38528) @@ -3129,4 +3129,7 @@ + + + \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java =================================================================== diff -u -r38080 -r38528 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java (.../SupplyRoomConfig.java) (revision 38080) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/supplyroomconfig/SupplyRoomConfig.java (.../SupplyRoomConfig.java) (revision 38528) @@ -658,7 +658,17 @@ * “停用长时间不登陆账号(天数)”,可输入的文本为0和正整数,默认为空,空等同于0;超过时间不登陆将停用用户FSSZYY-37 */ private Long userNoLoginDateLimit; - + + /** + * 借物单弹窗提醒,选项为“是”、“否”,默认为“是”;ZSWY-233 + */ + private String borrowRemind = Constants.STR_NO; + + /** + * 借物单弹窗提醒频率(分钟),默认值为30,设置的单位为分钟ZSWY-233 + */ + private Integer borrowRemindFrequency = 30; + @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { @@ -1760,4 +1770,22 @@ this.userNoLoginDateLimit = userNoLoginDateLimit; } + @Column(columnDefinition=" varchar(20) default '" + Constants.STR_YES + "' not null ") + public String getBorrowRemind() { + return borrowRemind; + } + + public void setBorrowRemind(String borrowRemind) { + this.borrowRemind = borrowRemind; + } + + @Column(columnDefinition = "int default 30 not null ") + public Integer getBorrowRemindFrequency() { + return borrowRemindFrequency; + } + + public void setBorrowRemindFrequency(Integer borrowRemindFrequency) { + this.borrowRemindFrequency = borrowRemindFrequency; + } + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/BorrowCardinalityVo.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/BorrowCardinalityVo.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/vo/BorrowCardinalityVo.java (revision 38528) @@ -0,0 +1,96 @@ +package com.forgon.disinfectsystem.vo; + +/** + * 【借物基数管理设置】的vo ZSWY-233 + */ +public class BorrowCardinalityVo { + + private Long id; + + /** + * 科室ID + */ + private Long orgUnitId; + + /** + * 科室名称 + */ + private String orgUnitName; + + /** + * 器械包定义ID + */ + private Long tousseDefinitionId; + + /** + * 器械包定义名称 + */ + private String tousseDefinitionName; + + /** + * 基数 + */ + private Integer cardinalNum; + + /** + * 已借基数 + */ + private Integer borrowedCardinalNum; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOrgUnitId() { + return orgUnitId; + } + + public void setOrgUnitId(Long orgUnitId) { + this.orgUnitId = orgUnitId; + } + + public String getOrgUnitName() { + return orgUnitName; + } + + public void setOrgUnitName(String orgUnitName) { + this.orgUnitName = orgUnitName; + } + + public Long getTousseDefinitionId() { + return tousseDefinitionId; + } + + public void setTousseDefinitionId(Long tousseDefinitionId) { + this.tousseDefinitionId = tousseDefinitionId; + } + + public String getTousseDefinitionName() { + return tousseDefinitionName; + } + + public void setTousseDefinitionName(String tousseDefinitionName) { + this.tousseDefinitionName = tousseDefinitionName; + } + + public Integer getCardinalNum() { + return cardinalNum; + } + + public void setCardinalNum(Integer cardinalNum) { + this.cardinalNum = cardinalNum; + } + + public Integer getBorrowedCardinalNum() { + return borrowedCardinalNum; + } + + public void setBorrowedCardinalNum(Integer borrowedCardinalNum) { + this.borrowedCardinalNum = borrowedCardinalNum; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/borrow/BorrowCardinality.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/borrow/BorrowCardinality.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/borrow/BorrowCardinality.java (revision 38528) @@ -0,0 +1,77 @@ +package com.forgon.disinfectsystem.entity.borrow; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 【借物基数管理设置】ZSWY-233 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(indexes={@Index(columnList="orgUnitId",name="borrow_ou_id_index"), + @Index(columnList="tousseDefinitionId",name="borrow_td_id_index")}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class BorrowCardinality { + + private Long id; + + /** + * 科室ID + */ + private Long orgUnitId; + + /** + * 器械包定义ID + */ + private Long tousseDefinitionId; + + /** + * 基数 + */ + private Integer cardinalNum; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOrgUnitId() { + return orgUnitId; + } + + public void setOrgUnitId(Long orgUnitId) { + this.orgUnitId = orgUnitId; + } + + public Long getTousseDefinitionId() { + return tousseDefinitionId; + } + + public void setTousseDefinitionId(Long tousseDefinitionId) { + this.tousseDefinitionId = tousseDefinitionId; + } + + public Integer getCardinalNum() { + return cardinalNum; + } + + public void setCardinalNum(Integer cardinalNum) { + this.cardinalNum = cardinalNum; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java =================================================================== diff -u -r38136 -r38528 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java (.../SupplyRoomConfigAction.java) (revision 38136) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/supplyroomconfig/action/SupplyRoomConfigAction.java (.../SupplyRoomConfigAction.java) (revision 38528) @@ -1362,6 +1362,20 @@ supplyRoomConfig.setUserNoLoginDateLimit(Long.valueOf(userNoLoginDateLimit)); } } + + //启用借物基数管理功能ZSWY-233 + boolean enableCardinalityManagementOfBorrow = ConfigUtils.getSystemSetConfigByNameBool("enableCardinalityManagementOfBorrow"); + if(enableCardinalityManagementOfBorrow){ + String borrowRemindFrequency = rq.getParameter("borrowRemindFrequency"); + if(DatabaseUtil.isPoIdValid(borrowRemindFrequency)){ + supplyRoomConfig.setBorrowRemindFrequency(Integer.valueOf(borrowRemindFrequency)); + } + String borrowRemind = rq.getParameter("borrowRemind"); + if(StringUtils.equals(borrowRemind, Constants.STR_YES) + || StringUtils.equals(borrowRemind, Constants.STR_NO)){ + supplyRoomConfig.setBorrowRemind(borrowRemind); + } + } supplyRoomConfigManager.save(supplyRoomConfig); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/controller/BorrowCardinalityController.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/controller/BorrowCardinalityController.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/borrow/controller/BorrowCardinalityController.java (revision 38528) @@ -0,0 +1,98 @@ +package com.forgon.disinfectsystem.basedatamanager.borrow.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.basedatamanager.borrow.service.BorrowCardinalityManager; +import com.forgon.disinfectsystem.vo.BorrowCardinalityVo; +import com.forgon.entity.PageEntity; +import com.forgon.tools.json.JSONUtil; + +/** + * 【借物基数管理设置】ZSWY-233 + */ +@RestController +@RequestMapping(value = "/disinfectSystem/baseData/borrowCardinalityController", produces = "application/json;charset=UTF-8") +public class BorrowCardinalityController { + + @Autowired + private BorrowCardinalityManager borrowCardinalityManager; + + @Autowired + private OrgUnitManager orgUnitManager; + + /** + * 分页展示【借物基数管理设置】 + * @param tousseName + * @param queryMode + * @param tousseGroupId + * @param pageSize + * @param pageNum + * @return + */ + @RequestMapping("/loadBorrowCardinalityList") + public String loadBorrowCardinalityList(String tousseName, String queryMode, Long tousseGroupId, PageEntity page){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + borrowCardinalityManager.loadBorrowCardinalityList(tousseName, queryMode, tousseGroupId, page); + result = JSONUtil.buildJsonObject(true, JSONObject.fromObject(page)); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 保存【借物基数管理设置】 + * @return + */ + @RequestMapping("/saveBorrowCardinality") + public String saveBorrowCardinality(BorrowCardinalityVo borrowCardinalityvo){ + JSONObject result = JSONUtil.buildJsonObject(true, "保存成功"); + try { + borrowCardinalityManager.saveBorrowCardinality(borrowCardinalityvo); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, "保存失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 删除【借物基数管理设置】 + * @return + */ + @RequestMapping("/deleteBorrowCardinality") + public String deleteBorrowCardinality(String ids){ + JSONObject result = JSONUtil.buildJsonObject(true, "删除成功"); + try { + borrowCardinalityManager.delete(ids, ";"); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, "删除失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 借物弹窗告警接口 + * @return + */ + @RequestMapping("/borrowRemind") + public String borrowRemind(){ + JSONObject result = JSONUtil.buildJsonObject(true, "删除成功"); + try { + String handleDepartCode = AcegiHelper.getCurrentOrgUnitCode(); + JSONArray remindMessages = borrowCardinalityManager.borrowRemind(handleDepartCode); + result = JSONUtil.buildJsonObject(true,remindMessages); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, "删除失败:" + e.getMessage()); + } + return result.toString(); + } + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java =================================================================== diff -u -r37651 -r38528 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 37651) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 38528) @@ -230,10 +230,12 @@ * @param isInterveneAmount * @param specifyDisposableTypes 设置includeSpecifyDisposableTypes属性 * @param allowBorrowingTousseExceedingSpecifiedQuantity 是否允许物品借用数量少于物品库存数量 true允许,false不允许 + * @param allowBorrowingTousseExceedingCardinalNum 是否允许物品借用数量大于物品可借基数 true允许,false不允许 * @throws RecyclingRecordException */ public JSONObject submitRecyclingApplication(RecyclingApplication application,RecyclingApplicationVo oldRecyclingApplication,boolean committedStatus, - String isInterveneAmount,String specifyDisposableTypes,String appGoodsStr,String tousseInstanceInfos,boolean autoReturnTheBorrowingTousse, boolean allowBorrowingTousseExceedingSpecifiedQuantity) throws RecyclingRecordException; + String isInterveneAmount,String specifyDisposableTypes,String appGoodsStr,String tousseInstanceInfos,boolean autoReturnTheBorrowingTousse, + boolean allowBorrowingTousseExceedingSpecifiedQuantity, boolean allowBorrowingTousseExceedingCardinalNum) throws RecyclingRecordException; /**保存申请单. * @param application 申请单对象 Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java =================================================================== diff -u -r36285 -r38528 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 36285) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 38528) @@ -320,8 +320,10 @@ boolean autoReturnTheBorrowingTousse = "true".equals(StrutsParamUtils.getPraramValue("autoReturnTheBorrowingTousse",null)); //是否允许物品借用数量少于物品库存数量ZSWY-200 boolean allowBorrowingTousseExceedingSpecifiedQuantity = "true".equals(StrutsParamUtils.getPraramValue("allowBorrowingTousseExceedingSpecifiedQuantity","true")); + //是否允许物品借用数量大于物品借用基数ZSWY-233 + boolean allowBorrowingTousseExceedingCardinalNum = "true".equals(StrutsParamUtils.getPraramValue("allowBorrowingTousseExceedingCardinalNum","true")); JSONObject result = recyclingApplicationManager.submitRecyclingApplication(recyclingApplication, oldRecyclingApplication, - committedStatus, isInterveneAmount, specifyDisposableTypes, appGoodsStr, tousseInstanceInfos,autoReturnTheBorrowingTousse,allowBorrowingTousseExceedingSpecifiedQuantity); + committedStatus, isInterveneAmount, specifyDisposableTypes, appGoodsStr, tousseInstanceInfos,autoReturnTheBorrowingTousse,allowBorrowingTousseExceedingSpecifiedQuantity, allowBorrowingTousseExceedingCardinalNum); StrutsResponseUtils.output(result); }catch(RuntimeException e){ StrutsResponseUtils.output(false,e.getMessage());