Commit e71817c3 by 赵增煜
parents 9cb666e0 60473acf
......@@ -78,3 +78,5 @@ ENABLE_REDIS_SERVICE=0
REDIS_DATA_DIR=./runtime/redis
# 是否启用schedule
ENABLE_CRONTAB_SERVICE=0
# 是否启用自动开方审方脚本
ENABLE_AUTO_PRESCRIPTION=0
......@@ -5,7 +5,9 @@
use App\Models\AdminUsers;
use App\Services\SmsService;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Http\Controllers\AuthController as BaseAuthController;
use Dcat\Admin\Http\Repositories\Administrator;
use Dcat\Admin\Layout\Content;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
......@@ -49,6 +51,7 @@ public function getLogin(Content $content)
public function postLogin(Request $request)
{
$role = $request->input('role'); // 获取角色参数
$loginType = $request->input('type'); // 药店登录类型
$credentials = $request->only([$this->username(), 'password']);
$remember = (bool) $request->input('remember', false);
......@@ -71,7 +74,7 @@ public function postLogin(Request $request)
}
// 检查用户角色是否为 pharmacy
$isPharmacy = $user->roles->pluck('slug')->contains('pharmacy');
if ($role === 'store' && $user && $isPharmacy) {
if ($role === 'store' && $loginType == 'code' && $user && $isPharmacy) {
// 验证短信验证码
$verificationCode = $request->input('verification_code');
// 假设您有一个方法来验证短信验证码
......@@ -194,6 +197,80 @@ public function getLoginSmsCode(Request $request)
}
/**
* Model-form for user setting.
*
* @return Form
*/
protected function settingForm()
{
return new Form(new Administrator(), function (Form $form) {
$form->action(admin_url('auth/setting'));
$form->disableCreatingCheck();
$form->disableEditingCheck();
$form->disableViewCheck();
$form->tools(function (Form\Tools $tools) {
$tools->disableView();
$tools->disableDelete();
});
$form->display('username', trans('admin.username'));
$form->text('name', trans('admin.name'))->required();
$form->image('avatar', trans('admin.avatar'))->autoUpload();
// $form->password('old_password', trans('admin.old_password'));
$form->password('password', trans('admin.password'))
->minLength(5)
->maxLength(20)
->customFormat(function ($v) {
if ($v == $this->password) {
return;
}
return $v;
});
$form->password('password_confirmation', trans('admin.password_confirmation'))->same('password');
$form->ignore(['password_confirmation', 'old_password']);
$form->saving(function (Form $form) {
if ($form->password && $form->model()->password != $form->password) {
$form->password = bcrypt($form->password);
}
if (! $form->password) {
$form->deleteInput('password');
}
});
$form->saved(function (Form $form) {
return $form
->response()
->success(trans('admin.update_succeeded'))
->redirect('auth/setting');
});
});
}
/**
* Update user setting.
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function putSetting()
{
$form = $this->settingForm();
// if (! $this->validateCredentialsWhenUpdatingPassword()) {
// $form->responseValidationMessages('old_password', trans('admin.old_password_error'));
// }
return $form->update(Admin::user()->getKey());
}
/**
* 验证短信验证码
*
* @param string $username
......
......@@ -3,6 +3,7 @@
namespace App\Admin\Controllers;
use App\Admin\Repositories\DiagnosiRepository;
use App\Models\DiagnosiModel;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
......@@ -25,7 +26,7 @@ protected function grid()
$grid->column('code');
$grid->column('encoding');
$grid->column('content');
$grid->column('type', '诊断类型')->using(DiagnosiModel::DIAGNOSI_TYPE_MAP);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
......@@ -34,6 +35,7 @@ protected function grid()
$filter->like('code')->width(3);
$filter->like('encoding')->width(3);
$filter->like('content')->width(3);
$filter->in('is_auto', '诊断类型')->checkbox(DiagnosiModel::DIAGNOSI_TYPE_MAP)->width(3);
});
$grid->setActionClass(Grid\Displayers\Actions::class);
......@@ -81,7 +83,7 @@ protected function form()
$form->text('content')->width(4)->required()->maxLength(255, '最多输入255个字符');
$form->text('encoding')->width(4)->required()->maxLength(128);
$form->display('code')->width(4);
$form->radio('type', '诊断类型')->options(DiagnosiModel::DIAGNOSI_TYPE_MAP)->default(DiagnosiModel::DIAGNOSI_TYPE_WM)->required();
$form->display('created_at')->width(4);
$form->display('updated_at')->width(4);
......
......@@ -8,7 +8,6 @@
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Show;
use Jxlwqq\IdValidator\IdValidator;
// 医师
class DoctorController extends AdminController
......@@ -48,7 +47,7 @@ protected function grid()
$grid->column('user.openid', '关联用户');
$grid->column('created_at');
// $grid->column('updated_at')->sortable();
$grid->column('type', '医师类型')->using(DoctorModel::DOCTOR_TYPE_MAP);
// 快捷搜索
$grid->quickSearch(['name', 'mobile', 'id_card'])->placeholder('请输入[姓名|手机号|身份证号码]')->width(25);
......@@ -131,7 +130,7 @@ protected function form()
$form->display('user_id');
$form->switch('status');
$form->switch('is_auto');
$form->radio('type', '医师类型')->options(DoctorModel::DOCTOR_TYPE_MAP)->default(DoctorModel::DOCTOR_TYPE_WM)->required();
$form->display('created_at');
$form->display('updated_at');
});
......@@ -140,16 +139,14 @@ protected function form()
$form->image('physician_license')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->required();
$form->image('id_card_front_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->required();
$form->image('id_card_back_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->required();
$form->image('signed_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false);
$form->image('signed_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->help("<span style='color:red;'>图片尺寸要求:600x400,即3:2的比例</span>");
});
$form->saving(function (Form $form) {
if ($form->mobile && ! preg_match('/^1[3456789]{1}[0-9]{9}$/', $form->mobile)) {
return $form->response()->error('手机号格式错误');
}
$idValidator = new IdValidator();
//if ($form->id_card && ! $idValidator->isValid($form->id_card)) {
if ((! empty($form->id_card)) && strlen($form->id_card) != 18) {
if ($form->id_card && ! validateIDCard($form->id_card)) {
return $form->response()->error('身份证格式错误');
}
});
......
......@@ -2,13 +2,19 @@
namespace App\Admin\Controllers;
use App\Admin\Extensions\ToolBar\Actions\PharmacyDosageImportAction;
use App\Admin\Repositories\DosageRepository;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Show;
use Dcat\EasyExcel\Excel;
use Illuminate\Http\Request;
// 用法用量
class DosageController extends AdminController
......@@ -34,6 +40,11 @@ protected function grid()
$grid->column('dosage_desc');
$grid->column('dosage_show');
// 工具栏普通按钮
$grid->tools(function ($tools) {
$tools->append(new PharmacyDosageImportAction()); // 导入药品信息
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
......@@ -42,7 +53,7 @@ protected function grid()
});
// 行按钮控制
$grid->disableDeleteButton(); // 禁用删除按钮
// $grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableViewButton(); // 禁用详情按钮
// 工具栏按钮控制
......@@ -105,4 +116,25 @@ protected function form()
$form->disableViewButton(); // 去掉跳转详情页按钮
});
}
/**
* 药品导入模板
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function exportDosageTemplate(Request $request)
{
$sheet1Head = ['用法用量', '显示内容'];
$sheet1Data = [['220ug qd 每鼻孔2喷', '220ug qd 每鼻孔2喷']];
$sheet1 = Excel::createSheet($sheet1Data, '用法用量信息', $sheet1Head)->row(function (array $row) {
$style = (new StyleBuilder)
->setBackgroundColor(Color::YELLOW)
->build();
return WriterEntityFactory::createRowFromArray($row, $style);
});
return Excel::export([$sheet1])->headings(false)->download('用法用量导入模板.xlsx');
}
}
......@@ -8,6 +8,7 @@
use App\Models\DrugModel;
use App\Models\DrugTagModel;
use App\Models\DrugUnitModel;
use App\Models\PharmacyDrugModel;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
......@@ -46,6 +47,7 @@ protected function grid()
$grid->column('category_code');
$grid->column('category_name');
$grid->column('is_foreign')->using(DrugModel::FOREIGN_MAP);
$grid->column('drug_type')->using(DrugModel::DRUG_TYPE_MAP);
$grid->column('is_rx')->using(DrugModel::RX_MAP);
$grid->column('is_si')->using(DrugModel::SI_MAP);
$grid->column('limit_buy_7');
......@@ -75,11 +77,15 @@ protected function grid()
$filter->like('code')->width(3);
$filter->like('factory')->width(3);
$filter->like('standard_code')->width(3);
$filter->like('approval_no')->width(3);
$filter->in('drug_type')->checkbox(DrugModel::DRUG_TYPE_MAP)->width(3);
$filter->in('is_foreign')->checkbox(DrugModel::FOREIGN_MAP)->width(3);
$filter->in('is_rx')->checkbox(DrugModel::RX_MAP)->width(3);
$filter->in('is_si')->checkbox(DrugModel::SI_MAP)->width(3);
});
$grid->setActionClass(Grid\Displayers\Actions::class);
// 行按钮控制
$grid->disableDeleteButton(); // 禁用删除按钮
// $grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableViewButton(); // 禁用详情按钮
// 工具栏按钮控制
......@@ -113,14 +119,15 @@ protected function form()
$form->text('product_name')->maxLength(64);
$form->text('spec')->required()->maxLength(128);
$form->text('preparation_pec')->maxLength(128);
$form->text('dosage_form')->required()->maxLength(128);
$form->text('dosage_form')->maxLength(128);
$form->select('unit')->options(DrugUnitModel::all()->pluck('name', 'name'));
$form->text('factory')->required()->maxLength(128);
$form->text('approval_no')->required()->maxLength(64);
$form->radio('drug_type')->options(DrugModel::DRUG_TYPE_MAP)->default(DrugModel::DRUG_TYPE_WM);
$form->text('factory')->maxLength(128);
$form->text('approval_no')->maxLength(64);
$form->text('mnemonic')->maxLength(64);
});
$form->column(6, function (Form $form) {
$form->text('standard_code')->required()->rules(function (Form $form) {
$form->text('standard_code')->rules(function (Form $form) {
// 如果不是编辑状态,则添加字段唯一验证
if (! $id = $form->model()->id) {
return 'unique:App\Models\DrugModel,standard_code';
......@@ -131,7 +138,7 @@ protected function form()
$form->switch('is_foreign');
$form->switch('is_rx');
$form->switch('is_si');
$array = range(0, 10);
$array = range(0, 100);
$limitOption = array_combine($array, $array);
$form->select('limit_buy_7')->placeholder('请选择限购数量')->options($limitOption)->help('限购数量')->required()->default(0);
$form->multipleSelect('tag', '标签')
......@@ -151,6 +158,18 @@ protected function form()
$form->display('created_at');
$form->display('updated_at');
});
$form->deleting(function (Form $form) {
// 获取待删除行数据,这里获取的是一个二维数组
$drugId = $form->getKey();
// $num = PharmacyDrugModel::where('drug_id', $drugId)->count();
// if ($num >= 1) {
// return $form->response()->error('该药品已经被也药店导入,暂时不能删除~');
// }
// 同步删除关联表数据
PharmacyDrugModel::where('drug_id', $drugId)->delete();
});
// 右上角按钮控制
$form->disableDeleteButton(); // 去掉删除按钮
$form->disableViewButton(); // 去掉跳转详情页按钮
......
<?php
namespace App\Admin\Controllers;
use App\Admin\Repositories\ExternalPrescription;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Models\PharmacyModel;
use App\Models\ExternalPrescriptionModel;
use App\Admin\Extensions\ToolBar\Actions\ExternalPrescriptionImportAction;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Dcat\EasyExcel\Excel;
use Illuminate\Http\Request;
class ExternalPrescriptionController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new ExternalPrescriptionModel(), function (Grid $grid) {
$grid->model()->orderBy('id', 'DESC');
$grid->column('id')->sortable();
$grid->column('external_prescription_id');
$grid->column('issue_at')->sortable();
$grid->column('status');
$grid->column('company_name');
$grid->column('pharmacy_name');
// $grid->column('pharmacy_id');
$grid->column('agent');
$grid->column('patient_name');
$grid->column('patient_mobile');
$grid->column('patient_gender')->using(ExternalPrescriptionModel::SEX_MAP);
$grid->column('patient_age');
$grid->column('patient_id_card');
$grid->column('doctor_name');
$grid->column('diagnosis');
$grid->column('drug_info')->display(function ($drugInfoJson) {
// 尝试将 $drugInfoJson 解码为数组
$drugInfoArray = json_decode($drugInfoJson, true);
// 检查解码是否成功且 $drugInfoArray 是一个数组
if (is_array($drugInfoArray)) {
// 使用 array_map 来格式化每个药物的信息
$formattedDrugs = array_map(function ($item) {
return $item['drug_name'] . ' : ' . ($item['drug_spec'] ?? '') . ' : ' . $item['drug_num'];
}, $drugInfoArray);
// 将数组转换为以逗号分隔的字符串(或根据您的需求进行其他格式化)
return implode(', ', $formattedDrugs);
} else {
// 如果解码失败或 $drugInfoJson 不是一个有效的 JSON 字符串,返回原始值或错误消息
return $drugInfoJson; // 或者返回一个错误消息,如 'Invalid JSON'
}
})->label(); // 设置列的标签
$grid->column('pharmacist_name');
$grid->column('review_at');
$grid->column('pharmacist_attr');
$grid->column('dispatcher');
$grid->column('checker');
$grid->column('dispenser');
// $grid->column('created_at');
// $grid->column('updated_at')->sortable();
// 工具栏普通按钮
$grid->tools(function ($tools) {
$tools->append(new ExternalPrescriptionImportAction()); // 导入药品信息
});
$grid->filter(function (Grid\Filter $filter) {
//$filter->equal('id');
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
$filter->equal('external_prescription_id','580处方单编号')->width(3);
$filter->equal('pharmacy_id')->select(PharmacyModel::all()->pluck('name', 'id'))->width(3);
// $filter->equal('pharmacy_id','药店编号')->width(3);
});
// 行按钮控制
$grid->disableCreateButton(); // 禁用创建按钮
$grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableEditButton(); // 禁用编辑按钮
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
//$this->title('580处方单详情');
return Show::make($id, new ExternalPrescriptionModel(), function (Show $show) {
$show->field('id');
$show->field('external_prescription_id','580处方单编号');
$show->field('issue_at','处方开具时间');
$show->field('status','状态');
$show->field('company_name','企业名称');
$show->field('pharmacy_name','药店名称');
//$show->field('pharmacy_id');
$show->field('agent','会员/代理人');
$show->field('patient_name','就诊人姓名');
$show->field('patient_mobile','就诊人手机号');
$show->field('patient_gender','就诊人性别')->using(ExternalPrescriptionModel::SEX_MAP)->width(3);
$show->field('patient_age','就诊人年龄');
$show->field('patient_id_card','就诊人身份证号');
$show->field('doctor_name','接诊医师姓名');
$show->field('diagnosis','诊断');
$show->field('drug_info','用药信息')->as(function ($drugInfoJson) {
// 尝试将 $drugInfoJson 解码为数组
$drugInfoArray = json_decode($drugInfoJson, true);
// 检查解码是否成功且 $drugInfoArray 是一个数组
if (is_array($drugInfoArray)) {
// 使用 array_map 来格式化每个药物的信息
$formattedDrugs = array_map(function ($item) {
return $item['drug_name'] . ' : ' . ($item['drug_spec'] ?? '') . ' : ' . $item['drug_num'];
}, $drugInfoArray);
// 将数组转换为以逗号分隔的字符串(或根据您的需求进行其他格式化)
return implode(', ', $formattedDrugs);
} else {
// 如果解码失败或 $drugInfoJson 不是一个有效的 JSON 字符串,返回原始值或错误消息
return $drugInfoJson; // 或者返回一个错误消息,如 'Invalid JSON'
}
})->label(); // 设置列的标签
$show->field('pharmacist_name','审核药师');
$show->field('review_at','审核时间');
$show->field('pharmacist_attr','药师属性');
$show->field('dispatcher','调配人');
$show->field('checker','核对人');
$show->field('dispenser','发药人');
// $show->field('created_at');
// $show->field('updated_at');
$show->panel()->tools(function ($tools) {
$tools->disableEdit();
$tools->disableDelete(); // 禁止删除按钮
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new ExternalPrescriptionModel(), function (Form $form) {
$form->display('id');
$form->text('external_prescription_id');
$form->text('issue_at');
$form->text('status');
$form->text('company_name');
$form->text('pharmacy_name');
$form->text('pharmacy_id');
$form->text('agent');
$form->text('patient_name');
$form->text('patient_mobile');
$form->text('patient_gender');
$form->text('patient_age');
$form->text('patient_id_card');
$form->text('doctor_name');
$form->text('diagnosis');
$form->text('drug_info');
$form->text('pharmacist_name');
$form->text('review_at');
$form->text('pharmacist_attr');
$form->text('dispatcher');
$form->text('checker');
$form->text('dispenser');
$form->display('created_at');
$form->display('updated_at');
});
}
public function exportPrescriptionTemplate(Request $request)
{
$sheet1Head = ['处方编号','处方开具时间','处方状态','企业名称','门店名称','会员/代理人','就诊人姓名','就诊人电话','就诊人性别','就诊人年龄','就诊人身份证号','接诊医师姓名','诊断','药品名称','药品规格','药品数量','审核药师','药师审核时间','药师属性','调配人','核对人','发药人'];
$sheet1Data = [
['P1734339107979HN0','2024-12-16 16:51:48','正常','国药控股国大药房河南连锁有限公司','江阴市正鑫医药有限公司','会员_1085','赵海英','13335150001','女','34','','陆海','维生素D缺乏症,急性上呼吸道感染','维生素AD滴剂','10粒*3板','1','林俊杰','2024-12-16 16:51:58','总部药师','','',''],
['P1734339107979HN0','2024-12-16 16:51:48','正常','国药控股国大药房河南连锁有限公司','江阴市正鑫医药有限公司','会员_1085','赵海英','13335150001','女','34','','陆海','维生素D缺乏症,急性上呼吸道感染','飞扬胃肠炎片','24片','1','林俊杰','2024-12-16 16:51:58','总部药师','','',''],
];
$sheet1 = Excel::createSheet($sheet1Data, '处方明细列表', $sheet1Head)->row(function (array $row) {
$style = (new StyleBuilder)
->setBackgroundColor(Color::YELLOW)
->build();
return WriterEntityFactory::createRowFromArray($row, $style);
});
return Excel::export([$sheet1])->headings(false)->download('580-处方明细.xlsx');
}
}
......@@ -2,12 +2,14 @@
namespace App\Admin\Controllers;
use App\Admin\Metrics\Statistics;
use App\Admin\Metrics\Examples;
use App\Http\Controllers\Controller;
use Dcat\Admin\Http\Controllers\Dashboard;
use Dcat\Admin\Layout\Column;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Admin;
class HomeController extends Controller
{
......@@ -17,19 +19,30 @@ public function index(Content $content)
->header('首页')
->body(function (Row $row) {
// $row->column(6, function (Column $column) {
// $column->row(Dashboard::title());
// $column->row(new Examples\Tickets());
// });
// $row->column(6, function (Column $column) {
// $column->row(function (Row $row) {
// $row->column(6, new Examples\NewUsers());
// $row->column(6, new Examples\NewDevices());
// });
// $column->row(new Examples\Sessions());
// $column->row(new Examples\ProductOrders());
// $column->row(Dashboard::title());
// $column->row(new Examples\Tickets());
// });
if (! Admin::user()->isRole('pharmacy')) {
$row->column(12, function (Column $column) {
$column->row(function (Row $row) {
$row->column(3, new Statistics\Pharmacy());
$row->column(3, new Statistics\Pharmacist());
$row->column(3, new Statistics\Patient());
$row->column(3, new Statistics\Prescription());
//$row->column(6, new Examples\Sessions());
$row->column(6,new Statistics\PrescriptionChart());
$row->column(6,new Statistics\PharmacyChart());
});
//$column->row(new Statistics\PrescriptionChart());
// $row->column(6, new Examples\NewDevices());
//$column->row(new Examples\ProductOrders());
//$column->row(new Examples\Tickets());
});
}
});
}
}
......@@ -29,9 +29,7 @@ protected function grid()
return data_masking($content, 'idcard');
});
$grid->column('gender', '性别')->using(PatientModel::SEX_MAP);
$grid->column('age', '年龄')->display(function ($value) {
return getAgeByIdCard($this->id_card);
});
$grid->column('age', '年龄');
$grid->column('mobile')->display(function ($content) {
return data_masking($content, 'mobile');
});
......@@ -108,9 +106,7 @@ protected function form()
if ($form->mobile && ! preg_match('/^1[3456789]{1}[0-9]{9}$/', $form->mobile)) {
return $form->response()->error('手机号格式错误');
}
$idValidator = new IdValidator();
// if ($form->id_card && ! $idValidator->isValid($form->id_card)) {
if (! empty($form->id_card) && strlen($form->id_card) != 18) {
if ($form->id_card && ! validateIDCard($form->id_card)) {
return $form->response()->error('身份证格式错误');
}
});
......
......@@ -10,10 +10,11 @@
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Show;
use Dcat\Admin\Widgets\Alert;
use Dcat\Admin\Widgets\Tab;
use Illuminate\Http\Request;
use Jxlwqq\IdValidator\IdValidator;
// 药师
class PharmacistController extends AdminController
......@@ -61,9 +62,14 @@ protected function grid()
return $tab;
});
// 药店权限判断和数据过滤
if (Admin::user()->isRole('pharmacy')) {
$grid->model()->where('pharmacy_id', Admin::user()->pharmacy_id);
}
$grid->model()->orderBy('id', 'desc');
$grid->column('id')->sortable();
if (! Admin::user()->isRole('pharmacy')) {
$grid->column('id')->sortable();
}
$grid->column('status')->switch('', true);
$grid->column('name');
$grid->column('id_card')->display(function ($content) {
......@@ -82,26 +88,37 @@ protected function grid()
// $grid->column('created_at');
// $grid->column('updated_at')->sortable();
// 快捷搜索
$grid->quickSearch(['name', 'mobile', 'id_card'])->placeholder('请输入[姓名|手机号|身份证号码]')->width(25);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
$filter->like('name')->width(3);
$filter->like('id_card')->width(3);
$filter->like('mobile')->width(3);
$filter->equal('pharmacy_id')->select(PharmacyModel::all()->pluck('name', 'id'))->width(3);
});
if (Admin::user()->isRole('pharmacy')) {
// 行按钮控制
$grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableViewButton(); // 禁用详情按钮
$grid->disableRowSelector(); // 禁止选中行
// 工具栏按钮控制
$grid->disableBatchActions(); // 禁用批量按钮
$grid->disableCreateButton(); // 禁止创建按钮
} else {
// 快捷搜索
$grid->quickSearch(['name', 'mobile', 'id_card'])->placeholder('请输入[姓名|手机号|身份证号码]')->width(25);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
$filter->like('name')->width(3);
$filter->like('id_card')->width(3);
$filter->like('mobile')->width(3);
$filter->equal('pharmacy_id')->select(PharmacyModel::all()->pluck('name', 'id'))->width(3);
});
$grid->setActionClass(Grid\Displayers\Actions::class);
// 行按钮控制
$grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableViewButton(); // 禁用详情按钮
$grid->setActionClass(Grid\Displayers\Actions::class);
// 行按钮控制
$grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableViewButton(); // 禁用详情按钮
// 工具栏按钮控制
$grid->disableBatchDelete(); // 禁用批量删除
// 工具栏按钮控制
$grid->disableBatchDelete(); // 禁用批量删除
}
});
}
......@@ -111,27 +128,27 @@ protected function grid()
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new PharmacistRepository(), function (Show $show) {
$show->field('id')->width(4);
$show->field('name')->width(4);
$show->field('id_card')->width(4);
$show->field('license_number')->width(4);
$show->field('mobile')->width(4);
$show->field('practicing_license')->width(4);
$show->field('practicing_license_period')->width(4);
$show->field('physician_license')->width(4);
$show->field('signed_pic')->width(4);
$show->field('status')->width(4);
$show->field('created_at')->width(4);
$show->field('updated_at')->width(4);
$show->panel()->tools(function ($tools) {
$tools->disableDelete(); // 禁止删除按钮
});
});
}
// protected function detail($id)
// {
// return Show::make($id, new PharmacistRepository(), function (Show $show) {
// $show->field('id')->width(4);
// $show->field('name')->width(4);
// $show->field('id_card')->width(4);
// $show->field('license_number')->width(4);
// $show->field('mobile')->width(4);
// $show->field('practicing_license')->width(4);
// $show->field('practicing_license_period')->width(4);
// $show->field('physician_license')->width(4);
// $show->field('signed_pic')->width(4);
// $show->field('status')->width(4);
// $show->field('created_at')->width(4);
// $show->field('updated_at')->width(4);
// $show->panel()->tools(function ($tools) {
// $tools->disableDelete(); // 禁止删除按钮
// });
// });
// }
/**
* Make a form builder.
......@@ -141,6 +158,13 @@ protected function detail($id)
protected function form()
{
return Form::make(new PharmacistRepository(), function (Form $form) {
$pharmacyId = $form->model()->pharmacy_id;
if (Admin::user()->isRole('pharmacy') && Admin::user()->pharmacy_id != $pharmacyId) {
admin_exit(
Content::make()
->body(Alert::make('您无法进行此操作~', '无权操作')->danger())
);
}
$form->column(6, function (Form $form) {
$form->display('id');
$form->text('name')->required()->maxLength(32, '最多输入32个字符');
......@@ -161,17 +185,14 @@ protected function form()
$form->column(6, function (Form $form) {
$form->image('practicing_license')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->required();
$form->image('physician_license')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false);
$form->image('signed_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false);
$form->image('signed_pic')->accept('jpg,png,jpeg')->uniqueName()->autoUpload()->retainable()->removable(false)->help("<span style='color:red;'>图片尺寸要求:600x400,即3:2的比例</span>");
});
$form->saving(function (Form $form) {
if ($form->mobile && ! preg_match('/^1[3456789]{1}[0-9]{9}$/', $form->mobile)) {
return $form->response()->error('手机号格式错误');
}
$idValidator = new IdValidator();
// if ($form->id_card && ! $idValidator->isValid($form->id_card)) {
if (! empty($form->id_card) && strlen($form->id_card) != 18) {
if ($form->id_card && ! validateIDCard($form->id_card)) {
return $form->response()->error('身份证格式错误');
}
});
......
......@@ -62,6 +62,8 @@ protected function grid()
$filter->like('drug.name', '药品名称')->width(3);
$filter->like('drug.code', '药品简码')->width(3);
$filter->like('drug.factory', '生产厂家')->width(3);
$filter->like('drug.approval_no', '批准文号')->width(3);
$filter->in('drug.drug_type', '药品类型')->checkbox(DrugModel::DRUG_TYPE_MAP)->width(3);
});
// 行按钮控制
......@@ -70,7 +72,7 @@ protected function grid()
$grid->disableViewButton(); // 禁用详情按钮
// 工具栏按钮控制
$grid->disableBatchDelete(); // 禁用批量删除
// $grid->disableBatchDelete(); // 禁用批量删除
});
}
......@@ -132,7 +134,7 @@ protected function form()
});
// 右上角按钮控制
$form->disableDeleteButton(); // 去掉删除按钮
// $form->disableDeleteButton(); // 去掉删除按钮
$form->disableViewButton(); // 去掉跳转详情页按钮
});
}
......
<?php
namespace App\Admin\Controllers;
use App\Admin\Extensions\ToolBar\Actions\AddPharmacyDrugAction;
use App\Admin\Repositories\PharmacyDrugRepository;
use App\Models\DosageModel;
use App\Models\DrugModel;
use App\Models\DrugUnitModel;
use App\Models\ExternalPrescriptionModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Show;
class PharmacyExternalPrescriptionController extends AdminController
{
public function index(Content $content)
{
return $content
->header('580处方') // 设置 content-header 的标题
->description('列表') // 可选,设置 content-header 的副标题
->body($this->grid()); // 设置页面主体为 Grid
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new ExternalPrescriptionModel(), function (Grid $grid) {
if (! Admin::user()->pharmacy_id) {
admin_exit(Content::make()->withError(trans('admin.deny')));
}
$grid->model()->orderBy('id', 'DESC');
$grid->model()->where('pharmacy_id', Admin::user()->pharmacy_id);
$grid->column('id')->sortable();
$grid->column('external_prescription_id','580处方单编号');
$grid->column('issue_at','处方开具时间')->sortable();
$grid->column('status','状态');
$grid->column('company_name','企业名称');
$grid->column('pharmacy_name','药店名称');
// $grid->column('pharmacy_id');
$grid->column('agent','会员/代理人');
$grid->column('patient_name','就诊人姓名');
$grid->column('patient_mobile','就诊人手机号');
$grid->column('patient_gender','就诊人性别')->using(ExternalPrescriptionModel::SEX_MAP);
$grid->column('patient_age','就诊人年龄');
$grid->column('patient_id_card','就诊人身份证号');
$grid->column('doctor_name','接诊医师姓名');
$grid->column('diagnosis','诊断');
$grid->column('drug_info','用药信息')->display(function ($drugInfoJson) {
// 尝试将 $drugInfoJson 解码为数组
$drugInfoArray = json_decode($drugInfoJson, true);
// 检查解码是否成功且 $drugInfoArray 是一个数组
if (is_array($drugInfoArray)) {
// 使用 array_map 来格式化每个药物的信息
$formattedDrugs = array_map(function ($item) {
return $item['drug_name'] . ' : ' . ($item['drug_spec'] ?? '') . ' : ' . $item['drug_num'];
}, $drugInfoArray);
// 将数组转换为以逗号分隔的字符串(或根据您的需求进行其他格式化)
return implode(', ', $formattedDrugs);
} else {
// 如果解码失败或 $drugInfoJson 不是一个有效的 JSON 字符串,返回原始值或错误消息
return $drugInfoJson; // 或者返回一个错误消息,如 'Invalid JSON'
}
})->label(); // 设置列的标签
$grid->column('pharmacist_name','审核药师');
$grid->column('review_at','审核时间');
$grid->column('pharmacist_attr','药师属性');
$grid->column('dispatcher','调配人');
$grid->column('checker','核对人');
$grid->column('dispenser','发药人');
// $grid->column('created_at');
// $grid->column('updated_at')->sortable();
// 工具栏普通按钮
// $grid->tools(function ($tools) {
// $tools->append(new ExternalPrescriptionImportAction()); // 导入药品信息
// });
$grid->filter(function (Grid\Filter $filter) {
//$filter->equal('id');
$filter->panel(); // 更改为 panel 布局
$filter->expand(); // 默认展开搜索框
$filter->equal('external_prescription_id','580处方单编号')->width(3);
// $filter->equal('pharmacy_id')->select(PharmacyModel::all()->pluck('name', 'id'))->width(3);
// $filter->equal('pharmacy_id','药店编号')->width(3);
$filter->like('patient_name','就诊人姓名')->width(3);
$filter->like('patient_mobile','就诊人手机号')->width(3);
$filter->like('doctor_name','接诊医生')->width(3);
});
// 行按钮控制
$grid->disableCreateButton(); // 禁用创建按钮
$grid->disableDeleteButton(); // 禁用删除按钮
$grid->disableEditButton(); // 禁用编辑按钮
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
// return Content::make()->title('详情')->description('详情')->body($this->showDetail($id));
return Show::make($id, new ExternalPrescriptionModel(), function (Show $show) {
$show->field('id');
$show->field('external_prescription_id','580处方单编号');
$show->field('issue_at','处方开具时间');
$show->field('status','状态');
$show->field('company_name','企业名称');
$show->field('pharmacy_name','药店名称');
//$show->field('pharmacy_id');
$show->field('agent','会员/代理人');
$show->field('patient_name','就诊人姓名');
$show->field('patient_mobile','就诊人手机号');
$show->field('patient_gender','就诊人性别')->using(ExternalPrescriptionModel::SEX_MAP)->width(3);
$show->field('patient_age','就诊人年龄');
$show->field('patient_id_card','就诊人身份证号');
$show->field('doctor_name','接诊医师姓名');
$show->field('diagnosis','诊断');
$show->field('drug_info','用药信息')->as(function ($drugInfoJson) {
// 尝试将 $drugInfoJson 解码为数组
$drugInfoArray = json_decode($drugInfoJson, true);
// 检查解码是否成功且 $drugInfoArray 是一个数组
if (is_array($drugInfoArray)) {
// 使用 array_map 来格式化每个药物的信息
$formattedDrugs = array_map(function ($item) {
return $item['drug_name'] . ' : ' . ($item['drug_spec'] ?? '') . ' : ' . $item['drug_num'];
}, $drugInfoArray);
// 将数组转换为以逗号分隔的字符串(或根据您的需求进行其他格式化)
return implode(', ', $formattedDrugs);
} else {
// 如果解码失败或 $drugInfoJson 不是一个有效的 JSON 字符串,返回原始值或错误消息
return $drugInfoJson; // 或者返回一个错误消息,如 'Invalid JSON'
}
})->label(); // 设置列的标签
$show->field('pharmacist_name','审核药师');
$show->field('review_at','审核时间');
$show->field('pharmacist_attr','药师属性');
$show->field('dispatcher','调配人');
$show->field('checker','核对人');
$show->field('dispenser','发药人');
// $show->field('created_at');
// $show->field('updated_at');
$show->panel()->tools(function ($tools) {
$tools->disableEdit();
$tools->disableDelete(); // 禁止删除按钮
});
});
}
protected function showDetail($id){
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new ExternalPrescriptionModel(), function (Form $form) {
$form->display('id');
$form->text('external_prescription_id');
$form->text('issue_at');
$form->text('status');
$form->text('company_name');
$form->text('pharmacy_name');
$form->text('pharmacy_id');
$form->text('agent');
$form->text('patient_name');
$form->text('patient_mobile');
$form->text('patient_gender');
$form->text('patient_age');
$form->text('patient_id_card');
$form->text('doctor_name');
$form->text('diagnosis');
$form->text('drug_info');
$form->text('pharmacist_name');
$form->text('review_at');
$form->text('pharmacist_attr');
$form->text('dispatcher');
$form->text('checker');
$form->text('dispenser');
$form->display('created_at');
$form->display('updated_at');
});
}
}
\ No newline at end of file
......@@ -32,6 +32,7 @@ protected function grid()
$grid->column('id', '处方单编号')->sortable();
$grid->column('status')->using(PrescriptionModel::PRESCRIPTION_STATUS_MAP)->badge(PrescriptionModel::PRESCRIPTION_STATUS_MAP_COLOR);
$grid->column('prescription_type')->using(PrescriptionModel::PRESCRIPTION_TYPE_MAP);
$grid->column('reject_status')->using(PrescriptionModel::REJECT_STSATUS_MAP);
$grid->column('patient_name');
$grid->column('patient_age');
$grid->column('patient_gender')->using(PatientModel::SEX_MAP);
......@@ -78,6 +79,7 @@ protected function grid()
$filter->expand(); // 默认展开搜索框
$filter->equal('pharmacy_id')->select(PharmacyModel::all()->pluck('name', 'id'))->width(3);
$filter->like('id', '处方单编号')->width(3);
$filter->like('patient_name')->width(3);
$filter->like('diagnosis_name')->width(3);
$filter->in('status')->checkbox(PrescriptionModel::PRESCRIPTION_STATUS_MAP)->width(3);
......
<?php
namespace App\Admin\Controllers;
use App\Admin\Repositories\Symptom;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Show;
class SymptomController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Symptom(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('name');
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new Symptom(), function (Show $show) {
$show->field('id');
$show->field('id');
$show->field('name');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Symptom(), function (Form $form) {
$form->display('id');
$form->text('name');
$form->display('created_at');
$form->display('updated_at');
});
}
}
......@@ -41,9 +41,11 @@ public function form()
$this->number('diagnosis_limit', '选择诊断数限制')->required()->default(($data['diagnosis_limit'] ?? 1))->min(1)->max(5)->help('诊断数选择设置1-5');
$this->number('drug_choose_limit', '选择药品限制')->required()->default(($data['drug_choose_limit'] ?? 5))->min(1)->max(5)->help('药品目录选择数,最多可设置5');
$this->number('doses_limit', '中药剂量限制')->required()->default(($data['doses_limit'] ?? 1))->min(1)->max(100)->help('剂量可选择最大值100');
// $this->switch('prescription_auto', '医师自动开方')->default(($data['prescription_auto'] ?? 0));
$this->text('limit_keywords','限制关键词')->default($data['limit_keywords'] ?? '')->required()->help('多个关键词请用英文逗号分隔');
$this->text('limit_keywords', '麻黄素类药品限制关键词')->default($data['limit_keywords'] ?? '')->required()->help('多个关键词请用英文逗号分隔');
$this->number('ephedrine_limit_buy_7', '麻黄素类药品7日内限购(全局)')->required()->default(($data['ephedrine_limit_buy_7'] ?? 1))->min(1)->max(10)->help('最多可设置10');
$this->text('limit_test_id', '用户端禁用测试药店ID')->default($data['limit_test_id'] ?? '')->help('多个ID请用英文逗号分隔');
$this->disableResetButton();
}
}
<?php
namespace App\Admin\Extensions\ToolBar\Actions;
use App\Admin\Extensions\ToolBar\Forms\DrugImportForm;
use App\Admin\Extensions\ToolBar\Forms\ExternalPrescriptionImportForm;
use Dcat\Admin\Grid\Tools\AbstractTool;
use Dcat\Admin\Widgets\Modal;
class ExternalPrescriptionImportAction extends AbstractTool
{
public $title = '导入580处方单';
public function html(): Modal
{
return Modal::make()
->lg()
->title($this->title)
->body(new ExternalPrescriptionImportForm())
->button("<button class='btn btn-success'><i class='feather icon-upload'></i>&nbsp;{$this->title}</button>");
}
}
<?php
namespace App\Admin\Extensions\ToolBar\Actions;
use App\Admin\Extensions\ToolBar\Forms\PharmacyDosageImportForm;
use Dcat\Admin\Grid\Tools\AbstractTool;
use Dcat\Admin\Widgets\Modal;
class PharmacyDosageImportAction extends AbstractTool
{
public $title = '导入用法用量';
public function html(): Modal
{
return Modal::make()
->lg()
->title($this->title)
->body(new PharmacyDosageImportForm())
->button("<button class='btn btn-success'><i class='feather icon-upload'></i>&nbsp;{$this->title}</button>");
}
}
......@@ -52,12 +52,12 @@ public function handle(array $input): JsonResponse
$drugModel->factory = $item['生产企业'];
$drugModel->approval_no = $item['批准文号'];
$drugModel->mnemonic = $item['助记码'];
$drugModel->standard_code = $item['本位码'];
$drugModel->category_code = $item['分类码'];
$drugModel->category_name = $item['分类名称'];
$drugModel->is_foreign = self::toBool($item['是否进口药']);
$drugModel->is_rx = self::toBool($item['是否处方药']);
$drugModel->is_si = self::toBool($item['是否医保药']);
$drugModel->standard_code = $item['本位码'] ?? '';
$drugModel->category_code = $item['分类码'] ?? '';
$drugModel->category_name = $item['分类名称'] ?? '';
$drugModel->is_foreign = self::toBool($item['是否进口药'] ?? '');
$drugModel->is_rx = self::toBool($item['是否处方药'] ?? '');
$drugModel->is_si = self::toBool($item['是否医保药'] ?? '');
if ($drugModel->save()) {
$successNum++;
}
......
<?php
namespace App\Admin\Extensions\ToolBar\Forms;
use App\Models\DosageModel;
use App\Models\ExternalPrescriptionModel;
use App\Models\PharmacyModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Http\JsonResponse;
use Dcat\Admin\Widgets\Form;
use Dcat\EasyExcel\Excel;
use Dcat\EasyExcel\Sheet;
use Dcat\EasyExcel\Support\SheetCollection;
use Illuminate\Support\Facades\Log;
use Exception;
set_time_limit(1800);
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 10800);
ini_set('max_input_time', 10800);
class ExternalPrescriptionImportForm extends Form
{
/**
* 处理表单提交逻辑.
*/
public function handle(array $input): JsonResponse
{
// 表单参数
$file = $input['import_file'];
$filePath = storage_path('app/'.$file);
// Log::info("====>".$filePath);
try {
# $excel = Excel::import($filePath)->toArray();
// Get the sheet names from the file
# $sheetNames = $excel[0]->getSheetNames();
# Log::info("====>".$sheetNames."====>".json_encode($excel));
// 每100行数据为一批数据进行读取
$chunkSize = 10;
$successNum = 0;
$failNum = 0;
$data = Excel::import($filePath)->sheet('处方明细列表')->toArray();
if(!empty($data) && is_array($data)){
// 判断处方单编号是会否重复,如果重复需进行合并药品数据
$prescriptions = [];
foreach($data as $row){
$prescriptionNo = $row['处方编号'];
$drug_info['drug_name'] = $row['药品名称'] ?? '';
$drug_info['drug_spec'] = $row['药品规格'] ?? '';
$drug_info['drug_num'] = $row['药品数量'] ?? 0;
if(!isset($prescriptions[$prescriptionNo])){
$prescriptions[$prescriptionNo] = $row;
}
$prescriptions[$prescriptionNo]['药品明细'][] = $drug_info;
}
// 循环插入数据
foreach($prescriptions as $prescriptionNo=>$prescription){
// 校验数据库中是否存在该数据
$externalPrescriptionModel = ExternalPrescriptionModel::where('external_prescription_id', $prescriptionNo)->first();
if( !$externalPrescriptionModel ){
$externalPrescriptionModel = new ExternalPrescriptionModel;
}
// 查找对应的药店ID
$pharmacy = PharmacyModel::where('name', $prescription['门店名称'])->first();
$pharmacyId = 0;
if( $pharmacy ){
$pharmacyId = $pharmacy->id;
}
$externalPrescriptionModel->external_prescription_id = $prescriptionNo;
$externalPrescriptionModel->issue_at = $prescription['处方开具时间'];
$externalPrescriptionModel->status = $prescription['处方状态'];
$externalPrescriptionModel->company_name = $prescription['企业名称'];
$externalPrescriptionModel->pharmacy_name = $prescription['门店名称'];
$externalPrescriptionModel->pharmacy_id = $pharmacyId;
$externalPrescriptionModel->agent = $prescription['会员/代理人'];
$externalPrescriptionModel->patient_name = $prescription['就诊人姓名'];
$externalPrescriptionModel->patient_mobile = $prescription['就诊人电话'];
$externalPrescriptionModel->patient_gender = self::getGender($prescription['就诊人性别']);
$externalPrescriptionModel->patient_age = $prescription['就诊人年龄'];
$externalPrescriptionModel->patient_id_card = $prescription['就诊人身份证号'] ?? '';
$externalPrescriptionModel->doctor_name = $prescription['接诊医师姓名'] ?? '';
$externalPrescriptionModel->diagnosis = $prescription['诊断'];
$externalPrescriptionModel->drug_info = json_encode($prescription['药品明细']);
$externalPrescriptionModel->pharmacist_name = $prescription['审核药师'] ?? '';
if($prescription['药师审核时间']){
$externalPrescriptionModel->review_at = $prescription['药师审核时间'];
}
$externalPrescriptionModel->pharmacist_attr = $prescription['药师属性'] ?? '';
$externalPrescriptionModel->dispatcher = $prescription['调配人'] ?? '';
$externalPrescriptionModel->checker = $prescription['核对人'] ?? '';
$externalPrescriptionModel->dispenser = $prescription['发药人'] ?? '';
if( $externalPrescriptionModel->save() ){
$successNum++;
}
}
// Log::info("prescriptions====>".json_encode($prescriptions));
}
$return = $this->response()->success("导入成功{$successNum}条")->refresh();
unlink($filePath);
} catch (Exception $e) {
$return = $this->response()->error("导入失败{$failNum}条:".$e->getMessage());
}
return $return;
}
/**
* 构造表单.
*/
public function form()
{
$this->file('import_file', '文件')
->disk('local')
->accept('xlsx')
->maxSize(1024 * 30)
->autoUpload()
->uniqueName()
->required()
->help("导入要求:<br />
<span style='color:red;'>
1、仅支持xlsx格式
</span>");
$downloadUrl = admin_url('prescription-template');
$this->html("<a target='_blank' href='{$downloadUrl}'>下载580处方单导入模板</a>");
}
private static function getGender($value){
$value = trim($value);
switch ($value) {
case '男':
return 1;
case '女':
return 2;
default:
return 0;
}
}
}
\ No newline at end of file
<?php
namespace App\Admin\Extensions\ToolBar\Forms;
use App\Models\DosageModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Http\JsonResponse;
use Dcat\Admin\Widgets\Form;
use Dcat\EasyExcel\Excel;
use Dcat\EasyExcel\Support\SheetCollection;
use Exception;
set_time_limit(1800);
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 10800);
ini_set('max_input_time', 10800);
class PharmacyDosageImportForm extends Form
{
/**
* 处理表单提交逻辑.
*/
public function handle(array $input): JsonResponse
{
if (! Admin::user()->isRole('pharmacy') || ! Admin::user()->pharmacy_id) {
admin_exit(Content::make()->withError(trans('admin.deny')));
}
$pharmacyId = Admin::user()->pharmacy_id;
// 表单参数
$file = $input['import_file'];
$filePath = storage_path('app/'.$file);
try {
// 每100行数据为一批数据进行读取
$chunkSize = 10;
$successNum = 0;
$failNum = 0;
Excel::import($filePath)->first()->chunk($chunkSize, function (SheetCollection $collection) use (&$successNum, $pharmacyId) {
// 此处的数组下标依然是excel表中数据行的行号
$rows = $collection->toArray();
foreach ($rows as $row) {
$item = array_map(function ($value) {
return is_string($value) ? trim($value) : $value;
}, $row);
$dosageModel = null;
if (isset($item['用法用量']) && $item['用法用量']) {
$dosageModel = DosageModel::where('dosage_desc', $item['用法用量'])->where('pharmacy_id', $pharmacyId)->first();
}
if (! $dosageModel) {
$dosageModel = new DosageModel;
}
$dosageModel->pharmacy_id = $pharmacyId;
$dosageModel->dosage_desc = $item['用法用量'];
$dosageModel->dosage_show = $item['显示内容'] ?? '';
if ($dosageModel->save()) {
$successNum++;
}
}
});
$return = $this->response()->success("导入成功{$successNum}条")->refresh();
unlink($filePath);
} catch (Exception $e) {
$return = $this->response()->error("导入失败{$failNum}条:".$e->getMessage());
}
return $return;
}
/**
* 构造表单.
*/
public function form()
{
$this->file('import_file', '文件')
->disk('local')
->accept('xlsx,csv')
->maxSize(1024 * 30)
->autoUpload()
->uniqueName()
->required()
->help("导入要求:<br />
<span style='color:red;'>
1、支持xlsx、csv两种格式
</span>");
$downloadUrl = admin_url('dosage-template');
$this->html("<a target='_blank' href='{$downloadUrl}'>下载用法用量导入模板</a>");
}
}
......@@ -18,10 +18,10 @@ protected function init()
$this->title('New Users');
$this->dropdown([
'7' => 'Last 7 Days',
'28' => 'Last 28 Days',
'30' => 'Last Month',
'365' => 'Last Year',
// '7' => 'Last 7 Days',
// '28' => 'Last 28 Days',
// '30' => 'Last Month',
// '365' => 'Last Year',
]);
}
......
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
class NewUsers extends Line
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$this->title('药店数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
// $generator = function ($len, $min = 10, $max = 300) {
// for ($i = 0; $i <= $len; $i++) {
// yield mt_rand($min, $max);
// }
// };
// switch ($request->get('option')) {
// case '365':
// // 卡片内容
// $this->withContent(mt_rand(1000, 5000).'k');
// // 图表数据
// $this->withChart(collect($generator(30))->toArray());
// break;
// case '30':
// // 卡片内容
// $this->withContent(mt_rand(400, 1000).'k');
// // 图表数据
// $this->withChart(collect($generator(30))->toArray());
// break;
// case '28':
// // 卡片内容
// $this->withContent(mt_rand(400, 1000).'k');
// // 图表数据
// $this->withChart(collect($generator(28))->toArray());
// break;
// case '7':
// default:
// 卡片内容
$this->withContent('89.2k');
// 图表数据
// $this->withChart([28, 40, 36, 52, 38, 60, 55]);
//}
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => [
[
'name' => $this->title,
'data' => $data,
],
],
]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PatientModel;
class Patient extends Line
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$this->title('问诊人数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
$query_time = date('Y-m-d 23:59:59');
$patient_count = PatientModel::where('created_at','<=',$query_time)->count();
// 卡片内容
$this->withContent($patient_count);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => [
[
'name' => $this->title,
'data' => $data,
],
],
]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PharmacistModel;
class Pharmacist extends Line
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$this->title('药师数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
$query_time = date('Y-m-d 23:59:59');
$pharmacist_count = PharmacistModel::where('created_at','<=',$query_time)->count();
// 卡片内容
$this->withContent($pharmacist_count);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
// return $this->chart([
// 'series' => [
// [
// 'name' => $this->title,
// 'data' => $data,
// ],
// ],
// ]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PharmacyModel;
class Pharmacy extends Line
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$this->title('药店数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
$query_time = date('Y-m-d 23:59:59');
$pharmacy_count = PharmacyModel::where('created_at','<=',$query_time)->count();
// 卡片内容
$this->withContent($pharmacy_count);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
// return $this->chart([
// 'series' => [
// [
// 'name' => $this->title,
// 'data' => $data,
// ],
// ],
// ]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PrescriptionModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Bar;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
class PharmacyChart extends Bar
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$date = date('Y-m-d',strtotime('-1 day'));
$this->title($date .'开方药店数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
// $query_time = date('Y-m-d 23:59:59');
// $prescription_total = PrescriptionModel::where('created_at','<=',$query_time)->count();
$yesterdayEnd = Carbon::yesterday()->endOfDay();
$eightDaysAgoStart = clone $yesterdayEnd;
$eightDaysAgoStart->subDays(7)->startOfDay();
$datesRange = [];
for ($date = clone $eightDaysAgoStart; $date->lte($yesterdayEnd); $date->addDay()) {
$query_date = $date->format('Y-m-d');
$res = DB::select(
'SELECT COUNT(DISTINCT pharmacy_id) AS pharmacy_count
FROM prescription
WHERE created_at >= :start_of_day
AND created_at < :next_day
AND status = 2',
[
'start_of_day' => $query_date . ' 00:00:00',
'next_day' => $query_date . ' 23:59:59'
]
);
$datesRange[$query_date] = $res[0]->pharmacy_count;
}
// Log::info('结果123:'.json_encode($datesRange));
$labels = array_keys($datesRange);
$data = array_values($datesRange);
// 卡片内容
$this->withContent($data[7] ?? 0);
// 图表数据
$this->withChart([
[
'name' => '近七日开方药店量',
'data' => $data,
],
]);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => $data,
]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PrescriptionModel;
class Prescription extends Line
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$this->title('处方数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
$query_time = date('Y-m-d 23:59:59');
$prescription_total = PrescriptionModel::where('created_at','<=',$query_time)->count();
// 卡片内容
$this->withContent($prescription_total);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
// return $this->chart([
// 'series' => [
// [
// 'name' => $this->title,
// 'data' => $data,
// ],
// ],
// ]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
<?php
namespace App\Admin\Metrics\Statistics;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use App\Models\PrescriptionModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Metrics\Bar;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
class PrescriptionChart extends Bar
{
/**
* 初始化卡片内容
*
* @return void
*/
protected function init()
{
parent::init();
$date = date('Y-m-d',strtotime('-1 day'));
$this->title($date .'开方数量');
}
/**
* 处理请求
*
*
* @return mixed|void
*/
public function handle(Request $request)
{
// $query_time = date('Y-m-d 23:59:59');
// $prescription_total = PrescriptionModel::where('created_at','<=',$query_time)->count();
$yesterdayEnd = Carbon::yesterday()->endOfDay(); // 昨天的23:59:59
// Log::info('参数:' . $yesterdayEnd->format('Y-m-d H:i:s')); // 输出日志信息
$eightDaysAgoStart = clone $yesterdayEnd;
$eightDaysAgoStart->subDays(7)->startOfDay(); // 八天前的00:00:00
// 创建包含过去7天日期的完整数组
$datesRange = [];
for ($date = clone $eightDaysAgoStart; $date->lte($yesterdayEnd); $date->addDay()) {
$datesRange[$date->format('Y-m-d')] = 0; // 初始化所有日期为0
}
$prescriptionCounts = DB::table('prescription')
->select(
DB::raw('DATE(created_at) as date'), // 只获取日期部分
DB::raw('COUNT(*) as prescriptions_count') // 计算每一天的总数
)
->whereBetween('created_at', [$eightDaysAgoStart, $yesterdayEnd]) // 筛选从昨天23:59:59起过去七天的数据
->groupBy('date') // 按日期分组
->orderBy('date') // 按日期排序
->get(); // 执行查询并获取结果
// 将查询结果合并到日期范围数组中
foreach ($prescriptionCounts as $day) {
if (isset($datesRange[$day->date])) {
$datesRange[$day->date] = $day->prescriptions_count;
}
}
// Log::info('结果:'.json_encode($datesRange));
$labels = array_keys($datesRange);
$data = array_values($datesRange);
// 卡片内容
$this->withContent($data[7] ?? 0);
// 图表数据
$this->withChart([
[
'name' => '近七日开方量',
'data' => $data,
],
]);
}
/**
* 设置图表数据.
*
*
* @return $this
*/
public function withChart(array $data)
{
return $this->chart([
'series' => $data,
]);
}
/**
* 设置卡片内容.
*
* @param string $content
* @return $this
*/
public function withContent($content)
{
return $this->content(
<<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
<h2 class="ml-1 font-lg-1">{$content}</h2>
</div>
HTML
);
}
}
......@@ -24,7 +24,7 @@ public function grid(): Grid
$grid->column('is_rx', '处方药')->using(DrugModel::RX_MAP);
$grid->column('spec', '规格');
$grid->column('dosage_form', 'dosage_form');
$grid->column('factory', '生产厂家');
$grid->column('factory', '生产企业');
$grid->column('approval_no', '批准文号');
$grid->column('limit_buy_7', '7天限购');
......@@ -35,11 +35,17 @@ public function grid(): Grid
$filter->like('name', '药品名称')->width(3);
$filter->like('code', '简码')->width(3);
$filter->like('factory', '生产厂家')->width(3);
$filter->like('factory', '生产企业')->width(3);
$filter->like('standard_code', '本位码')->width(3);
$filter->like('approval_no', '批准文号')->width(3);
$filter->in('drug_type', '药品类型')->checkbox(DrugModel::DRUG_TYPE_MAP)->width(3);
$filter->in('is_foreign', '是否进口药')->checkbox(DrugModel::FOREIGN_MAP)->width(3);
$filter->in('is_rx', '是否处方药')->checkbox(DrugModel::RX_MAP)->width(3);
$filter->in('is_si', '是否医保药')->checkbox(DrugModel::SI_MAP)->width(3);
});
// 行按钮控制
$grid->paginate(10);
$grid->paginate(100);
$grid->disableActions();
});
}
......
<?php
namespace App\Admin\Repositories;
use App\Models\ExternalPrescription as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class ExternalPrescription extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}
<?php
namespace App\Admin\Repositories;
use App\Models\Symptom as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class Symptom extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}
......@@ -49,6 +49,10 @@
$router->resource('prescription', 'PrescriptionController');
// 处方-处方日志
$router->resource('prescription-log', 'PrescriptionLogController');
// 处方-外部处方列表
$router->resource('external-prescription', 'ExternalPrescriptionController');
// 下载导出模板
$router->get('prescription-template', 'ExternalPrescriptionController@exportPrescriptionTemplate');
// 系统-设置
$router->resource('site-config', 'SiteConfigController');
......@@ -68,12 +72,16 @@
$router->resource('prescription-print', 'PrescriptionPrintController');
// 用法用量
$router->resource('dosage', 'DosageController');
// 下载导出模板
$router->get('dosage-template', 'DosageController@exportDosageTemplate');
// 搜索生成处方单
$router->post('prescription-search', 'PrescriptionPrintController@search');
// 打印处方单
$router->get('/print', 'PrintController@print');
// 药店-设置
$router->resource('pharmacy-config', 'PharmacyConfigController');
// 药店-外部处方单
$router->resource('pharmacy-external-prescription', 'PharmacyExternalPrescriptionController');
});
$router->get('/auth/smscode', 'AuthController@getLoginSmsCode');
/** 药店菜单-end **/
......
......@@ -18,6 +18,8 @@ public function test()
public function diagnosisList(Request $request)
{
$search_input = $request->input('search_input');
$type = $request->input('type', 0);
// $query = DiagnosiModel::query()->where('type', $type);
$query = DiagnosiModel::query();
if ($search_input) {
$query->where('name', 'like', "%{$search_input}%")
......
<?php
namespace App\Api\Controllers;
use App\Http\Controllers\BaseApiController;
use App\Models\DosageModel;
use App\Models\PharmacyModel;
use Illuminate\Http\Request;
// 用法用量控制器
class DosageController extends BaseApiController
{
public function test()
{
return $this->success('ok');
}
// 获取用法用量
public function dosageList(Request $request)
{
$authInfo = auth('api')->user();
// 获取药店信息
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('您的账号可能在其他设备登录,请重新登录!');
}
$dosages = DosageModel::where('pharmacy_id', $pharmacy->id)->get()->toArray();
return $this->success($dosages);
}
}
......@@ -11,8 +11,8 @@
use App\Services\SmsService;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
// 药品控制器
class DrugController extends BaseApiController
......@@ -66,6 +66,7 @@ public function drugList(Request $request)
$pharmacy_id = $pharmacy->id;
}
$search_input = $request->input('search_input');
$drug_type = $request->input('drug_type', 0);
// $data = PharmacyDrugModel::where('pharmacy_id', $pharmacy_id)
// ->whereNotNull('dosage_id')
// ->whereHas('drug', function ($query) use ($search_input) {
......@@ -78,9 +79,9 @@ public function drugList(Request $request)
// ->paginate(10);
$data = PharmacyDrugModel::where('pharmacy_id', $pharmacy_id)
// ->whereNotNull('dosage_id')
->whereHas('drug', function ($query) use ($search_input) {
->whereHas('drug', function ($query) use ($search_input, $drug_type) {
//$query->where('is_rx', DrugModel::RX_TRUE)
$query->where(function ($subQuery) use ($search_input) {
$query->where('drug_type', $drug_type)->where(function ($subQuery) use ($search_input) {
if ($search_input) {
$subQuery->where('name', 'LIKE', "%{$search_input}%")
->orWhere('code', 'LIKE', "%{$search_input}%");
......@@ -99,54 +100,124 @@ public function drugList(Request $request)
// 药品7日内限购
public function drugLimit(Request $request)
{
// 当前药品未设置则使用全局的7日内限购
$site_config = DB::table('admin_settings')->where('slug', 'site_config')->value('value');
$site_config = json_decode($site_config, true);
$limit_num = intval($site_config['prescription_limit_buy_7']);
$limit_type = intval($site_config['prescription_limit_buy_7']) > 0 ? 1 : 0; // 1为限购,0为不限购
$drug_id = $request->input('drug_id');
// 判断当前药品有没有设置7日内限购
$drug = DrugModel::query()->find($drug_id);
if ($drug && intval($drug->limit_buy_7) > 0) {
$limit_num = $drug->limit_buy_7;
$limit_type = 1;
}
$drugs = $request->input('drugs'); // [{'drug_id'=>1,'num'=>1},{'drug_id'=>2,'num'=>4}]
$patient_id = $request->input('patient_id');
$pharmacy_id = $request->input('pharmacy_id');
# $sevenDaysAgo = Carbon::now()->subDays(7);
// 当前药品未设置则使用全局的1日内限购
$site_config = admin_setting('site_config');
$site_config = json_decode($site_config, true);
$limit_num = intval($site_config['prescription_limit_buy_7']);
// 如果药品在这个黑名单中,则要判断7天最多买四盒
$limit_keywords = explode(',', $site_config['limit_keywords']); // 麻黄素 黑名单
// 查询已经开过方的药方(1天内)
$oneDayAgo = Carbon::now()->subDay();
$prescriptions = PrescriptionModel::where('patient_id', $patient_id)
->where('is_voided', PrescriptionModel::IS_VOIDED_FALSE) // 未作废的处方
->where('status', PrescriptionModel::PRESCRIPTION_STATUS_SUCCESS)
# ->where('pharmacy_id', $pharmacy_id)
// ->where('pharmacy_id', $pharmacy_id)
->where('created_at', '>=', $oneDayAgo)
->get();
$drugCounts = [];
// 判断搜索出来的处方不为空
if ($prescriptions->count() > 0) {
foreach ($prescriptions as $prescription) {
// $drugs = json_decode($prescription->drug_info, true); // Parse JSON data
$drugs = $prescription->drug_info;
if (count($drugs) > 0) {
foreach ($drugs as $drug) {
$drugId = $drug['drug_id'];
$drugCounts[$drugId] = ($drugCounts[$drugId] ?? 0) + $drug['num'];
foreach ($prescriptions as $prescription) {
$drugInfos = $prescription->drug_info ?? [];
foreach ($drugInfos as $drugInfo) {
$drugId = $drugInfo['drug_id'];
$drugCounts[$drugId] = ($drugCounts[$drugId] ?? 0) + intval($drugInfo['num']);
}
}
// 查询已经开过方的药方(7天内)
$sevenDayAgo = Carbon::now()->subDay(7);
$prescriptions_7 = PrescriptionModel::where('patient_id', $patient_id)
->where('is_voided', PrescriptionModel::IS_VOIDED_FALSE) // 未作废的处方
->where('status', PrescriptionModel::PRESCRIPTION_STATUS_SUCCESS)
// ->where('pharmacy_id', $pharmacy_id)
->where('created_at', '>=', $sevenDayAgo)
->get();
// 计算累计麻黄素药品购买数量
$buyed_mahuang_counts = 0;
foreach ($prescriptions_7 as $prescription_7) {
$drugInfos_7 = $prescription_7->drug_info ?? [];
foreach ($drugInfos_7 as $drugInfo_7) {
$drugName = $drugInfo_7['drug_name'] ?? '';
$isBlack = false;
foreach ($limit_keywords as $keyword) {
if (Str::contains($drugName, $keyword)) {
$isBlack = true;
break;
}
}
if ($isBlack) {
$buyed_mahuang_counts += $drugInfo_7['num'];
}
}
}
$canBuyMahuangCount = $site_config['ephedrine_limit_buy_7'] - $buyed_mahuang_counts; // 麻黄素药品剩余可购买数量
if ($canBuyMahuangCount < 0) {
$canBuyMahuangCount = 0;
}
$purchaseCount = $drugCounts[$drug_id] ?? 0;
Log::info('all_limit_num=>'.$limit_num.' drugCounts=>'.json_encode($drugCounts).' drugs=>'.json_encode($drugs).' canBuyMahuangCount=>'.$canBuyMahuangCount);
// 计算获取剩余可买的次数
$limit_num = $limit_num - $purchaseCount;
Log::info(' drug_id'.$drug_id.' limit_num=>'.$limit_num.' limit_type'.$limit_type);
// 处理麻黄素药品数据
$mahuangsu_buy_num = 0; // 本次购买麻黄素药品数量
$exclusions = []; // 单个药品的排他管理
foreach ($drugs as &$drug) {
$drugModel = DrugModel::find($drug['drug_id']);
if (! $drugModel) {
$errMsg = '药品不存在';
return $this->success(['limit_num' => $limit_num, 'limit_type' => $limit_type]);
return $this->failed($errMsg, ['add_status' => false], 200);
}
if ($drugModel->excluded_drug_ids) {
$exclusions[$drug['drug_id']] = $drugModel->excluded_drug_ids;
}
$drug['drug_name'] = $drugModel->name; // 冗余药品名称
$drug['mahuangsu_status'] = 0; // 0:不是麻黄素药品
$drug['limit_num'] = $limit_num; // 赋值全局限购数量
if ($drugModel->limit_buy_7 > 0) {
$drug['limit_num'] = $drugModel->limit_buy_7;
}
$buyedCount = $drugCounts[$drug['drug_id']] ?? 0; // 历史已购买数量
$canBuyCount = $drug['limit_num'] - $buyedCount; // 普通药品剩余可购买数量
if ($canBuyCount < $drug['num']) {
$errMsg = '药品['.$drugModel->name.']已到达购买限额吧~';
return $this->failed($errMsg, ['add_status' => false], 200);
}
$isBlack = false; // 药品默认不再限制名单中
foreach ($limit_keywords as $keyword) {
if (Str::contains($drugModel->name, $keyword)) {
$isBlack = true;
break;
}
}
if ($isBlack) {
$mahuangsu_buy_num += $drug['num'];
$drug['mahuangsu_status'] = 1; // 1:是麻黄素药品
if ($mahuangsu_buy_num > $canBuyMahuangCount) {
$errMsg = '药品['.($drugModel->name ?? '').']已到达购买限额吧~';
return $this->failed($errMsg, ['add_status' => false], 200);
}
}
}
// 检查单个药品的排他
if ($exclusions) {
foreach ($drugs as $drugItem) {
if (in_array($drugItem['drug_id'], $exclusions[$drugItem['drug_id']])) {
$errMsg = '药品['.$drugItem['drug_name'].']和您的其他药品不能同时购买~';
return $this->failed($errMsg, ['add_status' => false], 200);
}
}
}
return $this->success(['add_status' => true]);
}
}
......@@ -8,7 +8,9 @@
use App\Models\PharmacyModel;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Jxlwqq\IdValidator\IdValidator;
use Milon\Barcode\DNS2D;
// 问诊人控制器
class PatientController extends BaseApiController
......@@ -43,9 +45,9 @@ public function patientList(Request $request)
$page = $request->input('page', 1);
$perPage = $request->input('per_page', 10);
$data = $query->orderBy('id', 'desc')->paginate($perPage, ['*'], 'page', $page);
foreach ($data as $key => $value) {
$data[$key]['age'] = getAgeByIdCard($value['id_card']);
}
// foreach ($data as $key => $value) {
// $data[$key]['age'] = getAgeByIdCard($value['id_card']);
// }
return $this->success($data);
}
......@@ -66,20 +68,33 @@ public function add(Request $request)
$idValidator = new IdValidator();
// if (! $idValidator->isValid($data['id_card'])) {
// if( !in_array(strlen($data['id_card']),[15,18])){
if (strlen($data['id_card']) != 18) {
if (isset($data['id_card']) && !validateIDCard($data['id_card'])) { // 身份证非必填项
return $this->failed('身份证格式错误');
}
$mobile = $data['mobile'];
$verificationCode = cache()->get("sms_verification_code_{$mobile}");
$code = $data['code'];
if ($verificationCode != $code) {
return $this->failed('验证码错误');
if (! isset($data['age']) || $data['age'] <= 0) {
return $this->failed('年龄格式错误');
}
$idCardInfo = Util::getIdCardInfo($data['id_card']);
if (isset($data['gender']) && ! array_key_exists($data['gender'], PatientModel::SEX_MAP)) {
return $this->failed('性别错误');
}
$mobile = $data['mobile'];
// $verificationCode = cache()->get("sms_verification_code_{$mobile}");
// $code = $data['code'];
// if ($verificationCode != $code) {
// return $this->failed('验证码错误');
// }
// $idCardInfo = Util::getIdCardInfo($data['id_card']);
$patient->name = $data['name'];
$patient->id_card = $data['id_card'];
$patient->mobile = $mobile;
$patient->gender = $idCardInfo['gender'];
$patient->gender = $data['gender'];
$patient->age = $data['age'];
$patient->is_default = 0;
// $res = PatientModel::create($data);
$res = $patient->save();
......@@ -95,27 +110,40 @@ public function update(Request $request)
{
$id = $request->input('id');
$id_card = $request->input('id_card');
$gender = $request->input('gender');
$age = $request->input('age');
// 验证身份证格式
$idValidator = new IdValidator();
// if (! $idValidator->isValid($id_card)) {
if (strlen($id_card) != 18) {
if (isset($id_card) && !validateIDCard($id_card)) {
return $this->failed('身份证格式错误');
}
$idCardInfo = Util::getIdCardInfo($id_card);
if (intval($age) <= 0) {
return $this->failed('年龄格式错误');
}
if (! array_key_exists($gender, PatientModel::SEX_MAP)) {
return $this->failed('性别错误');
}
// $idCardInfo = Util::getIdCardInfo($id_card);
$data = PatientModel::find($id);
if (! $data) {
return $this->failed('该问诊人不存在');
}
$mobile = $request->input('mobile');
$verificationCode = cache()->get("sms_verification_code_{$mobile}");
$code = $request->input('code');
if ($verificationCode != $code) {
return $this->failed('验证码错误');
}
// $verificationCode = cache()->get("sms_verification_code_{$mobile}");
// $code = $request->input('code');
// if ($verificationCode != $code) {
// return $this->failed('验证码错误');
// }
$data->name = $request->input('name');
$data->id_card = $id_card;
$data->gender = $idCardInfo['gender'];
$data->gender = $gender;
$data->age = $age;
$data->mobile = $mobile;
$data->save();
......@@ -186,4 +214,74 @@ public function getDefault(Request $request)
return $this->failed('暂无默认问诊人');
}
}
public function duplicate(Request $request)
{
$data = $request->all();
$authInfo = auth('api')->user();
// 确保传递了 ID 参数
if (! isset($data['id']) || empty($data['id']) || ! is_numeric($data['id'])) {
return $this->failed('无效二维码');
}
// 根据传递的 ID 查找对应患者数据
$existingPatient = PatientModel::find($data['id']);
if (! $existingPatient) {
return $this->failed('未找到对应的患者记录');
}
// 创建新患者数据
$newPatient = new PatientModel();
// 根据登录类型设置用户或药店 ID
if ($authInfo->last_login_type == User::LOGIN_TYPE_USER) { // 用户
$newPatient->user_id = $authInfo->id;
} elseif ($authInfo->last_login_type == User::LOGIN_TYPE_PHARMACY) { // 药店
$pharmacy = PharmacyModel::query()->where('user_id', $authInfo->id)->first();
// 校验该药店是否已经存在手机号+用户名
$patientInfo = PatientModel::where('mobile', $existingPatient->mobile)->where('name', $existingPatient->name)->where('pharmacy_id', $pharmacy->id)->first();
// Log::info('patient=>'. json_encode($patientInfo).'=='.json_encode($existingPatient).'=='. $pharmacy->id);
if ($patientInfo) {
// return $this->failed('该问诊人信息已存在');
// return $this->failed('该问诊人信息已存在', ['data' => false], 200);
return $this->success($patientInfo);
}
if ($pharmacy) {
$newPatient->pharmacy_id = $pharmacy->id;
} else {
return $this->failed('未找到对应的药店信息');
}
}
// 复制数据到新记录(可根据实际需求过滤字段)
$newPatient->name = $existingPatient->name;
$newPatient->id_card = $existingPatient->id_card;
$newPatient->mobile = $existingPatient->mobile;
$newPatient->gender = $existingPatient->gender;
$newPatient->age = $existingPatient->age;
$newPatient->is_default = 0; // 新记录默认值
// 保存新数据
$res = $newPatient->save();
if ($res) {
return $this->success($newPatient);
} else {
return $this->failed('数据复制失败');
}
}
// 获取二维码
public function getQrCode(Request $request)
{
$scene = $request->input('scene');
if (! $scene) {
return $this->failed('请传入参数scene~');
}
$dns2d = new DNS2D();
$base64Img = 'data:image/jpg;base64,'.$dns2d->getBarcodePNG($scene, 'QRCODE', 200, 200);
// return "<img src={$base64Img} >";
return $this->success($base64Img);
}
}
......@@ -17,7 +17,7 @@ public function pharmacistList()
$authInfo = auth('api')->user();
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
$pharmacist = PharmacistModel::where('pharmacy_id', $pharmacy->id)->get();
......@@ -35,7 +35,7 @@ public function detail(Request $request)
// 获取药店信息
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
$pharmacist = PharmacistModel::where('pharmacy_id', $pharmacy->id)->where('id', $pharmacist_id)->first();
if (! $pharmacist) {
......@@ -83,10 +83,15 @@ public function add(Request $request)
$authInfo = auth('api')->user();
// 获取药店信息
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
$id_card = $request->input('id_card');
if (isset($id_card) && ! validateIDCard($id_card)) {
return $this->failed('身份证号格式错误');
}
$pharmacist = new PharmacistModel();
$pharmacist->pharmacy_id = $pharmacy->id;
$pharmacist->name = str_replace(' ', '', $request->input('name'));
$pharmacist->id_card = str_replace(' ', '', $request->input('id_card'));
$pharmacist->id_card = str_replace(' ', '', $id_card);
$pharmacist->mobile = str_replace(' ', '', $request->input('mobile'));
$pharmacist->license_number = str_replace(' ', '', $request->input('license_number'));
$pharmacist->practicing_license = $request->input('practicing_license'); // 执业注册证书链接
......@@ -100,6 +105,43 @@ public function add(Request $request)
return $this->failed('药师新增失败!');
}
public function scanAdd(Request $request)
{
$authInfo = auth('api')->user();
// 获取药店信息
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('未找到药店信息!');
}
// 检查是否传递了药师的id
$pharmacistId = $request->input('id');
if ($pharmacistId) {
// 查询并复制已有药师数据
$existingPharmacist = PharmacistModel::where('id', $pharmacistId)->first();
if (! $existingPharmacist) {
return $this->failed('未找到对应药师信息!');
}
$pharmacist = $existingPharmacist->replicate();
// 设置药师属性
$pharmacist->pharmacy_id = $pharmacy->id;
$pharmacist->name = $pharmacist->name ?? '';
$pharmacist->id_card = $pharmacist->id_card ?? '';
$pharmacist->mobile = $pharmacist->mobile ?? '';
$pharmacist->license_number = $pharmacist->license_number ?? '';
$pharmacist->practicing_license = $pharmacist->practicing_license ?? '';
$pharmacist->practicing_license_expired_time = $pharmacist->practicing_license_expired_time ?? null;
$pharmacist->physician_license = $pharmacist->physician_license ?? '';
$pharmacist->status = 0;
// 保存药师数据
if ($pharmacist->save()) {
return $this->success($pharmacist);
}
}
return $this->failed('药师新增失败!');
}
// 药师编辑
public function update(Request $request)
{
......@@ -113,13 +155,33 @@ public function update(Request $request)
if (empty($pharmacist)) {
return $this->failed('该药师不存在');
}
$id_card = $request->input('id_card');
if (isset($id_card) && ! validateIDCard($id_card)) {
return $this->failed('身份证号格式错误');
}
$practicing_license = $request->input('practicing_license');
$practicing_license_path = '';
if (! empty($practicing_license)) {
$practicing_licenses = parse_url($practicing_license);
$practicing_license_path = $practicing_licenses['path'] ?? '';
}
$physician_license = $request->input('physician_license');
$physician_license_path = '';
if (! empty($physician_license)) {
$physician_licenses = parse_url($physician_license);
$physician_license_path = $physician_licenses['path'] ?? '';
}
$pharmacist->name = str_replace(' ', '', $request->input('name'));
$pharmacist->id_card = str_replace(' ', '', $request->input('id_card'));
$pharmacist->id_card = str_replace(' ', '', $id_card);
$pharmacist->mobile = str_replace(' ', '', $request->input('mobile'));
$pharmacist->license_number = str_replace(' ', '', $request->input('license_number'));
$pharmacist->practicing_license = $request->input('practicing_license'); // 执业注册证书链接
$pharmacist->practicing_license = $practicing_license_path; // 执业注册证书链接
$pharmacist->practicing_license_expired_time = $request->input('practicing_license_expired_time');
$pharmacist->physician_license = $request->input('physician_license'); // 执业资格证书链接
$pharmacist->physician_license = $physician_license_path; // 执业资格证书链接
if ($pharmacist->save()) {
return $this->success($pharmacist);
}
......@@ -205,6 +267,12 @@ public function delete(Request $request)
if (! $pharmacy) {
return $this->failed('该药店不存在');
}
// 判断该药店下是否有几个开启的药师
$pharmacist = PharmacistModel::where('pharmacy_id', $pharmacy->id)->where('status', 1)->count();
if ($pharmacist <= 1) {
return $this->failed('无法删除,至少需要一个开启的药师!');
}
$id = $request->input('id');
$data = PharmacistModel::where('id', $id)->where('pharmacy_id', $pharmacy->id)->first();
if (! $data) {
......
......@@ -12,6 +12,7 @@
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
// 药店控制器
class PharmacyController extends BaseApiController
......@@ -24,7 +25,16 @@ public function test()
public function PharmacyList(Request $request)
{
$search_input = $request->input('search_input');
$query = PharmacyModel::query();
$lat = $request->input('lat');
$lng = $request->input('lng');
$distance_sort = $request->input('distance_sort', 0); // 经纬度排序规则[0=从近到远,1=从远到近]
$site_config = admin_setting_array('site_config');
$limit_test_id = $site_config['limit_test_id'];
$limit_ids = [];
if ($limit_test_id) {
$limit_ids = explode(',', $limit_test_id);
}
$query = PharmacyModel::query()->whereNotIn('id', $limit_ids);
if ($search_input) {
$query->where('name', 'like', "%{$search_input}%");
// ->orWhere('address','like',"%{$search_input}%");
......@@ -35,6 +45,15 @@ public function PharmacyList(Request $request)
->where('business_start', '<=', Carbon::now()->format('H:i'))
->where('business_end', '>=', Carbon::now()->format('H:i'));
if ($lat && $lng && is_numeric($lat) && is_numeric($lng)) {
$distancesql = " * , ACOS(SIN(( $lat * 3.1415) / 180 ) *SIN((lat * 3.1415) / 180 ) +COS(( $lat* 3.1415) / 180 ) * COS((lat * 3.1415) / 180 ) *COS(( $lng* 3.1415) / 180 - (lng * 3.1415) / 180 ) ) * 6380";
if ($distance_sort == 1) {
$query = $query->addSelect(DB::raw($distancesql.' as distance'))->orderBy('distance', 'DESC');
} else {
$query = $query->addSelect(DB::raw($distancesql.' as distance'))->orderBy('distance', 'ASC');
}
}
$data = $query->paginate(10);
return $this->success($data);
......@@ -46,7 +65,7 @@ public function detail(Request $request)
$authInfo = auth('api')->user();
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
return $this->success($pharmacy);
......@@ -58,7 +77,7 @@ public function correction(Request $request)
$authInfo = auth('api')->user();
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
$content = $request->input('content');
if (empty($content)) {
......@@ -86,7 +105,7 @@ public function prescription(Request $request)
$authInfo = auth('api')->user();
$Pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $Pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
$prescription = PrescriptionModel::where('id', $id)->where('pharmacy_id', $Pharmacy->id)->where('status', PrescriptionModel::PRESCRIPTION_STATUS_REVIEWING)->first();
if (! $prescription) {
......@@ -138,7 +157,7 @@ public function open(Request $request)
$authInfo = auth('api')->user();
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if (! $pharmacy) {
return $this->failed('药店信息不存在');
return $this->failed('请退出后重新登录!');
}
$is_open = $request->input('is_open');
......
......@@ -3,35 +3,53 @@
namespace App\Api\Controllers;
use App\Http\Controllers\BaseApiController;
use App\Models\DoctorModel;
use App\Models\PharmacyModel;
use App\Models\User;
use App\Services\SmsService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Overtrue\EasySms\EasySms;
class SiteConfigController extends BaseApiController
{
public function test(){
public function test()
{
$site_config = admin_setting_array('site_config');
Log::info('测试', $site_config);
$data = [
'diagnosis_limit' => $site_config['diagnosis_limit'],
'drug_choose_limit' => $site_config['drug_choose_limit'],
];
return $this->success($data);
return $this->success($data);
}
public function config(Request $request)
{
$site_config = admin_setting_array('site_config');
# Log::info('测试', $site_config);
// Log::info('测试', $site_config);
$data = [
'diagnosis_limit' => $site_config['diagnosis_limit'],
'drug_choose_limit' => $site_config['drug_choose_limit'],
'doses_limit' => $site_config['doses_limit'],
];
return $this->success($data);
return $this->success($data);
}
public function isYBOpen(Request $request)
{
$is_open_yb = 0;
$authInfo = auth('api')->user();
if( $authInfo->last_login_type == User::LOGIN_TYPE_PHARMACY ){
$pharmacy = PharmacyModel::where('user_id', $authInfo->id)->first();
if ($pharmacy) {
$is_open_yb = $pharmacy->is_yb_open;
}
}
$data = [
'is_open_yb' => $is_open_yb,
];
return $this->success($data);
}
}
\ No newline at end of file
}
<?php
namespace App\Api\Controllers;
use App\Http\Controllers\BaseApiController;
use App\Models\DiagnosiModel;
use App\Models\DoctorModel;
use App\Models\InquiryModel;
use App\Models\PatientModel;
use App\Models\PharmacistModel;
use App\Models\PharmacyDrugModel;
use App\Models\PharmacyModel;
use App\Models\PrescriptionLogModel;
use App\Models\PrescriptionModel;
use App\Models\User;
use App\Services\SmsService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Overtrue\EasySms\EasySms;
class StatisticsController extends BaseApiController
{
public function index(Request $request)
{
$request = $request->all();
// var_dump($request);
if( !isset($request['token']) || $request['token'] !='imohe123@' ){
echo '错误请求';exit();
}
// 搜索前一天的数据 23:59:59
$query_time = date('Y-m-d 23:59:59', strtotime("-1 day"));
$prev_start_time = date('Y-m-d 00:00:00', strtotime("-1 day"));
$prev_end_time = date('Y-m-d 23:59:59', strtotime("-1 day"));
$query_date = date('Y-m-d', strtotime("-1 day"));
if( isset($request['date']) ){
$query_time = date('Y-m-d 23:59:59', strtotime($request['date']));
$prev_start_time = date('Y-m-d 00:00:00', strtotime($request['date']));
$prev_end_time = date('Y-m-d 23:59:59', strtotime($request['date']));
$query_date = date('Y-m-d', strtotime($request['date']));
}
$pharmacy_count = PharmacyModel::where('created_at','<=',$query_time)->count();
$pharmacist_count = PharmacistModel::where('created_at','<=',$query_time)->count();
$results = DB::select('SELECT count(pharmacy_id) FROM prescription WHERE created_at <= :query_time GROUP BY pharmacy_id having count(pharmacy_id) >=100', ['query_time' => $query_time]);
$prescription_count = count($results);
$prescription_total = PrescriptionModel::where('created_at','<=',$query_time)->count();
$prescription_day_total = PrescriptionModel::where('created_at','<=',$prev_end_time)->where('created_at','>=',$prev_start_time)->count();
$res = DB::select(
'SELECT COUNT(DISTINCT pharmacy_id) AS pharmacy_count
FROM prescription
WHERE created_at >= :start_of_day
AND created_at < :next_day
AND status = 2', // 只统计审方成功的记录
[
'start_of_day' => $query_date . ' 00:00:00',
'next_day' => $query_date . ' 23:59:59'
]
);
// var_dump($res[0]->pharmacy_count);exit();
$next_day_count = $res[0]->pharmacy_count;
$patient_count = PatientModel::where('created_at','<=',$query_time)->count();
echo "统计数据(" .$query_time. "):<br />
&nbsp;&nbsp;药店数量:". $pharmacy_count ."<br />
&nbsp;&nbsp;药师数量:". $pharmacist_count ."<br />
&nbsp;&nbsp;开方药店(处方数超过100单):". $prescription_count ."<br />
&nbsp;&nbsp;处方总量:". $prescription_total ."<br />
&nbsp;&nbsp;问诊人数量:". $patient_count ."<br />
&nbsp;&nbsp;" . $query_date . "开方量:". $prescription_day_total ."<br />
&nbsp;&nbsp;" . $query_date . "开方药店量:". $next_day_count ."<br />
";exit();
}
}
\ No newline at end of file
<?php
namespace App\Api\Controllers;
use App\Http\Controllers\BaseApiController;
use App\Models\DrugUnitModel;
use Illuminate\Http\Request;
// 单位控制器
class UnitController extends BaseApiController
{
public function test()
{
return $this->success('ok');
}
// 获取单位
public function unitList(Request $request)
{
$units = DrugUnitModel::query()->get()->toArray();
return $this->success($units);
}
}
......@@ -42,7 +42,7 @@ public function login(Request $request)
return $this->success($data);
} else {
return $this->fail('登录错误~');
return $this->failed('登录错误~');
}
}
......@@ -107,7 +107,7 @@ public function smsCode(Request $request)
$verificationCode = rand(100000, 999999); // 生成6位随机验证码
// 存储验证码和有效期(10分钟)
cache()->put("sms_verification_code_{$mobile}", $verificationCode, 600); // 600秒 = 10分钟
cache()->put("sms_verification_code_{$mobile}", $verificationCode, 60); // 600秒 = 10分钟
// cache()->put($smsCountKey, $smsCount + 1, strtotime('tomorrow') - time());
cache()->put($lastSendTimeKey, $currentTime, 60);
......@@ -204,6 +204,8 @@ public function bindRole(Request $request)
$doctor->user_id = $authInfo->id;
$doctor->save();
// 清除验证码
cache()->forget("sms_verification_code_{$mobile}");
} else {
return $this->failed('登录类型错误');
}
......
<?php
namespace App\Console\Commands;
use App\Models\DrugModel;
use App\Models\PharmacyDrugModel;
use Illuminate\Console\Command;
class InitPharmacyDrugTcm extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'mohe:init-pharmacy-drug-tcm {pharmacy_id}';
/**
* The console command description.
*
* @var string
*/
protected $description = '同步中药到指定药店';
/**
* Execute the console command.
*/
public function handle()
{
//
$pharmacy_id = $this->argument('pharmacy_id') ?? 0;
if (intval($pharmacy_id) < 1) {
$this->info('请输入正确的药店id');
return;
}
$this->info('开始同步药库中药到指定药店...');
$drugs = DrugModel::query()->where('drug_type', DrugModel::DRUG_TYPE_TCM)->get();
if ($drugs->count() > 0) {
foreach ($drugs as $drug) {
$pharmacyDrug = PharmacyDrugModel::where('pharmacy_id', $pharmacy_id)->where('drug_id', $drug->id)->first();
if (empty($pharmacyDrug)) {
$pharmacyDrug = new PharmacyDrugModel();
$pharmacyDrug->drug_id = $drug->id;
$pharmacyDrug->pharmacy_id = $pharmacy_id;
$pharmacyDrug->unit = $drug->unit;
$pharmacyDrug->save();
}
}
}
}
}
......@@ -59,6 +59,11 @@ public function autoPrescriptionGen()
// 查询对应的医师是手动并且药师为自动
// $pharmacist = PharmacyModel::where('id', $prescription->pharmacy_id)->first();
$doctor = DoctorModel::where('id', $prescription->doctor_id)->first();
if ($doctor == null) {
continue;
}
// if ($doctor->is_auto == 0 && $pharmacist->is_auto == 1) {
if ($doctor->is_auto == 1) {
// 更新处方单状态
......@@ -68,6 +73,10 @@ public function autoPrescriptionGen()
$prescriptionInfo->save();
// 获取患者信息
$patient = PatientModel::where('id', $prescriptionInfo->patient_id)->first();
if ($patient == null) {
continue;
}
// 生成审方日志
$dateTime = new DateTime($prescription->created_at);
$dateTime->modify('+3 minutes');
......@@ -101,6 +110,11 @@ public function autoPrescriptionReview()
$pharmacist = PharmacyModel::where('id', $prescription->pharmacy_id)->first();
// $doctor = DoctorModel::where('id', $prescription->doctor_id)->first();
// if ($doctor->is_auto == 0 && $pharmacist->is_auto == 1) {
if ($pharmacist == null) {
continue;
}
if ($pharmacist->is_auto == 1) {
// 更新处方单状态
$prescriptionInfo = PrescriptionModel::find($prescription->id);
......@@ -109,6 +123,9 @@ public function autoPrescriptionReview()
$prescriptionInfo->save();
// 获取患者信息
$patient = PatientModel::where('id', $prescriptionInfo->patient_id)->first();
if ($patient == null) {
continue;
}
// 生成审方日志
$dateTime = new DateTime($prescription->created_at);
$dateTime->modify('+5 minutes');
......
......@@ -3,6 +3,7 @@
namespace App\Console\Commands;
use App\Models\InquiryModel;
use App\Models\PatientModel;
use App\Models\PrescriptionModel;
use Illuminate\Console\Command;
......@@ -28,14 +29,29 @@ class TestCommand extends Command
public function handle()
{
// 刷新问诊问题
$prescriptions = PrescriptionModel::orderBy('id', 'desc')->get();
foreach ($prescriptions as $prescription) {
$inquiry_info = $prescription->inquiry_info;
foreach ($inquiry_info as &$v) {
$v['question'] = InquiryModel::find($v['inquiry_id'])->question;
// $prescriptions = PrescriptionModel::orderBy('id', 'desc')->get();
// foreach ($prescriptions as $prescription) {
// $inquiry_info = $prescription->inquiry_info;
// foreach ($inquiry_info as &$v) {
// $v['question'] = InquiryModel::find($v['inquiry_id'])->question;
// }
// $prescription->inquiry_info = $inquiry_info;
// $prescription->save();
// }
// 刷新存量问诊人年龄
$query = PatientModel::query()->whereNotNull('id_card')->where('age', '<=', 0)->withTrashed();
$sql = $query->toSql();
var_dump($sql);
$patients = $query->get();
if ($patients->count() > 0) {
foreach ($patients as $patient) {
$patient->age = getAgeByIdCard($patient->id_card);
$patient->save();
}
$prescription->inquiry_info = $inquiry_info;
$prescription->save();
} else {
echo '没有需要更新的数据';
}
}
}
......@@ -13,7 +13,7 @@ class Kernel extends ConsoleKernel
protected function schedule(Schedule $schedule): void
{
// $schedule->command('inspire')->hourly();
# $schedule->command('mohe:prescription')->everyMinute();
// $schedule->command('mohe:prescription')->everyMinute();
}
/**
......
......@@ -19,9 +19,11 @@ public function success($data = [], string $message = 'success', int $code = Res
/**
* 返回失败信息
*
* @param bool $status
* @param string $message 错误消息
* @param array $data 返回数据
* @param int $code 错误编码
*/
public function failed($data = [], string $message = 'fail', int $code = Response::HTTP_INTERNAL_SERVER_ERROR): \Illuminate\Http\JsonResponse
public function failed(string $message = 'fail', array $data = [], int $code = Response::HTTP_INTERNAL_SERVER_ERROR): \Illuminate\Http\JsonResponse
{
return response()->json(['status' => false, 'code' => $code, 'message' => $message, 'data' => $data]);
}
......
......@@ -66,5 +66,6 @@ class Kernel extends HttpKernel
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'watermark' => \App\Http\Middleware\WatermarkMiddleware::class,
'checkrole' => \App\Http\Middleware\CheckRoleChangeMiddleware::class,
];
}
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRoleChangeMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function handle($request, Closure $next)
{
$lastLoginType = auth('api')->user()->last_login_type;
$requestLastLoginType = $request->headers->get('last-login-type') ?: 0;
if ($lastLoginType != $requestLastLoginType) {
return response()->json(['status' => false, 'code' => 600, 'message' => '您的角色切换错误~', 'data' => []]);
}
return $next($request);
}
}
......@@ -13,6 +13,16 @@ class DiagnosiModel extends Model
use HasDateTimeFormatter;
use SoftDeletes;
const DIAGNOSI_TYPE_WM = 0;
const DIAGNOSI_TYPE_TCM = 1;
// 诊断类型-文字映射
const DIAGNOSI_TYPE_MAP = [
self::DIAGNOSI_TYPE_WM => '西医',
self::DIAGNOSI_TYPE_TCM => '中医',
];
protected $table = 'diagnosis';
public function setNameAttribute($value)
......
......@@ -43,6 +43,19 @@ class DoctorModel extends Model
self::IS_AUTO_TRUE => 'success',
];
const DOCTOR_TYPE_ALL = 2;
const DOCTOR_TYPE_WM = 0;
const DOCTOR_TYPE_TCM = 1;
// 性别-文字映射
const DOCTOR_TYPE_MAP = [
self::DOCTOR_TYPE_ALL => '全部',
self::DOCTOR_TYPE_WM => '西医',
self::DOCTOR_TYPE_TCM => '中医',
];
// 医师所属于的用户,一对一
public function user()
{
......
......@@ -72,6 +72,17 @@ class DrugModel extends Model
self::FOREIGN_FALSE => '否',
];
// 药品类型[0=西药,1=中药]
const DRUG_TYPE_WM = 0;
const DRUG_TYPE_TCM = 1;
// 药品类型-文字映射
const DRUG_TYPE_MAP = [
self::DRUG_TYPE_WM => '西药',
self::DRUG_TYPE_TCM => '中药',
];
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
......
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
class ExternalPrescriptionModel extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
// 性别[0=未知,1=男,2=女]
const SEX_UNDEFINED = 0;
const SEX_MALE = 1;
const SEX_FEMALE = 2;
// 性别-文字映射
const SEX_MAP = [
self::SEX_UNDEFINED => '未知',
self::SEX_MALE => '男',
self::SEX_FEMALE => '女',
];
protected $table = 'external_prescription';
}
......@@ -32,6 +32,16 @@ class PharmacistModel extends Model
self::IS_DEFAULT_TRUE => 'success',
];
// 是否启用[0=否,1=是]
const IS_STATUS_FALSE = 0;
const IS_STATUS_TRUE = 1;
const IS_STATUS_MAP = [
self::IS_STATUS_FALSE => '否',
self::IS_STATUS_TRUE => '是',
];
// 药师关联的药店,多对一
public function pharmacy()
{
......
......@@ -61,6 +61,19 @@ class PharmacyModel extends Model
self::IS_AUTO_TRUE => 'success',
];
// 开启医保开方[0=否,1=是]
const IS_YB_OPEN_FALSE = 0;
const IS_YB_OPEN_TRUE = 1;
// 是否问题是否通用通用-文字映射
const IS_YB_OPEN_MAP = [
self::IS_YB_OPEN_FALSE => '否',
self::IS_YB_OPEN_TRUE => '是',
];
// 药店所属于的用户,一对一
public function user()
{
......
......@@ -22,6 +22,8 @@ class PrescriptionModel extends Model
];
// 审方状态[0=待开方,1=待审方,2=审方成功]
const PRESCRIPTION_STATUS_ENTERED = -1;
const PRESCRIPTION_STATUS_PENDING = 0;
const PRESCRIPTION_STATUS_REVIEWING = 1;
......@@ -30,6 +32,7 @@ class PrescriptionModel extends Model
// 审方状态-文字映射
const PRESCRIPTION_STATUS_MAP = [
self::PRESCRIPTION_STATUS_ENTERED => '未录入',
self::PRESCRIPTION_STATUS_PENDING => '待开方',
self::PRESCRIPTION_STATUS_REVIEWING => '待审方',
self::PRESCRIPTION_STATUS_SUCCESS => '审方成功',
......@@ -98,6 +101,17 @@ class PrescriptionModel extends Model
self::PRESCRIPTION_TYPE_TCM => '中药',
];
// 驳回处方单状态[0=否,1=是]
const REJECT_STSATUS_FALSE = 0;
const REJECT_STSATUS_TRUE = 1;
// 驳回处方单状态-文字映射
const REJECT_STSATUS_MAP = [
self::REJECT_STSATUS_FALSE => '否',
self::REJECT_STSATUS_TRUE => '是',
];
public function getDoctorSignedPicAttribute($value)
{
if (Str::contains($value, '//') || ! $value) {
......
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Symptom extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'symptom';
}
......@@ -94,13 +94,13 @@ function getSexByIdCard($idCard)
/**
* 数据脱敏.
*
* @param string $strType 脱敏类型,姓名、生日、手机号……
* @param string|null $strType 脱敏类型,姓名、生日、手机号……
* @param string $str 被脱敏文本
* @return string 脱敏后文本
*/
function data_masking(string $str, string $strType)
function data_masking($str, string $strType)
{
if (! isset($str) || (! trim($str) && trim($str) == '')) {
if (is_null($str) || $str === '' || trim($str) === '') {
return $str;
}
switch ($strType) {
......@@ -135,6 +135,10 @@ function data_masking(string $str, string $strType)
$maskStr = substr($str, 0, 4).'************'.substr($str, -4, 3);
break;
case 'idcard': // 只展示前6位和后4位
$idCardCount = strlen($str);
if ($idCardCount != 15 || $idCardCount != 18) {
return $str;
}
$maskStr = substr($str, 0, 6).str_repeat('*', strlen($str) - 10).substr($str, -4);
break;
case 'mobile': // 展示前3位和后4位
......@@ -177,3 +181,64 @@ function validateBirthday($birthday)
}
}
if (! function_exists('validateIDCard')) {
function validateIDCard($idCard)
{
// 长度检查
if (! preg_match('/^\d{15}$|^\d{17}[\dXx]$/', $idCard)) {
return false;
}
// 15位转18位(如果是15位身份证)
if (strlen($idCard) === 15) {
$idCard = convertIDCard15to18($idCard);
}
// 检查出生日期
$birthDate = substr($idCard, 6, 8); // 提取出生日期部分
$year = substr($birthDate, 0, 4);
$month = substr($birthDate, 4, 2);
$day = substr($birthDate, 6, 2);
if (! checkdate((int) $month, (int) $day, (int) $year)) {
return false;
}
// 校验码验证
return checkIDCardChecksum($idCard);
}
function convertIDCard15to18($idCard15)
{
// 15位身份证转换为18位
$prefix = substr($idCard15, 0, 6).'19'.substr($idCard15, 6);
$checksum = calculateChecksum($prefix);
return $prefix.$checksum;
}
function checkIDCardChecksum($idCard18)
{
// 检查身份证校验码
$base = substr($idCard18, 0, 17);
$checksum = calculateChecksum($base);
return strtoupper($checksum) === strtoupper($idCard18[17]);
}
function calculateChecksum($base)
{
// 计算校验码
$weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
$checksumMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += $base[$i] * $weights[$i];
}
return $checksumMap[$sum % 11];
}
}
......@@ -170,6 +170,7 @@
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
Milon\Barcode\BarcodeServiceProvider::class,
])->toArray(),
/*
......
......@@ -17,7 +17,7 @@ public function up(): void
$table->bigIncrements('id');
$table->string('name', 32)->comment('姓名');
$table->tinyInteger('gender')->default(0)->comment('性别。[1=男性,2=女性,0=未知]');
$table->string('id_card', 18)->index('idx_idcard')->comment('身份证号');
$table->string('id_card', 18)->nullable()->index('idx_idcard')->comment('身份证号');
$table->string('mobile', 11)->index('idx_mobile')->comment('手机号');
$table->bigInteger('user_id')->nullable()->index('idx_userid')->comment('用户表ID。用户添加问诊人才有值');
$table->bigInteger('pharmacy_id')->nullable()->index('idx_pharmacyid')->comment('药店表ID。药店添加问诊人猜有值');
......
......@@ -24,7 +24,7 @@ public function up(): void
$table->string('patient_name', 32)->comment('问诊人姓名');
$table->integer('patient_age')->default(0)->comment('问诊人年龄');
$table->tinyInteger('patient_gender')->default(0)->comment('问诊人性别。[1=男性,2=女性,0=未知]');
$table->string('diagnosis_id',255)->nullable()->comment('诊断表ID');
$table->string('diagnosis_id', 255)->nullable()->comment('诊断表ID');
$table->string('diagnosis_name', 255)->nullable()->comment('诊断');
$table->text('inquiry_info')->comment('问诊问题');
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('prescription', function (Blueprint $table) {
$table->boolean('reject_status')->default(0)->comment('驳回处方单[0=否,1=是]');
$table->string('reject_reason')->default('')->comment('驳回原因');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('prescription', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('prescription', function (Blueprint $table) {
$table->text('symptom')->nullable()->comment('症状(json格式)');
$table->integer('doses')->default(0)->comment('剂数(中药)');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('prescription', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSymptomTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('symptom', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->default('');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('symptom');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('drug', function (Blueprint $table) {
$table->tinyInteger('drug_type')->default(0)->comment('药品类型[0=西药,1=中药]');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('drug', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('patient', function (Blueprint $table) {
$table->integer('age')->default(0)->comment('问诊人年龄');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('patient', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('doctor', function (Blueprint $table) {
$table->tinyInteger('type')->default(0)->comment('医师类型[2=全部,0=西药,1=中药]');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('doctor', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('diagnosis', function (Blueprint $table) {
$table->tinyInteger('type')->default(0)->comment('诊断类型[0=西医,1=中医]');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('diagnosis', function (Blueprint $table) {
//
});
}
};
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateExternalPrescriptionTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('external_prescription', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('external_prescription_id')->default('')->comment('外部处方单编号');
$table->timestamp('issue_at')->comment('处方开具时间');
$table->string('status')->default('')->comment('状态');
$table->string('company_name')->default('')->comment('企业名称');
$table->string('pharmacy_name')->default('')->comment('药店名称');
$table->integer('pharmacy_id')->comment('药店编号');
$table->string('agent')->default('')->comment('会员/代理人');
$table->string('patient_name')->default('')->comment('就诊人姓名');
$table->string('patient_mobile')->default('')->comment('就诊人手机号');
$table->tinyInteger('patient_gender')->comment('性别。[1=男性,2=女性,0=未知]');
$table->integer('patient_age')->comment('就诊人年龄');
$table->string('patient_id_card')->nullable()->comment('就诊人身份证');
$table->string('doctor_name')->default('')->comment('接诊医师');
$table->string('diagnosis')->default('')->comment('诊断');
$table->text('drug_info')->nullable()->comment('用药信息');
$table->string('pharmacist_name')->nullable()->comment('审核药师');
$table->timestamp('review_at')->nullable()->comment('审核时间');
$table->string('pharmacist_attr')->nullable()->comment('药师属性');
$table->string('dispatcher')->nullable()->comment('调配人');
$table->string('checker')->nullable()->comment('核对人');
$table->string('dispenser')->nullable()->comment('发药人');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('external_prescription');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('pharmacy', function (Blueprint $table) {
$table->tinyInteger('is_yb_open')->default(0)->comment('开启医保开方[0=否,1=是]');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('pharmacy', function (Blueprint $table) {
//
});
}
};
......@@ -722,11 +722,11 @@ public function run()
'name' => '用法用量[药店]',
'slug' => 'dosage',
'http_method' => '',
'http_path' => 'dosage*',
'http_path' => 'dosage*,dosage-template',
'order' => 22,
'parent_id' => 0,
'created_at' => '2024-11-13 22:39:14',
'updated_at' => '2024-11-13 22:40:04',
'updated_at' => '2024-12-11 11:00:44',
],
[
'id' => 30,
......@@ -791,9 +791,9 @@ public function run()
],
[
'slug' => 'site_config',
'value' => '{"prescription_limit":"4","prescription_period_status":"1","prescription_period_start":"18:44","prescription_period_end":"18:44","prescription_limit_buy_7":"3","prescription_auto":1}',
'value' => '{"prescription_limit":"4","prescription_period_status":"1","prescription_period_start":"18:44","prescription_period_end":"18:44","prescription_limit_buy_7":"5","diagnosis_limit":"1","drug_choose_limit":"5","limit_keywords":"\\u767e\\u90e8"}',
'created_at' => '2024-11-18 18:44:46',
'updated_at' => '2024-11-18 18:44:46',
'updated_at' => '2024-12-03 00:33:09',
],
]
);
......@@ -1054,6 +1054,24 @@ public function run()
],
[
'role_id' => 2,
'menu_id' => 17,
'created_at' => '2024-11-27 18:25:36',
'updated_at' => '2024-11-27 18:25:36',
],
[
'role_id' => 2,
'menu_id' => 18,
'created_at' => '2024-11-27 18:25:36',
'updated_at' => '2024-11-27 18:25:36',
],
[
'role_id' => 2,
'menu_id' => 19,
'created_at' => '2024-11-27 19:01:23',
'updated_at' => '2024-11-27 19:01:23',
],
[
'role_id' => 2,
'menu_id' => 23,
'created_at' => '2024-11-11 00:40:57',
'updated_at' => '2024-11-11 00:40:57',
......@@ -1444,6 +1462,18 @@ public function run()
],
[
'role_id' => 2,
'permission_id' => 20,
'created_at' => '2024-11-27 18:25:36',
'updated_at' => '2024-11-27 18:25:36',
],
[
'role_id' => 2,
'permission_id' => 21,
'created_at' => '2024-11-27 19:01:23',
'updated_at' => '2024-11-27 19:01:23',
],
[
'role_id' => 2,
'permission_id' => 28,
'created_at' => '2024-11-13 22:40:14',
'updated_at' => '2024-11-13 22:40:14',
......
......@@ -74,3 +74,21 @@ services:
ipv4_address: ${DOCKER_IP_PREFIX}.6
entrypoint:
[ "cron", "-f" ]
auto-prescription: # 自动开方审方脚本
restart: always
build:
context: ./docker/php
volumes:
- .:/var/www
environment:
- TZ=${TZ}
# - XDEBUG_CONFIG=client_host=${DOCKER_IP_PREFIX}.1
deploy:
replicas: ${ENABLE_AUTO_PRESCRIPTION}
networks:
net:
ipv4_address: ${DOCKER_IP_PREFIX}.7
entrypoint:
[ "/var/www/artisan", "mohe:prescription" ]
user: ${PHP_FPM_UID}
zend_extension=opcache
[opcache]
opcache.enable=1
opcache.enable_cli=1
......@@ -6,4 +7,4 @@ opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
\ No newline at end of file
opcache.fast_shutdown=1
......@@ -102,7 +102,7 @@ listen = 127.0.0.1:9000
; pm.process_idle_timeout - The number of seconds after which
; an idle process will be killed.
; Note: This value is mandatory.
pm = dynamic
pm = static
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
......@@ -113,22 +113,22 @@ pm = dynamic
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 50
pm.max_children = 256
; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: (min_spare_servers + max_spare_servers) / 2
pm.start_servers = 5
pm.start_servers = 50
; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 5
pm.min_spare_servers = 50
; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 30
pm.max_spare_servers = 300
; The number of rate to spawn child processes at once.
; Note: Used only when pm is set to 'dynamic'
......@@ -145,7 +145,7 @@ pm.max_spare_servers = 30
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
;pm.max_requests = 500
pm.max_requests = 500
; The URI to view the FPM status page. If this value is not set, no URI will be
; recognized as a status page. It shows the following information:
......@@ -402,7 +402,7 @@ slowlog = /var/log/php-fpm/$pool.log.slow
; Note: on highloaded environment, this can cause some delay in the page
; process time (several ms).
; Default Value: no
;catch_workers_output = yes
catch_workers_output = yes
; Decorate worker output with prefix and suffix containing information about
; the child that writes to the log and if stdout or stderr is used as well as
......
......@@ -25,6 +25,7 @@
'limit_buy_7' => '7天限购',
'tag' => '标签',
'excluded_drug_ids' => '互斥药品id组',
'drug_type' => '药品类型',
],
'options' => [
],
......
<?php
return [
'labels' => [
'ExternalPrescription' => '580处方单',
'external-prescription' => '580处方单',
],
'fields' => [
'external_prescription_id' => '580处方单编号',
'issue_at' => '处方开具时间',
'status' => '状态',
'company_name' => '企业名称',
'pharmacy_name' => '药店名称',
'pharmacy_id' => '药店编号',
'agent' => '会员/代理人',
'patient_name' => '就诊人姓名',
'patient_mobile' => '就诊人手机号',
'patient_gender' => '就诊人性别',
'patient_age' => '就诊人年龄',
'patient_id_card' => '就诊人身份证',
'doctor_name' => '接诊医师姓名',
'diagnosis' => '诊断',
'drug_info' => '用药信息',
'pharmacist_name' => '审核药师',
'review_at' => '审核时间',
'pharmacist_attr' => '药师属性',
'dispatcher' => '调配人',
'checker' => '核对人',
'dispenser' => '发药人',
],
'options' => [
],
];
<?php
return [
'labels' => [
'ExternalPrescription' => '580处方单',
'external-prescription' => '580处方单',
],
'fields' => [
'external_prescription_id' => '580处方单编号',
'issue_at' => '处方开具时间',
'status' => '状态',
'company_name' => '企业名称',
'pharmacy_name' => '药店名称',
'pharmacy_id' => '药店编号',
'agent' => '会员/代理人',
'patient_name' => '就诊人姓名',
'patient_mobile' => '就诊人手机号',
'patient_gender' => '就诊人性别',
'patient_age' => '就诊人年龄',
'patient_id_card' => '就诊人身份证',
'doctor_name' => '接诊医师姓名',
'diagnosis' => '诊断',
'drug_info' => '用药信息',
'pharmacist_name' => '审核药师',
'review_at' => '审核时间',
'pharmacist_attr' => '药师属性',
'dispatcher' => '调配人',
'checker' => '核对人',
'dispenser' => '发药人',
],
'options' => [
],
];
......@@ -38,6 +38,7 @@
'review_at' => '审方时间',
'is_abnormal' => '异常处方单',
'prescription_type' => '处方类型',
'reject_status' => '驳回状态',
],
'options' => [
],
......
<?php
return [
'labels' => [
'Symptom' => 'Symptom',
'symptom' => 'Symptom',
],
'fields' => [
'id' => '症状编号',
'name' => '症状名称',
],
'options' => [
],
];
function replace_keywords(){
console.log("Replace keywords");
}
function replace_logo(){
console.log("Replace logo");
}
function replaceQrCode(){
var element = document.querySelector('.store-qrcode');if (element) {element.innerHTML = '';}
}
function replaceKeywords(keyword, replacement) {
// 获取整个文档的body元素
var body = document.body;
// 创建一个空白的Range对象
var range = document.createRange();
// 选择body作为范围
range.selectNodeContents(body);
// 将range内的内容转换为DocumentFragment
var fragment = range.extractContents();
// 遍历fragment的所有子节点并替换文本
traverseNodes(fragment, keyword, replacement);
// 将修改后的fragment重新插入到body中
body.appendChild(fragment);
}
function traverseNodes(node, keyword, replacement) {
if (node.nodeType === Node.TEXT_NODE) {
// 如果是文本节点,就进行替换
node.nodeValue = node.nodeValue.replace(new RegExp(keyword, 'g'), replacement);
} else {
// 否则递归处理每个子节点
for (var i = 0; i < node.childNodes.length; i++) {
traverseNodes(node.childNodes[i], keyword, replacement);
}
}
}
function replaceLogo(){
// 选择所有具有 'logo-icon' 类的元素
const logoIcons = document.querySelectorAll('.logo-icon');
// 遍历每个找到的元素,并更新其 background 样式
logoIcons.forEach(element => {
// 替换背景图片的 URL 和位置等信息
element.style.background = "url('https://cloud-rx-prod-1324994225.cos.ap-shanghai.myqcloud.com/static/images/logo.png')";
element.style.backgroundSize = "cover";
element.style.backgroundPosition = "center";
element.style.width = "50px";
element.style.height = "50px";
});
}
window.onload = function() {
replaceQrCode();
replaceLogo();
replaceKeywords('icon-copy', '');
replaceKeywords('新橙科技', '同知堂科技');
replaceKeywords('粤ICP备15024370号-7', '苏ICP备2023017636号-1');
};
// replace_keywords();
// replace_logo();
\ No newline at end of file
......@@ -3,7 +3,7 @@
<input type="text" class="form-control" id="prescription_no" placeholder="请输入处方编号" style="width: 200px;">
<div class="input-group-append">
<div class="form-check" style="margin-left: 10px;">
<input type="checkbox" class="form-check-input" id="is_eseal" name="is_eseal">
<input type="checkbox" class="form-check-input" id="is_eseal" name="is_eseal" checked>
<label class="form-check-label" for="is_eseal">带电子印章</label>
</div>
<button class="btn btn-primary" type="button" id="search-btn" style="margin-left: 10px;">
......@@ -67,7 +67,6 @@
$('#is_eseal').on('change', () => this.search());
console.log('事件绑定完成');
}
search() {
......@@ -100,8 +99,9 @@
$('#prescription-image').attr('src', response.data.img_url + '?t=' + new Date().getTime());
$('#download-btn').data('url', response.data.img_url);
$('#prescription-container').show();
this.showEditableForm(response.data.drug_info,response.data.dosage_list);
if (response.data.prescription_type != 1) {
this.showEditableForm(response.data.drug_info,response.data.dosage_list);
}
} else {
Dcat.error(response.message || '获取处方失败');
}
......@@ -170,7 +170,7 @@
// 将表单添加到搜索表单下方
$('.search-form').after(formHtml);
$(document).find('#editable-drug-list select').select2();
$('#editable-drug-list').on('change', 'select', this.editableDrugListChangeHandler);
}
......
......@@ -22,22 +22,22 @@
// 小程序静默登录
Route::post('login', 'App\Api\Controllers\UserController@login');
Route::get('test', 'App\Api\Controllers\SiteConfigController@test');
Route::get('qrcode', 'App\Api\Controllers\PatientController@getQrCode');
// 统计数据
Route::get('statistics', 'App\Api\Controllers\StatisticsController@index');
// 需要验证是否登录的路由组
Route::middleware(['jwt.auth'])->group(function () {
Route::middleware(['jwt.auth', 'checkrole'])->group(function () {
// 获取用户信息
Route::get('/users', 'App\Api\Controllers\UserController@userInfo');
Route::get('/users', 'App\Api\Controllers\UserController@userInfo')->withoutMiddleware(['checkrole']);
// 退出
Route::post('logout', 'App\Api\Controllers\UserController@logout');
Route::post('logout', 'App\Api\Controllers\UserController@logout')->withoutMiddleware(['checkrole']);
// 刷新token
Route::post('refresh', 'App\Api\Controllers\UserController@refresh');
Route::post('refresh', 'App\Api\Controllers\UserController@refresh')->withoutMiddleware(['checkrole']);
# 获取发送验证码
Route::post('/smscode', 'App\Api\Controllers\UserController@smsCode');
Route::post('/smscode', 'App\Api\Controllers\UserController@smsCode')->withoutMiddleware(['checkrole']);
# 角色绑定
Route::post('/role-bind', 'App\Api\Controllers\UserController@bindRole');
Route::post('/role-bind', 'App\Api\Controllers\UserController@bindRole')->withoutMiddleware(['checkrole']);
# 获取药品列表
Route::get('/drugs', 'App\Api\Controllers\DrugController@drugList');
......@@ -45,7 +45,7 @@
Route::post('/drug-limit', 'App\Api\Controllers\DrugController@drugLimit');
# Route::get('/test', 'App\Api\Controllers\DrugController@test');
# 获取药店列表
Route::get('/pharmacys', 'App\Api\Controllers\PharmacyController@PharmacyList');
Route::get('/pharmacys', 'App\Api\Controllers\PharmacyController@PharmacyList')->withoutMiddleware(['checkrole']);
# 药店详情
Route::post('/pharmacy-detail', 'App\Api\Controllers\PharmacyController@detail');
# 药店纠错
......@@ -58,12 +58,22 @@
Route::post('/pharmacy-open', 'App\Api\Controllers\PharmacyController@open');
# 药店退出
Route::post('/pharmacy-logout', 'App\Api\Controllers\PharmacyController@logout');
# 获取药店用法用量
Route::post('/pharmacy-dosages', 'App\Api\Controllers\DosageController@dosageList');
# 扫码新增问诊人接口
Route::post('/pharmacy-patients-scan', 'App\Api\Controllers\PatientController@duplicate');
# 获取单位列表
Route::post('/units', 'App\Api\Controllers\UnitController@unitList');
# 处方录入
Route::post('/pharmacy-prescription-enter', 'App\Api\Controllers\PrescriptionController@enter');
# 获取诊断列表
Route::get('/diagnosis', 'App\Api\Controllers\DiagnosisController@diagnosisList');
# 获取问诊人列表
Route::get('/patients', 'App\Api\Controllers\PatientController@patientList');
# 问诊人新增
Route::post('/patients-add', 'App\Api\Controllers\PatientController@add');
# 问诊人扫码新增
Route::post('/patients-scan-add', 'App\Api\Controllers\PatientController@scanAdd');
# 问诊人编辑
Route::post('/patients-update', 'App\Api\Controllers\PatientController@update');
# 问诊人删除
......@@ -85,7 +95,7 @@
# 医师详情
Route::post('/doctor-detail', 'App\Api\Controllers\DoctorController@detail');
# 医师上传签名
Route::post('/doctor-upload', 'App\Api\Controllers\DoctorController@upload');
Route::post('/doctor-upload', 'App\Api\Controllers\DoctorController@upload')->withoutMiddleware(['checkrole']);
# 医师纠错
Route::post('/doctor-correction', 'App\Api\Controllers\DoctorController@correction');
# 医师退出
......@@ -94,12 +104,15 @@
Route::post('/doctor-auto', 'App\Api\Controllers\DoctorController@isAuto');
# 医师开方
Route::post('/doctor-prescription', 'App\Api\Controllers\DoctorController@prescription');
# 处方驳回
Route::post('/doctor-prescription-reject', 'App\Api\Controllers\PrescriptionController@reject');
# 药师列表
Route::get('/pharmacists', 'App\Api\Controllers\PharmacistController@pharmacistList');
# 药师详情
Route::post('/pharmacist-detail', 'App\Api\Controllers\PharmacistController@detail');
# 证书上传
Route::post('/pharmacist-uploadcertificate', 'App\Api\Controllers\PharmacistController@uploadCertificate');
Route::post('/pharmacist-uploadcertificate', 'App\Api\Controllers\PharmacistController@uploadCertificate')->withoutMiddleware(['checkrole']);
# 药师新增
Route::post('/pharmacist-add', 'App\Api\Controllers\PharmacistController@add');
# 药师编辑
......@@ -107,9 +120,11 @@
# 设置默认药师
Route::post('/pharmacist-setdefault', 'App\Api\Controllers\PharmacistController@setDefault');
# 药师签名上传
Route::post('/pharmacist-upload', 'App\Api\Controllers\PharmacistController@upload');
Route::post('/pharmacist-upload', 'App\Api\Controllers\PharmacistController@upload')->withoutMiddleware(['checkrole']);
# 药师删除
Route::post('/pharmacist-delete', 'App\Api\Controllers\PharmacistController@delete');
# 获取系统配置
Route::post('/config', 'App\Api\Controllers\SiteConfigController@config');
});
\ No newline at end of file
# 获取是否开启医保按钮配置
Route::post('/is-yb-open', 'App\Api\Controllers\SiteConfigController@isYBOpen');
});
......@@ -22,4 +22,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit49823373b75af40f543b069d0d73c169::getLoader();
return ComposerAutoloaderInitd80910c6b7b6c170f19efa978bbbffca::getLoader();
......@@ -74,6 +74,7 @@
'App\\Api\\Controllers\\PharmacistController' => $baseDir . '/app/Api/Controllers/PharmacistController.php',
'App\\Api\\Controllers\\PharmacyController' => $baseDir . '/app/Api/Controllers/PharmacyController.php',
'App\\Api\\Controllers\\PrescriptionController' => $baseDir . '/app/Api/Controllers/PrescriptionController.php',
'App\\Api\\Controllers\\SiteConfigController' => $baseDir . '/app/Api/Controllers/SiteConfigController.php',
'App\\Api\\Controllers\\UserController' => $baseDir . '/app/Api/Controllers/UserController.php',
'App\\Common\\Util' => $baseDir . '/app/Common/Util.php',
'App\\Console\\Commands\\InitPharmacyDrugCommand' => $baseDir . '/app/Console/Commands/InitPharmacyDrugCommand.php',
......@@ -84,6 +85,7 @@
'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => $baseDir . '/app/Http/Middleware/Authenticate.php',
'App\\Http\\Middleware\\CheckRoleChangeMiddleware' => $baseDir . '/app/Http/Middleware/CheckRoleChangeMiddleware.php',
'App\\Http\\Middleware\\EncryptCookies' => $baseDir . '/app/Http/Middleware/EncryptCookies.php',
'App\\Http\\Middleware\\PreventRequestsDuringMaintenance' => $baseDir . '/app/Http/Middleware/PreventRequestsDuringMaintenance.php',
'App\\Http\\Middleware\\RedirectIfAuthenticated' => $baseDir . '/app/Http/Middleware/RedirectIfAuthenticated.php',
......@@ -60,7 +60,7 @@
'Psy\\' => array($vendorDir . '/psy/psysh/src'),
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
......
......@@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit49823373b75af40f543b069d0d73c169
class ComposerAutoloaderInitd80910c6b7b6c170f19efa978bbbffca
{
private static $loader;
......@@ -24,16 +24,16 @@ public static function getLoader()
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInit49823373b75af40f543b069d0d73c169', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitd80910c6b7b6c170f19efa978bbbffca', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit49823373b75af40f543b069d0d73c169', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitd80910c6b7b6c170f19efa978bbbffca', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit49823373b75af40f543b069d0d73c169::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::getInitializer($loader));
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInit49823373b75af40f543b069d0d73c169::$files;
$filesToLoad = \Composer\Autoload\ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
......
......@@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit49823373b75af40f543b069d0d73c169
class ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca
{
public static $files = array (
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
......@@ -466,8 +466,8 @@ class ComposerStaticInit49823373b75af40f543b069d0d73c169
),
'Psr\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/psr/http-factory/src',
1 => __DIR__ . '/..' . '/psr/http-message/src',
0 => __DIR__ . '/..' . '/psr/http-message/src',
1 => __DIR__ . '/..' . '/psr/http-factory/src',
),
'Psr\\Http\\Client\\' =>
array (
......@@ -865,6 +865,7 @@ class ComposerStaticInit49823373b75af40f543b069d0d73c169
'App\\Api\\Controllers\\PharmacistController' => __DIR__ . '/../..' . '/app/Api/Controllers/PharmacistController.php',
'App\\Api\\Controllers\\PharmacyController' => __DIR__ . '/../..' . '/app/Api/Controllers/PharmacyController.php',
'App\\Api\\Controllers\\PrescriptionController' => __DIR__ . '/../..' . '/app/Api/Controllers/PrescriptionController.php',
'App\\Api\\Controllers\\SiteConfigController' => __DIR__ . '/../..' . '/app/Api/Controllers/SiteConfigController.php',
'App\\Api\\Controllers\\UserController' => __DIR__ . '/../..' . '/app/Api/Controllers/UserController.php',
'App\\Common\\Util' => __DIR__ . '/../..' . '/app/Common/Util.php',
'App\\Console\\Commands\\InitPharmacyDrugCommand' => __DIR__ . '/../..' . '/app/Console/Commands/InitPharmacyDrugCommand.php',
......@@ -875,6 +876,7 @@ class ComposerStaticInit49823373b75af40f543b069d0d73c169
'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php',
'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php',
'App\\Http\\Middleware\\CheckRoleChangeMiddleware' => __DIR__ . '/../..' . '/app/Http/Middleware/CheckRoleChangeMiddleware.php',
'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php',
'App\\Http\\Middleware\\PreventRequestsDuringMaintenance' => __DIR__ . '/../..' . '/app/Http/Middleware/PreventRequestsDuringMaintenance.php',
'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php',
......@@ -10203,10 +10205,10 @@ class ComposerStaticInit49823373b75af40f543b069d0d73c169
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit49823373b75af40f543b069d0d73c169::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit49823373b75af40f543b069d0d73c169::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit49823373b75af40f543b069d0d73c169::$prefixesPsr0;
$loader->classMap = ComposerStaticInit49823373b75af40f543b069d0d73c169::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::$prefixesPsr0;
$loader->classMap = ComposerStaticInitd80910c6b7b6c170f19efa978bbbffca::$classMap;
}, null, ClassLoader::class);
}
<?php return array(
'root' => array(
'name' => 'laravel/laravel',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => '10db17a216daddce611d17620678c76b40cd013b',
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => '1ce170d021ead062ce1bfea77490b4db625f5d4f',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
......@@ -560,9 +560,9 @@
'dev_requirement' => false,
),
'laravel/laravel' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => '10db17a216daddce611d17620678c76b40cd013b',
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => '1ce170d021ead062ce1bfea77490b4db625f5d4f',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
......@@ -1114,8 +1114,8 @@
'psr/log-implementation' => array(
'dev_requirement' => false,
'provided' => array(
0 => '3.0.0',
1 => '1.0|2.0|3.0',
0 => '1.0|2.0|3.0',
1 => '3.0.0',
),
),
'psr/simple-cache' => array(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment