weizong song 1 month ago
parent 803a9433dd
commit 839968cd08

@ -2,6 +2,7 @@
namespace App\Console\Commands;
use App\Models\Holiday;
use App\Models\OrderItems;
use Carbon\Carbon;
use Illuminate\Console\Command;
@ -16,7 +17,8 @@ class CheckOrderFee extends Command
protected $signature = 'order-items:check-fee
{start_date : 开始日期,格式为 YYYY-MM-DD}
{end_date : 结束日期,格式为 YYYY-MM-DD}
{--project_id= : 只检测指定项目的订单}
{project_id? : 可选,指定项目 ID}
{--project_id= : 只检测指定项目的订单,兼容旧用法}
{--limit=50 : 表格展示的最大行数}';
/**
@ -47,7 +49,7 @@ class CheckOrderFee extends Command
return 1;
}
$projectId = $this->option('project_id');
$projectId = $this->argument('project_id') ?: $this->option('project_id');
$limit = (int) $this->option('limit');
$limit = $limit > 0 ? $limit : 50;
@ -60,7 +62,7 @@ class CheckOrderFee extends Command
$query = OrderItems::query()
->whereBetween('service_date', [$startDate->toDateString(), $endDate->toDateString()])
->with(['order', 'product']);
->with(['order.project', 'product']);
if ($projectId) {
$query->whereHas('order', function ($q) use ($projectId) {
@ -68,14 +70,27 @@ class CheckOrderFee extends Command
});
}
$holidayRatios = Holiday::query()
->whereBetween('date', [$startDate->toDateString(), $endDate->toDateString()])
->when($projectId, function ($q) use ($projectId) {
$q->where('project_id', $projectId);
})
->get(['project_id', 'date', 'price_ratio'])
->keyBy(function ($holiday) {
return $holiday->project_id . ':' . $holiday->date;
});
$total = 0;
$rowsForTable = [];
$query->chunkById(200, function ($items) use (&$total, &$rowsForTable, $limit) {
$query->chunkById(200, function ($items) use (&$total, &$rowsForTable, $limit, $holidayRatios) {
foreach ($items as $item) {
/** @var \App\Models\OrderItems $item */
$total++;
$storedFee = (float) $item->fee;
$projectId = optional($item->order)->project_id;
$holidayKey = $projectId . ':' . $item->service_date;
$holidayRatio = optional($holidayRatios->get($holidayKey))->price_ratio;
$calcItem = clone $item;
if ($item->relationLoaded('order')) {
@ -92,7 +107,9 @@ class CheckOrderFee extends Command
$rowsForTable[] = [
'ID' => $item->id,
'订单ID' => $item->order_id,
'项目名称' => optional(optional($item->order)->project)->name ?? '',
'日期' => $item->service_date,
'节假日倍率' => $holidayRatio ?? '',
'总价' => $item->total,
'原fee' => $storedFee,
'算法fee' => $calculatedFee,
@ -106,7 +123,7 @@ class CheckOrderFee extends Command
$this->info('该时间段无子订单记录');
} else {
$this->table(
['ID', '订单ID', '日期', '总价', '原fee', '算法fee', '是否扣款'],
['ID', '订单ID', '项目名称', '日期', '节假日倍率', '总价', '原fee', '算法fee', '是否扣款'],
$rowsForTable
);
}

@ -0,0 +1,101 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Holiday;
use App\Models\Project;
use Illuminate\Http\Request;
use Kris\LaravelFormBuilder\FormBuilder;
class HolidayController extends CommonController
{
public $bladePath = "admin.holiday";
public $urlPrefix = "admin/project/holiday";
public $modelName = "节假日倍率";
public $modelClass = Holiday::class;
public function index(Request $request)
{
$data = $this->model
->with("project")
->when($request->project_id, function ($query) use ($request) {
$query->where("project_id", $request->project_id);
})
->orderBy("date", "desc")
->orderBy("id", "desc")
->paginate(10);
return view($this->bladePath . ".index", compact("data"));
}
public function create(FormBuilder $formBuilder)
{
$projects = Project::orderBy("id", "desc")->get();
$holiday = new Holiday();
if (request()->project_id) {
$holiday->project_id = request()->project_id;
}
$isEdit = false;
return view($this->bladePath . ".create", compact("projects", "holiday", "isEdit"));
}
public function store(Request $request)
{
$request->validate([
"project_id" => "required|integer",
"price_ratio" => "required|numeric|min:0",
"dates" => "required|array|min:1",
"dates.*" => "required|date_format:Y-m-d",
"remark" => "nullable|string",
], [
"dates.required" => "请至少选择一个日期",
"dates.min" => "请至少选择一个日期",
]);
$dates = collect($request->dates)->filter()->unique()->values();
foreach ($dates as $date) {
Holiday::updateOrCreate(
[
"project_id" => $request->project_id,
"date" => $date,
],
[
"price_ratio" => $request->price_ratio,
"remark" => $request->remark,
]
);
}
$url = url($this->urlPrefix . "?project_id=" . $request->project_id);
return $this->success("保存成功,共处理 {$dates->count()} 个日期", $url);
}
public function edit($id = null, Request $request, FormBuilder $formBuilder)
{
$projects = Project::orderBy("id", "desc")->get();
$holiday = $this->model->find($id ?: $request->id);
$isEdit = true;
return view($this->bladePath . ".create", compact("projects", "holiday", "isEdit"));
}
public function update($id = null, Request $request)
{
$request->validate([
"project_id" => "required|integer",
"price_ratio" => "required|numeric|min:0",
"date" => "required|date_format:Y-m-d",
"remark" => "nullable|string",
]);
$holiday = $this->model->find($id ?: $request->id);
$holiday->update([
"project_id" => $request->project_id,
"date" => $request->date,
"price_ratio" => $request->price_ratio,
"remark" => $request->remark,
]);
$url = url($this->urlPrefix . "?project_id=" . $request->project_id);
return $this->success("修改成功", $url);
}
}

@ -5,4 +5,9 @@ namespace App\Models;
class Holiday extends SoftDeletesModel
{
protected $table = "holiday";
public function project()
{
return $this->belongsTo(Project::class);
}
}

@ -0,0 +1,172 @@
@extends("admin.layouts.layout")
@php
$pageTitle = ($isEdit ? "编辑" : "新增") . $modelName;
@endphp
@section("content")
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
</div>
@endif
<form method="POST" action="{{ $isEdit ? url($urlPrefix . '/update/' . $holiday->id) : url($urlPrefix . '/store') }}">
@csrf
<div class="form-group">
<label for="project_id">所属项目/医院</label>
<select class="form-control" id="project_id" name="project_id" required>
<option value="">请选择</option>
@foreach($projects as $project)
<option value="{{ $project->id }}" {{ (string) old('project_id', $holiday->project_id) === (string) $project->id ? 'selected' : '' }}>
{{ $project->name }}
</option>
@endforeach
</select>
</div>
@if($isEdit)
<div class="form-group">
<label for="date">日期</label>
<input
class="form-control"
id="date"
name="date"
type="text"
data-plugin="date-picker"
value="{{ old('date', $holiday->date) }}"
required
>
</div>
@else
<div class="form-group">
<label for="date-picker-input">日期</label>
<div class="input-group">
<input
class="form-control"
id="date-picker-input"
type="text"
data-plugin="date-picker"
placeholder="点击日历选择日期"
>
<div class="input-group-append">
<button class="btn btn-info" id="add-date-btn" type="button">加入</button>
</div>
</div>
<small class="form-text text-muted">可连续选择多个日期,加入后会在下方列表展示。</small>
</div>
<div class="form-group">
<label>已选日期</label>
<div id="selected-dates" class="border rounded p-2" style="min-height: 48px;"></div>
<div id="selected-date-inputs"></div>
</div>
@endif
<div class="form-group">
<label for="price_ratio">节假日倍率</label>
<input
class="form-control"
id="price_ratio"
name="price_ratio"
type="number"
step="0.1"
min="0"
value="{{ old('price_ratio', $holiday->price_ratio ?: 1) }}"
required
>
</div>
<div class="form-group">
<label for="remark">备注</label>
<input
class="form-control"
id="remark"
name="remark"
type="text"
value="{{ old('remark', $holiday->remark) }}"
>
</div>
<button class="btn btn-primary mr-1" type="submit">保存</button>
<a class="btn btn-light" href="{{ url($urlPrefix . (request()->project_id ? '?project_id=' . request()->project_id : ($holiday->project_id ? '?project_id=' . $holiday->project_id : ''))) }}">返回</a>
</form>
</div>
</div>
</div>
</div>
@endsection
@push("footer")
<script>
$(function () {
if (!{{ $isEdit ? 'true' : 'false' }}) {
var selectedDates = [];
function renderSelectedDates() {
var $list = $("#selected-dates");
var $inputs = $("#selected-date-inputs");
$list.empty();
$inputs.empty();
if (!selectedDates.length) {
$list.append('<span class="text-muted">尚未选择日期</span>');
return;
}
selectedDates.sort();
selectedDates.forEach(function (date) {
$list.append(
'<span class="badge badge-primary mr-2 mb-2 p-2">' +
date +
' <a href="javascript:;" class="text-white remove-date" data-date="' + date + '">x</a></span>'
);
$inputs.append('<input type="hidden" name="dates[]" value="' + date + '">');
});
}
function addDate(date) {
if (!date) return;
if (selectedDates.indexOf(date) !== -1) return;
selectedDates.push(date);
renderSelectedDates();
}
$("#add-date-btn").on("click", function () {
addDate($("#date-picker-input").val());
$("#date-picker-input").val("");
});
$("#date-picker-input").on("dp.change", function (e) {
if (e.date) {
addDate(e.date.format("YYYY-MM-DD"));
$(this).val("");
}
});
$(document).on("click", ".remove-date", function () {
var date = $(this).data("date");
selectedDates = selectedDates.filter(function (item) {
return item !== date;
});
renderSelectedDates();
});
$("form").on("submit", function (e) {
if (!selectedDates.length) {
e.preventDefault();
alert("请至少选择一个日期");
}
});
renderSelectedDates();
}
});
</script>
@endpush

@ -0,0 +1,55 @@
@extends("admin.layouts.layout")
@section("content")
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="mb-3">
<a class="btn btn-primary" href="{{ url($urlPrefix . '/create') }}">
@lang("icons.action_create") @lang('actions.create'){{ $modelName }}
</a>
@if(request()->project_id)
<a class="btn btn-light" href="{{ url($urlPrefix) }}">
查看全部项目
</a>
@endif
</div>
<table class="table table-bordered" id="data-table">
<thead>
<tr>
<th>ID</th>
<th>项目名称</th>
<th>日期</th>
<th>节假日倍率</th>
<th>备注</th>
<th>操作</th>
</tr>
</thead>
<tbody>
@foreach ($data as $row)
<tr data-id="{{ $row->id }}">
<td>{{ $row->id }}</td>
<td>{{ optional($row->project)->name }}</td>
<td>{{ $row->date }}</td>
<td>{{ $row->price_ratio }}</td>
<td>{{ $row->remark }}</td>
<td>
<a class="btn btn-sm btn-primary"
href="{{ url("{$urlPrefix}/edit?id={$row['id']}") }}">@lang("icons.action_edit") @lang("actions.edit")</a>
<a class="btn btn-sm btn-danger btn-delete" data-id="{{ $row['id'] }}"
href="javascript:;">@lang("icons.action_delete") @lang("actions.delete")</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@include("public._pages")
</div>
</div>
</div>
</div>
@include("public._delete")
@endsection

@ -52,6 +52,10 @@
<a class="btn btn-sm btn-info"
href="{{url("{$urlPrefix}/beds/{$row['id']}")}}"><i
class="mdi mdi-bed-empty"></i> 床位管理</a>
<a class="btn btn-sm btn-info"
href="{{ url("{$urlPrefix}/holiday?project_id={$row['id']}") }}">
<i class="mdi mdi-calendar"></i> 节假日倍率
</a>
<a class="btn btn-sm btn-info"
href="{{url("{$urlPrefix}/asksubmit/{$row['id']}")}}">护士长满意度调查</a>
<a class="btn btn-sm btn-primary"

@ -44,6 +44,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
Route::post("role/set-permissions", 'RoleController@setPermissions');
\App\Models\CommonModel::generateCurdRouter("ProjectController", "project");
\App\Models\CommonModel::generateCurdRouter("HolidayController", "project/holiday");
Route::get("project/beds/{id}", 'ProjectController@beds');
Route::get("project/get-subs", 'ProjectController@getSubs');
Route::post("project/create-sub", 'ProjectController@createSub');
@ -236,4 +237,3 @@ Route::group(["namespace" => "Worker", "prefix" => "worker"], function () {
Route::get('get-order/{id}', 'OrdersController@getOrder');
});
});

Loading…
Cancel
Save