general_create_trans_flowchart
2016-03-09 13:06:13 0 举报
`general_create_trans_flowchart`是一个功能或方法,用于创建通用的事务流程图。这个流程图可能包括一系列步骤,每个步骤都代表事务中的一个操作或过程。通过使用此功能,用户可以更清晰地理解和可视化他们的业务流程,以便更好地管理和优化这些流程。这可以应用于各种场景,如项目管理、软件开发、业务流程改进等。总的来说,`general_create_trans_flowchart`是一个强大的工具,可以帮助用户更好地理解和控制他们的业务流程。
作者其他创作
大纲/内容
delete
异常PAY_ERR_MYSQL_DUPKEY_INSERT
N
if (cm == create_trans_by_allocated_trans_id)如果利用预生成交易单创建交易单
用此trans_id从库里加载trans交易表赋值给本地变量trans
check_last_try_pay_time
in_pack中是否传入trans_id
从in_pack读取买家属性,放入info.buyeruser_idlogin_nametrue_namecurrency赋默认值info.buyer.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT
Y
TRANS_CAN_MODIFY_GATEWAY_INFO
info.is_probably_reentry = true;return;
fee_account != info.seller收益账户不与卖家相同
目前只有中介和直付交易才支持多进并行支付类型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?
judge_repeat_pay判断state是否为create
校验以下信息必须一致trans_typepayment_modesellersp_idshare_profit_flag必须为未分润
本次传入为纯网关交易info.TRANS_MODE_GATEWAY == info.trans_mode
使用info填充SQLObjecttrans_create_info_to_sql_object
seller是customer或者merchantuser_id分布规则
如果库中没有,则insert如果库中与传入的不符或就方案无效,则update
如果传入和redis中的trans_mode一致即都是非纯网关
补充trans_log的其它字段F_state_before,F_user_idglobal_instance::service_code().get_service_code
本地变量trans_info trans;trans_solution_info trans_solution;
如果传入了平台商户if (info.up_merchants().get_merchant_amount() 0)
fee_account收益账户必须是C账户
if (0 info.coupon_strategy_id)
如果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_ALL
has_client_source_flag_create
没看明白干啥呢?为啥?
啥叫就方案无效parallele_type到底咋用的
库中是否有对应的商户交易单if (info.has_merchant_trans)
写trans_query如果是纯网关,insert t_trans_query_special_seller如果不是,insert t_trans_query
手续费不能大于交易总现金金额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;
根据info.trans_id及info.seller.user_id加锁查询商户交易表t_merchant_trans,并放入merchant_trans(handle函数本地)并设置info.has_merchant_trans
各个金额含义
=1
is_modified = true;
写trans_id_map
如果是新订单且为委托分账if (is_entrust_billing_solution && !is_used)
从in_pack读入上层商户信息,放入infoup_merchant_info设置has_up_merchant
如果传入分润方案则分润类型不可为无
buyer是customer或者merchantuser_id分布规则
ub_log_pushnotice(\"sp_id\
数据库有的话用数据库的,否则调用billNo新生成一个trans_id_in_redis = is_used ? info.trans_id : trans_id_client_.info_bill_no(
is_full_match
buyer必须相同
用库中平台商户信息覆盖传入的info.up_merchants = merchant_trans.up_merchants;
校验trans_mode买家相同时trans_mode必须一致
如果传入了分润信息share_profit_type则传入的必须与库里的一致
handle_cannot_modify_scenario(is_reentry=false)
检查平台商户传入是否正确
计算并行支付类型,放入info.parallel_type1)如传入有付款方案,10102)如传入有分润或分账方案,01013)啥都没有,0000
直接使用传入的trans_id此种创建模式要求必须传入trans_idinfo.trans_id = trans_id;
平行支付为多出且分账类型为普通分账
从in_pack读取交易属性,放入infotrans_id_exttrans_typetrans_tagcan_modifytrans_mode从模板获取payment_mode,放入info
info.coupon_strategy_id = trans.coupon_strategy_id
校验一下信息必须一致trans_modebuyer.login_name/user_id/sub_account_type/currency
校验trans.trans_mode如果修改了买家redis中的trans_mode必须为纯网关
compare_non_modifiable_trans_info比较缓存中的与传入的交易信息最严格必须一致的部分
switch (info.can_modify)要么传入,要么默认cannot
为啥?buyer和trans_mode有什么关联?
has_share_profit_solution
获取redis重入keyredis_key = cmd_trans_id_ext_logid;
给trans_id赋值如果redis里面有,直接用如果redis里没有库里有。用库里的如果redis和库里都没有,生成info.trans_id = trans_id_in_redis;
modify_trans将修改过滤过的传入的info与solution_info存到库中
insert trans_logstate_before = TRANS_STATE_CREATED(1)state_after = TRANS_STATE_CREATED(1)insert到t_trans_log,async
if ((has_share_profit_solution || is_entrust_billing_solution)&& (info.SETTLEMENT_TYPE_REALTIME != info.settlement_type))前只有实时结算才支持分润或者分账
update t_merchant_trans
check_up_merchant_info
0
如果传入了平台商户信息up_merchants则传入的必须与库里的一致
buyer_fee_account != info.buer收益账户不与买家相同
传入的与库中的client_source_flag_create是否一致?
传入有分润方案且分账方案为普通分账if (info.PARALLEL_TYPE_MULTIPLE_OUT_MASK & info.parallel_type&& trans_info::SHARE_TRANS_TYPE_NORMAL == info.share_billing_type)
if (PAY_ERR_MYSQL_DUPKEY_INSERT == ret)
从in_pack读入info.fee_account.user_idinfo.fee_account.sub_account_type = SUB_ACCOUNT_TYPE_DEFAULT(1)info.fee_account.currency = info.buyer.currency
buyer_fee_account收益账户必须是C账户
如果是重入if (true == info.is_probably_reentry)
更新trans_queryt_trans_query,async
为啥比较的是分账类型?
0 or 1
从in_pack读取create_mode,放入cm
将传入的solution_infofu赋值给本地变量trans_solution
抛异常PAY_ERR_TRANS_ALREADY_CREATED
永远都不允许改的交易单信息
分润总金额不能大于分润前支付给卖家的金额if (solution_info.share_profit_solution().get_total_amount() (info.get_total_cash_amount() - info.fee_amount))
has_pay_trans_solution如果传入有付款方案
去DB中查询是info.trans_id_ext去否存在如存在,将trans_id放入info.trans_id设置is_used
is_used判断是否库中已有trans_id_ext
取出第一个商户交易以其信息组成SQLObject
库中已有记录且传入不可修改if (is_used && (info.TRANS_CANNOT_MODIFY == info.can_modify))
根据info.trans_id锁表读取trans表并放入transtrans.state不能为create
从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;
insert trans_logF_state_before = TRANS_STATE_INVALIDF_state_after = TRANS_STATE_CREATED
传入的与redis中的client_source_flag_create是否一致?
is_reentry是否为重入
异常REENTRY_PAY_ERR_BASE_GENERAL_TRANS
有传入新的分润方案时,则需要对以前存在的分润方案作删除处理
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
传入的和redis中的buyer是否相同
buyer_fee_amount != 0
handle_modify_all_scenario
填充SQLObject以info.trans_id和solution_type=SOLUTION_TYPE_SHARE_PROFIT(2)为主键库为t_trans_solution,内容为solution_info.share_profit_solution(传入的)
TRANS_CANNOT_MODIFY
是否传入平台商户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
如果结算类型不匹配,那么就把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
is_modified = true;info.trans_id = trans.trans_id;
info.seller.sub_account_type = SUB_ACCOUNT_TYPE_UNSETTLED(3)卖家使用待结算账户
if (0 != info.fee_amount)只有fee_amount不为0时才需要fee_user_id
TransFunctionRedisHelper::modify_trans将修改过滤过的传入的info放入redis中setex coredb:t_trans_info.trans_id payserver_redis_expire JSON(info)
库里是纯网关交易if (info_in_db.TRANS_MODE_GATEWAY== info_in_db.trans_mode)
如果卖家买家不能hash到同一张表则先条trans_query,t_trans_query_special_buyer,async再更新条trans_query,t_trans_query_special_seller,async
从in_pack读入端信息,放入infoclient_source_flag_create并设置has_client_source_flag_create
DEFAULT
如未传入分润方案,不允许分润类型不为无,且分账类型为普通
same_price
异常PAY_ERR_PARAM_INVALID_COUPON_STRATEGY_ID
如果创建模式为基于预下单记录下单cm == create_trans_by_allocated_trans_id
从in_pack读入卖家信息,放入info.sellersp_iduser_idlogin_nametrue_name设置seller.currency=buyer.currency
info.settlement_type!=realtime为异步结算
更新trans_queryt_trans_query_special_seller,async
global_instance::service_code().get_service_code
填充SQLObject以info.trans_id和solution_type=SOLUTION_TYPE_PAY_TRANS(1)为主键库为t_trans_solution,内容为solution_info.pay_trans_solution(传入的)
insert t_merchant_trans
写交易表insert t_trans
info.channel_id = trans_settlement_info::CHANNEL_ID_DEFAULT(1)
调用BillNo申请新的单号info.trans_id = trans_id_client_.info_bill_no
设置info.create_time
将trans和写入out_pack如果不是委托分账则将trans_solution写入out_pack
如果上一步查到了商户交易表info.has_merchant_trans
从in_pack读入其它MISC信息,放入infoext_time、deadline_time放入info.extrasource_ip、user_mac、comments
委托分账必须实时分润is_entrust_billing_solution && info.share_profit_type != SHARE_PROFIT_TYPE_REALTIME
卖家买家user_id不同
即在redis里又在库里,且判断trans_id是否一致if (is_used && in_redis && trans_id_in_redis != info.trans_id)
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
如果库里没有分润方案,或者不等于传入的分润方案,则插入或更新
传入有付款方案info.parallel_type & info.PARALLEL_TYPE_MULTIPLE_IN_MASK
redis的trans的赋值给传入的info的
buyer_fee_account必须存在(查DB)
如果是预下单if (cm == pre_mode_to_create_trans) {
传入的平台商户大于0家
啥意思?
校验双边trans_mode如果修改了买家,trans_mode必须修改
传入的trans_mode必须是非纯网关
info.share_profit_type = info.SHARE_PROFIT_TYPE_REALTIME如果有分润方案默认使用实时分润
如果有付款方案,则写付款方案insert t_trans_solutionsolution_type = SOLUTION_TYPE_PAY_TRANS
校验以下信息必须一致商品信息:goods.goods_name/url/type结算信息:settlement.fee_amount/fee_account/channel_id/settlement_type买家信息:buyer_fee_amount/buyer_fee_account
声明本地变量roll_info_t roll;TransArgTable trans_arg_table;trans_arg_table.is_multi_commit = true;
如果是普通分账
赋值给pay_solution_amountinfo.pay_solution_amount = solution_info.pay_trans_solution().get_total_amount();
为啥不是委托分账才写
如果库里没有付款方案,或者不等于传入的付款方案,则插入或更新
库的trans的赋值给传入的info的
has_read_channel_id?
没有传入新的付款方案时,则需要对以前存在的付款方案作删除处理
如果有分润方案,则写分润方案insert t_trans_solutionsolution_type = SOLUTION_TYPE_SHARE_ENTRUST/SOLUTION_TYPE_SHARE_PROFIT
从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
t_trans_query按trans_id分库分表t_trans_query_special_seller按seller_user_idt_trans_query_special_buyer按buyer_user_id
if (0 != info.coupon_amount)目前不支持coupon_amount,所以coupon_amount一定要为0
根据info.trans_id加载trans_info1)如果并行支付为多入则以info.trans_id和solution_type=SOLUTION_TYPE_PAY_TRANS(1)查询t_trans_solution并放入trans_solution.pay_trans_solution2)如果并行支付为多出,且为委托分账则以info.trans_id和solution_type=SOLUTION_TYPE_SHARE_ENTRUST(5)查询t_trans_solution并放入trans_solution.share_profit_solution3)如果并行支付为多出,且不为委托分账则以info.trans_id和solution_type=SOLUTION_TYPE_SHARE_PROFIT(2)查询t_trans_solution并放入trans_solution.share_profit_solution
为啥非重入就异常
为支持可重入设置reidis主键 setex payserver_reentry_redis_expire(300) redis_key(cmd(create_direct_trans)_info.trans_id_ext_logid)
fee_account必须存在(查DB)
in_redis如果缓存里面有
校验info.trans_mode如果修改了买家输入的trans_mode不能还是纯网关
有can_modify为CAN_MODIFY_ALL可以改的信息
handle_modify_gateway_scenario
如果传入付款方案分润方案,则赋值给本地变量,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;
异常PAY_ERR_TRANS_ALREADY_CREATED
0 条评论
下一页
为你推荐
查看更多