old-hotel-new/app/Admin/Controllers/OldmenController.php

496 lines
25 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Models\Keyword;
use Slowlyo\OwlAdmin\Models\AdminSetting;
use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\TableColumn;
use Slowlyo\OwlAdmin\Renderers\TextControl;
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\OldmenService;
use Illuminate\Http\Request;
use App\Admin\Components;
use App\Models\ConstFlow;
use App\Models\Oldmen;
use Carbon\Carbon;
/**
* @property OldmenService $service
*/
class OldmenController extends AdminController
{
protected string $serviceName = OldmenService::class;
protected string $pageTitle = '客人管理';
public function options(){
$list = $this->service->listQuery()->select(['id as value', 'name as label'])->get();
return $this->response()->success($list);
}
public function list(): Page
{
$crud = $this->baseCRUD()
->filterTogglable(false)
->headerToolbar([
$this->createButton(true, 'lg'),
])
->filter(
$this->baseFilter()->body([
amisMake()->TextControl('name', '名称')->size('md'),
amisMake()->TextControl('card_no', '身份证')->size('md'),
amisMake()->TextControl('floor_name', '楼栋')->size('md'),
amisMake()->SelectControl('nurse_lv', '护理等级')->options(Keyword::getByParentKey('nurse_lv')->pluck('name', 'value'))->checkAll(true)->multiple(true)->size('md'),
amis('button')->label(__('admin.reset'))->actionType('clear-and-submit'),
amis('submit')->label(__('admin.search'))->level('primary'),
])->actions([])
)
->columns([
// TableColumn::make()->name('id')->label('ID')->sortable(),
TableColumn::make()->name('name')->label('姓名'),
TableColumn::make()->name('age')->label('年龄'),
TableColumn::make()->name('birthday')->label('生日'),
TableColumn::make()->name('card_no')->label('身份证')->copyable(true),
TableColumn::make()->name('floor_name')->label('楼栋'),
TableColumn::make()->name('nurse_lv')->type('mapping')->map(Keyword::getByParentKey('nurse_lv')->pluck('name', 'value'))->label('护理等级')->className('text-primary')->sortable(),
TableColumn::make()->name('client_name')->label('委托人'),
TableColumn::make()->name('client_phone')->label('委托人-手机号')->copyable(true),
//状态显示:已入住、未入住
TableColumn::make()->name('live_in')->type('mapping')->map([
"0"=>"<span class='label label-info'>未入住</span>",
"1"=>"<span class='label label-success'>已入住</span>",
"*"=> '其他:${live_in}'
])->label('状态')->sortable(),
TableColumn::make()->name('created_at')->label(__('admin.created_at'))->type('datetime')->sortable(true),
amisMake()->Operation()->label(__('admin.actions'))->buttons([
amisMake()->LinkAction()->label('入住')->icon('fa fa-plus')->link('live-in-do?oldman_id=${id}')->level('link')->hiddenOn('this.live_in == 1'),
amisMake()->LinkAction()->label('续住')->icon('fa fa-plus')->link('live-continue-do?oldman_id=${id}')->level('link')->hiddenOn('this.live_in == 0'),
$this->showOldman(),
$this->rowEditButton(true, 'lg'),
$this->rowDeleteButton()
]),
]);
return $this->baseList($crud);
}
public function showOldman(){
return amisMake()->DialogAction()->icon('fa-regular fa-eye')->label('查看')->level('link')->dialog(
amisMake()->Dialog()->title('查看详情')->body([
amisMake()->Grid()->columns([
//信息详情
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('客人信息')
->subFormMode('horizontal')
->labelWidth(100)
->body([
amisMake()->form()->title('')->panelClassName('border-0')->mode('horizontal')
->static(true)->actions([])
->body([
amisMake()->FieldSetControl()->title('居住人信息')->collapsable(true)->body([
amisMake()->GroupControl()->body([
amisMake()->TextControl('name', '名称'),
amisMake()->RadiosControl('sex', '性别')->options([
1=>'男',2=>'女'
]),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('card_no', '身份证号码'),
amisMake()->DateControl('birthday', '出生日期')->format('YYYY-MM-DD'),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('card_complete_address', '详细地址'),
amisMake()->TextControl('age', '年龄'),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('floor_name', '楼栋'),
amisMake()->TextControl('agreement_no', '协议号码'),
]),
amisMake()->GroupControl()->body([
amisMake()->RadiosControl('nurse_lv', '护理等级')->options(Keyword::getByParentKey('nurse_lv')->pluck('name', 'value')),
amis('static-mapping')->name('live_in')->label('状态')->map([
"0"=>"<span class='label label-info'>未入住</span>",
"1"=>"<span class='label label-success'>已入住</span>",
"*"=> '其他:${live_in}'
]),
]),
amisMake()->GroupControl()->body([
amisMake()->DateControl('live_in_at', '开始时间')->format('YYYY-MM-DD'),
amisMake()->DateControl('avliable_at', '截至时间')->format('YYYY-MM-DD'),
]),
]),
amisMake()->FieldSetControl()->title('委托人信息')->className('mt-10')->collapsable(true)->body([
amisMake()->GroupControl()->body([
amisMake()->TextControl('client_name', '名称'),
amisMake()->TextControl('client_phone', '手机号'),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('client_complete_address', '详细地址'),
]),
]),
]),
]),
]),
//入住缴费情况
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('缴费记录')
->body([
amisMake()->CRUDTable()->affixHeader(false)
->title('')
->api(admin_url('consts').'?_action=getData&oldman_id=${id}')
->columns([
amisMake()->TableColumn('sn', '单据编号')->copyable(true),
amisMake()->TableColumn('const_type', '缴费类型')->type('mapping')->map(ConstFlow::typeMapLabel())->className('text-primary'),
amisMake()->TableColumn('start_at', '开始时间')->type('datetime'),
amisMake()->TableColumn('end_at', '截至时间')->type('datetime'),
amisMake()->TableColumn('money', '金额'),
amisMake()->TableColumn('created_at', '办理时间')->type('datetime'),
amisMake()->Operation()->label(__('admin.actions'))->buttons([
amisMake()->DialogAction()->icon('fa-regular fa-eye')->label('费用清单')->level('link')->dialog(
amisMake()->Dialog()->title('查看详情')->body([
\amisMake()->Service()->schemaApi(admin_url('flow-list-tabs?id=${id}'))
])->size('lg')->actions([])
)
]),
])
]),
]),
]),
])->size('xl')->actions([])
);
}
public function form(): Form
{
return $this->baseForm()->body([
amisMake()->FieldSetControl()->title('居住人信息')->collapsable(true)->body([
amisMake()->GroupControl()->body([
amisMake()->TextControl('name', '姓名')->required(true),
amisMake()->RadiosControl('sex', '性别')->options([
1=>'男',2=>'女'
])->required(true),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('card_no', '身份证号码')->required(true),
amisMake()->DateControl('birthday', '出生日期')->format('YYYY-MM-DD')->required(true),
]),
amisMake()->InputCityControl('card_city_code', '地区选择')->placeholder('请选择城市地区')->searchable('true')->required(true),
amisMake()->GroupControl()->body([
amisMake()->TextControl('card_address', '详细地址')->required(true),
]),
amisMake()->GroupControl()->body([
amisMake()->TextControl('floor_name', '楼栋'),
amisMake()->TextControl('agreement_no', '协议号码'),
]),
amisMake()->RadiosControl('nurse_lv', '护理等级')->options(Keyword::getByParentKey('nurse_lv')->pluck('name', 'value'))->required(true)->disabledOn('data.live_in > 0'),
]),
amisMake()->FieldSetControl()->className('mt-10')->title('委托人信息')->collapsable(true)->body([
amisMake()->GroupControl()->body([
amisMake()->TextControl('client_name', '姓名')->required(true),
amisMake()->TextControl('client_phone', '手机号')->required(true),
]),
amisMake()->InputCityControl('client_city_code', '地区选择')->placeholder('请选择城市地区')->searchable('true')->required(true),
amisMake()->GroupControl()->body([
amisMake()->TextControl('client_address', '详细地址')->required(true),
]),
]),
]);
}
/**
* 获取编辑页面
*
* @param $id
*
* @return JsonResponse|JsonResource
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function edit($id)
{
$this->isEdit = true;
if ($this->actionOfGetData()) {
$data = null;
if($id){
$data = $this->service->getEditData($id);
//处理下
if($data->avliable_at){
//续住时的开始时间
$data->offsetSet('start_at', Carbon::parse($data->avliable_at)->addSecond()->format('Y-m-d'));
}
}
return $this->response()->success($data);
}
$form = amisMake()
->Card()
->className('base-form')
->header(['title' => __('admin.edit')])
->toolbar([$this->backButton()])
->body(
$this->form(true)->api($this->getUpdatePath())->initApi($this->getEditGetDataPath())
);
$page = $this->basePage()->body($form);
return $this->response()->success($page);
}
/**
* 生成结算费用清单
*/
public function liveFeelist(Request $request)
{
return $this->response()->success([
'rows'=> $this->service->makeFeelist(ConstFlow::TYPE_IN, $request->input()),
]);
}
public function exitFeelist(Request $request)
{
return $this->response()->success([
'rows'=> $this->service->makeFeelist(ConstFlow::TYPE_EXIT, array_merge($request->input(), [
'oldman_id' => $request->input('oldman_id', 0)
])),
]);
}
/**
* 推荐费用表单
*
*/
public function liveSchemaForm(Request $request)
{
$type = $request->input('type', 'live_fee');
$dateRange = $request->input('live_in_date', null);
//处理续住时间传递
$startDay = $dateRange ? explode(',', $dateRange)[0].' 00:00:00' : $request->input('start_at', null);
$endDay = $dateRange ? explode(',', $dateRange)[1].' 23:59:59' : $request->input('end_at', null);
if($startDay && $endDay){
$startDay = Carbon::parse($startDay);
$endDay = Carbon::parse($endDay)->addSecond(1);
$diffYears = $startDay->diffInYears($endDay);
$diffMonths = $startDay->addYears($diffYears)->diffInMonths($endDay);
$diffAbMonths = $startDay->diffInMonths($endDay);
$diffDays = $startDay->addYears($diffYears)->addMonths($diffMonths)->diffInDays($endDay);
$diffAbDays = $startDay->diffInDays($endDay);
}
$lv = $request->input('nurse_lv', 1);
$feeKey = Keyword::getByParentKey($type);
$feeKeyHelp = AdminSetting::whereIn('key', $feeKey?->pluck('key')->toArray())->pluck('values','key')->toArray();
$feeData = $feeArr = [];
foreach(Keyword::getByParentKey($type) as $fee)
{
$_feeValue = 0;
if(isset($feeKeyHelp[$fee->key])){
$_feeValues = [];
if($feeKeyHelp[$fee->key]['has_time'] == 2 && !empty($dateRange)){
array_map(function($item) use(&$_feeValues){
$_feeValues[$item['lv']][$item['time_type']] = $item['fee'];
}, $feeKeyHelp[$fee->key]['values']);
if(isset($_feeValues[$lv]['day'])){
//判断是否有设置年份
if(isset($_feeValues[$lv]['year'])){
$_feeValue += bcmul($diffYears, $_feeValues[$lv]['year'], 2);
if(isset($_feeValues[$lv]['month'])){
$_feeValue += bcmul($diffMonths, $_feeValues[$lv]['month'], 2);
$_feeValue += bcmul($diffDays, $_feeValues[$lv]['day'], 2);
}else{
$_feeValue += bcmul($diffAbDays, $_feeValues[$lv]['day'], 2);
}
}else{
if(isset($_feeValues[$lv]['month'])){
$_feeValue += bcmul($diffAbMonths, $_feeValues[$lv]['month'], 2);
$_feeValue += bcmul($diffDays, $_feeValues[$lv]['day'], 2);
}else{
$_feeValue += bcmul($diffAbDays, $_feeValues[$lv]['day'], 2);
}
}
}
}else{
$_feeValues = collect($feeKeyHelp[$fee->key]['values'] ?? [])->keyBy('lv')->toArray();
$_feeValue = $_feeValues[$lv]['fee'] ?? 0;
}
}
$feeArr[] = Components::make()->decimalControl($type.'['.$fee->key.']', $fee->name)->description(amis('tpl')->tpl('根据当前护理等级,建议费用为:'.$_feeValue));
}
$resData['body'] = $feeArr;
return $this->response()->success($resData);
}
/**
* 推荐费用表单
*
*/
public function liveSchemaFormData(Request $request)
{
$type = $request->input('type', 'live_fee');
$dateRange = $request->input('live_in_date', null);
//处理续住时间传递
$startDay = $dateRange ? explode(',', $dateRange)[0].' 00:00:00' : $request->input('start_at', null);
$endDay = $dateRange ? explode(',', $dateRange)[1].' 23:59:59' : $request->input('end_at', null);
if($startDay && $endDay){
$startDay = Carbon::parse($startDay);
$endDay = Carbon::parse($endDay)->addSecond(1);
$diffYears = $startDay->diffInYears($endDay);
$diffMonths = $startDay->addYears($diffYears)->diffInMonths($endDay);
$diffAbMonths = $startDay->diffInMonths($endDay);
$diffDays = $startDay->addYears($diffYears)->addMonths($diffMonths)->diffInDays($endDay);
$diffAbDays = $startDay->diffInDays($endDay);
}
$lv = $request->input('nurse_lv', 1);
$feeKey = Keyword::getByParentKey($type);
$feeKeyHelp = AdminSetting::whereIn('key', $feeKey?->pluck('key')->toArray())->pluck('values','key')->toArray();
$feeData = $feeArr = [];
foreach(Keyword::getByParentKey($type) as $fee)
{
$_feeValue = 0;
if(isset($feeKeyHelp[$fee->key])){
$_feeValues = [];
if($feeKeyHelp[$fee->key]['has_time'] == 2 && !empty($dateRange)){
array_map(function($item) use(&$_feeValues){
$_feeValues[$item['lv']][$item['time_type']] = $item['fee'];
}, $feeKeyHelp[$fee->key]['values']);
if(isset($_feeValues[$lv]['day'])){
//判断是否有设置年份
if(isset($_feeValues[$lv]['year'])){
$_feeValue += bcmul($diffYears, $_feeValues[$lv]['year'], 2);
if(isset($_feeValues[$lv]['month'])){
$_feeValue += bcmul($diffMonths, $_feeValues[$lv]['month'], 2);
$_feeValue += bcmul($diffDays, $_feeValues[$lv]['day'], 2);
}else{
$_feeValue += bcmul($diffAbDays, $_feeValues[$lv]['day'], 2);
}
}else{
if(isset($_feeValues[$lv]['month'])){
$_feeValue += bcmul($diffAbMonths, $_feeValues[$lv]['month'], 2);
$_feeValue += bcmul($diffDays, $_feeValues[$lv]['day'], 2);
}else{
$_feeValue += bcmul($diffAbDays, $_feeValues[$lv]['day'], 2);
}
}
}
}else{
$_feeValues = collect($feeKeyHelp[$fee->key]['values'] ?? [])->keyBy('lv')->toArray();
$_feeValue = $_feeValues[$lv]['fee'] ?? 0;
}
}
$feeArr[$type][$fee->key] = $_feeValue;
$feeArr[$fee->key.'_tmp'] = $_feeValue;
}
return $this->response()->success($feeArr);
}
/**
* 已缴费明细清单
*/
public function liveConstFlow(Request $request)
{
$page = [];
$oldMan = Oldmen::find($request->input('oldman_id', 0));
if($oldMan){
$flowList = ConstFlow::where('oldman_id', $oldMan->id)
->whereIn('const_type', [ConstFlow::TYPE_IN, ConstFlow::TYPE_CONTINUE])
->where('state', 0)
->whereBetween('start_at', [$oldMan->live_in_at, $oldMan->avliable_at])//开始时间在用户这段时间内的清单
->orderBy('created_at', 'desc')->limit(3)->get();//调整为最近3条
$tableList = [];
foreach($flowList as $flow){
$_feeInfo = $_bonusInfo = $_addInfo = $_delInfo = '';
foreach($flow->extends as $_feeKey => $_feeArr){
$_money = 0;
switch($_feeKey){
case 'live_fee':
case 'continue_fee':
foreach($_feeArr as $k => $v){
$_fee = Keyword::where('key', $k)->first();
$_feeInfo.= '【'.$_fee->name.'】'.$v.'元,';
$_money = bcadd($_money, $v, 2);
}
$_feeInfo = mb_substr($_feeInfo, 0, -1);
$_feeInfo = $_money.'元:'.$_feeInfo;
break;
case 'bonds_fee':
foreach($_feeArr as $k => $v){
$_fee = Keyword::where('key', $k)->first();
$_bonusInfo.= '【'.$_fee->name.'】'.$v.'元,';
$_money = bcadd($_money, $v, 2);
}
$_bonusInfo = mb_substr($_bonusInfo, 0, -1);
$_bonusInfo = $_money.'元:'.$_bonusInfo;
break;
case 'add_fee':
foreach($_feeArr as $k => $_fee){
$_addInfo.= '【'.$_fee["name"].'】'.$_fee["fee"].'元,';
$_money = bcadd($_money, $_fee["fee"], 2);
}
$_addInfo = mb_substr($_addInfo, 0, -1);
$_addInfo = $_money.'元:'.$_addInfo;
break;
case 'del_fee':
foreach($_feeArr as $k => $_fee){
$_delInfo.= '【'.$_fee["name"].'】-'.$_fee["fee"].'元,';
$_money = bcsub($_money, $_fee["fee"], 2);
}
$_delInfo = mb_substr($_delInfo, 0, -1);
$_delInfo = $_money.'元:'.$_delInfo;
break;
}
}
$tableList[] = [
'type' => ConstFlow::typeMap()[$flow->const_type],//类别
'money'=> $flow->money,//金额(含保证金)
'date_range' => Carbon::parse($flow->start_at)->format('Y-m-d').' 至 '.Carbon::parse($flow->end_at)->format('Y-m-d'),//时间区间
'flow_at'=>$flow->created_at->format('Y-m-d H:i:s'),//办理时间
'fee_info'=>$_feeInfo,//费用明细,
'bonus_info'=>$_bonusInfo,
'add_info'=>$_addInfo,//收费项
'del_info'=>$_delInfo,//抵扣项
];
}
$page = amisMake()->table()
->className('m-b-none')->columnsTogglable(false)
->data([
'rows' => $tableList
])
->source('${rows}')
->footable([
'expand'=>'first'
])->columns([
amisMake()->TableColumn()->name('type')->label('缴费类型'),
amisMake()->TableColumn()->name('money')->label('缴费金额'),
amisMake()->TableColumn()->name('flow_at')->label('办理时间'),
amisMake()->TableColumn()->name('date_range')->label('有效时间')->breakpoint("*"),
amisMake()->TableColumn()->name('fee_info')->label('费用明细')->breakpoint("*"),
amisMake()->TableColumn()->name('bonus_info')->label('保证金')->breakpoint("*"),
amisMake()->TableColumn()->name('add_info')->label('附加-收费项')->breakpoint("*"),
amisMake()->TableColumn()->name('del_info')->label('附加-抵扣项')->breakpoint("*"),
]);
}
return $this->response()->success($page);
}
}