Commit dc61a339 authored by wanjilong's avatar wanjilong

init pay_v2

parent b25c109e
<?php
namespace App\Exception\custom;
use App\Exception\BaseException;
class RefundException extends BaseException
{
protected $base_code = Code::REFUND;
protected $cus = [
0 => '系统异常请联系管理员',
1 => '缺少退款订单ID!',
2 => '获取订单信息返回错误,请核对',
3 => '仅支持自己操作订单退款!',
4 => '目前仅支持支付后的订单退款,请核对',
5 => '已核销计算订单不支持退款!',
6 => '退款处理完成,请勿重复申请',
7 => '退款处理中请稍等',
8 => '退款消息类型匹配失败,请管理员关注!',
9 => 'pingxx退款消息格式错误,请管理员关注!',
10 => 'pingxx退单状态异常,请管理员关注!',
11 => 'pingxx退单缺少matadata!',
12 => 'pingxx未支付订单不允许退款。',
13 => 'pingxx订单可能存在多次成功支付,需人工确认处理。',
14 => '不存在满足条件的退款订单。',
15 => '订单未支付或不存在,请核对。',
16 => '订单退款回调处理失败,请核对。',
];
}
<?php
namespace App\Exception\custom;
use App\Exception\BaseException;
class FundsException extends BaseException
{
protected $base_code = Code::FUNDS;
protected $cus = [
0 => '系统异常请联系管理员',
1 => '缺少渠道平台账户配置,请联系管理员!',
];
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
use App\Exception\custom\PayException;
class PayOrder extends MysqlBase
{
const TABLE_NAME = 'pay_order';
const CONFIG_INDEX = 'pay';
/**
* @param $order_id
* @param $pay_order
* @return array
*/
public static function get_valid_order($order_id, $pay_order) {
self::beginTransaction();
try{
$order = self::getMaster('*', ['order_id'=>$order_id]);
if(empty($order)) {
$cnt = self::insert($pay_order, ['rowCount'=>true]);
if($cnt) {
$order = $pay_order;
}
}
self::commit();
}catch (\PDOException $e) {
self::rollback();
}
return $order;
}
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
use App\Exception\custom\PayException;
class MarketingAccount extends MysqlBase
{
const TABLE_NAME = 'marketing_account';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class MarketingAccountLog extends MysqlBase
{
const TABLE_NAME = 'marketing_account_log';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
use App\Exception\custom\PayException;
class PayOrder extends MysqlBase
{
const TABLE_NAME = 'pay_order';
const CONFIG_INDEX = 'pay';
/**
* @param $order_id
* @param $pay_order
* @return array
*/
public static function get_valid_order($order_id, $pay_order) {
self::beginTransaction();
try{
$order = self::getMaster('*', ['order_id'=>$order_id]);
if(empty($order)) {
$cnt = self::insert($pay_order, ['rowCount'=>true]);
if($cnt) {
$order = $pay_order;
}
}
self::commit();
}catch (\PDOException $e) {
self::rollback();
}
return $order;
}
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
use App\Exception\custom\PayException;
class PayOrder extends MysqlBase
{
const TABLE_NAME = 'pay_order';
const CONFIG_INDEX = 'pay';
/**
* @param $order_id
* @param $pay_order
* @return array
*/
public static function get_valid_order($order_id, $pay_order) {
self::beginTransaction();
try{
$order = self::getMaster('*', ['order_id'=>$order_id]);
if(empty($order)) {
$cnt = self::insert($pay_order, ['rowCount'=>true]);
if($cnt) {
$order = $pay_order;
}
}
self::commit();
}catch (\PDOException $e) {
self::rollback();
}
return $order;
}
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class PlatformFunds extends MysqlBase
{
const TABLE_NAME = 'platform_funds_log';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class PlatformAccount extends MysqlBase
{
const TABLE_NAME = 'platform_account';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class PlatformFunds extends MysqlBase
{
const TABLE_NAME = 'platform_funds_log';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class PlatformAccount extends MysqlBase
{
const TABLE_NAME = 'platform_account';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class PlatformAccountLog extends MysqlBase
{
const TABLE_NAME = 'platform_account_log';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundPlatformRecord extends MysqlBase
{
const TABLE_NAME = 'refund_platform_record';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundOrder extends MysqlBase
{
const TABLE_NAME = 'refund_order';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundOrderItem extends MysqlBase
{
const TABLE_NAME = 'refund_order_item';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundPersonalRecord extends MysqlBase
{
const TABLE_NAME = 'refund_personal_record';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class WriteOffOrder extends MysqlBase
{
const TABLE_NAME = 'writeoff_order';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundOrder extends MysqlBase
{
const TABLE_NAME = 'refund_order';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class RefundOrder extends MysqlBase
{
const TABLE_NAME = 'refund_order';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class WriteOffMerchantRecord extends MysqlBase
{
const TABLE_NAME = 'writeoff_merchant_record';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Models\order\mysql;
use Api\PhpUtils\Mysql\MysqlBase;
class WriteOffPersonalRecord extends MysqlBase
{
const TABLE_NAME = 'writeoff_personal_record';
const CONFIG_INDEX = 'pay';
}
<?php
namespace App\Services\order;
use App\Exception\custom\CodeSpecialException;
use Helpers\Sdk;
class OrderService
{
/**
* @param $orderId
* @param $userId
* 调用内部服务获取用户订单、子单、分润信息
*/
public static function getFullOrderData($order_id) {
$url = config('interface', 'order.order.pay_order');
if (!$url) {
throw new CodeSpecialException("failed" . __METHOD__ );
}
$params = ['order_id'=>$order_id];
return Sdk::call($url, $params);
}
public static function getOrderInfo($order_id, $user_id) {
//pay_order_info
$url = config('interface', 'order.order.pay_order_info');
if (!$url) {
throw new CodeSpecialException("failed" . __METHOD__ );
}
$params = ['order_id'=>$order_id, 'user_id'=>$user_id];
return Sdk::call($url, $params);
}
/**
* @param $order_item_id
* @param $user_id
* @return bool|mixed
* @throws CodeSpecialException
* 获取订单子单信息
*/
public static function getOrderItemData($order_item_id) {
//merchant.account.get_role_list
$url = config('interface', 'order.order.pay_order_item');
if (!$url) {
throw new CodeSpecialException("failed" . __METHOD__ );
}
$params = ['order_item_id'=>$order_item_id];
return Sdk::call($url, $params);
}
}
\ No newline at end of file
<?php
namespace App\Services\wallet;
use App\Exception\custom\CodeSpecialException;
use Helpers\Sdk;
class WalletService
{
/**
* @param $params
* @return bool|mixed
* @throws CodeSpecialException
* 钱包记录同步
*/
public static function send($params) {
$url = config('interface', 'wallet.account.transfer');
if (!$url) {
throw new CodeSpecialException("failed");
}
// 服务增加签名
$appid = \Yaf\Application::app()->getConfig()->get('wallet.appid');
$secret = \Yaf\Application::app()->getConfig()->get('wallet.secret');
$params['time'] = date('Y-m-d H:i:s');
$params['transfer_service_id'] = $appid;
$params['sign'] = self::sign($params, $secret);
return Sdk::call($url, $params);
}
private function sign($params, $secret) {
$sign = md5($params['time'] . $secret);
return $sign;
}
}
\ No newline at end of file
<?php
namespace App\Services\refund;
use Api\PhpServices\Idgen\Idgen;
use Api\PhpUtils\Log\FileLog;
use App\Exception\BaseException;
use App\Models\Dictionary;
use App\Models\order\mysql\PayOrder;
use App\Models\order\mysql\PayOrderClearing;
use App\Models\order\mysql\PayOrderClearingItem;
use App\Models\order\mysql\PayOrderItem;
use App\Models\order\mysql\RefundOrder;
use App\Services\order\OrderService;
use App\Services\pingxx\PingxxService;
use Helpers\Strategy;
use App\Exception\custom\RefundException;
use Yaf\Application;
class RefundService
{
/**
* @param $order_item_id
* @param $user_id
* @throws RefundException
* 发起退款请求
*/
public function do_refund($order_id, $order_item_ids = []) {
if(empty($order_id)) {
throw new RefundException(['cus' => 1]);
}
$data = $this->can_refund($order_id, $order_item_ids);
/*
https://www.pingxx.com/api/%E8%AE%A2%E5%8D%95%20Refunds%20%E9%80%80%E6%AC%BE%E6%A6%82%E8%BF%B0.html
订单退款 paid = true, status = canceled, amount_paid > 0 则表明可以退款
amount_paid 大于 actual_amount 需要最后一单全退。
具体见ping++ 文档
*/
$pay = PingxxService::getInstance()->getOrder($data['pay_order']['third_order_id']);
if(empty($pay['paid']) || $pay['paid'] != true) {
throw new RefundException(['cus' => 12]);
}
// 存在多次支付的场景需要人工介入处理, 修复订单支付金额,退款金额
if($pay['amount_paid'] > $pay['actual_amount']) {
FileLog::error('pay-service: 订单可能存在多次成功支付,需人工确认处理。', json_encode($pay, JSON_UNESCAPED_UNICODE));
throw new RefundException(['cus' => 13]);
}
// 构造退款数据
$refund = [
'id'=>$pay['id'], //pingxx订单ID
'charge'=>$pay['charge'], //pingxx 支付订单ID
'refund_mode' => 'to_source', //默认返回
'charge_amount'=>$data['refund_order']['refund_amount'],
'metadata' => [
'app_id'=>'merchant-c',
'pingxx_id'=>PingxxService::getInstance()->getAppId(),
'environ'=>Application::app()->environ(),
'refund_order_id'=>$data['refund_order']['refund_order_id'],
'order_item_id'=>$data['order_item_id'],
'order_id'=>$order_id,
],
];
try{
$ret = PingxxService::getInstance()->sendRefund($refund);
if(!empty($ret["data"])) {
$edit = ['request_pingxx_success_time'=>date('Y-m-d H:i:s')];
RefundOrder::update($edit, ['refund_order_id'=>$data['refund_order']['refund_order_id']]);
} else {
throw new BaseException(['msg'=>$ret['error']['message'], 'code'=>'2011']);
}
return [
'order_item_id'=>$data['order_item_id'],
'refund_order_id'=>$data['refund_order']['refund_order_id'],
];
}catch (\Exception $e) {
$edit = ['refund_order_status'=>0];
RefundOrder::update($edit, ['refund_order_id'=>$data['refund_order']['refund_order_id']]);
PayOrderItem::update(['refund_order_status'=>0], ['order_item_id'=>$data['order_item_id']]);
throw $e;
}
}
/**
* @param $data
* @return array
* @throws RefundException
* 退款回调
*/
public function call_back($data) {
if (!in_array($data['type'], ['refund.succeeded', 'order.refunded'])) {
return ['error'=>'退款回调类型不正确'];
}
if (empty($data['data']['object'])) {
return ['error'=>'退款回调格式不正确'];
}
$object = $data['data']['object'];
if(empty($object['metadata']['app_id']) || $object['metadata']['app_id'] != "merchant-c") {
//非支付中心发出的订单,需要忽略
return ['error'=>'非merchant渠道订单,不做处理。'];
}
if($data['type'] == 'refund.succeeded') {
$refund_order_id = $object['order_no'];
$refunded = $object['succeed']; //"succeed": true,
} else {
$refund_order_id = $object['merchant_order_no'];
$refunded = $object['refunded'];
}
if($refunded != true) {
return ['error'=>'退款状态不正确,不做处理。'];
}
if(empty($object['metadata']['refund_order_id'])) {
return ['error'=>'退款订单缺少matadata,不做处理。'];
}
if(empty($object['metadata']['order_item_id'])) {
return ['error'=>'退款订单缺少order_item_id,不做处理。'];
}
// 修改状态,锁定业务
RefundOrder::beginTransaction();
$refund_order_id = $object['metadata']['refund_order_id'];
$edit = [
'refund_order_status'=>2, //pingxx回调成功,
'pingxx_callback_success_time'=>date('Y-m-d H:i:s'), //回调成功时间
];
$cnt_r = RefundOrder::update($edit, ['refund_order_id'=>$refund_order_id, 'refund_order_status'=>1]);
$cnt_i = PayOrderItem::update(['refund_order_status'=>2], [
'order_item_id'=>$object['metadata']['order_item_id']
]);
if($cnt_r && $cnt_i) {
RefundOrder::commit();
} else {
RefundOrder::rollback();
}
$refund = RefundOrder::getMaster('*', ['refund_order_id'=>$refund_order_id]);
if($refund['refund_order_status'] != 2) {
throw new RefundException(['cus' => 16]);
}
return ['refund_order_id'=>$refund_order_id];
//不用搞清分核算,是否需要平台记账
}
/**
* @param $where
* @return \Api\PhpUtils\Mysql\MysqlBase|array
* @throws RefundException
* 判断订单是否可退,判断是否存在退款申请
*/
private function can_refund($order_id, $order_item_ids) {
/**
* 业务方自行解决,订单关闭、订单超过时长不允许退款等逻辑
* 支付中心退款判断仅做主单是否支付,主单是否支持退款的判断
*/
$refund_payment = 0;
try{
RefundOrder::beginTransaction();
$pay_order = PayOrder::getMaster('*', ['order_id'=>$order_id]);
if(empty($pay_order)) {
throw new RefundException(['cus' => 15]);
}
$pay_order_items = PayOrderItem::selectMaster('*', ['order_id'=>$order_id]);
if(empty($pay_order_items)) {
throw new RefundException(['cus' => 4]);
}
foreach ($pay_order_items as $item) {
if($item['can_notify_account'] == 1) {
continue; //已结算不允许退款
}
if(in_array($item['refund_order_status'], [1, 2])) {
continue; //退款中、已退款不允许再次申请
}
if(!empty($order_item_ids) && !in_array($item['order_item_id'], $order_item_ids)) {
continue; //部分退款,且不再退款子单列表,不处理
}
$items[] = $item;
$refund_payment += $item['payment'];
}
if(empty($items)) {
throw new RefundException(['cus' => 14]); //
}
//重新计算微信手续费
$cleared_amount = $cleared_tip = 0;
// 计算已退金额、已退手续费 sum(refund_wx_tip), sum(refund_amount)
$list = RefundOrder::selectMaster('*', ['order_id'=>$pay_order['order_id']]);
foreach ($list as $r) {
if($r['refund_order_status'] == Dictionary::REFUND_ORDER_STATUS_UNDO) {
continue;
}
$cleared_amount += $r['refund_amount'];
$cleared_tip += $r['refund_wx_tip'];
}
// 总共手续费
$wx_clear = PayOrderClearing::getMaster('*', [
'order_id'=>$pay_order['order_id'],
'pay_order_id'=>$pay_order['pay_order_id'],
'pay_sub_type'=>406 //三方渠道手续费
]
);
$wx_total_tip = 0;
if($wx_clear) {
$wx_total_tip = $wx_clear['pay_amount'];
}
$wx_tip = Strategy::getWxTip($refund_payment, $pay_order['pay_amount'], $cleared_amount, $wx_total_tip, $cleared_tip);
$refund = [
'refund_order_id'=>$this->gen_refund_order_id($pay_order['user_id']),
'user_id'=>$pay_order['user_id'],
'order_id'=>$pay_order['order_id'],
'refund_order_status'=>1,
'refund_amount'=>$refund_payment,
'refund_wx_tip'=>$wx_tip,
'source_name'=>$pay_order['source_name'],
'extra'=> json_encode(['order_item_id'=>array_column($items, 'order_item_id')]),
];
$cnt = RefundOrder::insert($refund, ['rowCount'=>true]);
if($cnt == 0) {
throw new RefundException(['cus' => 0]);
}
//批量更新子单状态 "user_id" => [2, 123, 234, 54],
PayOrderItem::update(['refund_order_status'=>1], ['order_item_id'=>array_column($items, 'order_item_id')]);
$data = [
'refund_order'=>$refund,
'pay_order'=>$pay_order,
'order_item_id'=>array_column($items, 'order_item_id'),
];
RefundOrder::commit();
}catch (\PDOException $e) {
RefundOrder::rollback();
throw new BaseException(['msg'=>$e->getMessage(), 'code'=>$e->getCode()]);
}
return $data;
}
private function gen_refund_order_id($user_id)
{
$number = substr($user_id, -2);
$ids = $this->get_idgen_id($number, 1);
return array_pop($ids);
}
private function get_idgen_id($number, $count = 1)
{
$number = intval($number);
$res = Idgen::get(appConfig('idgen.partner'), appConfig('idgen.key'), [], [[
"type" => "55c768",
'number' => $number,
"count" => $count]]);
$id = $res['id_datetime']['55c768'] ?? [];
return $id;
}
}
\ No newline at end of file
<?php
namespace App\Services\pay;
use App\Exception\custom\FundsException;
use App\Models\order\mysql\PlatformFunds;
use App\Models\order\mysql\PlatformFundsLog;
class FundsService
{
/**
* @param $data
* @param int $channel
* @param int $source_name
* @param int $service_name
* @throws FundsException
* 渠道账户入账记录
*/
public static function credit($data, $channel = 1, $source_name = 10, $service_name = 1) {
$info = PlatformFunds::getMaster('*',
['channel'=>$channel, 'source_name'=>$source_name, 'service_name'=>$service_name]);
if(empty($info)) {
throw new FundsException(['cus'=>1]);
}
$cnt = PlatformFunds::update([
'total_amount[+]'=>$data['amount'],
'total_tip[+]'=>$data['tip'],
], ['platform_funds_id'=>$info['platform_funds_id']]);
$l_cnt = PlatformFundsLog::insert([
'platform_funds_id'=>$info['platform_funds_id'],
'trade_id'=>$data['order_id'],
'third_order_id'=>$data['third_id'],
'fund_type'=>1,
'amount'=>$data['amount'],
'tip'=>$data['tip'],
], ['rowCount' => true]);
return $l_cnt && $cnt;
}
/**
* @param $data
* @param int $channel
* @param int $source_name
* @param int $service_name
* @throws FundsException
* 渠道账户出账
*/
public static function payOut($data, $channel = 1, $source_name = 10, $service_name = 1) {
$info = PlatformFunds::getMaster('*',
['channel'=>$channel, 'source_name'=>$source_name, 'service_name'=>$service_name]);
if(empty($info)) {
throw new FundsException(['cus'=>1]);
}
$cnt = true;
$cnt = $cnt && PlatformFunds::update([
'total_amount[-]'=>$data['amount'],
'total_tip[-]'=>$data['tip'],
], ['platform_funds_id'=>$info['platform_funds_id']]);
$cnt = $cnt && PlatformFundsLog::insert([
'platform_funds_id'=>$info['platform_funds_id'],
'trade_id'=>$data['order_id'],
'third_order_id'=>$data['third_id'],
'fund_type'=>2,
'amount'=>$data['amount'],
'tip'=>$data['tip'],
], ['rowCount' => true]);
return $cnt;
}
}
\ No newline at end of file
<?php
namespace App\Services\wallet;
use App\Exception\custom\CodeSpecialException;
use Helpers\Sdk;
class WalletService
{
/**
* @param $params
* @return bool|mixed
* @throws CodeSpecialException
* 钱包记录同步
*/
public static function send($params) {
$url = config('interface', 'wallet.account.transfer');
if (!$url) {
throw new CodeSpecialException("failed");
}
// 服务增加签名
$appid = \Yaf\Application::app()->getConfig()->get('wallet.appid');
$secret = \Yaf\Application::app()->getConfig()->get('wallet.secret');
$params['time'] = date('Y-m-d H:i:s');
$params['transfer_service_id'] = $appid;
$params['sign'] = self::sign($params, $secret);
return Sdk::call($url, $params);
}
private function sign($params, $secret) {
$sign = md5($params['time'] . $secret);
return $sign;
}
}
\ No newline at end of file
-- 多单退款
-- 增加字段
ALTER TABLE `pay_order_item` ADD `refund_order_status` tinyint unsigned DEFAULT '0' COMMENT '退款单状态,0 未退款, 1待确认 , 2 已退款' AFTER `order_item_id`;
ALTER TABLE `pay_order_item` ADD `payment` int unsigned DEFAULT '0' COMMENT '子单实付金额,单位分' AFTER `order_item_id`;
-- 收银台二期
-- 增加字段 pay_order.pay_discount + pay_order.pay_amount = order_info.payment
ALTER TABLE `pay_order` ADD `pay_discount` INT NOT NULL DEFAULT '0' COMMENT '抵扣金额,单位分' AFTER `pay_amount`;
-- 初始化数据
update pay_order set pay_discount = 0;
-- 手工刷新数据
select concat('update pay_order_item set payment = ', payment, ' where order_item_id = "', order_item_id, '";') from order.order_item where 1 limit 10;
-- 核销/确认收货表
CREATE TABLE `write_off_order` (
`write_off_order_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'ID',
`user_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'buyerId',
`order_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '订单id',
`write_off_status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '核销状态,0 未核销, 1待确认 , 2 已核销',
`write_off_amount` int unsigned NOT NULL DEFAULT '0' COMMENT '核销金额,单位分',
`notify_account_status` tinyint NOT NULL DEFAULT '0' COMMENT '通知账户系统状态,0未通知,1已通知',
`notify_account_success_time` timestamp NULL DEFAULT NULL COMMENT '通知账户系统成功时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`source_name` tinyint NOT NULL DEFAULT '0' COMMENT '使用方名,1生活圈,2主端',
`extra` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'extra额外自定义字段',
PRIMARY KEY (`write_off_order_id`),
KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='核销订单表';
-- 设置初始值
update pay_order_item set refund_order_status = 0;
-- 平台渠道资金日志表
CREATE TABLE `platform_funds_log` (
`funds_log_id` bigint NOT NULL DEFAULT '0' COMMENT '主键',
`trade_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '支付订单、或退单ID',
`third_order_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '支付唯一ID',
`fund_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '1:入账,2:出账',
`payment` int unsigned NOT NULL DEFAULT '0' COMMENT '支付金额,分',
`amount` int unsigned NOT NULL DEFAULT '0' COMMENT '到账金额,分',
`tip` int NOT NULL DEFAULT '0' COMMENT '手续费,分',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`source_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '使用方名,1生活圈,2主端',
`service_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '服务名字,1生活圈优惠券,'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='平台资金日志表';
-- 连表更新字段
update pay_order_item oi, refund_order ro set oi.refund_order_status = ro.refund_order_status where ro.order_item_id = oi.order_item_id;
-- 平台渠道资金表 后期不建议会有频繁更新,并且不满足业务统计需求(按周、月、日)
CREATE TABLE `platform_account` (
`platform_account_id` varchar(30) NOT NULL DEFAULT '' COMMENT '平台账户ID',
`channel` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '支付渠道类型,1 pingxx',
`source_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '使用方名,1生活圈,2主端',
`service_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '服务名字,1生活圈优惠券',
`total_amount` int unsigned NOT NULL DEFAULT '0' COMMENT '金额',
`total_tip` int unsigned NOT NULL DEFAULT '0' COMMENT '手续费金额',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`platform_account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='平台渠道账户表';
CREATE TABLE `marketing_account` (
`marketing_account_id` varchar(30) NOT NULL DEFAULT '' COMMENT '账户ID',
`source_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '使用方名,1生活圈,2主端',
`service_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '服务名字,1生活圈优惠券,',
`frozen_amount` int unsigned NOT NULL DEFAULT '0' COMMENT '冻结金额',
`receivable_amount` int unsigned NOT NULL DEFAULT '0' COMMENT '可用金额',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`marketing_account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='营销账户表';
CREATE TABLE `marketing_account_log` (
`log_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`marketing_account_id` varchar(30) NOT NULL DEFAULT '' COMMENT '账户ID',
`marketing_id` varchar(30) NOT NULL DEFAULT '' COMMENT '活动ID',
`fund_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '1: 营销冻结 2. 营销出款 3. 营销退款 4. 营销充值 5. 营销划拨',
`trade_id` varchar(30) NOT NULL DEFAULT '' COMMENT '业务ID',
`trade_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '1: 订单ID 2. 订单ID 3. 退单ID 4. 充值ID 5. 划拨ID',
`amount` int unsigned NOT NULL DEFAULT '0' COMMENT '资金额',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='营销消费记录表';
CREATE TABLE `marketing_account_map` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`marketing_account_id` varchar(30) NOT NULL DEFAULT '' COMMENT '账户ID',
`marketing_id` varchar(30) NOT NULL DEFAULT '' COMMENT '活动ID',
`source_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '使用方名,1生活圈,2主端',
`service_name` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '服务名字,1生活圈优惠券,',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='营销账户活动表';
-- 删除字段(临时保留不做删除)
-- ALTER TABLE `refund_order` DROP `order_item_id`;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment