Merge branch 'master' of /data/git/tiantian2

master
songweizong 3 years ago
commit 9e01acb511

@ -68,7 +68,7 @@ class Admin extends Authenticatable implements Auditable
* @var array
*/
protected $fillable = [
'name', 'username', 'password',
'name', 'username', 'password','project_ids'
];
/**

@ -42,7 +42,7 @@ class SyncAlipayRechargeState extends Command
{
$threshold = 5;
$offset_seconds = 40; //支付发起后多少秒开始轮询
$due_minutes = 10; //支付发起后第一次开始轮询的时间往后延迟5分钟后不再轮询
$due_minutes = 10; //支付发起后第一次开始轮询的时间往后延迟若干分钟后不再轮询
$last_id = cache("last_sync_alipay_recharge_id", 0);
DB::enableQueryLog();

@ -3,6 +3,7 @@
namespace App;
use App\Models\Balance;
use App\Models\Orders;
use App\Models\Patient;
use App\Models\Recharge;
use Illuminate\Foundation\Auth\User as Authenticatable;
@ -53,7 +54,7 @@ class Customer extends Authenticatable implements JWTSubject
{
use Notifiable;
CONST GUARD_NAME = "customer";
const GUARD_NAME = "customer";
public function guardName()
{
@ -120,9 +121,19 @@ class Customer extends Authenticatable implements JWTSubject
return $this->hasMany(Balance::class, "customer_id");
}
public function oneBalance()
{
return $this->hasOne(Balance::class, "customer_id");
}
public function recharges()
{
return $this->hasMany(Recharge::class, "customer_id")->whereNotNull("paid_at");
}
public function orders()
{
return $this->hasMany(Orders::class, "customer_id");
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Exports;
use App\Models\Paramedic;
use Maatwebsite\Excel\Concerns\FromCollection;
class OrdersExport implements FromCollection
{
public function __construct($data)
{
$this->data = $data;
}
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
$res = [];
foreach ($this->data as $row) {
$res[] = [
"订单编号" => " ".$row->serial,
"所属项目/医院" => $row->project->name,
"客户姓名" => $row->customer->name ?: $row->patient->name,
"联系电话" => " ".$row->customer->mobile,
"被护理人" => $row->patient->name,
"开始服务日期" => $row->from_date,
"结束服务日期" => $row->to_date,
"总计" => $row->total,
"状态" => $row->getStatusLabelAttribute(),
];
}
if (count($res)) {
array_unshift($res, array_keys($res[0]));
}
return collect($res);
}
}

@ -2,6 +2,7 @@
namespace App\Forms;
use App\Models\Project;
use Kris\LaravelFormBuilder\Form;
use Kris\LaravelFormBuilder\Field;
@ -12,6 +13,7 @@ class AdminForm extends Form
$this->add("name", Field::TEXT, ["label" => "姓名", "rules" => "required"]);
$this->add("username", Field::TEXT, ["label" => "用户名", "rules" => "required", "attr" => ["autocomplete" => "off"]]);
$this->add("password", Field::PASSWORD, ["label" => "密码", "rules" => "min:6", "value" => "", "attr" => ["autocomplete" => "off"]]);
$this->add("project_id", Field::SELECT, ["label" => "管辖项目/医院", "rules" => "required", "attr" => ["multiple" => true, "data-plugin" => "select2"], "choices" => (new Project())->get()->pluck("name", "id")->toArray()]);
$this->add('buttons', 'buttongroup', ["splitted" => true, "buttons" => [
["label" => "保存", "attr" => ["class" => "btn btn-primary mr-1", "type" => "submit"]],
["label" => "返回", "attr" => ["class" => "btn btn-light btn-back", "type" => "button"]]

@ -14,6 +14,10 @@ class ManagerForm extends Form
"teacher" => "管理老师",
"manager" => "项目经理"
]]);
$this->add("order_status_ability", Field::SELECT, ["label" => "订单恢复权限", "choices" => [
"0" => "不开放",
"1" => "开放"
]]);
$this->add("project_id", Field::SELECT, ["label" => "管辖项目/医院", "rules" => "required", "attr" => ["multiple" => true, "data-plugin" => "select2"], "choices" => (new Project())->get()->pluck("name", "id")->toArray()]);
$this->add("name", Field::TEXT, ["label" => "姓名", "rules" => "required"]);

@ -14,6 +14,8 @@ class ParamedicForm extends Form
$this->add("mobile", Field::TEXT, ["label" => "电话", "rules" => "required"]);
$this->add("serial", Field::TEXT, ["label" => "编号", "rules" => "required"]);
$this->add("avatar", Field::TEXT, ["label" => "照片", "attr" => ["data-plugin" => "uploader"]]);
$this->add("health_certificate", Field::TEXT, ["label" => "健康证", "attr" => ["data-plugin" => "uploader"]]);
$this->add("work_certificate", Field::TEXT, ["label" => "护理员证", "attr" => ["data-plugin" => "uploader"]]);
$this->add("id_card_number", Field::TEXT, ["label" => "身份证号"]);
$this->add("sex", Field::SELECT, ["label" => "性别", "choices" => [
"男" => "男",

@ -13,6 +13,7 @@ class ProjectForm extends Form
$this->add("longitude", Field::HIDDEN);
$this->add("name", Field::TEXT, ["label" => "名称", "rules" => "required"]);
$this->add("address", Field::TEXT, ["label" => "地址", "rules" => "required"]);
$this->add("percent_first_party", Field::NUMBER, ["label" => "院方结算百分比"]);
$this->add("logo", Field::TEXT, ["label" => "logo", "attr" => ["data-plugin" => "uploader"]]);
$this->add("banners", Field::TEXT, ["label" => "banner", "attr" => ["data-plugin" => "uploader", "data-multiple-multiple" => 1]]);
$this->add("profile", Field::TEXTAREA, ["label" => "简介"]);

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin;
use App\Admin;
use App\Forms\AdminForm;
use App\Models\Project;
use Illuminate\Http\Request;
use Kris\LaravelFormBuilder\FormBuilder;
use Spatie\Permission\Models\Role;
@ -19,6 +20,9 @@ class AdminController extends CommonController
public function index(Request $request)
{
$data = $this->model->paginate(20);
foreach ($data as $item) {
$item->projects = Project::whereIn("id", explode(",", $item->project_ids))->get();
}
$roles = (new Role())->where("guard_name", $this->guardName)->get();
return view($this->bladePath . ".index", compact("data", "roles"));
@ -47,4 +51,29 @@ class AdminController extends CommonController
return $this->ajaxError("授权失败:" . $exception->getMessage());
}
}
public function stored($model)
{
if (request()->project_id) {
$model->update([
"project_ids" => implode(",", request()->project_id)]);
} else {
$model->update([
"project_ids" => null
]);
}
}
public function updated($model)
{
if (request()->project_id) {
$model->update([
"project_ids" => implode(",", request()->project_id)
]);
} else {
$model->update([
"project_ids" => null
]);
}
}
}

@ -155,7 +155,7 @@ class CommonController extends Controller
public function update($id = null, Request $request)
{
try {
$data = $data = (new CommonModel())->setTable($this->model->getTable())->filterRequestColumns($request, ["id"]);
$data = (new CommonModel())->setTable($this->model->getTable())->filterRequestColumns($request, ["id"]);
$model = $this->model->find($id ?: $request->id);
$model->update($data);
$this->updated($model);

@ -10,20 +10,20 @@ class HomeController extends CommonController
public function index()
{
$month = date("Y-m");
$order_items = OrderItems::whereHas("order")->whereRaw("DATE_FORMAT(`service_date`,'%Y-%m') = '{$month}'")
->where("total", ">", 0)->get();
$order_items_count = $order_items->count();
$total = $order_items->sum("total");
$orders_count = $order_items->groupBy("order_id")->count();
// $month = date("Y-m");
// $order_items = OrderItems::whereHas("order")->whereRaw("DATE_FORMAT(`service_date`,'%Y-%m') = '{$month}'")
// ->where("total", ">", 0)->get();
// $order_items_count = $order_items->count();
// $total = $order_items->sum("total");
// $orders_count = $order_items->groupBy("order_id")->count();
//
// foreach ($order_items as &$item) {
// $item = $item->calculateFee();
// }
// $total_paramedic = $order_items->sum("paramedic_total");
// $fee = $total - $total_paramedic;
// $laravel_duration = microtime(true) - LARAVEL_START;
foreach ($order_items as &$item) {
$item = $item->calculateFee();
}
$total_paramedic = $order_items->sum("paramedic_total");
$fee = $total - $total_paramedic;
$laravel_duration = microtime(true) - LARAVEL_START;
return view($this->bladePath . ".home", compact("orders_count", "order_items_count", "total", "total_paramedic", "fee", "laravel_duration"));
return view($this->bladePath . ".home");
}
}

@ -8,11 +8,13 @@
namespace App\Http\Controllers\Admin;
use App\Exports\OrdersExport;
use App\Models\OrderItems;
use App\Models\Orders;
use App\Models\Project;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
class OrdersController extends CommonController
{
@ -66,12 +68,18 @@ class OrdersController extends CommonController
$query->with(["room", "building"]);
}
])
->orderBy("id", "desc")
->paginate(10);
->orderBy("id", "desc");
if (request()->is_export) {
$data = $data->get();
return Excel::download(new OrdersExport($data), "订单导出.xlsx");
}
$data = $data->paginate(10);
foreach ($data as $order) {
$order = $order->refreshTotal();
}
dd($data);
return view($this->bladePath . ".index", compact("data", "project_id", "month", "project"));
}
@ -129,4 +137,36 @@ class OrdersController extends CommonController
$order_item = $order_item->calculateFee();
return $this->ajaxResponse($order_item);
}
public function score()
{
$projects = (new StatisticsController())->_checkProjects();
if (!$projects->count()) {
return $this->error($this->noProjects);
}
$project_id = request()->project_id ?? $projects->first()->id;
$this->model = $this->model->where("project_id", $project_id)->whereNotNull("scored_at");
if (request()->keyword) {
$this->model = $this->model->where(function ($query) {
$query->where("serial", "like", "%" . request()->keyword . "%")
->orWhere("contact", "like", "%" . request()->keyword . "%")
->orWhere("mobile", "like", "%" . request()->keyword . "%");
});
}
$data = $this->model
->with([
"orderItems",
"project",
"product",
"customer",
"manager",
"bed" => function ($query) {
$query->with(["room", "building"]);
}
])
->orderBy("id", "desc")
->paginate(10);
return view($this->bladePath . ".score", compact("data", "project_id"));
}
}

@ -37,7 +37,7 @@ class ParamedicController extends CommonController
->orWhere("id_card_number", "like", "%" . request()->keyword . "%");
});
}
$data = $data->paginate(10);
$data = $data->orderBy("updated_at","desc")->paginate(10);
return view($this->bladePath . ".index", compact("data"));
}

@ -63,14 +63,28 @@ class ProjectController extends CommonController
public function beds($id)
{
$project = (new Project())->with(["buildings" => function ($query) {
$query->with(["areas" => function ($query) {
$query->with("rooms");
}]);
}])->find($id);
$data = (new Bed())->where("project_id", $id)->orderBy("id", "desc")->with(["project", "building", "area", "room"])->paginate(10);
$project = (new Project())->with(["buildings"])->find($id);
$data = (new Bed())->where("project_id", $id)->orderBy("id", "desc")->with(["project", "building", "area", "room"]);
if (request()->room_id) {
$data = $data->where("room_id", request()->room_id);
$room = (new Room())->find(request()->room_id);
$rooms = (new Room())->where("area_id", $room->area_id)->get();
$area = (new Area())->where("id", $room->area_id)->first();
$areas = (new Area())->where("building_id", $area->building_id)->get();
view()->share(compact("rooms", "areas"));
} elseif (request()->area_id) {
$data = $data->where("area_id", request()->area_id);
$area = (new Area())->find(request()->area_id);
$areas = (new Area())->where("building_id", $area->building_id)->get();
$rooms = (new Room())->where("area_id", $area->id)->get();
view()->share(compact("areas", "rooms"));
} elseif (request()->building_id) {
$areas = (new Area())->where("building_id", request()->building_id)->get();
$data = $data->where("building_id", request()->building_id);
view()->share(compact("areas"));
}
$data = $data->paginate(10);
return view($this->bladePath . ".beds", compact("project", "data"));
}
@ -125,6 +139,21 @@ class ProjectController extends CommonController
return $this->success("添加成功!", '', $res);
}
public function getSubs(Request $request)
{
switch ($request->type) {
case "building":
$res = (new Area())->where("building_id", $request->id)->get();
break;
case "area":
$res = (new Room())->where("area_id", $request->id)->get();
break;
default:
$res = [];
}
return $this->ajaxResponse($res);
}
public function editDepartment(Request $request)
{
$data = [

@ -34,11 +34,21 @@ class StatisticsController extends CommonController
public function _checkProjects()
{
$projects = (new Project())->adminProject()->get();
$projects = (new Project())->adminProject()->orderBy("id","desc")->get();
view()->share(compact("projects"));
return $projects;
}
public function getYears()
{
$start_year = config("start_year");
$years = [];
for ($i = date("Y"); $i >= $start_year; $i--) {
$years[] = $i;
}
view()->share(compact("years"));
}
public function _getMonths()
{
$months = [];
@ -126,8 +136,9 @@ class StatisticsController extends CommonController
return $this->error($this->noProjects);
}
$this->_getMonthData();
$laravel_duration = microtime(true) - LARAVEL_START;
return view($this->urlPrefix . "/salary");
return view($this->urlPrefix . "/salary", compact("laravel_duration"));
}
public function overview(Request $request)
@ -248,31 +259,32 @@ class StatisticsController extends CommonController
return $this->error($this->noProjects);
}
$project_id = request()->project_id ?? $projects->first()->id;
$before_date = $request->before_date ?: date("Y-m-d");
$before_datetime = strtotime($before_date . " 23:59:59");
DB::enableQueryLog();
//todo:子订单的数量增加,用更省查询时间的方式获取项目相关数据
$customers = (new Customer())
->whereNull("deleted_at")
->with([
"patients" => function ($query) use ($before_datetime) {
$query->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")->orderBy("id", "desc");
},
"balances" => function ($query) use ($before_datetime) {
$query->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")->orderBy("id", "desc");
}
// "oneBalance" => function ($query) use ($before_datetime) {
// $query->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")->orderBy("id", "desc");
// }
])
->whereHas("balances", function ($query) use ($before_datetime, $project_id) {
// ->whereHas("oneBalance", function ($query) use ($before_datetime) {
// $query->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")->where("balance", ">", 0)->orderBy("id", "desc");
// })
->whereHas("orders", function ($query) use ($before_datetime, $project_id) {
$query
->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")
->whereHas("order", function ($query) use ($project_id) {
$query->where("project_id", $project_id);
});
// ->whereRaw("UNIX_TIMESTAMP(`created_at`) <= {$before_datetime}")
->where("project_id", $project_id);
})
->get();
return view($this->bladePath . ".customer-balance", compact("customers", "before_datetime"));
$laravel_duration = microtime(true) - LARAVEL_START;
return view($this->bladePath . ".customer-balance", compact("customers", "before_datetime", "project_id", "laravel_duration"));
}
public function fixMonthLastDayCheckout(Request $request)

@ -13,10 +13,14 @@ use App\Models\Product;
use App\Models\ProductItems;
use App\Models\ProductParamedicLevel;
use App\Models\Recharge;
use App\Notifications\CustomerOrderCreated;
use App\Notifications\RechargePaid;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification;
class OrdersController extends CommonController
{
@ -428,6 +432,12 @@ class OrdersController extends CommonController
]);
$order->getSerial();
if ($order->project->managers) {
foreach ($order->project->managers as $manager) {
Notification::send($manager, new CustomerOrderCreated($order));
}
}
DB::commit();
return $this->getOrder($order->id);
} catch (\Exception $exception) {
@ -505,6 +515,7 @@ class OrdersController extends CommonController
public function cancelOrder($id)
{
$order = (new Orders())->with("orderItems")->find($id);
Log::info($order);
if ($order->status !== Orders::STATUS_UNCONFIRMED) {
return response()->json([
"errorcode" => 50001,
@ -662,4 +673,106 @@ class OrdersController extends CommonController
])->select("id", "customer_id", "money", "balance", "belongs_type", "belongs_id", "remark", "order_id", "created_at")->orderBy("id", "desc")->paginate(10);
return response()->json($balances->toArray());
}
/**
* @OA\POST(
* path="/customer/score-order/{id}",
* tags={"用户端订单处理"},
* summary="评价订单",
* description="评价订单",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="id", in="path", @OA\Schema(type="integer"), required=true, description="订单id"),
* @OA\Parameter(name="score", in="query", @OA\Schema(type="number"), required=true, description="分数5分制0.5分为一个阶梯"),
* @OA\Parameter(name="comment", in="query", @OA\Schema(type="string"), required=false, description="评语不超过255字节"),
* @OA\Response(
* response="200",
* description="评价订单"
* )
* )
*/
public function scoreOrder($id)
{
$order = (new Orders())->where("customer_id", $this->customer->id)->find($id);
if (!$order) {
return response()->json([
"errorcode" => 40004,
"errormsg" => "没找到订单"
]);
}
if ($order->status !== Orders::STATUS_FINISHED) {
return response()->json([
"errorcode" => 50001,
"errormsg" => "订单状态不适配"
]);
}
DB::beginTransaction();
try {
$order->update([
"score" => request()->score,
"comment" => request()->comment,
"scored_at" => date("Y-m-d H:i:s"),
]);
DB::commit();
return response()->json($order);
} catch (\Exception $exception) {
DB::rollBack();
return response()->json([
"errorcode" => $exception->getCode(),
"errormsg" => $exception->getMessage()
]);
}
}
/**
* @OA\POST(
* path="/customer/delete-score-order/{id}",
* tags={"用户端订单处理"},
* summary="删除订单评价",
* description="删除订单评价",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="id", in="path", @OA\Schema(type="integer"), required=true, description="订单id"),
* @OA\Response(
* response="200",
* description="删除订单评价"
* )
* )
*/
public function deleteScoreOrder($id)
{
$order = (new Orders())->where("customer_id", $this->customer->id)->find($id);
if (!$order) {
return response()->json([
"errorcode" => 40004,
"errormsg" => "没找到订单"
]);
}
if ($order->status !== Orders::STATUS_FINISHED) {
return response()->json([
"errorcode" => 50001,
"errormsg" => "订单状态不适配"
]);
}
DB::beginTransaction();
try {
$order->update([
"score" => null,
"comment" => null,
"scored_at" =>null
]);
DB::commit();
return response()->json($order);
} catch (\Exception $exception) {
DB::rollBack();
return response()->json([
"errorcode" => $exception->getCode(),
"errormsg" => $exception->getMessage()
]);
}
}
}

