Index: ssts-web/src/main/webapp/disinfectsystem/invoice/synOperationReservationForm.js =================================================================== diff -u -r24994 -r25257 --- ssts-web/src/main/webapp/disinfectsystem/invoice/synOperationReservationForm.js (.../synOperationReservationForm.js) (revision 24994) +++ ssts-web/src/main/webapp/disinfectsystem/invoice/synOperationReservationForm.js (.../synOperationReservationForm.js) (revision 25257) @@ -177,28 +177,23 @@ } } top.Ext.MessageBox.confirm("请确认","是否确定要同步手术名为:"+operationName+"的申请单?", - function(button, text) { - if ("yes" == button){ - Ext.Ajax.request({ - url : WWWROOT + '/disinfectsystem/operationReservationAction!saveSyncOperationReservation.do', - params : {serialNumber : serialNumber}, - success : function(response, options) { - //console.log(response.responseText); - var result = Ext.decode(response.responseText); - if(result.success){ - if(result.data.error){ - top.Ext.Msg.alert('成功',resultdata.message+"
"+result.data.error+"
"+result.correct); - }else{ - top.Ext.Msg.alert('成功',result.data.message+"
"+result.data.correct); - } - }else{ - top.Ext.Msg.alert('失败',result.data.message+"
"+result.data.error+"
"); - } - sycGridPanelStore.reload(); - } - }); - } - } + function(button, text) { + if ("yes" == button){ + Ext.Ajax.request({ + url : WWWROOT + '/disinfectsystem/operationReservationAction!saveSyncOperationReservation.do', + params : {serialNumber : serialNumber}, + success : function(response, options) { + var result = Ext.decode(response.responseText); + if(result.success){ + top.Ext.Msg.alert("成功",result.message); + }else{ + top.Ext.Msg.alert("失败",result.message); + } + sycGridPanelStore.reload(); + } + }); + } + } ); }; Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java =================================================================== diff -u -r25165 -r25257 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java (.../OperationReservationManagerImpl.java) (revision 25165) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManagerImpl.java (.../OperationReservationManagerImpl.java) (revision 25257) @@ -10,6 +10,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -38,6 +39,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.operationreservation.OperationReservation; +import com.forgon.disinfectsystem.entity.operationreservation.RepeatSyncOperationSerialNumberInfo; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.inventorymanagement.dao.InvoicePlanDao; import com.forgon.disinfectsystem.inventorymanagement.model.HrpInvoicePlan; @@ -666,106 +668,175 @@ /** * 同步手术预约单 * @param invoicePlanList 同步申请单vo集合 + * @return JSONObject 同步结果信息 */ private JSONObject syncAndSaveOperationReservation(List invoicePlanList) { JSONObject resultObject = new JSONObject(); + List successDetail = new ArrayList();//用于记录成功信息 + List failureDetail = new ArrayList();//用于记录失败信息 + List successDetailTips = new ArrayList();//用于记录返回前端显示的成功提示 if (CollectionUtils.isNotEmpty(invoicePlanList)) { - //0、记录日志 + //1、记录日志 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss")); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_OPERATION_RESERVATION, Log.TYPE_ADD, "开始手术预约申请单同步:"+ JSONArray.fromObject(invoicePlanList,jsonConfig)); - //1、开始同步 - List successDetail = new ArrayList(); - List failureDetail = new ArrayList(); + //2、开始同步 for (HrpInvoicePlan syncOperationReservation : invoicePlanList) { - String operationName = syncOperationReservation.getOperationName();//手术名称 - String serialNumber = syncOperationReservation.getSerialNumber();//申请单号 - //1.是否已经有该申请单 - if (objectDao.countBySql(String.format("select count(*) from invoicePlan ip where ip.serialNumber='%s'", serialNumber)) <= 0) { - try { - //2.创建手术预约申请单 - OperationReservation operationReservation = new OperationReservation(); - //申请科室,结算科室: 通过在config.js里面设申请科室名称获得 - String depart = CssdUtils.getSystemSetConfigByName("operationReservationDepartName"); - OrgUnit operationOrgUnit = (OrgUnit)objectDao.getBySql(OrgUnit.class.getSimpleName(), "where name='" + depart + "'"); - if(operationOrgUnit != null){ - operationReservation.setDepartCoding(operationOrgUnit.getOrgUnitCoding()); - operationReservation.setSettleAccountsDepartCoding(operationOrgUnit.getOrgUnitCoding()); - }else{ - throw new RuntimeException(operationName +"手术预约单同步失败!:获取不到科室名为:'"+depart+"'的部门"); - } - operationReservation.setDepart(depart); - operationReservation.setSettleAccountsDepart(depart); - //处理科室:默认为一级供应室的部门 - SupplyRoomConfig firstSupplyRoomConfig = supplyRoomConfigManager.getFirstSupplyRoomConfig(); - operationReservation.setHandleDepartCoding(firstSupplyRoomConfig.getOrgUnitCoding()); - operationReservation.setHandleDepart(firstSupplyRoomConfig.getOrgUnitName()); - // - if(StringUtils.isBlank(depart) || StringUtils.isBlank(operationOrgUnit.getOrgUnitCoding())){ - throw new RuntimeException(operationName +"手术预约单同步失败!:申请科室不能为空!"); - } - if(StringUtils.isBlank(firstSupplyRoomConfig.getOrgUnitCoding()) || StringUtils.isBlank(firstSupplyRoomConfig.getOrgUnitName())){ - throw new RuntimeException(operationName +"手术预约单同步失败!:处理科室不能为空!"); - } - if(StringUtils.isBlank(syncOperationReservation.getOperatingRoom())){ - throw new RuntimeException(operationName +"手术预约单同步失败!:手术间不能为空!"); - } - operationReservation.setOperationName(operationName);//手术名称 - operationReservation.setSerialNumber(serialNumber);//申请单号 - operationReservation.setOperatingRoom(syncOperationReservation.getOperatingRoom());//手术间 - operationReservation.setDoctors(syncOperationReservation.getDoctors()); - operationReservation.setConsoleName(syncOperationReservation.getConsoleName()); - operationReservation.setPatientAge(syncOperationReservation.getPatientAge());//病人年龄 - operationReservation.setScheduleId(syncOperationReservation.getScheduleId()); - operationReservation.setDeptName(syncOperationReservation.getDeptName()); - operationReservation.setPatientName(syncOperationReservation.getPatientName()); - operationReservation.setHospitalNumber(syncOperationReservation.getHospitalNumber()); - operationReservation.setCircuitNurse(syncOperationReservation.getCircuitNurse()); - operationReservation.setWashHandNurse(syncOperationReservation.getWashHandNurse()); - operationReservation.setOperationTime(syncOperationReservation.getOperationTime()); - if(operationReservation.getApplicationTime() == null){ - operationReservation.setApplicationTime(new Date()); - } - operationReservation.setApplicant("接口推送"); - operationReservation.setSubmitTime(new Date()); - operationReservation.setCommittedStatus(false);//刚推送过来的数据提交状态设置为false - operationReservation.setSpelling(GB2Alpha.string2Alpha(depart)); - operationReservation.setWbCode(GB2WB.getWBCode(depart)); - operationReservation.setRecyclingStatus(null); - operationReservation.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); - operationReservation.setType(InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION); - operationReservation.setIncludeInvoiceItems(InvoicePlan.SIGNED_TRUE); - if(StringUtils.isBlank(operationReservation.getSerialNumber())){ - operationReservation.setSerialNumber(serialNumManager - .getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION)); - } - //3.创建申请物品明细 - resetOperationUseTousseItem(operationReservation); - //4.保存手术预约单 - objectDao.saveOrUpdate(operationReservation); - successDetail.add("申请单号为:"+serialNumber+"手术预约单同步成功"); - } catch (Exception e) { - logger.info("申请单号为:"+serialNumber+"手术预约申请单同步失败"); - e.printStackTrace(); - failureDetail.add(e.getMessage()); - } - }else{ - failureDetail.add("申请单号为:"+serialNumber+"的申请单已经存在了"); - } + //2-1、同步手术预约单 + JSONObject resultDetail = saveSyncOperationReservation(syncOperationReservation); + //2-2、记录同步结果 + successDetail.add((String) resultDetail.get("successDetail")); + failureDetail.add((String) resultDetail.get("failureDetail")); + successDetailTips.add((String) resultDetail.get("successDetailTips")); } + //3、生成返回的同步结果json对象 + //移除记录信息的null元素 + successDetail.removeAll(Collections.singleton(null)); + failureDetail.removeAll(Collections.singleton(null)); + successDetailTips.removeAll(Collections.singleton(null)); + // resultObject.put("total", invoicePlanList.size()); resultObject.put("successCount", successDetail.size()); resultObject.put("successDetail", successDetail.toString()); resultObject.put("failureCount", failureDetail.size()); resultObject.put("failureDetail", failureDetail.toString()); - appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_OPERATION_RESERVATION, Log.TYPE_ADD, "结束手术预约申请单同步:"+resultObject); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_OPERATION_RESERVATION, Log.TYPE_ADD, "结束手术预约申请单同步:"+resultObject);//记录日志 logger.debug("手术预约申请单同步:"+resultObject); + resultObject.put("successDetailTipsCount", successDetailTips.size()); + resultObject.put("successDetailTips", successDetailTips.toString()); } return resultObject; } + + /** + * 保存手术预约同步申请单 + * @param syncOperationReservation 需要同步的申请单 + * @return resultDetail 记录同步的结果 + */ + private JSONObject saveSyncOperationReservation(HrpInvoicePlan syncOperationReservation) { + JSONObject resultDetail = new JSONObject(); + String operationName = syncOperationReservation.getOperationName();//手术名称 + String serialNumber = syncOperationReservation.getSerialNumber();//同步申请单号 + Boolean isChange = false;//是否修改了同步申请单 + String successDetailStr = null;//用于记录成功信息 + String failureDetailStr = null;//用于记录失败信息 + String successDetailTipsStr = null;//用于记录返回前端显示的成功提示 + try { + //1、追溯系统是否已经有该申请单号 + if (objectDao.countBySql(String.format("select count(*) from invoicePlan ip where ip.serialNumber='%s'", serialNumber)) > 0) { + //若config.js配置:若系统已有相同的申请单号,是否允许同步:默认为false + //若为true则修改同步申请单号并保存 + if(CssdUtils.getSystemSetConfigByNameBool("syncOperation_AllowSyncWhenAnyMatchingSyncSerialNumber")){ + //修改同步申请单号 :同步申请单号+系统自生成的单号 + serialNumber += "+" + serialNumManager.getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION); + isChange = true; + }else{ + throw new RuntimeException("申请单号为:"+serialNumber+"的申请单已经存在了"); + } + } + //2、创建手术预约申请单 + OperationReservation operationReservation = new OperationReservation(); + //申请科室,结算科室:通过在config.js里面设申请科室名称获得 + String depart = CssdUtils.getSystemSetConfigByName("operationReservationDepartName"); + OrgUnit operationOrgUnit = (OrgUnit)objectDao.getBySql(OrgUnit.class.getSimpleName(), "where name='" + depart + "'"); + if(operationOrgUnit != null){ + operationReservation.setDepartCoding(operationOrgUnit.getOrgUnitCoding()); + operationReservation.setSettleAccountsDepartCoding(operationOrgUnit.getOrgUnitCoding()); + }else{ + throw new RuntimeException(operationName +"手术预约单同步失败!:获取不到科室名为:'"+depart+"'的部门"); + } + operationReservation.setDepart(depart); + operationReservation.setSettleAccountsDepart(depart); + //处理科室:默认为一级供应室的部门 + SupplyRoomConfig firstSupplyRoomConfig = supplyRoomConfigManager.getFirstSupplyRoomConfig(); + operationReservation.setHandleDepartCoding(firstSupplyRoomConfig.getOrgUnitCoding()); + operationReservation.setHandleDepart(firstSupplyRoomConfig.getOrgUnitName()); + // + if(StringUtils.isBlank(depart) || StringUtils.isBlank(operationOrgUnit.getOrgUnitCoding())){ + throw new RuntimeException(operationName +"手术预约单同步失败!:申请科室不能为空!"); + } + if(StringUtils.isBlank(firstSupplyRoomConfig.getOrgUnitCoding()) || StringUtils.isBlank(firstSupplyRoomConfig.getOrgUnitName())){ + throw new RuntimeException(operationName +"手术预约单同步失败!:处理科室不能为空!"); + } + if(StringUtils.isBlank(syncOperationReservation.getOperatingRoom())){ + throw new RuntimeException(operationName +"手术预约单同步失败!:手术间不能为空!"); + } + operationReservation.setOperationName(operationName);//手术名称 + operationReservation.setSerialNumber(serialNumber);//申请单号 + operationReservation.setOperatingRoom(syncOperationReservation.getOperatingRoom());//手术间 + operationReservation.setDoctors(syncOperationReservation.getDoctors()); + operationReservation.setConsoleName(syncOperationReservation.getConsoleName()); + operationReservation.setPatientAge(syncOperationReservation.getPatientAge());//病人年龄 + operationReservation.setScheduleId(syncOperationReservation.getScheduleId()); + operationReservation.setDeptName(syncOperationReservation.getDeptName()); + operationReservation.setPatientName(syncOperationReservation.getPatientName()); + operationReservation.setHospitalNumber(syncOperationReservation.getHospitalNumber()); + operationReservation.setCircuitNurse(syncOperationReservation.getCircuitNurse()); + operationReservation.setWashHandNurse(syncOperationReservation.getWashHandNurse()); + operationReservation.setOperationTime(syncOperationReservation.getOperationTime());//手术时间 + if(operationReservation.getApplicationTime() == null){ + operationReservation.setApplicationTime(new Date()); + } + operationReservation.setApplicant("接口推送"); + operationReservation.setSubmitTime(new Date()); + operationReservation.setCommittedStatus(false);//刚推送过来的数据提交状态设置为false + operationReservation.setSpelling(GB2Alpha.string2Alpha(depart)); + operationReservation.setWbCode(GB2WB.getWBCode(depart)); + operationReservation.setRecyclingStatus(null); + operationReservation.setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + operationReservation.setType(InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION); + operationReservation.setIncludeInvoiceItems(InvoicePlan.SIGNED_TRUE); + if(StringUtils.isBlank(operationReservation.getSerialNumber())){ + operationReservation.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION)); + } + //3.创建申请物品明细 + resetOperationUseTousseItem(operationReservation); + //4.保存手术预约单 + objectDao.saveOrUpdate(operationReservation); + //5.记录成功信息 + String successMessger = "申请单号为:"+serialNumber+"手术预约单同步成功"; + //若修改了同步申请单 + if(isChange){ + String originSerialNumber = syncOperationReservation.getSerialNumber(); + //记录重复同步的申请单号 + saveOrUpdateRepeatSyncSerialNumberInfo(originSerialNumber,operationReservation); + // + successMessger = String.format("申请单号为:'%s'手术预约单同步成功。因为系统已有相同的申请单号,故把申请单号改为'%s'进行同步" + ,originSerialNumber,serialNumber); + successDetailTipsStr = successMessger; + } + successDetailStr = successMessger; + } catch (Exception e) { + logger.info("申请单号为:"+serialNumber+"手术预约申请单同步失败"); + e.printStackTrace(); + failureDetailStr = e.getMessage(); + } + //6、同步结果 + resultDetail.put("successDetail", successDetailStr); + resultDetail.put("successDetailTips", successDetailTipsStr); + resultDetail.put("failureDetail", failureDetailStr); + return resultDetail; + }; /** + * 保存更新:重复同步过的手术预约单号信息 + * @param serialNumber + * @param onoperationReservation + */ + private void saveOrUpdateRepeatSyncSerialNumberInfo(String serialNumber,OperationReservation onoperationReservation){ + RepeatSyncOperationSerialNumberInfo repeatSerialNumberpo = (RepeatSyncOperationSerialNumberInfo) + objectDao.getByProperty(RepeatSyncOperationSerialNumberInfo.class .getSimpleName(), "serialNumber", serialNumber); + if(null == repeatSerialNumberpo){ + repeatSerialNumberpo = new RepeatSyncOperationSerialNumberInfo(); + } + repeatSerialNumberpo.setOperationTime(onoperationReservation.getOperationTime());//原同步申请单号 + repeatSerialNumberpo.setSerialNumber(serialNumber);//手术时间 + objectDao.saveOrUpdate(repeatSerialNumberpo); + } + + /** * 创建手术预约申请单明细 * @param operationReservation */ @@ -826,7 +897,8 @@ private List getOperationeTousseItemByoperationName(String syncOperationName){ List operationUseTousseItemList = null;// 手术使用器械包明细集合 //根据config.js:同步手术预约申请单时,手术名称是否忽略"+",默认为false - //若false:把"手术1+手术2"拆成手术1,手术2分别获得器械包明细,若为true:把"手术1+手术2"看成一个手术名获得器械包明细 + //若false:把"手术1+手术2"拆成手术1,手术2分别获得器械包明细 + //若为true:把"手术1+手术2"看成一个手术名获得器械包明细 if(CssdUtils.getSystemSetConfigByNameBool("syncOperation_OperationNameIgnoreConnector")){ operationUseTousseItemList = getOperationeTousseItemByoperationName_IgnoreConnector(syncOperationName); }else{ @@ -989,12 +1061,13 @@ }else{//2-2、若无该手术名称定义:则创建一个新的手术名称定义,且返回空的器械包明细 //根据confjs配置:同步手术预约申请单时,若匹配不到手术名称定义,是否新建手术名称定义,默认为false。 if(CssdUtils.getSystemSetConfigByNameBool("syncOperation_BuildNewOperationName")){ + //新建手术名称定义 syncSaveOperationName(syncOperationName); + //根据confjs配置:同步手术预约申请单时,若有匹配不到的手术名,是否允许同步:默认为false. + if(CssdUtils.getSystemSetConfigByNameBool("syncOperation_AllowSyncWhenAnyNoMatchingOperationName")){ + return null; + } } - //根据confjs配置:同步手术预约申请单时,若有匹配不到的手术名,是否允许同步:默认为false. - if(CssdUtils.getSystemSetConfigByNameBool("syncOperation_AllowSyncWhenAnyNoMatchingOperationName")){ - return null; - } throw new RuntimeException("手术:"+syncOperationName+",获取不到手术名为:'"+syncOperationName+"'的手术名称对象!"); } } @@ -1036,16 +1109,16 @@ if(CollectionUtils.isNotEmpty(syncInvoicePlanList)){ String strStartime = DateTools.getFormatDateStr(startDate,DateTools.COMMON_DATE_HMS); String strEndTime = DateTools.getFormatDateStr(endTime,DateTools.COMMON_DATE_HMS); - //1.获得同步申请单vo的申请单号 + //1、获得同步申请单vo的申请单号 List syncSerialNumberList = syncInvoicePlanList.stream().map(HrpInvoicePlan::getSerialNumber).collect(Collectors.toList()); - //2.根据同步的申请单号,手术预约时间获得追溯系统的手术预约申请单 + //2、根据同步的申请单号,手术预约时间获得追溯系统的手术预约申请单 String sqlStr = String.format("where po.id in(select id from OperationReservation where %s ) and %s and po.type = '%s' ", dateQueryAdapter.dateAreaSql("operationTime",strStartime,strEndTime), SqlUtils.getStringFieldInLargeCollectionsPredicate("po.serialNumber",syncSerialNumberList), InvoicePlan.TYPE_OPERATION_RESERVATION_APPLICATION); @SuppressWarnings("unchecked") List InvoicePlanList = objectDao.findBySql(InvoicePlan.class.getSimpleName(), sqlStr); - //3-1.若同步的申请单号获得追溯系统的手术预约申请单不为空:则过滤掉已有的申请单 + //2-1.若同步的申请单号获得追溯系统的手术预约申请单不为空:则过滤掉已有的申请单 if(CollectionUtils.isNotEmpty(InvoicePlanList)){ ListserialNumberList = InvoicePlanList.stream().map(InvoicePlan::getSerialNumber).collect(Collectors.toList()); //过滤掉已有的申请单 @@ -1055,11 +1128,32 @@ syncInvoicePlanList.remove(syncInvoicePlan); } } - return syncInvoicePlanList; - }else{ - //3-2.若同步的申请单号获得追溯系统的手术预约申请单为空:则不用过滤 - return syncInvoicePlanList; } + //3、根据同步的申请单号,手术预约时间:过滤已重复同步过的申请单号 + //若config.js配置:若系统已有相同的申请单号,是否允许同步:默认为false + //若为true:则可能会出现时间段内已被同步过的重复申请单号没被过滤的情况 + if(CollectionUtils.isNotEmpty(syncInvoicePlanList) + && CssdUtils.getSystemSetConfigByNameBool("syncOperation_AllowSyncWhenAnyMatchingSyncSerialNumber")){ + //3-1、获得已重复同步的申请单号 + String sqlStr2 = String.format("where %s and %s", + dateQueryAdapter.dateAreaSql("po.operationTime",strStartime,strEndTime), + SqlUtils.getStringFieldInLargeCollectionsPredicate("po.serialNumber",syncSerialNumberList)); + @SuppressWarnings("unchecked") + List repeatSyncOperationSerialNumberInfo = objectDao.findBySql(RepeatSyncOperationSerialNumberInfo.class.getSimpleName(), sqlStr2); + //3-2、过滤掉时间段内已重复同步的申请单 + if(CollectionUtils.isNotEmpty(repeatSyncOperationSerialNumberInfo)){ + ListrepeatSyncSerialNumber = repeatSyncOperationSerialNumberInfo.stream().map(RepeatSyncOperationSerialNumberInfo::getSerialNumber).collect(Collectors.toList()); + // + Iterator hrpIterator = syncInvoicePlanList.iterator(); + while(hrpIterator.hasNext()){ + HrpInvoicePlan syncInvoicePlan = hrpIterator.next(); + if(repeatSyncSerialNumber.contains(syncInvoicePlan.getSerialNumber())){ + hrpIterator.remove(); + } + } + } + } + return syncInvoicePlanList; }else{ return null; } Index: ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/config.js =================================================================== diff -u -r25254 -r25257 --- ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/config.js (.../config.js) (revision 25254) +++ ssts-web/src/main/webapp/disinfectsystem/config/xjjqzyy/config.js (.../config.js) (revision 25257) @@ -1,4 +1,4 @@ -var sstsConfig = { +var sstsConfig = { // 启用标识牌功能 disableIdCard : false, // 回收时科室显示结算科室 @@ -99,6 +99,9 @@ syncOperation_BuildNewOperationName:true, //同步手术预约申请单时,若有匹配不到的手术名,是否允许同步:默认为false不启用 syncOperation_AllowSyncWhenAnyNoMatchingOperationName:true, + //同步手术预约申请单时,若系统已有相同的申请单号,是否允许同步:默认为false不启用 + //若为true:会把该同步申请单的单号改为:同步申请单号+系统自生成的单号。进行同步 + syncOperation_AllowSyncWhenAnyMatchingSyncSerialNumber:true, //是否启用手术间管理界面 enableOperationRoomManagerViwe : true, // 是否显示装配界面的打印按钮 Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/RepeatSyncOperationSerialNumberInfo.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/RepeatSyncOperationSerialNumberInfo.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/operationreservation/RepeatSyncOperationSerialNumberInfo.java (revision 25257) @@ -0,0 +1,76 @@ +package com.forgon.disinfectsystem.entity.operationreservation; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * @author YanWeiNing + * 记录已重复同步的手术预约申请单号 + * 用于同步手术预约申请时,手术时间段内:过滤已同步过的重复申请单号的申请单 + * 示例情况: + * 已同步手术预约申请单。 + * 手术时间:2018.12.20 同步申请单号:001 + * 现需要同步手术预约申请单。 + * 手术时间:2018.12.26 同步申请单号:001 (出现重复申请单号的原因一:可能同步接口那边修改了申请单手术时间而没有新增一张同步申请单) + * 因为需同步手术时间段:2018.12.26 的申请单号:001已被同步过,但系统不允许重复的申请单号 + * 解决: + * 若config配置:syncOperation_AllowSyncWhenAnyMatchingSyncSerialNumber:true,允许同步申请单号相同的申请单 + * 则该同步申请单的单号001改为:001+系统自生成的单号。再进行保存(同步接口的申请单号不会改) + * 同步时记录重复的申请单号:001,手术时间:2018.12.26。 + * 用于,避免可以再次同步手术时间:2018.12.26 同步申请单号:001的申请单 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class RepeatSyncOperationSerialNumberInfo { + /** + * + */ + private Long id; + + /** + * 已被重复同步的申请单号 + */ + private String serialNumber; + + /** + * 最后同步的手术时间 + */ + private Date operationTime; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public Date getOperationTime() { + return operationTime; + } + + public void setOperationTime(Date operationTime) { + this.operationTime = operationTime; + } +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManager.java =================================================================== diff -u -r23892 -r25257 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManager.java (.../OperationReservationManager.java) (revision 23892) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/service/OperationReservationManager.java (.../OperationReservationManager.java) (revision 25257) @@ -75,6 +75,15 @@ * 手动同步手术预约单 * @param serialNumberList * @return JSONObject + * 返回JSONObject格式: + * {"total":同步申请单总数, + * "successCount":同步成功条数, + * "successDetail":["同步成功的信息",..], + * "failureCount":同步失败条数, + * "failureDetail":["同步原因的信息",..] + * "successDetailTipsCount",返回前台的成功提示的条数; + * "successDetailTips":["返回前台的成功提示",..], + * } */ public JSONObject syncOperationReservation(List serialNumberList); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/action/OperationReservationAction.java =================================================================== diff -u -r24994 -r25257 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/action/OperationReservationAction.java (.../OperationReservationAction.java) (revision 24994) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/operationreservation/action/OperationReservationAction.java (.../OperationReservationAction.java) (revision 25257) @@ -290,60 +290,41 @@ public void saveSyncOperationReservation(){ String serialNumbers = StrutsParamUtils.getPraramValue("serialNumber", ""); String message = ""; - String error = ""; - String correct = ""; - int successCount = 0; try { if (StringUtils.isNotBlank(serialNumbers)) { - String[] serialNumberarry = serialNumbers.split(Constants.IDS_SEPARATOR); - List serialNumberList = Arrays.asList(serialNumberarry); - //开始手动同步 - JSONObject res=operationReservationManager.syncOperationReservation(serialNumberList); - int total=(int) res.get("total"); - successCount = (int) res.get("successCount"); - int failureCount = (int) res.get("failureCount"); - String failureDetail = res.get("failureDetail").toString(); - //是否申请单单同步失败 - if(failureCount>0){ - message = "一共同步"+total+"条申请单!"+"成功同步"+successCount+"条!失败"+failureCount+"条!"; - //有申请单同步失败也有申请单同步成功 - if(successCount>0){ - error="失败原因:"+failureDetail; - } - //全部申请单同步失败 - else{ - error="失败原因:"+failureDetail; - } + String[] serialNumberarry = serialNumbers.split(Constants.IDS_SEPARATOR); + @SuppressWarnings("unchecked") + List serialNumberList = Arrays.asList(serialNumberarry); + //开始手动同步 + JSONObject resultObject = operationReservationManager.syncOperationReservation(serialNumberList); + //返回信息 + int total=(int) resultObject.get("total"); + int successCount = (int) resultObject.get("successCount"); + int failureCount = (int) resultObject.get("failureCount"); + int successDetailTipsCount = (int) resultObject.get("successDetailTipsCount"); + String failureDetail = resultObject.get("failureDetail").toString(); + String successDetailTips = resultObject.get("successDetailTips").toString(); + //是否申请单单同步失败 + if(failureCount>0){ + message = "一共同步"+total+"条申请单!"+"成功同步"+successCount+"条!失败"+failureCount+"条!失败原因:"+failureDetail; + if(successDetailTipsCount>0){ + message += "成功提示:" + successDetailTips; } - //全部申请单同步成功 - else{ - message = "一共同步"+total+"条申请单!"+"成功同步"+successCount+"条!"; + StrutsResponseUtils.output(false, message); + } + //全部申请单同步成功 + else{ + message = "一共同步"+total+"条申请单!"+"成功同步"+successCount+"条!"; + if(successDetailTipsCount>0){ + message += "成功提示:" + successDetailTips; } + StrutsResponseUtils.output(true, message); + } } } catch (Exception e) { - message = "同步失败"; e.printStackTrace(); StrutsResponseUtils.output(false, e.getMessage()); } - //根据同步成功个数返回成功信息 - JSONObject result = new JSONObject(); - boolean success =true; - result.put("message", message); - if(!StringTools.isBlank(error)){ - if(successCount>0){ - //部分同步成功 - result.put("error", error); - result.put("correct", correct); - }else{ - //全部申请单同步失败 - result.put("error", error); - success = false; - } - }else{ - //全部同步成功 - result.put("correct", correct); - } - StrutsResponseUtils.output(success, result); } /**