[ 'type_name' => '门店结算', 'type_url' => '', ], 'refund' => [ 'type_name' => '订单退款', 'type_url' => '', ], 'withdraw' => [ 'type_name' => '提现', 'type_url' => '', ], ]; /** * 获取门店转账设置 */ public function getStoreWithdrawConfig($site_id) { $config = new Config(); $res = $config->getStoreWithdrawConfig($site_id); return $res; } /** * 获取门店待结算订单金额 */ public function getWaitSettlementInfo($store_id) { $money_info = model('order')->getInfo([ ['store_id', '=', $store_id], ['order_status', '=', 10], ['store_settlement_id', '=', 0] ], 'sum(order_money) as order_money, sum(refund_money) as refund_money, sum(shop_money) as shop_money, sum(platform_money) as platform_money, sum(refund_shop_money) as refund_shop_money, sum(refund_platform_money) as refund_platform_money, sum(commission) as commission'); if (empty($money_info) || $money_info == null) { $money_info = [ 'order_money' => 0, 'refund_money' => 0, 'shop_money' => 0, 'platform_money' => 0, 'refund_shop_money' => 0, 'refund_platform_money' => 0, 'commission' => 0 ]; } return $money_info; } /** * 门店账户记录操作 * @param $params */ public function addStoreAccount($params) { $site_id = $params['site_id']; $store_id = $params['store_id']; $account_data = $params['account_data']; $remark = $params['remark']; $from_type = $params['from_type']; $related_id = $params['related_id']; $is_limit = $params['is_limit'] ?? 1;//是否限制不能小于0 model('store_account')->startTrans(); try { //账户检测 $store_account = Db::name('store')->where([ ['store_id', '=', $store_id], ['site_id', '=', $site_id] ])->field('account')->lock(true)->find(); $account_new_data = round((float)$store_account['account'] + (float)$account_data, 2); if ($is_limit == 1 && (float)$account_new_data < 0) { model('store_account')->rollback(); $msg = '账户余额不足'; return $this->error('', $msg); } //添加记录 $type_info = $this->from_type[$from_type]; $data = array( 'site_id' => $site_id, 'store_id' => $store_id, 'account_data' => $account_data, 'from_type' => $from_type, 'type_name' => $type_info['type_name'], 'create_time' => time(), 'remark' => $remark, 'related_id' => $related_id, ); model('store_account')->add($data); //账户更新 model('store')->update(['account' => $account_new_data], [ ['store_id', '=', $store_id] ]); model('store_account')->commit(); return $this->success(); } catch (\Exception $e) { model('store_account')->rollback(); return $this->error('', $e->getMessage()); } } /** * 获取账户分页列表 * @param array $condition * @param int $page * @param int $page_size * @param string $order * @param string $field * @return array|\multitype */ public function getStoreAccountPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc,id desc', $field = '*', $alias = 'a', $join = []) { $list = model('store_account')->pageList($condition, $field, $order, $page, $page_size, $alias, $join); return $this->success($list); } /** * 获取账户列表 * @param array $condition * @param string $field * @param string $order * @param null $limit * @return array|\multitype */ public function getStoreAccountList($condition = [], $field = '*', $order = '', $limit = null) { $list = model('store_account')->getList($condition, $field, $order, '', '', '', $limit); return $this->success($list); } /*** * 获取门店分账 * @param $data * @return void */ public function getOrderAccounts($order_info = []) { if (isset($order_info['store_id'])) { $store_id = $order_info['store_id']; $config = new Config(); $configInfo = $config->getStoreWithdrawConfig($order_info['site_id'])['data']['value']; if ($configInfo['is_settlement'] == 1) { $store_info = model('store')->getInfo([['store_id', '=', $store_id]], '*'); if (!$store_info['aliapy_auto_settlement']) return []; $settlement_rate = $configInfo['settlement_rate']; if ($store_info['settlement_rate'] == 1) { $settlement_rate = $store_info['settlement_rate']; } $bank_type = $store_info['bank_type']; $order_money = $order_info['order_money']; //todo 可能还有退款 $settlement_cost = $configInfo['settlement_cost']; $settlement_cost_array = explode(',', $settlement_cost); $base_money = $order_money; $base_money -= $order_info['refund_money'] ?? 0;//todo 这儿涉及到一个问题,退款的金额里面包含一部分余额,可能结算金额不太一致 $base_money = $base_money < 0 ? 0 : $base_money; if (in_array('balance', $settlement_cost_array)) { $balance_money = $order_info['balance_money']; $base_money -= $balance_money; } if (in_array('point', $settlement_cost_array)) { $point_money = $order_info['point_money']; $base_money += $point_money; } if (in_array('fenxiao_commission', $settlement_cost_array)) { $commission = $order_info['commission']; $base_money -= $commission; } //优惠券比较特殊, 不过不扣除要价格优惠券抵扣金额加回去 if (!in_array('coupon', $settlement_cost_array)) { $coupon_money = $order_info['coupon_money']; $base_money += $coupon_money; } if ($base_money > 0) { $amount = $base_money * $settlement_rate / 100; //默认抽佣 $account = []; if ($bank_type == 2) { $acc = [ 'site_id' => $order_info['site_id'], 'ag_site_id' => 0, 'is_platform' => 5, 'order_id' => $order_info['order_id'], 'member_id' => $order_info['member_id'], 'out_trade_no' => $order_info['out_trade_no'], 'trade_no' => $order_info['trade_no'] ?? '', //订单号 'is_video_number' => $order_info['is_video_number'] ?: 0, 'fee_commission' => $settlement_rate, //佣金比例 'pay_money' => $order_info['pay_money'],//支付金额, 'amount' => $amount, 'account_type' => 'loginName', //授权账号类型 loginName登录账号 userId 商户PID 'channel_type' => $order_info['order_from'], 'promotion_type' => $order_info['promotion_type'], 'reason' => '门店利润分账', 'realname' => $store_info['bank_user_name'], 'account' => $store_info['bank_type_account'], ]; $account[] = $acc; return $account; } } } } } }