@ -22,10 +22,11 @@ class PublicController extends Controller
* )
* )
*/
public function getOrdersCount() {
public function getOrdersCount()
{
$orders_count = Orders::count();
$order_items_count = OrderItems::whereHas("order")->count();
return response()->json(compact("orders_count","order_items_count"));
return response()->json(compact("orders_count", "order_items_count"));
}
/**
@ -43,7 +44,7 @@ class PublicController extends Controller
public function getProjects()
{
$projects = Project::select("id", "name", "address","logo","banners")->get();
$projects = Project::select("id", "name", "address", "logo", "banners")->orderBy("id", "desc")->get();
return response()->json($projects->toArray());
}

@ -30,6 +30,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Intervention\Image\Facades\Image;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use function GuzzleHttp\Psr7\str;
class OrdersController extends CommonController
{
@ -131,6 +132,11 @@ class OrdersController extends CommonController
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="project_id", in="path", @OA\Schema(type="integer"), required=false, description="医院ID"),
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=false, description="查询关键词"),
* @OA\Parameter(name="building_id", in="query", @OA\Schema(type="integer"), required=false, description="楼栋ID"),
* @OA\Parameter(name="area_id", in="query", @OA\Schema(type="integer"), required=false, description="病区ID"),
* @OA\Parameter(name="start_date_from", in="query", @OA\Schema(type="string"), required=false, description="开始服务日期区间查询的第一个值"),
* @OA\Parameter(name="start_date_to", in="query", @OA\Schema(type="string"), required=false, description="开始服务日期区间查询的第二个值"),
* @OA\Parameter(name="days", in="query", @OA\Schema(type="integer"), required=false, description="服务天数以实际生成的to_date和from_date比对为准改价为0的也算"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="integer"), required=false, description="当前页码默认为1"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="integer"), required=false, description="每页数量默认为5"),
* @OA\Parameter(name="status", in="query", @OA\Schema(type="string"), required=false, description="订单状态:[pending=>待处理,ongoing=>进行中,finished=>已完成]"),
@ -152,12 +158,32 @@ class OrdersController extends CommonController
->where("serial", "like", "%{$keyword}%")
->orWhereHas("patient", function ($query) use ($keyword) {
$query->where("name", "like", "%{$keyword}%");
})->orWhereHas("customer", function ($query) use ($keyword) {
$query->where("mobile", "like", "%{$keyword}%");
})->orWhereHas("paramedic", function ($query) use ($keyword) {
$query->where("name", "like", "%{$keyword}%");
});
});
}
if (request()->area_id) {
$model = $model->whereHas("bed", function ($query) {
$query->where("area_id", request()->area_id);
});
} elseif (request()->building_id) {
$model = $model->whereHas("bed", function ($query) {
$query->where("building_id", request()->building_id);
});
}
if (request()->days) {
$model = $model->whereRaw(DB::raw("datediff(`to_date`,`from_date`) = " . (request()->days - 1)));
}
if (request()->start_date_from && request()->start_date_to) {
$model = $model->whereRaw(DB::raw("UNIX_TIMESTAMP(`from_date`) between " . strtotime(request()->start_date_from) . " and " . strtotime(request()->start_date_to)));
}
switch (request()->status) {
case "pending":
$model = $model->whereIn("status", [Orders::STATUS_UNCONFIRMED, Orders::STATUS_UNASSIGNED]);
@ -384,7 +410,7 @@ class OrdersController extends CommonController
$query->select("id", "name");
},
"bed" => function ($query) {
$query->select("bed.id", "bed.name")
$query->select("bed.id", "bed.name", "bed.building_id", "bed.area_id")
->leftJoin("building", "building.id", "=", "bed.building_id")
->leftJoin("area", "area.id", "=", "bed.area_id")
->leftJoin("room", "room.id", "=", "bed.room_id")
@ -763,7 +789,7 @@ class OrdersController extends CommonController
* @OA\POST(
* path="/manager/update-order-items",
* tags={"管理端订单处理"},
* summary="V2-子订单修改(覆盖单条修改)",
* summary="V2-子订单修改(覆盖单条修改),20230618更新对早于过上月的价格锁定",
* description="子订单修改",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="ids", in="query", @OA\Schema(type="integer"), required=true, description="子订单id可传单个id或数组"),
@ -839,6 +865,15 @@ class OrdersController extends CommonController
$warnings[] = "将对" . $price_changed_paid_items->count() . "天已付款的子订单进行价格更改";
}
$manager = $this->guard()->user();
if (!$manager->no_lock_ability) {
foreach ($order_items as $_item) {
if (date("Ym", strtotime($_item->service_date)) < date("Ym", strtotime("-1 month", time()))) {
$errors[] = "子订单{$_item->id}已锁定";
}
}
}
if ($total_increased > $customer->balance) {
$errors[] = "价格补差{$total_increased}超过了客户余额{$customer->balance},请先充值";
}
@ -988,6 +1023,20 @@ class OrdersController extends CommonController
}
$to_generate_days = max(0, $to_generate_days);
for ($i = 0; $i < $to_generate_days; $i++) {
if ($i > 0) {
$service_date = Carbon::parse($to_generate_start_date)->addDays($i)->toDateString();
} else {
$service_date = $to_generate_start_date;
}
if (strtotime($service_date) >= strtotime("+1 month", strtotime(date("Y-m") . "-01"))) {
return response()->json([
"errorcode" => 30003,
"errormsg" => "中途结算最大时限不能超过当月月底"
]);
}
}
$prepay_total = $unpaid_order_items->sum("total") + $to_generate_days * $order->price;
$to_recharge_total = $prepay_total - $order->customer->balance;
@ -1045,6 +1094,13 @@ class OrdersController extends CommonController
} else {
$service_date = $to_generate_start_date;
}
if (strtotime($service_date) >= strtotime("+1 month", strtotime(date("Y-m") . "-01"))) {
return response()->json([
"errorcode" => 30003,
"errormsg" => "中途结算最大时限不能超过当月月底,已收的多余款项将于下月使用"
]);
}
$order_item = (new OrderItems())->createItem($order->id, $service_date);
//更新子订单支付状态
@ -1661,6 +1717,13 @@ class OrdersController extends CommonController
//更新用户余额,创建流水记录
$customer_balance = $refund->customer->balance - $refund->money;
if ($customer_balance < 0) {
return response()->json([
"errorcode" => "0",
"errormsg" => "客户余额为负异常,存在重复退款操作。"
]);
}
$refund->customer->update([
"balance" => $customer_balance
]);
@ -1710,10 +1773,9 @@ class OrdersController extends CommonController
* @OA\Post(
* path="/manager/change-order-status/{id}",
* tags={"管理端订单处理"},
* summary="V2-更新订单状态",
* summary="V2-更新订单状态20230618更新鉴定是否权限是否开启",
* description="更新订单状态",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=true, description="订单ID"),
* @OA\Parameter(name="from_status", in="query", @OA\Schema(type="integer"), required=true, description="原状态"),
* @OA\Parameter(name="to_status", in="query", @OA\Schema(type="integer"), required=true, description="更新状态"),
* @OA\Response(
@ -1726,6 +1788,14 @@ class OrdersController extends CommonController
public function changeOrderStatus($id)
{
try {
$manager = $this->guard()->user();
if (!$manager->order_status_ability) {
return response()->json([
"errorcode" => "4003",
"errormsg" => "权限不足"
]);
}
$order = (new Orders())->find($id);
if (request()->to_status == Orders::STATUS_ONGOING) {
$other_ongoing_order = Orders::where("status", Orders::STATUS_ONGOING)->where("customer_id", $order->customer_id)->count();

@ -249,6 +249,17 @@ class StatisticsController extends CommonController
$checkout = $model_checkout->sum("total");
$refund = $model_refund->sum("money");
$refund_by_payment = $model_refund->select("payment", "paid_at", "money", "order_id")->addSelect(DB::raw("sum(`money`) as total"))->groupBy("payment")->get()->keyBy("payment")->toArray();
$refund_methods = (new Refund())->groupBy("payment")->get()->keyBy("payment")->toArray();
foreach ($refund_methods as $k => $refund_method) {
if (isset($refund_by_payment[$k])) {
$refund_by_methods[$k] = $refund_by_payment[$k]["total"];
} else {
$refund_by_methods[$k] = 0;
}
}
$payment_methods = (new Recharge())->payment_methods;
$payment_online_methods = (new Recharge())->payment_online_methods;
@ -267,7 +278,7 @@ class StatisticsController extends CommonController
$recharge[$k] = $val;
}
return response()->json(compact("checkout", "refund", "recharge", "payment_methods"));
return response()->json(compact("checkout", "refund", "recharge", "payment_methods", "refund_by_methods"));
}
public function _getDuration()

@ -0,0 +1,138 @@
<?php
namespace App\Http\Controllers\Worker;
use App\Models\Paramedic;
use App\Worker;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class AuthController extends Controller
{
public $guardName = "worker";
public $authModel;
public function __construct()
{
$this->authModel = new Worker();
}
/**
* Create a new AuthController instance.
*
* @return void
*/
public function guard()
{
return auth()->guard($this->guardName);
}
public function guardName()
{
return $this->guardName;
}
/**
* @OA\Post(
* path="/worker/login-by-username",
* tags={"护工端用户相关"},
* summary="V2-通过用户名密码登录",
* description="",
* @OA\Parameter(name="username", in="query", @OA\Schema(type="string"), required=true, description="用户名(身份证号)"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), required=true, description="密码"),
* @OA\Response(
* response="200",
* description="护工通过用户名(身份证号)密码登录"
* )
* )
*/
public function loginByUsername()
{
$credentials = [
"id_card_number" => request()->username,
"password" => request()->password
];
if (!$token = $this->guard()->attempt($credentials)) {
return response()->json([
'errorcode' => '401',
'errormsg' => '登录失败'
], 401);
}
return $this->respondWithToken($token);
}
/**
* @OA\Get(
* path="/worker/me",
* tags={"护工端用户相关"},
* summary="V2-获取登录者信息",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
* description="获取登录者信息"
* )
* )
*/
public function me()
{
$id = $this->guard()->id();
$paramedic = (new Paramedic())->find($id);
return response()->json($paramedic->toArray());
}
/**
* @OA\Post(
* path="/worker/logout",
* tags={"护工端用户相关"},
* summary="V2 退出登录",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* description="",
* @OA\Response(
* response="200",
* description="退出登录"
* )
* )
*/
public function logout()
{
DB::beginTransaction();
try {
$this->guard()->logout();
DB::commit();
return response()->json([
'errormsg' => "退出登录成功!"
]);
} catch (\Exception $exception) {
DB::rollBack();
return response()->json([
'errorcode' => '402',
'errormsg' => $exception->getMessage()
]);
}
}
/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
$user = $this->guard()->user();
$user = $user->toArray();
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => $this->guard()->factory()->getTTL() * 60,
'user_info' => $user
]);
}
}

