分账 接口 ,后台配置调整

main
鹿和sa0ChunLuyu 2 years ago
parent 582e1771f3
commit 7a52915f4b

@ -8,7 +8,9 @@ const $token = useToken()
const $config = useConfig() const $config = useConfig()
const admin_api = 'Admin' const admin_api = 'Admin'
export const yo = async (data) => await $post({url: `${$config.value.api.url}/api/yo`, data}, true) export const yo = async (data) => await $post({url: `${$config.value.api.url}/api/yo`, data}, true)
export const ProfitsharingTestAction = async (data) => await $post({
url: `${$config.value.api.url}/api/${admin_api}/Profitsharing/test`, data
}, true)
export const UserOrderListAction = async (data) => await $post({ export const UserOrderListAction = async (data) => await $post({
url: `${$config.value.api.url}/api/${admin_api}/UserOrder/list?page=${data.page}`, data url: `${$config.value.api.url}/api/${admin_api}/UserOrder/list?page=${data.page}`, data
}, true) }, true)

@ -10,6 +10,7 @@ import {
ProfitsharingDeleteAction, ProfitsharingDeleteAction,
ProfitsharingListAction, ProfitsharingListAction,
HospitalProfitsharingStatusAction, HospitalProfitsharingStatusAction,
ProfitsharingTestAction,
$response $response
} from '~/api' } from '~/api'
import {h} from "vue"; import {h} from "vue";
@ -22,10 +23,14 @@ const $props = defineProps({
} }
}) })
const profitsharing_status = ref(false) const profitsharing_status = ref(false)
const profitsharing_type = ref(0)
const HospitalProfitsharingStatus = async () => { const HospitalProfitsharingStatus = async () => {
const response = await HospitalProfitsharingStatusAction() const response = await HospitalProfitsharingStatusAction({
hospital: $props.hospital
})
$response(response, () => { $response(response, () => {
profitsharing_status.value = response.data.info.open === 1 profitsharing_status.value = response.data.info.open === 1 || response.data.info.open === 3
profitsharing_type.value = response.data.info.open
}) })
} }
const profitsharing_list = ref([]) const profitsharing_list = ref([])
@ -65,9 +70,6 @@ const profitsharing_columns = [{
}, { }, {
title: '计算公式', title: '计算公式',
key: 'formula' key: 'formula'
}, {
title: '最大分账',
key: 'max'
}, { }, {
title: '描述', title: '描述',
key: 'desc' key: 'desc'
@ -95,11 +97,28 @@ const create_data_default = {
name: '', name: '',
account: '', account: '',
formula: '', formula: '',
max: 0,
desc: '', desc: '',
status: 1, status: 1,
} }
const create_data = ref(JSON.parse(JSON.stringify(create_data_default))) const create_data = ref(JSON.parse(JSON.stringify(create_data_default)))
const test_data = ref({
in_value: 0,
out_value: 0
})
const ProfitsharingTest = async () => {
let data = {
in_value: test_data.value.in_value
}
if (create_show.value) {
data.php = create_data.value.formula
} else {
data.php = update_data.value.formula
}
const response = await ProfitsharingTestAction(data)
$response(response, () => {
test_data.value.out_value = response.data.out_value
})
}
const ProfitsharingCreate = async () => { const ProfitsharingCreate = async () => {
let data = { let data = {
...create_data.value, ...create_data.value,
@ -124,7 +143,6 @@ const update_data_default = {
name: '', name: '',
account: '', account: '',
formula: '', formula: '',
max: 0,
desc: '', desc: '',
status: 1, status: 1,
} }
@ -214,13 +232,19 @@ onMounted(() => {
<n-tag> <n-tag>
<div class="form_tag_wrapper">分账公式</div> <div class="form_tag_wrapper">分账公式</div>
</n-tag> </n-tag>
<n-input class="form_input_wrapper" v-model:value="update_data.formula"></n-input> <n-input :autosize="{
minRows: 10,
maxRows: 10
}" type="textarea" class="form_textarea_wrapper"
v-model:value="update_data.formula"></n-input>
</n-space> </n-space>
<n-space mt-2 align="center"> <n-space mt-2 align="center">
<n-tag> <n-tag>
<div class="form_tag_wrapper">最大分账</div> <div class="form_tag_wrapper">分账测试</div>
</n-tag> </n-tag>
<n-input-number :mix="0" class="form_input_wrapper" v-model:value="update_data.max"></n-input-number> <n-input class="form_input_wrapper" v-model:value="test_data.in_value" placeholder="入参"></n-input>
<n-button @click="ProfitsharingTest()" type="info">计算</n-button>
<n-input class="form_input_wrapper" v-model:value="test_data.out_value" placeholder="测试结果"></n-input>
</n-space> </n-space>
<n-space mt-2 align="center"> <n-space mt-2 align="center">
<n-tag> <n-tag>
@ -272,13 +296,19 @@ onMounted(() => {
<n-tag> <n-tag>
<div class="form_tag_wrapper">分账公式</div> <div class="form_tag_wrapper">分账公式</div>
</n-tag> </n-tag>
<n-input class="form_input_wrapper" v-model:value="create_data.formula"></n-input> <n-input :autosize="{
minRows: 10,
maxRows: 10
}" type="textarea" class="form_textarea_wrapper"
v-model:value="create_data.formula"></n-input>
</n-space> </n-space>
<n-space mt-2 align="center"> <n-space mt-2 align="center">
<n-tag> <n-tag>
<div class="form_tag_wrapper">最大分账</div> <div class="form_tag_wrapper">分账测试</div>
</n-tag> </n-tag>
<n-input-number :mix="0" class="form_input_wrapper" v-model:value="create_data.max"></n-input-number> <n-input class="form_input_wrapper" v-model:value="test_data.in_value" placeholder="入参"></n-input>
<n-button @click="ProfitsharingTest()" type="info">计算</n-button>
<n-input class="form_input_wrapper" v-model:value="test_data.out_value" placeholder="测试结果"></n-input>
</n-space> </n-space>
<n-space mt-2 align="center"> <n-space mt-2 align="center">
<n-tag> <n-tag>
@ -303,8 +333,9 @@ onMounted(() => {
<n-card mt-2 title="分账管理"> <n-card mt-2 title="分账管理">
<div> <div>
<n-alert title="使 - - 退 <n-alert v-if="profitsharing_type !== 3" title="使使 - - 退
需保持开启状态" type="warning"></n-alert> 需保持开启状态" type="warning"></n-alert>
<n-alert v-else title="当前模式为站内分账,下列数据只做展示,后续金额需要手动进行分账。" type="warning"></n-alert>
<n-alert mt-2 v-if="!profitsharing_status" title="请先前往「额外配置」标签开启分账功能" type="error"></n-alert> <n-alert mt-2 v-if="!profitsharing_status" title="请先前往「额外配置」标签开启分账功能" type="error"></n-alert>
<div v-else mt-2> <div v-else mt-2>
<n-space> <n-space>
@ -320,4 +351,7 @@ onMounted(() => {
</div> </div>
</template> </template>
<style scoped> <style scoped>
.form_textarea_wrapper {
width: 300px;
}
</style> </style>

@ -396,7 +396,8 @@ const HospitalExtraUpdate = async (mark) => {
</n-tag> </n-tag>
<n-select class="form_input_wrapper" v-model:value="profitsharing_info.content.open" :options="[ <n-select class="form_input_wrapper" v-model:value="profitsharing_info.content.open" :options="[
{value:2,label:'关闭'}, {value:2,label:'关闭'},
{value:1,label:'开启'}, {value:1,label:'微信分账'},
{value:3,label:'站内分账'},
{value:0,label:'通用',disabled:$props.hospital === 0}, {value:0,label:'通用',disabled:$props.hospital === 0},
]"/> ]"/>
</n-space> </n-space>

@ -97,6 +97,7 @@ class HospitalExtraController extends Controller
]); ]);
} }
public function profitsharing_status(Request $request) public function profitsharing_status(Request $request)
{ {
$hospital = $request->post('hospital'); $hospital = $request->post('hospital');

@ -64,7 +64,6 @@ class ProfitsharingController extends Controller
$type = $request->post('type'); $type = $request->post('type');
$account = $request->post('account'); $account = $request->post('account');
$formula = $request->post('formula'); $formula = $request->post('formula');
$max = $request->post('max');
$desc = $request->post('desc'); $desc = $request->post('desc');
$status = $request->post('status'); $status = $request->post('status');
$p = new Profitsharing(); $p = new Profitsharing();
@ -73,13 +72,34 @@ class ProfitsharingController extends Controller
$p->type = $type; $p->type = $type;
$p->account = $account; $p->account = $account;
$p->formula = $formula; $p->formula = $formula;
$p->max = $max;
$p->desc = $desc; $p->desc = $desc;
$p->status = $status; $p->status = $status;
$p->save(); $p->save();
return Yo::create_echo($p->id); return Yo::create_echo($p->id);
} }
public function eval_action($php, $in_value)
{
$out_value = 0;
if ($php) {
try {
eval($php);
} catch (Exception $e) {
$out_value = 0;
}
}
return $out_value;
}
public function test(Request $request)
{
$php = $request->post('php');
$in_value = $request->post('in_value');
return Yo::echo([
'out_value' => self::eval_action($php, $in_value),
]);
}
public function update(EditProfitsharingsInput $request) public function update(EditProfitsharingsInput $request)
{ {
Login::admin([], [17, 25]); Login::admin([], [17, 25]);
@ -96,14 +116,12 @@ class ProfitsharingController extends Controller
$type = $request->post('type'); $type = $request->post('type');
$account = $request->post('account'); $account = $request->post('account');
$formula = $request->post('formula'); $formula = $request->post('formula');
$max = $request->post('max');
$desc = $request->post('desc'); $desc = $request->post('desc');
$status = $request->post('status'); $status = $request->post('status');
$p->name = $name; $p->name = $name;
$p->type = $type; $p->type = $type;
$p->account = $account; $p->account = $account;
$p->formula = $formula; $p->formula = $formula;
$p->max = $max;
$p->desc = $desc; $p->desc = $desc;
$p->status = $status; $p->status = $status;
$p->save(); $p->save();

@ -40,7 +40,8 @@ class UserOrderController extends Controller
$user_order->save(); $user_order->save();
$hospital_sharing_content = self::sharing_config($user_order->hospital, false); $hospital_sharing_content = self::sharing_config($user_order->hospital, false);
if ($hospital_sharing_content['open'] == 1) { if ($hospital_sharing_content['open'] == 1
|| $hospital_sharing_content['open'] == 3) {
$slc = ProfitsharingLog::where('order', $user_order->id)->first(); $slc = ProfitsharingLog::where('order', $user_order->id)->first();
if (!$slc) { if (!$slc) {
$p = new ProfitsharingController(); $p = new ProfitsharingController();
@ -48,44 +49,50 @@ class UserOrderController extends Controller
$receivers = []; $receivers = [];
$sharing_map = []; $sharing_map = [];
$price = $user_order->true_price; $price = $user_order->true_price;
$surplus = $price;
foreach ($sharing as $item) { foreach ($sharing as $item) {
$formula = $item->formula; $formula = $item->formula;
$item->formula = Str::replaceArray('$p', [$price], $item->formula); $amount = number_format($p->eval_action($formula, $price), 2);
foreach ($sharing_map as $k => $i) {
$item->formula = Str::replaceArray('$r' . ($k + 1), [$i['surplus']], $item->formula);
}
$amount = number_format($p->calculateExpression($item->formula), 2);
$receivers[] = [ $receivers[] = [
'type' => $item->type == 1 ? 'MERCHANT_ID' : 'PERSONAL_OPENID', 'type' => $item->type == 1 ? 'MERCHANT_ID' : 'PERSONAL_OPENID',
'account' => $item->account, 'account' => $item->account,
'amount' => $amount * 100, 'amount' => $amount * 100,
'description' => $item->desc 'description' => $item->desc
]; ];
$surplus = $surplus - $amount;
$sharing_map[] = [ $sharing_map[] = [
'surplus' => $price - $amount, 'amount' => $amount,
'surplus' => $surplus,
'formula' => $formula, 'formula' => $formula,
]; ];
} }
if (count($receivers) != 0) { if (count($receivers) != 0) {
$sharing_data = [ if ($hospital_sharing_content['open'] == 1) {
'transaction_id' => $user_order->transaction, $sharing_data = [
'receivers' => $receivers 'transaction_id' => $user_order->transaction,
]; 'receivers' => $receivers
$hospital_extra_content = self::pay_config($user_order->hospital); ];
$wcp = new WeChatPayController(); $hospital_extra_content = self::pay_config($user_order->hospital);
$builder_config = [ $wcp = new WeChatPayController();
'appid' => env('WX_APP_ID'), $builder_config = [
'pem_path' => base_path() . $hospital_extra_content['wxp']['key'], 'appid' => env('WX_APP_ID'),
'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'], 'pem_path' => base_path() . $hospital_extra_content['wxp']['key'],
'cer_num' => $hospital_extra_content['wxp']['number'], 'cer_path' => base_path() . $hospital_extra_content['wxp']['crt'],
'mchid' => $hospital_extra_content['wxp']['id'], 'cer_num' => $hospital_extra_content['wxp']['number'],
'v3' => $hospital_extra_content['wxp']['v3'], 'mchid' => $hospital_extra_content['wxp']['id'],
]; 'v3' => $hospital_extra_content['wxp']['v3'],
$wcp->builder($builder_config); ];
$res = $wcp->profitsharing($sharing_data); $wcp->builder($builder_config);
$res = $wcp->profitsharing($sharing_data);
} else {
$builder_config = [];
$res = [];
}
$sl = new ProfitsharingLog(); $sl = new ProfitsharingLog();
$sl->hospital = $user_order->hospital; $sl->hospital = $user_order->hospital;
$sl->type = $hospital_sharing_content['open'];
$sl->order = $user_order->id; $sl->order = $user_order->id;
$sl->builder = json_encode($builder_config, JSON_UNESCAPED_UNICODE); $sl->builder = json_encode($builder_config, JSON_UNESCAPED_UNICODE);
$sl->receivers = json_encode($receivers, JSON_UNESCAPED_UNICODE); $sl->receivers = json_encode($receivers, JSON_UNESCAPED_UNICODE);

@ -30,6 +30,7 @@ Route::post("api/$admin_api/UserOrder/list", [\App\Http\Controllers\UserOrderCon
Route::post("api/$admin_api/Hospital/edit", [\App\Http\Controllers\HospitalController::class, 'hospital_update']); Route::post("api/$admin_api/Hospital/edit", [\App\Http\Controllers\HospitalController::class, 'hospital_update']);
Route::post("api/$admin_api/Hospital/info", [\App\Http\Controllers\HospitalController::class, 'hospital_info']); Route::post("api/$admin_api/Hospital/info", [\App\Http\Controllers\HospitalController::class, 'hospital_info']);
Route::post("api/$admin_api/HospitalExtra/profitsharing_status", [\App\Http\Controllers\HospitalExtraController::class, 'profitsharing_status']); Route::post("api/$admin_api/HospitalExtra/profitsharing_status", [\App\Http\Controllers\HospitalExtraController::class, 'profitsharing_status']);
Route::post("api/$admin_api/Profitsharing/test", [\App\Http\Controllers\ProfitsharingController::class, 'test']);
Route::post("api/$admin_api/Profitsharing/recover", [\App\Http\Controllers\ProfitsharingController::class, 'recover']); Route::post("api/$admin_api/Profitsharing/recover", [\App\Http\Controllers\ProfitsharingController::class, 'recover']);
Route::post("api/$admin_api/Profitsharing/create", [\App\Http\Controllers\ProfitsharingController::class, 'create']); Route::post("api/$admin_api/Profitsharing/create", [\App\Http\Controllers\ProfitsharingController::class, 'create']);

Loading…
Cancel
Save