Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/ChasDisposableGoodsPushDaoImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/ChasDisposableGoodsPushDaoImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/ChasDisposableGoodsPushDaoImpl.java (revision 41625) @@ -0,0 +1,410 @@ +package com.forgon.disinfectsystem.datasynchronization.dao.gdszyy; + +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.Map.Entry; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.apache.log4j.Logger; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Node; +import org.dom4j.XPath; +import org.springframework.beans.factory.annotation.Autowired; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; +import com.forgon.disinfectsystem.inventorymanagement.dao.ChasDisposableGoodsPushDao; +import com.forgon.tools.Constants; +import com.forgon.tools.date.DateTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; + +public class ChasDisposableGoodsPushDaoImpl implements ChasDisposableGoodsPushDao { + + private Logger logger = Logger.getLogger(this.getClass()); + + @Autowired + private ObjectDao objectDao; + + @SuppressWarnings("unchecked") + @Override + public void pushInvoiceInfo(List invoiceList) { + if(CollectionUtils.isEmpty(invoiceList)){ + return; + } + for (Invoice invoice : invoiceList) { + List diposableGoodsItems = objectDao.findByProperty(DiposableGoodsItem.class.getSimpleName(), "invoice.id", invoice.getId()); + if(CollectionUtils.isEmpty(diposableGoodsItems)){ + return; + } + Map idDisposableGoodsMap = getDiposableGoodsItemDisposableGoodsMap(diposableGoodsItems); + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + if(!StringUtils.equals(diposableGoodsItem.getChasItemControlTag(), Constants.STR_YES) + || !StringUtils.equals(diposableGoodsItem.getChasOrgControlTag(), Constants.STR_YES)){ + continue; + } + String chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH; + try { + String request = buildInvoiceDiposableGoodsItemResuest(invoice, diposableGoodsItem, idDisposableGoodsMap); + logger.debug(String.format("CHAS发货信息推送接口入参:%s", request)); + String responce = doPostSoap(DatasyncConstant.CHAS_WEBSERVICE_ADDRESS, request); + //String responce = " 1 成功 ]]>"; + logger.debug(String.format("CHAS发货信息推送接口返回参数:%s", responce)); + Integer retCode = getRetCode(responce); + if(retCode != null && retCode == DatasyncConstant.RET_CODE_SUCCESS){ + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_SUCCESS; + }else{ + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL; + } + } catch (Exception e) { + e.printStackTrace(); + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL; + } + diposableGoodsItem.setChasPushResult(chasPushResult); + objectDao.saveOrUpdate(diposableGoodsItem); + } + } + } + + @Override + public void pushDiposableGoodsItemInvoiceInfo(List diposableGoodsItems) { + if(CollectionUtils.isEmpty(diposableGoodsItems)){ + return; + } + Map idDisposableGoodsMap = getDiposableGoodsItemDisposableGoodsMap(diposableGoodsItems); + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + if(!StringUtils.equals(diposableGoodsItem.getChasItemControlTag(), Constants.STR_YES) + || !StringUtils.equals(diposableGoodsItem.getChasOrgControlTag(), Constants.STR_YES)){ + continue; + } + String chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH; + try { + String request = buildInvoiceDiposableGoodsItemResuest(diposableGoodsItem.getInvoice(), diposableGoodsItem, idDisposableGoodsMap); + logger.debug(String.format("CHAS发货信息推送接口入参:%s", request)); + String responce = doPostSoap(DatasyncConstant.CHAS_WEBSERVICE_ADDRESS, request); + //String responce = " 1 成功 ]]>"; + logger.debug(String.format("CHAS发货信息推送接口返回参数:%s", responce)); + Integer retCode = getRetCode(responce); + if(retCode != null && retCode == DatasyncConstant.RET_CODE_SUCCESS){ + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_SUCCESS; + }else{ + throw new RuntimeException(String.format("批次号为%s的一次性物品%s,发货信息推送失败", diposableGoodsItem.getBatch(), diposableGoodsItem.getName())); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } + diposableGoodsItem.setChasPushResult(chasPushResult); + objectDao.saveOrUpdate(diposableGoodsItem); + } + } + + @Override + public void pushReturnGooodsInfo(ReturnGoodsRecord returnGoodsRecord, List returnDiposableGoodsItems) { + if(CollectionUtils.isEmpty(returnDiposableGoodsItems) || returnGoodsRecord == null){ + return; + } + for (DiposableGoodsItem diposableGoodsItem : returnDiposableGoodsItems) { + if(!StringUtils.equals(diposableGoodsItem.getChasItemControlTag(), Constants.STR_YES) + || !StringUtils.equals(diposableGoodsItem.getChasOrgControlTag(), Constants.STR_YES)){ + continue; + } + String chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH; + try { + pushReturnGooodsInfo_interanl(returnGoodsRecord, returnDiposableGoodsItems); + } catch (Exception e) { + e.printStackTrace(); + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL; + } + diposableGoodsItem.setChasPushResult(chasPushResult); + objectDao.saveOrUpdate(diposableGoodsItem); + } + } + + public void pushReturnGooodsInfo_interanl(ReturnGoodsRecord returnGoodsRecord, List returnDiposableGoodsItems) { + if(CollectionUtils.isEmpty(returnDiposableGoodsItems) || returnGoodsRecord == null){ + return; + } + Map idDisposableGoodsMap = getDiposableGoodsItemDisposableGoodsMap(returnDiposableGoodsItems); + for (DiposableGoodsItem diposableGoodsItem : returnDiposableGoodsItems) { + if(!StringUtils.equals(diposableGoodsItem.getChasItemControlTag(), Constants.STR_YES) + || !StringUtils.equals(diposableGoodsItem.getChasOrgControlTag(), Constants.STR_YES)){ + continue; + } + String chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH; + try { + String request = buildReturnGoodsRecordDiposableGoodsItemResuest(returnGoodsRecord, diposableGoodsItem, idDisposableGoodsMap); + logger.debug(String.format("CHAS退货信息推送接口入参:%s", request)); + String responce = doPostSoap(DatasyncConstant.CHAS_WEBSERVICE_ADDRESS, request); + //String responce = " 1 成功 ]]>"; + logger.debug(String.format("CHAS退货信息推送接口返回参数:%s", responce)); + Integer retCode = getRetCode(responce); + if(retCode != null && retCode == DatasyncConstant.RET_CODE_SUCCESS){ + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_SUCCESS; + }else{ + throw new RuntimeException(String.format("批次号%s的一次性物品%s,退货信息推送失败!", diposableGoodsItem.getBatch(), diposableGoodsItem.getName())); + } + } catch (Exception e) { + e.printStackTrace(); + chasPushResult = DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL; + throw new RuntimeException(e.getMessage()); + } + diposableGoodsItem.setChasPushResult(chasPushResult); + objectDao.saveOrUpdate(diposableGoodsItem); + } + } + + @Override + public void pushDiposableGoodsItemReturnInfo(List diposableGoodsItems) { + + if(CollectionUtils.isEmpty(diposableGoodsItems)){ + return; + } + Set returnGoodsRecordIdSet = new HashSet(); + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + Long returnGoodsRecordID = diposableGoodsItem.getReturnGoodsRecordID(); + if(DatabaseUtil.isPoIdValid(returnGoodsRecordID)){ + returnGoodsRecordIdSet.add(returnGoodsRecordID); + } + } + + if(CollectionUtils.isEmpty(returnGoodsRecordIdSet)){ + return; + } + + Map idReturnGoodsRecordMap = new HashMap(); + List returnGoodsRecordIdList = new ArrayList(); + returnGoodsRecordIdList.addAll(returnGoodsRecordIdSet); + List returnGoodsRecordList = objectDao.findByIds(ReturnGoodsRecord.class.getSimpleName(), returnGoodsRecordIdList); + if(CollectionUtils.isNotEmpty(returnGoodsRecordList)){ + for (ReturnGoodsRecord returnGoodsRecord : returnGoodsRecordList) { + idReturnGoodsRecordMap.put(returnGoodsRecord.getId(), returnGoodsRecord); + } + } + Map> returnGoodsRecordItemsMap = new HashMap>(); + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + Long returnGoodsRecordID = diposableGoodsItem.getReturnGoodsRecordID(); + ReturnGoodsRecord returnGoodsRecord = idReturnGoodsRecordMap.get(returnGoodsRecordID); + List diposableGoodsItemList = returnGoodsRecordItemsMap.get(returnGoodsRecord); + if(diposableGoodsItemList == null){ + diposableGoodsItemList = new ArrayList(); + } + diposableGoodsItemList.add(diposableGoodsItem); + returnGoodsRecordItemsMap.put(returnGoodsRecord, diposableGoodsItemList); + } + + if(MapUtils.isNotEmpty(returnGoodsRecordItemsMap)){ + for (Entry> entry : returnGoodsRecordItemsMap.entrySet()) { + ReturnGoodsRecord returnGoodsRecord = entry.getKey(); + List returnDiposableGoodsItems = entry.getValue(); + pushReturnGooodsInfo_interanl(returnGoodsRecord, returnDiposableGoodsItems); + } + } + } + + /** + * 返回一次性物品定义的map + * @param diposableGoodsItems 一次性物品明细 + * @return 一次性物品定义的map + */ + @SuppressWarnings("unchecked") + private Map getDiposableGoodsItemDisposableGoodsMap(List diposableGoodsItems) { + Map disposableGoodsMap = new HashMap(); + if(CollectionUtils.isEmpty(diposableGoodsItems)){ + return disposableGoodsMap; + } + Set disposableGoodsIdSet = new HashSet(); + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + disposableGoodsIdSet.add(diposableGoodsItem.getDisposableGoodsID()); + } + if(CollectionUtils.isEmpty(disposableGoodsIdSet)){ + return disposableGoodsMap; + } + List disposableGoodsIdList = new ArrayList(); + disposableGoodsIdList.addAll(disposableGoodsIdSet); + List disposableGoodsList = objectDao.findByIds(DisposableGoods.class.getSimpleName(), disposableGoodsIdList); + if(CollectionUtils.isEmpty(disposableGoodsList)){ + return disposableGoodsMap; + } + for (DisposableGoods disposableGoods : disposableGoodsList) { + disposableGoodsMap.put(disposableGoods.getId(), disposableGoods); + } + return disposableGoodsMap; + } + + /** + * 解析返回参数的 RetCode + * @param responce + * @return 0/1 + */ + private Integer getRetCode(String responce) { + try { + if (StringUtils.isBlank(responce)) { + throw new RuntimeException("CHAS信息推送接口返回参数为空!"); + } + int startIndex = responce.indexOf(""); + if(startIndex == -1){ + logger.info("CHAS发货信息推送接口返回参数没有标签!"); + return DatasyncConstant.RET_CODE_FAIL; + } + int endIndex = responce.indexOf(""); + if(endIndex == -1 || endIndex < startIndex){ + logger.info("CHAS信息推送接口返回参数没有标签"); + return DatasyncConstant.RET_CODE_FAIL; + } + responce = "" + responce.substring(startIndex + "".length(), endIndex) + ""; + Document document = DocumentHelper.parseText(responce); + String xpathExp = "/RetInfo/RetCode"; + XPath xpath = document.createXPath(xpathExp); + Node node = xpath.selectSingleNode(document); + if (node == null) { + return DatasyncConstant.RET_CODE_FAIL; + } + return Integer.valueOf(node.getStringValue()); + } catch (Exception e) { + e.printStackTrace(); + } + return DatasyncConstant.RET_CODE_FAIL; + } + + /** + * 构建发货请求参数 + * @param invoice 发货单 + * @param diposableGoodsItem 一次性物品发货明细 + * @param idDisposableGoodsMap 一次性物品定义map + * @return 请求参数 + */ + private String buildInvoiceDiposableGoodsItemResuest(Invoice invoice, DiposableGoodsItem diposableGoodsItem, Map idDisposableGoodsMap) { + if(diposableGoodsItem == null){ + throw new RuntimeException("diposableGoodsItem为空!"); + } + DisposableGoods disposableGoods = idDisposableGoodsMap.get(diposableGoodsItem.getDisposableGoodsID()); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("" + DatasyncConstant.ACTION + ""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("" + diposableGoodsItem.getChasChargeItemSerialNumber() + ""); + stringBuilder.append("" + DateTools.getFormatDateStr(invoice.getSendTime(), DateTools.COMMON_DATE_HMS) + ""); + stringBuilder.append("" + UUID.randomUUID().toString() + ""); + stringBuilder.append("" + DatasyncConstant.LVCM_TRANS_TYP_INVOICE + ""); + stringBuilder.append("" + diposableGoodsItem.getAmount() + ""); + stringBuilder.append("" + disposableGoods.getUnit() + ""); + stringBuilder.append("" + AcegiHelper.getLoginUser().getUserName() + ""); + stringBuilder.append("" + diposableGoodsItem.getChasDeptCode() + ""); + stringBuilder.append(""); + stringBuilder.append("" + DatasyncConstant.SYS_CD + ""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("]]>"); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + return stringBuilder.toString(); + } + + /** + * post发送消息 + * @param postUrl + * @param soapXml + * @return + */ + public static String doPostSoap(String postUrl, String soapXml) throws Exception{ + String retStr = ""; + // 创建HttpClientBuilder + HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); + // HttpClient + CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); + HttpPost httpPost = new HttpPost(postUrl); + // 设置请求和传输超时时间 + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(3000000) + .setConnectTimeout(3000000).build(); + httpPost.setConfig(requestConfig); + httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); + httpPost.setHeader("action", "ChasMessageServer"); + StringEntity data = new StringEntity(soapXml,Charset.forName("UTF-8")); + httpPost.setEntity(data); + CloseableHttpResponse response = closeableHttpClient.execute(httpPost); + HttpEntity httpEntity = response.getEntity(); + if (httpEntity != null) { + // 打印响应内容 + retStr = EntityUtils.toString(httpEntity, "UTF-8"); + retStr = retStr.replaceAll("<", "<"); + retStr = retStr.replaceAll(">", ">"); + } + // 释放资源 + closeableHttpClient.close(); + return retStr; + } + + /** + * 构建退货的请求信息 + * @param returnGoodsRecord 退货记录 + * @param diposableGoodsItem 一次性物品明细 + * @param idDisposableGoodsMap 一次性物品定义map + * @return 请求信息 + */ + private String buildReturnGoodsRecordDiposableGoodsItemResuest(ReturnGoodsRecord returnGoodsRecord, + DiposableGoodsItem diposableGoodsItem, Map idDisposableGoodsMap) { + if(diposableGoodsItem == null){ + throw new RuntimeException("diposableGoodsItem为空!"); + } + DisposableGoods disposableGoods = idDisposableGoodsMap.get(diposableGoodsItem.getDisposableGoodsID()); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("" + DatasyncConstant.ACTION + ""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("" + diposableGoodsItem.getChasChargeItemSerialNumber() + ""); + stringBuilder.append("" + DateTools.getFormatDateStr(returnGoodsRecord.getReturnTime(), DateTools.COMMON_DATE_HMS) + ""); + stringBuilder.append("" + UUID.randomUUID().toString() + ""); + stringBuilder.append("" + DatasyncConstant.LVCM_TRANS_TYP_RETURN + ""); + stringBuilder.append("" + diposableGoodsItem.getReturnedAmount() + ""); + stringBuilder.append("" + disposableGoods.getUnit() + ""); + stringBuilder.append("" + AcegiHelper.getLoginUser().getUserName() + ""); + stringBuilder.append("" + diposableGoodsItem.getChasDeptCode() + ""); + stringBuilder.append(""); + stringBuilder.append("" + DatasyncConstant.SYS_CD + ""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append("]]>"); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + stringBuilder.append(""); + return stringBuilder.toString(); + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/DiposableGoodsItem.java =================================================================== diff -u -r39250 -r41625 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/DiposableGoodsItem.java (.../DiposableGoodsItem.java) (revision 39250) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/DiposableGoodsItem.java (.../DiposableGoodsItem.java) (revision 41625) @@ -174,6 +174,53 @@ */ private String type = InvoiceItem.TYPE_APPLICATION; + /** + * “一次性物品定义”chas管控标识 + * GDSZYY-270 + */ + private String chasItemControlTag; + + /** + * “一次性物品定义”chas费用项目编码 + * 推送发货、退回信息时需要传费用项目编码 + * GDSZYY-270 + */ + private String chasChargeItemSerialNumber; + + /** + * 科室CHAS管控标识 + * 选项: “是”、“否”,默认值: “否”. + * 此标识用于标记该组织机构(科室)是否受 CHAS 系统管控 + * 通过视图接口,同步CHAS住院系统“科室管控标识”GDSZYY-270 + */ + private String chasOrgControlTag; + + /** + * CHAS管控科室编码 + * 一次性物品发货、退货时向“CHAS与低值耗材的接口”推送领用、退回信息时,需要传CHAS管控科室编码 + * 通过视图接口,同步CHAS住院系统“CHAS管控科室编码”GDSZYY-270 + */ + private String chasDeptCode; + + /** + * CHAS管控科室名称 + * 通过视图接口,同步CHAS住院系统“CHAS管控科室名称”GDSZYY-270 + */ + private String chasDeptName; + + /** + * chas推送结果 + * “成功 / 失败 / 未推送”。 + * GDSZYY-270 + */ + private String chasPushResult; + + public static final String CHAS_PUSH_RESULT_WAITE_NPUSH = "未推送"; + + public static final String CHAS_PUSH_RESULT_PUSH_SUCCESS = "成功"; + + public static final String CHAS_PUSH_RESULT_PUSH_FAIL = "失败"; + public DiposableGoodsItem() { } @@ -415,6 +462,55 @@ this.type = type; } } + + public String getChasItemControlTag() { + return chasItemControlTag; + } + + public void setChasItemControlTag(String chasItemControlTag) { + this.chasItemControlTag = chasItemControlTag; + } + + public String getChasOrgControlTag() { + return chasOrgControlTag; + } + + public void setChasOrgControlTag(String chasOrgControlTag) { + this.chasOrgControlTag = chasOrgControlTag; + } + + public String getChasChargeItemSerialNumber() { + return chasChargeItemSerialNumber; + } + + public void setChasChargeItemSerialNumber(String chasChargeItemSerialNumber) { + this.chasChargeItemSerialNumber = chasChargeItemSerialNumber; + } + + public String getChasDeptCode() { + return chasDeptCode; + } + + public void setChasDeptCode(String chasDeptCode) { + this.chasDeptCode = chasDeptCode; + } + + public String getChasDeptName() { + return chasDeptName; + } + + public void setChasDeptName(String chasDeptName) { + this.chasDeptName = chasDeptName; + } + + public String getChasPushResult() { + return chasPushResult; + } + + public void setChasPushResult(String chasPushResult) { + this.chasPushResult = chasPushResult; + } + // 校验关联信息是否正确/发货 @Transient public boolean isAssociatedInfoValidForInvoice() { Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r41525 -r41625 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 41525) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 41625) @@ -138,6 +138,7 @@ import com.forgon.disinfectsystem.expensivegoodsapplication.service.ExpensiveGoodsApplicationManager; import com.forgon.disinfectsystem.idpredicate.IDOperators; import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; +import com.forgon.disinfectsystem.inventorymanagement.dao.ChasDisposableGoodsPushDao; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoice.service.SubmitInvoiceContext; @@ -309,6 +310,9 @@ * 因为定时或自动完成灭菌时触发二级供应室自动发货时,此时并没有当前登录用户,导致查不出待发货的申请单 */ protected String currentSupplyRoomOrgUnitCode; + + @Autowired(required = false) + protected ChasDisposableGoodsPushDao chasDisposableGoodsPushDao; public void setUserManager(UserManager userManager) { this.userManager = userManager; @@ -3419,8 +3423,10 @@ submitInvoiceContext.setInvoiceMode(mode); submitInvoiceContext.setDepartCode(departCode); submitInvoiceContext.setDepart(depart); + submitInvoiceContext.setDepartObj(orgUnitManager.getByCode(departCode)); submitInvoiceContext.setSettleAccountsDepartCoding(settleAccountsDepartCoding); submitInvoiceContext.setSettleAccountsDepart(settleAccountsDepart); + submitInvoiceContext.setSettleAccountsDepartObj(orgUnitManager.getByCode(settleAccountsDepartCoding)); submitInvoiceContext.setOrgUnitCoding(orgUnitCoding); submitInvoiceContext.setAssistantSender(assistantSender); submitInvoiceContext.setSender(sender); @@ -3744,6 +3750,9 @@ //在追溯系统中进行发货保存操作时,使用SDK的API将发货的器械包信息推送至集成平台的MQ队列。XKYY-244 pushTousseInstanceAfterInvoice(submitInvoiceContext); + //推送chas管控的一次性物品发货信息GDSZYY-270 + pushChasDisposableGoodsInvoiceInfo(invoiceList); + String debugInfo = "旧版发货完成,总耗时(秒):" + ((System.currentTimeMillis() - start)/1000.0) + ",params=" + params; appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVOICE, Log.TYPE_ADD, debugInfo); logger.debug(debugInfo); @@ -3755,6 +3764,18 @@ } @Override + public void pushChasDisposableGoodsInvoiceInfo(List invoiceList) { + boolean enableChasSystemTagPush = ConfigUtils.getSystemSetConfigByNameBool("enableChasSystemTagPush"); + if(!enableChasSystemTagPush){ + return; + } + if(chasDisposableGoodsPushDao == null){ + throw new RuntimeException("chasDisposableGoodsPushDao为null,无法推送chas管控的一次性物品发货信息"); + } + chasDisposableGoodsPushDao.pushInvoiceInfo(invoiceList); + } + + @Override public void updateInvoiceSignStorageLocationId(List invoiceList, Long signStorageLocationId) { boolean enableDesignatedWarehouseReceiving = ConfigUtils.getSystemSetConfigByNameBool("enableDesignatedWarehouseReceiving"); if(!enableDesignatedWarehouseReceiving){ @@ -4101,6 +4122,9 @@ departCodeToOrgUnitMap, departCodeToDefaultSettleAccountsOrgUnitMap, departCodeToDefaultWarehouseMap, disposableGoodsStorageAdjustVoTotalList); + //推送chas管控的一次性物品发货信息GDSZYY-270 + pushChasDisposableGoodsInvoiceInfo(invoiceList); + //7.生成一次性物品发货明细项DisposableGoodsItem(涉及多少个一次性物品标识对象则对应多少个发货明细项)。 //disposableBatchCustomBatchUpdateDisposableGoodsStockTableData方法调用disposableBatchCustomBatchInsertDiposableGoodsItemTableData来实现第7步的逻辑 //性能测试用的语句 @@ -4689,7 +4713,7 @@ //批量处理仓库的库存数量(含源发货仓库、目标收货仓库的库存、批次库存、标识等) disposableBatchCustomBatchUpdateDisposableGoodsStockTableData(invoiceToInvoiceItemListMap, departCodeToDgIdToIdentificationToAmountMapMapMap, idToDisposableGoodsMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap,idToDisposableGoodsBatchStockMap, - params, departCodeToOrgUnitMap, departCodeToDefaultWarehouseMap, disposableGoodsStorageAdjustVoTotalList); + params, departCodeToOrgUnitMap, departCodeToDefaultSettleAccountsOrgUnitMap, departCodeToDefaultWarehouseMap, disposableGoodsStorageAdjustVoTotalList); } return invoiceToInvoiceItemListMap; @@ -4713,7 +4737,7 @@ Map> invoiceToInvoiceItemListMap,Map>> departCodeToDgIdToIdentificationToAmountMapMapMap, Map idToDisposableGoodsMap,Map idToDisposableGoodsStockMap, Map idToDisposableGoodsBatchMap,Map idToDisposableGoodsBatchStockMap, - JSONObject params,Map departCodeToOrgUnitMap,Map departCodeToDefaultWarehouseMap, + JSONObject params,Map departCodeToOrgUnitMap, Map departCodeToDefaultSettleAccountsOrgUnitMap, Map departCodeToDefaultWarehouseMap, List disposableGoodsStorageAdjustVoTotalList){ if(MapUtils.isNotEmpty(departCodeToDgIdToIdentificationToAmountMapMapMap)){ //根据定义id及批次定义id查找相应的库存及批次库存对象(加锁) @@ -5295,7 +5319,7 @@ //插入一次性物品业务明细数据 disposableBatchCustomBatchInsertDiposableGoodsItemTableData(invoiceToInvoiceItemListMap, entryDepart, idToDisposableGoodsMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, - sourceStockList, sourceBatchStockList, targetStockList, targetBatchStockList, targetIdentificationList, disposableGoodsStorageAdjustVoTotalList); + sourceStockList, sourceBatchStockList, targetStockList, targetBatchStockList, targetIdentificationList, disposableGoodsStorageAdjustVoTotalList, departCodeToDefaultSettleAccountsOrgUnitMap); } @@ -5443,7 +5467,8 @@ List sourceStockList,List sourceBatchStockList, List targetStockList,List targetBatchStockList, List targetIdentificationList, - List disposableGoodsStorageAdjustVoTotalList){ + List disposableGoodsStorageAdjustVoTotalList, + Map departCodeToDefaultSettleAccountsOrgUnitMap){ if(departCodeToDgIdToIdentificationToAmountMapMapEntry == null){ return; } @@ -5504,7 +5529,7 @@ } Map map = buildDiposableGoodsItemMapForNotExpensiveDisposableGoods(invoice, invoiceItem, null, identi, batch, sourceBatchIdToDisposableGoodsBatchStockMap, sourceDgIdToDisposableGoodsStockMap, - ancestorIdToIdentificationMap, identiToAmountEntry, InvoiceItem.TYPE_APPLICATION, disposableGoodsStorageAdjustVoTotalList); + ancestorIdToIdentificationMap, identiToAmountEntry, InvoiceItem.TYPE_APPLICATION, disposableGoodsStorageAdjustVoTotalList, departCodeToDefaultSettleAccountsOrgUnitMap); /* map.put("amount", identiToAmountEntry.getValue()); map.put("barcode", batch.getBarcode()); map.put("batch", batch.getBatchNumber()); @@ -5536,7 +5561,7 @@ "insert into %s(%s amount,barcode,batch,fluctuationPrice,name,price,invoice_id," + "identificationID,invoiceItemID,disposableGoodsBatchID,disposableGoodsBatchStockID," + "disposableGoodsID,disposableGoodsStockID,expensiveDisposablegoodsId,expensiveDGBarcode," - + "tousseInstanceId,type,targetIdentificationId) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + + "tousseInstanceId,type,targetIdentificationId,chasItemControlTag,chasChargeItemSerialNumber,chasOrgControlTag,chasDeptCode,chasDeptName,chasPushResult) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", DiposableGoodsItem.class.getSimpleName(),getIdColumnNameForJdbcInsert(),getIdColumnValueForJdbcInsert()); jdbcTemplate.batchUpdate(insertIntoDiposableGoodsItemBatchSql, new BatchPreparedStatementSetter() { @@ -5621,6 +5646,12 @@ }else{ ps.setNull(18, Types.BIGINT); } + ps.setString(19, (String)map.get("chasItemControlTag")); + ps.setString(20, (String)map.get("chasChargeItemSerialNumber")); + ps.setString(21, (String)map.get("chasOrgControlTag")); + ps.setString(22, (String)map.get("chasDeptCode")); + ps.setString(23, (String)map.get("chasDeptName")); + ps.setString(24, DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH); } @Override @@ -5650,7 +5681,7 @@ private Map buildDiposableGoodsItemMapForNotExpensiveDisposableGoods(Invoice invoice, InvoiceItem invoiceItem,String invoiceItemUUID, DisposableGoodsIdentification identi,DisposableGoodsBatch batch,Map sourceBatchIdToDisposableGoodsBatchStockMap, Map sourceDgIdToDisposableGoodsStockMap,Map ancestorIdToIdentificationMap, - Entry identiToAmountEntry,String invoiceItemType,List disposableGoodsStorageAdjustVoTotalList){ + Entry identiToAmountEntry,String invoiceItemType,List disposableGoodsStorageAdjustVoTotalList, Map departCodeToDefaultSettleAccountsOrgUnitMap){ Map map = new LinkedHashMap(); Long batchId = batch.getId(); Long dgId = batch.getDiposableGoods().getId(); @@ -5677,6 +5708,17 @@ } } map.put("name", batch.getDiposableGoods().getShowName()); + //chas管控相关字段GDSZYY-270 + map.put("chasItemControlTag", batch.getDiposableGoods().getControlTagCHAS()); + map.put("chasChargeItemSerialNumber", batch.getDiposableGoods().getChargeItemSerialNumber()); + if(departCodeToDefaultSettleAccountsOrgUnitMap != null){ + OrgUnit settleAccountsDepart = departCodeToDefaultSettleAccountsOrgUnitMap.get(invoice.getDepartCoding()); + if(settleAccountsDepart != null){ + map.put("chasOrgControlTag", settleAccountsDepart.getChasControlTag()); + map.put("chasDeptCode", settleAccountsDepart.getChasDeptCode()); + map.put("chasDeptName", settleAccountsDepart.getChasDeptName()); + } + } //构造回写的vo对象并添加至回写集合中 DisposableGoodsStorageAdjustVo vo = new DisposableGoodsStorageAdjustVo(); @@ -6882,9 +6924,11 @@ } String departCoding = submitInvoiceContext.getDepartCode(); String depart = submitInvoiceContext.getDepart(); + OrgUnit departObj = submitInvoiceContext.getDepartObj(); //结算科室取前端传递的参数 String settleAccountsDepart = submitInvoiceContext.getSettleAccountsDepart(); String settleAccountsDepartCoding = submitInvoiceContext.getSettleAccountsDepartCoding();// 结算科室部门编码 + OrgUnit settleAccountsDepartObj = submitInvoiceContext.getSettleAccountsDepartObj(); String applicant = null; Date applicationTime = null; Date recyclingTime = null; @@ -7108,6 +7152,27 @@ .getId()); diposableGoodsItem.setIdentificationID(identification .getId());// 标识id关联,这样可以在修改库存价格时做联动修改,jeff li + DisposableGoodsServiceContext disposableGoodsServiceContext = submitInvoiceContext + .getDisposableGoodsServiceContext(); + DisposableGoods disposableGoods = disposableGoodsServiceContext + .getIdToDisposableGoodsMap().get(disposableGoodsBatchStock.getDisposableGoodsId()); + if(disposableGoods != null){ + //“一次性物品定义”CHAS管控标识GDSZYY-270 + diposableGoodsItem.setChasItemControlTag(disposableGoods.getControlTagCHAS()); + //“一次性物品定义”CHAS管控费用项目编码GDSZYY-270 + diposableGoodsItem.setChasChargeItemSerialNumber(disposableGoods.getChargeItemSerialNumber()); + } + if(settleAccountsDepartObj != null){ + //结算科室的CHAS管控标识及CHAS科室GDSZYY-270 + diposableGoodsItem.setChasOrgControlTag(settleAccountsDepartObj.getChasControlTag()); + diposableGoodsItem.setChasDeptCode(settleAccountsDepartObj.getChasDeptCode()); + diposableGoodsItem.setChasDeptName(settleAccountsDepartObj.getChasDeptName()); + }else if(departObj != null){ + //结算科室的CHAS管控标识及CHAS科室GDSZYY-270 + diposableGoodsItem.setChasOrgControlTag(departObj.getChasControlTag()); + diposableGoodsItem.setChasDeptCode(departObj.getChasDeptCode()); + diposableGoodsItem.setChasDeptName(departObj.getChasDeptName()); + } diposableGoodsItem.setInvoice(invoice);// 和发货单关联 diposableGoodsItem .setInvoiceItemID(invoiceItem.getId());// 明细汇总关联 Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java =================================================================== diff -u -r41525 -r41625 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java (.../InvoiceManager.java) (revision 41525) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManager.java (.../InvoiceManager.java) (revision 41625) @@ -504,5 +504,11 @@ * @return 签收库位 */ public StorageLocation getInvoiceSignStorageLocation(Invoice invoice); + + /** + * 推送chas管控的一次性物品发货信息GDSZYY-270 + * @param invoiceList 发货单 + */ + public void pushChasDisposableGoodsInvoiceInfo(List invoiceList); } Index: ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/disposableGoodsChas.xml =================================================================== diff -u -r41594 -r41625 --- ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/disposableGoodsChas.xml (.../disposableGoodsChas.xml) (revision 41594) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/disposableGoodsChas.xml (.../disposableGoodsChas.xml) (revision 41625) @@ -35,5 +35,13 @@ + + + + + + + + \ No newline at end of file Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dto/ChasDisposableGoodsDto.java =================================================================== diff -u --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dto/ChasDisposableGoodsDto.java (revision 0) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/dto/ChasDisposableGoodsDto.java (revision 41625) @@ -0,0 +1,63 @@ +package com.forgon.disinfectsystem.diposablegoods.dto; + +public class ChasDisposableGoodsDto { + + /** + * 发货记录id、退货记录id + */ + private Long recordId; + + /** + * 一次性物品定义id + */ + private Long disposableGoodsId; + + /** + * 一次性物品批次号 + */ + private String batchNumber; + + /** + * 发货单/退货单 + */ + private String type; + + public static final String TYPE_INVOICE = "发货单"; + + public static final String TYPE_RETURN = "退货单"; + + public Long getRecordId() { + return recordId; + } + + public void setRecordId(Long recordId) { + this.recordId = recordId; + } + + public Long getDisposableGoodsId() { + return disposableGoodsId; + } + + public void setDisposableGoodsId(Long disposableGoodsId) { + this.disposableGoodsId = disposableGoodsId; + } + + public String getBatchNumber() { + return batchNumber; + } + + public void setBatchNumber(String batchNumber) { + this.batchNumber = batchNumber; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + +} Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java =================================================================== diff -u -r41557 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 41557) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManager.java (.../DiposableGoodsManager.java) (revision 41625) @@ -10,6 +10,7 @@ import net.sf.json.JSONObject; +import com.forgon.disinfectsystem.diposablegoods.dto.ChasDisposableGoodsDto; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; @@ -432,4 +433,10 @@ */ public void timingSyncDisposableGoodsControlTagCHAS(); + /** + * 推送一次性物品chas信息 + * @param chasDisposableGoodsDtos 一次性物品chas信息dto + */ + public void pushChasDisposableGoodsInfo(ChasDisposableGoodsDto[] chasDisposableGoodsDtos); + } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java =================================================================== diff -u -r41575 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 41575) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DiposableGoodsManagerImpl.java (.../DiposableGoodsManagerImpl.java) (revision 41625) @@ -19,6 +19,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -55,6 +56,7 @@ import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.datasynchronization.dao.DisposableGoodsSyncDao; +import com.forgon.disinfectsystem.diposablegoods.dto.ChasDisposableGoodsDto; import com.forgon.disinfectsystem.diposablegoods.util.DisposableGoodsUtils; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.assestmanagement.ConsumptiveMaterialType; @@ -89,10 +91,12 @@ 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.ReturnGoodsRecord; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; import com.forgon.disinfectsystem.entity.stocktakerecordmanager.StockDiposableGoods; import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.inventorymanagement.dao.ChasDisposableGoodsPushDao; import com.forgon.disinfectsystem.inventorymanagement.dao.DisposableGoodsChasMarkerDao; import com.forgon.disinfectsystem.inventorymanagement.dao.InventoryDao; import com.forgon.disinfectsystem.inventorymanagement.model.DisposableGoodsChasMarkerVo; @@ -160,6 +164,11 @@ private DisposableGoodsChasMarkerDao disposableGoodsChasMarkerDao; + private ChasDisposableGoodsPushDao chasDisposableGoodsPushDao; + + public void setChasDisposableGoodsPushDao(ChasDisposableGoodsPushDao chasDisposableGoodsPushDao) { + this.chasDisposableGoodsPushDao = chasDisposableGoodsPushDao; + } public void setDisposableGoodsChasMarkerDao(DisposableGoodsChasMarkerDao disposableGoodsChasMarkerDao) { this.disposableGoodsChasMarkerDao = disposableGoodsChasMarkerDao; } @@ -4161,5 +4170,101 @@ logger.debug("定时同步一次性物品定义CHAS管控标识出现异常:" + e.getMessage()); } } + @Override + public void pushChasDisposableGoodsInfo(ChasDisposableGoodsDto[] chasDisposableGoodsDtos) { + boolean enableChasSystemTagPush = ConfigUtils.getSystemSetConfigByNameBool("enableChasSystemTagPush"); + if(!enableChasSystemTagPush){ + return; + } + if(chasDisposableGoodsPushDao == null){ + throw new RuntimeException("chasDisposableGoodsPushDao为null,无法推送chas管控的一次性物品发货信息"); + } + if(chasDisposableGoodsDtos == null || chasDisposableGoodsDtos.length == 0){ + return; + } + //推送chas一次性物品发货信息 + pushInvoiceChasDisposableGoodsInfo(chasDisposableGoodsDtos); + //推送chas一次性物品退货信息 + pushReturnChasDisposableGoodsInfo(chasDisposableGoodsDtos); + } + /** + * 推送chas一次性物品退货信息 + * @param chasDisposableGoodsDtos + */ + private void pushReturnChasDisposableGoodsInfo(ChasDisposableGoodsDto[] chasDisposableGoodsDtos) { + if(chasDisposableGoodsDtos == null || chasDisposableGoodsDtos.length == 0){ + return; + } + List invoiceDiposableGoodsItemList = new ArrayList(); + for (ChasDisposableGoodsDto chasDisposableGoodsDto : chasDisposableGoodsDtos) { + if(StringUtils.equals(chasDisposableGoodsDto.getType(), ChasDisposableGoodsDto.TYPE_RETURN)){ + if(!DatabaseUtil.isPoIdValid(chasDisposableGoodsDto.getRecordId()) + || !DatabaseUtil.isPoIdValid(chasDisposableGoodsDto.getDisposableGoodsId())){ + throw new RuntimeException("参数异常"); + } + String hql = String.format("select po from %s po where po.returnGoodsRecordID = %s and po.disposableGoodsID = %s", + DiposableGoodsItem.class.getSimpleName(), + chasDisposableGoodsDto.getRecordId(), + chasDisposableGoodsDto.getDisposableGoodsId()); + List diposableGoodsItemList = objectDao.findByHql(hql); + if(CollectionUtils.isNotEmpty(diposableGoodsItemList)){ + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItemList) { + if(StringUtils.equals(diposableGoodsItem.getChasPushResult(), DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL) + || StringUtils.equals(diposableGoodsItem.getChasPushResult(), DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH)){ + if(StringUtils.isBlank(chasDisposableGoodsDto.getBatchNumber()) && StringUtils.isBlank(diposableGoodsItem.getBatch())){ + invoiceDiposableGoodsItemList.add(diposableGoodsItem); + }else if(StringUtils.equals(chasDisposableGoodsDto.getBatchNumber(), diposableGoodsItem.getBatch())){ + invoiceDiposableGoodsItemList.add(diposableGoodsItem); + } + } + } + } + } + } + + if(CollectionUtils.isEmpty(invoiceDiposableGoodsItemList)){ + return; + } + + chasDisposableGoodsPushDao.pushDiposableGoodsItemReturnInfo(invoiceDiposableGoodsItemList); + } + + /** + * 推送chas一次性物品发货信息 + * @param chasDisposableGoodsDtos + */ + private void pushInvoiceChasDisposableGoodsInfo(ChasDisposableGoodsDto[] chasDisposableGoodsDtos) { + if(chasDisposableGoodsDtos == null || chasDisposableGoodsDtos.length == 0){ + return; + } + List invoiceDiposableGoodsItemList = new ArrayList(); + for (ChasDisposableGoodsDto chasDisposableGoodsDto : chasDisposableGoodsDtos) { + if(StringUtils.equals(chasDisposableGoodsDto.getType(), ChasDisposableGoodsDto.TYPE_INVOICE)){ + if(!DatabaseUtil.isPoIdValid(chasDisposableGoodsDto.getRecordId()) + || !DatabaseUtil.isPoIdValid(chasDisposableGoodsDto.getDisposableGoodsId())){ + throw new RuntimeException("参数异常"); + } + String hql = String.format("select po from %s po where po.invoice.id = %s and po.disposableGoodsID = %s", + DiposableGoodsItem.class.getSimpleName(), + chasDisposableGoodsDto.getRecordId(), + chasDisposableGoodsDto.getDisposableGoodsId()); + List diposableGoodsItemList = objectDao.findByHql(hql); + if(CollectionUtils.isNotEmpty(diposableGoodsItemList)){ + for (DiposableGoodsItem diposableGoodsItem : diposableGoodsItemList) { + if(StringUtils.equals(diposableGoodsItem.getChasPushResult(), DiposableGoodsItem.CHAS_PUSH_RESULT_PUSH_FAIL) + || StringUtils.equals(diposableGoodsItem.getChasPushResult(), DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH)){ + if(StringUtils.isBlank(chasDisposableGoodsDto.getBatchNumber()) && StringUtils.isBlank(diposableGoodsItem.getBatch())){ + invoiceDiposableGoodsItemList.add(diposableGoodsItem); + }else if(StringUtils.equals(chasDisposableGoodsDto.getBatchNumber(), diposableGoodsItem.getBatch())){ + invoiceDiposableGoodsItemList.add(diposableGoodsItem); + } + } + } + } + } + } + chasDisposableGoodsPushDao.pushDiposableGoodsItemInvoiceInfo(invoiceDiposableGoodsItemList); + } + } Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/ChasDisposableGoodsPushDao.java =================================================================== diff -u --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/ChasDisposableGoodsPushDao.java (revision 0) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/inventorymanagement/dao/ChasDisposableGoodsPushDao.java (revision 41625) @@ -0,0 +1,40 @@ +package com.forgon.disinfectsystem.inventorymanagement.dao; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; + +/** + * CHAS管控标识一次性物品发货、退货信息推送的dao + * GDSZYY-270 + */ +public interface ChasDisposableGoodsPushDao { + + /** + * 推送CHAS管控标识一次性物品发货信息 + * @param diposableGoodsItems 一次性物品明细 + */ + public void pushInvoiceInfo(List invoiceList); + + /** + * 推送CHAS管控标识一次性物品发货信息 + * @param diposableGoodsItems 一次性物品明细 + */ + public void pushDiposableGoodsItemInvoiceInfo(List diposableGoodsItems); + + /** + * 推送CHAS管控标识一次性物品退货信息 + * @param returnGoodsRecord 退货单 + * @param returnDiposableGoodsItems 退货一次性物品明细 + */ + public void pushReturnGooodsInfo(ReturnGoodsRecord returnGoodsRecord, List returnDiposableGoodsItems); + + /** + * 推送CHAS管控标识一次性物品退货信息 + * @param diposableGoodsItems 一次性物品明细 + */ + public void pushDiposableGoodsItemReturnInfo(List diposableGoodsItems); + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java =================================================================== diff -u -r41525 -r41625 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 41525) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/invoice/service/SubmitInvoiceContext.java (.../SubmitInvoiceContext.java) (revision 41625) @@ -14,6 +14,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -69,6 +70,11 @@ * 申请科室名称 */ private String depart = ""; + + /** + * 申请科室对象 + */ + private OrgUnit departObj; /** * 结算科室编码 @@ -79,6 +85,11 @@ * 结算科室名称 */ private String settleAccountsDepart; + + /** + * 结算科室对象 + */ + private OrgUnit settleAccountsDepartObj; /** * 发货源仓库id @@ -380,6 +391,14 @@ this.depart = depart; } + public OrgUnit getDepartObj() { + return departObj; + } + + public void setDepartObj(OrgUnit departObj) { + this.departObj = departObj; + } + public String getSettleAccountsDepartCoding() { return settleAccountsDepartCoding; } @@ -396,6 +415,14 @@ this.settleAccountsDepart = settleAccountsDepart; } + public OrgUnit getSettleAccountsDepartObj() { + return settleAccountsDepartObj; + } + + public void setSettleAccountsDepartObj(OrgUnit settleAccountsDepartObj) { + this.settleAccountsDepartObj = settleAccountsDepartObj; + } + public String getSourceWarehouseId() { return sourceWarehouseId; } Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java =================================================================== diff -u -r41488 -r41625 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 41488) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/service/ReturnGoodsRecordManagerImpl.java (.../ReturnGoodsRecordManagerImpl.java) (revision 41625) @@ -79,6 +79,7 @@ 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.ChasDisposableGoodsPushDao; import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceManager; @@ -178,6 +179,9 @@ @Autowired(required=false) private SyncThirdPartyRefundRecordDao syncThirdPartyRefundRecordDao; + @Autowired(required=false) + private ChasDisposableGoodsPushDao chasDisposableGoodsPushDao; + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { this.dateQueryAdapter = dateQueryAdapter; } @@ -487,6 +491,16 @@ throw new RuntimeException("关联信息不正确!"); } returnDiposableGoodsItem.setReturnedAmount(curAmountCanReturn); + //退货物品和发货物品的chas信息保持一致GDSZYY-270 + returnDiposableGoodsItem.setChasItemControlTag(sendOutDiposableGoodsItem.getChasItemControlTag()); + returnDiposableGoodsItem.setChasChargeItemSerialNumber(sendOutDiposableGoodsItem.getChasChargeItemSerialNumber()); + returnDiposableGoodsItem.setChasOrgControlTag(sendOutDiposableGoodsItem.getChasOrgControlTag()); + returnDiposableGoodsItem.setChasDeptCode(sendOutDiposableGoodsItem.getChasDeptCode()); + returnDiposableGoodsItem.setChasDeptName(sendOutDiposableGoodsItem.getChasDeptName()); + if(StringUtils.equals(sendOutDiposableGoodsItem.getChasItemControlTag(), Constants.STR_YES) + && StringUtils.equals(sendOutDiposableGoodsItem.getChasOrgControlTag(), Constants.STR_YES)){ + returnDiposableGoodsItem.setChasPushResult(DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH); + } objectDao.update(sendOutDiposableGoodsItem); returnDiposableGoodsItems.add(returnDiposableGoodsItem); @@ -1041,6 +1055,10 @@ throw new RuntimeException(e); } } + + //推送chas管控的一次性物品退货信息GDSZYY-270 + pushChasDisposableGoodsReturnGoodsInfo(returnGoodsRecord, returnDiposableGoodsItems); + returnMsg.put("success", true); returnMsg.put("zeroStockBatch", convertToPrintInfo(zeroStockBatch)); if(true){ @@ -1049,6 +1067,23 @@ } return returnMsg; } + + /** + * 推送chas管控的一次性物品退货信息GDSZYY-270 + * @param returnGoodsRecord 退货记录 + * @param returnDiposableGoodsItems 退货一次性物品明细 + */ + private void pushChasDisposableGoodsReturnGoodsInfo(ReturnGoodsRecord returnGoodsRecord, List returnDiposableGoodsItems) { + boolean enableChasSystemTagPush = ConfigUtils.getSystemSetConfigByNameBool("enableChasSystemTagPush"); + if(!enableChasSystemTagPush){ + return; + } + if(chasDisposableGoodsPushDao == null){ + throw new RuntimeException("chasDisposableGoodsPushDao为null,无法推送chas管控的一次性物品退货信息"); + } + chasDisposableGoodsPushDao.pushReturnGooodsInfo(returnGoodsRecord, returnDiposableGoodsItems); + } + @Override public JsonObject checkAndSaveForReturnTousse( ReturnGoodsRecord returnGoodsRecord) { Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/controller/DisposableGoodsController.java =================================================================== diff -u -r39660 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/controller/DisposableGoodsController.java (.../DisposableGoodsController.java) (revision 39660) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/controller/DisposableGoodsController.java (.../DisposableGoodsController.java) (revision 41625) @@ -10,12 +10,14 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import com.forgon.disinfectsystem.diposablegoods.dto.ChasDisposableGoodsDto; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.vo.DisposableGoodsItemUsageVo; @@ -90,5 +92,22 @@ } return result.toString(); } + + /** + * chas重推 + * @param chasDisposableGoodsDtos 入参dto + * @return 处理结果 + */ + @RequestMapping(value = "/pushChasDisposableGoodsInfo") + public String pushChasDisposableGoodsInfo(@RequestBody ChasDisposableGoodsDto[] chasDisposableGoodsDtos){ + JSONObject result = JSONUtil.buildJsonObject(true, "推送成功"); + try { + diposableGoodsManager.pushChasDisposableGoodsInfo(chasDisposableGoodsDtos); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "推送失败," + e.getMessage()); + } + return result.toString(); + } } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManager.java =================================================================== diff -u -r30434 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManager.java (.../DisposableGoodsStorageRecordManager.java) (revision 30434) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManager.java (.../DisposableGoodsStorageRecordManager.java) (revision 41625) @@ -34,7 +34,7 @@ public JSONObject getStorageRecordBySearchModel(String disposableGoodsId, String disposableGoodsName, String startDate, String endDate, String diposableGoodsType, String departCoding, String settleAccountsDepartCoding, - String invoiceDepartmentId, String searchModel); + String invoiceDepartmentId, String searchModel, String chasItemControlTag, String chasOrgControlTag, String chasPushResult); /** * 导出一次性物品出入库记录 @@ -53,5 +53,5 @@ String diposableGoodsName, String startDate, String endDate, String diposableGoodsType, String departCoding, String settleAccountsDepartCoding, String invoiceDepartmentId, - String searchModel, ServletOutputStream outputStream); + String searchModel, String chasItemControlTag, String chasOrgControlTag, String chasPushResult, ServletOutputStream outputStream); } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java =================================================================== diff -u -r41525 -r41625 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41525) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceOptimizeManagerImpl.java (.../InvoiceOptimizeManagerImpl.java) (revision 41625) @@ -796,6 +796,8 @@ pushTousseInstanceAfterInvoice(context); //设置发货单指定的签收库位ID ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 this.updateInvoiceSignStorageLocationId(invoiceList, context.getSignStorageLocationId()); + //推送chas管控的一次性物品发货信息GDSZYY-270 + this.pushChasDisposableGoodsInvoiceInfo(invoiceList); return context; } /* @@ -1199,6 +1201,8 @@ pushTousseInstanceAfterInvoice(context); //设置发货单指定的签收库位ID ZSYKEQ-23【PC】【PDA】【物品签收】新增指定库房(库位)入库签收功能 this.updateInvoiceSignStorageLocationId(invoiceList, context.getSignStorageLocationId()); + //推送chas管控的一次性物品发货信息GDSZYY-270 + this.pushChasDisposableGoodsInvoiceInfo(invoiceList); //标识牌实例数据处理及推送发货数据至第三方平台完成后的毫秒数 long start10 = System.currentTimeMillis(); StringBuffer debugInfo = new StringBuffer("新版发货业务处理完成,总耗时(秒):"); @@ -6296,7 +6300,7 @@ "insert into %s(%s amount,barcode,batch,fluctuationPrice,name,price,invoice_id," + "identificationID,invoiceItemID,disposableGoodsBatchID,disposableGoodsBatchStockID," + "disposableGoodsID,disposableGoodsStockID,expensiveDisposablegoodsId,expensiveDGBarcode," - + "tousseInstanceId,type,targetIdentificationId) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + + "tousseInstanceId,type,targetIdentificationId,chasItemControlTag,chasChargeItemSerialNumber,chasOrgControlTag,chasDeptCode,chasDeptName,chasPushResult) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", DiposableGoodsItem.class.getSimpleName(),idColumnName,idColumnValue); jdbcTemplate.batchUpdate(insertIntoDiposableGoodsItemBatchSql, new BatchPreparedStatementSetter() { @@ -6381,6 +6385,12 @@ }else{ ps.setNull(18, Types.BIGINT); } + ps.setString(19, (String)map.get("chasItemControlTag")); + ps.setString(20, (String)map.get("chasChargeItemSerialNumber")); + ps.setString(21, (String)map.get("chasOrgControlTag")); + ps.setString(22, (String)map.get("chasDeptCode")); + ps.setString(23, (String)map.get("chasDeptName")); + ps.setString(24, DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH); } @Override @@ -6484,6 +6494,15 @@ } } map.put("name", batch.getDiposableGoods().getShowName()); + //chas管控相关字段GDSZYY-270 + map.put("chasItemControlTag", batch.getDiposableGoods().getControlTagCHAS()); + map.put("chasChargeItemSerialNumber", batch.getDiposableGoods().getChargeItemSerialNumber()); + OrgUnit settleAccountsDepart = orgUnitManager.getByCode(invoice.getSettleAccountsDepartCoding()); + if(settleAccountsDepart != null){ + map.put("chasOrgControlTag", settleAccountsDepart.getChasControlTag()); + map.put("chasDeptCode", settleAccountsDepart.getChasDeptCode()); + map.put("chasDeptName", settleAccountsDepart.getChasDeptName()); + } //构造回写的vo对象并添加至回写集合中 DisposableGoodsStorageAdjustVo vo = new DisposableGoodsStorageAdjustVo(); @@ -8617,7 +8636,7 @@ "insert into %s(%s amount,barcode,batch,fluctuationPrice,name,price,invoice_id," + "identificationID,invoiceItemID,disposableGoodsBatchID,disposableGoodsBatchStockID," + "disposableGoodsID,disposableGoodsStockID,expensiveDisposablegoodsId,expensiveDGBarcode," - + "tousseInstanceId,type,targetIdentificationId) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + + "tousseInstanceId,type,targetIdentificationId,chasItemControlTag,chasChargeItemSerialNumber,chasOrgControlTag,chasDeptCode,chasDeptName,chasPushResult) values (%s ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", DiposableGoodsItem.class.getSimpleName(),idColumnName,idColumnValue); jdbcTemplate.batchUpdate(insertIntoDiposableGoodsItemBatchSql, new BatchPreparedStatementSetter() { @@ -8706,6 +8725,12 @@ }else{ ps.setNull(18, Types.BIGINT); } + ps.setString(19, (String)map.get("chasItemControlTag")); + ps.setString(20, (String)map.get("chasChargeItemSerialNumber")); + ps.setString(21, (String)map.get("chasOrgControlTag")); + ps.setString(22, (String)map.get("chasDeptCode")); + ps.setString(23, (String)map.get("chasDeptName")); + ps.setString(24, DiposableGoodsItem.CHAS_PUSH_RESULT_WAITE_NPUSH); } @Override Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java =================================================================== diff -u -r41557 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 41557) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/action/DiposableGoodsAction.java (.../DiposableGoodsAction.java) (revision 41625) @@ -1568,11 +1568,18 @@ String invoiceDepartmentId = StrutsParamUtils.getPraramValue("invoiceDepartmentId", null); //查询方式 String searchModel = StrutsParamUtils.getPraramValue("searchModel", null); + //chas标记物品 + String chasItemControlTag = StrutsParamUtils.getPraramValue("chasItemControlTag", null); + //chas标记科室 + String chasOrgControlTag = StrutsParamUtils.getPraramValue("chasOrgControlTag", null); + //chas推送结果 + String chasPushResult = StrutsParamUtils.getPraramValue("chasPushResult", null); JSONObject jsonObject = new JSONObject(); if(StringUtils.isNotBlank(searchModel)){ jsonObject = disposableGoodsStorageRecordManager.getStorageRecordBySearchModel( - disposableGoodsId, diposableGoodsName,startDate,endDate,diposableGoodsType,departCoding,settleAccountsDepartCoding,invoiceDepartmentId,searchModel); + disposableGoodsId, diposableGoodsName,startDate,endDate,diposableGoodsType,departCoding,settleAccountsDepartCoding,invoiceDepartmentId,searchModel, + chasItemControlTag, chasOrgControlTag, chasPushResult); }else{ jsonObject = disposableGoodsStorageRecordManager.getStorageRecord( disposableGoodsId,startDate,endDate); @@ -1609,10 +1616,17 @@ String invoiceDepartmentId = StrutsParamUtils.getPraramValue("invoiceDepartmentId", null); //查询方式 String searchModel = StrutsParamUtils.getPraramValue("searchModel", null); + //chas标记物品 + String chasItemControlTag = StrutsParamUtils.getPraramValue("chasItemControlTag", null); + //chas标记科室 + String chasOrgControlTag = StrutsParamUtils.getPraramValue("chasOrgControlTag", null); + //chas推送结果 + String chasPushResult = StrutsParamUtils.getPraramValue("chasPushResult", null); disposableGoodsStorageRecordManager.exportDisposableGoodsStorageRecord(disposableGoodsId, diposableGoodsName, startDate, endDate, diposableGoodsType, departCoding, settleAccountsDepartCoding, invoiceDepartmentId, searchModel, + chasItemControlTag, chasOrgControlTag, chasPushResult, response.getOutputStream()); servletOutputStream.flush(); } catch (Exception e) { Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java =================================================================== diff -u -r33284 -r41625 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 33284) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/datasynchronization/dao/gdszyy/DatasyncConstant.java (.../DatasyncConstant.java) (revision 41625) @@ -52,4 +52,42 @@ * 请求成功的提示信息: 成功 */ public static String Result_Success = "成功"; + + /** + * “CHAS与低值耗材的接口” + * GDSZYY-270 + */ + public static final String CHAS_WEBSERVICE_ADDRESS = "http://192.168.198.156:9005/ktin/api/webservice/ChasWebService"; + + /** + * 系统标识 + * GDSZYY-270 + */ + public static final String SYS_CD = "DX"; + + /** + * action + */ + public static final String ACTION = "flow-lvcm-OperStoreItem"; + + /** + * 操作类型:LVCM.RECEIVE.0000 领用 + */ + public static final String LVCM_TRANS_TYP_INVOICE = "LVCM.RECEIVE.0000"; + + /** + * 操作类型:LVCM.RETURN.0000 退回 + */ + public static final String LVCM_TRANS_TYP_RETURN = "LVCM.RETURN.0000"; + + /** + * 返回消息编码,0为成功1为失败 + */ + public static final Integer RET_CODE_SUCCESS = 0; + + /** + * 返回消息编码,0为成功1为失败 + */ + public static final Integer RET_CODE_FAIL = 1; + } Index: ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManagerImpl.java =================================================================== diff -u -r37562 -r41625 --- ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManagerImpl.java (.../DisposableGoodsStorageRecordManagerImpl.java) (revision 37562) +++ ssts-diposablegoods/src/main/java/com/forgon/disinfectsystem/diposablegoods/service/DisposableGoodsStorageRecordManagerImpl.java (.../DisposableGoodsStorageRecordManagerImpl.java) (revision 41625) @@ -34,6 +34,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceDepartment; import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; import com.forgon.disinfectsystem.entity.packing.PackingRecord; @@ -259,7 +260,7 @@ public JSONObject getStorageRecordBySearchModel(String disposableGoodsId, String disposableGoodsName, String startDate, String endDate, String diposableGoodsType, String departCoding, String settleAccountsDepartCoding, - String invoiceDepartmentId, String searchModel) { + String invoiceDepartmentId, String searchModel, String chasItemControlTag, String chasOrgControlTag, String chasPushResult) { JSONObject jsonObject = new JSONObject(); JSONArray jsonArray = new JSONArray(); boolean success = true; @@ -300,7 +301,7 @@ StringBuilder sb = new StringBuilder(); if(StringUtils.equals(searchModel, "明细查询")){ - sb = getStorageRecordSearchSqlByDetailModel(disposableGoodsIdList, startDate, endDate, departCodeList, settleAccountsDepartCoding); + sb = getStorageRecordSearchSqlByDetailModel(disposableGoodsIdList, startDate, endDate, departCodeList, settleAccountsDepartCoding, chasItemControlTag, chasOrgControlTag, chasPushResult); jsonArray = getStorageRecordByDetailModel(sb); }else{ sb = getStorageRecordSearchSqlByTotalModel(disposableGoodsIdList, startDate, endDate, departCodeList, settleAccountsDepartCoding); @@ -415,6 +416,8 @@ JSONArray jsonArray = new JSONArray(); ResultSet resultSet = null; int moneyDigitCount = CssdUtils.getSystemSetConfigByNameInt("moneyDigitCount", 4); + // “一次性物品出入库记录”列表CHAS标记列扩展GDSZYY-270 + boolean enableChasSystemTagPush = ConfigUtils.getSystemSetConfigByNameBool("enableChasSystemTagPush"); try { resultSet = objectDao.executeSql(sb.toString()); while (resultSet.next()) { @@ -473,6 +476,13 @@ item.put("displayName", displayName); item.put("externalCode", resultSet.getString("externalCode")); item.put("inventorySerialNumber", resultSet.getString("inventorySerialNumber")); + if(enableChasSystemTagPush){ + item.put("chasItemControlTag", StringUtils.defaultString(resultSet.getString("chasItemControlTag"))); + item.put("chasOrgControlTag", StringUtils.defaultString(resultSet.getString("chasOrgControlTag"))); + item.put("chasPushResult", StringUtils.defaultString(resultSet.getString("chasPushResult"))); + } + item.put("recordId", resultSet.getLong("recordId")); + item.put("disposableGoodsID", resultSet.getLong("disposableGoodsID")); jsonArray.add(item); } @@ -628,8 +638,26 @@ * @param settleAccountsDepartCoding * @return */ - private StringBuilder getStorageRecordSearchSqlByDetailModel(List disposableGoodsIdList, String startDate, String endDate, List departCodeList, String settleAccountsDepartCoding) { + private StringBuilder getStorageRecordSearchSqlByDetailModel(List disposableGoodsIdList, String startDate, String endDate, List departCodeList, String settleAccountsDepartCoding, String chasItemControlTag, String chasOrgControlTag, String chasPushResult) { StringBuilder sb = new StringBuilder(); + //chas标识相关的字段查询 + String defaultChasSql = ""; + String chasSql = ""; + String chasFilterSql = ""; + boolean enableChasSystemTagPush = ConfigUtils.getSystemSetConfigByNameBool("enableChasSystemTagPush"); + if(enableChasSystemTagPush){ + defaultChasSql = ", '' chasItemControlTag, '' chasOrgControlTag, '' chasPushResult "; + chasSql = ", chasItemControlTag, chasOrgControlTag, chasPushResult "; + if(StringUtils.isNotBlank(chasItemControlTag)){ + chasFilterSql += " and chasItemControlTag = '" + chasItemControlTag + "' "; + } + if(StringUtils.isNotBlank(chasOrgControlTag)){ + chasFilterSql += " and chasOrgControlTag = '" + chasOrgControlTag + "' "; + } + if(StringUtils.isNotBlank(chasPushResult)){ + chasFilterSql += " and chasPushResult = '" + chasPushResult + "' "; + } + } Set warehosueIds = wareHouseManager.getCurrentUserOrgUnitWarehouseIds(); sb.append("select * from ( "); if(CollectionUtils.isEmpty(departCodeList) && StringUtils.isBlank(settleAccountsDepartCoding)){ @@ -646,8 +674,9 @@ + " group by gei.disposableGoodsID,gei.cost,ge.id,dgbs.batchNumber"; //入库单 - sb.append("select atp.batchNumber as batchNumber, ge.operator,isn.serialNumber,ge.time,isn.type,ge.subType,ge.warehouseName, "); + sb.append("select ge.id as recordId, dg.id as disposableGoodsID, atp.batchNumber as batchNumber, ge.operator,isn.serialNumber,ge.time,isn.type,ge.subType,ge.warehouseName, "); sb.append("atp.amount,atp.price,atp.totalPrice as totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, '' as depart, '' as settleAccountsDepart "); + sb.append(defaultChasSql); sb.append(" from GodownEntry ge inner join " + godownEntryIdSerialNumber + " isn on ge.id = isn.id"); sb.append(" inner join ("+godownEntryItemSummarySql+") atp"); sb.append(" on atp.entryId = ge.id "); @@ -665,24 +694,25 @@ sb.append(" union all "); //发货记录 - sb.append(" select idtp.batchNumber as batchNumber, i.sender as operator,i.serialNumber,i.sendTime as time,'发货单' as type,'发货出库' as subType,i.sourceWarehouseName as warehouseName," ); + sb.append(" select i.id as recordId, dg.id as disposableGoodsID, idtp.batchNumber as batchNumber, i.sender as operator,i.serialNumber,i.sendTime as time,'发货单' as type,'发货出库' as subType,i.sourceWarehouseName as warehouseName," ); sb.append("idtp.amount, null as price,idtp.totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, i.depart as depart, i.settleAccountsDepart as settleAccountsDepart "); + sb.append(chasSql); sb.append(" from Invoice i "); sb.append(" inner join ( "); - sb.append(" select dgbs.disposableGoodsId,dgbs.batchNumber, ii.invoice_id,sum(dgi.amount) as amount,sum(dgi.amount*dgi.price) as totalPrice from " - + InvoiceItem.class.getSimpleName() + " ii inner join " - + DiposableGoodsItem.class.getSimpleName()+ " dgi on ii.id = dgi.invoiceItemID " - + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id = dgi.disposableGoodsBatchStockID"); - sb.append(" group by dgbs.disposableGoodsId, dgbs.batchNumber, ii.invoice_id) idtp"); - sb.append(" on i.id = idtp.invoice_id "); - sb.append(" inner join DisposableGoods dg on dg.id = idtp.disposableGoodsId where "); + sb.append(" select dgbs.disposableGoodsId,dgbs.batchNumber, i.id invoice_id,sum(dgi.amount) as amount,sum(dgi.amount*dgi.price) as totalPrice " + chasSql + " from " + + Invoice.class.getSimpleName() + " i inner join " + + DiposableGoodsItem.class.getSimpleName()+ " dgi on i.id = dgi.invoice_id " + + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id = dgi.disposableGoodsBatchStockID where "); sb.append(dateQueryAdapter.dateAreaSql("i.sendTime", startDate, endDate, true, true)); if(CollectionUtils.isNotEmpty(disposableGoodsIdList)){ sb.append(" and "); sb.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("dg.id", disposableGoodsIdList)); } sb.append(" and "); sb.append(SqlBuilder.build_number_IN_Statement("i.sourceWarehouseId", SqlBuilder.IN, warehosueIds)); + sb.append(" group by i.id, dgbs.disposableGoodsId, dgbs.batchNumber " + chasSql + " ) idtp"); + sb.append(" on i.id = idtp.invoice_id "); + sb.append(" inner join DisposableGoods dg on dg.id = idtp.disposableGoodsId "); /*if(CollectionUtils.isNotEmpty(departCodeList)){ sb.append(" and "); @@ -696,22 +726,25 @@ sb.append(" union all "); //退货记录 - sb.append(" select mt.batchNumber as batchNumber, rgr.operator,'' as serialNumber,rgr.returnTime as time,'退货单' as type,'退货入库' as subType,rgr.warehouseName as warehouseName,"); + sb.append(" select rgr.id as recordId, dg.id as disposableGoodsID, mt.batchNumber as batchNumber, rgr.operator,'' as serialNumber,rgr.returnTime as time,'退货单' as type,'退货入库' as subType,rgr.warehouseName as warehouseName,"); sb.append(" mt.amount,null as price,mt.totalPrice as totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, rgr.depart as depart, rgr.settleAccountsDepart as settleAccountsDepart "); + sb.append(chasSql); sb.append(" from ReturnGoodsRecord rgr inner join"); - sb.append(" (select dgbs.batchNumber, rgr.id as recordId,rgi.disposableGoodsID as disposableGoodsId, sum(rgi.amount) as amount,sum(rgi.amount*rgi.price) as totalPrice from " + sb.append(" (select dgbs.batchNumber, rgr.id as recordId,dgi.disposableGoodsId as disposableGoodsId, sum(dgi.returnedAmount) as amount,sum(dgi.returnedAmount*dgi.price) as totalPrice " + chasSql + " from " + ReturnGoodsRecord.class.getSimpleName()+ " rgr inner join " - + ReturnGoodsItem.class.getSimpleName() + " rgi on rgi.returnGoodsRecord_ID = rgr.id" - + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() - + " dgbs on dgbs.id=rgi.disposableGoodsBatchStockID" +" group by dgbs.batchNumber,rgi.disposableGoodsID,rgr.id) mt "); - sb.append(" on mt.recordId = rgr.id "); - sb.append(" inner join DisposableGoods dg on mt.disposableGoodsID = dg.id"); + + DiposableGoodsItem.class.getSimpleName() + " dgi on dgi.returnGoodsRecordID = rgr.id"); + sb.append(" inner join DisposableGoodsBatchStock dgbs on dgbs.id=dgi.disposableGoodsBatchStockID where "); + sb.append(dateQueryAdapter.dateAreaSql("rgr.returnTime", startDate, endDate, true, true)); if(CollectionUtils.isNotEmpty(disposableGoodsIdList)){ sb.append(" and"); - sb.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("dg.id", disposableGoodsIdList)); + sb.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("dgi.disposableGoodsId", disposableGoodsIdList)); } - sb.append(" where "); + sb.append(" and "); sb.append(SqlBuilder.build_number_IN_Statement("rgr.warehouseID", SqlBuilder.IN, warehosueIds)); + sb.append(" group by dgbs.batchNumber,dgi.disposableGoodsID,rgr.id " + chasSql + ") mt "); + sb.append(" on mt.recordId = rgr.id "); + sb.append(" inner join DisposableGoods dg on mt.disposableGoodsID = dg.id"); + /*if(CollectionUtils.isNotEmpty(departCodeList)){ sb.append(" and "); sb.append(SqlUtils.getStringFieldInLargeCollectionsPredicate("rgr.departCoding", departCodeList)); @@ -723,8 +756,9 @@ sb.append(" union all "); //装配扣减 - sb.append(" select dgbs.batchNumber as batchNumber, pr.packer as operator,'' as serialNumber,pr.packTime as time,'装配扣减' as type,'装配出库' as subType,dgbs.warehouseName as warehouseName," ); + sb.append(" select pr.id as recordId, dg.id as disposableGoodsID, dgbs.batchNumber as batchNumber, pr.packer as operator,'' as serialNumber,pr.packTime as time,'装配扣减' as type,'装配出库' as subType,dgbs.warehouseName as warehouseName," ); sb.append(" dgi.amount, dgi.price as price,(dgi.amount*dgi.price) as totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, '' as depart, '' as settleAccountsDepart "); + sb.append(defaultChasSql); sb.append(" from " + PackingRecord.class.getSimpleName() + " pr "); sb.append(" inner join " + DiposableGoodsItem.class.getSimpleName() + " dgi on pr.id=dgi.packingRecordId"); sb.append(" inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgi.disposableGoodsBatchStockID=dgbs.id"); @@ -741,8 +775,9 @@ sb.append(" union all "); //供应室领用 - sb.append(" select dgbs.batchNumber as batchNumber,rr.operator as operator,'' as serialNumber,rr.time as time,'供应室领用' as type,'' as subType,dgbs.warehouseName as warehouseName,"); + sb.append(" select rr.id as recordId, dg.id as disposableGoodsID, dgbs.batchNumber as batchNumber,rr.operator as operator,'' as serialNumber,rr.time as time,'供应室领用' as type,'' as subType,dgbs.warehouseName as warehouseName,"); sb.append(" rri.amount,rri.price as price,(rri.amount*rri.price) as totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, '' as depart, '' as settleAccountsDepart"); + sb.append(defaultChasSql); sb.append(" from " + ReceiveRecordItem.class.getSimpleName() + " rri "); sb.append(" inner join " + ReceiveRecord.class.getSimpleName() + " rr on rr.id = rri.receiveRecord_id"); sb.append(" inner join " + DisposableGoods.class.getSimpleName() + " dg on dg.id = rri.disposableGoodsId"); @@ -760,17 +795,14 @@ }else{ // 查询条件的申请科室、结算科室、发货科室分组必须均为空的情况下,才查入库单,否则查询出库单(发货单)。 //发货记录 - sb.append(" select idtp.batchNumber as batchNumber, i.sender as operator,i.serialNumber,i.sendTime as time,'发货单' as type,'发货出库' as subType,i.sourceWarehouseName as warehouseName," ); - sb.append("idtp.amount, null as price,idtp.totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, i.depart as depart, i.settleAccountsDepart as settleAccountsDepart "); + sb.append(" select i.id as recordId, dg.id as disposableGoodsID, idtp.batchNumber as batchNumber, i.sender as operator,i.serialNumber,i.sendTime as time,'发货单' as type,'发货出库' as subType,i.sourceWarehouseName as warehouseName," ); + sb.append("idtp.amount, null as price,idtp.totalPrice,dg.name,dg.specification, dg.externalCode, dg.inventorySerialNumber, i.depart as depart, i.settleAccountsDepart as settleAccountsDepart" + chasSql + " "); sb.append(" from Invoice i "); - sb.append(" inner join ( "); - sb.append(" select dgbs.disposableGoodsId,dgbs.batchNumber, ii.invoice_id,sum(dgi.amount) as amount,sum(dgi.amount*dgi.price) as totalPrice from " - + InvoiceItem.class.getSimpleName() + " ii inner join " - + DiposableGoodsItem.class.getSimpleName()+ " dgi on ii.id = dgi.invoiceItemID " - + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id = dgi.disposableGoodsBatchStockID"); - sb.append(" group by dgbs.disposableGoodsId, dgbs.batchNumber, ii.invoice_id) idtp"); - sb.append(" on i.id = idtp.invoice_id "); - sb.append(" inner join DisposableGoods dg on dg.id = idtp.disposableGoodsId where "); + sb.append(" inner join ("); + sb.append(" select dgbs.disposableGoodsId, dgbs.batchNumber, i.id invoice_id, sum(dgi.amount) as amount,sum(dgi.amount*dgi.price) as totalPrice " + chasSql + " from " + + Invoice.class.getSimpleName() + " i inner join " + + DiposableGoodsItem.class.getSimpleName()+ " dgi on i.id = dgi.invoice_id " + + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id = dgi.disposableGoodsBatchStockID where "); sb.append(dateQueryAdapter.dateAreaSql("i.sendTime", startDate, endDate, true, true)); if(CollectionUtils.isNotEmpty(disposableGoodsIdList)){ sb.append(" and "); @@ -786,11 +818,15 @@ if(StringUtils.isNotBlank(settleAccountsDepartCoding)){ sb.append(" and i.settleAccountsDepartCoding = '" + settleAccountsDepartCoding + "'"); } + sb.append(" group by i.id, dgbs.disposableGoodsId, dgbs.batchNumber" + chasSql + ") idtp"); + sb.append(" on i.id = idtp.invoice_id "); + sb.append(" inner join DisposableGoods dg on dg.id = idtp.disposableGoodsId"); } sb.append(" ) md "); sb.append(" where "); sb.append(dateQueryAdapter.dateAreaSql("time", startDate, endDate, true, true)); + sb.append(chasFilterSql); sb.append(" order by time "); System.out.println(sb.toString()); return sb; @@ -801,10 +837,10 @@ String disposableGoodsName, String startDate, String endDate, String diposableGoodsType, String departCoding, String settleAccountsDepartCoding, String invoiceDepartmentId, - String searchModel, ServletOutputStream outputStream) { + String searchModel, String chasItemControlTag, String chasOrgControlTag, String chasPushResult, ServletOutputStream outputStream) { JSONObject result = new JSONObject(); if(StringUtils.isNotBlank(searchModel)){ - result = this.getStorageRecordBySearchModel(disposableGoodsId, disposableGoodsName, startDate, endDate, diposableGoodsType, departCoding, settleAccountsDepartCoding, invoiceDepartmentId, searchModel); + result = this.getStorageRecordBySearchModel(disposableGoodsId, disposableGoodsName, startDate, endDate, diposableGoodsType, departCoding, settleAccountsDepartCoding, invoiceDepartmentId, searchModel, chasItemControlTag, chasOrgControlTag, chasPushResult); } else { result = this.getStorageRecord(disposableGoodsId, startDate, endDate); }