use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpOpenApprovalChangeEvent {
#[serde(rename="FromUserName")]
pub source: String,
#[serde(rename="ToUserName")]
pub target: String,
#[serde(rename="CreateTime")]
pub create_time: i64,
#[serde(rename="MsgId")]
pub id: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="AgentID")]
pub agent_id: i64,
#[serde(rename="ApprovalInfo")]
pub approval_info: Option<ApprovalInfo>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ApprovalInfo {
#[serde(rename="ThirdNo")]
pub third_no: String,
#[serde(rename="OpenSpName")]
pub open_sp_name: String,
#[serde(rename="OpenTemplateId")]
pub open_template_id: i64,
#[serde(rename="OpenSpStatus")]
pub open_sp_status: i32,
#[serde(rename="ApplyTime")]
pub apply_time: i64,
#[serde(rename="ApplyUserName")]
pub apply_user_name: String,
#[serde(rename="ApplyUserId")]
pub apply_user_id: String,
#[serde(rename="ApplyUserParty")]
pub apply_user_party: String,
#[serde(rename="ApplyUserImage")]
pub apply_user_image: String,
#[serde(rename="ApprovalNodes")]
pub approval_nodes: ApprovalNodes,
#[serde(rename="NotifyNodes")]
pub notify_nodes: NotifyNodes,
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ApprovalNodes {
#[serde(rename = "ApprovalNode")]
items: Vec<ApprovalNode>
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ApprovalNode {
#[serde(rename = "NodeStatus")]
name: u32,
#[serde(rename = "NodeAttr")]
node_attr: u32,
#[serde(rename = "NodeType")]
node_type: u32,
#[serde(rename="Items")]
pub items: Option<ApprovalNodeItems>,
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct NotifyNodes {
#[serde(rename = "NotifyNode")]
items: Vec<NotifyNode>,
#[serde(rename = "approverstep")]
approver_step: Vec<NotifyNode>
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct NotifyNode {
#[serde(rename = "ItemName")]
name: String,
#[serde(rename = "ItemUserId")]
item_user_id: u32,
#[serde(rename = "ItemImage")]
item_image: String,
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ApprovalNodeItems {
#[serde(rename = "Item")]
items: Vec<ApprovalNodeItem>
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ApprovalNodeItem {
#[serde(rename = "ItemName")]
name: String,
#[serde(rename = "ItemUserId")]
item_user_id: u32,
#[serde(rename = "ItemImage")]
item_image: String,
#[serde(rename = "ItemStatus")]
item_status: u32,
#[serde(rename = "ItemSpeech")]
item_speech: u32,
#[serde(rename = "ItemOpTime")]
item_op_time: u32,
}
#[cfg(test)]
mod tests {
#[test]
fn test_from_xml() {
let xml = "<xml>
<ToUserName><![CDATA[wwddddccc7775555aaa]]></ToUserName>
<FromUserName><![CDATA[sys]]></FromUserName>
<CreateTime>1527838022</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[open_approval_change]]></Event>
<AgentID>1</AgentID>
<ApprovalInfo>
<ThirdNo><![CDATA[201806010001]]></ThirdNo>
<OpenSpName><![CDATA[付款]]></OpenSpName>
<OpenTemplateId><![CDATA[1234567890]]></OpenTemplateId>
<OpenSpStatus>1</OpenSpStatus>
<ApplyTime>1527837645</ApplyTime>
<ApplyUserName><![CDATA[xiaoming]]></ApplyUserName>
<ApplyUserId><![CDATA[1]]></ApplyUserId>
<ApplyUserParty><![CDATA[产品部]]></ApplyUserParty>
<ApplyUserImage><![CDATA[http://www.qq.com/xxx.png]]></ApplyUserImage>
<ApprovalNodes>
<ApprovalNode>
<NodeStatus>1</NodeStatus>
<NodeAttr>1</NodeAttr>
<NodeType>1</NodeType>
<Items>
<Item>
<ItemName><![CDATA[xiaohong]]></ItemName>
<ItemUserId><![CDATA[2]]></ItemUserId>
<ItemImage><![CDATA[http://www.qq.com/xxx.png]]></ItemImage>
<ItemStatus>1</ItemStatus>
<ItemSpeech><![CDATA[]]></ItemSpeech>
<ItemOpTime>0</ItemOpTime>
</Item>
</Items>
</ApprovalNode>
</ApprovalNodes>
<NotifyNodes>
<NotifyNode>
<ItemName><![CDATA[xiaogang]]></ItemName>
<ItemUserId><![CDATA[3]]></ItemUserId>
<ItemImage><![CDATA[http://www.qq.com/xxx.png]]></ItemImage>
</NotifyNode>
</NotifyNodes>
<approverstep>0</approverstep>
</ApprovalInfo>
</xml>";
let msg = serde_xml_rs::from_str::<serde_json::Value>(xml).unwrap();
println!("{}", msg.to_string());
}
}