@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Worker;
use App\Http\Controllers\Controller;
class CommonController extends Controller
{
public $guardName = "worker";
public $worker;
public function __construct()
{
$worker = $this->guard()->user();
$this->worker = $worker;
}
public function guard()
{
return auth()->guard($this->guardName);
}
public function guardName()
{
return $this->guardName;
}
}

@ -0,0 +1,183 @@
<?php
namespace App\Http\Controllers\Worker;
use AlicFeng\IdentityCard\InfoHelper;
use App\Actions\AttachAffectedOrders;
use App\Actions\ChangeOrderStatus;
use App\Customer;
use App\Events\OrderAssigned;
use App\Libs\AlipayF2F;
use App\Libs\WxMicroPay;
use App\Models\Area;
use App\Models\Balance;
use App\Models\Bed;
use App\Models\OrderItems;
use App\Models\Orders;
use App\Models\Paramedic;
use App\Models\ParamedicLevel;
use App\Models\Patient;
use App\Models\Product;
use App\Models\ProductItems;
use App\Models\ProductParamedicLevel;
use App\Models\Project;
use App\Models\Recharge;
use App\Models\Refund;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Intervention\Image\Facades\Image;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use function GuzzleHttp\Psr7\str;
class OrdersController extends CommonController
{
/**
* @OA\Get(
* path="/worker/get-orders",
* tags={"护工端订单处理"},
* summary="V2-获取订单列表",
* description="获取订单列表",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="string"), required=false, description="查询关键词"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="integer"), required=false, description="当前页码默认为1"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="integer"), required=false, description="每页数量默认为5"),
* @OA\Parameter(name="status", in="query", @OA\Schema(type="string"), required=false, description="订单状态:[pending=>待处理,ongoing=>进行中,finished=>已完成]"),
* @OA\Response(
* response="200",
* description="获取订单列表"
* )
* )
*/
public function list()
{
$worker = $this->guard()->user();
$model = $this->_getOrderModel();
$ids = OrderItems::where("paramedic_id", $worker->id)->where("total", ">", 0)->pluck("order_id")->toArray();
$model = $model->whereIn("id", $ids);
if (request()->keyword) {
$keyword = request()->keyword;
$model = $model->where(function ($query) use ($keyword) {
$query
->where("serial", "like", "%{$keyword}%")
->orWhereHas("patient", function ($query) use ($keyword) {
$query->where("name", "like", "%{$keyword}%");
})->orWhereHas("customer", function ($query) use ($keyword) {
$query->where("mobile", "like", "%{$keyword}%");
})->orWhereHas("paramedic", function ($query) use ($keyword) {
$query->where("name", "like", "%{$keyword}%");
});
});
}
if (request()->start_date_from && request()->start_date_to) {
$model = $model->whereRaw(DB::raw("UNIX_TIMESTAMP(`from_date`) between " . strtotime(request()->start_date_from) . " and " . strtotime(request()->start_date_to)));
}
switch (request()->status) {
case "pending":
$model = $model->whereIn("status", [Orders::STATUS_UNCONFIRMED, Orders::STATUS_UNASSIGNED]);
break;
case "ongoing":
case "finished":
$model = $model->where("status", constant(Orders::class . "::STATUS_" . strtoupper(request()->status)));
break;
default:
//do nothing
}
$page_size = request()->page_size ?? 5;
$data = $model->orderBy("id", "desc")->paginate($page_size);
return response()->json($data->toArray());
}
/**
* @OA\Get(
* path="/worker/get-order/{id}",
* tags={"护工端订单处理"},
* summary="V2-获取订单详情",
* description="获取订单详情",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Parameter(name="id", in="path", @OA\Schema(type="integer"), required=true, description="id"),
* @OA\Response(
* response="200",
* description="获取订单详情"
* )
* )
*/
public function getOrder($id)
{
$worker = $this->guard()->user();
$model = $this->_getOrderModel();
$ids = OrderItems::where("order_id", $id)->where("paramedic_id", $worker->id)->where("total", ">", 0)->pluck("order_id")->toArray();
if (!$ids) {
return response()->json([
"errorcode" => "40004",
"errormsg" => "没找到订单"
]);
}
$order = $model->with([
"orderItems" => function ($query) use ($worker) {
$query->where("paramedic_id", $worker->id)->where("total", ">", 0)->orderBy("service_date", "desc");
}
])->find($id);
return response()->json($order->toArray());
}
public function _getOrderModel()
{
$model = $order = (new Orders())
->select(
"orders.id",
"orders.serial",
"orders.customer_id",
"orders.manager_id",
"orders.bed_id",
"orders.patient_id",
"orders.project_id",
"orders.product_id",
"orders.product_item_id",
"orders.product_paramedic_level_id",
"orders.from_date",
"orders.to_date",
"orders.status",
"orders.total",
"orders.paid_total",
"orders.contact",
"orders.mobile",
"orders.paramedic_id",
"orders.price",
"orders.factors",
"orders.patient_quantity",
"orders.created_at"
)
->with([
"project" => function ($query) {
$query->select("id", "name");
},
"bed" => function ($query) {
$query->select("bed.id", "bed.name", "bed.building_id", "bed.area_id")
->leftJoin("building", "building.id", "=", "bed.building_id")
->leftJoin("area", "area.id", "=", "bed.area_id")
->leftJoin("room", "room.id", "=", "bed.room_id")
->addSelect("room.name as room_name", "area.name as area_name", "building.name as building_name");
},
"customer" => function ($query) {
$query->select("id", "name", "balance");
},
"patient" => function ($query) {
$query->select("id", "name", "sex", "age", "mobile");
}
]);
return $model;
}
}

