general_create_trans_flowchart
2016-03-09 13:06:13 0 举报
`general_create_trans_flowchart` 是一个用于创建通用事务流程图的函数。该函数接收一系列事务步骤作为输入,并生成一个可视化的流程图,以帮助用户更好地理解和分析事务的处理过程。通过使用此函数,用户可以快速地创建一个清晰、易于理解的流程图,从而提高团队协作效率和减少错误发生的可能性。此外,该函数还支持自定义样式和布局,以满足不同用户的需求。总之,`general_create_trans_flowchart` 是一个功能强大且实用的工具,适用于各种场景下的事务流程图创建。
作者其他创作
大纲/内容
N
if (cm == create_trans_by_allocated_trans_id)如果利用预生成交易单创建交易单
传入的与redis中的client_source_flag_create是否一致?
in_pack中是否传入trans_id
从in_pack读取买家属性,放入info.buyeruser_idlogin_nametrue_namecurrency赋默认值info.buyer.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT
Y
is_reentry是否为重入
fee_account != info.seller收益账户不与卖家相同
compare_non_modifiable_trans_info比较缓存中的与传入的交易信息最严格必须一致的部分
buyer必须相同
目前只有中介和直付交易才支持多进并行支付类型if ((info.PARALLEL_TYPE_MULTIPLE_IN_MASK & info.parallel_type)&& (info.PAYMENT_MODE_MEDIATE != payment_mode)&& (info.PAYMENT_MODE_DIRECT != payment_mode))
info.coupon_strategy_id?
compare_restricted_modifiable_trans_info比较缓存中的与传入的交易信息(is_full_match=true)(次严格必须一致的部分)
如果原来库中存在付款方案,则修改后的并行支付类型也要标记存在付款方案if (trans.parallel_type & trans.PARALLEL_TYPE_MULTIPLE_IN_EXIST_MASK) {info.parallel_type |= info.PARALLEL_TYPE_MULTIPLE_IN_EXIST_MASK;如果原来库中存在分润方案,则修改后的并行支付类型也要标记存在分润方案if (trans.parallel_type & trans.PARALLEL_TYPE_MULTIPLE_OUT_EXIST_MASK) {info.parallel_type |= info.PARALLEL_TYPE_MULTIPLE_OUT_EXIST_MASK;
从In_pack读取分润与分账信息,放入infoshare_profit_typeshare_billing_type设置has_share_profit_type、is_entrust_billing_solution
check_last_try_pay_time
传入的和redis中的buyer是否相同
judge_repeat_pay判断state是否为create
buyer_fee_amount != 0
校验以下信息必须一致trans_typepayment_modesellersp_idshare_profit_flag必须为未分润
TRANS_CANNOT_MODIFY
seller是customer或者merchantuser_id分布规则
是否传入平台商户if (!has_up_merchant)
校验金额info.validate()total_good_amount = unit_price_amount * unit_count + transport_amount + adjust_price_amount + adjust_transport_amount;total_payment_amount = cash_amount + coupon_amount + pay_solution_amount + mkt_solution_amount + coupon_amount_new;total_good_amount必须等于total_payment_amount
如果传入和redis中的trans_mode一致即都是非纯网关
本地变量trans_info trans;trans_solution_info trans_solution;
如果结算类型不匹配,那么就把trans里的卖家子账户号改成参数里的这是因为CAN_MODIFY_ALL时可以修改settlement_type,同时会造成卖家子账户号变化if (info.settlement_type != trans.settlement_type) {这里修改trans字段,是为了下面的卖家信息一致性校验通过trans.seller.sub_account_type = info.seller.sub_account_type;
!in_redis如redis中没有
info.seller.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT(1)卖家使用已结算账户
buyer_fee_account != info.seller收益账户不与卖家相同
return
info.seller.sub_account_type = SUB_ACCOUNT_TYPE_UNSETTLED(3)卖家使用待结算账户
if (0 != info.fee_amount)只有fee_amount不为0时才需要fee_user_id
modify_trans将修改过滤过的传入的info放入redis中setex coredb:t_trans_info.trans_id payserver_redis_expire JSON(info)
fee_account收益账户必须是C账户
if (0 info.coupon_strategy_id)
从in_pack读入端信息,放入infoclient_source_flag_create并设置has_client_source_flag_create
如果multiple_in则pay_trans_solution要一致如果multiple_out则share_profic_solution要一致
检查state是否不为createjudge_repeat_pay(trans)
从in_pack读入价格、优惠信息,放入infounit_price_amountunit_counttransport_amountadjust_price_amountadjust_transport_amountcash_amountcash_amount_newcoupon_amountcoupon_startegycoupon_strategy_id
TRANS_CAN_MODIFY_GATEWAY_INFO
TRANS_CAN_MODIFY_ALL
DEFAULT
has_client_source_flag_create
如未传入分润方案,不允许分润类型不为无,且分账类型为普通
same_price
没看明白干啥呢?为啥?
异常PAY_ERR_PARAM_INVALID_COUPON_STRATEGY_ID
手续费不能大于交易总现金金额if (info.fee_amount info.get_total_cash_amount())((cash_amount + pay_solution_amount + mkt_solution_amount - _mkt_total_no_settlement_amount))
从in_pack读入结算信息,放入infochannel_idfee_amountsettlement_typebuyer_fee_amount设置has_read_channel_id
parallel_type最右2位必须一致
本地变量trans_create_info info;trans_create_info merchant_trans;trans_solution_info solution_info;string coupon_error_info;up_merchant_info merchant_info;bool has_up_merchant;
各个金额含义
=1
is_modified = true;
如果是新订单且为委托分账if (is_entrust_billing_solution && !is_used)
从in_pack读入上层商户信息,放入infoup_merchant_info设置has_up_merchant
如果传入分润方案则分润类型不可为无
从in_pack读入卖家信息,放入info.sellersp_iduser_idlogin_nametrue_name设置seller.currency=buyer.currency
buyer是customer或者merchantuser_id分布规则
info.settlement_type!=realtime为异步结算
数据库有的话用数据库的,否则调用billNo新生成一个trans_id_in_redis = is_used ? info.trans_id : trans_id_client_.info_bill_no(
is_full_match
校验trans_mode买家相同时trans_mode必须一致
handle_cannot_modify_scenario(is_reentry=false)
检查平台商户传入是否正确
计算并行支付类型,放入info.parallel_type1)如传入有付款方案,10102)如传入有分润或分账方案,01013)啥都没有,0000
info.channel_id = trans_settlement_info::CHANNEL_ID_DEFAULT(1)
设置info.create_time
将trans和写入out_pack如果不是委托分账则将trans_solution写入out_pack
从in_pack读入其它MISC信息,放入infoext_time、deadline_time放入info.extrasource_ip、user_mac、comments
从in_pack读取交易属性,放入infotrans_id_exttrans_typetrans_tagcan_modifytrans_mode从模板获取payment_mode,放入info
委托分账必须实时分润is_entrust_billing_solution && info.share_profit_type != SHARE_PROFIT_TYPE_REALTIME
info.coupon_strategy_id = trans.coupon_strategy_id
卖家买家user_id不同
即在redis里又在库里,且判断trans_id是否一致if (is_used && in_redis && trans_id_in_redis != info.trans_id)
校验一下信息必须一致trans_modebuyer.login_name/user_id/sub_account_type/currency
if (has_share_profit_solution && is_entrust_billing_solution)|| has_share_profit_solution && info.share_billing_type != trans_info::SHARE_TRANS_TYPE_NORMAL如果传入有分润方案,则不能为委托分账或分普通类型分账
从in_pack读入商品信息,放入infogoods_namegoods_urlgoods_typegoods_channelgoods_channel_sp_id
校验trans.trans_mode如果修改了买家redis中的trans_mode必须为纯网关
trans的赋值给info的
buyer_fee_account必须存在(查DB)
如果是预下单if (cm == pre_mode_to_create_trans) {
啥意思?
校验双边trans_mode如果修改了买家,trans_mode必须修改
传入的trans_mode必须是非纯网关
switch (info.can_modify)要么传入,要么默认cannot
为啥?buyer和trans_mode有什么关联?
info.share_profit_type = info.SHARE_PROFIT_TYPE_REALTIME如果有分润方案默认使用实时分润
has_share_profit_solution
获取redis重入keyredis_key = cmd_trans_id_ext_logid;
校验以下信息必须一致商品信息:goods.goods_name/url/type结算信息:settlement.fee_amount/fee_account/channel_id/settlement_type买家信息:buyer_fee_amount/buyer_fee_account
给trans_id赋值如果redis里面有,直接用如果redis里没有库里有。用库里的如果redis和库里都没有,生成info.trans_id = trans_id_in_redis;
声明本地变量roll_info_t roll;TransArgTable trans_arg_table;trans_arg_table.is_multi_commit = true;
if ((has_share_profit_solution || is_entrust_billing_solution)&& (info.SETTLEMENT_TYPE_REALTIME != info.settlement_type))前只有实时结算才支持分润或者分账
如果是普通分账
check_up_merchant_info
0
赋值给pay_solution_amountinfo.pay_solution_amount = solution_info.pay_trans_solution().get_total_amount();
buyer_fee_account != info.buer收益账户不与买家相同
为啥不是委托分账才写
从in_pack读入info.fee_account.user_idinfo.fee_account.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT(1)info.fee_account.currency = info.buyer.currency
has_read_channel_id?
buyer_fee_account收益账户必须是C账户
从In_pack读取付款以及分润方案信息,放入solution_infopay_trans_solutionshare_profit_solution设置has_pay_trans_solution、has_share_profit_solution
依据info.trans_id_ext从redis中查询trans_id,放入trans_id_in_redis,并设置in_redis
if (0 != info.coupon_amount)目前不支持coupon_amount,所以coupon_amount一定要为0
service_exception
根据info.trans_id加载trans_info1)如果并行支付为多入则以info.trans_id和solution_type=SOLUTION_TYPE_PAY_TRANS(1)查询t_trans_solution并放入trans_solution.pay_trans_solution2)如果并行支付为多出
为啥非重入就异常
0 or 1
从in_pack读取create_mode,放入cm
抛异常PAY_ERR_TRANS_ALREADY_CREATED
永远都不允许改的交易单信息
fee_account必须存在(查DB)
in_redis如果缓存里面有
分润总金额不能大于分润前支付给卖家的金额if (solution_info.share_profit_solution().get_total_amount() (info.get_total_cash_amount() - info.fee_amount))
校验info.trans_mode如果修改了买家输入的trans_mode不能还是纯网关
有can_modify为CAN_MODIFY_ALL可以改的信息
has_pay_trans_solution如果传入有付款方案
去DB中查询是info.trans_id_ext去否存在如存在,将trans_id放入info.trans_id设置is_used
is_used判断是否库中已有trans_id_ext
如果传入付款方案分润方案,则赋值给本地变量,if (has_pay_trans_solution/has_share_profit_solution) {trans_solution.pay_trans_solution/share_profit_solution = solution_info.pay_trans_solution/share_profit_solution;
ub_log_pushnotice(\"sp_id\
库中已有记录且传入不可修改if (is_used && (info.TRANS_CANNOT_MODIFY == info.can_modify))
根据info.trans_id锁表读取trans表并放入transtrans.state不能为create
异常PAY_ERR_TRANS_ALREADY_CREATED
从in_pack读入info.buyer_fee_account.user_idinfo.buyer_fee_account.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT(1)info.buyer_fee_account.currency = info.buyer.currency
info.coupon_strategy_id = trans.coupon_strategy_id + 1
初始化一些值bool is_modified = false;info.state = info.TRANS_STATE_CREATED;info.share_profit_flag = info.SHARE_PROFIT_FLAG_UNDO;
0 条评论
下一页
为你推荐
查看更多