海工商新版后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

529 lines
22 KiB

<?php
namespace App\Admin\Controllers;
use App\Admin\Metrics\Examples\SelectedDormitoryNewTotal;
use App\Admin\Metrics\Examples\SelectedDormitoryTotal;
use App\Admin\Repositories\MultipleWorld;
use App\Models\AllocationDormitoryBed;
use App\Models\CompletedStep;
use App\Models\Config;
use App\Models\Order;
use App\Models\PaymentList;
use App\Models\ReportFormInfo;
use App\Models\SecondaryCollege;
use App\Models\SelectedDormitory;
use App\Models\Speciality;
use App\Models\UsersMember;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Support\JavaScript;
use Dcat\Admin\Widgets\Metrics\Card;
use Dcat\Admin\Widgets\Table;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\MessageBag;
class SelectedDormitoryController extends AdminController
{
public function index(Content $content)
{
return $content
->header('分配宿舍')
->description('数据统计')
->body(function (Row $row) {
$row->column(6, new SelectedDormitoryTotal());
$row->column(6, new SelectedDormitoryNewTotal());
})
->body($this->grid());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new SelectedDormitory(), function (Grid $grid) {
//开启边框模式
$grid->withBorder();
// 开启字段选择器功能
$grid->showColumnSelector();
//检测是否有筛选年届条件
$request = request();
if(empty($request->input("annual_session"))){
//取出当前年份
$config = Config::query()->where([
"unique_identification" => "annual_session"
])->first();
$grid->model()->where("annual_session", $config->data);
}else{
$grid->model()->where("annual_session", $request->input("annual_session"));
}
$grid->column('id')->sortable();
$grid->column('annual_session');
$grid->column('idcard')->display(function($info){
$info = UsersMember::query()->where("unique_number", $this->unique_number)->first();
if(!empty($info)){
return $info->idcard;
}
})->help("不显示时代表未找到该用户");
$grid->column('mobile')->display(function($info){
$info = UsersMember::query()->where("unique_number", $this->unique_number)->first();
if(!empty($info)){
return $info->mobile;
}
})->help("不显示时代表未找到该用户");
$grid->column('user_name')->display(function(){
$info = UsersMember::query()->where("unique_number", $this->unique_number)->first();
if(!empty($info)){
$str = '';
if($info->is_test == 2){
$str = "(测试)";
}
return $info->name.$str;
}
})->help("不显示时代表未找到该用户");
$grid->column('sex', __('性别'))->display(function(){
$info = UsersMember::query()->where("unique_number", $this->unique_number)->first();
if(empty($info)){
return "不存在此账号";
}
if($info->sex == 1){
return "";
}
if($info->sex == 2){
return "";
}
return "未知";
});
$grid->column('speciality_id')->display(function(){
$info = UsersMember::query()->where("unique_number", $this->unique_number)->first();
if(!empty($info)){
$speciality = Speciality::query()->where("id", $info->speciality_id)->first();
if(!empty($speciality)){
$college = SecondaryCollege::query()->where("id", $speciality->secondary_college_id)->first();
if(!empty($college)){
return $speciality->speciality_name."{$college->name}";
}
}
}
});
$grid->column('is_pay')->display(function(){
$info = Order::query()->where([
"unique_number" => $this->unique_number,
"status" => Order::STATUS_PAID,
"parent_id" => Order::PARENT_YES,
"annual_session" => $this->annual_session,
"selected_dormitory_id" => $this->allocation_dormitory_id
])->first();
if(empty($info)){
return "未支付";
}
return "已支付";
});
$grid->column('dormitory_price')->display(function(){
$years = date("Y", time());
$timeIdCode = "2({$years})";
$info = PaymentList::query()->where([
"unique_number" => $this->unique_number,
"annual_session" => $this->annual_session,
"project_code" => $timeIdCode
])->first();
if(!empty($info)){
return $info->standard."(欠费:{$info->amount}";
}
})->help("所选宿舍标准金额,欠费则代表还需缴纳该费用");
$grid->column('allocation_dormitory_id')->modal("床位详情", function($modal){
$modal->xl();
$list = SelectedDormitory::getBedInfoById($this->allocation_dormitory_id);
return Table::make($list["lable"], $list["value"]);
})->help("对应的是录入床位的详细信息");
$grid->column('allocation_dormitory_name')->help("学生在迎新系统上确认该床位时才会显示");
$grid->column('status')->select([1 => "正常", 2 => "禁用"])->help("状态为正常时才是正常在使用的床位");
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('allocation_dormitory_id', '床位id');
$filter->where("unique_number", function ($query) {
$unique_number = "";
$userInfo = UsersMember::query()->where('mobile', $this->input)->orWhere('idcard', $this->input)->orWhere('name', $this->input)->first(['unique_number']);
if(!empty($userInfo)){
$unique_number = $userInfo->unique_number;
}
$query->where('unique_number', $unique_number);
}, '手机号/身份证/姓名');
$filter->equal('status', '状态')->select([1 => "正常", 2 => "禁用"]);
$filter->equal('annual_session', '年届')->select(function (){
$list = SelectedDormitory::query()->distinct("annual_session")->get("annual_session")->toArray();
if(empty($list)) return [];
$list = array_column($list, "annual_session");
$result = [];
foreach($list as $item){
$result[$item] = $item;
}
return $result;
});
});
$grid->actions(function (Grid\Displayers\Actions $actions) {
// append一个操作
$actions->append('<a href=""><i class="fa fa-eye"></i> 退学禁用</a>');
});
// 禁用创建按钮
$grid->disableCreateButton();
// 禁用删除按钮
$grid->disableDeleteButton();
//禁用批量操作按钮
$grid->disableBatchDelete();
// 禁用详情按钮
$grid->disableViewButton();
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new SelectedDormitory(), function (Show $show) {
$show->field('id');
$show->field('allocation_dormitory_id');
$show->field('annual_session');
$show->field('unique_number');
$show->field('allocation_dormitory_name');
$show->field('status');
$show->field('create_time');
$show->field('update_time');
});
}
protected function form()
{
return Form::make(new SelectedDormitory(), function(Form $form){
//检测是否为新增
if ($form->isCreating()) {
admin_error('操作异常', '不允许新增分配信息');
}
//检测当前分配宿舍信息是否为禁用状态
if($form->model()->status == 2){
admin_error('操作异常', '不允许修改禁用的床位(修改会导致数据错乱)');
}
$form->block(6, function(Form\BlockForm $form){
// 设置标题
$form->title('已分配宿舍详情');
//取出当前年份
$config = Config::query()->where([
"unique_identification" => "annual_session"
])->first();
//取出床位详细信息
$allocationDormitoryId = $form->model()->allocation_dormitory_id;
$bedInfo = AllocationDormitoryBed::query()->where([
"id" => $allocationDormitoryId,
// "status" => AllocationDormitoryBed::STATUS_YES,
"annual_session" => $config->data,
])->first();
if(empty($bedInfo)){
// 中断后续逻辑
return $form->response()->error('找不到该床位信息或已被删除');
}
$form->select('sex', '性别')
->options(config("app.url")."/api/getSex?sex=".$bedInfo->sex)
->value($bedInfo->sex)
->disable();
$form->select('speciality_id', '专业')
->options(config("app.url")."/api/getSpeciality")
->value($bedInfo->speciality_id)
->disable();
$form->select('dormitory_type', "宿舍类型")
->options(config("app.url")."/api/getDormitoryType?dormitory_type=".$bedInfo->dormitory_type)
->value($bedInfo->dormitory_type)
->disable();
$form->select('multiple_worlds', "几人间")
->options(config("app.url")."/api/getMultipleWorlds?multiple_worlds=".$bedInfo->multiple_worlds)
->value($bedInfo->multiple_worlds)
->disable();
$form->select("living_area", "生活区")
->options(config("app.url")."/api/getLiving?living_quarters=".$bedInfo->living_area)
->value($bedInfo->living_area)
->disable();
$form->select("building_id", "楼栋")
->options(config("app.url")."/api/getBuilding?building_id=".$bedInfo->building_id)
->value($bedInfo->building_id)
->disable();
$form->select("floor_id", "楼层")
->options(config("app.url")."/api/getFloor?floor_id=".$bedInfo->floor_id)
->value($bedInfo->floor_id)
->disable();
$form->select("dormitory_number", "宿舍号")
->options(config("app.url")."/api/getDormitoryNumber?dormitory_number=".$bedInfo->dormitory_number)
->value($bedInfo->dormitory_number)
->disable();
$form->select("bed_id", "床位")
->options(config("app.url")."/api/getBed?bed_id=".$bedInfo->bed_id)
->value($bedInfo->bed_id)
->disable();
});
$form->block(6, function(Form\BlockForm $form){
// 设置标题
$form->title('重新分配宿舍');
//取出用户信息
$userInfo = UsersMember::query()->where([
"unique_number" => $form->model()->unique_number,
])->first();
$form->select('sex_new', '性别')
->options(config("app.url")."/api/getSex?sex=".$userInfo->sex)
->value($userInfo->sex)
->load("speciality_id_new", config("app.url")."/api/getSpecialityLoad?sex=".$userInfo->sex)
->required();
$form->select('speciality_id_new', '专业')
->load("dormitory_type_new", config("app.url")."/api/getDormitoryTypeLoad?sex=".$userInfo->sex)
->required();
$form->select('dormitory_type_new', "宿舍类型")
->load("multiple_worlds_new", config("app.url")."/api/getMultiplWorldsLoad")
->required();
$form->select('multiple_worlds_new', "几人间")
->load("living_area_new", config("app.url")."/api/getLivingAreaLoad")
->required();
$form->select('living_area_new', "生活区")
->load("building_id_new", config("app.url")."/api/getBuildingLoad")
->required();
$form->select("building_id_new", "楼栋")
->load("floor_id_new", config("app.url")."/api/getFloorLoad")
->required();
$form->select("floor_id_new", "楼层")
->load("dormitory_number_new", config("app.url")."/api/getDormitoryNumberLoad")
->required();
$form->select("dormitory_number_new", "宿舍号")
->load("bed_id_new", config("app.url")."/api/getBedLoad")
->required();
$form->select("bed_id_new", "床位")->required();
// 显示底部提交按钮
$form->showFooter();
});
//设置不提交保存
$form->ignore([
"sex",
"speciality_id",
"dormitory_type",
"multiple_worlds",
"living_area",
"building_id",
"floor_id",
"dormitory_number",
"bed_id",
"sex_new",
"speciality_id_new",
"dormitory_type_new",
"multiple_worlds_new",
"living_area_new",
"building_id_new",
"floor_id_new",
"dormitory_number_new",
"bed_id_new",
]);
$form->submitted(function (Form $form) {
// 获取用户提交参数
$bed_id_new = json_decode($form->bed_id_new, true);
$dormitory_type_new = json_decode($form->dormitory_type_new, true);
$id = request()->route()->parameters()["selected_dormitory"];
//取出当前年份
$config = Config::query()->where([
"unique_identification" => "annual_session"
])->first();
//取出当前id的数据
$thisSelectInfo = SelectedDormitory::query()->where([
"id" => $id,
"status" => SelectedDormitory::STATUS_YES
])->first();
if(empty($thisSelectInfo)){
// 中断后续逻辑
return $form->response()->error('查询不到当前信息,请重试~');
}
//组装查询条件
$bedInfo = [
"dormitory_type" => $bed_id_new["dormitory_type"],
"multiple_worlds" => $bed_id_new["multiple_worlds"],
"living_area" => $bed_id_new["living_area"],
"building_id" => $bed_id_new["building"],
"floor_id" => $bed_id_new["floor"],
"dormitory_number" => $bed_id_new["dormitory_number"],
"bed_id" => $bed_id_new["id"],
"speciality_id" => $dormitory_type_new["speciality_id"],
"sex" => $dormitory_type_new["sex"],
"annual_session" => $config->data,
"status" => AllocationDormitoryBed::STATUS_YES
];
$checkBedInfo = AllocationDormitoryBed::query()->where($bedInfo)->first();
if(empty($checkBedInfo)){
// 中断后续逻辑
return $form->response()->error('查询不到该床位,请重试~');
}
//检测是否被选
$checkSelect = SelectedDormitory::query()->where([
"allocation_dormitory_id" => $checkBedInfo->id,
"status" => SelectedDormitory::STATUS_YES,
"annual_session" => $config->data,
])->first();
if(!empty($checkSelect)){
// 中断后续逻辑
return $form->response()->error('该床位已被选,请重试~');
}
//检测订单是否支付
$orderInfo = Order::query()->where([
"unique_number" => $thisSelectInfo->unique_number,
"status" => Order::STATUS_PAID,
"annual_session" => $config->data,
"parent_id" => Order::PARENT_YES,
])->first();
if(empty($orderInfo)){
// 中断后续逻辑
return $form->response()->error('当前用户未缴费,请重试~');
}
//取出宿舍标准金额
$checkMultiplWorldInfo = \App\Models\MultipleWorld::query()->where([
"id" => $bedInfo["multiple_worlds"],
"dormitory_type_id" => $bedInfo["dormitory_type"],
"status" => \App\Models\MultipleWorld::STATUS_YES
])->first();
if(empty($checkMultiplWorldInfo)){
// 中断后续逻辑
return $form->response()->error('未找到对应几人间价格,请重试~');
}
DB::beginTransaction();
try {
//修改父级订单分配宿舍信息
$updateOrder = Order::query()->where("id", $orderInfo->id)->update([
"selected_dormitory_id" => $checkBedInfo->id,
"dormitory_price" => $checkMultiplWorldInfo->price,
"update_time" => time(),
"annual_session" => $config->data,
"dormitory_id" => $checkBedInfo->dormitory_type,
"multiple_id" => $checkBedInfo->multiple_worlds,
]);
if(empty($updateOrder)){
throw new \Exception("同步订单信息失败");
}
//取出用户信息
$userInfo = UsersMember::query()->where([
"unique_number" => $thisSelectInfo->unique_number,
])->first();
if(empty($userInfo)){
throw new \Exception("用户信息不存在");
}
//当前新选择的宿舍床位专业跟着用户专业改变
$newBedInfo = AllocationDormitoryBed::query()->where([
"id" => $checkBedInfo->id,
])->update([
"speciality_id" => $userInfo->speciality_id,
"update_time" => time(),
]);
if(empty($newBedInfo)){
throw new \Exception("更新新选床位专业失败");
}
//取出拼接完整的宿舍地址
$allocatioDormitoryName = SelectedDormitory::getSelectedBedName($checkBedInfo);
//同步当前已分配信息
$updateSelectInfo = SelectedDormitory::query()->where([
"id" => $id,
"unique_number" => $thisSelectInfo->unique_number
])->update([
"allocation_dormitory_id" => $checkBedInfo->id,
"status" => SelectedDormitory::STATUS_YES,
"allocation_dormitory_name" => $allocatioDormitoryName,
"update_time" => time(),
]);
if(empty($updateSelectInfo)){
throw new \Exception("同步当前已分配宿舍信息失败,请重试~");
}
//检测当前年份是否存在报道单,是则更新宿舍地址
$checkReport = ReportFormInfo::query()->where([
"unique_number" => $thisSelectInfo->unique_number,
"annual_session" => $config->data,
])->first();
if(!empty($checkReport)){
$updateReportInfo = ReportFormInfo::query()->where([
"id" => $checkReport->id,
])->update([
"bed_name" => $allocatioDormitoryName,
"update_time" => time(),
]);
if(empty($updateReportInfo)){
throw new \Exception("更新报道单信息失败");
}
}
DB::commit();
redirect(url('admin/selected_dormitory'));
}catch (\Exception $e){
DB::rollBack();
}
});
});
}
}