分账 接口 ,后台配置调整

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

@ -8,7 +8,9 @@ const $token = useToken()
const $config = useConfig()
const admin_api = 'Admin'
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({
url: `${$config.value.api.url}/api/${admin_api}/UserOrder/list?page=${data.page}`, data
}, true)

@ -10,6 +10,7 @@ import {
ProfitsharingDeleteAction,
ProfitsharingListAction,
HospitalProfitsharingStatusAction,
ProfitsharingTestAction,
$response
} from '~/api'
import {h} from "vue";
@ -22,10 +23,14 @@ const $props = defineProps({
}
})
const profitsharing_status = ref(false)
const profitsharing_type = ref(0)
const HospitalProfitsharingStatus = async () => {
const response = await HospitalProfitsharingStatusAction()
const response = await HospitalProfitsharingStatusAction({
hospital: $props.hospital
})
$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([])
@ -65,9 +70,6 @@ const profitsharing_columns = [{
}, {
title: '计算公式',
key: 'formula'
}, {
title: '最大分账',
key: 'max'
}, {
title: '描述',
key: 'desc'
@ -95,11 +97,28 @@ const create_data_default = {
name: '',
account: '',
formula: '',
max: 0,
desc: '',
status: 1,
}
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 () => {
let data = {
...create_data.value,
@ -124,7 +143,6 @@ const update_data_default = {
name: '',
account: '',
formula: '',
max: 0,
desc: '',
status: 1,
}
@ -214,13 +232,19 @@ onMounted(() => {
<n-tag>
<div class="form_tag_wrapper">分账公式</div>
</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 mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">最大分账</div>
<div class="form_tag_wrapper">分账测试</div>
</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 mt-2 align="center">
<n-tag>
@ -272,13 +296,19 @@ onMounted(() => {
<n-tag>
<div class="form_tag_wrapper">分账公式</div>
</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 mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">最大分账</div>
<div class="form_tag_wrapper">分账测试</div>
</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 mt-2 align="center">
<n-tag>
@ -303,8 +333,9 @@ onMounted(() => {
<n-card mt-2 title="分账管理">
<div>
<n-alert title="使 - - 退
<n-alert v-if="profitsharing_type !== 3" title="使使 - - 退
需保持开启状态" 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>
<div v-else mt-2>
<n-space>
@ -320,4 +351,7 @@ onMounted(() => {
</div>
</template>
<style scoped>
.form_textarea_wrapper {
width: 300px;
}
</style>

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

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

@ -64,7 +64,6 @@ class ProfitsharingController extends Controller
$type = $request->post('type');
$account = $request->post('account');
$formula = $request->post('formula');
$max = $request->post('max');
$desc = $request->post('desc');
$status = $request->post('status');
$p = new Profitsharing();
@ -73,13 +72,34 @@ class ProfitsharingController extends Controller
$p->type = $type;
$p->account = $account;
$p->formula = $formula;
$p->max = $max;
$p->desc = $desc;
$p->status = $status;
$p->save();
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)
{
Login::admin([], [17, 25]);
@ -96,14 +116,12 @@ class ProfitsharingController extends Controller
$type = $request->post('type');
$account = $request->post('account');
$formula = $request->post('formula');
$max = $request->post('max');
$desc = $request->post('desc');
$status = $request->post('status');
$p->name = $name;
$p->type = $type;
$p->account = $account;
$p->formula = $formula;
$p->max = $max;
$p->desc = $desc;
$p->status = $status;
$p->save();

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

Loading…
Cancel
Save