@ -13,6 +13,7 @@ class VerifyCsrfToken extends Middleware
*/
protected $except = [
'customer/*',
'manager/*'
'manager/*',
'worker/*',
];
}

@ -35,6 +35,13 @@ class AlipayF2F
return [
"status" => true
];
} elseif ($result->code == "10003") {
Log::info("支付宝状态:" . $result->code . "" . $result->msg . "" . $result->subMsg);
return [
"status" => false,
"code" => $result->code,
"msg" => "正在支付中,请稍后查询支付到账状态"
];
} else {
Log::info("支付宝错误:" . $result->code . "" . $result->msg . "" . $result->subMsg);
return [
@ -62,7 +69,7 @@ class AlipayF2F
$responseChecker = new ResponseChecker();
//处理响应或异常
if ($responseChecker->success($query_result)) {
if($query_result->tradeStatus !== "TRADE_SUCCESS") {
if ($query_result->tradeStatus !== "TRADE_SUCCESS") {
return false;
}
if (!$recharge->paid_at) {

@ -34,6 +34,9 @@ class WxMicroPay extends WxPayCommon
} elseif (!$this->parameters["auth_code"]) {
throw new Exception("缺少必填参数auth_code");
} elseif (strlen((string)$this->parameters["auth_code"]) != 18) {
\Log::info("支付码不正确");
\Log::info($this->parameters);
\Log::info(request()->all());
throw new Exception("支付码不正确!");
}

@ -121,7 +121,7 @@ class Manager extends Authenticatable implements JWTSubject
* @var array
*/
protected $fillable = [
'type', 'name', 'sex', 'username', 'password', 'openid', 'unionid', 'mobile', 'birthday', 'avatar'
'type', 'name', 'sex', 'username', 'password', 'openid', 'unionid', 'mobile', 'birthday', 'avatar', 'order_status_ability'
];
/**

@ -2,6 +2,7 @@
namespace App\Models;
use App\Notifications\CustomerOrderCreated;
use App\Notifications\RechargePaid;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;
@ -26,6 +27,9 @@ class Notifications extends CommonModel
$title = "有一笔新的收款到账,请注意查看。";
}
break;
case CustomerOrderCreated::class:
$title = "有用户通过小程序进行了下单,订单编号:{$data["order_serial"]},请注意及时处理。";
break;
default:
$title = "创建于{$this->created_at}的通知";
}

@ -20,7 +20,8 @@ class OrderItems extends SoftDeletesModel
return "未服务";
}
if ($this->paid_at) {
return "已扣款";
$next_month = date("m", strtotime("+1 month", strtotime(date("Y-m", strtotime($this->paid_at)))));
return "已扣款,{$next_month}月结工资";
} else {
return "未扣款";
}

@ -0,0 +1,65 @@
<?php
namespace App\Notifications;
use App\Models\Orders;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class CustomerOrderCreated extends Notification
{
use Queueable;
public $order;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(Orders $order)
{
$this->order = $order;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['database'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
"order_id" => $this->order->id,
"order_serial" => $this->order->serial
];
}
}

@ -20,6 +20,7 @@ class EventServiceProvider extends ServiceProvider
],
"App\Events\FactorSaved" => ["App\Listeners\FactorSavedListener"],
"App\Events\ManagerSaved" => ["App\Listeners\ManagerSavedListener"],
"App\Events\AdminSaved" => ["App\Listeners\AdminSavedListener"],
"App\Events\ProjectSaved" => ["App\Listeners\ProjectSavedListener"],
"App\Events\ProductSaved" => ["App\Listeners\ProductSavedListener"],
"App\Events\RechargeSucceed" => ["App\Listeners\RechargeSucceedListener"],

@ -0,0 +1,88 @@
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;
/**
* App\Manager
*
*/
class Worker extends Authenticatable implements JWTSubject
{
use Notifiable;
protected $table = "paramedic";
const GUARD_NAME = "worker";
public function getAvatarUrlAttribute()
{
$protocol = request()->secure() ? "https" : "http";
if (!$this->avatar) {
switch ($this->sex) {
case "男":
$this->avatar = "/images/male.png";
break;
case "女":
$this->avatar = "/images/female.png";
break;
}
}
return $this->avatar ? $protocol . "://" . request()->getHost() . $this->avatar : $this->avatar;
}
public function guardName()
{
return self::GUARD_NAME;
}
// Rest omitted for brevity
/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'verified_at' => 'datetime',
];
}

@ -39,7 +39,7 @@ return [
|
*/
'debug' => (bool) env('APP_DEBUG', false),
'debug' => (bool)env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
@ -56,6 +56,8 @@ return [
'asset_url' => env('ASSET_URL', null),
'start_year' => env('START_YEAR', 2017),
/*
|--------------------------------------------------------------------------
| Application Timezone

@ -50,6 +50,11 @@ return [
'provider' => 'manager',
],
'worker' => [
'driver' => 'jwt',
'provider' => 'worker',
],
// 'api' => [
// 'driver' => 'token',
// 'provider' => 'users',
@ -90,6 +95,11 @@ return [
'model' => App\Manager::class,
],
'worker' => [
'driver' => 'eloquent',
'model' => App\Worker::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateOrdersAddScore extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table("orders", function (Blueprint $table) {
$table->decimal("score")->nullable();
$table->timestamp("scored_at")->nullable();
$table->string("comment")->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateParamedicAddAuthFields extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table("paramedic", function (Blueprint $table) {
$table->string("remember_token")->nullable();
$table->string("password")->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateProjectAddPercentFirstParty extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table("project", function (Blueprint $table) {
$table->decimal("percent_first_party", 5, 2)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateManagersAddNoLockAbility extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table("managers", function (Blueprint $table) {
$table->tinyInteger("no_lock_ability")->default(0)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 13 KiB

@ -325,7 +325,7 @@ function initUploader(obj, index) {
var li = '<div data-id="' + file.id + '" class="alert alert-success alert-dismissible fade show mb-2" role="alert">' +
'<button type="button" class="close"><span aria-hidden="true">×</span></button>' +
'<a href="/storage/' + file.folder + '/' + file.name + '" target="_blank" class="text-success">' + file.original_name + '' + Math.ceil(file.size / 1000) + 'K</a>' +
'<a href="/storage/' + (file.folder != "public" ? file.folder : "") + '/' + file.name + '" target="_blank" class="text-success">' + file.original_name + '' + Math.ceil(file.size / 1000) + 'K</a>' +
'</div>';
$(".uploader-list[data-uploader-index=" + index + "]").append(li);
$(".uploader-list[data-uploader-index=" + index + "]").children(":last").find(".close").click(function () {
@ -346,7 +346,7 @@ function initUploader(obj, index) {
for (var i = 0; i < ids.length; i++) {
var li = '<div data-id="' + ids[i] + '" class="alert alert-success alert-dismissible fade show mb-2" role="alert">' +
'<button type="button" class="close"><span aria-hidden="true">×</span></button>' +
'<a class="text-success">' + ids[i] + '</a>' +
'<a class="text-success" href="' + ids[i] + '" target="_blank" class="text-success">' + ids[i] + '</a>' +
'</div>';
$(".uploader-list[data-uploader-index=" + index + "]").append(li);
$(".uploader-list[data-uploader-index=" + index + "]").children(":last").find(".close").click(function () {
@ -439,7 +439,7 @@ function initUploader(obj, index) {
var index = this.options.uploaderIndex;
$('#' + file.id).addClass("alert-success").attr("data-id", data.id);
$('#' + file.id).find("a").attr("href", "/storage/" + (data.folder ? data.folder + "/" : "") + data.name).attr("target", "_blank").addClass("text-success");
$('#' + file.id).find("a").attr("href", "/storage/" + (data.folder && data.folder != "public" ? data.folder + "/" : "") + data.name).attr("target", "_blank").addClass("text-success");
if (typeof uploaderCallback === "function") {
var res = uploaderCallback(file, data, index);

@ -19,6 +19,7 @@
</th>
<th>用户名</th>
<th>角色</th>
<th>项目</th>
<th>操作</th>
</tr>
</thead>
@ -32,6 +33,9 @@
<td class="role-names">
{{ $row->roles ? implode(",",array_column($row->roles->toArray(),"name")) : "" }}
</td>
<td class="role-names">
{{ implode(",",$row->projects->pluck("name")->toArray()) }}
</td>
<td>
<a class="btn btn-sm btn-success"
href="javascript:;" onclick="toggleRoles(this)"><i

@ -15,61 +15,61 @@
@endpush
@section("content")
<div class="row">
<div class="col-lg-3">
<div class="card text-white bg-info overflow-hidden">
<div class="card-body p-2">
<div class="toll-free-box">
<h4 class="text-right pr-2">
<i class="mdi mdi-bed-empty"></i>
<div class="font-12 font-weight-normal pb-1">本月护理人天数/订单数</div>
{{ $order_items_count }} / {{ $orders_count }}
</h4>
</div>
</div> <!-- end card-body-->
</div>
</div> <!-- end col-->
{{-- <div class="row">--}}
{{-- <div class="col-lg-3">--}}
{{-- <div class="card text-white bg-info overflow-hidden">--}}
{{-- <div class="card-body p-2">--}}
{{-- <div class="toll-free-box">--}}
{{-- <h4 class="text-right pr-2">--}}
{{-- <i class="mdi mdi-bed-empty"></i>--}}
{{-- <div class="font-12 font-weight-normal pb-1">本月护理人天数/订单数</div>--}}
{{-- {{ $order_items_count }} / {{ $orders_count }}--}}
{{-- </h4>--}}
{{-- </div>--}}
{{-- </div> <!-- end card-body-->--}}
{{-- </div>--}}
{{-- </div> <!-- end col-->--}}
<div class="col-lg-3">
<div class="card text-white bg-warning overflow-hidden">
<div class="card-body p-2">
<div class="toll-free-box">
<h4 class="text-right pr-2">
<i class="mdi mdi-currency-cny"></i>
<div class="font-12 font-weight-normal pb-1">本月应扣款</div>
{{ $total }}
</h4>
</div>
</div> <!-- end card-body-->
</div>
</div> <!-- end col-->
{{-- <div class="col-lg-3">--}}
{{-- <div class="card text-white bg-warning overflow-hidden">--}}
{{-- <div class="card-body p-2">--}}
{{-- <div class="toll-free-box">--}}
{{-- <h4 class="text-right pr-2">--}}
{{-- <i class="mdi mdi-currency-cny"></i>--}}
{{-- <div class="font-12 font-weight-normal pb-1">本月应扣款</div>--}}
{{-- {{ $total }}--}}
{{-- </h4>--}}
{{-- </div>--}}
{{-- </div> <!-- end card-body-->--}}
{{-- </div>--}}
{{-- </div> <!-- end col-->--}}
<div class="col-lg-3">
<div class="card text-white bg-primary overflow-hidden">
<div class="card-body p-2">
<div class="toll-free-box">
<h4 class="text-right pr-2">
<i class="mdi mdi-account-group"></i>
<div class="font-12 font-weight-normal pb-1">本月应发护工酬劳</div>
{{ $total_paramedic }}
</h4>
</div>
</div> <!-- end card-body-->
</div>
</div> <!-- end col-->
{{-- <div class="col-lg-3">--}}
{{-- <div class="card text-white bg-primary overflow-hidden">--}}
{{-- <div class="card-body p-2">--}}
{{-- <div class="toll-free-box">--}}
{{-- <h4 class="text-right pr-2">--}}
{{-- <i class="mdi mdi-account-group"></i>--}}
{{-- <div class="font-12 font-weight-normal pb-1">本月应发护工酬劳</div>--}}
{{-- {{ $total_paramedic }}--}}
{{-- </h4>--}}
{{-- </div>--}}
{{-- </div> <!-- end card-body-->--}}
{{-- </div>--}}
{{-- </div> <!-- end col-->--}}
<div class="col-lg-3">
<div class="card text-white bg-success overflow-hidden">
<div class="card-body p-2">
<div class="toll-free-box">
<h4 class="text-right pr-2">
<i class="mdi mdi-pocket"></i>
<div class="font-12 font-weight-normal pb-1">本月管理费</div>
{{ $fee }}
</h4>
</div>
</div> <!-- end card-body-->
</div>
</div> <!-- end col-->
</div>
{{-- <div class="col-lg-3">--}}
{{-- <div class="card text-white bg-success overflow-hidden">--}}
{{-- <div class="card-body p-2">--}}
{{-- <div class="toll-free-box">--}}
{{-- <h4 class="text-right pr-2">--}}
{{-- <i class="mdi mdi-pocket"></i>--}}
{{-- <div class="font-12 font-weight-normal pb-1">本月管理费</div>--}}
{{-- {{ $fee }}--}}
{{-- </h4>--}}
{{-- </div>--}}
{{-- </div> <!-- end card-body-->--}}
{{-- </div>--}}
{{-- </div> <!-- end col-->--}}
{{-- </div>--}}
@endsection

@ -28,6 +28,8 @@
</select>
<input class="form-control" type="text" name="keyword" value="{{ request()->keyword }}"
placeholder="订单编号/联系人/联系电话">
<button class="btn btn-primary ml-1" type="button" onclick="doExport(this)">导出</button>
</form>
</div>
<table class="table table-bordered" id="data-table">
@ -35,6 +37,7 @@
<tr>
<th>订单编号</th>
<th>所属项目/医院</th>
<th>客户科室</th>
<th>客户姓名</th>
<th>客户余额</th>
<th>联系电话</th>
@ -250,5 +253,13 @@
var item_id = $("#modal-box form input[name=item_id]").val();
$("#data-table tbody tr[data-item-id='" + item_id + "']").find("td[data-field=total]").html(total);
}
function doExport(ele) {
var url = "{{ url("admin/orders") }}";
url += "?is_export=1";
var params = $(ele).closest("form").serialize();
url += "&" + params;
window.open(url);
}
</script>
@endpush

@ -0,0 +1,110 @@
@extends("admin.layouts.layout")
@section("content")
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="mb-3">
<form class="form-inline" id="search-form" autocomplete="off">
<select class="form-control mr-1" name="project_id"
onchange="$(this).closest('form').submit()">
@foreach($projects as $pp)
<option
value="{{$pp->id}}" @if($pp->id == $project_id) {{ "selected" }}@endif>{{$pp->name}}</option>
@endforeach
</select>
<input class="form-control" type="text" name="keyword" value="{{ request()->keyword }}"
placeholder="订单编号/联系人/联系电话">
</form>
</div>
<table class="table table-bordered" id="data-table">
<thead>
<tr>
<th>订单编号</th>
<th>所属项目/医院</th>
<th>客户姓名</th>
<th>联系电话</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->serial }}
</td>
<td>{{ $row->project->name }}</td>
<td>{{ $row->customer->name ?: $row->patient->name }}</td>
<td>{{ $row->customer->mobile }}</td>
<td>{{ $row->patient->name }}</td>
<td>{{ $row->from_date }}</td>
<td>{{ $row->score }}</td>
<td>{{ $row->comment }}</td>
<td>
<a class="btn btn-sm btn-primary"
href="javascript:;" onclick="toggleItems(this)"><i
class="mdi mdi-arrow-down"></i> 查看</a>
</td>
</tr>
<tr style="display: none">
<td colspan="11" class="p-0">
<table class="table table-striped mb-0 border-0">
<thead>
<tr>
<th>所在床位</th>
<th>护理日期</th>
<th>护工</th>
<th>单价</th>
</tr>
</thead>
<tbody>
@foreach($row->orderItems as $item)
<tr data-id="{{ $item->id }}" data-item-id="{{ $item->id }}">
<td>{{ $item->building->name }}-{{ $item->room->name }}
-{{ $item->bed->name }}床
</td>
<td>{{ $item->service_date }}</td>
<td>{{ $item->paramedic ? $item->paramedic->name : "" }}</td>
<td data-field="total">{{ $item->total }}</td>
</tr>
@endforeach
</tbody>
</table>
</td>
</tr>
@endforeach
</tbody>
</table>
@include("public._pages")
</div>
</div>
</div>
</div>
@endsection
@push("footer")
<script>
$(function () {
$("#pages a.page-link").each(function () {
if (!$(this).attr("href")) {
return;
}
var filters = $("#search-form").serialize();
$(this).attr("href", $(this).attr("href") + "&" + filters);
});
});
function toggleItems(element) {
$(element).closest("tr").next("tr").toggle();
$(element).closest("tr").toggleClass("bg-warning");
$(element).find("i").toggleClass("mdi-arrow-up")
}
</script>
@endpush

@ -35,7 +35,7 @@
}
function uploaderCallback(file, data, index) {
$('input[data-uploader-index=' + index + ']').val("/storage/" + (data.folder ? data.folder + "/" : "") + data.name);
$('input[data-uploader-index=' + index + ']').val("/storage/" + (data.folder && data.folder != "public" ? data.folder + "/" : "") + data.name);
return true;
}

@ -6,7 +6,6 @@
<div class="card">
<div class="card-body">
<div class="mb-3">
<form class="form-inline" id="search-form" autocomplete="off">
<a class="btn btn-primary mr-1" href="{{url($urlPrefix.'/create')}}">
@lang("icons.action_create") @lang('actions.create'){{$modelName}}
@ -34,9 +33,9 @@
</td>
<td>{{ $row->project->name }}</td>
<td>
<a target="_blank" href="{{url("{$urlPrefix}/get-qrcode/{$row['id']}")}}" class="btn btn-sm btn-secondary">专属二维码</a>
{{-- <a target="_blank" href="{{url("{$urlPrefix}/get-qrcode/{$row['id']}")}}" class="btn btn-sm btn-secondary">专属二维码</a>--}}
<a class="btn btn-sm btn-primary"
href="{{url("{$urlPrefix}/edit?id={$row['id']}")}}">@lang("icons.action_edit") @lang("actions.edit")</a>
href="{{url("{$urlPrefix}/edit?id={$row['id']}")}}">@lang("icons.action_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>

@ -10,98 +10,83 @@
@section("content")
<div class="row">
<div class="col-4 pr-0">
<div class="col-12">
<div class="card">
<div class="card-body p-0 ">
<table class="table border-bottom border-light mb-0 treetable" id="tree-table">
<tbody>
<tr role="row" data-id="{{$project->id}}" data-type="project" data-name="{{$project->name}}"
data-myindex="{{$project->myindex}}" data-tt-id="project{{$project->id}}">
<td>
<a href="javascript:;" class="btn btn-sm btn-link"> <i
class="mdi mdi-hospital"></i> {{ $project->name }}</a>
<button class="btn btn-sm btn-info d-none"
href="javascript:;" onclick="createSub(this)"><i
class="mdi mdi-plus-box"></i> 楼栋
</button>
<a class="btn btn-sm btn-link float-right" href="javascript:;"
onclick="backAndReload()">返回</a>
</td>
</tr>
@foreach($project->buildings as $building)
<tr role="row" data-type="building" data-id="{{$building->id}}"
data-name="{{$building->name}}"
data-myindex="{{$building->myindex}}"
data-tt-id="building{{$building->id}}" data-tt-parent-id="project{{$project->id}}">
<td>
<a href="javascript:;" class="btn btn-sm btn-link"> <i
class="mdi mdi-hospital-building"></i> {{$building->name}} </a>
<button class="btn btn-sm btn-info d-none"
href="javascript:;" onclick="createSub(this)"><i
class="mdi mdi-plus-box"></i> 病区/楼层
</button>
<button class="btn btn-sm btn-primary d-none"
href="javascript:;" onclick="edit(this)"><i
<div class="card-body">
<h4>{{ $project->name }}床位管理</h4>
<div class="mb-2">
<form class="form-inline" id="search-form">
<div class="input-group mr-1">
<select class="form-control" name="building_id" id="building_id" data-type="building"
onchange="changeBuilding()">
<option value="">请选择楼栋</option>
@foreach($project->buildings as $building)
<option data-index="{{ $building->myindex }}"
value="{{ $building->id }}" @if($building->id == request()->building_id){{ "selected" }}@endif>{{ $building->name }}</option>
@endforeach
</select>
<div class="input-group-append">
<button class="btn btn-primary" type="button" onclick="createSub('project')"><i
class="mdi mdi-plus"></i></button>
</div>
<div class="input-group-append">
<button class="btn btn-light" type="button" onclick="edit(this)"><i
class="mdi mdi-pencil"></i></button>
<button class="btn btn-sm btn-danger d-none"
href="javascript:;" onclick="del(this)"><i
class="mdi mdi-delete-forever"></i></button>
</div>
</div>
<div class="input-group mr-1">
<select class="form-control" name="area_id" id="area_id" onchange="changeArea()"
data-type="area">
<option value="">
请选择病区
</option>
@if (isset($areas))
@foreach($areas as $area)
<option
value="{{ $area->id }}" @if($area->id == request()->area_id){{ "selected" }}@endif>{{ $area->name }}</option>
@endforeach
@endif
</select>
<div class="input-group-append">
<button class="btn btn-primary" type="button" onclick="createSub('building')"><i
class="mdi mdi-plus"></i></button>
</div>
<div class="input-group-append">
<button class="btn btn-light" type="button" onclick="edit(this)"><i
class="mdi mdi-pencil"></i></button>
</div>
</div>
<div class="input-group mr-1">
<select class="form-control" name="room_id" id="room_id" data-type="room">
<option value="">
请选择病房
</option>
@if (isset($rooms))
@foreach($rooms as $room)
<option
value="{{ $room->id }}" @if($room->id == request()->room_id){{ "selected" }}@endif>{{ $room->name }}</option>
@endforeach
@endif
</select>
<div class="input-group-append">
<button class="btn btn-primary" type="button" onclick="createSub('area')"><i
class="mdi mdi-plus"></i></button>
</div>
<div class="input-group-append">
<button class="btn btn-light" type="button" onclick="edit(this)"><i
class="mdi mdi-pencil"></i></button>
</div>
</div>
<button class="btn btn-primary mr-3" type="button" onclick="createSub('room')">新增病床 <i
class="mdi mdi-plus"></i></button>
<button class="btn btn-primary" type="submit">搜索</button>
<a class="btn btn-secondary ml-1" href="{{ url("admin/project") }}">返回</a>
</form>
</div>
</td>
</tr>
@foreach($building->areas as $area)
<tr role="row" data-type="area" data-id="{{$area->id}}" data-name="{{$area->name}}"
data-myindex="{{$area->myindex}}"
data-tt-id="area{{$area->id}}" data-tt-parent-id="building{{$building->id}}">
<td>
<a href="javascript:;" class="btn btn-sm btn-link"> <i
class="mdi mdi-floor-plan"></i> {{$area->name}} </a>
<button class="btn btn-sm btn-info d-none"
href="javascript:;" onclick="createSub(this)"><i
class="mdi mdi-plus-box"></i> 病房
</button>
<button class="btn btn-sm btn-primary d-none"
href="javascript:;" onclick="edit(this)"><i
class="mdi mdi-pencil"></i></button>
<button class="btn btn-sm btn-danger d-none"
href="javascript:;" onclick="del(this)"><i
class="mdi mdi-delete-forever"></i></button>
</td>
</tr>
@foreach($area->rooms as $room)
<tr role="row" data-type="room" data-id="{{$room->id}}" data-name="{{$room->name}}"
data-myindex="{{$room->myindex}}"
data-tt-id="room{{$room->id}}" data-tt-parent-id="area{{$area->id}}">
<td>
<a href="javascript:;" class="btn btn-sm btn-link"> <i
class="mdi mdi-home-heart"></i> {{$room->name}} </a>
<button class="btn btn-sm btn-info d-none"
href="javascript:;" onclick="createSub(this)"><i
class="mdi mdi-plus-box"></i> 病床
</button>
<button class="btn btn-sm btn-primary d-none"
href="javascript:;" onclick="edit(this)"><i
class="mdi mdi-pencil"></i></button>
<button class="btn btn-sm btn-danger d-none"
href="javascript:;" onclick="del(this)"><i
class="mdi mdi-delete-forever"></i></button>
</td>
</tr>
@endforeach
@endforeach
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<div class="col-8">
<div class="card">
<div class="card-body">
<table class="table table-bordered" id="data-table">
<thead>
<tr>
@ -110,6 +95,7 @@
<th>医院/项目</th>
<th>楼栋</th>
<th>病区/楼层</th>
<th>排序</th>
<th>操作</th>
</tr>
</thead>
@ -124,10 +110,10 @@
<td>{{ $row->project->name }}</td>
<td>{{ $row->building ? $row->building->name : "已删除" }}</td>
<td>{{ $row->area ? $row->area->name : "已删除" }}</td>
<td>{{ $row->myindex }}</td>
<td>
<a class="btn btn-sm btn-primary"
href="javascript:;" onclick="edit(this)">@lang("icons.action_edit")</a>
href="javascript:;" onclick="editBed(this)">@lang("icons.action_edit")</a>
<a class="btn btn-sm btn-danger" data-id="{{$row['id']}}"
href="javascript:;" onclick="del(this)">@lang("icons.action_delete")</a>
</td>
@ -188,24 +174,74 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
@include("plugins.treetable")
@endsection
@push("footer")
<script>
$(function () {
$("#tree-table tr").hover(function () {
$(this).find("button").removeClass("d-none");
}, function () {
$(this).find("button").addClass("d-none");
$("#pages a.page-link").each(function () {
if (!$(this).attr("href")) {
return;
}
var filters = $("#search-form").serialize();
$(this).attr("href", $(this).attr("href") + "&" + filters);
});
});
function createSub(element) {
var type = $(element).closest("tr").attr("data-type");
var id = $(element).closest("tr").attr("data-id");
function changeBuilding() {
$("#area_id option:gt(0)").remove();
$("#room_id option:gt(0)").remove();
var building_id = $("#building_id").val();
var url = "{{ url($urlPrefix."/get-subs") }}";
$.get(url, {type: "building", id: building_id}, function (res) {
for (var i = 0; i < res.length; i++) {
$("#area_id").append('<option data-index="' + res[i].myindex + '" value="' + res[i].id + '">' + res[i].name + '</option>');
}
});
}
function changeArea() {
$("#room_id option:gt(0)").remove();
var area_id = $("#area_id").val();
var url = "{{ url($urlPrefix."/get-subs") }}";
$.get(url, {type: "area", id: area_id}, function (res) {
for (var i = 0; i < res.length; i++) {
$("#room_id").append('<option data-index="' + res[i].myindex + '" value="' + res[i].id + '">' + res[i].name + '</option>');
}
});
}
function createSub(type) {
switch (type) {
case "project":
var id = "{{ $project->id }}";
break;
case "building":
var id = $("#building_id").val();
if (id == "") {
alertError("请先选择楼栋");
return false;
}
break;
case "area":
var id = $("#area_id").val();
if (id == "") {
alertError("请先选择病区/楼层");
return false;
}
break;
case "room":
var id = $("#room_id").val();
if (id == "") {
alertError("请先选择病房");
return false;
}
break;
}
var url = "{{ url($urlPrefix."/create-sub") }}";
$("#model-form form input[name=type]").val(type);
@ -219,25 +255,51 @@
$("#model-form .modal-title").html("新增楼栋");
break;
case "building":
$("#model-form .modal-title").html("新增病区/楼层");
var building_name = $("#building_id option:selected").html();
$("#model-form .modal-title").html("新增病区/楼层-" + building_name);
break;
case "area":
$("#model-form .modal-title").html("新增病房");
var area_name = $("#area_id option:selected").html();
$("#model-form .modal-title").html("新增病房-" + area_name);
break;
case "room":
$("#model-form .modal-title").html("新增病床");
var room_name = $("#room_id option:selected").html();
$("#model-form .modal-title").html("新增病床-" + room_name);
break;
}
$("#model-form").modal("show");
}
function edit(element) {
function editBed(element) {
var type = $(element).closest("tr").attr("data-type");
var id = $(element).closest("tr").attr("data-id");
var url = "{{ url($urlPrefix."/edit-department") }}";
var name = $(element).closest("tr").attr("data-name");
var myindex = $(element).closest("tr").attr("data-myindex");
var url = "{{ url($urlPrefix."/edit-department") }}";
$("#model-form form input[name=type]").val(type);
$("#model-form form input[name=id]").val(id);
$("#model-form form input[name=name]").val(name);
$("#model-form form input[name=myindex]").val(myindex);
$("#model-form form").attr("action", url);
$("#model-form .modal-title").html("修改病床");
$("#model-form").modal("show");
}
function edit(element) {
var target = $(element).parent().siblings("select");
var type = target.attr("data-type");
var id = target.val();
if (id == "") {
return false;
}
var url = "{{ url($urlPrefix."/edit-department") }}";
var name = target.find("option:selected").html();
var myindex = target.find("option:selected").attr("data-index");
$("#model-form form input[name=type]").val(type);
$("#model-form form input[name=id]").val(id);
@ -305,19 +367,9 @@
$("#model-form").modal("hide");
$.post(url, data, function (res) {
if (res.status) {
if (res.data.room_id) {
$("#data-table tbody").prepend('<tr data-type="bed">\n' +
' <td>'+res.data.name+'</td>\n' +
' <td>'+res.data.room_id+'</td>\n' +
' <td>'+res.data.project_id+'</td>\n' +
' <td>'+res.data.building_id+'</td>\n' +
' <td>'+res.data.area_id+'</td>\n' +
' <td>&nbsp;</td>\n' +
' </tr>');
return;
}
window.location.reload();
var page = "{{ request()->page}}";
$("#search-form").append("<input type='hidden' value='" + page + "' name='page'>");
$("#search-form").submit();
} else {
alertError(res.msg);
}

@ -18,6 +18,7 @@
{{$modelName}}
</th>
<th>地址</th>
<th>项目结算比例</th>
<th>操作</th>
</tr>
</thead>
@ -28,6 +29,7 @@
{{ $row->name }}
</td>
<td>{{ $row->address }}</td>
<td>{{ $row->percent_first_party }}</td>
<td>
<a class="btn btn-sm btn-info"
href="{{url("{$urlPrefix}/beds/{$row['id']}")}}"><i class="mdi mdi-bed-empty"></i> 床位管理</a>

@ -20,10 +20,19 @@
<div class="card">
<div class="card-body" style="overflow: auto">
<div class="mb-3">
<form class="form-inline">
<label class="control-label mr-1">截止</label><input
value="{{ date("Y-m-d",$before_datetime) }}" class="form-control" name="before_date"
data-plugin="date-picker">
<select class="form-control mr-1" name="project_id"
onchange="$(this).closest('form').submit()">
@foreach($projects as $pp)
<option
value="{{$pp->id}}" @if($pp->id == $project_id) {{ "selected" }}@endif>{{$pp->name}}</option>
@endforeach
</select>
{{-- <label class="control-label mr-1">截止</label><input--}}
{{-- value="{{ date("Y-m-d",$before_datetime) }}" class="form-control" name="before_date"--}}
{{-- data-plugin="date-picker">--}}
<button type="submit" class="btn btn-primary ml-1">查询</button>
</form>
</div>
@ -35,35 +44,25 @@
<th class="p-1" style="white-space: nowrap">客户手机号</th>
<th class="p-1" style="white-space: nowrap">客户家属</th>
<th class="p-1" style="white-space: nowrap">截止日期</th>
<th class="p-1" style="white-space: nowrap">充值汇总</th>
<th class="p-1" style="white-space: nowrap">退款汇总</th>
<th class="p-1" style="white-space: nowrap">扣款汇总</th>
<th class="p-1" style="white-space: nowrap">已到帐未结算余额表</th>
<th class="p-1" style="white-space: nowrap">未结算余额</th>
</tr>
</thead>
<tbody>
@foreach($customers as $item)
@if(!$item->oneBalance)
@continue
@elseif (!($item->oneBalance->balance > 0))
@continue
@endif
<tr>
<td class="p-1">{{ $loop->iteration }}</td>
<td class="p-1">{{ $item->mobile }}</td>
<td class="p-1">{{ $item->patients->count() ? $item->patients->first()->name : "无" }}</td>
<td class="p-1">{{ date("Y-m-d H:i:s",$before_datetime) }}</td>
<td class="p-1">{{ $item->balances->filter(function($item) { return $item->belongs_type == "App\Models\Recharge"; })->sum("money") }}</td>
<td class="p-1">{{ $item->balances->filter(function($item) { return $item->belongs_type == "App\Models\Refund"; })->sum("money") }}</td>
<td class="p-1">{{ $item->balances->filter(function($item) { return $item->belongs_type == "App\Models\OrderItems"; })->sum("money") }}</td>
<td class="p-1 {{ $item->balances->sum("money") != $item->balances->first()->balance ? "text-danger" : "" }}">{{ $item->balances->sum("money") }}</td>
<td class="p-1">{{ $item->patients->count() ? $item->patients->last()->name : "无" }}</td>
<td class="p-1">{{ date("Y-m-d",$before_datetime) }}</td>
<td class="p-1">{{ $item->balance }}</td>
</tr>
@endforeach
<tr>
<td class="p-1">&nbsp;</td>
<td class="p-1">&nbsp;</td>
<td class="p-1">&nbsp;</td>
<td class="p-1">&nbsp;</td>
<td class="p-1">&nbsp;</td>
<td class="p-1">&nbsp;</td>
<td class="p-1">总计</td>
<td class="p-1">{{ $customers->each(function($customer) { $customer->balance = $customer->balances->sum("money"); })->sum("balance") }}</td>
</tr>
</tbody>
</table>
</div>

@ -33,6 +33,16 @@
<option value="{{$mm}}" @if($mm == $month) {{ "selected" }}@endif>{{$mm}}</option>
@endforeach
</select>
{{-- <select class="form-control" name="year" onchange="$(this).closest('form').submit()">--}}
{{-- @foreach($years as $year)--}}
{{-- <option value="{{$year}}" @if($year == reqeust()->year) {{ "selected" }}@endif>{{$year}}</option>--}}
{{-- @endforeach--}}
{{-- </select>--}}
{{-- <select class="form-control" name="month_duration" onchange="$(this).closest('form').submit()">--}}
{{-- @foreach($years as $year)--}}
{{-- <option value="{{$year}}" @if($year == reqeust()->month) {{ "selected" }}@endif>{{$year}}</option>--}}
{{-- @endforeach--}}
{{-- </select>--}}
</form>
</div>
<h5>收款明细</h5>

@ -31,10 +31,11 @@
<th class="p-1" style="white-space: nowrap">项目</th>
<th class="p-1" style="white-space: nowrap">所属周期</th>
<th class="p-1" style="white-space: nowrap">上月未结算余额</th>
<th class="p-1" style="white-space: nowrap">本月</th>
<th class="p-1" style="white-space: nowrap">本月收</th>
<th class="p-1" style="white-space: nowrap">本月退款</th>
<th class="p-1" style="white-space: nowrap">本月结算</th>
<th class="p-1" style="white-space: nowrap">本月未结算余额</th>
<th class="p-1" style="white-space: nowrap">院方结算</th>
</tr>
</thead>
<tbody>
@ -46,6 +47,7 @@
<td>{{ $this_month_balances->filter(function($item) { return $item->belongs_type == "App\Models\Refund"; })->sum("money") }}</td>
<td>{{ $this_month_balances->filter(function($item) { return $item->belongs_type == "App\Models\OrderItems"; })->sum("money") }}</td>
<td>{{ $this_month_balance }}</td>
<td>@if($project->percent_first_party){{ -$this_month_balances->filter(function($item) { return $item->belongs_type == "App\Models\OrderItems"; })->sum("money") * $project->percent_first_party / 100 }}@else{{ "未设置" }}@endif</td>
</tr>
</tbody>
</table>

@ -41,6 +41,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
\App\Models\CommonModel::generateCurdRouter("ProjectController", "project");
Route::get("project/beds/{id}", 'ProjectController@beds');
Route::get("project/get-subs", 'ProjectController@getSubs');
Route::post("project/create-sub", 'ProjectController@createSub');
Route::post("project/edit-department", 'ProjectController@editDepartment');
Route::post("project/delete-department", 'ProjectController@deleteDepartment');
@ -78,6 +79,7 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () {
Route::get("orders", 'OrdersController@index');
Route::post("orders/change-item", 'OrdersController@changeItem');
Route::get("orders/get-item/{item_id}", 'OrdersController@getItem');
Route::get("orders/score", 'OrdersController@score');
Route::get("statistics/overview", 'StatisticsController@overview');
Route::get("statistics/salary", 'StatisticsController@salary');
@ -119,6 +121,8 @@ Route::group(["namespace" => "Customer", "prefix" => "customer"], function () {
Route::post('create-order', 'OrdersController@createOrder');
Route::post('cancel-order/{id}', 'OrdersController@cancelOrder');
Route::post('reserve-order/{id}', 'OrdersController@reserveOrder');
Route::post('score-order/{id}', 'OrdersController@scoreOrder');
Route::post('delete-score-order/{id}', 'OrdersController@deleteScoreOrder');
Route::get('recharge', 'OrdersController@recharge');
Route::get('get-balances', 'OrdersController@getBalances');
});
@ -186,3 +190,14 @@ Route::group(["namespace" => "Manager", "prefix" => "manager"], function () {
});
});
Route::group(["namespace" => "Worker", "prefix" => "worker"], function () {
Route::post('logout', 'AuthController@logout');
Route::post('login-by-username', 'AuthController@loginByUsername');
Route::group(['middleware' => ['authorize.jwt:worker']], function () {
Route::get('me', 'AuthController@me');
Route::get('get-orders', 'OrdersController@list');
Route::get('get-order/{id}', 'OrdersController@getOrder');
});
});

Loading…
Cancel
Save