文章目录
- 一、变更问题
- hcbm_contract_relationship表
- 如何拿到框架协议变更后最新的合同内容?
- 如何根据1003231100021-1的合同id拿到这个合同关联的最后一个变更单?
- 变更后合同页面展示的问题
- 如何根据变更编号拿到变更后最新合同行信息?
- 关于relate_contract_number
- 关于source_contract_number
- 一、根据最原始合同编号查询出最新建的合同编号
- 二、接口服务
- 案例演示:
- 案例演示
- 接口平台带organizationId
- 接口监控不记录
- 客户端
- 三、发票和接收问题
- 查看发票和接收表
- 已收发票金额问题
- 三、付款管理
- 付款管理不能编辑
- 付款计划比例不让编辑的逻辑
- 付款管理界面的付款金额不对
- 付款管理的金额
- 为什么点完刷新和编辑后 计划付款金额还是不对
- 三、多系统同步问题
- 附件传门户
- HSRM过来的订单啥时候是新建状态啥时候是已批准
- 归档没有附件
- 同步sap的几大场景
- 同步sap的`areementSyncSap(String contractNumber)`和`syncSapPreCondition(String contractNumber, String syn)`这两个方法调用时机
- 同步ERP的几大场景
- 四、付款管理生成付款计划、付款计划生成付款阶段逻辑
- 五、履约保证金阶段生成退款计划、退款计划生成履约保证金阶段逻辑
- 六、合同各文件
- 合同正文
- 合同关联关系
- 合同附件
- 归档文件
- HOC同步门户用章信息文件丢失问题
- 合同文件存到哪里去了?
- 七、代理记录日志
- 八、文本对比服务
- 主数据相关接口
- 1、“签订主体管理”的数据来自“组织信息同步接口”
- 2、相对方管理—SAP供应商地点
- 更改合同分类
- 书面变更合同分类的赋值逻辑
- 合同查询
- 合同其它查询查不到某合同
- 合同行编辑问题
- 合同修改正文
- 文中存在未填充的域变量
- 用章推送
- 其它问题
- HSRM 同IP报价预警
- SRM调用合同接口报没有权限
- HSRM调合同接口报token过期
- HSRM调合同接口报读取超时
- HSRM调合同报角色为空
- 调接口调不通了
- 电签报文
- 电签那边显示合同的签署文件打不开
- 啥时候能点击"撤销电签流程"按钮?
- 啥时候能点击"发起电签"按钮?
- 合同变更表的关联关系
- 动态拓展字段规则
- 合同动态表格规则维护
- “协议是否冻结”逻辑确认
- 没有权限访问
- report调用fulfill服务超时问题
- 有违约金的付款计划咋算的计划付款金额?
- 文件如何传输
- 没有vpn的外部系统如何调用我方系统的接口?
一、变更问题
hcbm_contract_relationship表
①疑问:hcbm_contract_relationship表的contract_id和rel_contract_id分别代表什么含义?
SELECTtype_code,hcr.contract_id,hc.contract_number,hcr.rel_contract_id,hc_rel.contract_numberFROM`hcbm_contract_relationship`hcrLEFTJOINhcbm_contract hconhc.id=hcr.contract_idLEFTJOINhcbm_contract hc_relonhc_rel.id=hcr.rel_contract_idwheretype_code='BS'可以看到,hcbm_contract_relationship表里面BS的数据,contract_id存放的就是变更后的合同id,rel_contract_id存放的就是变更前的合同id
②疑问:hcbm_contract_relationship表的contract_id和rel_contract_id分别代表什么含义?
SELECTtype_code,hcr.contract_id,hc.contract_number,hcr.rel_contract_id,hc_rel.contract_numberFROM`hcbm_contract_relationship`hcrLEFTJOINhcbm_contract hconhc.id=hcr.contract_idLEFTJOINhcbm_contract hc_relonhc_rel.id=hcr.rel_contract_idwheretype_code='BD'可以看到,hcbm_contract_relationship表里面BD的数据,contract_id存放的就是变更前的合同id,rel_contract_id存放的就是变更后的合同id
③敲记
BD 补充对象
BS 补充生成
BD是基于A合同看到A-1,因为BD是看终点(Destination)
BS是基于A-1合同看到A,因为BS是看源头(Source)
如何拿到框架协议变更后最新的合同内容?
框架协议KJ2022198可能做了好几次书面和口头变更,如何拿到这个最新的合同数据?(最后一次变更后的合同数据)
ps:此方法只适用于框架协议
publicStringqueryLatestContractNumber(StringsourceNumber){StringcontractNumber=contractMapper.queryRelContractNumber(sourceNumber,"BD");returncontractNumber==null||Objects.equals(contractNumber,sourceNumber)?sourceNumber:queryLatestContractNumber(contractNumber);}SELECThcr.rel_contract_numberFROMhcbm_contract hcLEFTJOINhcbm_contract_relationship hcrONhc.id=hcr.contract_idWHEREhcr.type_code=#{typeCode}ANDhc.contract_number=#{contractNumber}如何根据1003231100021-1的合同id拿到这个合同关联的最后一个变更单?
假如前端给了你1003231100021-1合同的合同id,然后让你拿到1003231100021-1这个合同最新的变更单,1003231100021-1到1003231100021-2合同至今肯定是做了一次书面变更,但你并不知道1003231100021-1这个合同做过几次口头变更,那如何根据1003231100021-1的合同id拿到这个合同最新的变更单?
根据合同id查询hcbm_change_header表,会拿到List<ChangeHeaderDO>(根据一个合同id可能查到多个变更头): ①如果List<ChangeHeaderDO>不为空:从List<ChangeHeaderDO>拿到最后一条创建的数据就可以; ②如果List<ChangeHeaderDO>为空:变更单信息为空,则该合同做的是书面变更,根据当前合同的来源合同id查合同变更单信息。根据合同id查询hcbm_contract表拿到该合同的sourceContractId(来源合同id),然后根据sourceContractId查询hcbm_change_header表,会拿到List<ChangeHeaderDO>,取最后一条数据contract为变更前的合同id// 根据id查询合同ContractEcontractE=contractRepository.selectByContractId(contractId);ChangeHeaderDOchangeHeaderDO=hocToSapService.getChangeHeaderByContractId(contractE);publicChangeHeaderDOgetChangeHeaderByContractId(ContractEcontractE){// 合同idLongcontractId=contractE.getId();// 来源合同idLongsourceContractId=contractE.getSourceContractId();// 根据当前合同id查询合同变更单信息List<ChangeHeaderDO>changeHeaderDOS=changeHeaderRepository.selectByContractId(contractId);if(CollectionUtils.isEmpty(changeHeaderDOS)){// 变更单信息为空,则该合同做的是书面变更,根据当前合同的来源合同id查合同变更单信息List<ChangeHeaderDO>sourceChangeHeaderDOS=changeHeaderRepository.selectByContractId(sourceContractId);// 取最新的一条变更信息ChangeHeaderDOchangeHeaderDO=sourceChangeHeaderDOS.stream().sorted(Comparator.comparing(ChangeHeaderDO::getCreateTime).reversed()).findFirst().get();returnchangeHeaderDO;}// 取最新的一条数据ChangeHeaderDOchangeHeaderDO=changeHeaderDOS.stream().sorted(Comparator.comparing(ChangeHeaderDO::getCreateTime).reversed()).findFirst().get();returnchangeHeaderDO;}变更后合同页面展示的问题
①1106231100001口头变更了一些合同基本信息(批准时间之类的),当口头变更批准后,你查看1106231100001合同时你看到的是1106231100001口头变更后的最新内容
②1106231100002这个合同,做了一次书面变更,是否参考模板由是改成否,当书面变更批准后会生成1106231100001-1合同。此时你查看1106231100001合同时你发现书面变更的内容并没有在1106231100001合同上面体现,但是你查看1106231100001-1合同时书面变更的内容会在1106231100001-1合同上面体现
②1106231100002-1这个合同,做了一次书面变更(新增一个合同行,并且把已有一个合同行数量由10改成23),当书面变更批准后会生成1106231100001-2合同。此时你查看1106231100001-1合同时你发现书面变更的内容并没有在1106231100001-1合同上面体现(1106231100001-1合同还是只有一个合同行而且旧的合同行数量还是10),但是你查看1106231100001-2合同时书面变更的内容会在1106231100001-1合同上面体现(1106231100001-2合同有两个合同行而且有一个合同行数量由10改成23)
如何根据变更编号拿到变更后最新合同行信息?
①业务场景
一个合同有两个合同行,你期间做了七八次变更(有书面变更有口头变更),而且变更的时候也做了新增、删除、修改合同行的操作。
假如有个合同行第一次变更合同行由A变为B,第二次变更合同行由B变为C,第二次变更后推下游系统时你不能推C你要推A的合同行id,要不然下游系统会以为你新增了一个合同行。也就是说:推下游系统(推SAP和华韵)时对于新增的合同行需要推当前合同行的id,对于变更的合同行推下游系统时需要推原来最初的合同行id,如何根据变更编号拿到变更后最新合同行信息?
②基础知识补充:
你做一次变更,假如你做了口头变更,即时你没有变更合同行,但是原合同的合同行会被复制一份并且原先合同行表里面的合同行数据会被删掉,新生成的合同行的id都是新的id。
你对一个合同做了变更,你根据变更单号查询查询变更头表(hcbm_change_header)拿到这个变更单对应的合同id,然后你根据这个合同id拿到的合同行数据,这些合同行数据可能是新合同行的数据,这些数据不能同步给下游系统。要不然下游系统看到你同步过来的合同行id和上次的不一样以为你新增了一个合同行。
如果某次变更新增了合同行,已知变更单号,如何拿到新生成的合同行id呢?
根据变更单号查询查询变更头表拿到变更id,然后根据变更id查询hcbm_change_ctr_line表,根据hcbm_change_ctr_line表的snowId找hcbm_contract_line表的snow_id然后拿到对应的合同行数据
如果某次变更,只变更了合同基本信息,没有改变合同行,已知变更单号,如何拿到变更后合同行id呢?
根据变更单号查询查询变更头表拿到变更id,然后根据变更id查询hcbm_change_ctr_line表,根据hcbm_change_ctr_line表的initial_id就能拿到这个行它对应的一开始的合同行id
此次变更有改变合同行的数量,已知变更单号,如何拿到合同行id呢?
根据变更单号查询查询变更头表拿到变更id,然后根据变更id查询hcbm_change_ctr_line表,根据hcbm_change_ctr_line表的initial_id就能拿到这个行它对应的一开始的合同行id
③解决方案
SELECT(SELECThc.relate_contract_numberFROMhcbm_contract hcWHEREhc.id=hccl.contract_id)最初的合同号,CASEWHENhccl.action_code='INCREASE'THEN(SELECTidFROMhcbm_contract_line hclWHEREhcl.snow_id=hccl.snow_id)ELSEhccl.initial_idENDas '最初的合同行id'FROMhcbm_change_ctr_line hcclWHEREhccl.change_id=#{changeId}关于relate_contract_number
hcbm_contract表中一个有合同编号的合同的relate_contract_number不可能为空,他要是没有合同编号,那么relate_contract_number也为空
A合同书面变更后成为A-1,A-1合同书面变更后变成A-2,A-2合同书面变更后变成A-3,那么A还有A-1还有A-2合同的relate_contract_number都是A
你可以根据A去查看hcbm_fulfill_receive_transaction还有hcbm_erpsync_invoice_line表来看它的接收信息
# 验证的sqlselectrelate_contract_number,contract_numberfromhcbm_contractwherecreation_date>='2023-01-01'andrelate_contract_number!=contract_number关于source_contract_number
A合同复制成B ,那么B的source_contract_id指的就是A
A合同变更成A-1 ,那么A-1的source_contract_id指的就是A
一个合同的source_contract_id不为空,它只有两种情况:①原合同是A,现在的合同是B,B合同是复制生成的合同(creation_method_code=COPY)②原合同是A,现在的合同是A-1,也就是A-1合同是A合同书面变更生成的合同
# 验证一个合同的source_contract_id不为空,它只有两种情况:①原合同是A,现在的合同是B,B合同是复制生成的合同(creation_method_code=COPY)②原合同是A,现在的合同是A-1,也就是A-1合同是A合同书面变更生成的合同SELECThc.contract_numberFROMhcbm_contract hcWHEREhc.creation_date>='2023-01-01'andhc.source_contract_idisnotnullandhc.creation_method_code!='COPY'SELECThc.contract_number,hc.creation_method_code,hc2.contract_numberassourceContractNumberFROMhcbm_contract hcLEFTJOINhcbm_contract hc2onhc2.id=hc.source_contract_idWHEREhc.creation_date>='2023-01-01'andhc.contract_numberisnotnullandhc2.contract_numberisnotnullandhc.contract_number!=hc2.contract_number/** * 合同新建的时候走新建同步sap;合同有变更单,那么该合同走变更同步sap(默认该合同已经走过新建同步sap了) * 随便给你一个contractDO,我如何判断contractDO是走新建同步sap还是变更同步sap呢? */ContractDOcontractDO;// 业务操作.true=新建同步sap, false=变更同步sapBooleanoperation;if(Objects.isNull(contractDO.getSourceContractId())||CreationMethod.COPY.value().equals(contractDO.getCreationMethodCode())){// A合同的sourceContractId为空。那么我们需要看A合同是否做过变更单,如果A没有做过变更单就走新建同步sap,如果A做过变更单就走变更同步sap// A合同的sourceContractId不为空,但是A合同是复制生成的合同(B合同复制成A,那么A的source_contract_id指的就是B)如果A是复制B合同生成的合同,我们需要看A合同是否有做过变更单,如果A没有做过变更单就走新建同步sap,如果A做过变更单就走变更同步sapList<ChangeHeaderDO>changeHeaderDOS=changeHeaderRepository.selectByContractId(contractId);ChangeHeaderDOchangeHeaderDO=Optional.ofNullable(changeHeaderDOS.stream().filter(header->"APPROVED".equals(header.getStatusCode())).sorted(Comparator.comparing(ChangeHeaderDO::getCreateTime).reversed()).findFirst()).get().orElse(null);if(Objects.isNull(changeHeaderDO)){// true=新建同步sapoperation=Boolean.TRUE;}else{// false=变更同步sapoperation=Boolean.FALSE;}}else{// A合同变更成A-1 那么A-1的source_contract_id指的就是A,且A的creationMethodCode不是COPY。// 一个合同的sourceContractId不为空且它不是复制生成的合同,这种情况一定是书面变更产生的。这种情况一定是走变更同步sap(我们根据A合同查找它有没有已批准的变更单,这一定能找的)operation=Boolean.FALSE;}后面取变更单的时候就是先根据合同id去取看看能不能取到变更单,如果取不到就根据sourceContractId来取
publicChangeHeaderDOgetChangeHeaderByContractId(ContractEcontractE){// 合同idLongcontractId=contractE.getId();// 来源合同idLongsourceContractId=contractE.getSourceContractId();// 根据当前合同id查询已经批准的合同变更单信息List<ChangeHeaderDO>changeHeaderDOS=changeHeaderRepository.selectApprovedContractByContractId(contractId);if(CollectionUtils.isEmpty(changeHeaderDOS)