Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java =================================================================== diff -u -r20094 -r20183 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 20094) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 20183) @@ -58,6 +58,7 @@ import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.idcardinstance.service.IDCardInstanceManager; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceManager; @@ -68,6 +69,8 @@ import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.MathTools; @@ -114,6 +117,8 @@ private WriteBackInventoryHelper writeBackInventoryHelper; + private LogManager appLogManager; + /** * 省医回写dao */ @@ -219,6 +224,10 @@ this.invoiceManager = invoiceManager; } + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + @Override public ReturnGoodsRecord getById(String id) { return (ReturnGoodsRecord) objectDao @@ -874,10 +883,12 @@ xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoTotalList); logger.debug("退货回写参数xmlParam="+xmlParam); - String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); - JSONObject jsonReturn = JSONObject.fromObject(result); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退货回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退货回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } }catch(Exception e){ e.printStackTrace(); Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js =================================================================== diff -u -r19822 -r20183 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js (.../diposableGoodsView.js) (revision 19822) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.js (.../diposableGoodsView.js) (revision 20183) @@ -47,6 +47,7 @@ {name : 'batchNumber'}, {name : 'cost'}, {name : 'expDate'}, + {name : 'sterileBatchNumber'}, {name : 'hasPrinted'}, {name : 'printTime'}, {name : 'supplierName'}, @@ -540,10 +541,11 @@ sm : selectModel, cm : new top.Ext.grid.ColumnModel([selectModel, {header : "id",dataIndex : 'id',hidden : true}, - {header : "条码",width : 90,dataIndex : 'barcode',menuDisabled:true}, - {header : "批次",width : 90,dataIndex : 'batchNumber',menuDisabled:true}, + {header : "条码",width : 80,dataIndex : 'barcode',menuDisabled:true}, + {header : "批次",width : 80,dataIndex : 'batchNumber',menuDisabled:true}, {header : "价格",width : 50,dataIndex : 'cost',menuDisabled:true}, {header : "失效期",width : 90,dataIndex : 'expDate',renderer:myDateFormat,menuDisabled:true}, + {header : "灭菌批号",width : 90,dataIndex : 'sterileBatchNumber'}, {header : "是否打印",width : 70,dataIndex : 'hasPrinted',menuDisabled:true}, {header : "打印时间",width : 90,dataIndex : 'printTime',renderer:myDateFormat,menuDisabled:true}, {id:'supplierName',header : "供应商",width : 130,dataIndex : 'supplierName',menuDisabled:true} Index: forgon-core/src/main/java/com/forgon/log/model/Log.java =================================================================== diff -u -r19341 -r20183 --- forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 19341) +++ forgon-core/src/main/java/com/forgon/log/model/Log.java (.../Log.java) (revision 20183) @@ -44,6 +44,7 @@ public static final String MODEL_INTERFERE = "干预模块"; public static final String MODEL_DISPOSABLEGOODS_WRITEBACK = "一次性物品回写"; public static final String MODEL_DISPOSABLEGOODS = "一次性物品"; + public static final String MODEL_INVENTORYSYCN = "物资同步"; public static final String MODEL_TOUSSEDEFINITION = "器械包定义"; public static final String MODEL_RECYCLINGERRORANDDAMAGE = "丢失报损模块"; public static final String MODEL_BORROW = "借物管理模块"; Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/inventorymanagement/service/InventoryManagerImpl.java =================================================================== diff -u -r20178 -r20183 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/inventorymanagement/service/InventoryManagerImpl.java (.../InventoryManagerImpl.java) (revision 20178) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/inventorymanagement/service/InventoryManagerImpl.java (.../InventoryManagerImpl.java) (revision 20183) @@ -311,8 +311,9 @@ if(disposableGoods != null){ disposableGoods.setInventorySerialNumber(inventory.getSerialNumber()); - //设置his系统原始的id + //设置his系统原始的id及外部编码 disposableGoods.setIdFromHisSync(item.getSourceId()); + disposableGoods.setExternalCode(inventory.getExternalCode()); inventory.setDisposableGoods(disposableGoods); } else { // 若不是一次性物品则查找器械材料定义 @@ -324,8 +325,9 @@ if(materialDefinition != null){ // 按物资编码没找到但按名称规格能匹配的,保存物资编码 materialDefinition.setInventorySerialNumber(inventory.getSerialNumber()); - //设置his系统原始的id + //设置his系统原始的id及外部编码 materialDefinition.setIdFromHisSync(item.getSourceId()); + materialDefinition.setExternalCode(inventory.getExternalCode()); } } inventory.setMaterialDefinition(materialDefinition); @@ -380,9 +382,9 @@ .getName())); ds.setCertification(inventory.getCertification()); ds.setInventorySerialNumber(inventory.getSerialNumber()); - //设置his系统原始的id + //设置his系统原始的id及外部编码 ds.setIdFromHisSync(item.getSourceId()); - + ds.setExternalCode(inventory.getExternalCode()); } else { MaterialDefinition md = new MaterialDefinition(); inventory.setMaterialDefinition(md); @@ -397,8 +399,9 @@ md.setCost(inventory.getCost()); md.setIsTraceble("是"); md.setInventorySerialNumber(inventory.getSerialNumber()); - //设置his系统原始的id + //设置his系统原始的id及外部编码 md.setIdFromHisSync(item.getSourceId()); + md.setExternalCode(inventory.getExternalCode()); } break; } @@ -1124,6 +1127,7 @@ godownEntryOrgUnitCode = supplyRoomConfigManager.getFirstSupplyRoomConfig().getOrgUnitCoding(); } + Date now = new Date(); for (StorageEntry storageEntry : storageEntrys) { if(StringUtils.isNotBlank(storageEntry.getOrgUnitCoding())){ godownEntryOrgUnitCode = storageEntry.getOrgUnitCoding(); @@ -1146,7 +1150,7 @@ godownEntry.setSubType(GodownEntry.SUBTYPE_SYNC_OUT); } godownEntry.setSerialNumber(storageEntry.getSerialNumber()); - godownEntry.setTime(new Date()); + godownEntry.setTime(now); godownEntry.setWarehouseID(WareHouse.getId()); godownEntry.setWarehouseName(WareHouse.getName()); @@ -1187,6 +1191,11 @@ godownEntryItem.setCost(item.getUnitPrice()); godownEntryItem.setDisposableGoodsID(disposableGoods.getId()); godownEntryItem.setExpDate(item.getExpDate()); + //如果失效期为空,或失效期小于当前时间,则该单的数据状态设置为异常 + if(godownEntryItem.getExpDate() == null || godownEntryItem.getExpDate().before(now)){ + godownEntry.setDataStatus(GodownEntry.DATA_STASUS_ERROR); + } + godownEntryItem.setIdentification(item.getIdentification());// 标识号 godownEntryItem.setManufacturer(item.getManufacturer()); godownEntryItem.setSterileBatchNumber(item.getSterileBatchNumber()); @@ -1196,22 +1205,22 @@ godownEntryItem.setBatchIdFromHisSync(item.getBatchIdFromHisSync()); if(StringUtils.equals(type, GodownEntry.TYPE_OUT)){//若是一次性退库则需要批次,库存,批次库存id - //批次 - DisposableGoodsBatch DisposableGoodsBatch =(DisposableGoodsBatch)objectDao.getBySql( - DisposableGoodsBatch.class.getSimpleName(), - "where po.batchNumber="+item.getBatchNumber() +" and po.diposableGoods.id=" + disposableGoods.getId()); - godownEntryItem.setDisposableGoodsBatchID(DisposableGoodsBatch.getId()); - //库存 - WareHouse wareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(AcegiHelper.getCurrentOrgUnitCode()); - DisposableGoodsStock DisposableGoodsStock = (DisposableGoodsStock)objectDao.getBySql( - DisposableGoodsStock.class.getSimpleName(), - "where po.warehouseID="+ wareHouse.getId() +" and po.disposableGoodsID=" + disposableGoods.getId()); - godownEntryItem.setDisposableGoodsStockID(DisposableGoodsStock.getId()); - //批次库存 - DisposableGoodsBatchStock disposableGoodsBatchStock =(DisposableGoodsBatchStock)objectDao.getBySql( - DisposableGoodsBatchStock.class.getSimpleName(), - "where po.warehouseID="+ wareHouse.getId() +" and po.disposableGoodsBatchId=" + DisposableGoodsBatch.getId()); - godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); + //批次 + DisposableGoodsBatch DisposableGoodsBatch =(DisposableGoodsBatch)objectDao.getBySql( + DisposableGoodsBatch.class.getSimpleName(), + "where po.batchNumber="+item.getBatchNumber() +" and po.diposableGoods.id=" + disposableGoods.getId()); + godownEntryItem.setDisposableGoodsBatchID(DisposableGoodsBatch.getId()); + //库存 + WareHouse wareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(AcegiHelper.getCurrentOrgUnitCode()); + DisposableGoodsStock DisposableGoodsStock = (DisposableGoodsStock)objectDao.getBySql( + DisposableGoodsStock.class.getSimpleName(), + "where po.warehouseID="+ wareHouse.getId() +" and po.disposableGoodsID=" + disposableGoods.getId()); + godownEntryItem.setDisposableGoodsStockID(DisposableGoodsStock.getId()); + //批次库存 + DisposableGoodsBatchStock disposableGoodsBatchStock =(DisposableGoodsBatchStock)objectDao.getBySql( + DisposableGoodsBatchStock.class.getSimpleName(), + "where po.warehouseID="+ wareHouse.getId() +" and po.disposableGoodsBatchId=" + DisposableGoodsBatch.getId()); + godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); } godownEntryItem.setGodownEntry(godownEntry);// 和退库单关联 //godownEntryItem.setDisposableGoodsStockID(disposableGoods.getId());// 和一次性物品ID关联 Index: ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/server/InventoryStockWebServiceImpl.java =================================================================== diff -u -r15927 -r20183 --- ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/server/InventoryStockWebServiceImpl.java (.../InventoryStockWebServiceImpl.java) (revision 15927) +++ ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/server/InventoryStockWebServiceImpl.java (.../InventoryStockWebServiceImpl.java) (revision 20183) @@ -13,12 +13,15 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; import com.forgon.disinfectsystem.inventorymanagement.gdsy.dao.InventoryDao; import com.forgon.disinfectsystem.inventorymanagement.gdsy.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.model.StorageEntry; import com.forgon.disinfectsystem.inventorymanagement.service.InventoryManager; import com.forgon.disinfectsystem.webservice.helper.WebServiceClientHelper; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -37,6 +40,8 @@ private InventoryManager inventoryManager; + private LogManager appLogManager; + public void setInventoryDao(InventoryDao inventoryDao) { this.inventoryDao = inventoryDao; } @@ -51,6 +56,10 @@ this.config = config; } + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + /** * 日志信息 */ @@ -87,10 +96,12 @@ */ public String receiveInStorageData(String dataXml){ logger.debug("receiveInStorageData method invoking...dataXml="+dataXml); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "物资推送入库,dataXml="+dataXml); String xmlResult = ""; if(running == true){ xmlResult += " 1 "+"接口正在运行处理中,请稍候再调用!"+" "; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "接口返回给物资系统,result="+xmlResult); return xmlResult; } running = true; @@ -113,16 +124,20 @@ if(CollectionUtils.isNotEmpty(storageEntrys)){ inventoryManager.syncStorageEntry_TRANS_REQUIRED(storageEntrys, WebServiceClientHelper.OPERATOR_HIS, GodownEntry.TYPE_IN); xmlResult += " 0 "; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "接口返回给物资系统,result="+xmlResult); }else{ xmlResult += " 1 未找到对应的入库单 "; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "接口返回给物资系统,result="+xmlResult); } }else{ xmlResult += " 1 " + jsonObjectResult.get("error") + " "; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "接口返回给物资系统,result="+xmlResult); } return xmlResult; }catch (Exception e) { e.printStackTrace(); xmlResult += " 1 服务器出错! "; + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVENTORYSYCN, Log.TYPE_ADD, "接口返回给物资系统,result="+xmlResult); return xmlResult; }finally{ running = false; Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/interfere/godownEntryView.js =================================================================== diff -u -r17671 -r20183 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/interfere/godownEntryView.js (.../godownEntryView.js) (revision 17671) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/interfere/godownEntryView.js (.../godownEntryView.js) (revision 20183) @@ -1600,7 +1600,7 @@ manufacturer : action.result.data.itemsList[i].manufacturer, certification : action.result.data.itemsList[i].certification, batchNumber : action.result.data.itemsList[i].batchNumber, - expDate : new Date(action.result.data.itemsList[i].expDate.time), + expDate : new Date(action.result.data.itemsList[i].expDate.time).format('Y-m-d'), supplierName : action.result.data.itemsList[i].supplierName, identification : action.result.data.itemsList[i].identification, totalPrice:parseFloat(Ext.util.Format.usMoney(amount*cost)), Index: forgon-tools/src/main/java/com/forgon/tools/date/DateTools.java =================================================================== diff -u -r17795 -r20183 --- forgon-tools/src/main/java/com/forgon/tools/date/DateTools.java (.../DateTools.java) (revision 17795) +++ forgon-tools/src/main/java/com/forgon/tools/date/DateTools.java (.../DateTools.java) (revision 20183) @@ -17,11 +17,11 @@ public class DateTools { - public static String COMMON_DATE_HMS = "yyyy-MM-dd HH:mm:ss"; - public static String COMMON_DATE_HM = "yyyy-MM-dd HH:mm"; - public static String COMMON_DATE_PATTEN = "yyyy-MM-dd "; - private static String COMMON_DATE = "yyyy-MM-dd 12:00:00"; - private static SimpleDateFormat sdf = new SimpleDateFormat(COMMON_DATE_PATTEN); + public final static String COMMON_DATE_HMS = "yyyy-MM-dd HH:mm:ss"; + public final static String COMMON_DATE_HM = "yyyy-MM-dd HH:mm"; + public final static String COMMON_DATE_PATTEN = "yyyy-MM-dd "; + private final static String COMMON_DATE = "yyyy-MM-dd 12:00:00"; + private final static SimpleDateFormat sdf = new SimpleDateFormat(COMMON_DATE_PATTEN); private static final Logger logger = Logger.getLogger(DateTools.class); public int getSpaceMonthAmountOfTwoDate(String startDate, String endDate) { Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r20095 -r20183 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20095) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 20183) @@ -91,6 +91,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.idpredicate.IDOperators; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoice.service.SubmitInvoiceContext; @@ -2001,6 +2002,10 @@ // 开始发货非紧急物品 submitInvoiceContext.setSendOnlyUrgentGoods(false); + //回写的发货单集合 + List writeBackInvoiceList = new ArrayList(); + //一次性物品库存变动记录(一次性物品标识表及高值耗材库存变动记录) + List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); for (InvoicePlan invoicePlan : filteredList) { if(invoicePlan.delivered() || invoicePlan.deliverEnd()){ continue; @@ -2009,12 +2014,12 @@ if(isSendOutCompletely(submitInvoiceContext)){ break; } - //一次性物品库存变动记录(一次性物品标识表及高值耗材库存变动记录) - List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoTotalList); - //省医回写接口调用 - writebackForGDSY(invoice , disposableGoodsStorageAdjustVoTotalList); + writeBackInvoiceList.add(invoice); } + //省医回写接口调用 + writebackForGDSY(writeBackInvoiceList , disposableGoodsStorageAdjustVoTotalList); + List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新仓库的库存 @@ -2153,11 +2158,18 @@ } } - private void writebackForGDSY(Invoice invoice , List disposableGoodsStorageAdjustVoTotalList) { + private void writebackForGDSY(List invoiceList , List disposableGoodsStorageAdjustVoTotalList) { //省医回写接口调用 - if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null && invoice != null && CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoTotalList)){ + if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null && CollectionUtils.isNotEmpty(invoiceList) + && CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoTotalList)){ /*4 */ + Invoice invoice = invoiceList.get(0); + //如果产生的发货单超过一张时,回写的单号为本次发货的开始单号-末尾单号 + String writeBackSerialNo = "INVOICE_" + invoice.getSerialNumber(); + if(invoiceList.size() > 1){ + writeBackSerialNo += "-" + invoiceList.get(invoiceList.size() - 1).getSerialNumber(); + } //发货单的发货科室-供应室 OrgUnit invoiceCssdOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", invoice.getOrgUnitCoding()); //发货单接收科室-申请单的临床科室 @@ -2169,15 +2181,17 @@ } String xmlParam = "4" + invoiceCssdOrgUnit.getIdFromHisSync() + "" + "" + invoiceClinicOrgUnit.getIdFromHisSync() + "" - + "INVOICE_" + invoice.getSerialNumber() + ""; + + "" + writeBackSerialNo + ""; xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoTotalList); logger.debug("发货回写参数xmlParam="+xmlParam); - String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); - JSONObject jsonReturn = JSONObject.fromObject(result); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "发货回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "发货回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ //将发货回写不成功的消息向上抛出 - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } } } @@ -2237,7 +2251,7 @@ writebackForZSLY(invoiceList); //省医回写接口调用 - writebackForGDSY(invoice , disposableGoodsStorageAdjustVoTotalList); + writebackForGDSY(Collections.singletonList(invoice) , disposableGoodsStorageAdjustVoTotalList); // throw new RuntimeException("发货速度测试!"); return submitInvoiceContext; @@ -2339,16 +2353,19 @@ // 第一次循环发货紧急物品 submitInvoiceContext.setSendOnlyUrgentGoods(true); + //回写的发货单集合 + List writeBackInvoiceList = new ArrayList(); + //库存变动记录(一次性物品标识表及高值耗材库存变动记录) + List disposableGoodsStorageAdjustVoList = new ArrayList(); for (InvoicePlan invoicePlan : filteredList) { // 判断如果扫描的物品已经发完货,那么剩下的单就不需要再遍历处理了 if(isSendOutCompletely(submitInvoiceContext)){ break; } - //库存变动记录(一次性物品标识表及高值耗材库存变动记录) - List disposableGoodsStorageAdjustVoList = new ArrayList(); Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoList); - writebackForGDSY(invoice , disposableGoodsStorageAdjustVoList); + writeBackInvoiceList.add(invoice); } + // 开始发货非紧急物品 submitInvoiceContext.setSendOnlyUrgentGoods(false); for (InvoicePlan invoicePlan : filteredList) { @@ -2359,11 +2376,13 @@ if(isSendOutCompletely(submitInvoiceContext)){ break; } - //库存变动记录(一次性物品标识表及高值耗材库存变动记录) - List disposableGoodsStorageAdjustVoTotalList = new ArrayList(); - Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoTotalList); - writebackForGDSY(invoice , disposableGoodsStorageAdjustVoTotalList); + + Invoice invoice = invoice( invoicePlan, submitInvoiceContext , disposableGoodsStorageAdjustVoList); + writeBackInvoiceList.add(invoice); } + //不管紧急发货还是非紧急发货,统一汇总后回写 + writebackForGDSY(writeBackInvoiceList , disposableGoodsStorageAdjustVoList); + List invoiceList = submitInvoiceContext.getInvoiceList(); Map> updateStockInfo = submitInvoiceContext.getUpdateStockInfo();// 用于更新库存的信息 // 更新器械包库存 Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DisposableGoodsStockAction.java =================================================================== diff -u -r18407 -r20183 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DisposableGoodsStockAction.java (.../DisposableGoodsStockAction.java) (revision 18407) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DisposableGoodsStockAction.java (.../DisposableGoodsStockAction.java) (revision 20183) @@ -1,9 +1,14 @@ package com.forgon.disinfectsystem.diposablegoods.action; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,15 +19,22 @@ import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.util.PageUtil; + import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; +import org.springframework.orm.hibernate4.SessionFactoryUtils; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodBatchStockManager; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; @@ -33,6 +45,7 @@ import com.forgon.systemsetting.service.HttpOptionManager; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.json.JsonPropertyFilter; import com.opensymphony.xwork2.ModelDriven; @@ -43,6 +56,12 @@ @Action(value = "disposableGoodsStockAction") public class DisposableGoodsStockAction implements ModelDriven, Preparable { + + private File[] uploadFiles; + + private String[] uploadFilesFileName; + + private String[] uploadFilesContentType; private DisposableGoodsStock disposableGoodsStock; @@ -56,6 +75,8 @@ private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + private ObjectDao objectDao; + private final Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); protected final Logger logger = Logger.getLogger(this.getClass()); @@ -83,6 +104,34 @@ this.httpOptionManager = httpOptionManager; } + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public File[] getUploadFiles() { + return uploadFiles; + } + + public void setUploadFiles(File[] uploadFiles) { + this.uploadFiles = uploadFiles; + } + + public String[] getUploadFilesFileName() { + return uploadFilesFileName; + } + + public void setUploadFilesFileName(String[] uploadFilesFileName) { + this.uploadFilesFileName = uploadFilesFileName; + } + + public String[] getUploadFilesContentType() { + return uploadFilesContentType; + } + + public void setUploadFilesContentType(String[] uploadFilesContentType) { + this.uploadFilesContentType = uploadFilesContentType; + } + /** * 保存前检查是否重复 * @@ -569,4 +618,194 @@ e.printStackTrace(); } } + + /** + * 上传物资数据文件(目前为省医专用功能) + * 上传完excel文件并进行解析校验、数据入库等处理 + */ + public void uploadInventoryStockFile(){ + String columnNameSourceId = "SourceID"; + String columnNameBatchId = "BatchID"; + String columnNameQuantity = "Quantity"; + String columnNameMaterialNo = "MaterialNo"; + String columnNameMaterialName = "MaterialName"; + String columnNameMaterialSpec = "MaterialSpec"; + String columnNameProductNo = "ProductNo"; + //所需要的列名 + List columnNames = Arrays.asList(columnNameSourceId,columnNameBatchId,columnNameQuantity + ,columnNameMaterialNo,columnNameMaterialName,columnNameMaterialSpec,columnNameProductNo); + + List columnIndexes = new ArrayList(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put(JSONUtil.JSON_KEY_SUCCESS, false); + //检验上传的附件是否有 + if(uploadFiles == null || uploadFiles.length == 0){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "请上传附件"); + StrutsResponseUtils.output(jsonObject); + return; + } + //检查上传的附件数量是否大于1 + if(uploadFiles.length > 1){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "上传附件数量只能是1个"); + StrutsResponseUtils.output(jsonObject); + return; + } + FileInputStream inputStream = null; + Connection conn = null; + Statement stm = null; + try{ + inputStream = new FileInputStream(uploadFiles[0]); + HSSFWorkbook wb = new HSSFWorkbook(inputStream); + //1.检验sheet存不存在,有没有超过一个,只有一个的话默认取第一个 + HSSFSheet firstSheet = null; + try { + firstSheet = wb.getSheetAt(0); + if(firstSheet == null){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "未找到excel文件的sheet"); + StrutsResponseUtils.output(jsonObject); + return; + } + } catch (Exception e) { + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "未找到excel文件的sheet"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //1.检验sheet存不存在,有没有超过一个,只有一个的话默认取第一个 +/* HSSFSheet secondSheet = null; + try { + secondSheet = wb.getSheetAt(1); + if(secondSheet != null){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的sheet数量超过1个"); + StrutsResponseUtils.output(jsonObject); + return; + } + } catch (Exception e) { + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的sheet数量超过1个"); + StrutsResponseUtils.output(jsonObject); + return; + }*/ + + //2.检查是否有数据且列头命名是否正确 + int rowCount = firstSheet.getLastRowNum(); + if(rowCount < 2){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的数据至少需要两行,一行列头和一行数据"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //3.循环校验数据,同时将数据 + HSSFRow headRow = firstSheet.getRow(0); + int cellCount = headRow.getLastCellNum(); + if(cellCount < columnNames.size()){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的数据列数少于7列"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //循环所需要找到的列 + for (int i = 0; i < columnNames.size(); i++) { + boolean found = false; + //循环数据表格中的每一列 + for (int j = 0; j < cellCount; j++) { + HSSFCell cell = headRow.getCell(j); + String cellContent = cell.getStringCellValue(); + if(StringUtils.isBlank(cellContent)){ + continue; + } + if(columnNames.get(i).equalsIgnoreCase(cellContent)){ + columnIndexes.add(j); + found = true; + break; + } + } + if(found == false){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件未找到"+ columnNames.get(i) +"列"); + StrutsResponseUtils.output(jsonObject); + return; + } + } + + conn = SessionFactoryUtils.getDataSource(objectDao.getHibernateSessionFactory()).getConnection(); + stm = conn.createStatement(); + stm.addBatch("delete from JXINVENTORYSTOCK"); + JSONObject dataJsonObject = null; + //4.没有异常时,执行导入入库的逻辑 + for (int i = 1; i <= rowCount; i++) { + dataJsonObject = new JSONObject(); + HSSFRow dataRow = firstSheet.getRow(i); + for (int j = 0; j < columnIndexes.size(); j++) { + String columnName = columnNames.get(j); + String cellValue = ""; + HSSFCell dataCell = dataRow.getCell(columnIndexes.get(j)); + if(dataCell != null){ + cellValue = dataCell.getStringCellValue(); + } + if(columnNameSourceId.equals(columnName) || columnNameBatchId.equals(columnName) || columnNameQuantity.equals(columnName)){ + if(cellValue == null){ + cellValue = ""; + } + if(cellValue.indexOf(".") != -1){ + cellValue = cellValue.substring(0 , cellValue.indexOf(".")); + } + boolean isNegative = false; + if(cellValue.startsWith("-")){ + isNegative = true; + cellValue = cellValue.substring(1); + } + if(!StringUtils.isNumeric(cellValue)){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "第"+ i +"行,列名为"+ columnName +"的内容不为数字,只能为数字。"); + StrutsResponseUtils.output(jsonObject); + return; + } + if(isNegative){ + cellValue = "-" + cellValue; + } + } + dataJsonObject.put(columnNames.get(j), cellValue); + } + stm.addBatch("insert into JXINVENTORYSTOCK(SourceID,BatchID,Quantity,MaterialNo,MaterialName,MaterialSpec,ProductNo) " + + "values ("+ dataJsonObject.optString(columnNameSourceId) +","+ dataJsonObject.optString(columnNameBatchId) +","+ + dataJsonObject.optString(columnNameQuantity) +",'"+ dataJsonObject.optString(columnNameMaterialNo) +"','"+ + dataJsonObject.optString(columnNameMaterialName) +"','"+ dataJsonObject.optString(columnNameMaterialSpec) +"','"+ + dataJsonObject.optString(columnNameProductNo) +"')"); + } + stm.executeBatch(); + + //5.响应输出结果 + jsonObject.put(JSONUtil.JSON_KEY_SUCCESS, true); + StrutsResponseUtils.output(jsonObject); + }catch(Exception e){ + e.printStackTrace(); + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "出现异常:" + e); + StrutsResponseUtils.output(jsonObject); + return; + }finally{ + if(stm != null){ + try { + stm.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if(conn != null){ + try { + conn.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if(inputStream != null){ + try { + inputStream.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntry.java =================================================================== diff -u -r15603 -r20183 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntry.java (.../GodownEntry.java) (revision 15603) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/GodownEntry.java (.../GodownEntry.java) (revision 20183) @@ -113,6 +113,13 @@ */ private Long sourceId; + /** + * 数据状态(有物品的失效期为空或小于当前时间时,状态为异常) + */ + private Integer dataStatus = DATA_STASUS_SUCC; + public final static Integer DATA_STASUS_ERROR = 0; + public final static Integer DATA_STASUS_SUCC = 1; + @JsonIgnore private List itemsList = new ArrayList(); @@ -305,6 +312,14 @@ this.targetOrgUnitName = targetOrgUnitName; } + public Integer getDataStatus() { + return dataStatus; + } + + public void setDataStatus(Integer dataStatus) { + this.dataStatus = dataStatus; + } + public boolean manualIn() { if (StringUtils.equals(subType, SUBTYPE_MANUAL_IN)) { return true; Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js =================================================================== diff -u -r19757 -r20183 --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js (.../godownEntryView.js) (revision 19757) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/godownEntry/godownEntryView.js (.../godownEntryView.js) (revision 20183) @@ -288,6 +288,10 @@ } function renderDeleteButton(v,p,record){ + //如果为修改,则隐藏删除图标 + if(commonEntry.isOpen()){ + return ""; + } return ""; } /** @@ -419,7 +423,8 @@ } var selectModel = new top.Ext.grid.CheckboxSelectionModel(); -function addGodownEntry(type) { +//从入库单列表点添加或点击列表中某一行的单都会调用此function +function addGodownEntry() { Ext.getCmp("formSubmitResult").setValue(formSubmitResultInit); wareHouseStore.load(); var form = new top.Ext.FormPanel({ @@ -626,20 +631,44 @@ {header : "id",dataIndex : 'id',hidden : true}, {header : "disposableGoodsID",dataIndex : 'disposableGoodsID',hidden : true}, {header : "名称",dataIndex : 'name',width : 250,menuDisabled : true}, - {header : "数量",dataIndex : 'amount',width : 40,menuDisabled : true, + {header : "数量",dataIndex : 'amount',width : 50,menuDisabled : true, editor : new top.Ext.form.TextField({ regex: /^\d+$/, regexText:'只能输入数字', allowBlank : false, listeners:{ change :function(field,newVal,oldVal){ + if(commonEntry.isOpen()){ + field.setValue(oldVal); + return false; + } var grid = top.Ext.getCmp('godownEntryItemGrid'); setTotalMoney(grid); + },focus:function(){ + if(commonEntry.isOpen()){ + alert('查看和编辑入库单时不能修改数量'); + return false; + } } } }) }, - {header : "批次",width : 80,dataIndex : 'batchNumber',menuDisabled : true}, + {header : "批次",width : 70,dataIndex : 'batchNumber',menuDisabled : true, + editor : new top.Ext.form.TextField({ + allowBlank : false, + listeners:{ + change :function(field,newVal,oldVal){ + var grid = top.Ext.getCmp('godownEntryItemGrid'); + setTotalMoney(grid); + },focus:function(){ + if(!commonEntry.isOpen()){ + alert('添加入库单的时候不能修改批次号'); + return false; + } + } + } + }) + }, {header : "失效日期",width : 80,dataIndex : 'expDate',menuDisabled : true, renderer:top.Ext.util.Format.dateRenderer('Y-m-d'), editor : new top.Ext.form.DateExtensiableField({ minWidth : 177, @@ -655,8 +684,17 @@ allowBlank : false, listeners:{ change :function(field,newVal,oldVal){ + if(commonEntry.isOpen()){ + field.setValue(oldVal); + return false; + } var grid = top.Ext.getCmp('godownEntryItemGrid'); setTotalMoney(grid); + },focus:function(){ + if(commonEntry.isOpen()){ + alert('查看和编辑入库单时不能修改单价'); + return false; + } } } }) @@ -1207,6 +1245,7 @@ text : '添加', iconCls : 'btn_ext_add', id:'addBtn', + hidden : commonEntry.isOpen(), handler : function() { addGodown(); top.Ext.getCmp('name1').focus(); @@ -1219,7 +1258,51 @@ } })], buttons : [ - { + { + text : '修改物品', + hidden : !commonEntry.isOpen(), + handler : function() { + var store = top.Ext.getCmp('godownEntryItemGrid').getStore(); + var modifyRecords = store.getModifiedRecords(); + var len = modifyRecords.getCount(); + var items = []; + for (var i = 0; i < len; i++) { + var record = modifyRecords[i]; + items.push({ + id : record.data.id,//入库明细id + disposableGoodsID : record.data.disposableGoodsID,//一次性物品定义id + batchID : record.data.batchID,//批次id + batchNumber : record.data.batchNumber,//批次号 + expDate : record.data.expDate.format('Y-m-d'),//失效期 + supplierName : record.data.supplierName,//供应商 + sterileBatchNumber : record.data.sterileBatchNumber,//灭菌批号 + manufacturer : record.data.manufacturer,//生产厂家 + producingArea : record.data.producingArea,//产地 + certification : record.data.certification,//注册证号 + grade : record.data.grade//类别 + }); + } + top.Ext.getCmp("items").setValue(JSON.stringify(items)); + form.form.submit({ + url : WWWROOT + '/disinfectSystem/godownEntryAction!modifyGodownEntryItemBaseData.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + success : function(form, action) { + if(!isUndefinedOrNullOrEmpty(action.result.message)){ + showResult(action.result.message); + return; + } + godownEntryWin.close(); + grid.dwrReload(); + }, + failure : function(form, action) { + alert(action.result.message); + } + }); + } + }, + { text : '选择打印', handler : function() { if(!form.getForm().isValid()){ @@ -1266,7 +1349,7 @@ } },{ text : '保存并打印新标签', - hidden:saveButton || (commonEntry.isOpen()?true:false), + hidden:saveButton || (commonEntry.isOpen() ? true:false), handler : function() { if(!form.getForm().isValid()){ showResult('请正确填写表单各值'); @@ -1751,7 +1834,13 @@ Ext.QuickTips.init(); commonEntry.setCurrentUserName(curUserName); var columns = [ - {header : "单号",width : 200,dataIndex : 'serialNumber', renderer : modifyRecord}, + {header : "单号",width : 200,dataIndex : 'serialNumber', renderer : function(v,p,record){ + if(record.get('dataStatus') == 0 && record.get('subType') == '同步入库'){ + return modifyRecord(v,p,record) + "【有物品异常】"; + } + return modifyRecord(v,p,record); + } + }, {header : "操作员",width : 200,dataIndex : 'operator'}, {header : "入库时间",width : 200,dataIndex : 'time' , renderer : myDateFormatByMinute}, {header : "金额",width : 200,dataIndex : 'totalPrice'}, @@ -1766,7 +1855,9 @@ {name : 'time'}, {name : 'remark'}, {name : 'totalPrice'}, - {name : 'supplierName'} + {name : 'supplierName'}, + {name : 'dataStatus'}, + {name : 'subType'} ]; var filters = new Ext.grid.GridFilters({ @@ -1790,7 +1881,7 @@ iconCls : 'btn_ext_application_add', handler : function() { commonEntry.setId(null); - addGodownEntry('insert'); + addGodownEntry(); } }); tbar.push('-'); @@ -1874,8 +1965,17 @@ null ); + //检查列表的每一行数据,判断是否有异常的数据(考虑背景色容易被鼠标移动或点击该行时改变颜色,所以暂不用背景色的方案) +/* grid.getStore().on('load' , function(s){ + //校验物品数量是否为数字 + for ( var i = 0; i < grid.getStore().getCount(); i++) { + var record = grid.getStore().getAt(i); + if(record.get('dataStatus') == 0 && record.get('subType') == '同步入库'){ + grid.getView().getRow(i).style.backgroundColor = '#FFB5B5'; + } + } + });*/ - function initQueryValueAndReload() { var startDate = Ext.getCmp('startDate').getRawValue(); var endDate = Ext.getCmp('endDate').getRawValue(); Index: ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/helper/WebServiceClientHelper.java =================================================================== diff -u -r15334 -r20183 --- ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/helper/WebServiceClientHelper.java (.../WebServiceClientHelper.java) (revision 15334) +++ ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/webservice/helper/WebServiceClientHelper.java (.../WebServiceClientHelper.java) (revision 20183) @@ -38,15 +38,15 @@ /** * 接口系统代码(除了入库接口外) */ - public static String OPSYSTEM = "HIS"; + public final static String OPSYSTEM = "HIS"; /** * 科室信息接口代码 */ - public static String OPTYPE_ORG = "1001"; + public final static String OPTYPE_ORG = "1001"; /** * 人员信息接口代码 */ - public static String OPTYPE_USER = "1002"; + public final static String OPTYPE_USER = "1002"; /** * 材料/物资 */ @@ -58,16 +58,16 @@ /** * 门诊挂号 */ - public static String OPTYPE_TREATMENTNUM = "1104"; + public final static String OPTYPE_TREATMENTNUM = "1104"; /** * 回写数据 */ - public static String OPTYPE_WRITEBACK = "1210"; + public final static String OPTYPE_WRITEBACK = "1210"; /** * 调用接口的登录名 */ - public static String LOGINNAME = "hissoft"; + public final static String LOGINNAME = "hissoft"; /** * 调用接口的密码 */ @@ -76,19 +76,24 @@ /** * 返回成功的结果码 */ - public static final int CODE_STATE_SUCCESS = 0; + public final static int CODE_STATE_SUCCESS = 0; /** * his调用孚峻供应室系统入库单接口的操作人默认为his */ - public static String OPERATOR_HIS = "HIS"; + public final static String OPERATOR_HIS = "HIS"; /** * 同步科室时对编码为0的替换值 */ - public static String OrgCoding0ReplaceValue = "0123456789"; + public final static String OrgCoding0ReplaceValue = "0123456789"; /** + * 批次号为空的默认批次号 + */ + public final static String EMPTY_BATCHNO = "空批次"; + + /** * 调用入库接口所传的xml参数 */ public static String inStorageDataXml; @@ -163,21 +168,26 @@ * @param jsonData * @return */ - public static JSON testUserAndOrgQuery(JsonObject jsonData){ + public static JSON testOrgQuery(JsonObject jsonData){ JSONObject resultJsonObject = new JSONObject(); JsonObject errorJsonObject = null; try { resultJsonObject.put("RETCODE", jsonData.get("RETCODE").getAsInt()); JSONArray newJsonArray = new JSONArray(); JsonArray deptJsonArray = jsonData.getAsJsonArray("Content"); for (int i = 0; i < deptJsonArray.size(); i++) { - JsonObject deptJsonObject = deptJsonArray.get(i).getAsJsonObject(); - errorJsonObject = deptJsonObject; - JSONObject newJsonObject = new JSONObject(); - newJsonObject.put("DEPARTMENTID", deptJsonObject.get("DEPARTMENTID").getAsString());//由于省医his返回的科室编码可能为空,所以用其id作为科室编码 - newJsonObject.put("DEPARTMENTNAME", deptJsonObject.get("DEPARTMENTNAME").getAsString()); - //newJsonObject.put("DEPARTMENTNO", deptJsonObject.get("DEPARTMENTID").getAsString()); - newJsonArray.add(newJsonObject); + try { + JsonObject deptJsonObject = deptJsonArray.get(i).getAsJsonObject(); + errorJsonObject = deptJsonObject; + JSONObject newJsonObject = new JSONObject(); + newJsonObject.put("DEPARTMENTID", deptJsonObject.get("DEPARTMENTID"));//由于省医his返回的科室编码可能为空,所以用其id作为科室编码 + newJsonObject.put("DEPARTMENTNAME", deptJsonObject.get("DEPARTMENTNAME")); + newJsonObject.put("DEPARTMENTNO", deptJsonObject.get("DEPARTMENTID")); + newJsonArray.add(newJsonObject); + }catch(Exception e){ + logger.error("errorJsonObject="+errorJsonObject); + e.printStackTrace(); + } } resultJsonObject.put("Content", newJsonArray); } catch (Exception e) { @@ -187,7 +197,58 @@ return resultJsonObject; } + //测试方法 /** + * { + "RETCODE": "0", + "Content": [ + { + "DepartmentID": "246", + "EMPLOYEEID": "1", + "EMPLOYEENAME": "冯建章", + "EMPLOYEENO": "2019" + }, + { + "DepartmentID": "216", + "EMPLOYEEID": "2", + "EMPLOYEENAME": "周伯康", + "EMPLOYEENO": "0767" + },.... + } + * @param jsonData + * @return + */ + public static JSON testUserQuery(JsonObject jsonData){ + JSONObject resultJsonObject = new JSONObject(); + JsonObject errorJsonObject = null; + try { + resultJsonObject.put("RETCODE", jsonData.get("RETCODE").getAsInt()); + JSONArray newJsonArray = new JSONArray(); + JsonArray deptJsonArray = jsonData.getAsJsonArray("Content"); + for (int i = 0; i < deptJsonArray.size(); i++) { + try{ + JsonObject deptJsonObject = deptJsonArray.get(i).getAsJsonObject(); + errorJsonObject = deptJsonObject; + JSONObject newJsonObject = new JSONObject(); + newJsonObject.put("DepartmentID", deptJsonObject.get("DepartmentID"));//由于省医his返回的科室编码可能为空,所以用其id作为科室编码 + newJsonObject.put("EMPLOYEEID", deptJsonObject.get("EMPLOYEEID")); + newJsonObject.put("EMPLOYEENAME", deptJsonObject.get("EMPLOYEENAME")); + newJsonObject.put("EMPLOYEENO", deptJsonObject.get("EMPLOYEENO")); + newJsonArray.add(newJsonObject); + }catch(Exception e){ + logger.error("errorJsonObject="+errorJsonObject); + e.printStackTrace(); + } + } + resultJsonObject.put("Content", newJsonArray); + } catch (Exception e) { + logger.error("errorJsonObject="+errorJsonObject); + e.printStackTrace(); + } + return resultJsonObject; + } + + /** * 根据住院号查询病人信息接口调用 * @param opsystem * @param optype Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java =================================================================== diff -u -r19508 -r20183 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 19508) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 20183) @@ -51,13 +51,16 @@ import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryExpensiveGoodsItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.stocktakerecordmanager.service.StockTakeRecordManager; import com.forgon.disinfectsystem.tousse.materialdefinition.service.MaterialDefinitionManager; import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialCheckManager; import com.forgon.disinfectsystem.tousse.materialmanager.service.MaterialEntryManager; import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; import com.forgon.excel.service.ExcelUtils; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.MathTools; @@ -94,6 +97,8 @@ private MaterialDefinitionManager materialDefinitionManager; + private LogManager appLogManager; + /** * 省医回写dao */ @@ -142,6 +147,10 @@ this.writeBackInventoryDao = writeBackInventoryDao; } + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + @Override public InventoryRecord getById(String id) { return (InventoryRecord) objectDao.getByProperty( @@ -195,55 +204,57 @@ Map returnMsg = new HashMap(); try { - // 盘盈入库单 - if (in_array.size() > 0) { + // 盘亏退库单(考虑回写的成功情况,盘盈回写成功率高于盘亏回写成功率,所以将盘亏业务提前先处理然后再进行盘盈处理) + if (out_array.size() > 0) { GodownEntry entry = newGodownEntry(inventoryRecord, - MaterialEntry.TYPE_IN,MaterialEntry.SUBTYPE_STOCKTAKE_IN, in_array); - List disposableGoodsStorageAdjustVoList = godownEntryManager.saveGodownEntryModifyOnlyAmount_TRANS_REQUIRED(entry,returnMsg); + GodownEntry.TYPE_OUT,GodownEntry.SUBTYPE_STOCKTAKE_OUT, out_array); + //是否需要回写,盘亏时是不用回写的,因为并不会退回到一级仓库增加一级仓库库存,只用扣减二级仓库的库存 + boolean needWriteBack = false; + List disposableGoodsStorageAdjustVoList = godownEntryManager.saveGodownOutEntry_TRANS_REQUIRED(entry,returnMsg,needWriteBack); - //省医回写 + //回写 if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null && CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoList)){ /*4 */ - //盘盈供应室 + //盘亏供应室 OrgUnit inventoryCssdOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", entry.getOrgUnitCode()); - String xmlParam = "4-1" - + ""+ inventoryCssdOrgUnit.getIdFromHisSync() +"" - + "CHECKIN_" + entry.getSerialNumber() + ""; + String xmlParam = "4" + inventoryCssdOrgUnit.getIdFromHisSync() + "" + + "-1" + + "CHECKOUT_" + entry.getSerialNumber() + ""; xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); - logger.debug("供应室盘盈入库回写参数xmlParam="+xmlParam); - String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); - JSONObject jsonReturn = JSONObject.fromObject(result); + logger.debug("供应室盘亏退库回写参数xmlParam="+xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "供应室盘亏回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "供应室盘亏回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } } } - // 盘亏退库单 - if (out_array.size() > 0) { + // 盘盈入库单 + if (in_array.size() > 0) { GodownEntry entry = newGodownEntry(inventoryRecord, - GodownEntry.TYPE_OUT,GodownEntry.SUBTYPE_STOCKTAKE_OUT, out_array); - //是否需要回写,盘亏时是不用回写的,因为并不会退回到一级仓库增加一级仓库库存,只用扣减二级仓库的库存 - boolean needWriteBack = false; - List disposableGoodsStorageAdjustVoList = godownEntryManager.saveGodownOutEntry_TRANS_REQUIRED(entry,returnMsg,needWriteBack); + MaterialEntry.TYPE_IN,MaterialEntry.SUBTYPE_STOCKTAKE_IN, in_array); + List disposableGoodsStorageAdjustVoList = godownEntryManager.saveGodownEntryModifyOnlyAmount_TRANS_REQUIRED(entry,returnMsg); - //回写 + //省医回写 if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null && CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoList)){ /*4 */ - //盘亏供应室 + //盘盈供应室 OrgUnit inventoryCssdOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", entry.getOrgUnitCode()); - String xmlParam = "4" + inventoryCssdOrgUnit.getIdFromHisSync() + "" - + "-1" - + "CHECKOUT_" + entry.getSerialNumber() + ""; + String xmlParam = "4-1" + + ""+ inventoryCssdOrgUnit.getIdFromHisSync() +"" + + "CHECKIN_" + entry.getSerialNumber() + ""; xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); - logger.debug("供应室盘亏退库回写参数xmlParam="+xmlParam); + logger.debug("供应室盘盈入库回写参数xmlParam="+xmlParam); String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); JSONObject jsonReturn = JSONObject.fromObject(result); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } } } Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r19671 -r20183 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 19671) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 20183) @@ -305,6 +305,7 @@ {hidden :SSTS_DisposableGoods_Menu,text:"一次性物品管理",href:WWWROOT+'/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoods_Menu,text:"高值耗材使用记录",href:WWWROOT+'/disinfectsystem/assestManagement/disposableGoods/expensiveDisposableGoodsUseRecordView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsStock_Manager,text:"一次性物品库存",href:WWWROOT+'/disinfectsystem/assestManagement/disposableGoods/disposableGoodsStockView.jsp',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_DisposableGoodsStock_Manager || !sstsConfig.enableBatchStockCompare,text:"库存对比",href:WWWROOT+'/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsOutOfStorage_Manager,text:"一次性物品出入库记录",href:WWWROOT+'/disinfectsystem/assestManagement/disposableGoods/storageRecordView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsGodownEntry_Manager,text:"一次性物品入库单管理",href:WWWROOT+'/disinfectsystem/assestManagement/godownEntry/godownEntryView.jsp',hrefTarget:linkTarget,leaf:true}, {hidden :SSTS_DisposableGoodsCancellingStocks_Manager,text:"一次性物品退库单管理",href:WWWROOT+'/disinfectsystem/assestManagement/godownEntry/godownOutView.jsp',hrefTarget:linkTarget,leaf:true}, Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java =================================================================== diff -u -r19422 -r20183 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java (.../DisposableGoods.java) (revision 19422) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/assestmanagement/DisposableGoods.java (.../DisposableGoods.java) (revision 20183) @@ -96,7 +96,7 @@ private String applicationSpecification; // 申领规格 private String orginalApplicationSpecification;// 不保存到数据库,用于判断是否做了修改 - private Integer transferScale; //中包装单位装换单位系数 + private Integer transferScale; //中包装单位转换单位系数 private Integer minApplyAmount; //最小申请数量 Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManager.java =================================================================== diff -u -r19508 -r20183 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManager.java (.../GodownEntryManager.java) (revision 19508) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManager.java (.../GodownEntryManager.java) (revision 20183) @@ -74,4 +74,26 @@ public void setGodownEntryDefaultWareHouse(GodownEntry entry,String orgUnitCoding); public void printSomeGodownEntryItem(String items,JSONObject jsonObj); + + /** + * 修改入库单的物品明细的各个属性(不支持修改单价、数量等字段)后,需要分别更新到入库明细表、一次n性物品定义、批次定义等表中 + * @param items 物品明细的json数组格式,示例格式: + * [ + * { + id : record.data.id,//入库明细id + disposableGoodsID : record.data.disposableGoodsID,//一次性物品定义id + batchID : record.data.batchID,//批次id + batchNumber : record.data.batchNumber,//批次号 + expDate : record.data.expDate.format('Y-m-d'),//失效期 + supplierName : record.data.supplierName,//供应商 + sterileBatchNumber : record.data.sterileBatchNumber,//灭菌批号 + manufacturer : record.data.manufacturer,//生产厂家 + producingArea : record.data.producingArea,//产地 + certification : record.data.certification,//注册证号 + grade : record.data.grade//类别 + } + * ] + * @param jsonObj 接收返回的参数 + */ + public void modifyGodownEntryItemBaseData(String items,JSONObject jsonObj); } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r20084 -r20183 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 20084) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 20183) @@ -946,6 +946,7 @@ temp.put("name", goodsName); temp.put("spelling", disposableGoods.getSpelling()); temp.put("externalCode", externalCode); + temp.put("sourceId", disposableGoods.getIdFromHisSync()); temp.put("goodsType", disposableGoods.getGoodsType()); temp.put("minApplyAmount", disposableGoods.getMinApplyAmount()); temp.put("unit", StringTools.getDefaultString(disposableGoods.getUnit())); Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.jsp (revision 20183) @@ -0,0 +1,42 @@ +<%@page import="com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem"%> +<%@page import="com.forgon.disinfectsystem.entity.basedatamanager.supplier.Supplier,com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry "%> +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> +<%@ include file="/common/includeExtJsAndCss.jsp"%> +<%@ include file="/common/include_Ext42_Css.jsp"%> +<%@ page import="com.forgon.tools.SpringBeanManger" %> + +<%@ include file="/common/includeExtJs4_2.jsp"%> + + + +库存对比信息 + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+ + + \ No newline at end of file Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java =================================================================== diff -u -r19508 -r20183 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 19508) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/GodownEntryManagerImpl.java (.../GodownEntryManagerImpl.java) (revision 20183) @@ -44,10 +44,13 @@ import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordDiposableGoodsItem; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; import com.forgon.disinfectsystem.vo.GodownEntryItemPrintVO; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; import com.forgon.tools.MathTools; @@ -71,6 +74,8 @@ private WriteBackInventoryHelper writeBackInventoryHelper; + private LogManager appLogManager; + /** * 回写dao * 仅省医使用 @@ -140,6 +145,10 @@ this.barcodeManager = barcodeManager; } + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + @Override public GodownEntry getGodownEntryById(String id) { return (GodownEntry) objectDao.getByProperty( @@ -1674,10 +1683,12 @@ xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); logger.debug("调拨回写参数xmlParam="+xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "调拨回写参数xmlParam="+xmlParam); String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "调拨回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } } } @@ -2255,10 +2266,12 @@ xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); logger.debug("退库回写参数xmlParam="+xmlParam); - String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); - JSONObject jsonReturn = JSONObject.fromObject(result); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退库回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退库回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } }catch(Exception e){ e.printStackTrace(); @@ -2655,4 +2668,118 @@ } jsonObj.put("items", jsonArray); } + + @Override + public void modifyGodownEntryItemBaseData(String items, JSONObject jsonObj) { + jsonObj.put(JSONUtil.JSON_KEY_SUCCESS, false); + + try { + if (StringUtils.isBlank(items)) { + throw new RuntimeException("参数非法,items不能为空!"); + } + GodownEntry godownEntry = null; + Date now = new Date(); + JSONArray itemsObj = JSONArray.fromObject(items); + for(int i=0;i> parameterMap){ + JSONObject jsonObject = new JSONObject(); + JSONArray dataJsonArray = new JSONArray(); + String sql = "select * from ("+ + //--1.以追溯系统数据为基准,查询出与物资系统库存不一致的数据(包括追溯系统有库存但物资系统却没有的库存数据) + "select dg.idFromHisSync sourceid,dgi.batchIdFromHisSync batchid, dg.externalCode externalCode,dg.name name,dg.specification specification,dgb.batchNumber batchNumber,dgi.amount cssdStock,js.quantity inventoryStock "+ + "from DisposableGoodsIdentification dgi join DisposableGoods dg on dgi.disposableGoodsID=dg.id "+ + "join DisposableGoodsBatch dgb on dgi.disposableGoodsBatchID=dgb.id "+ + "left join JXINVENTORYSTOCK js on dgi.batchIdFromHisSync=js.batchid "+ + "where dgi.amount > 0 and convert(decimal(20,4),js.quantity) > 0 and dgi.amount <> convert(decimal(20,4),js.quantity) "+ + + "union "+ + + //2.查询追溯系统有库存但物资系统没有库存的数据 + "select dg.idFromHisSync sourceid,dgi.batchIdFromHisSync batchid,dg.externalCode externalCode,dg.name name,dg.specification specification,dgb.batchNumber batchNumber,dgi.amount cssdStock,null inventoryStock "+ + "from DisposableGoodsIdentification dgi join DisposableGoods dg on dgi.disposableGoodsID=dg.id "+ + "join DisposableGoodsBatch dgb on dgi.disposableGoodsBatchID=dgb.id "+ + "where dgi.amount > 0 and dg.idFromHisSync not in (select SourceID from JXINVENTORYSTOCK where Quantity > 0 and SourceID is not null) "+ + + "union "+ + + //3.查询物资系统有库存但追溯系统没有库存的数据 + "select js.sourceid sourceId,js.batchid batchId,js.materialno externalCode,js.MaterialName name,js.MaterialSpec specification,js.ProductNo batchNumber,null cssdStock,js.quantity inventoryStock "+ + "from JXINVENTORYSTOCK js where convert(decimal(20,4),js.quantity) > 0 and batchid not in "+ + "(select batchIdFromHisSync from DisposableGoodsIdentification where amount > 0 and batchIdFromHisSync is not null) "+ + ") alias where 1=1 "; + List sourceIdCondition = parameterMap.get("parm_s_sourceId"); + if(CollectionUtils.isNotEmpty(sourceIdCondition) && StringUtils.isNotBlank(sourceIdCondition.get(0))){ + sql += " and sourceId in ("+ StringUtils.join(sourceIdCondition, ",") +")"; + } + sql += " order by externalCode,batchid"; + ResultSet rs = null; + try{ + rs = objectDao.executeSql(sql); + while(rs.next()){ + JSONObject dataJsonObject = new JSONObject(); + dataJsonObject.put("sourceId", rs.getObject("sourceId")); + dataJsonObject.put("batchId", rs.getObject("batchId")); + dataJsonObject.put("externalCode", rs.getObject("externalCode")); + dataJsonObject.put("name", rs.getObject("name")); + dataJsonObject.put("specification", rs.getObject("specification")); + dataJsonObject.put("displayName", DisposableGoodsUtils.getDisposableGoodsFullName(dataJsonObject.optString("name"), dataJsonObject.optString("specification"))); + dataJsonObject.put("batchNumber", rs.getObject("batchNumber")); + dataJsonObject.put("cssdStock", rs.getObject("cssdStock")); + dataJsonObject.put("inventoryStock", rs.getObject("inventoryStock")); + dataJsonArray.add(dataJsonObject); + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null){ + try { + rs.close(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + jsonObject.put("totalResults", dataJsonArray.size()); + jsonObject.put("rows", dataJsonArray); + jsonObject.put("selectSqlWhereCondition", "where 1=1"); + return jsonObject.toString(); + } + } Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/model/Inventory.java =================================================================== diff -u -r16365 -r20183 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/model/Inventory.java (.../Inventory.java) (revision 16365) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/model/Inventory.java (.../Inventory.java) (revision 20183) @@ -17,6 +17,10 @@ private String unit; private Double cost; private String certification; + /** + * 外部编码 + */ + private String externalCode; private DisposableGoods disposableGoods; private MaterialDefinition materialDefinition; @@ -98,6 +102,14 @@ this.certification = certification; } + public String getExternalCode() { + return externalCode; + } + + public void setExternalCode(String externalCode) { + this.externalCode = externalCode; + } + public String getOne() { return one; } Index: ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js =================================================================== diff -u -r20149 -r20183 --- ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 20149) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdsy/config.js (.../config.js) (revision 20183) @@ -234,5 +234,7 @@ // 发货扫描后,重新排序申请物品 invoicePlanExtractedForm_resortRecyclingApplicationItems : true, //禁用供应室领用记录删除(防止因删除导致回写结果不准确) - disableReceiveRecordDelete : true + disableReceiveRecordDelete : true, + //启用库存对比功能菜单 + enableBatchStockCompare : true } \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/assestManagement/disposableGoods/batchStockCompare.js (revision 20183) @@ -0,0 +1,224 @@ +var entityName = "库存对比"; +var grid; + +/*var wareHouseStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/wareHouseAction!getWareHouseData.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'}, + {name : 'orgUnitCode',mapping : 'orgUnitCode'}, + ]), + listeners : { + load : function(store,records) { + if(records.length > 0 && (!commonEntry.isOpen())){ + var combo = top.Ext.getCmp("wareHouse1"); + // 触发选中事件 + combo.fireEvent('select', combo,records[0],0); + } + top.Ext.getCmp("name1").enable(); + } + } +});*/ + +// 全部一次性物品 +var allDiposableGoodsStore = new Ext.data.Store({ + pageSize: 100, + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/diposableGoodsAction!getDiposableGoodsData.do?allItems=yes', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'sourceId',mapping : 'sourceId'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'} + ]) +}); + +function openFileImportWindow(){ + var dialog = new top.Ext.ux.UploadDialog.Dialog({ + title: "导入数据(只能上传一个文件)", + url:WWWROOT + '/disinfectSystem/disposableGoodsStockAction!uploadInventoryStockFile.do', //这里我用struts2做后台处理 + post_var_name:'uploadFiles',//这里是自己定义的,默认的名字叫file + width : 450, + height : 300, + minWidth : 450, + minHeight : 300, + draggable : true , + resizable : true , + constraintoviewport: true , + permitted_extensions:['xls'], + modal: true , + reset_on_hide: false , + allow_close_on_upload: false , //关闭上传窗口是否仍然上传文件 + upload_autostart: false + }); + + dialog.show(); + dialog.on('uploadsuccess',function(dialog){debugger; + showResult("文件导入成功!"); + + //刷新外面的窗体表格数据 + grid.dwrReload(); + + dialog.hide(); + }); //定义上传完成回调函数 + dialog.on('uploadfailed',function(dialog){debugger; + showResult("文件上传失败!"); + //dialog.hide(); + }); //定义上传完成回调函数 +} + +Ext.onReady(function() { + Ext.QuickTips.init(); + var columns = [ + {header : "sourceId",width : 200,dataIndex : 'sourceId',sortable:false}, + {header : "batchId",width : 200,dataIndex : 'batchId',sortable:false}, + {header : "外部编码",width : 200,dataIndex : 'externalCode',sortable:false}, + {header : "名称",width : 200,dataIndex : 'displayName',sortable:false}, + {header : "批次号",width : 200,dataIndex : 'batchNumber',sortable:false}, + {header : "追溯系统库存",width : 200,dataIndex : 'cssdStock',sortable:false}, + {header : "物资系统库存",width : 200,dataIndex : 'inventoryStock',sortable:false} + ]; + + var readerDetail = [ + {name : 'sourceId'}, + {name : 'batchId'}, + {name : 'externalCode'}, + {name : 'displayName'}, + {name : 'batchNumber'}, + {name : 'cssdStock'}, + {name : 'inventoryStock'} + ]; + + + + grid = new Ext.ux.ForgonPageGrid( { + pageSize : 10000, + //defaultSortField : 'externalCode', + title : '库存对比差异数据', + //defaultSortDirection : '', + isCheckboxSelectionModel : true, + rememberSelected : false, + isShowSearchField : false, + columns : columns, + renderTo : 'gridDiv', + frame : false + }, readerDetail, + DiposableGoodsTableManager.findBatchStockCompareList, + null + ); + + function initQueryValueAndReload() { + var sourceId = Ext.getCmp('comboDisposableGoods').getValue(); + $Id('parm_s_sourceId').value = sourceId; + grid.dwrReload(); + } + var form = new Ext.Panel({ + id : 'northPanel', + layout : 'table', + frame : true, + region : 'north', + border : false, + bodyBorder : false, + layoutConfig : {columns : 2}, + height : 63, + items : [{ + width :500, + layout : 'column', + items:[{ + columnWidth : .99, + layout : 'form', + labelWidth : 60, + items : [{ + fieldLabel : '关键字', + xtype : 'combo', + id : 'comboDisposableGoods', + name : 'code', + queryParam : 'spell', + minChars : 0, + valueField : 'sourceId', + displayField : 'displayName', + store : allDiposableGoodsStore, + pageSize : 100, + width : 500, + listConfig: {width: 300}, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true, + anchor : '97%', + listeners : { + select : function(combo, record, index) { + Ext.getCmp('comboDisposableGoods').setRawValue(record.data.name); + initQueryValueAndReload(); + } + } + }] + }] + },{ + width :300, + layout : 'column', + items : [{ + columnWidth : .32, + layout :'form', + items : [{ + xtype : 'button', + text : '查询', + minWidth : 70, + iconCls : 'icon_search', + handler : function() { + initQueryValueAndReload(); + } + }] + },{ + columnWidth : .32, + layout :'form', + items : [{ + xtype : 'button', + text : '重置', + minWidth : 70, + iconCls : 'icon_set', + handler : function() { + Ext.getCmp('comboDisposableGoods').setValue(""); + initQueryValueAndReload(); + } + }] + },{ + columnWidth : .36, + layout :'form', + items : [{ + xtype : 'button', + text : '导入物资库存', + minWidth : 100, + iconCls : 'icon_set', + handler : function() { + //构造文件上传的widnow及formPanel + openFileImportWindow(); + } + }] + }] + }] + }); + + var viewport = new Ext.Viewport( { + layout : 'border', + items : [form,{ + region : 'center', + margins : '0 0 0 0', + layout : 'fit', + items : grid + }] + }); +}); \ No newline at end of file Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java =================================================================== diff -u -r19154 -r20183 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java (.../GodownEntryAction.java) (revision 19154) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/GodownEntryAction.java (.../GodownEntryAction.java) (revision 20183) @@ -512,6 +512,18 @@ godownEntryManager.printSomeGodownEntryItem(items, jsonObj); StrutsResponseUtils.output(jsonObj); } + + /** + * 仅修改入库明细的物品及批次相关的基础数据,不涉及单价、金额及修改 + */ + public void modifyGodownEntryItemBaseData(){ + String items = StrutsParamUtils.getPraramValue("items", ""); + JSONObject jsonObj = new JSONObject(); + if(StringUtils.isNotBlank(items)){ + godownEntryManager.modifyGodownEntryItemBaseData(items , jsonObj); + } + StrutsResponseUtils.output(jsonObj); + } public String loadGodownEntry() { String id = StrutsParamUtils.getPraramValue("id", ""); Index: ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java =================================================================== diff -u -r19508 -r20183 --- ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java (.../ReceiveRecordManagerImpl.java) (revision 19508) +++ ssts-receiverecord/src/main/java/com/forgon/disinfectsystem/receiverecord/service/ReceiveRecordManagerImpl.java (.../ReceiveRecordManagerImpl.java) (revision 20183) @@ -56,10 +56,13 @@ import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordItemWB; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordWB; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.receiverecord.util.ReceiveRecordUtils; import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; import com.forgon.tools.Path; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.excel.ExcelCellStyle; @@ -91,6 +94,8 @@ private WareHouseManager wareHouseManager; + private LogManager appLogManager; + private Logger logger = Logger.getLogger(ReceiveRecordManagerImpl.class); public void setGoodsStockManager(GoodsStockManager goodsStockManager) { @@ -123,6 +128,10 @@ this.objectDao = objectDao; } + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + @Override public ReceiveRecord getReceiveRecordById(String id) { return (ReceiveRecord) objectDao.getBySql( @@ -456,10 +465,12 @@ + "RECEIVE_ID_" + record.getId() + ""; xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoTotalList); logger.debug("供应室领用回写参数xmlParam="+xmlParam); - String result = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); - JSONObject jsonReturn = JSONObject.fromObject(result); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "供应室领用回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "供应室领用回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); if(!jsonReturn.optBoolean("success")){ - throw new RuntimeException(jsonReturn.optString("message")); + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); } }catch(Exception e){ e.printStackTrace(); Index: ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/inventorymanagement/gdsy/dao/InventoryDaoImpl.java =================================================================== diff -u -r19508 -r20183 --- ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/inventorymanagement/gdsy/dao/InventoryDaoImpl.java (.../InventoryDaoImpl.java) (revision 19508) +++ ssts-gdsy-misc/src/main/java/com/forgon/disinfectsystem/inventorymanagement/gdsy/dao/InventoryDaoImpl.java (.../InventoryDaoImpl.java) (revision 20183) @@ -287,6 +287,7 @@ } Long batchId = transfersetJsonObject.optLong("BATCHID"); + //批次号 Object batchNumber = transfersetJsonObject.opt("ProductNo"); Object expDate = transfersetJsonObject.opt("ExpiredDate"); Object amount = transfersetJsonObject.opt("QUANTITY"); @@ -300,6 +301,10 @@ StorageEntryItem entryItem = new StorageEntryItem(); entryItem.setBatchNumber(batchNumber instanceof String ? (String)batchNumber : null); + //如果批次号为空,则默认为系统定义的空批次 + if(StringUtils.isEmpty(entryItem.getBatchNumber())){ + entryItem.setBatchNumber(WebServiceClientHelper.EMPTY_BATCHNO); + } try { entryItem.setExpDate(expDate instanceof String ? new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse((String)expDate).getTime()) : null); //生产日期对应灭菌批号 @@ -348,22 +353,26 @@ JSONArray contentJsonArray = returnInfo.optJSONArray("Content"); if(contentJsonArray != null && contentJsonArray.size() > 0){ JSONObject contentJson = contentJsonArray.getJSONObject(0); - String name = contentJson.optString("MATERIALNAME"); - String specification = contentJson.optString("MATERIALSPEC"); - String materialId = contentJson.optString("MATERIALID"); - String unit = contentJson.optString("UNIT"); + Object name = contentJson.opt("MATERIALNAME"); + Object specification = contentJson.opt("MATERIALSPEC"); + Object materialId = contentJson.opt("MATERIALID"); + Object unit = contentJson.opt("UNIT"); + Object category = contentJson.opt("MaterialTypeFlag"); + Object externalCode = contentJson.opt("MATERIALNO");//外部编码 Inventory vo = new Inventory(); - vo.setName(name); - if(StringUtils.isNotBlank(specification)){ + vo.setName(name != null && name instanceof String ? (String)name : null); + vo.setSpecification(specification != null && specification instanceof String ? (String)specification : null); + /*if(StringUtils.isNotBlank(vo.getSpecification())){ //防止规格为空返回的规格值为xml:space="preserve" - if(!specification.startsWith("xml:space")){ + if(!vo.getSpecification().startsWith("xml:space")){ vo.setSpecification(specification); } - } - vo.setUnit(unit); + }*/ + vo.setUnit(unit != null && unit instanceof String ? (String)unit : null); //vo.setCost();//暂时为空 - vo.setSerialNumber(materialId); - vo.setCategory(contentJson.optString("MaterialTypeFlag")); + vo.setSerialNumber(materialId != null && materialId instanceof String ? (String)materialId : null); + vo.setCategory(category != null && category instanceof String ? (String)category : null); + vo.setExternalCode(externalCode != null && externalCode instanceof String ? (String)externalCode : null); return vo; } } Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/constant/gdsy/ConstantDefinition.java =================================================================== diff -u --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/constant/gdsy/ConstantDefinition.java (revision 0) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/constant/gdsy/ConstantDefinition.java (revision 20183) @@ -0,0 +1,14 @@ +package com.forgon.disinfectsystem.inventorymanagement.constant.gdsy; + +/** + * 广东省医项目的常量,其它项目的常量可以创建对应的package + * @author shuyongfu + * @since 2017-09-28 + * + */ +public class ConstantDefinition { + /** + * 回写返回消息的前缀 + */ + public final static String WRITEBACK_RESULTMESSAGE_PREFIX = "物资系统:"; +}