first commit

This commit is contained in:
Your Name
2026-09-08 11:40:15 +08:00
commit a5353f7eb5
9568 changed files with 1646214 additions and 0 deletions
@@ -0,0 +1,159 @@
<?php
namespace app\adminapi\validate\doctor;
use app\common\validate\BaseValidate;
/**
* 医生预约验证器
* Class AppointmentValidate
* @package app\adminapi\validate\doctor
*/
class AppointmentValidate extends BaseValidate
{
/**
* 设置校验规则
* @var string[]
*/
protected $rule = [
'id' => 'require',
'patient_id' => 'require|integer',
'doctor_id' => 'require|integer',
'diagnosis_id' => 'require|integer',
'appointment_date' => 'require|date',
'appointment_time' => 'require',
'period' => 'in:morning,afternoon,all',
'appointment_type' => 'require|in:video,text,phone',
'status' => 'require|integer|between:1,4',
'remark' => 'max:500',
'channel_source' => 'require',
'channel_source_detail' => 'max:128',
'ids' => 'require|array',
'note_id' => 'require|integer',
'image_type' => 'require|in:tongue_images,report_files',
'image_path' => 'require',
];
/**
* 参数描述
* @var string[]
*/
protected $field = [
'id' => '预约ID',
'patient_id' => '患者ID',
'doctor_id' => '医生ID',
'diagnosis_id' => '诊单ID',
'appointment_date' => '预约日期',
'appointment_time' => '预约时间',
'period' => '时段',
'appointment_type' => '预约类型',
'status' => '状态',
'remark' => '备注',
'assistant_id' => '医助',
'channel_source' => '渠道来源',
'channel_source_detail' => '渠道补充说明',
'ids' => '预约ID列表',
];
/**
* @notes 创建预约场景
* @return AppointmentValidate
*/
public function sceneCreate()
{
return $this->only(['patient_id', 'doctor_id', 'appointment_date', 'period', 'appointment_time', 'appointment_type', 'channel_source', 'channel_source_detail']);
}
/**
* @notes 取消预约场景
* @return AppointmentValidate
*/
public function sceneCancel()
{
return $this->only(['id']);
}
/**
* @notes 预约详情场景
* @return AppointmentValidate
*/
public function sceneDetail()
{
return $this->only(['id']);
}
/**
* @notes 可用时间段场景
* @return AppointmentValidate
*/
public function sceneAvailableSlots()
{
return $this->only(['doctor_id', 'appointment_date', 'period']);
}
/**
* @notes 完成预约场景
* @return AppointmentValidate
*/
public function sceneComplete()
{
return $this->only(['id']);
}
/**
* @notes 接诊台聚合详情场景
* @return AppointmentValidate
*/
public function sceneReception()
{
return $this->only(['id']);
}
/**
* @notes 通知接诊医助场景
* @return AppointmentValidate
*/
public function sceneNotifyAssistant()
{
return $this->only(['id']);
}
public function sceneAddDoctorNote()
{
return $this->only(['diagnosis_id']);
}
public function sceneDoctorNotes()
{
return $this->only(['diagnosis_id']);
}
public function sceneDeleteDoctorNoteImage()
{
return $this->only(['note_id', 'image_type', 'image_path']);
}
/**
* 后台挂号编辑(消费者处方-挂号列表等)
*/
public function sceneAdminEdit()
{
return $this->only([
'id',
'appointment_date',
'appointment_time',
'period',
'appointment_type',
'status',
'remark',
'channel_source',
'channel_source_detail',
]);
}
/** 批量修改挂号渠道(权限同 doctor.appointment/edit */
public function sceneBatchEditChannel()
{
return $this->only(['ids', 'channel_source', 'channel_source_detail']);
}
}
@@ -0,0 +1,58 @@
<?php
namespace app\adminapi\validate\doctor;
use app\common\validate\BaseValidate;
/**
* 药品库验证器
*/
class MedicineValidate extends BaseValidate
{
protected $rule = [
'id' => 'require|integer',
'name' => 'require|max:100',
'supplier' => 'require|max:100',
'unit' => 'require|max:20',
'settlement_price' => 'require|float|>=:0',
'retail_price' => 'require|float|>=:0',
'stock' => 'integer|>=:0',
'image' => 'max:255',
'status' => 'in:0,1',
'remark' => 'max:500',
];
protected $message = [
'id.require' => '药品ID不能为空',
'name.require' => '药材名称不能为空',
'name.max' => '药材名称不能超过100个字符',
'supplier.require' => '供应商名称不能为空',
'supplier.max' => '供应商名称不能超过100个字符',
'unit.require' => '单位不能为空',
'settlement_price.require' => '结算价不能为空',
'settlement_price.float' => '结算价必须是数字',
'retail_price.require' => '零售价不能为空',
'retail_price.float' => '零售价必须是数字',
'stock.integer' => '库存必须是整数',
];
public function sceneAdd()
{
return $this->only(['name', 'supplier', 'unit', 'settlement_price', 'retail_price', 'stock', 'image', 'status', 'remark']);
}
public function sceneEdit()
{
return $this->only(['id', 'name', 'supplier', 'unit', 'settlement_price', 'retail_price', 'stock', 'image', 'status', 'remark']);
}
public function sceneDelete()
{
return $this->only(['id']);
}
public function sceneDetail()
{
return $this->only(['id']);
}
}
@@ -0,0 +1,95 @@
<?php
namespace app\adminapi\validate\doctor;
use app\common\validate\BaseValidate;
/**
* 医生排班验证器
* Class RosterValidate
* @package app\adminapi\validate\doctor
*/
class RosterValidate extends BaseValidate
{
protected $rule = [
'id' => 'number',
'doctor_id' => 'require',
'date' => 'require|date',
'period' => 'in:morning,afternoon,night,segment',
// 须用数组写法:字符串规则里的 | 会与「多规则分隔符」冲突,导致 preg_match 报错
'start_time' => ['require', 'regex' => '/^([01]\d|2[0-3]):[0-5]\d$/'],
'end_time' => ['require', 'regex' => '/^([01]\d|2[0-3]):[0-5]\d$/'],
'slot_minutes' => 'number|between:5,120',
'status' => 'require|in:1,2,3,4',
'quota' => 'number',
'max_patients' => 'number',
'remark' => 'max:500',
];
protected $message = [
'id.require' => '请选择排班',
'id.number' => '排班ID格式错误',
'doctor_id.require' => '请选择医生',
'date.require' => '请选择日期',
'date.date' => '日期格式不正确',
'period.in' => '时段类型参数错误',
'start_time.require' => '请填写接诊开始时间',
'start_time.regex' => '开始时间格式须为 HH:mm',
'end_time.require' => '请填写接诊结束时间',
'end_time.regex' => '结束时间格式须为 HH:mm',
'slot_minutes.number' => '号源间隔须为数字',
'slot_minutes.between' => '号源间隔须在 5120 分钟',
'status.require' => '请选择状态',
'status.in' => '状态参数错误',
'quota.number' => '号源数必须是数字',
'max_patients.number' => '最大接诊数必须是数字',
'remark.max' => '备注过长',
];
/**
* @notes 保存场景
*/
public function sceneSave()
{
return $this->only([
'id', 'doctor_id', 'date', 'period', 'start_time', 'end_time', 'shift_type', 'slot_minutes',
'status', 'quota', 'max_patients', 'remark',
]);
}
/**
* @notes 删除场景
*/
public function sceneDelete()
{
return $this->only(['id'])->append('id', 'require');
}
/**
* @notes 详情场景
*/
public function sceneDetail()
{
return $this->only(['id'])->append('id', 'require');
}
/**
* @notes 批量保存场景
*/
public function sceneBatchSave()
{
return $this->only(['rosters'])
->append('rosters', 'require|array');
}
/**
* @notes 复制场景
*/
public function sceneCopy()
{
return $this->only(['source_start_date', 'source_end_date', 'target_start_date'])
->append('source_start_date', 'require|date')
->append('source_end_date', 'require|date')
->append('target_start_date', 'require|date');
}
}