更新
This commit is contained in:
@@ -24,7 +24,7 @@ use app\adminapi\validate\LoginValidate;
|
||||
*/
|
||||
class LoginController extends BaseAdminController
|
||||
{
|
||||
public array $notNeedLogin = ['account', 'workWechatConfig', 'workWechatLogin', 'checkDbColumn'];
|
||||
public array $notNeedLogin = ['account', 'workWechatConfig', 'workWechatLogin', 'checkDbColumn', 'changeFirstPassword'];
|
||||
|
||||
/**
|
||||
* @notes 账号登录
|
||||
@@ -101,6 +101,41 @@ class LoginController extends BaseAdminController
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 首次登录修改密码
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function changeFirstPassword()
|
||||
{
|
||||
$password = $this->request->post('password', '');
|
||||
$passwordConfirm = $this->request->post('password_confirm', '');
|
||||
|
||||
if (empty($password)) {
|
||||
return $this->fail('请输入新密码');
|
||||
}
|
||||
|
||||
if (strlen($password) < 6) {
|
||||
return $this->fail('密码长度不能少于6位');
|
||||
}
|
||||
|
||||
if ($password !== $passwordConfirm) {
|
||||
return $this->fail('两次输入的密码不一致');
|
||||
}
|
||||
|
||||
$token = $this->request->header('token');
|
||||
if (empty($token)) {
|
||||
return $this->fail('请先登录');
|
||||
}
|
||||
|
||||
$result = (new LoginLogic())->changeFirstPassword($token, $password);
|
||||
|
||||
if ($result === false) {
|
||||
return $this->fail(LoginLogic::getError());
|
||||
}
|
||||
|
||||
return $this->success('密码修改成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 退出登录
|
||||
* @return \think\response\Json
|
||||
|
||||
@@ -32,6 +32,7 @@ class AppointmentController extends BaseAdminController
|
||||
public function create()
|
||||
{
|
||||
$params = (new AppointmentValidate())->post()->goCheck('create');
|
||||
$params['assistant_id'] = $this->adminId;
|
||||
$result = AppointmentLogic::create($params);
|
||||
if ($result === false) {
|
||||
return $this->fail(AppointmentLogic::getError());
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\controller\doctor;
|
||||
|
||||
use app\adminapi\controller\BaseAdminController;
|
||||
use app\adminapi\lists\doctor\MedicineLists;
|
||||
use app\adminapi\logic\doctor\MedicineLogic;
|
||||
use app\adminapi\validate\doctor\MedicineValidate;
|
||||
|
||||
/**
|
||||
* 药品库控制器
|
||||
*/
|
||||
class MedicineController extends BaseAdminController
|
||||
{
|
||||
/**
|
||||
* 药品列表
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
return $this->dataLists(new MedicineLists());
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加药品
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$params = (new MedicineValidate())->post()->goCheck('add');
|
||||
$result = MedicineLogic::add($params);
|
||||
if ($result) {
|
||||
return $this->success('添加成功', [], 1, 1);
|
||||
}
|
||||
return $this->fail(MedicineLogic::getError());
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑药品
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
$params = (new MedicineValidate())->post()->goCheck('edit');
|
||||
$result = MedicineLogic::edit($params);
|
||||
if ($result) {
|
||||
return $this->success('编辑成功', [], 1, 1);
|
||||
}
|
||||
return $this->fail(MedicineLogic::getError());
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除药品
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
$params = (new MedicineValidate())->post()->goCheck('delete');
|
||||
MedicineLogic::delete($params);
|
||||
return $this->success('删除成功', [], 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 药品详情
|
||||
*/
|
||||
public function detail()
|
||||
{
|
||||
$params = (new MedicineValidate())->goCheck('detail');
|
||||
$result = MedicineLogic::detail($params);
|
||||
return $this->data($result);
|
||||
}
|
||||
}
|
||||
@@ -29,8 +29,17 @@ class RosterController extends BaseAdminController
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
$params = (new RosterValidate())->post()->goCheck('save');
|
||||
$post = request()->post();
|
||||
$defaults = [];
|
||||
if (empty($post['period'])) {
|
||||
$defaults['period'] = 'segment';
|
||||
}
|
||||
$params = (new RosterValidate())->post()->goCheck('save', $defaults);
|
||||
$result = RosterLogic::save($params);
|
||||
if ($result === false) {
|
||||
return $this->fail(RosterLogic::getError());
|
||||
}
|
||||
|
||||
return $this->success('保存成功', $result);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\controller\doctor;
|
||||
|
||||
use app\adminapi\controller\BaseAdminController;
|
||||
use app\adminapi\lists\doctor\StatisticsLists;
|
||||
|
||||
/**
|
||||
* 医生统计控制器
|
||||
* Class StatisticsController
|
||||
* @package app\adminapi\controller\doctor
|
||||
*/
|
||||
class StatisticsController extends BaseAdminController
|
||||
{
|
||||
/**
|
||||
* @notes 医生诊单统计列表
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
return $this->dataLists(new StatisticsLists());
|
||||
}
|
||||
}
|
||||
@@ -263,7 +263,7 @@ class DiagnosisController extends BaseAdminController
|
||||
|
||||
$result = DiagnosisLogic::endCall($params);
|
||||
if ($result) {
|
||||
return $this->success('结束通话成功', [], 1, 1);
|
||||
return $this->success('', [], 1, 1);
|
||||
}
|
||||
return $this->fail(DiagnosisLogic::getError());
|
||||
}
|
||||
@@ -317,7 +317,7 @@ class DiagnosisController extends BaseAdminController
|
||||
$params['admin_id'] = (int)$this->adminId;
|
||||
$result = DiagnosisLogic::bindCallRoom($params);
|
||||
if ($result) {
|
||||
return $this->success('绑定成功', [], 1, 1);
|
||||
return $this->success('', [], 1, 1);
|
||||
}
|
||||
return $this->fail(DiagnosisLogic::getError());
|
||||
}
|
||||
|
||||
@@ -42,7 +42,8 @@ class PrescriptionLibraryController extends BaseAdminController
|
||||
public function edit()
|
||||
{
|
||||
$params = (new PrescriptionLibraryValidate())->post()->goCheck('edit');
|
||||
$result = PrescriptionLibraryLogic::edit($params, $this->adminId);
|
||||
$canAll = PrescriptionLibraryLogic::canManageAllPrescriptions($this->adminId, $this->adminInfo);
|
||||
$result = PrescriptionLibraryLogic::edit($params, $this->adminId, $canAll);
|
||||
if (!$result) {
|
||||
return $this->fail(PrescriptionLibraryLogic::getError());
|
||||
}
|
||||
@@ -55,7 +56,8 @@ class PrescriptionLibraryController extends BaseAdminController
|
||||
public function delete()
|
||||
{
|
||||
$params = (new PrescriptionLibraryValidate())->post()->goCheck('delete');
|
||||
$result = PrescriptionLibraryLogic::delete($params['id'], $this->adminId);
|
||||
$canAll = PrescriptionLibraryLogic::canManageAllPrescriptions($this->adminId, $this->adminInfo);
|
||||
$result = PrescriptionLibraryLogic::delete((int) $params['id'], $this->adminId, $canAll);
|
||||
if (!$result) {
|
||||
return $this->fail(PrescriptionLibraryLogic::getError());
|
||||
}
|
||||
@@ -68,7 +70,8 @@ class PrescriptionLibraryController extends BaseAdminController
|
||||
public function detail()
|
||||
{
|
||||
$params = (new PrescriptionLibraryValidate())->get()->goCheck('detail');
|
||||
$detail = PrescriptionLibraryLogic::detail((int)$params['id'], $this->adminId);
|
||||
$canAll = PrescriptionLibraryLogic::canManageAllPrescriptions($this->adminId, $this->adminInfo);
|
||||
$detail = PrescriptionLibraryLogic::detail((int) $params['id'], $this->adminId, $canAll);
|
||||
if (!$detail) {
|
||||
return $this->fail('处方不存在或无权限查看');
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ use app\common\model\DiagnosisViewRecord;
|
||||
use app\common\model\doctor\Appointment;
|
||||
use app\common\model\tcm\Prescription;
|
||||
use app\common\model\auth\AdminRole;
|
||||
use app\common\lists\ListsExtendInterface;
|
||||
use app\common\lists\ListsSearchInterface;
|
||||
|
||||
/**
|
||||
@@ -14,7 +15,7 @@ use app\common\lists\ListsSearchInterface;
|
||||
* Class AppointmentLists
|
||||
* @package app\adminapi\lists\doctor
|
||||
*/
|
||||
class AppointmentLists extends BaseAdminDataLists implements ListsSearchInterface
|
||||
class AppointmentLists extends BaseAdminDataLists implements ListsSearchInterface, ListsExtendInterface
|
||||
{
|
||||
/**
|
||||
* @notes 设置搜索条件
|
||||
@@ -147,45 +148,31 @@ class AppointmentLists extends BaseAdminDataLists implements ListsSearchInterfac
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 获取数量
|
||||
* @return int
|
||||
* 列表 count / Tab 角标统计共用的过滤条件(不依赖 lists() 对 searchWhere 的副作用)
|
||||
* @param mixed $query
|
||||
* @param bool $applyStatusFilter 为 false 时按状态分组统计各 Tab 数量
|
||||
*/
|
||||
public function count(): int
|
||||
private function applyAppointmentCountFilters($query, bool $applyStatusFilter): void
|
||||
{
|
||||
// 获取当前管理员的角色ID
|
||||
$roleIds = AdminRole::where('admin_id', $this->adminId)->column('role_id');
|
||||
|
||||
// 处理患者姓名搜索
|
||||
|
||||
if (!empty($this->params['patient_name'])) {
|
||||
$this->searchWhere[] = ['u.patient_name', 'like', '%' . $this->params['patient_name'] . '%'];
|
||||
$query->where('u.patient_name', 'like', '%' . $this->params['patient_name'] . '%');
|
||||
}
|
||||
|
||||
// 处理医生姓名搜索
|
||||
if (!empty($this->params['doctor_name'])) {
|
||||
$this->searchWhere[] = ['ad.name', 'like', '%' . $this->params['doctor_name'] . '%'];
|
||||
$query->where('ad.name', 'like', '%' . $this->params['doctor_name'] . '%');
|
||||
}
|
||||
|
||||
// 处理状态搜索
|
||||
if (isset($this->params['status']) && $this->params['status'] !== '') {
|
||||
$this->searchWhere[] = ['a.status', '=', $this->params['status']];
|
||||
if ($applyStatusFilter && isset($this->params['status']) && $this->params['status'] !== '') {
|
||||
$query->where('a.status', '=', $this->params['status']);
|
||||
}
|
||||
|
||||
// 处理日期范围搜索
|
||||
if (!empty($this->params['start_date']) && !empty($this->params['end_date'])) {
|
||||
$this->searchWhere[] = ['a.appointment_date', 'between', [$this->params['start_date'], $this->params['end_date']]];
|
||||
$query->whereBetween('a.appointment_date', [$this->params['start_date'], $this->params['end_date']]);
|
||||
} elseif (!empty($this->params['start_date'])) {
|
||||
$this->searchWhere[] = ['a.appointment_date', '>=', $this->params['start_date']];
|
||||
$query->where('a.appointment_date', '>=', $this->params['start_date']);
|
||||
} elseif (!empty($this->params['end_date'])) {
|
||||
$this->searchWhere[] = ['a.appointment_date', '<=', $this->params['end_date']];
|
||||
$query->where('a.appointment_date', '<=', $this->params['end_date']);
|
||||
}
|
||||
|
||||
// 构建查询
|
||||
$query = Appointment::alias('a')
|
||||
->leftJoin('tcm_diagnosis u', 'a.patient_id = u.id')
|
||||
->leftJoin('admin ad', 'a.doctor_id = ad.id')
|
||||
->where($this->searchWhere);
|
||||
|
||||
// 是否确认诊单
|
||||
if (isset($this->params['diagnosis_confirmed']) && $this->params['diagnosis_confirmed'] !== '') {
|
||||
$confirmed = (int)$this->params['diagnosis_confirmed'];
|
||||
$tbl = (new DiagnosisViewRecord())->getTable();
|
||||
@@ -196,17 +183,57 @@ class AppointmentLists extends BaseAdminDataLists implements ListsSearchInterfac
|
||||
$query->whereNotExists($subSql);
|
||||
}
|
||||
}
|
||||
|
||||
// 如果是医生角色(role_id=1),只显示挂自己号的预约
|
||||
|
||||
if (in_array(1, $roleIds)) {
|
||||
$query->where('a.doctor_id', $this->adminId);
|
||||
}
|
||||
|
||||
// 如果是医助角色(role_id=2),只显示自己添加的患者的预约
|
||||
if (in_array(2, $roleIds)) {
|
||||
$query->where('u.assistant_id', $this->adminId);
|
||||
}
|
||||
}
|
||||
|
||||
return $query->count();
|
||||
/**
|
||||
* @notes 获取数量
|
||||
* @return int
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$query = Appointment::alias('a')
|
||||
->leftJoin('tcm_diagnosis u', 'a.patient_id = u.id')
|
||||
->leftJoin('admin ad', 'a.doctor_id = ad.id');
|
||||
$this->applyAppointmentCountFilters($query, true);
|
||||
|
||||
return (int)$query->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 扩展字段:按需返回各状态数量(一次 GROUP BY,替代前端 4 次列表请求)
|
||||
* @return array
|
||||
*/
|
||||
public function extend(): array
|
||||
{
|
||||
if (empty($this->params['include_status_counts'])) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$query = Appointment::alias('a')
|
||||
->leftJoin('tcm_diagnosis u', 'a.patient_id = u.id')
|
||||
->leftJoin('admin ad', 'a.doctor_id = ad.id');
|
||||
$this->applyAppointmentCountFilters($query, false);
|
||||
|
||||
$rows = $query->field('a.status, COUNT(*) AS cnt')
|
||||
->group('a.status')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
$out = [1 => 0, 2 => 0, 3 => 0, 4 => 0];
|
||||
foreach ($rows as $r) {
|
||||
$s = (int)($r['status'] ?? 0);
|
||||
if (array_key_exists($s, $out)) {
|
||||
$out[$s] = (int)($r['cnt'] ?? 0);
|
||||
}
|
||||
}
|
||||
|
||||
return ['status_count' => $out];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\lists\doctor;
|
||||
|
||||
use app\adminapi\lists\BaseAdminDataLists;
|
||||
use app\common\model\doctor\Medicine;
|
||||
use app\common\lists\ListsSearchInterface;
|
||||
|
||||
/**
|
||||
* 药品库列表
|
||||
*/
|
||||
class MedicineLists extends BaseAdminDataLists implements ListsSearchInterface
|
||||
{
|
||||
/**
|
||||
* 设置搜索条件
|
||||
*/
|
||||
public function setSearch(): array
|
||||
{
|
||||
return [
|
||||
'%like%' => ['supplier'],
|
||||
'=' => ['status'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* name 参数:中文等按名称模糊;纯英文字母按拼音首字母字段 + 名称模糊(OR)
|
||||
*/
|
||||
private function appendMedicineNameSearch($query): void
|
||||
{
|
||||
$keyword = trim((string) ($this->params['name'] ?? ''));
|
||||
if ($keyword === '') {
|
||||
return;
|
||||
}
|
||||
if (preg_match('/^[a-zA-Z]+$/', $keyword)) {
|
||||
$kw = strtolower($keyword);
|
||||
$query->where(function ($q) use ($kw, $keyword) {
|
||||
$q->where('name_pinyin_abbr', 'like', '%' . $kw . '%')
|
||||
->whereOr('name', 'like', '%' . $keyword . '%');
|
||||
});
|
||||
} else {
|
||||
$query->where('name', 'like', '%' . $keyword . '%');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表字段
|
||||
*/
|
||||
public function lists(): array
|
||||
{
|
||||
$query = Medicine::where($this->searchWhere);
|
||||
$this->appendMedicineNameSearch($query);
|
||||
|
||||
return $query
|
||||
->field([
|
||||
'id', 'name', 'name_pinyin_abbr', 'supplier', 'unit',
|
||||
'settlement_price', 'retail_price', 'stock',
|
||||
'image', 'status', 'remark',
|
||||
'create_time', 'update_time',
|
||||
])
|
||||
->limit($this->limitOffset, $this->limitLength)
|
||||
->order(['id' => 'desc'])
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表数量
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
$query = Medicine::where($this->searchWhere);
|
||||
$this->appendMedicineNameSearch($query);
|
||||
|
||||
return $query->count();
|
||||
}
|
||||
}
|
||||
@@ -41,9 +41,11 @@ class RosterLists extends BaseAdminDataLists implements ListsSearchInterface
|
||||
}
|
||||
|
||||
$lists = Roster::where($where)
|
||||
->field(['id', 'doctor_id', 'date', 'period', 'status', 'quota', 'max_patients', 'booked_count', 'remark', 'create_time', 'update_time'])
|
||||
->order(['date' => 'asc', 'period' => 'asc'])
|
||||
->limit($this->limitOffset, $this->limitLength)
|
||||
->field([
|
||||
'id', 'doctor_id', 'date', 'period', 'start_time', 'end_time', 'shift_type', 'slot_minutes',
|
||||
'status', 'quota', 'max_patients', 'booked_count', 'remark', 'create_time', 'update_time',
|
||||
])
|
||||
->order(['date' => 'asc', 'start_time' => 'asc', 'id' => 'asc'])
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
|
||||
@@ -0,0 +1,227 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\lists\doctor;
|
||||
|
||||
use app\adminapi\lists\BaseAdminDataLists;
|
||||
use app\common\model\doctor\Appointment;
|
||||
use app\common\model\auth\Admin;
|
||||
|
||||
/**
|
||||
* 医生统计列表
|
||||
* Class StatisticsLists
|
||||
* @package app\adminapi\lists\doctor
|
||||
*/
|
||||
class StatisticsLists extends BaseAdminDataLists
|
||||
{
|
||||
/**
|
||||
* @notes 搜索条件
|
||||
* @return array
|
||||
*/
|
||||
public function setSearch(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 获取列表
|
||||
* @return array
|
||||
*/
|
||||
public function lists(): array
|
||||
{
|
||||
$doctorId = $this->params['doctor_id'] ?? '';
|
||||
$timeType = $this->params['time_type'] ?? 'today';
|
||||
$startDate = $this->params['start_date'] ?? '';
|
||||
$endDate = $this->params['end_date'] ?? '';
|
||||
|
||||
// 计算时间范围
|
||||
list($startDate, $endDate, $timeRangeText) = $this->getTimeRange($timeType, $startDate, $endDate);
|
||||
|
||||
// 获取医生列表(role_id=1 表示医生角色)
|
||||
$doctorAdminIds = \app\common\model\auth\AdminRole::where('role_id', 1)->column('admin_id');
|
||||
|
||||
if (empty($doctorAdminIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// 查询1:获取预约统计数据(快速查询,只查appointment表)
|
||||
$statisticsData = \think\facade\Db::name('doctor_appointment')
|
||||
->field([
|
||||
'doctor_id',
|
||||
'COUNT(*) as total_count',
|
||||
'SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) as registered_count',
|
||||
'SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) as completed_count',
|
||||
'SUM(CASE WHEN status = 4 THEN 1 ELSE 0 END) as missed_count',
|
||||
'SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) as cancelled_count'
|
||||
])
|
||||
->whereIn('doctor_id', $doctorAdminIds)
|
||||
->where('appointment_date', '>=', $startDate)
|
||||
->where('appointment_date', '<=', $endDate);
|
||||
|
||||
if ($doctorId) {
|
||||
$statisticsData->where('doctor_id', $doctorId);
|
||||
}
|
||||
|
||||
$statisticsData = $statisticsData->group('doctor_id')->select()->toArray();
|
||||
|
||||
// 将统计数据按 doctor_id 索引
|
||||
$statsMap = [];
|
||||
foreach ($statisticsData as $stat) {
|
||||
$statsMap[$stat['doctor_id']] = $stat;
|
||||
}
|
||||
|
||||
// 获取医生信息
|
||||
$doctorQuery = Admin::field('id,name')->whereIn('id', $doctorAdminIds);
|
||||
if ($doctorId) {
|
||||
$doctorQuery->where('id', $doctorId);
|
||||
}
|
||||
$doctors = $doctorQuery->select()->toArray();
|
||||
|
||||
// 查询2:获取部门统计信息(通过assistant_id直接关联,按部门分组统计数量)
|
||||
$doctorIdsWithAppointments = array_keys($statsMap);
|
||||
$deptStatsMap = [];
|
||||
$channelStatsMap = [];
|
||||
|
||||
if (!empty($doctorIdsWithAppointments)) {
|
||||
// 通过 assistant_id → admin_dept → dept 获取部门统计
|
||||
$deptStats = \think\facade\Db::name('doctor_appointment')
|
||||
->alias('apt')
|
||||
->leftJoin('admin_dept ad', 'apt.assistant_id = ad.admin_id')
|
||||
->leftJoin('dept dept', 'ad.dept_id = dept.id')
|
||||
->field('apt.doctor_id, dept.name as dept_name, COUNT(*) as dept_count')
|
||||
->whereIn('apt.doctor_id', $doctorIdsWithAppointments)
|
||||
->where('apt.appointment_date', '>=', $startDate)
|
||||
->where('apt.appointment_date', '<=', $endDate)
|
||||
->whereNotNull('dept.id')
|
||||
->group('apt.doctor_id, dept.id')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
// 组装部门统计数据:医生ID => "部门1(数量1) 部门2(数量2)"
|
||||
foreach ($deptStats as $stat) {
|
||||
if (!isset($deptStatsMap[$stat['doctor_id']])) {
|
||||
$deptStatsMap[$stat['doctor_id']] = [];
|
||||
}
|
||||
$deptStatsMap[$stat['doctor_id']][] = $stat['dept_name'] . '(' . $stat['dept_count'] . ')';
|
||||
}
|
||||
|
||||
// 获取渠道字典数据
|
||||
$channelDict = \think\facade\Db::name('dict_data')
|
||||
->where('type_value', 'channels')
|
||||
->column('name', 'value');
|
||||
|
||||
// 获取渠道统计信息(channels字段,按渠道分组统计数量)
|
||||
$channelStats = \think\facade\Db::name('doctor_appointment')
|
||||
->field('doctor_id, channels, COUNT(*) as channel_count')
|
||||
->whereIn('doctor_id', $doctorIdsWithAppointments)
|
||||
->where('appointment_date', '>=', $startDate)
|
||||
->where('appointment_date', '<=', $endDate)
|
||||
->whereNotNull('channels')
|
||||
->where('channels', '<>', '')
|
||||
->group('doctor_id, channels')
|
||||
->select()
|
||||
->toArray();
|
||||
|
||||
// 组装渠道统计数据:医生ID => "渠道名称1(数量1) 渠道名称2(数量2)"
|
||||
foreach ($channelStats as $stat) {
|
||||
if (!isset($channelStatsMap[$stat['doctor_id']])) {
|
||||
$channelStatsMap[$stat['doctor_id']] = [];
|
||||
}
|
||||
$channelName = $channelDict[$stat['channels']] ?? $stat['channels'];
|
||||
$channelStatsMap[$stat['doctor_id']][] = $channelName . '(' . $stat['channel_count'] . ')';
|
||||
}
|
||||
}
|
||||
|
||||
// 组装结果
|
||||
$result = [];
|
||||
foreach ($doctors as $doctor) {
|
||||
$stat = $statsMap[$doctor['id']] ?? [
|
||||
'total_count' => 0,
|
||||
'registered_count' => 0,
|
||||
'completed_count' => 0,
|
||||
'missed_count' => 0,
|
||||
'cancelled_count' => 0
|
||||
];
|
||||
|
||||
// 计算完成率
|
||||
$completionRate = $stat['total_count'] > 0
|
||||
? round(($stat['completed_count'] / $stat['total_count']) * 100, 2)
|
||||
: 0;
|
||||
|
||||
$result[] = [
|
||||
'doctor_id' => $doctor['id'],
|
||||
'doctor_name' => $doctor['name'],
|
||||
'total_count' => (int)$stat['total_count'],
|
||||
'registered_count' => (int)$stat['registered_count'],
|
||||
'completed_count' => (int)$stat['completed_count'],
|
||||
'missed_count' => (int)$stat['missed_count'],
|
||||
'cancelled_count' => (int)$stat['cancelled_count'],
|
||||
'completion_rate' => $completionRate,
|
||||
'dept_stats' => isset($deptStatsMap[$doctor['id']]) ? implode(' ', $deptStatsMap[$doctor['id']]) : '未分配',
|
||||
'channel_stats' => isset($channelStatsMap[$doctor['id']]) ? implode(' ', $channelStatsMap[$doctor['id']]) : '未设置',
|
||||
'time_range' => $timeRangeText
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 获取时间范围
|
||||
* @param string $timeType
|
||||
* @param string $customStartDate
|
||||
* @param string $customEndDate
|
||||
* @return array
|
||||
*/
|
||||
private function getTimeRange($timeType, $customStartDate, $customEndDate)
|
||||
{
|
||||
$today = date('Y-m-d');
|
||||
|
||||
switch ($timeType) {
|
||||
case 'today':
|
||||
$startDate = $today;
|
||||
$endDate = $today;
|
||||
$timeRangeText = '今天 (' . $today . ')';
|
||||
break;
|
||||
|
||||
case 'week':
|
||||
$startDate = date('Y-m-d', strtotime('-6 days'));
|
||||
$endDate = $today;
|
||||
$timeRangeText = '最近7天 (' . $startDate . ' 至 ' . $endDate . ')';
|
||||
break;
|
||||
|
||||
case 'month':
|
||||
$startDate = date('Y-m-d', strtotime('-29 days'));
|
||||
$endDate = $today;
|
||||
$timeRangeText = '最近30天 (' . $startDate . ' 至 ' . $endDate . ')';
|
||||
break;
|
||||
|
||||
case 'custom':
|
||||
if ($customStartDate && $customEndDate) {
|
||||
$startDate = $customStartDate;
|
||||
$endDate = $customEndDate;
|
||||
$timeRangeText = '自定义 (' . $startDate . ' 至 ' . $endDate . ')';
|
||||
} else {
|
||||
$startDate = $today;
|
||||
$endDate = $today;
|
||||
$timeRangeText = '今天 (' . $today . ')';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
$startDate = $today;
|
||||
$endDate = $today;
|
||||
$timeRangeText = '今天 (' . $today . ')';
|
||||
}
|
||||
|
||||
return [$startDate, $endDate, $timeRangeText];
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 获取数量
|
||||
* @return int
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return count($this->lists());
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||
namespace app\adminapi\lists\tcm;
|
||||
|
||||
use app\adminapi\lists\BaseAdminDataLists;
|
||||
use app\adminapi\logic\tcm\PrescriptionLibraryLogic;
|
||||
use app\common\model\tcm\PrescriptionLibrary;
|
||||
use app\common\lists\ListsSearchInterface;
|
||||
|
||||
@@ -24,6 +25,21 @@ class PrescriptionLibraryLists extends BaseAdminDataLists implements ListsSearch
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 列表数据范围:超管/管理员角色看全部;普通账号仅看自己创建 + 公开处方
|
||||
*/
|
||||
private function applyDataScope($query)
|
||||
{
|
||||
if (PrescriptionLibraryLogic::canManageAllPrescriptions($this->adminId, $this->adminInfo)) {
|
||||
return $query;
|
||||
}
|
||||
|
||||
return $query->where(function ($q) {
|
||||
$q->where('creator_id', $this->adminId)
|
||||
->whereOr('is_public', 1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 获取列表
|
||||
*/
|
||||
@@ -34,12 +50,10 @@ class PrescriptionLibraryLists extends BaseAdminDataLists implements ListsSearch
|
||||
'creator_id', 'creator_name', 'create_time', 'update_time'
|
||||
];
|
||||
|
||||
$lists = PrescriptionLibrary::where($this->searchWhere)
|
||||
->where(function ($query) {
|
||||
// 只显示自己创建的或公开的处方
|
||||
$query->where('creator_id', $this->adminId)
|
||||
->whereOr('is_public', 1);
|
||||
})
|
||||
$query = PrescriptionLibrary::where($this->searchWhere);
|
||||
$this->applyDataScope($query);
|
||||
|
||||
$lists = $query
|
||||
->field($field)
|
||||
->limit($this->limitOffset, $this->limitLength)
|
||||
->order('id', 'desc')
|
||||
@@ -63,12 +77,9 @@ class PrescriptionLibraryLists extends BaseAdminDataLists implements ListsSearch
|
||||
*/
|
||||
public function count(): int
|
||||
{
|
||||
return PrescriptionLibrary::where($this->searchWhere)
|
||||
->where(function ($query) {
|
||||
// 只统计自己创建的或公开的处方
|
||||
$query->where('creator_id', $this->adminId)
|
||||
->whereOr('is_public', 1);
|
||||
})
|
||||
->count();
|
||||
$query = PrescriptionLibrary::where($this->searchWhere);
|
||||
$this->applyDataScope($query);
|
||||
|
||||
return $query->count();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ class LoginLogic extends BaseLogic
|
||||
'avatar' => $avatar,
|
||||
'role_name' => $adminInfo['role_name'],
|
||||
'token' => $adminInfo['token'],
|
||||
'is_paw' => $admin->is_paw ?? 1, // 0=需要修改密码,1=正常
|
||||
];
|
||||
}
|
||||
|
||||
@@ -133,6 +134,7 @@ class LoginLogic extends BaseLogic
|
||||
'avatar' => $avatar,
|
||||
'role_name' => $adminInfo['role_name'],
|
||||
'token' => $adminInfo['token'],
|
||||
'is_paw' => $admin->is_paw ?? 1, // 0=需要修改密码,1=正常
|
||||
];
|
||||
}
|
||||
|
||||
@@ -211,4 +213,48 @@ class LoginLogic extends BaseLogic
|
||||
//设置token过期
|
||||
return AdminTokenService::expireToken($adminInfo['token']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 首次登录修改密码
|
||||
* @param string $token
|
||||
* @param string $password
|
||||
* @return bool
|
||||
*/
|
||||
public function changeFirstPassword($token, $password)
|
||||
{
|
||||
try {
|
||||
// 通过 token 获取管理员信息
|
||||
$adminSession = \app\common\model\auth\AdminSession::where('token', '=', $token)
|
||||
->where('expire_time', '>', time())
|
||||
->find();
|
||||
|
||||
if (!$adminSession) {
|
||||
self::setError('登录已过期,请重新登录');
|
||||
return false;
|
||||
}
|
||||
|
||||
$admin = Admin::find($adminSession->admin_id);
|
||||
if (!$admin) {
|
||||
self::setError('管理员不存在');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 使用系统的密码加密方式
|
||||
$passwordSalt = Config::get('project.unique_identification');
|
||||
$encryptedPassword = create_password($password, $passwordSalt);
|
||||
|
||||
// 更新密码和 is_paw 标记
|
||||
$admin->password = $encryptedPassword;
|
||||
$admin->is_paw = 1;
|
||||
$admin->save();
|
||||
|
||||
// 使当前 token 过期,要求重新登录
|
||||
AdminTokenService::expireToken($token);
|
||||
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -281,7 +281,7 @@ class AdminLogic extends BaseLogic
|
||||
{
|
||||
$admin = Admin::field([
|
||||
'id', 'account', 'name', 'disable', 'root',
|
||||
'multipoint_login', 'avatar',
|
||||
'multipoint_login', 'avatar', 'is_paw',
|
||||
'gender', 'age', 'phone', 'title', 'department',
|
||||
'specialty', 'education', 'experience', 'honors',
|
||||
'license_no', 'qualification_images', 'enable_image_consult', 'enable_video_consult', 'enable_charge',
|
||||
@@ -311,6 +311,9 @@ class AdminLogic extends BaseLogic
|
||||
return $admin;
|
||||
}
|
||||
|
||||
$authRoleIds = AdminRole::where('admin_id', $params['id'])->column('role_id');
|
||||
$admin['role_ids'] = array_values(array_map('intval', $authRoleIds));
|
||||
|
||||
$result['user'] = $admin;
|
||||
// 当前管理员角色拥有的菜单
|
||||
$result['menu'] = MenuLogic::getMenuByAdminId($params['id']);
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace app\adminapi\logic\doctor;
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\common\model\doctor\Appointment;
|
||||
use app\common\model\doctor\Roster;
|
||||
use app\common\service\doctor\RosterSegmentService;
|
||||
use app\common\model\tcm\Diagnosis;
|
||||
use app\common\model\auth\Admin;
|
||||
use app\api\logic\ChatNotifyLogic;
|
||||
@@ -70,72 +71,46 @@ class AppointmentLogic extends BaseLogic
|
||||
return ['slots' => []];
|
||||
}
|
||||
|
||||
// 2. 根据排班时段生成时间段
|
||||
// 2. 按每段排班的起止时间与号源间隔生成时间段
|
||||
$slots = [];
|
||||
|
||||
|
||||
foreach ($rosters as $roster) {
|
||||
// 再次确认状态为出诊(双重检查)
|
||||
if ($roster['status'] != 1) {
|
||||
if ((int) $roster['status'] !== 1) {
|
||||
\think\facade\Log::warning('跳过非出诊排班', [
|
||||
'roster_id' => $roster['id'],
|
||||
'status' => $roster['status']
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
$periodValue = $roster['period'];
|
||||
|
||||
\think\facade\Log::info('处理排班时段', [
|
||||
'roster_id' => $roster['id'],
|
||||
'period' => $periodValue,
|
||||
'status' => $roster['status'],
|
||||
'period_type' => gettype($periodValue)
|
||||
]);
|
||||
|
||||
// 根据时段生成时间段(支持数字和字符串格式)
|
||||
$startHour = null;
|
||||
$endHour = null;
|
||||
|
||||
if ($periodValue == 1 || $periodValue === 'morning' || $periodValue === '上午') {
|
||||
// 上午:9:00-12:00
|
||||
$startHour = 9;
|
||||
$endHour = 12;
|
||||
\think\facade\Log::info('识别为上午时段', ['period' => $periodValue]);
|
||||
} elseif ($periodValue == 2 || $periodValue === 'afternoon' || $periodValue === '下午') {
|
||||
// 下午:14:00-18:00
|
||||
$startHour = 14;
|
||||
$endHour = 18;
|
||||
\think\facade\Log::info('识别为下午时段', ['period' => $periodValue]);
|
||||
} else {
|
||||
\think\facade\Log::warning('未知的时段值,跳过此记录', [
|
||||
'roster_id' => $roster['id'],
|
||||
'period' => $periodValue,
|
||||
'period_type' => gettype($periodValue)
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 确保startHour和endHour已设置
|
||||
if ($startHour === null || $endHour === null) {
|
||||
\think\facade\Log::error('时段参数未正确设置', [
|
||||
'roster_id' => $roster['id'],
|
||||
'period' => $periodValue
|
||||
'status' => $roster['status'],
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 生成15分钟间隔的时间段
|
||||
for ($hour = $startHour; $hour < $endHour; $hour++) {
|
||||
for ($minute = 0; $minute < 60; $minute += 15) {
|
||||
$time = sprintf('%02d:%02d', $hour, $minute);
|
||||
|
||||
$slots[] = [
|
||||
'time' => $time,
|
||||
'available' => true,
|
||||
'quota' => 1,
|
||||
'period' => $periodValue
|
||||
];
|
||||
}
|
||||
$window = RosterSegmentService::resolveWindow($roster);
|
||||
if ($window === null) {
|
||||
\think\facade\Log::warning('无法解析排班起止时间,跳过', [
|
||||
'roster_id' => $roster['id'],
|
||||
'period' => $roster['period'] ?? null,
|
||||
]);
|
||||
continue;
|
||||
}
|
||||
|
||||
[$startHm, $endHm] = $window;
|
||||
$slotMinutes = RosterSegmentService::normalizeSlotMinutes($roster['slot_minutes'] ?? 15);
|
||||
$times = RosterSegmentService::generateSlotTimes($startHm, $endHm, $slotMinutes);
|
||||
$times = RosterSegmentService::applyQuotaCap($times, (int) ($roster['quota'] ?? 0));
|
||||
|
||||
\think\facade\Log::info('处理排班时段', [
|
||||
'roster_id' => $roster['id'],
|
||||
'window' => $window,
|
||||
'slot_minutes' => $slotMinutes,
|
||||
'slot_count' => count($times),
|
||||
]);
|
||||
|
||||
foreach ($times as $time) {
|
||||
$slots[] = [
|
||||
'time' => $time,
|
||||
'available' => true,
|
||||
'quota' => 1,
|
||||
'period' => $roster['period'] ?? 'segment',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,14 +139,8 @@ class AppointmentLogic extends BaseLogic
|
||||
|
||||
\think\facade\Log::info('生成的时间段数量(去重后)', [
|
||||
'count' => count($slots),
|
||||
'morning_slots' => count(array_filter($slots, function($s) {
|
||||
return $s['time'] < '12:00';
|
||||
})),
|
||||
'afternoon_slots' => count(array_filter($slots, function($s) {
|
||||
return $s['time'] >= '14:00';
|
||||
})),
|
||||
'first_3_slots' => array_slice($slots, 0, 3),
|
||||
'last_3_slots' => array_slice($slots, -3)
|
||||
'last_3_slots' => array_slice($slots, -3),
|
||||
]);
|
||||
|
||||
// 4. 查询已预约的时间段
|
||||
@@ -237,6 +206,7 @@ class AppointmentLogic extends BaseLogic
|
||||
}
|
||||
$data = [
|
||||
'patient_id' => $params['patient_id'],
|
||||
'assistant_id'=>$params['assistant_id'],
|
||||
'doctor_id' => $params['doctor_id'],
|
||||
'roster_id' => 0, // 不再关联排班表
|
||||
'appointment_date' => $params['appointment_date'],
|
||||
@@ -244,6 +214,7 @@ class AppointmentLogic extends BaseLogic
|
||||
'appointment_time' => $appointmentTime,
|
||||
'appointment_type' => $params['appointment_type'] ?? 'video',
|
||||
'remark' => $params['remark'] ?? '',
|
||||
'channel_source' => $params['channel_source'] ?? '',
|
||||
'status' => 1,
|
||||
'create_time' => time(),
|
||||
'update_time' => time(),
|
||||
@@ -339,28 +310,41 @@ class AppointmentLogic extends BaseLogic
|
||||
public static function getDoctorAvailability($doctorId, $date)
|
||||
{
|
||||
try {
|
||||
$totalAvailable = 0;
|
||||
|
||||
// 查询上午和下午的排班
|
||||
$rosters = Roster::where([
|
||||
'doctor_id' => $doctorId,
|
||||
'date' => $date,
|
||||
'status' => 1 // 出诊
|
||||
])->select();
|
||||
'status' => 1,
|
||||
])->select()->toArray();
|
||||
|
||||
if (empty($rosters)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$bookedHm = Appointment::where([
|
||||
'doctor_id' => $doctorId,
|
||||
'appointment_date' => $date,
|
||||
'status' => 1,
|
||||
])->column('appointment_time');
|
||||
$bookedHm = array_map(static function ($t) {
|
||||
return substr((string) $t, 0, 5);
|
||||
}, $bookedHm);
|
||||
$bookedSet = array_fill_keys($bookedHm, true);
|
||||
|
||||
$totalAvailable = 0;
|
||||
|
||||
foreach ($rosters as $roster) {
|
||||
// 查询该时段已预约数量
|
||||
$appointmentCount = Appointment::where([
|
||||
'doctor_id' => $doctorId,
|
||||
'appointment_date' => $date,
|
||||
'period' => $roster->period,
|
||||
'status' => 1
|
||||
])->count();
|
||||
|
||||
// 计算剩余号源
|
||||
$remaining = $roster->quota - $appointmentCount;
|
||||
if ($remaining > 0) {
|
||||
$totalAvailable += $remaining;
|
||||
$window = RosterSegmentService::resolveWindow($roster);
|
||||
if ($window === null) {
|
||||
continue;
|
||||
}
|
||||
[$startHm, $endHm] = $window;
|
||||
$slotMinutes = RosterSegmentService::normalizeSlotMinutes($roster['slot_minutes'] ?? 15);
|
||||
$times = RosterSegmentService::generateSlotTimes($startHm, $endHm, $slotMinutes);
|
||||
$times = RosterSegmentService::applyQuotaCap($times, (int) ($roster['quota'] ?? 0));
|
||||
foreach ($times as $t) {
|
||||
if (empty($bookedSet[$t])) {
|
||||
++$totalAvailable;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace app\adminapi\logic\doctor;
|
||||
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\common\model\doctor\Medicine;
|
||||
use app\common\service\doctor\MedicineNameAbbrService;
|
||||
|
||||
/**
|
||||
* 药品库逻辑层
|
||||
*/
|
||||
class MedicineLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* 添加药品
|
||||
*/
|
||||
public static function add(array $params): bool
|
||||
{
|
||||
try {
|
||||
Medicine::create([
|
||||
'name' => $params['name'],
|
||||
'name_pinyin_abbr' => MedicineNameAbbrService::build($params['name']),
|
||||
'supplier' => $params['supplier'],
|
||||
'unit' => $params['unit'],
|
||||
'settlement_price' => $params['settlement_price'],
|
||||
'retail_price' => $params['retail_price'],
|
||||
'stock' => $params['stock'] ?? 0,
|
||||
'image' => $params['image'] ?? '',
|
||||
'status' => $params['status'] ?? 1,
|
||||
'remark' => $params['remark'] ?? '',
|
||||
]);
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑药品
|
||||
*/
|
||||
public static function edit(array $params): bool
|
||||
{
|
||||
try {
|
||||
Medicine::update([
|
||||
'id' => $params['id'],
|
||||
'name' => $params['name'],
|
||||
'name_pinyin_abbr' => MedicineNameAbbrService::build($params['name']),
|
||||
'supplier' => $params['supplier'],
|
||||
'unit' => $params['unit'],
|
||||
'settlement_price' => $params['settlement_price'],
|
||||
'retail_price' => $params['retail_price'],
|
||||
'stock' => $params['stock'] ?? 0,
|
||||
'image' => $params['image'] ?? '',
|
||||
'status' => $params['status'] ?? 1,
|
||||
'remark' => $params['remark'] ?? '',
|
||||
]);
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除药品
|
||||
*/
|
||||
public static function delete(array $params): bool
|
||||
{
|
||||
Medicine::destroy($params['id']);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 药品详情
|
||||
*/
|
||||
public static function detail(array $params): array
|
||||
{
|
||||
return Medicine::findOrEmpty($params['id'])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ namespace app\adminapi\logic\doctor;
|
||||
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\common\model\doctor\Roster;
|
||||
use app\common\service\doctor\RosterSegmentService;
|
||||
use think\facade\Db;
|
||||
|
||||
/**
|
||||
@@ -13,6 +14,80 @@ use think\facade\Db;
|
||||
*/
|
||||
class RosterLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* 组装单条排班数据(period 缺省为 segment)
|
||||
*/
|
||||
protected static function buildRowData(array $params): array
|
||||
{
|
||||
$period = $params['period'] ?? '';
|
||||
if (!in_array($period, ['morning', 'afternoon', 'night', 'segment'], true)) {
|
||||
$period = 'segment';
|
||||
}
|
||||
|
||||
$start = trim((string) ($params['start_time'] ?? ''));
|
||||
$end = trim((string) ($params['end_time'] ?? ''));
|
||||
$status = (int) $params['status'];
|
||||
$slotMinutes = RosterSegmentService::normalizeSlotMinutes($params['slot_minutes'] ?? 15);
|
||||
|
||||
if ($status === 1) {
|
||||
if ($start === '' || $end === '') {
|
||||
throw new \InvalidArgumentException('出诊须填写接诊开始与结束时间');
|
||||
}
|
||||
if ($start >= $end) {
|
||||
throw new \InvalidArgumentException('结束时间须晚于开始时间');
|
||||
}
|
||||
} else {
|
||||
if ($start === '' || $end === '') {
|
||||
throw new \InvalidArgumentException('请填写时段开始与结束时间');
|
||||
}
|
||||
if ($start >= $end) {
|
||||
throw new \InvalidArgumentException('结束时间须晚于开始时间');
|
||||
}
|
||||
}
|
||||
|
||||
$shiftType = $params['shift_type'] ?? '';
|
||||
if ($shiftType !== '' && !in_array($shiftType, ['day', 'night'], true)) {
|
||||
$shiftType = '';
|
||||
}
|
||||
|
||||
$quota = (int) ($params['quota'] ?? 0);
|
||||
if ($status !== 1) {
|
||||
$quota = 0;
|
||||
}
|
||||
|
||||
return [
|
||||
'doctor_id' => (int) $params['doctor_id'],
|
||||
'date' => $params['date'],
|
||||
'period' => $period,
|
||||
'start_time' => $start,
|
||||
'end_time' => $end,
|
||||
'shift_type' => $shiftType !== '' ? $shiftType : null,
|
||||
'slot_minutes' => $slotMinutes,
|
||||
'status' => $status,
|
||||
'quota' => $quota,
|
||||
'max_patients' => $status === 1 ? (int) ($params['max_patients'] ?? 0) : 0,
|
||||
'remark' => (string) ($params['remark'] ?? ''),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否存在相同医生、日期、起止时间的记录(排除指定 id)
|
||||
*/
|
||||
protected static function duplicateExists(int $doctorId, string $date, string $start, string $end, ?int $excludeId = null): bool
|
||||
{
|
||||
$q = Roster::where([
|
||||
['doctor_id', '=', $doctorId],
|
||||
['date', '=', $date],
|
||||
['start_time', '=', $start],
|
||||
['end_time', '=', $end],
|
||||
]);
|
||||
if ($excludeId) {
|
||||
$q->where('id', '<>', $excludeId);
|
||||
}
|
||||
|
||||
return (bool) $q->find();
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 保存排班
|
||||
* @param array $params
|
||||
@@ -21,30 +96,33 @@ class RosterLogic extends BaseLogic
|
||||
public static function save(array $params)
|
||||
{
|
||||
try {
|
||||
$data = [
|
||||
'doctor_id' => $params['doctor_id'],
|
||||
'date' => $params['date'],
|
||||
'period' => $params['period'],
|
||||
'status' => $params['status'],
|
||||
'quota' => $params['quota'] ?? 0,
|
||||
'max_patients' => $params['max_patients'] ?? 0,
|
||||
'remark' => $params['remark'] ?? '',
|
||||
];
|
||||
$data = self::buildRowData($params);
|
||||
|
||||
if (isset($params['id']) && $params['id']) {
|
||||
// 更新
|
||||
$data['update_time'] = time();
|
||||
Roster::where('id', $params['id'])->update($data);
|
||||
return ['id' => $params['id']];
|
||||
} else {
|
||||
// 新增
|
||||
$data['create_time'] = time();
|
||||
$data['update_time'] = time();
|
||||
$roster = Roster::create($data);
|
||||
return ['id' => $roster->id];
|
||||
if (self::duplicateExists($data['doctor_id'], $data['date'], $data['start_time'], $data['end_time'], !empty($params['id']) ? (int) $params['id'] : null)) {
|
||||
self::setError('该医生在同一天已存在相同的接诊时段');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!empty($params['id'])) {
|
||||
$data['update_time'] = time();
|
||||
Roster::where('id', (int) $params['id'])->update($data);
|
||||
|
||||
return ['id' => (int) $params['id']];
|
||||
}
|
||||
|
||||
$data['create_time'] = time();
|
||||
$data['update_time'] = time();
|
||||
$roster = Roster::create($data);
|
||||
|
||||
return ['id' => $roster->id];
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -58,9 +136,11 @@ class RosterLogic extends BaseLogic
|
||||
{
|
||||
try {
|
||||
Roster::destroy($params['id']);
|
||||
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -84,53 +164,50 @@ class RosterLogic extends BaseLogic
|
||||
{
|
||||
try {
|
||||
Db::startTrans();
|
||||
|
||||
|
||||
$successCount = 0;
|
||||
$updateCount = 0;
|
||||
$createCount = 0;
|
||||
|
||||
foreach ($params['rosters'] as $roster) {
|
||||
$data = [
|
||||
'doctor_id' => $roster['doctor_id'],
|
||||
'date' => $roster['date'],
|
||||
'period' => $roster['period'],
|
||||
'status' => $roster['status'],
|
||||
'quota' => $roster['quota'] ?? 0,
|
||||
'max_patients' => $roster['max_patients'] ?? 0,
|
||||
'remark' => $roster['remark'] ?? '',
|
||||
];
|
||||
|
||||
// 检查是否已存在
|
||||
foreach ($params['rosters'] as $roster) {
|
||||
$data = self::buildRowData($roster);
|
||||
|
||||
$exists = Roster::where([
|
||||
['doctor_id', '=', $data['doctor_id']],
|
||||
['date', '=', $data['date']],
|
||||
['period', '=', $data['period']],
|
||||
['start_time', '=', $data['start_time']],
|
||||
['end_time', '=', $data['end_time']],
|
||||
])->find();
|
||||
|
||||
if ($exists) {
|
||||
// 更新
|
||||
$data['update_time'] = time();
|
||||
$exists->save($data);
|
||||
$updateCount++;
|
||||
++$updateCount;
|
||||
} else {
|
||||
// 新增
|
||||
$data['create_time'] = time();
|
||||
$data['update_time'] = time();
|
||||
Roster::create($data);
|
||||
$createCount++;
|
||||
++$createCount;
|
||||
}
|
||||
$successCount++;
|
||||
++$successCount;
|
||||
}
|
||||
|
||||
Db::commit();
|
||||
|
||||
return [
|
||||
'success_count' => $successCount,
|
||||
'create_count' => $createCount,
|
||||
'update_count' => $updateCount,
|
||||
];
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
Db::rollback();
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -145,28 +222,29 @@ class RosterLogic extends BaseLogic
|
||||
try {
|
||||
Db::startTrans();
|
||||
|
||||
// 获取源排班数据
|
||||
$where = [
|
||||
['date', 'between', [$params['source_start_date'], $params['source_end_date']]]
|
||||
['date', 'between', [$params['source_start_date'], $params['source_end_date']]],
|
||||
];
|
||||
|
||||
|
||||
if (isset($params['doctor_id']) && $params['doctor_id']) {
|
||||
$where[] = ['doctor_id', '=', $params['doctor_id']];
|
||||
}
|
||||
|
||||
$sourceRosters = Roster::where($where)->select();
|
||||
|
||||
// 计算日期差
|
||||
$sourceDays = (strtotime($params['source_end_date']) - strtotime($params['source_start_date'])) / 86400;
|
||||
$targetDays = (strtotime($params['target_start_date']) - strtotime($params['source_start_date'])) / 86400;
|
||||
|
||||
foreach ($sourceRosters as $roster) {
|
||||
$newDate = date('Y-m-d', strtotime($roster->date) + ($targetDays * 86400));
|
||||
|
||||
|
||||
$data = [
|
||||
'doctor_id' => $roster->doctor_id,
|
||||
'date' => $newDate,
|
||||
'period' => $roster->period,
|
||||
'start_time' => $roster->start_time,
|
||||
'end_time' => $roster->end_time,
|
||||
'shift_type' => $roster->shift_type,
|
||||
'slot_minutes' => $roster->slot_minutes ?: 15,
|
||||
'status' => $roster->status,
|
||||
'quota' => $roster->quota,
|
||||
'max_patients' => $roster->max_patients,
|
||||
@@ -175,23 +253,29 @@ class RosterLogic extends BaseLogic
|
||||
'update_time' => time(),
|
||||
];
|
||||
|
||||
// 检查目标日期是否已存在排班
|
||||
$exists = Roster::where([
|
||||
if (empty($data['start_time']) || empty($data['end_time'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$dup = Roster::where([
|
||||
['doctor_id', '=', $data['doctor_id']],
|
||||
['date', '=', $data['date']],
|
||||
['period', '=', $data['period']],
|
||||
['start_time', '=', $data['start_time']],
|
||||
['end_time', '=', $data['end_time']],
|
||||
])->find();
|
||||
|
||||
if (!$exists) {
|
||||
if (!$dup) {
|
||||
Roster::create($data);
|
||||
}
|
||||
}
|
||||
|
||||
Db::commit();
|
||||
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
self::setError($e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,9 @@ namespace app\adminapi\logic\tcm;
|
||||
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\common\model\tcm\Diagnosis;
|
||||
use app\common\model\tcm\ImChatMessage;
|
||||
use app\common\model\DiagnosisViewRecord;
|
||||
use think\facade\Db;
|
||||
/**
|
||||
* 中医辨房病因诊单逻辑
|
||||
* Class DiagnosisLogic
|
||||
@@ -499,7 +501,10 @@ class DiagnosisLogic extends BaseLogic
|
||||
$doctorUserId = 'doctor_' . $adminId;
|
||||
$query = Diagnosis::where('id', $patientId)
|
||||
->where('delete_time', null)->find();
|
||||
|
||||
if(!$query){
|
||||
self::setError('患者诊单已被删除');
|
||||
return false;
|
||||
}
|
||||
|
||||
// 患者userId(必须与小程序端一致)
|
||||
$patientUserId = 'patient_' . $patientId;
|
||||
@@ -524,7 +529,9 @@ class DiagnosisLogic extends BaseLogic
|
||||
'userSig' => $userSig,
|
||||
'assistant_id'=>$query->assistant_id?'doctor_'.$query->assistant_id:'',
|
||||
'patientUserId' => $patientUserId, // 患者的userId(用于发起通话)
|
||||
'expireTime' => 86400 // 24小时
|
||||
'expireTime' => 86400, // 24小时
|
||||
// 与 .env [trtc] ISLOCHOSTVOD 一致:true 允许浏览器本地录制并上传
|
||||
'isLochostVod' => (bool)config('trtc.is_lochost_vod', false),
|
||||
];
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
@@ -620,16 +627,11 @@ class DiagnosisLogic extends BaseLogic
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 拉取与本诊单相关的腾讯云 IM 单聊记录(C2C:patient_{患者ID} 与 全部医生/医助账号 doctor_* 分别会话后合并)
|
||||
* @notes 拉取与本诊单相关的 IM 单聊记录:本地归档 + 腾讯云漫游合并(归档突破云端约 7 天限制)
|
||||
*/
|
||||
public static function getImChatMessagesForDiagnosis(int $diagnosisId)
|
||||
{
|
||||
try {
|
||||
$config = self::getTrtcConfig();
|
||||
if (!$config) {
|
||||
self::setError('请先配置腾讯云 TRTC / IM 参数');
|
||||
return false;
|
||||
}
|
||||
$diag = Diagnosis::where('id', $diagnosisId)->where('delete_time', null)->find();
|
||||
if (!$diag) {
|
||||
self::setError('诊单不存在');
|
||||
@@ -641,6 +643,24 @@ class DiagnosisLogic extends BaseLogic
|
||||
return false;
|
||||
}
|
||||
$patientImId = 'patient_' . $patientId;
|
||||
$archived = self::loadArchivedImChatRows($diagnosisId);
|
||||
|
||||
$config = self::getTrtcConfig();
|
||||
if (!$config) {
|
||||
if (empty($archived)) {
|
||||
self::setError('请先配置腾讯云 TRTC / IM 参数');
|
||||
return false;
|
||||
}
|
||||
$lists = self::enrichImMessagesWithStaffNames($archived);
|
||||
|
||||
return [
|
||||
'lists' => $lists,
|
||||
'patient_im_id' => $patientImId,
|
||||
'patient_name' => $diag['patient_name'] ?? '',
|
||||
'doctor_accounts_queried' => [],
|
||||
];
|
||||
}
|
||||
|
||||
$doctorAccounts = self::collectAllDoctorImPeerAccounts();
|
||||
$assistantId = isset($diag['assistant_id']) ? (int)$diag['assistant_id'] : 0;
|
||||
if ($assistantId > 0) {
|
||||
@@ -652,34 +672,12 @@ class DiagnosisLogic extends BaseLogic
|
||||
return false;
|
||||
}
|
||||
|
||||
$imService = new \app\common\service\TencentImService();
|
||||
$merged = [];
|
||||
foreach ($doctorAccounts as $docAccount) {
|
||||
$batch = self::pullAllRoamMessages($imService, $docAccount, $patientImId);
|
||||
foreach ($batch as $row) {
|
||||
$merged[] = $row;
|
||||
}
|
||||
}
|
||||
usort($merged, function ($a, $b) {
|
||||
return ($a['time'] ?? 0) <=> ($b['time'] ?? 0);
|
||||
});
|
||||
$seen = [];
|
||||
$unique = [];
|
||||
foreach ($merged as $row) {
|
||||
$k = $row['msg_id'] ?? '';
|
||||
if ($k !== '' && isset($seen[$k])) {
|
||||
continue;
|
||||
}
|
||||
if ($k !== '') {
|
||||
$seen[$k] = true;
|
||||
}
|
||||
$unique[] = $row;
|
||||
}
|
||||
|
||||
$unique = self::enrichImMessagesWithStaffNames($unique);
|
||||
$live = self::pullLiveImChatMessagesForDiagnosis($diag);
|
||||
$merged = self::mergeImMessagesByMsgId($archived, $live);
|
||||
$merged = self::enrichImMessagesWithStaffNames($merged);
|
||||
|
||||
return [
|
||||
'lists' => $unique,
|
||||
'lists' => $merged,
|
||||
'patient_im_id' => $patientImId,
|
||||
'patient_name' => $diag['patient_name'] ?? '',
|
||||
'doctor_accounts_queried' => $doctorAccounts,
|
||||
@@ -690,6 +688,239 @@ class DiagnosisLogic extends BaseLogic
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时任务:从腾讯云拉取漫游消息写入归档表
|
||||
*
|
||||
* @return array{inserted:int, skipped_live_empty:bool, error?:string}
|
||||
*/
|
||||
public static function syncImChatArchiveForDiagnosis(int $diagnosisId): array
|
||||
{
|
||||
$out = ['inserted' => 0, 'skipped_live_empty' => false];
|
||||
try {
|
||||
if (!self::getTrtcConfig()) {
|
||||
$out['error'] = 'TRTC/IM 未配置';
|
||||
return $out;
|
||||
}
|
||||
$diag = Diagnosis::where('id', $diagnosisId)->where('delete_time', null)->find();
|
||||
if (!$diag) {
|
||||
$out['error'] = '诊单不存在';
|
||||
return $out;
|
||||
}
|
||||
$live = self::pullLiveImChatMessagesForDiagnosis($diag);
|
||||
if (empty($live)) {
|
||||
$out['skipped_live_empty'] = true;
|
||||
return $out;
|
||||
}
|
||||
$live = self::enrichImMessagesWithStaffNames($live);
|
||||
$patientId = (int)$diag['patient_id'];
|
||||
$out['inserted'] = self::persistImChatArchiveRows($diagnosisId, $patientId, $live);
|
||||
return $out;
|
||||
} catch (\Exception $e) {
|
||||
$out['error'] = $e->getMessage();
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{diagnoses:int, inserted:int, errors:array<int, string>}
|
||||
*/
|
||||
public static function syncImChatArchiveBatch(int $sinceDays, int $limit, ?int $onlyDiagnosisId): array
|
||||
{
|
||||
$stats = ['diagnoses' => 0, 'inserted' => 0, 'errors' => []];
|
||||
$limit = max(1, min(500, $limit));
|
||||
$q = Diagnosis::where('delete_time', null);
|
||||
if ($onlyDiagnosisId !== null && $onlyDiagnosisId > 0) {
|
||||
$q->where('id', $onlyDiagnosisId);
|
||||
} elseif ($sinceDays > 0) {
|
||||
$q->where('update_time', '>=', time() - $sinceDays * 86400);
|
||||
}
|
||||
$ids = $q->order('id', 'desc')->limit($limit)->column('id');
|
||||
foreach ($ids as $id) {
|
||||
$stats['diagnoses']++;
|
||||
$r = self::syncImChatArchiveForDiagnosis((int)$id);
|
||||
if (!empty($r['error'])) {
|
||||
$stats['errors'][] = 'diagnosis ' . $id . ': ' . $r['error'];
|
||||
continue;
|
||||
}
|
||||
$stats['inserted'] += (int)($r['inserted'] ?? 0);
|
||||
}
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
private static function loadArchivedImChatRows(int $diagnosisId): array
|
||||
{
|
||||
if ($diagnosisId <= 0) {
|
||||
return [];
|
||||
}
|
||||
$list = ImChatMessage::where('diagnosis_id', $diagnosisId)
|
||||
->order('msg_time', 'asc')
|
||||
->order('id', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
$out = [];
|
||||
foreach ($list as $row) {
|
||||
$out[] = [
|
||||
'msg_id' => (string)($row['msg_id'] ?? ''),
|
||||
'from_account' => (string)($row['from_account'] ?? ''),
|
||||
'to_account' => (string)($row['to_account'] ?? ''),
|
||||
'time' => (int)($row['msg_time'] ?? 0),
|
||||
'is_from_doctor' => !empty($row['is_from_doctor']),
|
||||
'msg_type' => (string)($row['msg_type'] ?? ''),
|
||||
'text' => (string)($row['text'] ?? ''),
|
||||
'image_url' => (string)($row['image_url'] ?? ''),
|
||||
'file_url' => (string)($row['file_url'] ?? ''),
|
||||
'file_name' => (string)($row['file_name'] ?? ''),
|
||||
'raw_elem_type' => (string)($row['raw_elem_type'] ?? ''),
|
||||
'from_staff_name' => (string)($row['from_staff_name'] ?? ''),
|
||||
'doctor_peer_account' => (string)($row['doctor_peer_account'] ?? ''),
|
||||
];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array<string, mixed>> $archived
|
||||
* @param array<int, array<string, mixed>> $live
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
private static function mergeImMessagesByMsgId(array $archived, array $live): array
|
||||
{
|
||||
$map = [];
|
||||
$tail = [];
|
||||
foreach ($archived as $r) {
|
||||
$k = (string)($r['msg_id'] ?? '');
|
||||
if ($k !== '') {
|
||||
$map[$k] = $r;
|
||||
} else {
|
||||
$tail[] = $r;
|
||||
}
|
||||
}
|
||||
foreach ($live as $r) {
|
||||
$k = (string)($r['msg_id'] ?? '');
|
||||
if ($k !== '') {
|
||||
$map[$k] = $r;
|
||||
} else {
|
||||
$tail[] = $r;
|
||||
}
|
||||
}
|
||||
$merged = array_values($map);
|
||||
$merged = array_merge($merged, $tail);
|
||||
usort($merged, function ($a, $b) {
|
||||
return ($a['time'] ?? 0) <=> ($b['time'] ?? 0);
|
||||
});
|
||||
return $merged;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Diagnosis|array<string, mixed> $diag
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
private static function pullLiveImChatMessagesForDiagnosis($diag): array
|
||||
{
|
||||
$patientId = (int)$diag['patient_id'];
|
||||
if ($patientId <= 0) {
|
||||
return [];
|
||||
}
|
||||
$patientImId = 'patient_' . $patientId;
|
||||
$doctorAccounts = self::collectAllDoctorImPeerAccounts();
|
||||
$assistantId = isset($diag['assistant_id']) ? (int)$diag['assistant_id'] : 0;
|
||||
if ($assistantId > 0) {
|
||||
$doctorAccounts[] = 'doctor_' . $assistantId;
|
||||
}
|
||||
$doctorAccounts = array_values(array_unique($doctorAccounts));
|
||||
if (empty($doctorAccounts)) {
|
||||
return [];
|
||||
}
|
||||
$imService = new \app\common\service\TencentImService();
|
||||
$merged = [];
|
||||
foreach ($doctorAccounts as $docAccount) {
|
||||
$batch = self::pullAllRoamMessages($imService, $docAccount, $patientImId);
|
||||
foreach ($batch as $row) {
|
||||
$merged[] = $row;
|
||||
}
|
||||
}
|
||||
usort($merged, function ($a, $b) {
|
||||
return ($a['time'] ?? 0) <=> ($b['time'] ?? 0);
|
||||
});
|
||||
$seen = [];
|
||||
$unique = [];
|
||||
foreach ($merged as $row) {
|
||||
$k = $row['msg_id'] ?? '';
|
||||
if ($k !== '' && isset($seen[$k])) {
|
||||
continue;
|
||||
}
|
||||
if ($k !== '') {
|
||||
$seen[$k] = true;
|
||||
}
|
||||
$unique[] = $row;
|
||||
}
|
||||
return $unique;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array<string, mixed>> $rows
|
||||
*/
|
||||
private static function persistImChatArchiveRows(int $diagnosisId, int $patientId, array $rows): int
|
||||
{
|
||||
$now = time();
|
||||
$chunks = [];
|
||||
foreach ($rows as $r) {
|
||||
$msgId = (string)($r['msg_id'] ?? '');
|
||||
if ($msgId === '') {
|
||||
continue;
|
||||
}
|
||||
$chunks[] = [
|
||||
'diagnosis_id' => $diagnosisId,
|
||||
'patient_id' => $patientId,
|
||||
'msg_id' => $msgId,
|
||||
'from_account' => (string)($r['from_account'] ?? ''),
|
||||
'to_account' => (string)($r['to_account'] ?? ''),
|
||||
'msg_time' => (int)($r['time'] ?? 0),
|
||||
'is_from_doctor' => !empty($r['is_from_doctor']) ? 1 : 0,
|
||||
'msg_type' => (string)($r['msg_type'] ?? ''),
|
||||
'text' => (string)($r['text'] ?? ''),
|
||||
'image_url' => (string)($r['image_url'] ?? ''),
|
||||
'file_url' => (string)($r['file_url'] ?? ''),
|
||||
'file_name' => (string)($r['file_name'] ?? ''),
|
||||
'raw_elem_type' => (string)($r['raw_elem_type'] ?? ''),
|
||||
'from_staff_name' => (string)($r['from_staff_name'] ?? ''),
|
||||
'doctor_peer_account' => (string)($r['doctor_peer_account'] ?? ''),
|
||||
'create_time' => $now,
|
||||
];
|
||||
}
|
||||
$inserted = 0;
|
||||
foreach (array_chunk($chunks, 80) as $chunk) {
|
||||
$inserted += self::insertIgnoreImChatBatch($chunk);
|
||||
}
|
||||
return $inserted;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array<string, mixed>> $chunk
|
||||
*/
|
||||
private static function insertIgnoreImChatBatch(array $chunk): int
|
||||
{
|
||||
if (empty($chunk)) {
|
||||
return 0;
|
||||
}
|
||||
$table = (new ImChatMessage())->getTable();
|
||||
$cols = array_keys($chunk[0]);
|
||||
$colSql = '`' . implode('`,`', $cols) . '`';
|
||||
$rowPh = '(' . implode(',', array_fill(0, count($cols), '?')) . ')';
|
||||
$allPh = implode(',', array_fill(0, count($chunk), $rowPh));
|
||||
$flat = [];
|
||||
foreach ($chunk as $row) {
|
||||
foreach ($cols as $c) {
|
||||
$flat[] = $row[$c];
|
||||
}
|
||||
}
|
||||
$sql = 'INSERT IGNORE INTO `' . $table . '` (' . $colSql . ') VALUES ' . $allPh;
|
||||
return (int)Db::execute($sql, $flat);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为 from_account = doctor_{id} 的消息补充后台姓名,便于前端区分不同医生
|
||||
*
|
||||
@@ -747,7 +978,9 @@ class DiagnosisLogic extends BaseLogic
|
||||
if (!is_array($raw)) {
|
||||
continue;
|
||||
}
|
||||
$out[] = self::normalizeTimMessage($raw);
|
||||
$normalized = self::normalizeTimMessage($raw);
|
||||
$normalized['doctor_peer_account'] = $operator;
|
||||
$out[] = $normalized;
|
||||
}
|
||||
$complete = (int)$res['complete'];
|
||||
if ($complete === 1) {
|
||||
|
||||
@@ -5,13 +5,34 @@ declare(strict_types=1);
|
||||
namespace app\adminapi\logic\tcm;
|
||||
|
||||
use app\common\logic\BaseLogic;
|
||||
use app\common\model\auth\AdminRole;
|
||||
use app\common\model\tcm\PrescriptionLibrary;
|
||||
use think\facade\Config;
|
||||
|
||||
/**
|
||||
* 处方库逻辑层
|
||||
*/
|
||||
class PrescriptionLibraryLogic extends BaseLogic
|
||||
{
|
||||
/**
|
||||
* @notes 是否可管理全部处方(超级管理员 或 配置中的管理员角色)
|
||||
*/
|
||||
public static function canManageAllPrescriptions(int $adminId, array $adminInfo): bool
|
||||
{
|
||||
if (!empty($adminInfo['root']) && (int) $adminInfo['root'] === 1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$allowRoles = Config::get('project.prescription_library_manage_all_roles', []);
|
||||
if ($allowRoles === [] || $allowRoles === null) {
|
||||
$allowRoles = Config::get('project.order_edit_all_roles', [0, 3]);
|
||||
}
|
||||
|
||||
$myRoles = AdminRole::where('admin_id', $adminId)->column('role_id');
|
||||
|
||||
return count(array_intersect($myRoles, $allowRoles)) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 添加处方库
|
||||
*/
|
||||
@@ -24,7 +45,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
}
|
||||
|
||||
$model = PrescriptionLibrary::create($params);
|
||||
return $model->id;
|
||||
return (int) $model->id;
|
||||
} catch (\Exception $e) {
|
||||
self::setError($e->getMessage());
|
||||
return null;
|
||||
@@ -34,7 +55,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
/**
|
||||
* @notes 编辑处方库
|
||||
*/
|
||||
public static function edit(array $params, int $adminId): bool
|
||||
public static function edit(array $params, int $adminId, bool $canManageAll = false): bool
|
||||
{
|
||||
try {
|
||||
$model = PrescriptionLibrary::findOrEmpty($params['id']);
|
||||
@@ -43,8 +64,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
return false;
|
||||
}
|
||||
|
||||
// 权限检查:只有创建者或公开的处方才能编辑
|
||||
if ($model->creator_id != $adminId && $model->is_public != 1) {
|
||||
if (!$canManageAll && (int) $model->creator_id !== $adminId) {
|
||||
self::setError('无权限编辑此处方');
|
||||
return false;
|
||||
}
|
||||
@@ -65,7 +85,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
/**
|
||||
* @notes 删除处方库
|
||||
*/
|
||||
public static function delete(int $id, int $adminId): bool
|
||||
public static function delete(int $id, int $adminId, bool $canManageAll = false): bool
|
||||
{
|
||||
try {
|
||||
$model = PrescriptionLibrary::findOrEmpty($id);
|
||||
@@ -74,8 +94,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
return false;
|
||||
}
|
||||
|
||||
// 权限检查:只有创建者才能删除
|
||||
if ($model->creator_id != $adminId) {
|
||||
if (!$canManageAll && (int) $model->creator_id !== $adminId) {
|
||||
self::setError('无权限删除此处方');
|
||||
return false;
|
||||
}
|
||||
@@ -91,7 +110,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
/**
|
||||
* @notes 处方库详情
|
||||
*/
|
||||
public static function detail(int $id, int $adminId): ?array
|
||||
public static function detail(int $id, int $adminId, bool $canManageAll = false): ?array
|
||||
{
|
||||
try {
|
||||
$model = PrescriptionLibrary::findOrEmpty($id);
|
||||
@@ -99,8 +118,7 @@ class PrescriptionLibraryLogic extends BaseLogic
|
||||
return null;
|
||||
}
|
||||
|
||||
// 权限检查:只有创建者或公开的处方才能查看
|
||||
if ($model->creator_id != $adminId && $model->is_public != 1) {
|
||||
if (!$canManageAll && (int) $model->creator_id !== $adminId && (int) $model->is_public !== 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ class AppointmentValidate extends BaseValidate
|
||||
'period' => 'in:morning,afternoon,all',
|
||||
'appointment_time' => 'require',
|
||||
'appointment_type' => 'in:video,text,phone',
|
||||
'channel_source' => 'require',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -37,6 +38,7 @@ class AppointmentValidate extends BaseValidate
|
||||
'period' => '时段',
|
||||
'appointment_time' => '预约时间',
|
||||
'appointment_type' => '预约类型',
|
||||
'channel_source' => '渠道来源',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -45,7 +47,7 @@ class AppointmentValidate extends BaseValidate
|
||||
*/
|
||||
public function sceneCreate()
|
||||
{
|
||||
return $this->only(['patient_id', 'doctor_id', 'appointment_date', 'period', 'appointment_time', 'appointment_type']);
|
||||
return $this->only(['patient_id', 'doctor_id', 'appointment_date', 'period', 'appointment_time', 'appointment_type', 'channel_source']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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']);
|
||||
}
|
||||
}
|
||||
@@ -12,26 +12,38 @@ use app\common\validate\BaseValidate;
|
||||
class RosterValidate extends BaseValidate
|
||||
{
|
||||
protected $rule = [
|
||||
'id' => 'require',
|
||||
'id' => 'number',
|
||||
'doctor_id' => 'require',
|
||||
'date' => 'require|date',
|
||||
'period' => 'require|in:morning,afternoon',
|
||||
'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.require' => '请选择时段',
|
||||
'period.in' => '时段参数错误',
|
||||
'period.in' => '时段类型参数错误',
|
||||
'start_time.require' => '请填写接诊开始时间',
|
||||
'start_time.regex' => '开始时间格式须为 HH:mm',
|
||||
'end_time.require' => '请填写接诊结束时间',
|
||||
'end_time.regex' => '结束时间格式须为 HH:mm',
|
||||
'slot_minutes.number' => '号源间隔须为数字',
|
||||
'slot_minutes.between' => '号源间隔须在 5~120 分钟',
|
||||
'status.require' => '请选择状态',
|
||||
'status.in' => '状态参数错误',
|
||||
'quota.number' => '号源数必须是数字',
|
||||
'max_patients.number' => '最大接诊数必须是数字',
|
||||
'remark.max' => '备注过长',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -39,7 +51,10 @@ class RosterValidate extends BaseValidate
|
||||
*/
|
||||
public function sceneSave()
|
||||
{
|
||||
return $this->only(['doctor_id', 'date', 'period', 'status', 'quota', 'max_patients', 'remark']);
|
||||
return $this->only([
|
||||
'id', 'doctor_id', 'date', 'period', 'start_time', 'end_time', 'shift_type', 'slot_minutes',
|
||||
'status', 'quota', 'max_patients', 'remark',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,7 +62,7 @@ class RosterValidate extends BaseValidate
|
||||
*/
|
||||
public function sceneDelete()
|
||||
{
|
||||
return $this->only(['id']);
|
||||
return $this->only(['id'])->append('id', 'require');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,7 +70,7 @@ class RosterValidate extends BaseValidate
|
||||
*/
|
||||
public function sceneDetail()
|
||||
{
|
||||
return $this->only(['id']);
|
||||
return $this->only(['id'])->append('id', 'require');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\common\command;
|
||||
|
||||
use app\adminapi\logic\tcm\DiagnosisLogic;
|
||||
use think\console\Command;
|
||||
use think\console\Input;
|
||||
use think\console\input\Option;
|
||||
use think\console\Output;
|
||||
use think\facade\Log;
|
||||
|
||||
/**
|
||||
* 从腾讯云 IM 拉取诊单单聊漫游消息并写入本地归档表(建议 cron 每几小时执行)
|
||||
*/
|
||||
class SyncImChatArchive extends Command
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this->setName('sync_im_chat_archive')
|
||||
->setDescription('同步诊单腾讯云 IM 聊天记录到数据库归档')
|
||||
->addOption('since-days', null, Option::VALUE_OPTIONAL, '仅处理最近 N 天内更新过的诊单;0 表示不限制', '7')
|
||||
->addOption('limit', 'l', Option::VALUE_OPTIONAL, '本轮最多处理的诊单数量(1-500)', '50')
|
||||
->addOption('diagnosis-id', null, Option::VALUE_OPTIONAL, '只同步指定诊单 ID,设置后忽略 since-days', '0');
|
||||
}
|
||||
|
||||
protected function execute(Input $input, Output $output)
|
||||
{
|
||||
$sinceDays = (int)$input->getOption('since-days');
|
||||
$sinceDays = max(0, $sinceDays);
|
||||
$limit = (int)$input->getOption('limit');
|
||||
$onlyId = (int)$input->getOption('diagnosis-id');
|
||||
$only = $onlyId > 0 ? $onlyId : null;
|
||||
|
||||
if ($only !== null) {
|
||||
$output->writeln("同步诊单 ID={$only} ...");
|
||||
} else {
|
||||
$output->writeln('同步 IM 归档:since-days=' . ($sinceDays > 0 ? $sinceDays : '不限制') . ", limit={$limit}");
|
||||
}
|
||||
|
||||
$stats = DiagnosisLogic::syncImChatArchiveBatch($sinceDays, $limit, $only);
|
||||
$output->writeln("处理诊单数: {$stats['diagnoses']},新插入行数(INSERT IGNORE 成功数): {$stats['inserted']}");
|
||||
if (!empty($stats['errors'])) {
|
||||
foreach ($stats['errors'] as $e) {
|
||||
$output->writeln("<error>{$e}</error>");
|
||||
Log::error('sync_im_chat_archive: ' . $e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\common\command;
|
||||
|
||||
use app\common\model\doctor\Medicine;
|
||||
use app\common\service\doctor\MedicineNameAbbrService;
|
||||
use think\console\Command;
|
||||
use think\console\Input;
|
||||
use think\console\input\Option;
|
||||
use think\console\Output;
|
||||
|
||||
/**
|
||||
* 批量回填药材库 name_pinyin_abbr(拼音首字母,供检索)
|
||||
*
|
||||
* 用法:
|
||||
* php think sync_medicine_pinyin_abbr # 仅更新 abbr 为空的记录
|
||||
* php think sync_medicine_pinyin_abbr --all # 全部按当前名称重算
|
||||
* php think sync_medicine_pinyin_abbr --dry # 只打印将更新多少条,不写库
|
||||
*/
|
||||
class SyncMedicinePinyinAbbr extends Command
|
||||
{
|
||||
protected function configure()
|
||||
{
|
||||
$this->setName('sync_medicine_pinyin_abbr')
|
||||
->setDescription('回填/刷新药材表 name_pinyin_abbr(需已执行迁移并 composer 安装 overtrue/pinyin)')
|
||||
->addOption('all', null, Option::VALUE_NONE, '重算全部记录(默认只处理 abbr 为空的)')
|
||||
->addOption('dry', null, Option::VALUE_NONE, '仅统计/预览,不写入数据库');
|
||||
}
|
||||
|
||||
protected function execute(Input $input, Output $output)
|
||||
{
|
||||
if (!class_exists(\Overtrue\Pinyin\Pinyin::class)) {
|
||||
$output->writeln('<error>未检测到 overtrue/pinyin,请在 server 目录执行: composer update</error>');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
$all = (bool) $input->getOption('all');
|
||||
$dry = (bool) $input->getOption('dry');
|
||||
|
||||
$makeQuery = function () use ($all) {
|
||||
$q = Medicine::order('id', 'asc');
|
||||
if (!$all) {
|
||||
$q->where('name_pinyin_abbr', '');
|
||||
}
|
||||
|
||||
return $q;
|
||||
};
|
||||
|
||||
$total = $makeQuery()->count();
|
||||
if ($total === 0) {
|
||||
$output->writeln('没有需要处理的记录。');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
$output->writeln(($all ? '模式: 全部重算' : '模式: 仅空 abbr') . ",待处理 {$total} 条" . ($dry ? '(dry-run)' : ''));
|
||||
|
||||
$updated = 0;
|
||||
$skipped = 0;
|
||||
|
||||
$makeQuery()->chunk(200, function ($rows) use (&$updated, &$skipped, $dry) {
|
||||
foreach ($rows as $row) {
|
||||
$data = $row instanceof \think\Model ? $row->toArray() : (array) $row;
|
||||
$id = (int) ($data['id'] ?? 0);
|
||||
$name = trim((string) ($data['name'] ?? ''));
|
||||
if ($id <= 0 || $name === '') {
|
||||
++$skipped;
|
||||
continue;
|
||||
}
|
||||
$abbr = MedicineNameAbbrService::build($name);
|
||||
if ($abbr === '') {
|
||||
++$skipped;
|
||||
continue;
|
||||
}
|
||||
if ($dry) {
|
||||
++$updated;
|
||||
continue;
|
||||
}
|
||||
Medicine::where('id', $id)->update([
|
||||
'name_pinyin_abbr' => $abbr,
|
||||
'update_time' => time(),
|
||||
]);
|
||||
++$updated;
|
||||
}
|
||||
});
|
||||
|
||||
if ($dry) {
|
||||
$output->writeln("[预览] 将写入/覆盖拼音首字母: {$updated} 条,跳过(空名或无法生成): {$skipped} 条");
|
||||
} else {
|
||||
$output->writeln("完成: 已更新 {$updated} 条,跳过 {$skipped} 条。");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model\doctor;
|
||||
|
||||
use app\common\model\BaseModel;
|
||||
|
||||
/**
|
||||
* 药品库模型
|
||||
*/
|
||||
class Medicine extends BaseModel
|
||||
{
|
||||
protected $name = 'doctor_medicine';
|
||||
|
||||
// 设置字段信息
|
||||
protected $schema = [
|
||||
'id' => 'int',
|
||||
'name' => 'string',
|
||||
'name_pinyin_abbr' => 'string',
|
||||
'supplier' => 'string',
|
||||
'unit' => 'string',
|
||||
'settlement_price' => 'float',
|
||||
'retail_price' => 'float',
|
||||
'stock' => 'int',
|
||||
'image' => 'string',
|
||||
'status' => 'int',
|
||||
'remark' => 'string',
|
||||
'create_time' => 'int',
|
||||
'update_time' => 'int',
|
||||
'delete_time' => 'int',
|
||||
];
|
||||
}
|
||||
@@ -47,7 +47,22 @@ class Roster extends BaseModel
|
||||
*/
|
||||
public function getPeriodDescAttr($value, $data)
|
||||
{
|
||||
return $data['period'] == 'morning' ? '上午' : '下午';
|
||||
$st = $data['start_time'] ?? '';
|
||||
$et = $data['end_time'] ?? '';
|
||||
if ($st !== '' && $et !== '') {
|
||||
return $st . '-' . $et;
|
||||
}
|
||||
if (($data['period'] ?? '') === 'morning') {
|
||||
return '上午';
|
||||
}
|
||||
if (($data['period'] ?? '') === 'afternoon') {
|
||||
return '下午';
|
||||
}
|
||||
if (($data['period'] ?? '') === 'night') {
|
||||
return '夜班';
|
||||
}
|
||||
|
||||
return '时段';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model\tcm;
|
||||
|
||||
use app\common\model\BaseModel;
|
||||
|
||||
/**
|
||||
* 诊单 IM 聊天记录归档
|
||||
*/
|
||||
class ImChatMessage extends BaseModel
|
||||
{
|
||||
protected $name = 'tcm_im_chat_message';
|
||||
|
||||
protected $autoWriteTimestamp = false;
|
||||
|
||||
protected $dateFormat = false;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\service\doctor;
|
||||
|
||||
use Overtrue\Pinyin\Pinyin;
|
||||
|
||||
/**
|
||||
* 药材名称 → 拼音首字母连写(小写),供列表检索;未安装 overtrue/pinyin 时返回空字符串。
|
||||
*/
|
||||
class MedicineNameAbbrService
|
||||
{
|
||||
public static function build(string $name): string
|
||||
{
|
||||
$name = trim($name);
|
||||
if ($name === '') {
|
||||
return '';
|
||||
}
|
||||
if (!class_exists(Pinyin::class)) {
|
||||
return '';
|
||||
}
|
||||
$abbr = (string) Pinyin::abbr($name)->join('');
|
||||
|
||||
return strtolower($abbr);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\service\doctor;
|
||||
|
||||
/**
|
||||
* 排班时段:起止时间 + 号源间隔
|
||||
*/
|
||||
class RosterSegmentService
|
||||
{
|
||||
/**
|
||||
* 从排班记录解析 [开始 HH:mm, 结束 HH:mm],无效返回 null
|
||||
*/
|
||||
public static function resolveWindow(array $roster): ?array
|
||||
{
|
||||
$start = isset($roster['start_time']) ? trim((string) $roster['start_time']) : '';
|
||||
$end = isset($roster['end_time']) ? trim((string) $roster['end_time']) : '';
|
||||
|
||||
if ($start !== '' && $end !== ''
|
||||
&& preg_match('/^\d{2}:\d{2}$/', $start)
|
||||
&& preg_match('/^\d{2}:\d{2}$/', $end)
|
||||
&& $start < $end) {
|
||||
return [$start, $end];
|
||||
}
|
||||
|
||||
$p = $roster['period'] ?? '';
|
||||
|
||||
if ($p == 1 || $p === 'morning' || $p === '上午') {
|
||||
return ['09:00', '12:00'];
|
||||
}
|
||||
if ($p == 2 || $p === 'afternoon' || $p === '下午') {
|
||||
return ['14:00', '18:00'];
|
||||
}
|
||||
if ($p === 'night' || $p === '夜班' || $p === 'evening') {
|
||||
return ['18:00', '22:00'];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function normalizeSlotMinutes($raw): int
|
||||
{
|
||||
$n = (int) $raw;
|
||||
if ($n < 5) {
|
||||
return 15;
|
||||
}
|
||||
if ($n > 120) {
|
||||
return 120;
|
||||
}
|
||||
|
||||
return $n;
|
||||
}
|
||||
|
||||
/**
|
||||
* 左闭右开 [start, end) 按 slotMinutes 切分,得到每个号的开始时刻 HH:mm
|
||||
*/
|
||||
public static function generateSlotTimes(string $start, string $end, int $slotMinutes): array
|
||||
{
|
||||
$slotMinutes = self::normalizeSlotMinutes($slotMinutes);
|
||||
$base = '1970-01-01 ';
|
||||
$cur = strtotime($base . $start . ':00');
|
||||
$endTs = strtotime($base . $end . ':00');
|
||||
if ($cur === false || $endTs === false || $endTs <= $cur) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$times = [];
|
||||
$step = $slotMinutes * 60;
|
||||
while ($cur < $endTs) {
|
||||
$times[] = date('H:i', $cur);
|
||||
$cur += $step;
|
||||
}
|
||||
|
||||
return $times;
|
||||
}
|
||||
|
||||
/**
|
||||
* quota>0 时限制最大可约槽位数;quota=0 表示不限制(由时段长度决定)
|
||||
*/
|
||||
public static function applyQuotaCap(array $times, int $quota): array
|
||||
{
|
||||
if ($quota > 0 && count($times) > $quota) {
|
||||
return array_slice($times, 0, $quota);
|
||||
}
|
||||
|
||||
return $times;
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,8 @@
|
||||
"w7corp/easywechat": "^6.8",
|
||||
"tencentcloud/sms": "^3.0",
|
||||
"tencentcloud/trtc": "^3.0",
|
||||
"alipaysdk/easysdk": "^2.2"
|
||||
"alipaysdk/easysdk": "^2.2",
|
||||
"overtrue/pinyin": "^6.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/var-dumper": ">=4.2",
|
||||
|
||||
Generated
+119
-2
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "9ad490f5c91c889266a4b29eb605ac59",
|
||||
"content-hash": "c8b18a5821cfd82f2e70cf67a7f40740",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adbario/php-dot-notation",
|
||||
@@ -1798,6 +1798,80 @@
|
||||
],
|
||||
"time": "2021-05-12T11:11:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "overtrue/pinyin",
|
||||
"version": "6.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/overtrue/pinyin.git",
|
||||
"reference": "d79364f289f5ccdabdd3142556d4254c7574f87c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/overtrue/pinyin/zipball/d79364f289f5ccdabdd3142556d4254c7574f87c",
|
||||
"reference": "d79364f289f5ccdabdd3142556d4254c7574f87c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"brainmaestro/composer-git-hooks": "^3.0",
|
||||
"laravel/pint": "^1.10",
|
||||
"nunomaduro/termwind": "^1.0 || ^2.0",
|
||||
"phpunit/phpunit": "^10.5 || ^11.5 || ^12.0"
|
||||
},
|
||||
"bin": [
|
||||
"bin/pinyin"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"hooks": {
|
||||
"pre-push": [
|
||||
"composer pint",
|
||||
"composer test"
|
||||
],
|
||||
"pre-commit": [
|
||||
"composer pint",
|
||||
"composer test"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Overtrue\\Pinyin\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "overtrue",
|
||||
"email": "anzhengchao@gmail.com",
|
||||
"homepage": "http://github.com/overtrue"
|
||||
}
|
||||
],
|
||||
"description": "Chinese to pinyin translator.",
|
||||
"homepage": "https://github.com/overtrue/pinyin",
|
||||
"keywords": [
|
||||
"Chinese",
|
||||
"Pinyin",
|
||||
"cn2pinyin"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/overtrue/pinyin/issues",
|
||||
"source": "https://github.com/overtrue/pinyin/tree/6.0.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/overtrue",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2026-03-06T13:15:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "overtrue/socialite",
|
||||
"version": "4.8.1",
|
||||
@@ -4300,6 +4374,49 @@
|
||||
},
|
||||
"time": "2023-10-09T00:41:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "tencentcloud/trtc",
|
||||
"version": "3.0.990",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tencentcloud-sdk-php/trtc.git",
|
||||
"reference": "bd4722704c2ee8f53018238848c07fec54d3d8ce"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/tencentcloud-sdk-php/trtc/zipball/bd4722704c2ee8f53018238848c07fec54d3d8ce",
|
||||
"reference": "bd4722704c2ee8f53018238848c07fec54d3d8ce",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"tencentcloud/common": "3.0.990"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"TencentCloud\\": "./src/TencentCloud"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "tencentcloudapi",
|
||||
"email": "tencentcloudapi@tencent.com",
|
||||
"homepage": "https://github.com/tencentcloud-sdk-php/trtc",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "TencentCloudApi php sdk trtc",
|
||||
"homepage": "https://github.com/tencentcloud-sdk-php/trtc",
|
||||
"support": {
|
||||
"issues": "https://github.com/tencentcloud-sdk-php/trtc/issues",
|
||||
"source": "https://github.com/tencentcloud-sdk-php/trtc/tree/3.0.990"
|
||||
},
|
||||
"time": "2023-10-09T00:53:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "thenorthmemory/xml",
|
||||
"version": "1.1.1",
|
||||
@@ -5022,5 +5139,5 @@
|
||||
"php": ">=8.0"
|
||||
},
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.6.0"
|
||||
"plugin-api-version": "2.3.0"
|
||||
}
|
||||
|
||||
@@ -13,5 +13,9 @@ return [
|
||||
'sync_wechat_work_bills' => 'app\common\command\SyncWechatWorkBills',
|
||||
// 挂号单状态自动更新(过号->4,超8小时->2)
|
||||
'update_appointment_status' => 'app\common\command\UpdateAppointmentStatus',
|
||||
// 诊单腾讯云 IM 聊天记录入库归档
|
||||
'sync_im_chat_archive' => 'app\common\command\SyncImChatArchive',
|
||||
// 药材库拼音首字母回填(name_pinyin_abbr)
|
||||
'sync_medicine_pinyin_abbr' => 'app\common\command\SyncMedicinePinyinAbbr',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -105,6 +105,9 @@ return [
|
||||
// 订单编辑权限:拥有以下角色ID的用户可修改任意订单,其他用户只能修改自己创建的订单
|
||||
'order_edit_all_roles' => [0, 3],
|
||||
|
||||
// 处方库:以下角色ID + 超级管理员(root) 可查看/编辑/删除全部;他人仅可管理自己创建的,公开处方对他人只读
|
||||
'prescription_library_manage_all_roles' => [0, 3],
|
||||
|
||||
// 腾讯云实时音视频(TRTC)配置
|
||||
'trtc' => [
|
||||
'sdkAppId' => (int)env('trtc.sdk_app_id', 1600127710),
|
||||
|
||||
@@ -15,6 +15,12 @@ return [
|
||||
// 是否启用
|
||||
'enable' => env('trtc.enable', false),
|
||||
|
||||
// 管理端聊天窗「浏览器本地录制」开关(.env [trtc] ISLOCHOSTVOD=true 开启,false 关闭)
|
||||
'is_lochost_vod' => filter_var(
|
||||
env('trtc.ISLOCHOSTVOD', env('trtc.islochostvod', false)),
|
||||
FILTER_VALIDATE_BOOLEAN
|
||||
),
|
||||
|
||||
// 云端录制 HTTP 回调可选校验:非空则请求需带 ?token=xxx(与 .env trtc.recording_callback_token 一致)
|
||||
'recording_callback_token' => env('trtc.recording_callback_token', ''),
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
-- 预约表:渠道来源(字典 type_value = channels)
|
||||
ALTER TABLE `zyt_doctor_appointment`
|
||||
ADD COLUMN `channel_source` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道来源(字典channels)' AFTER `remark`;
|
||||
@@ -0,0 +1,18 @@
|
||||
-- 医生排班:一条记录 = 一段连续可挂号时间(支持同日多段、白班/夜班)
|
||||
-- 表前缀默认 zyt_,与 config/database.php 中 prefix 一致
|
||||
|
||||
ALTER TABLE `zyt_doctor_roster`
|
||||
ADD COLUMN `start_time` varchar(5) DEFAULT NULL COMMENT '接诊开始 HH:mm' AFTER `period`,
|
||||
ADD COLUMN `end_time` varchar(5) DEFAULT NULL COMMENT '接诊结束 HH:mm' AFTER `start_time`,
|
||||
ADD COLUMN `shift_type` varchar(20) DEFAULT NULL COMMENT 'day白班/night夜班' AFTER `end_time`,
|
||||
ADD COLUMN `slot_minutes` smallint unsigned NOT NULL DEFAULT 15 COMMENT '号源间隔分钟' AFTER `shift_type`;
|
||||
|
||||
-- 历史数据:按原上午/下午补全时间
|
||||
UPDATE `zyt_doctor_roster` SET `start_time`='09:00', `end_time`='12:00' WHERE `period`='morning' AND (`start_time` IS NULL OR `start_time`='');
|
||||
UPDATE `zyt_doctor_roster` SET `start_time`='14:00', `end_time`='18:00' WHERE `period`='afternoon' AND (`start_time` IS NULL OR `start_time`='');
|
||||
|
||||
-- 原唯一键限制「每天仅上午+下午」,需改为按时段区分
|
||||
ALTER TABLE `zyt_doctor_roster` DROP INDEX `uk_doctor_date_period`;
|
||||
|
||||
-- 防止同一天重复录入完全相同的时间段(含软删字段,与 ThinkPHP 软删一致)
|
||||
ALTER TABLE `zyt_doctor_roster` ADD UNIQUE KEY `uk_doctor_date_segment` (`doctor_id`,`date`,`start_time`,`end_time`,`delete_time`);
|
||||
@@ -0,0 +1,3 @@
|
||||
-- 药材库:拼音首字母连写,供列表检索(如 甘草 -> gc)
|
||||
ALTER TABLE `zyt_doctor_medicine`
|
||||
ADD COLUMN `name_pinyin_abbr` varchar(64) NOT NULL DEFAULT '' COMMENT '名称拼音首字母(小写连写)' AFTER `name`;
|
||||
@@ -0,0 +1,27 @@
|
||||
-- 诊单腾讯云 IM 单聊消息归档(定时从 admin_getroammsg 同步,突破云端约 7 天漫游限制)
|
||||
-- 执行前请确认库名与表前缀(默认前缀 zyt_)
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `zyt_tcm_im_chat_message` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`diagnosis_id` int unsigned NOT NULL DEFAULT 0 COMMENT '诊单ID',
|
||||
`patient_id` int unsigned NOT NULL DEFAULT 0 COMMENT '患者ID(冗余,便于按患者维度排查/统计)',
|
||||
`msg_id` varchar(160) NOT NULL DEFAULT '' COMMENT '业务唯一键:MsgSeq_MsgRandom_From_Account',
|
||||
`from_account` varchar(64) NOT NULL DEFAULT '' COMMENT '发送方 IM UserID',
|
||||
`to_account` varchar(64) NOT NULL DEFAULT '' COMMENT '接收方 IM UserID',
|
||||
`msg_time` int unsigned NOT NULL DEFAULT 0 COMMENT '消息时间 Unix 时间戳',
|
||||
`is_from_doctor` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '是否医生/医助侧发送',
|
||||
`msg_type` varchar(32) NOT NULL DEFAULT '' COMMENT 'text/image/file/sound/video/custom/...',
|
||||
`text` mediumtext COMMENT '文本或自定义消息 Data',
|
||||
`image_url` varchar(1024) NOT NULL DEFAULT '' COMMENT '图片 URL',
|
||||
`file_url` varchar(1024) NOT NULL DEFAULT '' COMMENT '文件/语音/视频 URL',
|
||||
`file_name` varchar(512) NOT NULL DEFAULT '' COMMENT '文件名',
|
||||
`raw_elem_type` varchar(64) NOT NULL DEFAULT '' COMMENT 'TIM 元素类型',
|
||||
`from_staff_name` varchar(64) NOT NULL DEFAULT '' COMMENT '医生侧姓名快照',
|
||||
`doctor_peer_account` varchar(64) NOT NULL DEFAULT '' COMMENT '拉取会话时使用的医生侧账号 doctor_*',
|
||||
`create_time` int unsigned NOT NULL DEFAULT 0 COMMENT '入库时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_msg_id` (`msg_id`),
|
||||
KEY `idx_diagnosis_time` (`diagnosis_id`,`msg_time`),
|
||||
KEY `idx_patient_time` (`patient_id`,`msg_time`),
|
||||
KEY `idx_msg_time` (`msg_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='诊单IM聊天记录归档';
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import r from"./error-9c68Wyzd.js";import{f as p,ak as i,I as m,a as e,aN as s,J as o}from"./@vue/runtime-core-C0pg79pw.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-CYz6RFzi.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const a="/admin/assets/no_perms-jDxcYpYC.png",n={class:"error404"},W=p({__name:"403",setup(c){return(_,t)=>(i(),m("div",n,[e(r,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:s(()=>[...t[0]||(t[0]=[o("div",{class:"flex justify-center"},[o("img",{class:"w-[150px] h-[150px]",src:a,alt:""})],-1)])]),_:1})]))}});export{W as default};
|
||||
import r from"./error-Db2Vny7j.js";import{f as p,ak as i,I as m,a as e,aN as s,J as o}from"./@vue/runtime-core-C0pg79pw.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-CYz6RFzi.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const a="/admin/assets/no_perms-jDxcYpYC.png",n={class:"error404"},W=p({__name:"403",setup(c){return(_,t)=>(i(),m("div",n,[e(r,{code:"403",title:"您的账号权限不足,请联系管理员添加权限!","show-btn":!1},{content:s(()=>[...t[0]||(t[0]=[o("div",{class:"flex justify-center"},[o("img",{class:"w-[150px] h-[150px]",src:a,alt:""})],-1)])]),_:1})]))}});export{W as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import o from"./error-9c68Wyzd.js";import{f as r,ak as t,I as m,a as p}from"./@vue/runtime-core-C0pg79pw.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-CYz6RFzi.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const i={class:"error404"},T=r({__name:"404",setup(e){return(a,s)=>(t(),m("div",i,[p(o,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{T as default};
|
||||
import o from"./error-Db2Vny7j.js";import{f as r,ak as t,I as m,a as p}from"./@vue/runtime-core-C0pg79pw.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./vue-router-CYz6RFzi.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const i={class:"error404"},T=r({__name:"404",setup(e){return(a,s)=>(t(),m("div",i,[p(o,{code:"404",title:"哎呀,出错了!您访问的页面不存在…"})]))}});export{T as default};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import"./uikit-base-component-vue3-j7nzpOcN.js";import{A as r}from"../tuikit-atomicx-vue3-DrGeCvj1.js";import{f as s,ak as c,I as l,aq as m,G as u,at as i,H as p,A as d}from"../@vue/runtime-core-C0pg79pw.js";import{y as v}from"../@vue/reactivity-BIbyPIZJ.js";import"./chat-uikit-engine-HMtIAGRh.js";const _=(t,o)=>{const a=t.__vccOpts||t;for(const[e,n]of o)a[e]=n;return a},f={key:0,class:"chat"},h=s({name:"Chat",__name:"Chat",props:{PlaceholderEmpty:{default:null}},setup(t){const{activeConversation:o}=r(),a=d(()=>{var e;return!((e=o.value)!=null&&e.conversationID)});return(e,n)=>v(o)?(c(),l("div",f,[m(e.$slots,"default",{},void 0,!0)])):a.value&&t.PlaceholderEmpty?(c(),u(i(t.PlaceholderEmpty),{key:1})):p("",!0)}}),A=_(h,[["__scopeId","data-v-1c9c77cd"]]);typeof window<"u"&&(window.__CHAT_ATOMICX_VUE3__={name:"@tencentcloud/chat-uikit-vue3",version:"4.5.4"},console.log("[@tencentcloud/chat-uikit-vue3] v4.5.4"));export{A as E};
|
||||
import"./uikit-base-component-vue3-k0EAtVKz.js";import{A as r}from"../tuikit-atomicx-vue3-BHPlbt3H.js";import{f as s,ak as c,I as l,aq as m,G as u,at as i,H as p,A as d}from"../@vue/runtime-core-C0pg79pw.js";import{y as v}from"../@vue/reactivity-BIbyPIZJ.js";import"./chat-uikit-engine-zx802ozq.js";const _=(t,o)=>{const a=t.__vccOpts||t;for(const[e,n]of o)a[e]=n;return a},f={key:0,class:"chat"},h=s({name:"Chat",__name:"Chat",props:{PlaceholderEmpty:{default:null}},setup(t){const{activeConversation:o}=r(),a=d(()=>{var e;return!((e=o.value)!=null&&e.conversationID)});return(e,n)=>v(o)?(c(),l("div",f,[m(e.$slots,"default",{},void 0,!0)])):a.value&&t.PlaceholderEmpty?(c(),u(i(t.PlaceholderEmpty),{key:1})):p("",!0)}}),A=_(h,[["__scopeId","data-v-1c9c77cd"]]);typeof window<"u"&&(window.__CHAT_ATOMICX_VUE3__={name:"@tencentcloud/chat-uikit-vue3",version:"4.5.4"},console.log("[@tencentcloud/chat-uikit-vue3] v4.5.4"));export{A as E};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.watch-state[data-v-7aff665d]{min-height:200px;display:flex;align-items:center;justify-content:center;color:var(--el-text-color-secondary);font-size:14px}.watch-error[data-v-7aff665d]{color:var(--el-color-danger)}.watch-grid[data-v-7aff665d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;min-height:220px}.watch-tile[data-v-7aff665d]{background:#0f0f0f;border-radius:8px;overflow:hidden;aspect-ratio:16 / 10;display:flex;flex-direction:column}.watch-tile-cap[data-v-7aff665d]{padding:6px 10px;font-size:12px;color:#e5e5e5;background:#0000008c}.watch-tile-view[data-v-7aff665d]{flex:1;min-height:0;position:relative}.watch-hint[data-v-7aff665d]{float:left;line-height:32px;font-size:12px;color:var(--el-text-color-secondary)}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{K as E,L,N,M as P,a0 as T}from"./element-plus-D9NzL5HE.js";import{x as B}from"./tcm-9dTydv5E.js";import{f as R,w as V,ak as o,I as i,a,aP as D,G as u,aN as s,O as l,F,ap as A}from"./@vue/runtime-core-C0pg79pw.js";import{Q as n}from"./@vue/shared-mAAVTE9n.js";import{o as g}from"./@vue/reactivity-BIbyPIZJ.js";import{a as G}from"./index-D54sWaXv.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const K={class:"call-record-panel"},M={key:0,class:"recording-list"},O=["src"],Q={key:1,class:"text-gray-400"},S=R({__name:"CallRecordPanel",props:{diagnosisId:{}},setup(h,{expose:b}){const p=h,m=g(!1),c=g([]),_=async()=>{if(p.diagnosisId){m.value=!0;try{c.value=await B({diagnosis_id:p.diagnosisId})||[]}catch(t){console.error(t),c.value=[]}finally{m.value=!1}}};V(()=>p.diagnosisId,()=>{_()},{immediate:!0}),b({refresh:_});function y(t){return{1:"进行中",2:"已结束",3:"未接听",4:"已取消"}[t]??"—"}function v(t){return!t||typeof t!="string"?!1:/\.(mp4|webm|ogg)(\?|$)/i.test(t)}return(t,w)=>{const x=E,r=N,k=T,C=P,I=L;return o(),i("div",K,[a(x,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"视频通话与录制回放"}),D((o(),u(C,{data:c.value,border:"",stripe:"","empty-text":"暂无通话记录"},{default:s(()=>[a(r,{label:"开始时间",width:"170",prop:"start_time_text"}),a(r,{label:"结束时间",width:"170",prop:"end_time_text"}),a(r,{label:"通话类型",width:"100"},{default:s(({row:e})=>[l(n(e.call_type===1?"语音":"视频"),1)]),_:1}),a(r,{label:"时长",width:"110",prop:"duration_text"}),a(r,{label:"状态",width:"90"},{default:s(({row:e})=>[l(n(y(e.status)),1)]),_:1}),a(r,{label:"录制",width:"100"},{default:s(({row:e})=>[l(n(e.recording_status_text||"—"),1)]),_:1}),a(r,{label:"录制回放","min-width":"280"},{default:s(({row:e})=>[(e.recording_urls_list||[]).length?(o(),i("div",M,[(o(!0),i(F,null,A(e.recording_urls_list,(d,f)=>(o(),i("div",{key:f,class:"recording-item"},[v(d)?(o(),i("video",{key:0,src:d,controls:"",preload:"metadata",class:"recording-video"},null,8,O)):(o(),u(k,{key:1,href:d,target:"_blank",type:"primary"},{default:s(()=>[l(" 打开链接 "+n(f+1),1)]),_:2},1032,["href"]))]))),128))])):(o(),i("span",Q,"暂无"))]),_:1})]),_:1},8,["data"])),[[I,m.value]])])}}}),Lt=G(S,[["__scopeId","data-v-6e14a232"]]);export{Lt as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{K as T,L as B,N as E,M as N,a0 as P}from"./element-plus-CFxTwCZ2.js";import{B as V}from"./tcm-CEDF0dA_.js";import{f as A,w as D,ak as r,I as n,a as i,aN as l,J as d,O as a,aP as F,G as b,F as U,ap as $,A as G}from"./@vue/runtime-core-C0pg79pw.js";import{Q as p}from"./@vue/shared-mAAVTE9n.js";import{o as y}from"./@vue/reactivity-BIbyPIZJ.js";import{d as H}from"./index-DqzX0p3J.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const J={class:"call-record-panel"},K={class:"call-record-tip muted"},M={key:0,class:"recording-list"},O=["src"],Q={key:1,class:"text-gray-400"},S=A({__name:"CallRecordPanel",props:{diagnosisId:{}},setup(w,{expose:k}){const m=w,c=y(!1),_=y([]),v=G(()=>`${typeof window<"u"?window.location.origin:""}/api/trtc/recording-notify`),f=async()=>{if(m.diagnosisId){c.value=!0;try{_.value=await V({diagnosis_id:m.diagnosisId})||[]}catch(o){console.error(o),_.value=[]}finally{c.value=!1}}};D(()=>m.diagnosisId,()=>{f()},{immediate:!0}),k({refresh:f});function x(o){return{1:"进行中",2:"已结束",3:"未接听",4:"已取消"}[o]??"—"}function h(o){return!o||typeof o!="string"?!1:/\.(mp4|webm|ogg)(\?|$)/i.test(o)}return(o,t)=>{const C=T,s=E,I=P,L=N,R=B;return r(),n("div",J,[i(C,{type:"info","show-icon":"",closable:!1,class:"mb-4",title:"视频通话与云端录制"},{default:l(()=>[t[6]||(t[6]=d("p",{class:"call-record-tip"}," 下列为与本诊单关联的通话记录。若在腾讯云 TRTC 控制台开启了云端录制并填写回调地址,录制生成后会自动写入「录制回放」。 ",-1)),d("p",K,[t[0]||(t[0]=a(" 回调 URL 示例:",-1)),d("code",null,p(v.value),1),t[1]||(t[1]=a(" (若配置了 ",-1)),t[2]||(t[2]=d("code",null,"trtc.recording_callback_token",-1)),t[3]||(t[3]=a(",请在 URL 后附加 ",-1)),t[4]||(t[4]=d("code",null,"?token=你的密钥",-1)),t[5]||(t[5]=a(") ",-1))])]),_:1}),F((r(),b(L,{data:_.value,border:"",stripe:"","empty-text":"暂无通话记录"},{default:l(()=>[i(s,{label:"开始时间",width:"170",prop:"start_time_text"}),i(s,{label:"结束时间",width:"170",prop:"end_time_text"}),i(s,{label:"通话类型",width:"100"},{default:l(({row:e})=>[a(p(e.call_type===1?"语音":"视频"),1)]),_:1}),i(s,{label:"时长",width:"110",prop:"duration_text"}),i(s,{label:"状态",width:"90"},{default:l(({row:e})=>[a(p(x(e.status)),1)]),_:1}),i(s,{label:"录制",width:"100"},{default:l(({row:e})=>[a(p(e.recording_status_text||"—"),1)]),_:1}),i(s,{label:"录制回放","min-width":"280"},{default:l(({row:e})=>[(e.recording_urls_list||[]).length?(r(),n("div",M,[(r(!0),n(U,null,$(e.recording_urls_list,(u,g)=>(r(),n("div",{key:g,class:"recording-item"},[h(u)?(r(),n("video",{key:0,src:u,controls:"",preload:"metadata",class:"recording-video"},null,8,O)):(r(),b(I,{key:1,href:u,target:"_blank",type:"primary"},{default:l(()=>[a(" 打开链接 "+p(g+1),1)]),_:2},1032,["href"]))]))),128))])):(r(),n("span",Q,"暂无"))]),_:1})]),_:1},8,["data"])),[[R,c.value]])])}}}),Nt=H(S,[["__scopeId","data-v-71e65c55"]]);export{Nt as default};
|
||||
@@ -1 +0,0 @@
|
||||
.call-record-panel .call-record-tip[data-v-71e65c55]{margin:0 0 8px;line-height:1.5;font-size:13px}.call-record-panel .call-record-tip.muted[data-v-71e65c55]{color:var(--el-text-color-secondary)}.call-record-panel .call-record-tip code[data-v-71e65c55]{font-size:12px;word-break:break-all}.call-record-panel .recording-list[data-v-71e65c55]{display:flex;flex-direction:column;gap:4px}.call-record-panel .recording-video[data-v-71e65c55]{max-width:100%;max-height:180px;border-radius:4px;background:#000}
|
||||
@@ -0,0 +1 @@
|
||||
.call-record-panel .call-record-tip[data-v-6e14a232]{margin:0 0 8px;line-height:1.5;font-size:13px}.call-record-panel .call-record-tip.muted[data-v-6e14a232]{color:var(--el-text-color-secondary)}.call-record-panel .call-record-tip code[data-v-6e14a232]{font-size:12px;word-break:break-all}.call-record-panel .recording-list[data-v-6e14a232]{display:flex;flex-direction:column;gap:4px}.call-record-panel .recording-video[data-v-6e14a232]{max-width:100%;max-height:180px;border-radius:4px;background:#000}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{i as L,L as T,N as V,U as D,M as z,T as M}from"./element-plus-CFxTwCZ2.js";import{A as P}from"./tcm-CEDF0dA_.js";import{f as A,b as F,w as j,ak as r,I as l,J as v,a as i,aN as s,O as m,aP as H,G as g,F as O,H as R}from"./@vue/runtime-core-C0pg79pw.js";import{y as d,o as w}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as c}from"./@vue/shared-mAAVTE9n.js";import{d as G}from"./index-DqzX0p3J.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const J={class:"case-record-list"},Q={class:"mb-3 flex justify-end"},U={key:0},Y={key:1,class:"text-gray-400"},q={class:"void-detail text-xs text-gray-500 mt-1"},K=A({__name:"CaseRecordList",props:{diagnosisId:{type:Number,default:0}},emits:["view","openPrescription"],setup(k,{expose:x,emit:C}){const _=k,y=C,n=w([]),p=w(!1),u=async()=>{if(_.diagnosisId){p.value=!0;try{const e=await P({diagnosis_id:_.diagnosisId});n.value=Array.isArray(e)?e:[]}catch(e){console.error("获取病历记录失败:",e),n.value=[]}finally{p.value=!1}}},S=e=>{if(!e)return"";const t=new Date(e*1e3);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`},$=e=>{y("view",e)},E=()=>{y("openPrescription")};return F(()=>{u()}),j(()=>_.diagnosisId,()=>{u()}),x({refresh:u}),(e,t)=>{const h=L,a=V,b=D,N=z,B=M,I=T;return r(),l("div",J,[v("div",Q,[i(h,{type:"primary",size:"small",onClick:E},{default:s(()=>[...t[0]||(t[0]=[m("开方",-1)])]),_:1})]),H((r(),g(N,{data:d(n),border:""},{default:s(()=>[i(a,{prop:"prescription_date",label:"就诊日期",width:"120"}),i(a,{prop:"visit_no",label:"门诊号",width:"120"}),i(a,{prop:"clinical_diagnosis",label:"临床诊断","min-width":"160","show-overflow-tooltip":""}),i(a,{label:"处方摘要","min-width":"180"},{default:s(({row:o})=>[o.herbs&&o.herbs.length?(r(),l("span",U,c(o.herbs.slice(0,3).map(f=>`${f.name}${f.dosage}克`).join("、"))+c(o.herbs.length>3?"...":""),1)):(r(),l("span",Y,"—"))]),_:1}),i(a,{prop:"doctor_name",label:"医师",width:"90","show-overflow-tooltip":""}),i(a,{label:"状态",width:"140",align:"center"},{default:s(({row:o})=>[o.void_status===1?(r(),l(O,{key:0},[i(b,{type:"danger",size:"small"},{default:s(()=>[...t[1]||(t[1]=[m("已作废",-1)])]),_:1}),v("div",q,c(o.void_by_name||"—")+" "+c(S(o.void_time)),1)],64)):(r(),g(b,{key:1,type:"success",size:"small"},{default:s(()=>[...t[2]||(t[2]=[m("正常",-1)])]),_:1}))]),_:1}),i(a,{label:"操作",width:"120",fixed:"right"},{default:s(({row:o})=>[i(h,{link:"",type:"primary",size:"small",onClick:f=>$(o)},{default:s(()=>[...t[3]||(t[3]=[m(" 查看 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[I,d(p)]]),!d(p)&&d(n).length===0?(r(),g(B,{key:0,description:"暂无病历记录,开方后会自动显示",class:"mt-4"})):R("",!0)])}}}),zt=G(K,[["__scopeId","data-v-de802464"]]);export{zt as default};
|
||||
import{i as L,L as T,N as V,U as D,M as z,T as M}from"./element-plus-D9NzL5HE.js";import{y as P}from"./tcm-9dTydv5E.js";import{f as F,b as j,w as A,ak as r,I as l,J as v,a as i,aN as s,O as m,aP as H,G as g,F as O,H as R}from"./@vue/runtime-core-C0pg79pw.js";import{y as d,o as w}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as c}from"./@vue/shared-mAAVTE9n.js";import{a as G}from"./index-D54sWaXv.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const J={class:"case-record-list"},Q={class:"mb-3 flex justify-end"},U={key:0},Y={key:1,class:"text-gray-400"},q={class:"void-detail text-xs text-gray-500 mt-1"},K=F({__name:"CaseRecordList",props:{diagnosisId:{type:Number,default:0}},emits:["view","openPrescription"],setup(k,{expose:x,emit:C}){const _=k,y=C,n=w([]),p=w(!1),u=async()=>{if(_.diagnosisId){p.value=!0;try{const e=await P({diagnosis_id:_.diagnosisId});n.value=Array.isArray(e)?e:[]}catch(e){console.error("获取病历记录失败:",e),n.value=[]}finally{p.value=!1}}},S=e=>{if(!e)return"";const t=new Date(e*1e3);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`},$=e=>{y("view",e)},E=()=>{y("openPrescription")};return j(()=>{u()}),A(()=>_.diagnosisId,()=>{u()}),x({refresh:u}),(e,t)=>{const h=L,a=V,b=D,N=z,B=M,I=T;return r(),l("div",J,[v("div",Q,[i(h,{type:"primary",size:"small",onClick:E},{default:s(()=>[...t[0]||(t[0]=[m("开方",-1)])]),_:1})]),H((r(),g(N,{data:d(n),border:""},{default:s(()=>[i(a,{prop:"prescription_date",label:"就诊日期",width:"120"}),i(a,{prop:"visit_no",label:"门诊号",width:"120"}),i(a,{prop:"clinical_diagnosis",label:"临床诊断","min-width":"160","show-overflow-tooltip":""}),i(a,{label:"处方摘要","min-width":"180"},{default:s(({row:o})=>[o.herbs&&o.herbs.length?(r(),l("span",U,c(o.herbs.slice(0,3).map(f=>`${f.name}${f.dosage}克`).join("、"))+c(o.herbs.length>3?"...":""),1)):(r(),l("span",Y,"—"))]),_:1}),i(a,{prop:"doctor_name",label:"医师",width:"90","show-overflow-tooltip":""}),i(a,{label:"状态",width:"140",align:"center"},{default:s(({row:o})=>[o.void_status===1?(r(),l(O,{key:0},[i(b,{type:"danger",size:"small"},{default:s(()=>[...t[1]||(t[1]=[m("已作废",-1)])]),_:1}),v("div",q,c(o.void_by_name||"—")+" "+c(S(o.void_time)),1)],64)):(r(),g(b,{key:1,type:"success",size:"small"},{default:s(()=>[...t[2]||(t[2]=[m("正常",-1)])]),_:1}))]),_:1}),i(a,{label:"操作",width:"120",fixed:"right"},{default:s(({row:o})=>[i(h,{link:"",type:"primary",size:"small",onClick:f=>$(o)},{default:s(()=>[...t[3]||(t[3]=[m(" 查看 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[I,d(p)]]),!d(p)&&d(n).length===0?(r(),g(B,{key:0,description:"暂无病历记录,开方后会自动显示",class:"mt-4"})):R("",!0)])}}}),zt=G(K,[["__scopeId","data-v-de802464"]]);export{zt as default};
|
||||
@@ -0,0 +1 @@
|
||||
.im-chat-record-panel[data-v-ec88f862]{min-height:200px}.panel-tip[data-v-ec88f862]{margin:0;line-height:1.55;font-size:13px}.panel-tip code[data-v-ec88f862]{font-size:12px}.toolbar[data-v-ec88f862]{display:flex;align-items:center}.chat-wrap[data-v-ec88f862]{min-height:120px}.chat-list[data-v-ec88f862]{display:flex;flex-direction:column;gap:16px;max-height:min(60vh,520px);overflow-y:auto;padding:4px 8px 12px}.chat-row[data-v-ec88f862]{display:flex;flex-direction:column;max-width:88%}.chat-row.from-patient[data-v-ec88f862]{align-self:flex-start}.chat-row.from-patient .bubble[data-v-ec88f862]{background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter)}.chat-row.from-doctor[data-v-ec88f862]{align-self:flex-end;align-items:flex-end}.chat-row.from-doctor .meta[data-v-ec88f862]{flex-direction:row-reverse}.chat-row.from-doctor .bubble[data-v-ec88f862]{background:var(--el-color-primary-light-9);border:1px solid var(--el-color-primary-light-7)}.meta[data-v-ec88f862]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--el-text-color-secondary);margin-bottom:6px}.meta .name[data-v-ec88f862]{font-weight:500;color:var(--el-text-color-regular)}.bubble[data-v-ec88f862]{border-radius:8px;padding:10px 12px;word-break:break-word;font-size:14px;line-height:1.5}.text-content[data-v-ec88f862]{white-space:pre-wrap}.chat-img[data-v-ec88f862]{max-width:240px;max-height:200px;border-radius:4px}.muted[data-v-ec88f862]{color:var(--el-text-color-placeholder)}.friendly-text .friendly-main[data-v-ec88f862]{font-size:14px;line-height:1.5;color:var(--el-text-color-primary)}.friendly-text .friendly-sub[data-v-ec88f862]{margin-top:6px;font-size:12px;line-height:1.4;color:var(--el-text-color-secondary)}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.im-chat-record-panel[data-v-faf4cfac]{min-height:200px}.panel-tip[data-v-faf4cfac]{margin:0;line-height:1.55;font-size:13px}.panel-tip code[data-v-faf4cfac]{font-size:12px}.toolbar[data-v-faf4cfac]{display:flex;align-items:center}.chat-wrap[data-v-faf4cfac]{min-height:120px}.chat-list[data-v-faf4cfac]{display:flex;flex-direction:column;gap:16px;max-height:min(60vh,520px);overflow-y:auto;padding:4px 8px 12px}.chat-row[data-v-faf4cfac]{display:flex;flex-direction:column;max-width:88%}.chat-row.from-patient[data-v-faf4cfac]{align-self:flex-start}.chat-row.from-patient .bubble[data-v-faf4cfac]{background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter)}.chat-row.from-doctor[data-v-faf4cfac]{align-self:flex-end;align-items:flex-end}.chat-row.from-doctor .meta[data-v-faf4cfac]{flex-direction:row-reverse}.chat-row.from-doctor .bubble[data-v-faf4cfac]{background:var(--el-color-primary-light-9);border:1px solid var(--el-color-primary-light-7)}.meta[data-v-faf4cfac]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--el-text-color-secondary);margin-bottom:6px}.meta .name[data-v-faf4cfac]{font-weight:500;color:var(--el-text-color-regular)}.bubble[data-v-faf4cfac]{border-radius:8px;padding:10px 12px;word-break:break-word;font-size:14px;line-height:1.5}.text-content[data-v-faf4cfac]{white-space:pre-wrap}.chat-img[data-v-faf4cfac]{max-width:240px;max-height:200px;border-radius:4px}.muted[data-v-faf4cfac]{color:var(--el-text-color-placeholder)}.friendly-text .friendly-main[data-v-faf4cfac]{font-size:14px;line-height:1.5;color:var(--el-text-color-primary)}.friendly-text .friendly-sub[data-v-faf4cfac]{margin-top:6px;font-size:12px;line-height:1.4;color:var(--el-text-color-secondary)}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-CEYJC7sj.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-Dn-pwuas.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";export{o as default};
|
||||
import{_ as o}from"./account-adjust.vue_vue_type_script_setup_true_lang-Bk6Hmcnz.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-epy6JK8p.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";export{o as default};
|
||||
+1
@@ -0,0 +1 @@
|
||||
import{D as h,B,G as q,I,C as D}from"./element-plus-D9NzL5HE.js";import{P as F}from"./index-epy6JK8p.js";import{h as b}from"./index-D54sWaXv.js";import{f as G,w,ak as j,G as P,aN as r,J as S,a,O as u,A as U}from"./@vue/runtime-core-C0pg79pw.js";import{y as n,u as y,r as A}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as k}from"./@vue/shared-mAAVTE9n.js";const J={class:"pr-8"},K=G({__name:"account-adjust",props:{show:{type:Boolean,required:!0},value:{type:[Number,String],required:!0}},emits:["update:show","confirm"],setup(d,{emit:V}){const s=y(),i=d,f=V,o=A({action:1,num:"",remark:""}),m=y(),c=U(()=>Number(i.value)+Number(o.num)*(o.action==1?1:-1)),R={num:[{required:!0,message:"请输入调整的金额"}]},x=e=>{if(e.includes("-"))return b.msgError("请输入正整数");o.num=e},C=async()=>{var e;await((e=s.value)==null?void 0:e.validate()),f("confirm",o)},E=()=>{var e;f("update:show",!1),(e=s.value)==null||e.resetFields()};return w(()=>i.show,e=>{var t,l;e?(t=m.value)==null||t.open():(l=m.value)==null||l.close()}),w(c,e=>{e<0&&(b.msgError("调整后余额需大于0"),o.num="")}),(e,t)=>{const l=B,_=I,N=q,v=D,g=h;return j(),P(F,{ref_key:"popupRef",ref:m,title:"余额调整",width:"500px",onConfirm:C,async:!0,onClose:E},{default:r(()=>[S("div",J,[a(g,{ref_key:"formRef",ref:s,model:n(o),"label-width":"120px",rules:R},{default:r(()=>[a(l,{label:"当前余额"},{default:r(()=>[u("¥ "+k(d.value),1)]),_:1}),a(l,{label:"余额增减",required:"",prop:"action"},{default:r(()=>[a(N,{modelValue:n(o).action,"onUpdate:modelValue":t[0]||(t[0]=p=>n(o).action=p)},{default:r(()=>[a(_,{value:1},{default:r(()=>[...t[2]||(t[2]=[u("增加余额",-1)])]),_:1}),a(_,{value:2},{default:r(()=>[...t[3]||(t[3]=[u("扣减余额",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(l,{label:"调整余额",prop:"num"},{default:r(()=>[a(v,{"model-value":n(o).num,placeholder:"请输入调整的金额",type:"number",onInput:x},null,8,["model-value"])]),_:1}),a(l,{label:"调整后余额"},{default:r(()=>[u(" ¥ "+k(n(c)),1)]),_:1}),a(l,{label:"备注",prop:"remark"},{default:r(()=>[a(v,{modelValue:n(o).remark,"onUpdate:modelValue":t[1]||(t[1]=p=>n(o).remark=p),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},512)}}});export{K as _};
|
||||
-1
@@ -1 +0,0 @@
|
||||
import{G as h,D as q,C as B,I as F,F as I}from"./element-plus-CFxTwCZ2.js";import{P as D}from"./index-Dn-pwuas.js";import{f as b}from"./index-DqzX0p3J.js";import{f as G,w,ak as j,G as P,aN as r,J as S,a,O as u,A as U}from"./@vue/runtime-core-C0pg79pw.js";import{y as n,u as y,r as A}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as k}from"./@vue/shared-mAAVTE9n.js";const J={class:"pr-8"},K=G({__name:"account-adjust",props:{show:{type:Boolean,required:!0},value:{type:[Number,String],required:!0}},emits:["update:show","confirm"],setup(d,{emit:V}){const s=y(),i=d,f=V,o=A({action:1,num:"",remark:""}),m=y(),c=U(()=>Number(i.value)+Number(o.num)*(o.action==1?1:-1)),R={num:[{required:!0,message:"请输入调整的金额"}]},x=e=>{if(e.includes("-"))return b.msgError("请输入正整数");o.num=e},C=async()=>{var e;await((e=s.value)==null?void 0:e.validate()),f("confirm",o)},E=()=>{var e;f("update:show",!1),(e=s.value)==null||e.resetFields()};return w(()=>i.show,e=>{var t,l;e?(t=m.value)==null||t.open():(l=m.value)==null||l.close()}),w(c,e=>{e<0&&(b.msgError("调整后余额需大于0"),o.num="")}),(e,t)=>{const l=q,_=F,N=B,v=I,g=h;return j(),P(D,{ref_key:"popupRef",ref:m,title:"余额调整",width:"500px",onConfirm:C,async:!0,onClose:E},{default:r(()=>[S("div",J,[a(g,{ref_key:"formRef",ref:s,model:n(o),"label-width":"120px",rules:R},{default:r(()=>[a(l,{label:"当前余额"},{default:r(()=>[u("¥ "+k(d.value),1)]),_:1}),a(l,{label:"余额增减",required:"",prop:"action"},{default:r(()=>[a(N,{modelValue:n(o).action,"onUpdate:modelValue":t[0]||(t[0]=p=>n(o).action=p)},{default:r(()=>[a(_,{value:1},{default:r(()=>[...t[2]||(t[2]=[u("增加余额",-1)])]),_:1}),a(_,{value:2},{default:r(()=>[...t[3]||(t[3]=[u("扣减余额",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(l,{label:"调整余额",prop:"num"},{default:r(()=>[a(v,{"model-value":n(o).num,placeholder:"请输入调整的金额",type:"number",onInput:x},null,8,["model-value"])]),_:1}),a(l,{label:"调整后余额"},{default:r(()=>[u(" ¥ "+k(n(c)),1)]),_:1}),a(l,{label:"备注",prop:"remark"},{default:r(()=>[a(v,{modelValue:n(o).remark,"onUpdate:modelValue":t[1]||(t[1]=p=>n(o).remark=p),type:"textarea",rows:4},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])])]),_:1},512)}}});export{K as _};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{F as E,D as N,g as B,i as C}from"./element-plus-CFxTwCZ2.js";import{_ as $}from"./index-DrGLRjBU.js";import{_ as D}from"./picker-CRq51wFl.js";import{_ as z}from"./picker-DsltUfs3.js";import{b as A,f as r}from"./index-DqzX0p3J.js";import{D as I}from"./vuedraggable-C3E4D3Yv.js";import{f as F,ak as p,I as R,J as l,a,aN as d,G,O as J,A as L}from"./@vue/runtime-core-C0pg79pw.js";import{y as c,a as O}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"bg-fill-light flex items-center w-full p-4 mb-4"},S={class:"upload-btn w-[60px] h-[60px]"},T={class:"ml-3 flex-1"},j={class:"flex items-center"},q={class:"flex items-center mt-[18px]"},H={class:"flex-1 flex items-center"},K={class:"drag-move cursor-move ml-auto"},oe=F({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(_,{emit:f}){const t=_,V=f,m=L({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):r.msgError(`最多添加${t.max}个`)},g=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return r.msgError(`最少保留${t.min}个`);m.value.splice(s,1)};return(s,e)=>{const i=A,v=z,h=E,k=D,b=B,w=N,y=$,U=C;return p(),R("div",null,[l("div",null,[a(c(I),{class:"draggable",modelValue:c(m),"onUpdate:modelValue":e[0]||(e[0]=o=>O(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:u})=>[(p(),G(y,{class:"w-[467px]",key:u,onClose:n=>g(u)},{default:d(()=>[l("div",P,[a(v,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",S,[a(i,{name:"el-icon-Plus",size:20})])]),_:1},8,["modelValue","onUpdate:modelValue"]),l("div",T,[l("div",j,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(h,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",q,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(k,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",H,[a(b,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",K,[a(i,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(U,{type:"primary",onClick:x},{default:d(()=>[...e[3]||(e[3]=[J("添加",-1)])]),_:1})])])}}});export{oe as _};
|
||||
@@ -0,0 +1 @@
|
||||
import{C as E,B,g as C,i as N}from"./element-plus-D9NzL5HE.js";import{_ as $}from"./index-wQPX7dBB.js";import{_ as z}from"./picker-bP9cmZy8.js";import{_ as A}from"./picker-DnoOFo57.js";import{_ as D,h as r}from"./index-D54sWaXv.js";import{D as I}from"./vuedraggable-C3E4D3Yv.js";import{f as R,ak as p,I as F,J as l,a,aN as d,G,O as J,A as L}from"./@vue/runtime-core-C0pg79pw.js";import{y as _,a as O}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"bg-fill-light flex items-center w-full p-4 mb-4"},S={class:"upload-btn w-[60px] h-[60px]"},T={class:"ml-3 flex-1"},j={class:"flex items-center"},q={class:"flex items-center mt-[18px]"},H={class:"flex-1 flex items-center"},K={class:"drag-move cursor-move ml-auto"},oe=R({__name:"add-nav",props:{modelValue:{type:Array,default:()=>[]},max:{type:Number,default:100},min:{type:Number,default:1}},emits:["update:modelValue"],setup(c,{emit:f}){const t=c,V=f,m=L({get(){return t.modelValue},set(s){V("update:modelValue",s)}}),x=()=>{var s;((s=t.modelValue)==null?void 0:s.length)<t.max?m.value.push({image:"",name:"导航名称",link:{},is_show:"1"}):r.msgError(`最多添加${t.max}个`)},g=s=>{var e;if(((e=t.modelValue)==null?void 0:e.length)<=t.min)return r.msgError(`最少保留${t.min}个`);m.value.splice(s,1)};return(s,e)=>{const i=D,v=A,h=E,k=z,b=C,w=B,y=$,U=N;return p(),F("div",null,[l("div",null,[a(_(I),{class:"draggable",modelValue:_(m),"onUpdate:modelValue":e[0]||(e[0]=o=>O(m)?m.value=o:null),animation:"300",handle:".drag-move","item-key":"index"},{item:d(({element:o,index:u})=>[(p(),G(y,{class:"w-[467px]",key:u,onClose:n=>g(u)},{default:d(()=>[l("div",P,[a(v,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body",size:"60px","exclude-domain":""},{upload:d(()=>[l("div",S,[a(i,{name:"el-icon-Plus",size:20})])]),_:1},8,["modelValue","onUpdate:modelValue"]),l("div",T,[l("div",j,[e[1]||(e[1]=l("span",{class:"text-tx-regular flex-none mr-3"},"名称",-1)),a(h,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),l("div",q,[e[2]||(e[2]=l("span",{class:"text-tx-regular flex-none mr-3"},"链接",-1)),a(k,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),a(w,{label:"是否显示",class:"mt-[18px]"},{default:d(()=>[l("div",H,[a(b,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),l("div",K,[a(i,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),l("div",null,[a(U,{type:"primary",onClick:x},{default:d(()=>[...e[3]||(e[3]=[J("添加",-1)])]),_:1})])])}}});export{oe as _};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{r as n}from"./index-DqzX0p3J.js";function e(t){return n.get({url:"/auth.admin/lists",params:t},{ignoreCancelToken:!0})}function i(t){return n.post({url:"/auth.admin/add",params:t})}function r(t){return n.post({url:"/auth.admin/edit",params:t})}function u(t){return n.post({url:"/auth.admin/delete",params:t})}function d(t){return n.get({url:"/auth.admin/detail",params:t})}export{e as a,r as b,u as c,i as d,d as e};
|
||||
import{r as n}from"./index-D54sWaXv.js";function e(t){return n.get({url:"/auth.admin/lists",params:t},{ignoreCancelToken:!0})}function i(t){return n.post({url:"/auth.admin/add",params:t})}function r(t){return n.post({url:"/auth.admin/edit",params:t})}function u(t){return n.post({url:"/auth.admin/delete",params:t})}function d(t){return n.get({url:"/auth.admin/detail",params:t})}export{e as a,r as b,u as c,i as d,d as e};
|
||||
@@ -1 +0,0 @@
|
||||
.appointment-form[data-v-f3384773] .el-form-item__label{font-weight:500}.doctor-list[data-v-f3384773]{display:flex;flex-wrap:wrap;gap:12px}.doctor-list .doctor-radio[data-v-f3384773]{margin-right:0}.doctor-list .doctor-radio[data-v-f3384773] .el-radio__label{display:flex;align-items:center}.appointment-time-container[data-v-f3384773]{width:100%}.date-selector[data-v-f3384773]{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:20px}.date-selector .date-button[data-v-f3384773]{min-width:130px;height:40px;font-size:14px;border-radius:8px;transition:all .2s}.date-selector .date-button[data-v-f3384773]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.time-slots-container[data-v-f3384773]{background-color:#f8f9fa;border-radius:8px;padding:16px}.time-slots-header[data-v-f3384773]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.time-slots-header .header-title[data-v-f3384773]{font-size:15px;font-weight:600;color:#303133}.time-slots-grid[data-v-f3384773]{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px;max-height:450px;overflow-y:auto;padding:2px}.time-slots-grid[data-v-f3384773]::-webkit-scrollbar{width:6px}.time-slots-grid[data-v-f3384773]::-webkit-scrollbar-thumb{background-color:#dcdfe6;border-radius:3px}.time-slots-grid[data-v-f3384773]::-webkit-scrollbar-thumb:hover{background-color:#c0c4cc}.time-slots-grid .time-slot-item[data-v-f3384773]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0 8px;border:2px solid #e4e7ed;border-radius:8px;cursor:pointer;transition:all .2s;background-color:#fff;min-height:70px}.time-slots-grid .time-slot-item .slot-time[data-v-f3384773]{font-size:15px;font-weight:600;color:#303133;margin-bottom:6px}.time-slots-grid .time-slot-item .slot-status[data-v-f3384773]{font-size:12px;color:#909399;padding:0 8px;border-radius:4px;background-color:#f4f4f5}.time-slots-grid .time-slot-item .slot-status.status-available[data-v-f3384773]{color:#67c23a;background-color:#f0f9ff}.time-slots-grid .time-slot-item.available[data-v-f3384773]{border-color:#e4e7ed}.time-slots-grid .time-slot-item.available[data-v-f3384773]:hover{border-color:#409eff;background-color:#ecf5ff;transform:translateY(-2px);box-shadow:0 4px 12px #409eff26}.time-slots-grid .time-slot-item.unavailable[data-v-f3384773]{background-color:#f5f7fa;border-color:#e4e7ed;cursor:not-allowed;opacity:.6}.time-slots-grid .time-slot-item.unavailable .slot-time[data-v-f3384773]{color:#c0c4cc}.time-slots-grid .time-slot-item.unavailable .slot-status[data-v-f3384773]{color:#c0c4cc;background-color:#f5f7fa}.time-slots-grid .time-slot-item.unavailable[data-v-f3384773]:hover{transform:none;box-shadow:none}.time-slots-grid .time-slot-item.selected[data-v-f3384773]{border-color:#409eff;background:linear-gradient(135deg,#409eff,#66b1ff);box-shadow:0 4px 12px #409eff4d}.time-slots-grid .time-slot-item.selected .slot-time[data-v-f3384773]{color:#fff}.time-slots-grid .time-slot-item.selected .slot-status[data-v-f3384773]{color:#fff;background-color:#fff3}[data-v-f3384773] .el-radio-group{display:flex;flex-wrap:wrap;gap:12px}[data-v-f3384773] .el-radio{margin-right:0}.drawer-footer[data-v-f3384773]{display:flex;justify-content:flex-end;gap:12px;padding:12px 0}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.appointment-form[data-v-d7887556] .el-form-item__label{font-weight:500}.appointment-form .channel-source-select[data-v-d7887556]{width:100%;max-width:360px}.doctor-list[data-v-d7887556]{display:flex;flex-wrap:wrap;gap:12px}.doctor-list .doctor-radio[data-v-d7887556]{margin-right:0}.doctor-list .doctor-radio[data-v-d7887556] .el-radio__label{display:flex;align-items:center}.appointment-time-container[data-v-d7887556]{width:100%}.date-selector[data-v-d7887556]{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:20px}.date-selector .date-button[data-v-d7887556]{min-width:130px;height:40px;font-size:14px;border-radius:8px;transition:all .2s}.date-selector .date-button[data-v-d7887556]:hover{transform:translateY(-2px);box-shadow:0 2px 8px #0000001a}.time-slots-container[data-v-d7887556]{background-color:#f8f9fa;border-radius:8px;padding:16px}.time-slots-header[data-v-d7887556]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.time-slots-header .header-title[data-v-d7887556]{font-size:15px;font-weight:600;color:#303133}.time-slots-grid[data-v-d7887556]{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px;max-height:450px;overflow-y:auto;padding:2px}.time-slots-grid[data-v-d7887556]::-webkit-scrollbar{width:6px}.time-slots-grid[data-v-d7887556]::-webkit-scrollbar-thumb{background-color:#dcdfe6;border-radius:3px}.time-slots-grid[data-v-d7887556]::-webkit-scrollbar-thumb:hover{background-color:#c0c4cc}.time-slots-grid .time-slot-item[data-v-d7887556]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0 8px;border:2px solid #e4e7ed;border-radius:8px;cursor:pointer;transition:all .2s;background-color:#fff;min-height:70px}.time-slots-grid .time-slot-item .slot-time[data-v-d7887556]{font-size:15px;font-weight:600;color:#303133;margin-bottom:6px}.time-slots-grid .time-slot-item .slot-status[data-v-d7887556]{font-size:12px;color:#909399;padding:0 8px;border-radius:4px;background-color:#f4f4f5}.time-slots-grid .time-slot-item .slot-status.status-available[data-v-d7887556]{color:#67c23a;background-color:#f0f9ff}.time-slots-grid .time-slot-item.available[data-v-d7887556]{border-color:#e4e7ed}.time-slots-grid .time-slot-item.available[data-v-d7887556]:hover{border-color:#409eff;background-color:#ecf5ff;transform:translateY(-2px);box-shadow:0 4px 12px #409eff26}.time-slots-grid .time-slot-item.unavailable[data-v-d7887556]{background-color:#f5f7fa;border-color:#e4e7ed;cursor:not-allowed;opacity:.6}.time-slots-grid .time-slot-item.unavailable .slot-time[data-v-d7887556]{color:#c0c4cc}.time-slots-grid .time-slot-item.unavailable .slot-status[data-v-d7887556]{color:#c0c4cc;background-color:#f5f7fa}.time-slots-grid .time-slot-item.unavailable[data-v-d7887556]:hover{transform:none;box-shadow:none}.time-slots-grid .time-slot-item.selected[data-v-d7887556]{border-color:#409eff;background:linear-gradient(135deg,#409eff,#66b1ff);box-shadow:0 4px 12px #409eff4d}.time-slots-grid .time-slot-item.selected .slot-time[data-v-d7887556]{color:#fff}.time-slots-grid .time-slot-item.selected .slot-status[data-v-d7887556]{color:#fff;background-color:#fff3}[data-v-d7887556] .el-radio-group{display:flex;flex-wrap:wrap;gap:12px}[data-v-d7887556] .el-radio{margin-right:0}.drawer-footer[data-v-d7887556]{display:flex;justify-content:flex-end;gap:12px;padding:12px 0}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as e}from"./index-DqzX0p3J.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function l(t){return e.get({url:"/article.articleCate/all",params:t})}function i(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function u(t){return e.post({url:"/article.articleCate/delete",params:t})}function n(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function C(t){return e.post({url:"/article.article/delete",params:t})}function p(t){return e.get({url:"/article.article/detail",params:t})}function g(t){return e.post({url:"/article.article/updateStatus",params:t})}export{a,u as b,s as c,c as d,i as e,n as f,p as g,f as h,d as i,l as j,o as k,g as l,C as m};
|
||||
import{r as e}from"./index-D54sWaXv.js";function a(t){return e.get({url:"/article.articleCate/lists",params:t})}function l(t){return e.get({url:"/article.articleCate/all",params:t})}function i(t){return e.post({url:"/article.articleCate/add",params:t})}function c(t){return e.post({url:"/article.articleCate/edit",params:t})}function u(t){return e.post({url:"/article.articleCate/delete",params:t})}function n(t){return e.get({url:"/article.articleCate/detail",params:t})}function s(t){return e.post({url:"/article.articleCate/updateStatus",params:t})}function o(t){return e.get({url:"/article.article/lists",params:t})}function d(t){return e.post({url:"/article.article/add",params:t})}function f(t){return e.post({url:"/article.article/edit",params:t})}function C(t){return e.post({url:"/article.article/delete",params:t})}function p(t){return e.get({url:"/article.article/detail",params:t})}function g(t){return e.post({url:"/article.article/updateStatus",params:t})}export{a,u as b,s as c,c as d,i as e,n as f,p as g,f as h,d as i,l as j,o as k,g as l,C as m};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-kbILor2S.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-Dncc5li2.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BmgVIO_U.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index.vue_vue_type_script_setup_true_lang-CLI6gjnV.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./picker-DsltUfs3.js";import"./index-Dn-pwuas.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./index-CHkSemYM.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./index-DrGLRjBU.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./usePaging-D4wPHtKU.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-DegvffGY.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index.vue_vue_type_script_setup_true_lang-_izKWNxN.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./picker-DnoOFo57.js";import"./index-epy6JK8p.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./index-l9o66tt_.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./index-wQPX7dBB.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./usePaging-B_C_SZ2Z.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BBcR96ra.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./picker-DsltUfs3.js";import"./index-Dn-pwuas.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./index-CHkSemYM.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./index-DrGLRjBU.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./usePaging-D4wPHtKU.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CK9aFMyu.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./picker-DnoOFo57.js";import"./index-epy6JK8p.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./index-l9o66tt_.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./index-wQPX7dBB.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./usePaging-B_C_SZ2Z.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{m as b,l as c,D as V}from"./element-plus-D9NzL5HE.js";import{_ as l}from"./menu-set.vue_vue_type_script_setup_true_lang-BvgIclzg.js";import{f as v,ak as x,I as k,J as E,a as o,aN as e,F as g,A as w}from"./@vue/runtime-core-C0pg79pw.js";import{y as r}from"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";const yt=v({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(n,{emit:s}){const u=n,d=s,m=w({get(){return u.modelValue},set(i){d("update:modelValue",i)}});return(i,t)=>{const a=c,f=b,_=V;return x(),k(g,null,[t[2]||(t[2]=E("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),o(_,{class:"mt-4","label-width":"70px"},{default:e(()=>[o(f,{"model-value":"nav"},{default:e(()=>[o(a,{label:"主导航设置",name:"nav"},{default:e(()=>[o(l,{modelValue:r(m).nav,"onUpdate:modelValue":t[0]||(t[0]=p=>r(m).nav=p)},null,8,["modelValue"])]),_:1}),o(a,{label:"菜单设置",name:"menu"},{default:e(()=>[o(l,{modelValue:r(m).menu,"onUpdate:modelValue":t[1]||(t[1]=p=>r(m).menu=p)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{yt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-B65ElJLp.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-B6TZIs14.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-6VcclKj4.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-oQY2_nYa.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-D5FrVPqi.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";import"./index.vue_vue_type_script_setup_true_lang-CLI6gjnV.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CnLPtdIt.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";import"./index.vue_vue_type_script_setup_true_lang-_izKWNxN.js";export{o as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{m as b,l as c,G as V}from"./element-plus-CFxTwCZ2.js";import{_ as l}from"./menu-set.vue_vue_type_script_setup_true_lang-CseEbiwA.js";import{f as v,ak as x,I as k,J as E,a as o,aN as e,F as g,A as w}from"./@vue/runtime-core-C0pg79pw.js";import{y as r}from"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";const wt=v({__name:"attr",props:{modelValue:{type:Object,default:()=>({nav:[],menu:{}})}},emits:["update:modelValue"],setup(n,{emit:s}){const u=n,d=s,m=w({get(){return u.modelValue},set(i){d("update:modelValue",i)}});return(i,t)=>{const a=c,f=b,_=V;return x(),k(g,null,[t[2]||(t[2]=E("div",{class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2"}," pc导航设置 ",-1)),o(_,{class:"mt-4","label-width":"70px"},{default:e(()=>[o(f,{"model-value":"nav"},{default:e(()=>[o(a,{label:"主导航设置",name:"nav"},{default:e(()=>[o(l,{modelValue:r(m).nav,"onUpdate:modelValue":t[0]||(t[0]=p=>r(m).nav=p)},null,8,["modelValue"])]),_:1}),o(a,{label:"菜单设置",name:"menu"},{default:e(()=>[o(l,{modelValue:r(m).menu,"onUpdate:modelValue":t[1]||(t[1]=p=>r(m).menu=p)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})],64)}}});export{wt as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-CDeV5Kv-.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
import{_ as o}from"./attr.vue_vue_type_script_setup_true_lang-BAENXUoY.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";export{o as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-CzvRKzRU.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-Db2wMrt6.js";import"./attr-B6ltesoJ.js";import"./index-DrGLRjBU.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-CRq51wFl.js";import"./index-Dn-pwuas.js";import"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import"./article-vryEkV6M.js";import"./usePaging-D4wPHtKU.js";import"./picker-DsltUfs3.js";import"./index-CHkSemYM.js";import"./index-H3KMCy3k.js";import"./index.vue_vue_type_script_setup_true_lang-DNaQ2ceB.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";import"./content.vue_vue_type_script_setup_true_lang-JeARWYtM.js";import"./decoration-img-C41bf9aB.js";import"./attr.vue_vue_type_script_setup_true_lang-BBcR96ra.js";import"./content-DrVOQKZj.js";import"./attr.vue_vue_type_script_setup_true_lang-B65ElJLp.js";import"./content.vue_vue_type_script_setup_true_lang-BuX2iHFx.js";import"./attr.vue_vue_type_script_setup_true_lang-6VcclKj4.js";import"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import"./content-EuYu424r.js";import"./attr.vue_vue_type_script_setup_true_lang-kbILor2S.js";import"./content.vue_vue_type_script_setup_true_lang-DSNLHq2P.js";import"./attr.vue_vue_type_script_setup_true_lang-CfPY9LZg.js";import"./content-DUUdPezv.js";import"./decoration-ws_OmM--.js";import"./attr.vue_vue_type_script_setup_true_lang-BmgVIO_U.js";import"./index.vue_vue_type_script_setup_true_lang-CLI6gjnV.js";import"./content-C3lZfMOY.js";import"./content.vue_vue_type_script_setup_true_lang-CIJ9tzAH.js";import"./attr.vue_vue_type_script_setup_true_lang-eatfXr14.js";import"./content-C4G2qJjR.js";import"./attr.vue_vue_type_script_setup_true_lang-CDeV5Kv-.js";import"./content.vue_vue_type_script_setup_true_lang-Bmu6j2zI.js";import"./attr.vue_vue_type_script_setup_true_lang-11IwTsyi.js";import"./content-BMLp0Y83.js";export{o as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as o}from"./attr-setting.vue_vue_type_script_setup_true_lang-Bmr7Rk4a.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./index-XhJ9lk_U.js";import"./attr-xbDjx_Vq.js";import"./index-wQPX7dBB.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./picker-bP9cmZy8.js";import"./index-epy6JK8p.js";import"./index.vue_vue_type_script_setup_true_lang-DNZxpZG_.js";import"./article-DY_XmIG_.js";import"./usePaging-B_C_SZ2Z.js";import"./picker-DnoOFo57.js";import"./index-l9o66tt_.js";import"./index-CppXRPrX.js";import"./index.vue_vue_type_script_setup_true_lang-DUX2T7zX.js";import"./file-BtSeeESa.js";import"./vuedraggable-C3E4D3Yv.js";import"./vue-tI-HfQaQ.js";import"./@vue/compiler-dom-CqayqxS7.js";import"./@vue/compiler-core-CvbQOXIO.js";import"./sortablejs-dsEAUXlE.js";import"./content.vue_vue_type_script_setup_true_lang-C8UnjQbm.js";import"./decoration-img-YoVl0vAG.js";import"./attr.vue_vue_type_script_setup_true_lang-CK9aFMyu.js";import"./content-xNuMUsY_.js";import"./attr.vue_vue_type_script_setup_true_lang-B6TZIs14.js";import"./content.vue_vue_type_script_setup_true_lang-CtD0Jigs.js";import"./attr.vue_vue_type_script_setup_true_lang-Dncc5li2.js";import"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import"./content-m_vOy1uc.js";import"./attr.vue_vue_type_script_setup_true_lang-oQY2_nYa.js";import"./content.vue_vue_type_script_setup_true_lang-Bi66yjjs.js";import"./attr.vue_vue_type_script_setup_true_lang-CfPY9LZg.js";import"./content-j89rjdA5.js";import"./decoration-DUxk9vfB.js";import"./attr.vue_vue_type_script_setup_true_lang-DegvffGY.js";import"./index.vue_vue_type_script_setup_true_lang-_izKWNxN.js";import"./content-DUqu7HTs.js";import"./content.vue_vue_type_script_setup_true_lang-CO4uVuMf.js";import"./attr.vue_vue_type_script_setup_true_lang-eatfXr14.js";import"./content-CdPmnECn.js";import"./attr.vue_vue_type_script_setup_true_lang-BAENXUoY.js";import"./content.vue_vue_type_script_setup_true_lang-BKjJdNTm.js";import"./attr.vue_vue_type_script_setup_true_lang-11IwTsyi.js";import"./content-CocqCGQP.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{J as y,s as g}from"./element-plus-CFxTwCZ2.js";import{e as b}from"./index-Db2wMrt6.js";import{f as x,ak as o,I as _,a as r,aN as c,J as h,G as i,K as w,at as k}from"./@vue/runtime-core-C0pg79pw.js";import{Q as v}from"./@vue/shared-mAAVTE9n.js";import{y as C}from"./@vue/reactivity-BIbyPIZJ.js";const B={class:"pages-setting"},E={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},V=x({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:m}){const d=m,p=a=>{d("update:content",a)};return(a,N)=>{const f=y,u=g;return o(),_("div",B,[r(f,{shadow:"never",class:"!border-none flex"},{default:c(()=>{var t;return[h("div",E,v((t=e.widget)==null?void 0:t.title),1)]}),_:1}),r(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:c(()=>{var t,n,s,l;return[(o(),i(w,null,[(o(),i(k((n=C(b)[(t=e.widget)==null?void 0:t.name])==null?void 0:n.attr),{content:(s=e.widget)==null?void 0:s.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{V as _};
|
||||
import{J as y,s as g}from"./element-plus-D9NzL5HE.js";import{e as b}from"./index-XhJ9lk_U.js";import{f as x,ak as o,I as _,a as r,aN as c,J as h,G as i,K as w,at as k}from"./@vue/runtime-core-C0pg79pw.js";import{Q as v}from"./@vue/shared-mAAVTE9n.js";import{y as C}from"./@vue/reactivity-BIbyPIZJ.js";const B={class:"pages-setting"},E={class:"title flex items-center before:w-[3px] before:h-[14px] before:block before:bg-primary before:mr-2 text-xl font-medium"},V=x({__name:"attr-setting",props:{widget:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(e,{emit:m}){const d=m,p=a=>{d("update:content",a)};return(a,N)=>{const f=y,u=g;return o(),_("div",B,[r(f,{shadow:"never",class:"!border-none flex"},{default:c(()=>{var t;return[h("div",E,v((t=e.widget)==null?void 0:t.title),1)]}),_:1}),r(u,{class:"w-full",style:{height:"calc(100% - 60px)"}},{default:c(()=>{var t,n,s,l;return[(o(),i(w,null,[(o(),i(k((n=C(b)[(t=e.widget)==null?void 0:t.name])==null?void 0:n.attr),{content:(s=e.widget)==null?void 0:s.content,styles:(l=e.widget)==null?void 0:l.styles,type:e.type,"onUpdate:content":p},null,40,["content","styles","type"]))],1024))]}),_:1})])}}});export{V as _};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{J as O,D as j,F as A,g as G,i as J,G as S}from"./element-plus-CFxTwCZ2.js";import{_ as z}from"./index-DrGLRjBU.js";import{b as H,f as k}from"./index-DqzX0p3J.js";import{_ as R}from"./picker-CRq51wFl.js";import{_ as T}from"./picker-DsltUfs3.js";import{D as q}from"./vuedraggable-C3E4D3Yv.js";import{l as v}from"./lodash-es-BADexyn7.js";import{f as K,ak as c,I as b,a as o,aN as s,J as n,G as u,H as r,O as L,A as M}from"./@vue/runtime-core-C0pg79pw.js";import{y as _}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"flex-1"},Q={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,me=K({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const p=y,d=m,g=M({get:()=>d.content,set:a=>{p("update:content",a)}}),w=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<f){const e=v(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),p("update:content",e)}else k.msgError(`最多添加${f}张图片`)},E=a=>{var i;if(((i=d.content.data)==null?void 0:i.length)<=1)return k.msgError("最少保留一张图片");const e=v(d.content);e.data.splice(a,1),p("update:content",e)};return(a,e)=>{const i=T,U=R,C=A,h=j,D=G,B=H,N=z,$=J,F=O,I=S;return c(),b("div",null,[o(I,{"label-width":"70px"},{default:s(()=>[o(F,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=n("div",{class:"flex items-end"},[n("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),n("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),n("div",P,[o(_(q),{class:"draggable",modelValue:_(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>_(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(c(),u(N,{key:V,onClose:l=>E(V),class:"w-full"},{default:s(()=>[n("div",Q,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":l=>t.image=l,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),n("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(c(),u(U,{key:0,modelValue:t.link,"onUpdate:modelValue":l=>t.link=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0),m.type=="pc"?(c(),u(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":l=>t.link.path=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[n("div",X,[o(D,{modelValue:t.is_show,"onUpdate:modelValue":l=>t.is_show=l,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),n("div",Y,[o(B,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(c(),b("div",Z,[o($,{class:"w-full",type:"primary",onClick:w},{default:s(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):r("",!0)]}),_:1})]),_:1})])}}});export{me as _};
|
||||
import{J as j,B as A,C as F,g as J,i as S,D as z}from"./element-plus-D9NzL5HE.js";import{_ as G}from"./index-wQPX7dBB.js";import{_ as H,h as k}from"./index-D54sWaXv.js";import{_ as R}from"./picker-bP9cmZy8.js";import{_ as T}from"./picker-DnoOFo57.js";import{D as q}from"./vuedraggable-C3E4D3Yv.js";import{l as v}from"./lodash-es-BADexyn7.js";import{f as K,ak as c,I as b,a as o,aN as s,J as n,G as u,H as r,O as L,A as M}from"./@vue/runtime-core-C0pg79pw.js";import{y as _}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"flex-1"},Q={class:"bg-fill-light w-full p-4 mt-4"},W={class:"flex-1"},X={class:"flex-1 flex items-center"},Y={class:"drag-move cursor-move ml-auto"},Z={key:0,class:"mt-4"},f=5,me=K({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})},type:{type:String,default:"mobile"}},emits:["update:content"],setup(m,{emit:y}){const p=y,d=m,g=M({get:()=>d.content,set:a=>{p("update:content",a)}}),w=()=>{var a;if(((a=d.content.data)==null?void 0:a.length)<f){const e=v(d.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),p("update:content",e)}else k.msgError(`最多添加${f}张图片`)},E=a=>{var i;if(((i=d.content.data)==null?void 0:i.length)<=1)return k.msgError("最少保留一张图片");const e=v(d.content);e.data.splice(a,1),p("update:content",e)};return(a,e)=>{const i=T,U=R,C=F,h=A,B=J,D=H,N=G,$=S,I=j,O=z;return c(),b("div",null,[o(O,{"label-width":"70px"},{default:s(()=>[o(I,{shadow:"never",class:"!border-none flex mt-2"},{default:s(()=>{var x;return[e[2]||(e[2]=n("div",{class:"flex items-end"},[n("div",{class:"text-base text-[#101010] font-medium"},"图片设置"),n("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),n("div",P,[o(_(q),{class:"draggable",modelValue:_(g).data,"onUpdate:modelValue":e[0]||(e[0]=t=>_(g).data=t),animation:"300",handle:".drag-move"},{item:s(({element:t,index:V})=>[(c(),u(N,{key:V,onClose:l=>E(V),class:"w-full"},{default:s(()=>[n("div",Q,[o(i,{width:"396px",height:"196px",modelValue:t.image,"onUpdate:modelValue":l=>t.image=l,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),n("div",W,[o(h,{class:"mt-[18px]",label:"图片链接"},{default:s(()=>[m.type=="mobile"?(c(),u(U,{key:0,modelValue:t.link,"onUpdate:modelValue":l=>t.link=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0),m.type=="pc"?(c(),u(C,{key:1,placeholder:"请输入链接",modelValue:t.link.path,"onUpdate:modelValue":l=>t.link.path=l},null,8,["modelValue","onUpdate:modelValue"])):r("",!0)]),_:2},1024),o(h,{label:"是否显示",class:"mt-[18px] !mb-0"},{default:s(()=>[n("div",X,[o(B,{modelValue:t.is_show,"onUpdate:modelValue":l=>t.is_show=l,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),n("div",Y,[o(D,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"])]),((x=m.content.data)==null?void 0:x.length)<f?(c(),b("div",Z,[o($,{class:"w-full",type:"primary",onClick:w},{default:s(()=>[...e[1]||(e[1]=[L("添加图片",-1)])]),_:1})])):r("",!0)]}),_:1})]),_:1})])}}});export{me as _};
|
||||
@@ -0,0 +1 @@
|
||||
import{J as I,B as O,C as j,g as A,i as F,D as J}from"./element-plus-D9NzL5HE.js";import{_ as z}from"./index-wQPX7dBB.js";import{_ as G,h as g}from"./index-D54sWaXv.js";import{_ as H}from"./picker-bP9cmZy8.js";import{_ as R}from"./picker-DnoOFo57.js";import{D as S}from"./vuedraggable-C3E4D3Yv.js";import{l as h}from"./lodash-es-BADexyn7.js";import{f as T,ak as _,I as v,a as t,aN as a,J as s,G as q,O as K,H as L,A as M}from"./@vue/runtime-core-C0pg79pw.js";import{y as p}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"bg-fill-light flex items-center w-full p-4 mt-4"},Q={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},r=5,de=T({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:b}){const c=b,m=u,f=M({get:()=>m.content,set:l=>{c("update:content",l)}}),k=()=>{var l;if(((l=m.content.data)==null?void 0:l.length)<r){const e=h(m.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),c("update:content",e)}else g.msgError(`最多添加${r}张图片`)},w=l=>{var d;if(((d=m.content.data)==null?void 0:d.length)<=1)return g.msgError("最少保留一张图片");const e=h(m.content);e.data.splice(l,1),c("update:content",e)};return(l,e)=>{const d=R,y=j,i=O,E=H,U=A,C=G,B=z,D=F,N=I,$=J;return _(),v("div",null,[t($,{"label-width":"70px"},{default:a(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:a(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(p(S),{class:"draggable",modelValue:p(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>p(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:a(({element:o,index:V})=>[(_(),q(B,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:a(()=>[s("div",P,[t(d,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",Q,[t(i,{label:"图片名称"},{default:a(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{class:"mt-[18px]",label:"图片链接"},{default:a(()=>[t(E,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{label:"是否显示",class:"mt-[18px]"},{default:a(()=>[s("div",W,[t(U,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=u.content.data)==null?void 0:x.length)<r?(_(),v("div",Y,[t(D,{class:"w-full",type:"primary",onClick:k},{default:a(()=>[...e[1]||(e[1]=[K("添加图片",-1)])]),_:1})])):L("",!0)]}),_:1})]),_:1})])}}});export{de as _};
|
||||
@@ -1 +0,0 @@
|
||||
import{J as E,D as F,C,I as N,F as z,G as B}from"./element-plus-CFxTwCZ2.js";import{_ as G}from"./index.vue_vue_type_script_setup_true_lang-CLI6gjnV.js";import{_ as I}from"./picker-DsltUfs3.js";import{f as O,ak as r,G as s,aN as t,a as l,O as p,H as i,J as y,A as j}from"./@vue/runtime-core-C0pg79pw.js";import{y as a}from"./@vue/reactivity-BIbyPIZJ.js";const T=O({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(m,{emit:g}){const b=g,x=m,o=j({get:()=>x.content,set:_=>{b("update:content",_)}});return(_,e)=>{const u=N,f=C,d=F,k=z,V=I,v=G,U=E,w=B;return r(),s(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(d,{label:"页面标题"},{default:t(()=>[l(f,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[7]||(e[7]=[p("文字",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[8]||(e[8]=[p("图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),m.content.title_type==1?(r(),s(d,{key:0},{default:t(()=>[l(k,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),m.content.title_type==2?(r(),s(d,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=y("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),m.content.title_type==1?(r(),s(d,{key:2,label:"文字颜色"},{default:t(()=>[l(f,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[10]||(e[10]=[p("白色",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[11]||(e[11]=[p("黑色",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(d,{label:"页面背景"},{default:t(()=>[l(f,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[12]||(e[12]=[p("背景颜色",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[13]||(e[13]=[p("背景图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),m.content.bg_type==1?(r(),s(d,{key:3},{default:t(()=>[l(v,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),m.content.bg_type==2?(r(),s(d,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=y("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{T as _};
|
||||
@@ -1 +0,0 @@
|
||||
import{J as F,D as I,F as O,g as j,i as A,G}from"./element-plus-CFxTwCZ2.js";import{_ as J}from"./index-DrGLRjBU.js";import{b as z,f as g}from"./index-DqzX0p3J.js";import{_ as H}from"./picker-CRq51wFl.js";import{_ as R}from"./picker-DsltUfs3.js";import{D as S}from"./vuedraggable-C3E4D3Yv.js";import{l as v}from"./lodash-es-BADexyn7.js";import{f as T,ak as _,I as b,a as t,aN as a,J as s,G as q,O as K,H as L,A as M}from"./@vue/runtime-core-C0pg79pw.js";import{y as p}from"./@vue/reactivity-BIbyPIZJ.js";const P={class:"bg-fill-light flex items-center w-full p-4 mt-4"},Q={class:"ml-3 flex-1"},W={class:"flex-1 flex items-center"},X={class:"drag-move cursor-move ml-auto"},Y={key:0,class:"mt-4"},r=5,de=T({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:h}){const c=h,m=u,f=M({get:()=>m.content,set:l=>{c("update:content",l)}}),k=()=>{var l;if(((l=m.content.data)==null?void 0:l.length)<r){const e=v(m.content);e.data.push({is_show:"1",image:"",name:"",link:{}}),c("update:content",e)}else g.msgError(`最多添加${r}张图片`)},w=l=>{var d;if(((d=m.content.data)==null?void 0:d.length)<=1)return g.msgError("最少保留一张图片");const e=v(m.content);e.data.splice(l,1),c("update:content",e)};return(l,e)=>{const d=R,y=O,i=I,E=H,U=j,C=z,D=J,B=A,N=F,$=G;return _(),b("div",null,[t($,{"label-width":"70px"},{default:a(()=>[t(N,{shadow:"never",class:"!border-none flex mt-2"},{default:a(()=>{var x;return[e[2]||(e[2]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单"),s("div",{class:"text-xs text-tx-secondary ml-2"}," 最多添加5张,建议图片尺寸:750px*200px ")],-1)),t(p(S),{class:"draggable",modelValue:p(f).data,"onUpdate:modelValue":e[0]||(e[0]=o=>p(f).data=o),animation:"300",handle:".drag-move","item-key":"index"},{item:a(({element:o,index:V})=>[(_(),q(D,{key:V,onClose:n=>w(V),class:"w-[467px]"},{default:a(()=>[s("div",P,[t(d,{modelValue:o.image,"onUpdate:modelValue":n=>o.image=n,"upload-class":"bg-body","exclude-domain":""},null,8,["modelValue","onUpdate:modelValue"]),s("div",Q,[t(i,{label:"图片名称"},{default:a(()=>[t(y,{modelValue:o.name,"onUpdate:modelValue":n=>o.name=n,placeholder:"请输入名称"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{class:"mt-[18px]",label:"图片链接"},{default:a(()=>[t(E,{modelValue:o.link,"onUpdate:modelValue":n=>o.link=n},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),t(i,{label:"是否显示",class:"mt-[18px]"},{default:a(()=>[s("div",W,[t(U,{modelValue:o.is_show,"onUpdate:modelValue":n=>o.is_show=n,"active-value":"1","inactive-value":"0"},null,8,["modelValue","onUpdate:modelValue"]),s("div",X,[t(C,{name:"el-icon-Rank",size:"18"})])])]),_:2},1024)])])]),_:2},1032,["onClose"]))]),_:1},8,["modelValue"]),((x=u.content.data)==null?void 0:x.length)<r?(_(),b("div",Y,[t(B,{class:"w-full",type:"primary",onClick:k},{default:a(()=>[...e[1]||(e[1]=[K("添加图片",-1)])]),_:1})])):L("",!0)]}),_:1})]),_:1})])}}});export{de as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{J as V,D as w,F as x,G as b}from"./element-plus-CFxTwCZ2.js";import{_ as g}from"./picker-DsltUfs3.js";import{f as k,ak as E,I as U,a as e,aN as n,J as y,A as v}from"./@vue/runtime-core-C0pg79pw.js";import{y as o}from"./@vue/reactivity-BIbyPIZJ.js";const N=k({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:r}){const p=r,i=u,l=v({get:()=>i.content,set:d=>{p("update:content",d)}});return(d,t)=>{const s=x,m=w,_=g,c=V,f=b;return E(),U("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[y("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(s,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{N as _};
|
||||
import{J as V,B as w,C as x,D as b}from"./element-plus-D9NzL5HE.js";import{_ as g}from"./picker-DnoOFo57.js";import{f as k,ak as E,I as U,a as e,aN as n,J as y,A as B}from"./@vue/runtime-core-C0pg79pw.js";import{y as o}from"./@vue/reactivity-BIbyPIZJ.js";const j=k({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(u,{emit:r}){const p=r,i=u,l=B({get:()=>i.content,set:d=>{p("update:content",d)}});return(d,t)=>{const s=x,m=w,_=g,c=V,f=b;return E(),U("div",null,[e(f,{"label-width":"90px",size:"large","label-position":"top"},{default:n(()=>[e(c,{shadow:"never",class:"!border-none flex mt-2"},{default:n(()=>[e(m,{label:"平台名称"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).title,"onUpdate:modelValue":t[0]||(t[0]=a=>o(l).title=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"客服二维码"},{default:n(()=>[y("div",null,[e(_,{modelValue:o(l).qrcode,"onUpdate:modelValue":t[1]||(t[1]=a=>o(l).qrcode=a),"exclude-domain":""},null,8,["modelValue"])])]),_:1}),e(m,{label:"备注"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).remark,"onUpdate:modelValue":t[2]||(t[2]=a=>o(l).remark=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"联系电话"},{default:n(()=>[e(s,{class:"w-[400px]",modelValue:o(l).mobile,"onUpdate:modelValue":t[3]||(t[3]=a=>o(l).mobile=a)},null,8,["modelValue"])]),_:1}),e(m,{label:"服务时间"},{default:n(()=>[e(s,{class:"w-[400px]","show-word-limit":"",maxlength:"20",modelValue:o(l).time,"onUpdate:modelValue":t[4]||(t[4]=a=>o(l).time=a)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})])}}});export{j as _};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{J as E,B as C,G as F,I as N,C as B,D as z}from"./element-plus-D9NzL5HE.js";import{_ as G}from"./index.vue_vue_type_script_setup_true_lang-_izKWNxN.js";import{_ as I}from"./picker-DnoOFo57.js";import{f as O,ak as r,G as s,aN as t,a as l,O as p,H as i,J as y,A as j}from"./@vue/runtime-core-C0pg79pw.js";import{y as a}from"./@vue/reactivity-BIbyPIZJ.js";const T=O({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(m,{emit:g}){const b=g,x=m,o=j({get:()=>x.content,set:_=>{b("update:content",_)}});return(_,e)=>{const u=N,f=F,d=C,k=B,V=I,v=G,U=E,w=z;return r(),s(w,{ref:"form","label-width":"80px",size:"large"},{default:t(()=>[l(U,{shadow:"never",class:"!border-none flex mt-2"},{default:t(()=>[l(d,{label:"页面标题"},{default:t(()=>[l(f,{modelValue:a(o).title_type,"onUpdate:modelValue":e[0]||(e[0]=n=>a(o).title_type=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[7]||(e[7]=[p("文字",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[8]||(e[8]=[p("图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),m.content.title_type==1?(r(),s(d,{key:0},{default:t(()=>[l(k,{modelValue:a(o).title,"onUpdate:modelValue":e[1]||(e[1]=n=>a(o).title=n),maxlength:"8","show-word-limit":"",class:"w-[300px]",placeholder:"请输入页面标题"},null,8,["modelValue"])]),_:1})):i("",!0),m.content.title_type==2?(r(),s(d,{key:1},{default:t(()=>[l(V,{modelValue:a(o).title_img,"onUpdate:modelValue":e[2]||(e[2]=n=>a(o).title_img=n),limit:1,size:"100px"},null,8,["modelValue"]),e[9]||(e[9]=y("div",{class:"form-tips"},"建议图片尺寸:300px*40px",-1))]),_:1})):i("",!0),m.content.title_type==1?(r(),s(d,{key:2,label:"文字颜色"},{default:t(()=>[l(f,{modelValue:a(o).text_color,"onUpdate:modelValue":e[3]||(e[3]=n=>a(o).text_color=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[10]||(e[10]=[p("白色",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[11]||(e[11]=[p("黑色",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):i("",!0),l(d,{label:"页面背景"},{default:t(()=>[l(f,{modelValue:a(o).bg_type,"onUpdate:modelValue":e[4]||(e[4]=n=>a(o).bg_type=n)},{default:t(()=>[l(u,{value:"1"},{default:t(()=>[...e[12]||(e[12]=[p("背景颜色",-1)])]),_:1}),l(u,{value:"2"},{default:t(()=>[...e[13]||(e[13]=[p("背景图片",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),m.content.bg_type==1?(r(),s(d,{key:3},{default:t(()=>[l(v,{modelValue:a(o).bg_color,"onUpdate:modelValue":e[5]||(e[5]=n=>a(o).bg_color=n),"reset-color":"#F5F5F5"},null,8,["modelValue"])]),_:1})):i("",!0),m.content.bg_type==2?(r(),s(d,{key:4},{default:t(()=>[l(V,{modelValue:a(o).bg_image,"onUpdate:modelValue":e[6]||(e[6]=n=>a(o).bg_image=n),limit:1,size:"100px"},null,8,["modelValue"]),e[14]||(e[14]=y("div",{class:"form-tips"},"建议图片尺寸:750px*高度不限",-1))]),_:1})):i("",!0)]),_:1})]),_:1},512)}}});export{T as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{J as b,D as y,F as E,C as w,I as C,G as I}from"./element-plus-CFxTwCZ2.js";import{_ as N}from"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import{f as k,ak as B,I as F,a as t,aN as o,J as a,O as u,A as O}from"./@vue/runtime-core-C0pg79pw.js";import{y as s}from"./@vue/reactivity-BIbyPIZJ.js";const U={class:"flex-1"},J=k({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=O({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=E,c=y,d=b,r=C,v=w,V=I;return B(),F("div",null,[t(V,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(v,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>[...e[3]||(e[3]=[u("横排",-1)])]),_:1}),t(r,{value:2},{default:o(()=>[...e[4]||(e[4]=[u("竖排",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",U,[t(N,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{J as _};
|
||||
import{J as b,B as y,C as E,G as w,I as B,D as C}from"./element-plus-D9NzL5HE.js";import{_ as I}from"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import{f as N,ak as k,I as O,a as t,aN as o,J as a,O as u,A as U}from"./@vue/runtime-core-C0pg79pw.js";import{y as s}from"./@vue/reactivity-BIbyPIZJ.js";const g={class:"flex-1"},J=N({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(p,{emit:i}){const f=i,_=p,l=U({get:()=>_.content,set:m=>{f("update:content",m)}});return(m,e)=>{const x=E,c=y,d=b,r=B,v=w,V=C;return k(),O("div",null,[t(V,{"label-width":"70px"},{default:o(()=>[t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[t(c,{label:"标题"},{default:o(()=>[t(x,{class:"w-[396px]",modelValue:s(l).title,"onUpdate:modelValue":e[0]||(e[0]=n=>s(l).title=n)},null,8,["modelValue"])]),_:1})]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[5]||(e[5]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),t(v,{modelValue:s(l).style,"onUpdate:modelValue":e[1]||(e[1]=n=>s(l).style=n)},{default:o(()=>[t(r,{value:1},{default:o(()=>[...e[3]||(e[3]=[u("横排",-1)])]),_:1}),t(r,{value:2},{default:o(()=>[...e[4]||(e[4]=[u("竖排",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(d,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=a("div",{class:"flex items-end mb-4"},[a("div",{class:"text-base text-[#101010] font-medium"},"菜单"),a("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),a("div",g,[t(I,{modelValue:s(l).data,"onUpdate:modelValue":e[2]||(e[2]=n=>s(l).data=n)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{J as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{J as C,C as F,I as N,D as O,P as U,Q as g,G as B}from"./element-plus-CFxTwCZ2.js";import{_ as I}from"./add-nav.vue_vue_type_script_setup_true_lang-alqX9dEP.js";import{f as j,ak as d,I as m,a as l,aN as o,J as s,O as x,F as c,ap as v,A as D}from"./@vue/runtime-core-C0pg79pw.js";import{y as n}from"./@vue/reactivity-BIbyPIZJ.js";const G={class:"flex-1 mt-4"},P=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(V,{emit:b}){const y=b,w=V,a=D({get:()=>w.content,set:u=>{y("update:content",u)}});return(u,e)=>{const r=N,E=F,p=g,i=U,_=O,f=C,k=B;return d(),m("div",null,[l(k,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>[...e[4]||(e[4]=[x("固定显示",-1)])]),_:1}),l(r,{value:2},{default:o(()=>[...e[5]||(e[5]=[x("分页滑动",-1)])]),_:1})]),_:1},8,["modelValue"]),l(_,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(i,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(d(),m(c,null,v(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(_,{label:"显示行数"},{default:o(()=>[l(i,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(d(),m(c,null,v(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",G,[l(I,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{P as _};
|
||||
import{J as B,G as F,I as N,B as O,P as U,Q as g,D as C}from"./element-plus-D9NzL5HE.js";import{_ as I}from"./add-nav.vue_vue_type_script_setup_true_lang-xpiil8I7.js";import{f as j,ak as d,I as m,a as l,aN as o,J as s,O as x,F as c,ap as v,A as D}from"./@vue/runtime-core-C0pg79pw.js";import{y as n}from"./@vue/reactivity-BIbyPIZJ.js";const G={class:"flex-1 mt-4"},P=j({__name:"attr",props:{content:{type:Object,default:()=>({})},styles:{type:Object,default:()=>({})}},emits:["update:content"],setup(V,{emit:b}){const y=b,w=V,a=D({get:()=>w.content,set:u=>{y("update:content",u)}});return(u,e)=>{const r=N,E=F,p=g,i=U,_=O,f=B,k=C;return d(),m("div",null,[l(k,{"label-width":"70px"},{default:o(()=>[l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[6]||(e[6]=s("div",{class:"flex items-end mb-4"},[s("div",{class:"text-base text-[#101010] font-medium"},"展示样式")],-1)),l(E,{modelValue:n(a).style,"onUpdate:modelValue":e[0]||(e[0]=t=>n(a).style=t)},{default:o(()=>[l(r,{value:1},{default:o(()=>[...e[4]||(e[4]=[x("固定显示",-1)])]),_:1}),l(r,{value:2},{default:o(()=>[...e[5]||(e[5]=[x("分页滑动",-1)])]),_:1})]),_:1},8,["modelValue"]),l(_,{label:"每行数量",class:"mt-4"},{default:o(()=>[l(i,{modelValue:n(a).per_line,"onUpdate:modelValue":e[1]||(e[1]=t=>n(a).per_line=t),style:{width:"300px"}},{default:o(()=>[(d(),m(c,null,v(5,t=>l(p,{key:t,label:t+"个",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),l(_,{label:"显示行数"},{default:o(()=>[l(i,{modelValue:n(a).show_line,"onUpdate:modelValue":e[2]||(e[2]=t=>n(a).show_line=t),style:{width:"300px"}},{default:o(()=>[(d(),m(c,null,v(2,t=>l(p,{key:t,label:t+"行",value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),l(f,{shadow:"never",class:"!border-none flex mt-2"},{default:o(()=>[e[7]||(e[7]=s("div",{class:"flex items-end"},[s("div",{class:"text-base text-[#101010] font-medium"},"菜单设置"),s("div",{class:"text-xs text-tx-secondary ml-2"},"建议图片尺寸:100px*100px")],-1)),s("div",G,[l(I,{modelValue:n(a).data,"onUpdate:modelValue":e[3]||(e[3]=t=>n(a).data=t)},null,8,["modelValue"])])]),_:1})]),_:1})])}}});export{P as _};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{_ as o}from"./auth.vue_vue_type_script_setup_true_lang-Bo8AWpdV.js";import"./element-plus-CFxTwCZ2.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./menu-BYFXe5pi.js";import"./index-DqzX0p3J.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./role-Ctr1nF0C.js";import"./index-Dn-pwuas.js";export{o as default};
|
||||
import{_ as o}from"./auth.vue_vue_type_script_setup_true_lang-DT4oDhyD.js";import"./element-plus-D9NzL5HE.js";import"./@vue/runtime-dom-iFk_KP8y.js";import"./lodash-D3kF6u-c.js";import"./@vue/runtime-core-C0pg79pw.js";import"./@vue/reactivity-BIbyPIZJ.js";import"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-BZWa1PtL.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./menu-Bas3Z9V_.js";import"./index-D54sWaXv.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";import"./role-BUivZ6pi.js";import"./index-epy6JK8p.js";export{o as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{G as H,s as I,D as q,H as J,$ as M,L as O}from"./element-plus-CFxTwCZ2.js";import{m as U}from"./menu-BYFXe5pi.js";import{a as $}from"./role-Ctr1nF0C.js";import{P as j}from"./index-Dn-pwuas.js";import{t as z}from"./index-DqzX0p3J.js";import{f as Q,ak as k,I as W,a as l,aN as u,aP as X,G as Y,J as y,n as x}from"./@vue/runtime-core-C0pg79pw.js";import{y as c,a as Z,u as f,o as r,r as ee}from"./@vue/reactivity-BIbyPIZJ.js";const te={class:"edit-popup"},ue=Q({__name:"auth",emits:["success","close"],setup(oe,{expose:C,emit:b}){const _=b,a=f(),h=f(),d=f(),g=r(!1),i=r(!0),m=r(!1),v=r([]),p=r([]),s=ee({id:"",name:"",desc:"",sort:0,menu_id:[]}),E={name:[{required:!0,message:"请输入名称",trigger:["blur"]}]},w=()=>{m.value=!0,U().then(e=>{p.value=e,v.value=z(e),x(()=>{A()}),m.value=!1})},R=()=>{var o,n;const e=(o=a.value)==null?void 0:o.getCheckedKeys(),t=(n=a.value)==null?void 0:n.getHalfCheckedKeys();return e==null||e.unshift.apply(e,t),e},A=()=>{s.menu_id.forEach(e=>{x(()=>{var t;(t=a.value)==null||t.setChecked(e,!0,!1)})})},D=e=>{const t=p.value;for(let o=0;o<t.length;o++)a.value.store.nodesMap[t[o].id].expanded=e},K=e=>{var t,o;e?(t=a.value)==null||t.setCheckedKeys(v.value.map(n=>n.id)):(o=a.value)==null||o.setCheckedKeys([])},V=async()=>{var e,t;await((e=h.value)==null?void 0:e.validate()),s.menu_id=R(),await $(s),(t=d.value)==null||t.close(),_("success")},B=()=>{_("close")},S=()=>{var e;(e=d.value)==null||e.open()},T=async e=>{for(const t in s)e[t]!=null&&e[t]!=null&&(s[t]=e[t])};return w(),C({open:S,setFormData:T}),(e,t)=>{const o=J,n=M,F=q,L=I,N=H,P=O;return k(),W("div",te,[l(j,{ref_key:"popupRef",ref:d,title:"分配权限",async:!0,width:"550px",onConfirm:V,onClose:B},{default:u(()=>[X((k(),Y(N,{class:"ls-form",ref_key:"formRef",ref:h,rules:E,model:c(s),"label-width":"60px"},{default:u(()=>[l(L,{class:"h-[400px] sm:h-[600px]"},{default:u(()=>[l(F,{label:"权限",prop:"menu_id"},{default:u(()=>[y("div",null,[l(o,{label:"展开/折叠",onChange:D}),l(o,{label:"全选/不全选",onChange:K}),l(o,{modelValue:c(i),"onUpdate:modelValue":t[0]||(t[0]=G=>Z(i)?i.value=G:null),label:"父子联动"},null,8,["modelValue"]),y("div",null,[l(n,{ref_key:"treeRef",ref:a,data:c(p),props:{label:"name",children:"children"},"check-strictly":!c(i),"node-key":"id","default-expand-all":c(g),"show-checkbox":""},null,8,["data","check-strictly","default-expand-all"])])])]),_:1})]),_:1})]),_:1},8,["model"])),[[P,c(m)]])]),_:1},512)])}}});export{ue as _};
|
||||
import{D as I,s as q,B as G,H as J,$ as M,L as O}from"./element-plus-D9NzL5HE.js";import{m as U}from"./menu-Bas3Z9V_.js";import{a as $}from"./role-BUivZ6pi.js";import{P as j}from"./index-epy6JK8p.js";import{v as z}from"./index-D54sWaXv.js";import{f as Q,ak as k,I as W,a as l,aN as u,aP as X,G as Y,J as y,n as x}from"./@vue/runtime-core-C0pg79pw.js";import{y as c,a as Z,u as f,o as r,r as ee}from"./@vue/reactivity-BIbyPIZJ.js";const te={class:"edit-popup"},ue=Q({__name:"auth",emits:["success","close"],setup(oe,{expose:C,emit:b}){const _=b,a=f(),h=f(),d=f(),g=r(!1),i=r(!0),m=r(!1),v=r([]),p=r([]),s=ee({id:"",name:"",desc:"",sort:0,menu_id:[]}),E={name:[{required:!0,message:"请输入名称",trigger:["blur"]}]},w=()=>{m.value=!0,U().then(e=>{p.value=e,v.value=z(e),x(()=>{A()}),m.value=!1})},R=()=>{var o,n;const e=(o=a.value)==null?void 0:o.getCheckedKeys(),t=(n=a.value)==null?void 0:n.getHalfCheckedKeys();return e==null||e.unshift.apply(e,t),e},A=()=>{s.menu_id.forEach(e=>{x(()=>{var t;(t=a.value)==null||t.setChecked(e,!0,!1)})})},D=e=>{const t=p.value;for(let o=0;o<t.length;o++)a.value.store.nodesMap[t[o].id].expanded=e},K=e=>{var t,o;e?(t=a.value)==null||t.setCheckedKeys(v.value.map(n=>n.id)):(o=a.value)==null||o.setCheckedKeys([])},B=async()=>{var e,t;await((e=h.value)==null?void 0:e.validate()),s.menu_id=R(),await $(s),(t=d.value)==null||t.close(),_("success")},V=()=>{_("close")},S=()=>{var e;(e=d.value)==null||e.open()},T=async e=>{for(const t in s)e[t]!=null&&e[t]!=null&&(s[t]=e[t])};return w(),C({open:S,setFormData:T}),(e,t)=>{const o=J,n=M,F=G,L=q,N=I,P=O;return k(),W("div",te,[l(j,{ref_key:"popupRef",ref:d,title:"分配权限",async:!0,width:"550px",onConfirm:B,onClose:V},{default:u(()=>[X((k(),Y(N,{class:"ls-form",ref_key:"formRef",ref:h,rules:E,model:c(s),"label-width":"60px"},{default:u(()=>[l(L,{class:"h-[400px] sm:h-[600px]"},{default:u(()=>[l(F,{label:"权限",prop:"menu_id"},{default:u(()=>[y("div",null,[l(o,{label:"展开/折叠",onChange:D}),l(o,{label:"全选/不全选",onChange:K}),l(o,{modelValue:c(i),"onUpdate:modelValue":t[0]||(t[0]=H=>Z(i)?i.value=H:null),label:"父子联动"},null,8,["modelValue"]),y("div",null,[l(n,{ref_key:"treeRef",ref:a,data:c(p),props:{label:"name",children:"children"},"check-strictly":!c(i),"node-key":"id","default-expand-all":c(g),"show-checkbox":""},null,8,["data","check-strictly","default-expand-all"])])])]),_:1})]),_:1})]),_:1},8,["model"])),[[P,c(m)]])]),_:1},512)])}}});export{ue as _};
|
||||
@@ -1 +0,0 @@
|
||||
import{K as L,G as N,D as K,F as I,P as O,Q as z,i as G,J,M as Q,N as R,L as S}from"./element-plus-CFxTwCZ2.js";import{_ as $}from"./index.vue_vue_type_script_setup_true_lang-CaamePaH.js";import{_ as j}from"./index-DqzX0p3J.js";import{_ as q}from"./index.vue_vue_type_script_setup_true_lang-G6LyA4hv.js";import{w as A}from"./@vue/runtime-dom-iFk_KP8y.js";import{a as M,g as H}from"./finance-ILzy-SM_.js";import{u as W}from"./useDictOptions-ClpM--kS.js";import{u as X}from"./usePaging-D4wPHtKU.js";import{f as v,ak as s,I as h,a as e,aN as n,F as Y,ap as Z,G as w,O as p,aP as ee,J as _}from"./@vue/runtime-core-C0pg79pw.js";import{y as o,a as te,r as oe}from"./@vue/reactivity-BIbyPIZJ.js";import{Q as y,o as ae}from"./@vue/shared-mAAVTE9n.js";import"./@element-plus/icons-vue-cboVPb4D.js";import"./lodash-es-BADexyn7.js";import"./@popperjs/core-C5az9QE8.js";import"./dayjs-DG77mNTn.js";import"./lodash-D3kF6u-c.js";import"./@ctrl/tinycolor-BuyEbX8F.js";import"./async-validator-CFA_igpM.js";import"./normalize-wheel-es-BQoi3Ox2.js";import"./jspdf-BsthCvR5.js";import"./@babel/runtime-BanGtE2-.js";import"./fflate-_ayOYiT1.js";import"./vue-router-CYz6RFzi.js";import"./pinia-Ba_jX6-d.js";import"./axios-C80V62Fs.js";import"./@vueuse/core-DIKi2bJB.js";import"./@vueuse/shared-D8934tfB.js";import"./css-color-function-DI01JAaZ.js";import"./balanced-match-BdS7OldZ.js";import"./color-B2zxaWkI.js";import"./clone-DBZ6_OiU.js";import"./color-convert-OrFsTA_V.js";import"./color-name-Dju3oUBS.js";import"./color-string-pUQDDJII.js";import"./ms-CzQ2E3wO.js";import"./vue-clipboard3-DByT_rEQ.js";import"./clipboard-CHgxszqY.js";import"./echarts-DYKKs4Al.js";import"./tslib-BDyQ-Jie.js";import"./zrender-CTTuYiLF.js";import"./highlight.js-Bxt7hFFy.js";import"./@highlightjs/vue-plugin-BVMzZUvF.js";const ne={class:"flex items-center"},le={class:"flex justify-end mt-4"},ie=v({name:"balanceDetail"}),Xe=v({...ie,setup(re){const l=oe({user_info:"",change_type:"",start_time:"",end_time:""}),{pager:r,getLists:d,resetPage:c,resetParams:x}=X({fetchFun:M,params:l}),{optionsData:C}=W({change_type:{api:H}});return d(),(me,a)=>{const V=L,E=I,m=K,u=z,T=O,k=q,f=G,D=N,g=J,i=R,F=j,P=Q,U=$,B=S;return s(),h("div",null,[e(g,{class:"!border-none",shadow:"never"},{default:n(()=>[e(V,{type:"warning",title:"温馨提示:用户账户变动记录",closable:!1,"show-icon":""}),e(D,{ref:"formRef",class:"mb-[-16px] mt-[16px]",model:o(l),inline:!0},{default:n(()=>[e(m,{class:"w-[280px]",label:"用户信息"},{default:n(()=>[e(E,{modelValue:o(l).user_info,"onUpdate:modelValue":a[0]||(a[0]=t=>o(l).user_info=t),placeholder:"请输入用户账号/昵称/手机号",clearable:"",onKeyup:A(o(c),["enter"])},null,8,["modelValue","onKeyup"])]),_:1}),e(m,{class:"w-[280px]",label:"变动类型"},{default:n(()=>[e(T,{modelValue:o(l).change_type,"onUpdate:modelValue":a[1]||(a[1]=t=>o(l).change_type=t)},{default:n(()=>[e(u,{label:"全部",value:""}),(s(!0),h(Y,null,Z(o(C).change_type,(t,b)=>(s(),w(u,{key:b,label:t,value:b},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(m,{label:"记录时间"},{default:n(()=>[e(k,{startTime:o(l).start_time,"onUpdate:startTime":a[2]||(a[2]=t=>o(l).start_time=t),endTime:o(l).end_time,"onUpdate:endTime":a[3]||(a[3]=t=>o(l).end_time=t)},null,8,["startTime","endTime"])]),_:1}),e(m,null,{default:n(()=>[e(f,{type:"primary",onClick:o(c)},{default:n(()=>[...a[5]||(a[5]=[p("查询",-1)])]),_:1},8,["onClick"]),e(f,{onClick:o(x)},{default:n(()=>[...a[6]||(a[6]=[p("重置",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["model"])]),_:1}),e(g,{class:"!border-none mt-4",shadow:"never"},{default:n(()=>[ee((s(),w(P,{size:"large",data:o(r).lists},{default:n(()=>[e(i,{label:"用户账号",prop:"account","min-width":"100"}),e(i,{label:"用户昵称","min-width":"160"},{default:n(({row:t})=>[_("div",ne,[e(F,{class:"flex-none mr-2",src:t.avatar,width:40,height:40,"preview-teleported":"",fit:"contain"},null,8,["src"]),p(" "+y(t.nickname),1)])]),_:1}),e(i,{label:"手机号码",prop:"mobile","min-width":"100"}),e(i,{label:"变动金额",prop:"change_amount","min-width":"100"},{default:n(({row:t})=>[_("span",{class:ae({"text-error":t.action==2})},y(t.change_amount),3)]),_:1}),e(i,{label:"剩余金额",prop:"left_amount","min-width":"100"}),e(i,{label:"变动类型",prop:"change_type_desc","min-width":"120"}),e(i,{label:"来源单号",prop:"source_sn","min-width":"100"}),e(i,{label:"记录时间",prop:"create_time","min-width":"120"})]),_:1},8,["data"])),[[B,o(r).loading]]),_("div",le,[e(U,{modelValue:o(r),"onUpdate:modelValue":a[4]||(a[4]=t=>te(r)?r.value=t:null),onChange:o(d)},null,8,["modelValue","onChange"])])]),_:1})])}}});export{Xe as default};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user