合约交易
利用合约关系进行合约交易(必须已经签署生效的合作关系)
- 接口单据和目标单据:基于合约交易过程中,邀约方发送“接口单据”,执行方一一对应生成“目标单据”,因此二者都是协议类型的单据,单据中必须包含接口单据id,合约关系id和共识项。
如:一方的采购订单(接口单据)对应另一方的销售订单(目标单据)。接口单据与目标单据一一对应,即双方都存在一个通过合约关系建立的单据(一个采购订单对应另一方的一个销售订单),该接口单据包含合约关系信息id,提供单据的一方为甲方(邀约方,例如采购订单),接受单据的为乙方(执行方,例如销售订单)。双方数据交换以甲方的单据id(交易id)为依据进行。
合约id,contractrelationid 为合约关系id
交易id,接口单据的主键,目标单据中字段名称一般为tranid。
- 共识项(关联项)
跟踪合约交易信息的数据字段,代表合约中订单项,唯一识别一个订单项目的id。例如采购订单的一个明细产品项目。
合约交易过程中,不仅需要传递订单,还需要反馈订单的执行进度,针对订单项进行信息沟通。因此共识项可以确定,订单的执行进度和状态。
邀约方(甲方)明细记录的id通常作为交易项的唯一标识。
- 接口单据的状态和操作
- 接口单据状态
- 邀约方(甲方): 新建(还未传输给对方),待确认(传输给对方,待对方确认,待确认期间邀约方还可以更新接口单据?),生效(对方已经确认合约生效),拒绝 (对方拒绝,合约作废)
- 执行方(乙方): 待确认(接受到对方合约未确认),生效(接受合约,合约生效),拒绝(拒绝对方合约,合约作废)
CREATED("created"), //建立完成 ACCEPTED("accepted"), //接受待确认 REJECTED("rejected"), //拒绝 CONFIRMED("confirmed"); //确认
- 操作(合约协议的签署过程):
- 发送:(创建) 将采购订单发送给对方,形成销售协议(合同)
- 确认:接受合约,合约生效
- 拒绝:拒绝合约,合约失效
- 撤回:撤回未生效的合约,邀约方单据进入新建状态,乙方合约单据作废。撤回已生效的合约,待对方确认后,双方合约才会处于待确认状态。
- 接口单据和目标单据必须包含的字段
cstatus (合约状态),
cconfirmduedate 同意或者拒绝的有效时间,超过期限,不能在同意或者拒绝单据,有效期限有合约实例 confirmdays 属性确定,如果该属性为null 表明没有期限限定。
ccancelstate 单据同意后,如果撤销首先更新该字段 ‘1’ 表明自己发起撤销,‘2’ 表明对方发起撤销。
cmsgcount: 协作消息的数量 (收+发)
- 邀约方定义
邀约方(甲方)职责
<ATTRIBUTE TYPE="DS/PR/PS/LR/LS" PROGID="CNTCOOP" SVRERI="" RELEASE="0~0~0" USERVERSION="1">
<FIELD CSTATUS="cstatus" CONFIRMDUEDATE="cconfirmduedate" CANELSTATE="ccancelstate" CMSGCOUNT='cmsgcount'/> 字段定义,若为默认值可以忽略
<PROVIDER EDITOR="..EDIT" MAINDS="..BROWSEDS" ALIAS="CONTRACT" ALLALIAS="DEFAULT" IDPARAM="glqyid" IDFIELD="glqyid">
EDITOR 接口单据的编辑属性
MAINDS 用于查询接口单据主数据集信息的数据集,ALIAS,用于查询合约信息,不包含已经rejected的合约
IDPARAM 接口单据的主键id的参数名称,邀约方是本单据id参数,IDFIELD接口单据的字段的名称,邀约方本单据的id字段。
<CONTRACTREL ITEMCODE="CNT" ID="relationid"/> 协作与对方的关系,PROVIDER对应的是EXECUTOR,EXECUTOR 对应的是PROVIDER
合约关系定义,(同其他合约关系定义),通过主数据集获得 ID 字段名称
<TRANSFER PARAMNAME="glqyid">
邀约方生成合约的数据转移定义,PARAMNAME 生成转移的参数名称,值为本单据id
<DATASET CODE="EDITDS" ERI="..EDITDS" ALIAS="DEFAULT">
<FIELD SOURCE="ename" TARGET="ename"/>
</DATASET>
</TRANSFER>
<OPMESSAGE SUBMIT="提交合约" CONFIRM="同意合约" REJECT="拒绝合约" WITHDRAW="撤回合约"/>
前端用于生成操作消息的动态文本
<STATUSCONDITION CREATED="" ACCEPTED="" CONFIRMED="" REJECTED=""/>
接口单据状态转移的条件定义
<RELATIONDS ERI=".HZGX.BROWSEDS" ALIAS="DEFAULT" PARAM="contractrelationid" NAMEEXP="resname + '('+rescode+')' "/>
关系数据集(可以采用合约定义总的关系数据集),通过 contractrelationid 查询资源信息, 必须存在tranid,而且不能为空已经关联了客户或者供应商, 一般采用合约定义中的关系数据集
比如供应商,或者客户的对方的信息,PARAM 合约关系id参数的名称,NAMEEXP显示在交易中的对方名称(resname)
在执行方(乙方) 在目标单据中,填充关系相关的字段信息。 如供应商和客户id
<EXESTATUSSND CODE="SYNCSTORE" VALUE="表达式设定字段的值" CONDITION="条件表达式" EXESTATUS="更新的主数据集的字段名称" MESSAGE="动态消息{ecode}同步" NAME='显示的名称'>
可选,只有在确认状态下的才可执行,更新自身字段值,发送到对方,同步状态信息,与EXESTATUSREC 成对存在,VALUE的值 更新EXESTATUS字段的值,
CONDITION:执行发送操作的条件,主数据集判断
VALUE 更新值表达式
NAME 显示在菜单中的名称
EXESTATUS 同步的字段名称,执行后接口单据,目标单据的字段内容设置为VALUE的值。
MESSAGE 自动生成的发布消息,动态文本(包含表达式的文本)
<TRANSFER PARAMNAME="tranid"> 可选
数据转换定义,用于生成更新数据,发送给接收方,参数为共识项
<DATASET CODE="EDITDS" ERI="..EDITDS" ALIAS="DEFAULT">
<FIELD SOURCE="tranmemo" TARGET="tranmemo"/>
<FIELD SOURCE="tranid" TARGET="glqyid"/> 两个id相互对应
</DATASET>
</TRANSFER>
</EXESTATUSSND>
<EXESTATUSREC CODE="SYNCSTORE" VALUE="同步库存信息" CONDITION="" EXESTATUS="ename" NAME=''>
与EXESTATUSSND 对应,只有在确认状态下的才可执行,接收执行状态同步操作接收方(可选),在合约执行过程中同步执行进度的信息,例如入库或发货情况, CODE:唯一识别,与发送方对应,
VALUE 更新EXESTATUS字段的值,NAME 显示在菜单中的名称
CONDITION 可以执行操作的条件,EXESTATUS 同步的字段名称,执行后接口单据的字段内容设置为VALUE的值。
<DATASET CODE="EDITDS" ITEMID="glqyid">tranmemo~field1~field2</DATASET> ITEMID 两边必须都存在,且相等,才更新记录
对应TRANSFER 的数据集,接收同步内容的数据集和字段,作为接受者,允许更新的字段,ITEMID 为双方的共识项
</EXESTATUSREC>
</PROVIDER>
</ATTRIBUTE>
</DEF>
- 执行方定义
执行方(乙方)
<ATTRIBUTE TYPE="DS/PR/PS/LR/LS" PROGID="CNTCOOP" SVRERI="" RELEASE="0~0~0" USERVERSION="1">
<EXECUTOR EDITOR="..EDIT" MAINDS="..BROWSEDS" ALIAS="CONTRACT" ALLALIAS="DEFAULT" IDPARAM="tranid" IDFIELD="tranid">
<CONTRACTREL ITEMCODE="CNT" ID="relationid"/>
<RELATIONDS ERI=".HZGX.BROWSEDS" ALIAS="DEFAULT" PARAM="contractrelationid" NAMEEXP="ename">
<FIELD CODE="tranmemo" VALUE="tranmemo"/>
根据关系数据集更新生成的合约信息,比如对方(客户或供应商)的id等, 填充目标单据字段 ,联系方式等信息
CODE 字段名称 VALUE 表达式,用于计算目标字段的值。
<FIELD CODE="relationid" VALUE="contractrelationid"/>
</RELATIONDS>
<STATUSCONDITION CREATED="" ACCEPTED="" CONFIRMED="" REJECTED=""/>
<OPMESSAGE ACCEPT="" CONFIRM="" REJECT="" WITHDRAW=""/>
<EXESTATUSSND ...> ......</EXESTATUSSND>
<EXESTATUSSND ...> .......</EXESTATUSSND>
</EXECUTOR>
</ATTRIBUTE>
- 事件的使用
需要在DATA属性中定义,可以在工作流中使用
<ATTRIBUTE CODE='DATA'.../>
<EVENT CODE="COOPER_STATUS" NAME="合约状态改变"/>
</ATTRIBUTE>
消息接受事件
1) 消息接收实体事件
事件代码:ATTRIBUTECODE_RECMSG
事件参数:
lEvent.param().put("op",aOp.op); //消息操作
lEvent.param().put("opmsg",aOp.comessage); 消息内容
2) 状态变化实体事件
接口单据状态变化后触发实体事件
为事件代码 : ATTRIBUTECODE_STATUS
事件参数:
参数 state 源状态对象(ASContractState子类) 具有:getMainStore() 获得主数据集,可以获得单据记录的主表内容
tostate //目标状态字符串 EnumContractStatus 类型
public enum EnumContractStatus {
NOTEXISTS("1"), //建立完成,数据库CSTATUS 字段字段值为null
RECEIVED("2"), //接受待确认
CLOSEDED("3"), //拒绝
CONFIRMED("4"); //确认
}
op:操作内容 EnumOperation 包括
DROP("drop"), //撤回5分钟以内的文本消息
SYNCH("synch"), //发送一般文本消息,用于传递消息。
EXESTATUS("exestatus"), //同步合约执行信息,合约生效(confirmed)状态才能发送。
SUBMIT("submit"), //提交
WITHDRAW("withdraw"), //撤回
CONFIRM("confirm"), // 确认邀约已经收到 ,发送要求确认,对方回复确认就完成
REJECT("reject");//拒绝邀约
opmsg :消息内容
事件的声明 需要在DATA属性中定义,可以在工作流中使用
<ATTRIBUTE CODE='DATA'.../>
<EVENT CODE="COOPER_STATUS" NAME="合约状态改变"/>
</ATTRIBUTE>
NAME :流程设计中显示的事件名称
消息脚本:
发送消息后脚本路径为 "SCRIPT/MESSAGE/SND";
接受消息后事件触发前脚本 "SCRIPT/MESSAGE/REC";
param 的属性如下
public static class EntityContractOperation extends EntityBase {
@Id
@GeneratedValue
public Long operationid;
public Long roomid;
public Long contractrelationid;//合约关系id;
public Long aentityid;//实体,区分操作合约协议类型
public Long tranid;//接口单据的id,合约提供方单据id
public Long ywid;//自己的单据id,接受放过单据id
public Long pnroomid;
public Long pnoperationid;//来源的操作id
public Long fromroomid; //来源roomid
public String op; //EnumOperation 类型,用于区分操作
public String createby;
public String estatus;
public String exename; //执行状态名称,如果不是执行状态可以忽略。
public String comessage;//操作留言
public Date cbegintime; //创建时间
public Date cendtime; //有效的响应时间
}
Created with the Personal Edition of HelpNDoc: Free iPhone documentation generator