Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r40675 -r40764 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 40675) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 40764) @@ -82,13 +82,13 @@ import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.invoicemanager.SyncFailChargeRecord; +import com.forgon.disinfectsystem.entity.invoicemanager.SyncFailChargeRecordItem; import com.forgon.disinfectsystem.entity.invoicemanager.ThirdPartyChargeRecord; import com.forgon.disinfectsystem.entity.invoicemanager.ThirdPartyChargeRecordItem; import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordItem; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsItem; -import com.forgon.disinfectsystem.entity.returngoodsrecord.ThirdPartyRefundRecord; -import com.forgon.disinfectsystem.entity.returngoodsrecord.ThirdPartyRefundRecordItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; import com.forgon.disinfectsystem.entity.stocktakerecordmanager.StockDiposableGoods; import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; @@ -98,7 +98,10 @@ import com.forgon.disinfectsystem.vo.DisposableGoodsItemUsageVo; import com.forgon.disinfectsystem.vo.PriceAmount; import com.forgon.exception.SystemException; +import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; +import com.forgon.runwithtrans.model.RunWithTransNewTask; +import com.forgon.runwithtrans.service.RunWithTransNewManager; import com.forgon.security.tools.Util; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; @@ -150,6 +153,11 @@ private DisposableGoodsSyncDao disposableGoodsSyncDao; + private RunWithTransNewManager runWithTransNewManager; + + public void setRunWithTransNewManager(RunWithTransNewManager runWithTransNewManager) { + this.runWithTransNewManager = runWithTransNewManager; + } public void setDisposableGoodsSyncDao(DisposableGoodsSyncDao disposableGoodsSyncDao) { this.disposableGoodsSyncDao = disposableGoodsSyncDao; } @@ -3694,26 +3702,43 @@ if(thirdPartyChargeRecord == null || CollectionUtils.isEmpty(thirdPartyChargeRecord.getChargeRecordItems())){ throw new RuntimeException("参数异常!"); } + + //查询物质编码及一次性物品定义的map + Map inventorySerialNumberDisposableGoodsMap = getInventorySerialNumberSyncDisposableGoodsMap(thirdPartyChargeRecord.getChargeRecordItems()); + + //查询一次性物品定义不存在的收费明细 + List dgNoExistChargeRecordItemList = new ArrayList(); for (ThirdPartyChargeRecordItem chargeRecordItem : thirdPartyChargeRecord.getChargeRecordItems()) { + if(!inventorySerialNumberDisposableGoodsMap.containsKey(chargeRecordItem.getInventorySerialNumber())){ + dgNoExistChargeRecordItemList.add(chargeRecordItem); + } + } + + //记录一次性物品定义不存在的收费明细日志 + recordThirdPartyChargeRecordSyncFailLog(thirdPartyChargeRecord, dgNoExistChargeRecordItemList); + + for (ThirdPartyChargeRecordItem chargeRecordItem : thirdPartyChargeRecord.getChargeRecordItems()) { String oldName = null; String oldSpecification = null; String oldApplicationSpecification = null; String inventorySerialNumber = chargeRecordItem.getInventorySerialNumber(); //是否修改了一次性物品定义 boolean update = true; - DisposableGoods disposableGoods = this.getDisposableGoodsByInventorySerialNumber(inventorySerialNumber); + /*DisposableGoods disposableGoods = this.getDisposableGoodsByInventorySerialNumber(inventorySerialNumber); if(disposableGoods == null){ disposableGoods = this.get(chargeRecordItem.getName(), chargeRecordItem.getSpecification()); - } + }*/ + DisposableGoods disposableGoods = inventorySerialNumberDisposableGoodsMap.get(inventorySerialNumber); if(disposableGoods == null){ update = false; - disposableGoods = new DisposableGoods(); + /*disposableGoods = new DisposableGoods(); disposableGoods.setIsPartOfTousseMaterial(DisposableGoods.CONSTANT_YES); disposableGoods.setIsApplicationMaterial(DisposableGoods.CONSTANT_YES); disposableGoods.setIsSupplyRoomGoods(Constants.STR_YES); disposableGoods.setPrintInLabel(Constants.STR_NO); disposableGoods.setExpressInvoice(Constants.STR_NO); - disposableGoods.setBatchAndExpDateAllowBlank(Constants.STR_NO); + disposableGoods.setBatchAndExpDateAllowBlank(Constants.STR_NO);*/ + throw new SystemException(String.format("%s(%s)不存在,同步失败!", chargeRecordItem.getName(), chargeRecordItem.getInventorySerialNumber())); }else{ oldName = disposableGoods.getName(); oldSpecification = disposableGoods.getSpecification(); @@ -3745,6 +3770,129 @@ } /** + * 记录一次性物品定义不存在的收费记录日志 + * @param thirdPartyChargeRecord 收费记录 + * @param dgNoExistChargeRecordItemList 一次性物品定义不存在的收费记录明细 + */ + private void recordThirdPartyChargeRecordSyncFailLog(ThirdPartyChargeRecord thirdPartyChargeRecord, List dgNoExistChargeRecordItemList) { + if(CollectionUtils.isNotEmpty(dgNoExistChargeRecordItemList)){ + StringBuffer logBuffer = new StringBuffer(); + logBuffer.append(String.format("HIS系统收费记录%s同步失败,原因为部分物品未创建一次性物品定义,相关物品为:", thirdPartyChargeRecord.getChargeRecordId())); + List goodsNameList = new ArrayList(); + for (ThirdPartyChargeRecordItem chargeRecordItem : dgNoExistChargeRecordItemList) { + goodsNameList.add(String.format("%s(物资编号:%s)", chargeRecordItem.getName(), chargeRecordItem.getInventorySerialNumber())); + } + logBuffer.append(StringTools.join(goodsNameList, "、")); + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + SyncFailChargeRecord syncFailChargeRecord = null; + @SuppressWarnings("unchecked") + List syncFailChargeRecordList = objectDao.findByProperty(SyncFailChargeRecord.class.getSimpleName(), "chargeRecordId", thirdPartyChargeRecord.getChargeRecordId()); + if(CollectionUtils.isNotEmpty(syncFailChargeRecordList)){ + syncFailChargeRecord = syncFailChargeRecordList.get(0); + } + if(syncFailChargeRecord == null){ + syncFailChargeRecord = new SyncFailChargeRecord(); + } + syncFailChargeRecord.setApplicant(thirdPartyChargeRecord.getApplicant()); + syncFailChargeRecord.setApplicantCode(thirdPartyChargeRecord.getApplicantCode()); + syncFailChargeRecord.setChargeRecordId(thirdPartyChargeRecord.getChargeRecordId()); + syncFailChargeRecord.setChargeRecordTime(thirdPartyChargeRecord.getChargeRecordTime()); + syncFailChargeRecord.setDepart(thirdPartyChargeRecord.getDepart()); + syncFailChargeRecord.setDepartCoding(thirdPartyChargeRecord.getDepartCoding()); + syncFailChargeRecord.setHandleDepart(thirdPartyChargeRecord.getHandleDepart()); + syncFailChargeRecord.setHandleDepartCoding(thirdPartyChargeRecord.getHandleDepartCoding()); + syncFailChargeRecord.setHospitalNumber(thirdPartyChargeRecord.getHospitalNumber()); + syncFailChargeRecord.setRefundRecordId(thirdPartyChargeRecord.getRefundRecordId()); + syncFailChargeRecord.setSettleAccountsDepart(thirdPartyChargeRecord.getSettleAccountsDepart()); + syncFailChargeRecord.setSettleAccountsDepartCoding(thirdPartyChargeRecord.getSettleAccountsDepartCoding()); + syncFailChargeRecord.setSyncDateTime(thirdPartyChargeRecord.getSyncDateTime()); + List dbSyncFailChargeRecordItems = syncFailChargeRecord.getSyncFailItems(); + List syncFailChargeRecordItems = new ArrayList(); + + for (ThirdPartyChargeRecordItem thirdPartyChargeRecordItem : dgNoExistChargeRecordItemList) { + SyncFailChargeRecordItem failChargeRecordItem = null; + if(CollectionUtils.isNotEmpty(dbSyncFailChargeRecordItems)){ + for (SyncFailChargeRecordItem dbItem : dbSyncFailChargeRecordItems) { + if(StringUtils.equals(thirdPartyChargeRecordItem.getInventorySerialNumber(), dbItem.getInventorySerialNumber())){ + failChargeRecordItem = dbItem; + break; + } + if(StringUtils.equals(thirdPartyChargeRecordItem.getName(), dbItem.getName()) + && StringUtils.equals(thirdPartyChargeRecordItem.getSpecification(), dbItem.getSpecification())){ + failChargeRecordItem = dbItem; + break; + } + } + if(failChargeRecordItem != null){ + dbSyncFailChargeRecordItems.remove(failChargeRecordItem); + } + } + if(failChargeRecordItem == null){ + failChargeRecordItem = new SyncFailChargeRecordItem(); + } + failChargeRecordItem.setAmount(thirdPartyChargeRecordItem.getAmount()); + failChargeRecordItem.setInventorySerialNumber(thirdPartyChargeRecordItem.getInventorySerialNumber()); + failChargeRecordItem.setName(thirdPartyChargeRecordItem.getName()); + failChargeRecordItem.setSpecification(thirdPartyChargeRecordItem.getSpecification()); + failChargeRecordItem.setUnit(thirdPartyChargeRecordItem.getUnit()); + objectDao.saveOrUpdate(failChargeRecordItem); + syncFailChargeRecordItems.add(failChargeRecordItem); + } + syncFailChargeRecord.setSyncFailItems(syncFailChargeRecordItems); + if(CollectionUtils.isNotEmpty(dbSyncFailChargeRecordItems)){ + for (SyncFailChargeRecordItem dbItem : dbSyncFailChargeRecordItems) { + objectDao.delete(dbItem); + } + } + objectDao.saveOrUpdate(syncFailChargeRecord); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SYNC, Log.TYPE_QUERY, logBuffer.toString()); + } + }); + throw new RuntimeException(logBuffer.toString()); + } + //无异常物品时,删除之前同步失败的收费明细记录 + deleteSyncFailChargeRecordItem(thirdPartyChargeRecord.getChargeRecordId()); + } + + /** + * 删除同步失败的收费明细记录 + * @param chargeRecordId 收费记录Id + */ + protected void deleteSyncFailChargeRecordItem(String chargeRecordId) { + if(StringUtils.isBlank(chargeRecordId)){ + return; + } + @SuppressWarnings("unchecked") + List syncFailChargeRecordList = objectDao.findByProperty(SyncFailChargeRecord.class.getSimpleName(), "chargeRecordId", chargeRecordId); + if(CollectionUtils.isNotEmpty(syncFailChargeRecordList)){ + for (SyncFailChargeRecord syncFailChargeRecord : syncFailChargeRecordList) { + objectDao.delete(syncFailChargeRecord); + } + } + } + + /** + * 根据收费明细的物质编码查询一次性物品定义 + * @param chargeRecordItems 收费明细 + * @return 物质编码-一次性物品定义的map + */ + private Map getInventorySerialNumberSyncDisposableGoodsMap(List chargeRecordItems) { + Map inventorySerialNumberDisposableGoodsMap = new HashMap(); + for (ThirdPartyChargeRecordItem chargeRecordItem : chargeRecordItems) { + String inventorySerialNumber = chargeRecordItem.getInventorySerialNumber(); + DisposableGoods disposableGoods = this.getDisposableGoodsByInventorySerialNumber(inventorySerialNumber); + if(disposableGoods == null){ + disposableGoods = this.get(chargeRecordItem.getName(), chargeRecordItem.getSpecification()); + } + if(disposableGoods != null){ + inventorySerialNumberDisposableGoodsMap.put(inventorySerialNumber, disposableGoods); + } + } + return inventorySerialNumberDisposableGoodsMap; + } + /** * 一次性物品定义字段校验 * @param disposableGoods 一次性物品定义 */ @@ -3762,10 +3910,10 @@ throw new SystemException(String.format("一次性物品%s的名称与规格不唯一", disposableGoods.getShowName())); } //物品类型(目前有“普通物品”和“高值耗材”两种) - if(!StringUtils.equals(disposableGoods.getGoodsType(), DisposableGoods.TYPE_DIPOSABLEGOODS) + /*if(!StringUtils.equals(disposableGoods.getGoodsType(), DisposableGoods.TYPE_DIPOSABLEGOODS) && !StringUtils.equals(disposableGoods.getGoodsType(), DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS)){ throw new SystemException(String.format("一次性物品%s的物品类型%s异常", disposableGoods.getShowName(), disposableGoods.getGoodsType())); - } + }*/ } @SuppressWarnings("unchecked") Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecord.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecord.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecord.java (revision 40764) @@ -0,0 +1,233 @@ +package com.forgon.disinfectsystem.entity.invoicemanager; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 同步失败的HIS系统提供的收费记录GZFDZL-165 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(indexes = {@Index(columnList = "chargeRecordId", name = "sftpcr_crId_index") +}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SyncFailChargeRecord { + + private Long id; + + /** + * 申请人姓名 + */ + private String applicant; + + /** + * 申请人工号 + */ + private String applicantCode; + + /** + * 申请科室名称 + */ + private String depart; + + /** + * 申请科室编码 + */ + private String departCoding; + + /** + * 结算科室名称 + */ + private String settleAccountsDepart; + + /** + * 结算科室编码 + */ + private String settleAccountsDepartCoding; + + /** + * 处理科室名称 + */ + private String handleDepart; + + /** + * 处理科室编码 + */ + private String handleDepartCoding; + + /** + * 住院号 + */ + private String hospitalNumber; + + /** + * 收费记录id + */ + private String chargeRecordId; + + /** + * 收费记录时间 + */ + private Date chargeRecordTime; + + /** + * 同步时间 + */ + private Date syncDateTime; + + /** + * 关联的退费记录id + */ + private String refundRecordId; + + /** + * 同步失败的物品明细 + */ + private List syncFailItems = new ArrayList(); + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getApplicant() { + return applicant; + } + + public void setApplicant(String applicant) { + this.applicant = applicant; + } + + public String getApplicantCode() { + return applicantCode; + } + + public void setApplicantCode(String applicantCode) { + this.applicantCode = applicantCode; + } + + public String getDepart() { + return depart; + } + + public void setDepart(String depart) { + this.depart = depart; + } + + public String getDepartCoding() { + return departCoding; + } + + public void setDepartCoding(String departCoding) { + this.departCoding = departCoding; + } + + public String getSettleAccountsDepart() { + return settleAccountsDepart; + } + + public void setSettleAccountsDepart(String settleAccountsDepart) { + this.settleAccountsDepart = settleAccountsDepart; + } + + public String getSettleAccountsDepartCoding() { + return settleAccountsDepartCoding; + } + + public void setSettleAccountsDepartCoding(String settleAccountsDepartCoding) { + this.settleAccountsDepartCoding = settleAccountsDepartCoding; + } + + public String getHandleDepart() { + return handleDepart; + } + + public void setHandleDepart(String handleDepart) { + this.handleDepart = handleDepart; + } + + public String getHandleDepartCoding() { + return handleDepartCoding; + } + + public void setHandleDepartCoding(String handleDepartCoding) { + this.handleDepartCoding = handleDepartCoding; + } + + public String getHospitalNumber() { + return hospitalNumber; + } + + public void setHospitalNumber(String hospitalNumber) { + this.hospitalNumber = hospitalNumber; + } + + public String getChargeRecordId() { + return chargeRecordId; + } + + public void setChargeRecordId(String chargeRecordId) { + this.chargeRecordId = chargeRecordId; + } + + public Date getChargeRecordTime() { + return chargeRecordTime; + } + + public void setChargeRecordTime(Date chargeRecordTime) { + this.chargeRecordTime = chargeRecordTime; + } + + public Date getSyncDateTime() { + return syncDateTime; + } + + public void setSyncDateTime(Date syncDateTime) { + this.syncDateTime = syncDateTime; + } + + public String getRefundRecordId() { + return refundRecordId; + } + + public void setRefundRecordId(String refundRecordId) { + this.refundRecordId = refundRecordId; + } + + @OneToMany(fetch = FetchType.LAZY) + @Cascade(value = { org.hibernate.annotations.CascadeType.ALL }) + @JoinColumn(name = "chargeRecord_ID") + @OrderBy("id asc") + public List getSyncFailItems() { + return syncFailItems; + } + + public void setSyncFailItems(List syncFailItems) { + this.syncFailItems = syncFailItems; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecordItem.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecordItem.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/SyncFailChargeRecordItem.java (revision 40764) @@ -0,0 +1,106 @@ +package com.forgon.disinfectsystem.entity.invoicemanager; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 同步失败的HIS系统提供的收费记录一次性物品明细GZFDZL-165 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(indexes = {@Index(columnList = "chargeRecord_ID", name = "sftpcri_crId_index") +}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class SyncFailChargeRecordItem { + + /** + * id + */ + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 规格 + */ + private String specification; + + /** + * 物资编码 + */ + private String inventorySerialNumber; + + /** + * 数量 + */ + private Integer amount; + + /** + * 单位 + */ + private String unit; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSpecification() { + return specification; + } + + public void setSpecification(String specification) { + this.specification = specification; + } + + public String getInventorySerialNumber() { + return inventorySerialNumber; + } + + public void setInventorySerialNumber(String inventorySerialNumber) { + this.inventorySerialNumber = inventorySerialNumber; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + +}