1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
extern crate serde_json;
use nature_common::{ConverterParameter, ConverterReturned, generate_id, Instance};
use nature_demo_common::{Order, OrderAccount, OrderAccountReason, Payment};
use chrono::Local;
#[no_mangle]
#[allow(unused_attributes)]
#[allow(improper_ctypes)]
pub extern fn order_receivable(para: &ConverterParameter) -> ConverterReturned {
let order: Order = serde_json::from_str(¶.from.content).unwrap();
let oa = OrderAccount {
receivable: order.price,
total_paid: 0,
last_paid: 0,
reason: OrderAccountReason::NewOrder,
diff: 0 - order.price as i32,
};
let mut instance = Instance::default();
instance.content = serde_json::to_string(&oa).unwrap();
ConverterReturned::Instances(vec![instance])
}
#[no_mangle]
#[allow(unused_attributes)]
#[allow(improper_ctypes)]
pub extern fn pay_count(para: &ConverterParameter) -> ConverterReturned {
let payment: Payment = serde_json::from_str(¶.from.content).unwrap();
if para.last_state.is_none() {
return ConverterReturned::EnvError;
}
let old = para.last_state.as_ref().unwrap();
let mut oa: OrderAccount = serde_json::from_str(&old.content).unwrap();
let mut state = String::new();
if payment.paid > 0 {
state = "partial".to_string();
}
oa.total_paid += payment.paid;
oa.diff = oa.total_paid as i32 - oa.receivable as i32;
if oa.diff > 0 {
oa.total_paid = oa.receivable;
}
if oa.diff == 0 {
state = "paid".to_string();
}
oa.last_paid = payment.paid;
oa.reason = OrderAccountReason::Pay;
let mut instance = Instance::default();
instance.content = serde_json::to_string(&oa).unwrap();
instance.states.insert(state);
ConverterReturned::Instances(vec![instance])
}
#[no_mangle]
#[allow(unused_attributes)]
#[allow(improper_ctypes)]
pub extern fn go_express(para: &ConverterParameter) -> ConverterReturned {
let mut ins = Instance::new("any one").unwrap();
ins.id = para.from.id;
ins.context.insert("sys.target".to_owned(), para.from.id.to_string());
ins.para = "/ems/".to_owned() + &generate_id(¶.master.clone().unwrap().data).unwrap().to_string();
ConverterReturned::Instances(vec![ins])
}
#[no_mangle]
#[allow(unused_attributes)]
#[allow(improper_ctypes)]
pub extern fn auto_sign(para: &ConverterParameter) -> ConverterReturned {
let mut ins = Instance::new("any one").unwrap();
ins.context.insert("sys.target".to_owned(), para.from.id.to_string());
ins.content= format!("type=auto,time={}", Local::now());
ConverterReturned::Instances(vec![ins])
}