@Wahson
2020-09-01T10:45:05.000000Z
字数 9796
阅读 472
Wanbo
充值流程:
导入银行流水 => 流水认领选择账户充值 => 新建充值申请 => 充值申请审核(自动) => 生成账户充值流水 => 增加账户余额
提现流程:
新建提现申请 => 提现申请审核 => 审核成功 => 冻结账户金额 => 生成付款指令 => 付款指令流程 => 导入银行流水 => 流水认领选择账户提现 => 选择充值申请(根据公司名称自动匹配) => 关联充值申请 => 生成解冻流水 => 生成账户提现流水
取消提现申请:
审核前,可取消提现申请
use crm_db;
create table company_account
(
id bigint not null primary key auto_increment,
company_id bigint not null comment '公司id',
-- type smallint(2) default 1 not null comment '账户类型,1:资金账户(CAPITAL);2:贷款账号(CREDIT);3:预付账户(PREPAY)',
-- 可用金额 = 账户余额 - 冻结余额
balance decimal(13, 2) default 0.00 not null comment '账户余额',
frozen_balance decimal(13, 2) default 0.00 not null comment '账户冻结余额',
-- 用途,预设密码?
-- uniq_hash varchar(32) not null comment 'MD5( concat(''预设密码'', company_id, balance,frozen_balance,updated_at,updated_by) )',
created_at timestamp default current_timestamp() not null,
created_by int default 0 not null,
updated_at timestamp default current_timestamp() not null,
updated_by int default 0 not null,
remark varchar(255) null comment '备注',
constraint vr_2_company foreign key (company_id) references company (id)
) engine = innoDb
charset = utf8mb4 comment '公司账户';
create table account_journal
(
id bigint auto_increment primary key,
company_account_id bigint not null comment '公司账号id',
company_id int(10) not null comment '公司id',
bank_journal_id bigint default null comment '银行流水id',
account_apply_id bigint default null comment '提现/充值申请id, 业务类型为提现或充值时有值',
-- order_payment_id bigint default null comment '订单支付记录id, 业务类型为订单货款时有值',
trans_type smallint(2) default 1 not null comment '交易类型,1:收入(income);2:支出(expenditure);3:冻结(freeze);4:解冻(unfreeze);',
business_type smallint(2) default 10 not null comment '业务类型,10:提现(withdrawal);20:充值(recharge);30:订单货款(order_payment);40:拍卖(auction);90:其他(other)',
amount decimal(13, 2) not null comment '流水金额',
last_balance decimal(13, 2) default 0.00 null comment '上一次金额',
-- balance decimal(13, 2) not null comment '操作后的人民币余额',
-- frozen_balance decimal(13, 2) not null comment '操作后的人民币冻结余额',
-- freeze_status smallint(1) null comment '冻结状态,1:已解冻(THAW);2:冻结中(FROZENIN);3:部分解冻(PARTIALFROZENIN)',
-- freeze_relate_journal int(10) null comment '冻结关联流水',
-- freeze_balance decimal(10, 2) null comment '冻结余额(随解冻而变化)',
-- transaction_id int default 0 not null comment '全局事务编号',
-- transaction_sequence int default 0 not null comment '事务过程序号',
-- rollback_status smallint(1) default 0 null comment '0:未回滚,1:已回'
created_at timestamp default current_timestamp() not null,
created_by int default 0 not null,
updated_at timestamp default current_timestamp() not null,
updated_by int default 0 not null,
remark varchar(255) null comment '备注'
) engine = innoDb
charset = utf8mb4 comment '公司账户变更流水';
create table account_application
(
id bigint auto_increment primary key,
company_id bigint not null comment '公司ID',
company_name varchar(100) not null comment '公司名称',
-- customer_id int null comment '客户ID',
-- account_type smallint(1) default 1 not null comment '账户类型, 1:资金账户(CAPITAL);2:贷款账号(CREDIT);3:预付账户(PREPAY)',
type smallint(2) default 1 not null comment '申请类型,1:提现(withdraw);2:充值(recharge)',
status smallint(2) default 1 not null comment '状态,10:待审核(to_be_audited);20:已审核(audited);30:已完成(finished);90:已取消(canceled)',
amount decimal(10, 2) not null comment '金额',
bank_journal_id bigint default null comment '银行流水id',
# 冗余字段,来源银行流水表 bank_journal
# platform_account varchar(32) null comment '平台银行账号',
# platform_account_name varchar(64) not null comment '平台银行户名',
# bank_account varchar(32) null comment '收付款银行账号',
# bank_account_name varchar(64) not null comment '收付款银行户名',
audited_at datetime null comment '审核时间',
audited_by int(10) null comment '审核人',
-- confirmed_at datetime null comment '确认时间',
-- confirmed_by int(10) null comment '确认人',
created_at timestamp default current_timestamp() not null,
created_by int default 0 not null,
updated_at timestamp default current_timestamp() not null,
updated_by int default 0 not null,
remark varchar(255) null comment '备注',
constraint aa_2_company foreign key (company_id) references company (id)
) engine = innoDb charset = utf8mb4 comment '充值申请';
原子方法:
createCompanyAccountApply
createCompanyAccountJournal
createCompanyAccount
// 增加账号余额
increaseAccountBalance(incr_amount) {
更新balance
createCompanyAccountJournal(type)
}
// 减少账号余额
decreaseAccountBalance(decr_amount) {
更新balance
createCompanyAccountJournal(type)
}
// 增加账号冻结余额
increaseAccountFrozenBalance {
更新frozen_balance
createCompanyAccountJournal(type)
}
// 减少账号冻结余额
decreaseAccountFrozenBalance {
更新frozen_balance
createCompanyAccountJournal(type)
}
// 充值审核
auditRecharge {
更新状态为已审核
increaseAccountBalance(充值)
}
// 提现审核
auditWithdrawal {
更新状态为已审核
increaseAccountFrozenBalance(提现)
// TODO:生成付款指令
}
// 充值/提现申请完成
finishAccountApply {
更新状态为已完成
if(提现) {
更新bank_journal_id
decreaseAccountFrozenBalance(提现)
decreaseAccountBalance(提现)
}
}
cancelWithdrawal {
// 审核前可操作
更新状态未已取消
}
新建充值:
createRecharge {
修改流水记录
createCompanyAccountApply
auditRecharge
finishWithdrawal
}
提现:
createWithdrawal {
createCompanyAccountApply
}
运营系统新建标的,关联采购单,填写牌号,拍卖数量,起拍价,起拍数量等,提交审核
审核通过,等待拍卖开始
出价、竞价:
检查:
- 检查客户拍卖资格(授权客户)??? 检查规则?有绑定公司,同时是该公司的授权拍卖客户
- 标的状态为已审批
- 标的开始拍卖时间 < 当前时间 < 标的实际结束时间
- 起拍数量 <= 竞拍数量 <= 拍卖总数量 && (拍卖数量 - 起拍数量) % 数量增幅 == 0
- 本次出价 >= 起拍价 && (本次出价 - 起拍价) % 加价幅度 == 0
- 本次出价 >= 最近一次出价(当前价格)
- 最多只允许出现3次价格相同的出价
- 本次出价 > 当前用户上一次出价
- 出价与当前价格相同时,与当前价格相同的出价记录总数量 + 当前竞竞拍数量 <= 拍卖总数量
- 当前用户出价,冻结用户保证金,保证金不足不允许出价
- ???需冻结保证金 = 0元竞拍(起拍价 = 0):保证金比例 * (保证金基础值 * 竞拍数量), 普通竞拍:保证金比例 * (竞拍金额 * 竞拍吨数)
- 在竞拍结束最后2分钟,如果出价成功,竞拍结束时间顺延2分钟
中标逻辑: (定时器到拍卖结束统一计算)
- 出价 >= 起拍价
- 竞拍数量 >= 起拍数量
- 中标数量 = min(拍卖总数量, 竞拍数量)
- 价格、数量都满足条件下,按照出价时间,优先满足较晚出价的
- 未中标的,解冻保证金,(扣减账户冻结金额,生成解冻流水)
- 中标的,何时解冻保证金???(需要区分中标吨数与未中标吨数)
- 中标后,订单违约处理流程???
订单何时确认:???
-- 拍卖
create table auction_target
(
id bigint auto_increment primary key,
purchase_item_id bigint not null comment '采购子单id',
delivery_type smallint(2) not null comment '送货方式, 10:自提(self_pick);20:供应商配送(supplier_deliver);30:万博配送(wanbo_deliver)',
product_id int not null,
category varchar(12) not null comment '产品分类',
designation varchar(32) not null comment '产品牌号',
manufacturer_id int not null comment '生产商ID',
manufacturer_name varchar(32) not null comment '生产商名称',
supplier_company_id int not null comment '供应商id',
supplier_company_name varchar(32) not null comment '供应商名称',
warehouse_id int not null comment '发货仓库id',
warehouse_name varchar(32) not null comment '发货仓库名称',
status smallint(1) default 1 null comment '状态(1:预提交,2:待审核,3:已审核 4:拍卖中,5:拍卖完成,6:流拍,9:审核不通过,10:取消)',
starting_price decimal(13, 2) default 0.00 not null comment '起拍价',
-- market_price decimal(13, 2) null comment '市场评估价',
weight decimal(8, 3) default 0.000 not null comment '拍卖总吨数',
starting_weight decimal(8, 3) not null comment '起拍吨数',
price_increment decimal(10, 2) not null comment '加价幅度',
weight_increment decimal(8, 3) not null comment '数量增幅(最小变量单位或每次增加吨数)',
-- auction_type smallint(1) default 1 not null comment '竞拍方式,1:升价(priceRise);2:降价(priceCut )',
deposit_ratio decimal(3, 3) not null comment '保证金比例',
-- basic_deposit decimal(10, 2) null comment '保证金基础值',
-- publicity_start_at datetime not null comment '开始公示时间',
auction_start_at datetime not null comment '开始拍卖时间',
expected_auction_end_at datetime not null comment '预定结束拍卖时间',
actual_auction_end_at datetime null comment '实际拍卖结束时间',
-- 期货交货时间?
-- delivery_time datetime null comment '发货时间',
-- trade_addr varchar(50) null comment '交易地点',
-- weight_left decimal(13, 3) null comment '剩余吨数',
is_future smallint(1) default 0 not null comment '是否期货 0为false, 1为true',
execute_start_at date null comment '送货/交付日期开始',
execute_end_at date null comment '送货/交付日期结束',
audited_at datetime null comment '审核时间',
audited_by int(10) null comment '审核人',
created_at timestamp default current_timestamp() not null,
created_by int default 0 not null,
updated_at timestamp default current_timestamp() not null,
updated_by int default 0 not null,
remark varchar(255) null comment '备注'
) engine = innoDb
charset = utf8mb4 comment '拍卖标的';
create table auction_bid_record
(
id int(10) auto_increment
primary key,
wx_user_id int(10) not null comment '用户id',
company_id int(10) not null,
auction_target_id int(10) not null comment '竞拍标的ID',
price_before_bid decimal(10, 2) default 0.00 not null comment '拍前价格',
-- after_price decimal(10, 2) not null comment '拍后价格',
bid_price decimal(10, 2) not null comment '出价',
weight decimal(8, 3) not null comment '拍卖吨数',
actual_weight decimal(8, 3) default 0.000 not null comment '实际中标吨数(为0则为出局)',
-- account_journal_id int(10) not null comment '账户资金变动流水ID',
-- margin decimal(10, 2) default 0.00 not null comment '冻结保证金',
auction_at datetime not null comment '出价时间',
created_at timestamp default current_timestamp() not null,
created_by int default 0 not null,
updated_at timestamp default current_timestamp() not null,
updated_by int default 0 not null,
remark varchar(255) null comment '备注',
constraint bid_records_fk_target_id
foreign key (auction_target_id) references auction_target (id)
) engine = innoDb
charset = utf8mb4 comment '出价记录';
-- auto-generated definition
# create table auction_purchase_items
# (
# id int auto_increment
# primary key,
# target_id int not null comment '标的id',
# purchase_item_id int not null comment '采购子单id',
# weight decimal(10, 3) not null comment '分配重量',
# created_by int null,
# created_at datetime null,
# updated_by int null,
# updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP
# )
-- auto-generated definition
# create table auction_target_summaries
# (
# id int(10) auto_increment
# primary key,
# target_id int(10) not null comment '竞拍标的ID',
# wined_count int(10) not null comment '中标人数',
# bid_count int(10) not null comment '投注人数',
# bid_times int(10) not null comment '投注次数',
# weight decimal(8, 3) not null comment '成交吨数',
# amount decimal(10, 2) not null comment '成交金额',
# max_price decimal(10, 2) not null comment '最高价',
# min_price decimal(10, 2) not null comment '最低价',
# constraint target_summary_fk_target_id
# foreign key (target_id) references auction_target (id)
# ) engine = innoDb charset = utf8mb4 comment '竞拍商品摘要';
-- auto-generated definition
create table auction_won_record
(
id int(10) auto_increment
primary key,
company_id bigint not null comment '公司id',
auction_bid_record_id bigint not null comment '出价记录',
auction_target_id bigint not null comment '标的id',
price decimal(10, 2) not null comment '中标价',
weight decimal(8, 3) not null comment '中标数量',
total_amount decimal(10, 2) not null comment '中标金额',
-- order_no varchar(32) not null comment '关联销售订单号',
-- status smallint(1) not null comment '状态(1:待确认,2:成功,3:违约,4:违约已处理)',
created_at datetime not null,
created_by int(10) null comment '创建人,只能是StaffID',
updated_at timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
updated_by int(10) null comment '更新人,只能是StaffID',
constraint wined_record_fk_bid_record_id
foreign key (auction_bid_record_id) references auction_bid_record (id),
constraint wined_record_fk_target_id
foreign key (auction_target_id) references auction_target (id)
) engine = innoDb
charset = utf8mb4 comment '中标记录';
结算:
先按暂定价结算付款,后面按月平均价得出最终结算价,多付部分摞到后续订单,少的部分补付。资金利息如何计算?按照目前数据模型,认领后,需要修改成本重新认领