重构 MES 接口调用逻辑
- 将 IHttpPostOtherSys 实例化移至类级别,避免重复创建- 替换静态方法调用为接口方法,提高代码可维护性 - 优化部分代码结构,提高可读性
This commit is contained in:
		
							parent
							
								
									c8182e8da6
								
							
						
					
					
						commit
						7ce829f8b5
					
				|  | @ -27,7 +27,6 @@ import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| /** | ||||
|  * 粒劃⻌踱キ趼綴肮祭善MES | ||||
|  | @ -41,12 +40,12 @@ public class AfterSigningSynchronizeRuleMES implements IRule<PurchaseInVO> { | |||
|     private static final String logginfo = "OALOG"; | ||||
|     private static final Log obmlog = Log.getInstance(logginfo); | ||||
|     private static final BaseDAO dao = new BaseDAO(); | ||||
|     // 놓迦뺏HTTP헝헹묏야잚 | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     @Override | ||||
|     public void process(PurchaseInVO[] purchaseInVOs) { | ||||
|         try { | ||||
|             // 놓迦뺏HTTP헝헹묏야잚 | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|             if (purchaseInVOs == null || purchaseInVOs.length == 0) { | ||||
|                 obmlog.debug("AfterSigningSynchronizeRuleMES-粒劃⻌踱肮祭MES-拸粒劃⻌踱等"); | ||||
|                 return; | ||||
|  | @ -140,7 +139,7 @@ public class AfterSigningSynchronizeRuleMES implements IRule<PurchaseInVO> { | |||
|         for (PurchaseInVO vo : purchaseInVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ import nc.bs.dao.BaseDAO; | |||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.itf.arap.goldentax.SysParaInitQuery; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
| import nc.vo.bd.material.measdoc.MeasdocVO; | ||||
|  | @ -31,8 +30,6 @@ import java.math.RoundingMode; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| /** | ||||
|  * (前置)采购收货单推送MES系统,后续调用采购入库 | ||||
|  */ | ||||
|  | @ -42,12 +39,12 @@ public class PurchaseReceiptRuleMES implements IRule<PurchaseInVO> { | |||
|     private static final String logginfo = "OALOG"; | ||||
|     private static final Log obmlog = Log.getInstance(logginfo); | ||||
|     private static final BaseDAO dao = new BaseDAO(); | ||||
|     // 놓迦뺏HTTP헝헹묏야잚 | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     @Override | ||||
|     public void process(PurchaseInVO[] purchaseInVOS) { | ||||
|         try { | ||||
|             // 놓迦뺏HTTP헝헹묏야잚 | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|             if (purchaseInVOS == null || purchaseInVOS.length == 0) { | ||||
|                 obmlog.debug("AfterSigningSynchronizeRuleMES-没有需要处理的采购收货单"); | ||||
|                 return; | ||||
|  | @ -133,7 +130,7 @@ public class PurchaseReceiptRuleMES implements IRule<PurchaseInVO> { | |||
|         for (PurchaseInVO vo : purchaseInVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
|  | @ -2,14 +2,11 @@ package nc.bs.ic.m4c.sign.rule; | |||
| 
 | ||||
| import com.alibaba.fastjson.JSONArray; | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import com.yonyou.cloud.utils.StringUtils; | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.itf.arap.goldentax.SysParaInitQuery; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.vo.bd.currtype.CurrtypeVO; | ||||
| import nc.vo.bd.cust.CustomerVO; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
| import nc.vo.bd.material.measdoc.MeasdocVO; | ||||
|  | @ -17,12 +14,9 @@ import nc.vo.bd.psn.PsndocVO; | |||
| import nc.vo.bd.rack.RackVO; | ||||
| import nc.vo.bd.stordoc.StordocVO; | ||||
| import nc.vo.bd.supplier.SupplierVO; | ||||
| import nc.vo.ic.m45.entity.PurchaseInVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutBodyVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutHeadVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutVO; | ||||
| import nc.vo.org.DeptVO; | ||||
| import nc.vo.org.SalesOrgVO; | ||||
| import nc.vo.org.StockOrgVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.lang.UFDate; | ||||
|  | @ -30,16 +24,12 @@ import nc.vo.pubapp.pattern.exception.ExceptionUtils; | |||
| import nc.vo.pubapp.pattern.pub.SqlBuilder; | ||||
| import nc.vo.vorg.DeptVersionVO; | ||||
| import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; | ||||
| import net.sf.mpxj.primavera.schema.CurrencyType; | ||||
| 
 | ||||
| import java.math.BigDecimal; | ||||
| import java.math.RoundingMode; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * 销售出库(签字后传MES金思维系统) | ||||
|  | @ -48,6 +38,7 @@ public class AfterSigningSynchronizeRuleMES implements IRule<SaleOutVO> { | |||
|     private static final String SALE_OUT_URL = "/GTHINKING/AjaxService/N_KCSJJS/101527003.ashx/gt_rec_api_xsckdj"; // 销售出库登记接口 | ||||
|     private static final Log obmlog = Log.getInstance("OALOG"); | ||||
|     private static final BaseDAO dao = new BaseDAO(); | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     public AfterSigningSynchronizeRuleMES() { | ||||
|     } | ||||
|  | @ -55,8 +46,6 @@ public class AfterSigningSynchronizeRuleMES implements IRule<SaleOutVO> { | |||
|     @Override | ||||
|     public void process(SaleOutVO[] saleOutVOS) { | ||||
|         try { | ||||
|             // ³õʼ»¯HTTPÇëÇ󹤾ßÀà | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|             if (saleOutVOS == null || saleOutVOS.length == 0) { | ||||
|                 obmlog.debug("AfterSigningSynchronizeRule-没有需要处理的销售出库单."); | ||||
|                 return; | ||||
|  | @ -196,7 +185,7 @@ public class AfterSigningSynchronizeRuleMES implements IRule<SaleOutVO> { | |||
|         for (SaleOutVO vo : saleOutVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
|  | @ -6,15 +6,12 @@ import nc.bs.dao.BaseDAO; | |||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.itf.arap.goldentax.SysParaInitQuery; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.vo.bd.currtype.CurrtypeVO; | ||||
| import nc.vo.bd.cust.CustomerVO; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
| import nc.vo.bd.material.measdoc.MeasdocVO; | ||||
| import nc.vo.bd.psn.PsndocVO; | ||||
| import nc.vo.bd.stordoc.StordocVO; | ||||
| import nc.vo.ic.m45.entity.PurchaseInVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutBodyVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutHeadVO; | ||||
| import nc.vo.ic.m4c.entity.SaleOutVO; | ||||
|  | @ -30,8 +27,6 @@ import java.math.RoundingMode; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * (前置)销售交货单(BIP无) 推送至MES | ||||
|  | @ -43,12 +38,11 @@ public class SalesDeliveryOrderRuleMES implements IRule<SaleOutVO> { | |||
|     // 删除销售交货单接口地址 | ||||
|     private static final String MES_DELETE_API_URL = "/GTHINKING/AjaxService/N_XSSJJSA/102397002.ashx/SOTH_DELETE"; | ||||
|     private static final Log obmlog = Log.getInstance("OALOG"); | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     @Override | ||||
|     public void process(SaleOutVO[] saleOutVOS) { | ||||
|         try { | ||||
|             // 놓迦뺏HTTP헝헹묏야잚 | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|             if (saleOutVOS == null || saleOutVOS.length == 0) { | ||||
|                 obmlog.info("SalesDeliveryOrderRuleMES-没有要进行处理的销售交货单"); | ||||
|                 return; | ||||
|  | @ -198,32 +192,23 @@ public class SalesDeliveryOrderRuleMES implements IRule<SaleOutVO> { | |||
|             if (orderNo == null || orderNo.trim().isEmpty()) { | ||||
|                 throw new BusinessException("销售交货单号不能为空"); | ||||
|             } | ||||
| 
 | ||||
|             obmlog.debug("SalesDeliveryOrderRuleMES-准备删除第三方系统销售交货单: " + orderNo); | ||||
| 
 | ||||
|             // 构建请求数据 | ||||
|             JSONObject requestData = new JSONObject(); | ||||
|             JSONObject dataObj = new JSONObject(); | ||||
|             dataObj.put("orderNo", orderNo); | ||||
|             requestData.put("Data", dataObj); | ||||
| 
 | ||||
|             // 놓迦뺏HTTP헝헹묏야잚 | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|             // 发送删除请求 | ||||
|             String response = httpPostOtherSys.callMes(MES_DELETE_API_URL, requestData); | ||||
|             obmlog.debug("SalesDeliveryOrderRuleMES-删除请求返回结果: " + response); | ||||
| 
 | ||||
|             // 解析返回结果 | ||||
|             JSONObject jsonResponse = JSONObject.parseObject(response); | ||||
|             boolean isSuccess = jsonResponse.getBooleanValue("Success"); | ||||
|             String errorMessage = jsonResponse.getString("ErrorMessage"); | ||||
| 
 | ||||
|             if (!isSuccess) { | ||||
|                 obmlog.error("SalesDeliveryOrderRuleMES-删除销售交货单失败: " + orderNo + ", 错误信息: " + errorMessage); | ||||
|                 throw new BusinessException("删除销售交货单失败: " + (errorMessage != null ? errorMessage : "未知错误")); | ||||
|             } | ||||
| 
 | ||||
|             obmlog.debug("SalesDeliveryOrderRuleMES-成功删除销售交货单: " + orderNo); | ||||
|             return true; | ||||
|         } catch (Exception e) { | ||||
|  | @ -240,7 +225,7 @@ public class SalesDeliveryOrderRuleMES implements IRule<SaleOutVO> { | |||
|         for (SaleOutVO vo : saleOutVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ import nc.bs.dao.BaseDAO; | |||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.itf.arap.goldentax.SysParaInitQuery; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.vo.bd.cust.CustomerVO; | ||||
| import nc.vo.bd.material.MaterialVO; | ||||
|  | @ -25,11 +24,9 @@ import nc.vo.pubapp.pattern.exception.ExceptionUtils; | |||
| import nc.vo.pubapp.pattern.pub.SqlBuilder; | ||||
| import nc.vo.vorg.DeptVersionVO; | ||||
| import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  | @ -40,6 +37,7 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<InvCountBillVO> { | |||
|     private static final String logginfo = "OALOG"; | ||||
|     private static final Log obmlog = Log.getInstance(logginfo); | ||||
|     private static final BaseDAO dao = new BaseDAO(); | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     public AfterApprovingSynchronizeRuleMES() { | ||||
|     } | ||||
|  | @ -47,8 +45,6 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<InvCountBillVO> { | |||
|     @Override | ||||
|     public void process(InvCountBillVO[] invCountBillVOs) { | ||||
|         try { | ||||
|             // 놓迦뺏HTTP헝헹묏야잚 | ||||
|             IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|             if (invCountBillVOs == null || invCountBillVOs.length == 0) { | ||||
|                 obmlog.debug("AfterApprovingSynchronizeRule-ûÓÐÒª´¦ÀíµÄÅ̵ã"); | ||||
|                 return; | ||||
|  | @ -82,7 +78,7 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<InvCountBillVO> { | |||
|         for (InvCountBillVO vo : invCountBillVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(StockOrgVO.getDefaultTableName(), StockOrgVO.CODE, StockOrgVO.PK_STOCKORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
|  | @ -55,7 +55,6 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin { | |||
|             logger.info("批量转换请购单到采购订单完成", this.getClass(), "executeTask"); | ||||
|         } catch (Exception e) { | ||||
|             logger.error("执行批量转换请购单到采购订单任务失败", e, this.getClass(), "executeTask"); | ||||
|             ExceptionUtils.marsh(e); | ||||
|         } | ||||
|         logger.info("批量转换请购单到采购订单任务执行完成", this.getClass(), "executeTask"); | ||||
|         return retObj; | ||||
|  | @ -204,13 +203,12 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin { | |||
|         Arrays.stream(vos).forEach(currentVO -> { | ||||
|             PraybillHeaderVO hvo = currentVO.getHVO(); | ||||
|             hvo.setVdef30("success"); | ||||
|             hvo.setVdef31("N"); | ||||
|             hvo.setVdef31("Y"); | ||||
|             hvo.setStatus(VOStatus.UPDATED); | ||||
|         }); | ||||
|         if (orderVOs.length == 1) { | ||||
|             PraybillVO singleVO = vos[0]; | ||||
|             PraybillHeaderVO singleHVO = singleVO.getHVO(); | ||||
|             SCMScriptResultDTO scriptResult = null; | ||||
|             try { | ||||
|                 (NCLocator.getInstance().lookup(IBatchRunScriptService.class)).runBacth(cloudContext, OrderVO.class); | ||||
|             } catch (Exception e) { | ||||
|  | @ -240,9 +238,7 @@ public class BatchTransferToPurchaseOrder implements IBackgroundWorkPlugin { | |||
|                 logger.warn("单据转换生成采购订单时发生错误: " + scriptResult.getErrorMessage(), this.getClass(), "processBatchTransfer"); | ||||
|             }); | ||||
|         } | ||||
|         if (!failedHVOList.isEmpty()) { | ||||
|             updatePrayBillVOs(failedHVOList); | ||||
|         } | ||||
|         updatePrayBillVOs(failedHVOList); | ||||
|     } | ||||
| 
 | ||||
|     private void updatePrayBillVOs(List<PraybillVO> hvoList) { | ||||
|  |  | |||
|  | @ -1,17 +1,12 @@ | |||
| package nc.bs.so.m30.rule.approve; | ||||
| 
 | ||||
| import bsh.StringUtil; | ||||
| import com.alibaba.fastjson.JSONArray; | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.framework.common.InvocationInfoProxy; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.bs.logging.Log; | ||||
| import nc.hr.utils.PubEnv; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.itf.arap.goldentax.SysParaInitQuery; | ||||
| import nc.jdbc.framework.processor.ColumnProcessor; | ||||
| import nc.vo.am.common.util.StringUtils; | ||||
| import nc.vo.bd.balatype.BalaTypeVO; | ||||
| import nc.vo.bd.currtype.CurrtypeVO; | ||||
| import nc.vo.bd.cust.CustomerVO; | ||||
|  | @ -36,8 +31,6 @@ import java.math.RoundingMode; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static nccloud.pubift.commen.impl.utils.HttpPostOtherSysImpl.checkIfIncludeOrg; | ||||
| 
 | ||||
| /** | ||||
|  * 销售订单审批后推送MES金思维系统 | ||||
|  */ | ||||
|  | @ -46,14 +39,14 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<SaleOrderVO> { | |||
|     private static final String logginfo = "OALOG"; | ||||
|     private static final Log obmlog = Log.getInstance(logginfo); | ||||
|     private static final BaseDAO dao = new BaseDAO(); | ||||
|     // 놓迦뺏HTTP헝헹묏야잚 | ||||
|     IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
| 
 | ||||
|     public AfterApprovingSynchronizeRuleMES() { | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void process(SaleOrderVO[] saleOrderVOs) { | ||||
|         // 놓迦뺏HTTP헝헹묏야잚 | ||||
|         IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); | ||||
|         try { | ||||
|             if (saleOrderVOs == null || saleOrderVOs.length == 0) { | ||||
|                 obmlog.debug("AfterApprovingSynchronizeRuleMES-没有需要处理的销售订单"); | ||||
|  | @ -238,7 +231,7 @@ public class AfterApprovingSynchronizeRuleMES implements IRule<SaleOrderVO> { | |||
|         for (SaleOrderVO vo : saleOutVOS) { | ||||
|             try { | ||||
|                 String code = transferCodeByPk(SalesOrgVO.getDefaultTableName(), SalesOrgVO.CODE, SalesOrgVO.PK_SALESORG, vo.getParentVO().getPk_org()); | ||||
|                 if (checkIfIncludeOrg(code)) { | ||||
|                 if (httpPostOtherSys.checkIfIncludeOrg(code)) { | ||||
|                     result.add(vo); | ||||
|                 } | ||||
|             } catch (BusinessException e) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue