Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r26924 -r26941 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 26924) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 26941) @@ -427,11 +427,12 @@ * 根据申请单号或发货单号,批量签收器械包 * @param barcode 申请单号或发货单号 * @param signRecordId 签收记录ID - * @param orgUnitCoding 科室编码 - * @param signer 签收人完整名称 + * @param beginDate 开始时间(yyyy-MM-dd) + * @param endDate 结束时间(yyyy-MM-dd) * @return */ - public String batchSignTousseInstanceByBarcode(String barcode, Long signRecordId); + public String batchSignTousseInstanceByBarcode(String barcode, Long signRecordId , + String beginDate, String endDate); /** * 判断条码是属于“申请单号”、“发货单号”、还是器械包的条码 @@ -461,11 +462,13 @@ /** * 器械包是否可以签收 - * @param tousseInstance - * @param signerOrgUnitCoding + * @param tousseInstance 器械包实例 + * @param signerOrgUnitCoding 签收人开始编码 + * @param beginDate 开始时间 + * @param endDate 结束时间 * @return */ - public boolean canSign(TousseInstance tousseInstance,String signerOrgUnitCoding); + public boolean canSign(TousseInstance tousseInstance,String signerOrgUnitCoding, String beginDate, String endDate); /** * 获取科室当天签收的器械包 * @param departCode 科室编号 Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dwr/table/SignRecordTableManager.java =================================================================== diff -u -r26924 -r26941 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dwr/table/SignRecordTableManager.java (.../SignRecordTableManager.java) (revision 26924) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dwr/table/SignRecordTableManager.java (.../SignRecordTableManager.java) (revision 26941) @@ -9,6 +9,7 @@ import com.forgon.component.grid.GridManager; import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.disinfectsystem.entity.basedatamanager.signRecord.SignRecord; public class SignRecordTableManager { @@ -34,6 +35,7 @@ Map sqlWhereParamMap = gridManager.getParamFromView(parameterMap); String startDate = sqlWhereParamMap.get("startDate"); String endDate = sqlWhereParamMap.get("endDate"); + String orgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); Date today = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if (StringUtils.isBlank(startDate)) { @@ -45,6 +47,7 @@ startDate += " 00:00:00"; endDate += " 23:59:59"; String sql = " where (1=1) and " + dateQueryAdapter.dateAreaSql("po.signDate", startDate, endDate); + sql += " and po.departCode = '" + orgUnitCode + "'"; String json = gridManager.renderGrid(parameterMap, SignRecord.class.getSimpleName(), sql, new String[] {}); return json; Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java =================================================================== diff -u -r26925 -r26941 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java (.../SignRecordManagerImpl.java) (revision 26925) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/service/SignRecordManagerImpl.java (.../SignRecordManagerImpl.java) (revision 26941) @@ -35,6 +35,7 @@ import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.exception.SystemException; import com.forgon.tools.MathTools; +import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.string.StringTools; @@ -307,7 +308,7 @@ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List> list = new ArrayList>(); if (StringUtils.isBlank(beginDate)) { - beginDate = sdf.format(today); + beginDate = DateTools.startOfYesterday("yyyy-MM-dd"); } if (StringUtils.isBlank(endDate)) { endDate = sdf.format(today); @@ -317,18 +318,21 @@ } endDate = endDate + " 23:59:59"; // 根据发货单发货时间查询 - String timeSql = " and " + dateQueryAdapter.dateAreaSql("i.sendTime", beginDate, endDate); + String timeSql = " and " + dateQueryAdapter.dateAreaSql("invoiceSendTime", beginDate, endDate); if (StringUtils.equals("all", beginDate)) { timeSql = ""; } - String sql = "select ti.tousseName, count(0) amount, ti.invoiceSendTime from " + TousseInstance.class.getSimpleName() - + " ti join " + Invoice.class.getSimpleName() - + " i on ti.invoice_id = i.id" - + " and i.departCoding = '" + departCoding + "' and i.status = '" + Invoice.STATUS_DELIVERED + "'" + // 发货时间 + String invoiceSendTimeSql = " (select min(ti1.invoiceSendTime) from TousseInstance ti1 where ti1.tousseName=ti.tousseName " + + " and ti1.status='" + TousseInstance.STATUS_SHIPPED + "'" + timeSql - + " and ti.status = '" + TousseInstance.STATUS_SHIPPED + "'" - + " group by ti.tousseName, ti.invoiceSendTime" - + " order by ti.tousseName asc, ti.invoiceSendTime desc"; + + " and location='" + departCoding + "') invoiceSendTime "; + // 汇总 + String sql = "select ti.tousseName, count(0) amount, " + invoiceSendTimeSql + " from " + TousseInstance.class.getSimpleName() + + " ti where ti.location='" + departCoding + "' and ti.status='" + TousseInstance.STATUS_SHIPPED + "'" + + timeSql + + " group by ti.tousseName" + + " order by ti.tousseName"; ResultSet result = objectDao.executeSql(sql); try { while (result.next()) { @@ -343,45 +347,21 @@ } finally { DatabaseUtil.closeResultSetAndStatement(result); } - // 合并相同器械包信息 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); - for (int i = 0; i < list.size() - 1; i++) { - Map map1 = list.get(i); - for (int j = i + 1; j < list.size(); j++) { - Map map2 = list.get(j); - if (StringUtils.equals((String)map1.get("tousseName"), (String)map2.get("tousseName"))) { - // 待签收器械包 - if (map1.get("amount") != null && (int)map1.get("amount") != 0) { - int amount1 = (int)map1.get("amount"); - int amount2 = (int)map2.get("amount"); - int amount = amount1 + amount2; - map1.put("amount", amount); - // 器械包发货时间以最早时间为准 - String invoiceSendTimeStr2 = (String)map2.get("invoiceSendTime"); - map1.put("invoiceSendTime", invoiceSendTimeStr2); - // 同名的器械包信息需要去除 - map2.put("amount", 0); - } - } - } - } - // 剔除重复器械包,比较发货时间和当前时间 - List> tempList = new ArrayList>(); + // 比较发货时间和当前时间 try { today = sdf1.parse(sdf1.format(today)); for (Map map : list) { - if (map.get("amount") != null && (int)map.get("amount") != 0) { - String invoiceSendTimeStr = (String)map.get("invoiceSendTime"); - Date invoiceSendTime = sdf1.parse(invoiceSendTimeStr); - // 标识器械包发货时间是当天或者昨天(及之前),前台根据此字段做颜色设置(0表示当天,1表示昨天及之前) - map.put("signTime", today.compareTo(invoiceSendTime)); - tempList.add(map); - } + String invoiceSendTimeStr = (String)map.get("invoiceSendTime"); + Date invoiceSendTime = sdf1.parse(invoiceSendTimeStr); + // 前台根据此字段做颜色设置 + // (0表示待签收的物品的发货日期全部都是今天的(白色),1表示待签收的物品的发货日期有不是今天的日期的(黄色)) + map.put("signTime", today.compareTo(invoiceSendTime)); } } catch (ParseException e) { e.printStackTrace(); } - return tempList; + return list; } /** Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java =================================================================== diff -u -r26730 -r26941 --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 26730) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 26941) @@ -4160,7 +4160,7 @@ message = "请扫描签收人"; } - if(tousseInstanceManager.canSign(ti, signerOrgUnitCoding)){ + if(tousseInstanceManager.canSign(ti, signerOrgUnitCoding, null, null)){ success = true; data = new JSONObject(); data.put("tousseName", ti.getTousseName()); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java =================================================================== diff -u -r26924 -r26941 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 26924) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/TousseInstanceAction.java (.../TousseInstanceAction.java) (revision 26941) @@ -253,9 +253,16 @@ public void signTousseInstanceByBarcode(){ String barcode = StrutsParamUtils.getPraramValue("barcode", null); Long signRecordId = StrutsParamUtils.getPraramLongValue("signRecordId", null); + String sendoutTime = StrutsParamUtils.getPraramValue("sendoutTime", null); + String beginDate = null; + String endDate = null; + if (sendoutTime != null && !"all".equals(sendoutTime)) { + beginDate = sendoutTime.substring(0, sendoutTime.lastIndexOf(";")); + endDate = sendoutTime.substring(sendoutTime.lastIndexOf(";") + 1); + } String result = ""; try { - result = tousseInstanceManager.batchSignTousseInstanceByBarcode(barcode, signRecordId); + result = tousseInstanceManager.batchSignTousseInstanceByBarcode(barcode, signRecordId, beginDate, endDate); } catch (RuntimeException e1) { e1.printStackTrace(); StrutsResponseUtils.output(JSONUtil.buildJsonObject(false, e1.getMessage())); Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r26924 -r26941 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 26924) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 26941) @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -2841,8 +2842,8 @@ } private String signTousseInstance(TousseInstance tousseInstance,String signer, - String signerOrgUnitCoding, Long signRecordId){ - return signTousseInstance(tousseInstance,signer,signerOrgUnitCoding,new Date(),signRecordId); + String signerOrgUnitCoding, Long signRecordId, String beginDate, String endDate){ + return signTousseInstance(tousseInstance,signer,signerOrgUnitCoding,new Date(),signRecordId, beginDate, endDate); } /** * 签收器械包。单个器械包的签收。 @@ -2852,14 +2853,14 @@ * @return 执行结果的字符串,如果签收成功,返回的字符串为null,否则返回对错误的描述信息 */ private String signTousseInstance(TousseInstance tousseInstance,String signer, - String signerOrgUnitCoding,Date signDate,Long signRecordId) { + String signerOrgUnitCoding,Date signDate,Long signRecordId, String beginDate, String endDate) { String msg = null; if(StringUtils.isBlank(signer)){ msg = "签收人不能为空"; return msg; } try{ - if(tousseInstance != null && canSign(tousseInstance,signerOrgUnitCoding)){ + if(tousseInstance != null && canSign(tousseInstance,signerOrgUnitCoding, beginDate, endDate)){ // 发货单签收增加扫描包条码签收功能(GGSRMYY-105) if (signRecordId != null) { SignRecord signRecord = new SignRecord(); @@ -2892,7 +2893,7 @@ List tis = tousseInstance.getTousseInstancesBelongToThisComboTousse(objectDao); if(CollectionUtils.isNotEmpty(tis)){ for(TousseInstance ti : tis){ - signTousseInstance(ti,signer,signerOrgUnitCoding,signDate,signRecordId); + signTousseInstance(ti,signer,signerOrgUnitCoding,signDate,signRecordId, beginDate, endDate); } } } @@ -2903,15 +2904,15 @@ save(tousseInstance); Invoice invoice = tousseInstance.getInvoice(objectDao); List tousseInstanceList = invoice.getTousseInstances(objectDao); - int signedAmont = 0; + int signedAmount = 0; for (TousseInstance ti : tousseInstanceList) { if (TousseInstance.STATUS_SIGNED.equals(ti.getStatus())) { - signedAmont++; + signedAmount++; } } // 修改发货单状态(部分签收/已签收) if (tousseInstanceList != null) { - if (tousseInstanceList.size() == signedAmont) { + if (tousseInstanceList.size() == signedAmount) { invoice.setSignStatus(Invoice.SIGNSTATUS_SIGNED); } else { invoice.setSignStatus(Invoice.SIGNSTATUS_PARTSIGNED); @@ -2958,7 +2959,7 @@ } @Override - public boolean canSign(TousseInstance tousseInstance,String signerOrgUnitCoding) { + public boolean canSign(TousseInstance tousseInstance,String signerOrgUnitCoding, String beginDateStr, String endDateStr) { if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals( tousseInstance.getTousseDefinition().getTousseType())){ TousseDefinition tousseDefinition = tousseInstance.getTousseDefinition(); @@ -2978,6 +2979,24 @@ location = location_2; locationForDisplay = locationForDisplay2; } + // 第二个版本签收需要根据时间判断是否可以签收,第一个版本的不需要做判断 + if (StringUtils.isNotEmpty(beginDateStr) && StringUtils.isNotEmpty(endDateStr)) { + // 不允许签收不属于所选择的时间范围内发货的包 + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date invoiceSendTime = tousseInstance.getInvoiceSendTime(); + String invoiceSendTimeStr = sdf.format(invoiceSendTime); + invoiceSendTime = sdf.parse(invoiceSendTimeStr); + Date beginDate = sdf.parse(beginDateStr); + Date endDate = sdf.parse(endDateStr); + if (invoiceSendTime.compareTo(beginDate) < 0 || invoiceSendTime.compareTo(endDate) > 0) { + throw new RuntimeException(tousseInstance.getTousseName() + "包的发货日期为" + invoiceSendTimeStr + ",不在所选择的时间范围内,请选择合适的时间后进行签收!"); + } + } catch (ParseException e) { + e.printStackTrace(); + throw new RuntimeException("发货时间格式错误!"); + } + } if (StringUtils.isNotBlank(location) && !StringUtils.equals(signerOrgUnitCoding , location)) { throw new RuntimeException("该器械包属于" + locationForDisplay + ",不能被签收"); @@ -3058,7 +3077,7 @@ throw new SystemException("未获取到对应条码的器械包"); } for(TousseInstance ti : tis){ - String msg = signTousseInstance(ti, signer, orgUnitCoding,signDate,signRecordId); + String msg = signTousseInstance(ti, signer, orgUnitCoding,signDate,signRecordId,null,null); if(msg != null){ throw new SystemException("条码为" + ti.getBarcode() + "的器械包签收失败." + msg); } @@ -3074,7 +3093,7 @@ if (StringUtils.isNotBlank(barcode)) { TousseInstance tousseInstance = getTousseInstanceByBarcode(barcode); if(tousseInstance != null){ - msg = signTousseInstance(tousseInstance, signer, orgUnitCoding, null); + msg = signTousseInstance(tousseInstance, signer, orgUnitCoding, null,null,null); if(msg == null){ SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); @@ -4484,7 +4503,13 @@ @SuppressWarnings("unchecked") @Override - public String batchSignTousseInstanceByBarcode(String barcode, Long signRecordId) { + public String batchSignTousseInstanceByBarcode(String barcode, Long signRecordId, String beginDate, String endDate) { + if (StringUtils.isNotBlank(beginDate)) { + beginDate += " 00:00:00"; + } + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + } String msg = "该条码下没有可签收的包"; boolean isSuccess = false; SimpleDateFormat dateFormat = new SimpleDateFormat( @@ -4547,7 +4572,7 @@ if (tousseInstanceList.size()>0) { for(TousseInstance ti:tousseInstanceList){ //签收 - msg = signTousseInstance(ti,loginUserFullName,currentUserOrgUnitCoding, signRecordId); + msg = signTousseInstance(ti,loginUserFullName,currentUserOrgUnitCoding, signRecordId, beginDate, endDate); //签收成功 if(msg == null){ isSuccess = true; @@ -4560,6 +4585,8 @@ } } + // 查询器械包待签收数量 + tIInfoJSONArray = setWaitSignAmountForTousseInstance(tIInfoJSONArray, tousseInstanceList, currentUserOrgUnitCoding, beginDate, endDate); //返回数据 return signReturn(barcode, msg, isSuccess, tIInfoJSONArray, signType, signRecordId); } @@ -4568,6 +4595,63 @@ } /** + * 计算器械包待签收数量 + * @param tIInfoJSONArray 器械包JSON + * @param tousseInstanceList 器械包实例列表 + * @param orgUnitCoding 当前登陆科室 + * @param beginDate 科室时间 + * @param endDate 结束时间 + * @return + */ + private JSONArray setWaitSignAmountForTousseInstance(JSONArray tIInfoJSONArray, List tousseInstanceList, + String orgUnitCoding, String beginDate, String endDate) { + if (tIInfoJSONArray == null || CollectionUtils.isEmpty(tousseInstanceList)) { + return tIInfoJSONArray; + } + Map tousseAmountMap = new HashMap(); + List tousseNameList = new ArrayList(); + for (TousseInstance ti : tousseInstanceList) { + if (null != ti) { + tousseNameList.add(ti.getTousseName()); + } + } + String names = ""; + String nameSql = ""; + for (String tousseName : tousseNameList) { + names = StringTools.uniteTwoStringBySemicolon(names, "'" + tousseName + "'", ","); + } + if (StringUtils.isNotBlank(names)) { + nameSql = " and ti.tousseName in ( " + names + ")"; + } + String sql = "select ti.tousseName, count(0) waitSignAmount from " + TousseInstance.class.getSimpleName() + " ti where (1=1) " + + nameSql + + " and ti.status = '" + TousseInstance.STATUS_SHIPPED + "' and ti.location = '" + orgUnitCoding + "'" + + " and " + dateQueryAdapter.dateAreaSql("ti.invoiceSendTime", beginDate, endDate) + + " group by ti.tousseName"; + ResultSet result = objectDao.executeSql(sql); + try { + while (result.next()) { + tousseAmountMap.put(result.getString("tousseName"), result.getString("waitSignAmount")); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + DatabaseUtil.closeResultSetAndStatement(result); + } + for (int i = 0; i < tIInfoJSONArray.size(); i++) { + JSONObject json = tIInfoJSONArray.getJSONObject(i); + String tousseName = json.optString("tousseName", ""); + String waitSignAmount = tousseAmountMap.get(tousseName); + if (waitSignAmount == null) { + json.put("waitSignAmount", 0); + } else { + json.put("waitSignAmount", waitSignAmount); + } + } + return tIInfoJSONArray; + } + + /** * 根据申请单号或发货单号,批量签收器械包的返回信息 * @param barcode * @param msg