更新一个大版本

main
yanzai 8 months ago
parent 9af785ef09
commit b7ed4bbbf4

@ -208,6 +208,31 @@ class ComboController extends Controller
public function Save()
{
$Info = request('Info');
$combo = DB::table('combos')->where(['id' => $Info['id']])->first();
if (!$combo) {
return \Yz::echoError1("套餐不存在");
}
$oldOrder = $combo->order;
$newOrder = $Info['order'];
// 如果排序发生了变化
if ($oldOrder != $newOrder) {
if ($newOrder > $oldOrder) {
// 向后移动:将 [oldOrder+1 到 newOrder] 的记录 order -1
DB::table('combos')
->where('order', '>', $oldOrder)
->where('order', '<=', $newOrder)
->decrement('order');
} else {
// 向前移动:将 [newOrder 到 oldOrder-1] 的记录 order +1
DB::table('combos')
->where('order', '>=', $newOrder)
->where('order', '<', $oldOrder)
->increment('order');
}
}
$u = DB::table('combos')->where(['id' => $Info['id']])->update([
'checkup_type_id' => $Info['checkup_type_id'],
'type_id' => $Info['type_id'],
@ -218,7 +243,7 @@ class ComboController extends Controller
'intro' => $Info['intro'],
'sub_intro' => $Info['sub_intro'],
'desc' => $Info['desc'],
'order' => $Info['order'],
'order' =>$newOrder,
'sale_count' => $Info['sale_count'],
'is_hot' => isset($Info['is_hot'])?$Info['is_hot']:0,
]);

@ -4,9 +4,15 @@ namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use App\Services\TimeService;
use DateInterval;
use DatePeriod;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class PlanController extends Controller
{
@ -38,7 +44,27 @@ class PlanController extends Controller
// $planType = DB::table('plan_type as a')->where(['a.id' => $model->plan_type, 'a.is_del' => 0, 'a.status' => 1])->first();
// if (!$planType) return \Yz::echoError1('号源类型不可用');
//查询此时间段内是否有已经生成的号源
$cha = DB::table('plans')->whereBetween('date', $Info['dateRange'])->where(['is_del'=>0])->whereIn('status',[0,1])->get();
$startDate11 = new DateTime($Info['dateRange'][0]);
$endDate11 = new DateTime($Info['dateRange'][1]);
// 包括结束日期
$endDate11->modify('+1 day');
$period = new DatePeriod($startDate11, new DateInterval('P1D'), $endDate11);
$matchedDates = [];
foreach ($period as $date) {
$currentDate = $date;
$dayOfWeek = $currentDate->format('N'); // 1=周一 ... 7=周日
if (in_array($dayOfWeek, $params['week'])) {
$matchedDates[] = $currentDate->format('Y-m-d');
}
}
$cha = DB::table('plans')->whereIn('date',$matchedDates)->where(['is_del'=>0])->whereIn('status',[0,1])->get();
if (count($cha) > 0) {
return \Yz::return(false, '号源重复', ['list' => $cha]);
}
@ -132,29 +158,51 @@ class PlanController extends Controller
$searchInfo = request('searchInfo');
$list = DB::table('plans as a')
->select('a.*','b.name as username','b.phone')
->leftJoin('orders as b', 'a.id', '=', 'b.plan_id')
->where(['a.is_del' => 0]);
->leftJoin('orders as b', function($join) {
$join->on('a.id', '=', 'b.plan_id')
->whereIn('b.status', [2,4]);
})
->where('a.is_del', 0);
if (!isset($searchInfo['date'])) {
$searchInfo['date'] = date('Y-m-d');
}
$list = $list->where(['a.date' => $searchInfo['date']]);
$count = $list->count();
$list = $list->orderBy('a.time', 'asc')->get();
$plan_model=DB::table('plan_model_time')
->select('plan_model_time.*', 'plan_type.name as plan_type_name')
->leftJoin('plan_type', 'plan_type.id', '=', 'plan_model_time.plan_type_id')
->get();
$list_l=[];
foreach ($list as $k => $v) {
$list[$k]->plan_type_name = '';
foreach ($plan_model as $k1 => $v1) {
if ($v1->model_id == $v->model_id and $v1->time == $v->time) {
$list[$k]->plan_type_name = $v1->plan_type_name;
$list[$k]->plan_type_id = $v1->plan_type_id;
if (isset($searchInfo['plan_type']) and !empty($searchInfo['plan_type']) and $v1->plan_type_id==$searchInfo['plan_type']) {
$list_l[]=$list[$k];
}
break;
}
}
}
return \Yz::Return(true, '查询完成', ['list' => $list, 'count' => $count, 'date' => $searchInfo['date']]);
if (isset($searchInfo['plan_type']) and !empty($searchInfo['plan_type'])) {
$list=$list_l;
}
$count=count($list);
$unused_count=0;
$used_count=0;
foreach ($list as $k => $v) {
if($v->status==2){
$used_count++;
}else{
$unused_count++;
}
}
return \Yz::Return(true, '查询完成', ['list' => $list, 'count' => $count,'unused_count'=>$unused_count, 'used_count'=>$used_count,'date' => $searchInfo['date']]);
}
public function GetDetail()
@ -259,4 +307,87 @@ class PlanController extends Controller
}
}
//号源类型使用统计
public function GetPlanTypeTJ(){
$date = request('date');
$list=$this->GetPlanTypeTJFunc($date);
return \Yz::Return(true, '查询完成', ['list' => $list]);
}
public function ExportPlanTypeTJ()
{
$date = request('date');
$table_list=$this->GetPlanTypeTJFunc($date);
$template_path = Storage::path('public/excel/plantypetj.xlsx');
$spreadsheet = IOFactory::load($template_path);
$worksheet = $spreadsheet->getActiveSheet();
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$row = 3;
$col = [
'A' => 'name',
'B' => 'count',
'C' => 'used_count',
'D' => 'unused_count',
];
foreach ($table_list as $table_item) {
if(empty($table_item['name'])){
$table_item['name']='预留';
}
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$file_name = Str::orderedUuid();
$dir_path = "public/excel/" . date('Ym') . '/' . $file_name;
Storage::makeDirectory($dir_path);
$name_date = date('n.j', strtotime($date));
$excel_path = $dir_path . "/号源统计$name_date.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save(Storage::path($excel_path));
$url = Storage::url($excel_path);
return ['status'=>true,'msg'=>'查询完成','url'=> env('APP_URL').$url];
}
function GetPlanTypeTJFunc($date)
{
$list=DB::table('plans')->where(['date'=>$date,'is_del'=>0])->get();
$plan_model=DB::table('plan_model_time')
->select('plan_model_time.*', 'plan_type.name as plan_type_name')
->leftJoin('plan_type', 'plan_type.id', '=', 'plan_model_time.plan_type_id')
->get();
$plan_type=[];
foreach ($list as $k => $v) {
$list[$k]->plan_type_name = '';
foreach ($plan_model as $k1 => $v1) {
if ($v1->model_id == $v->model_id and $v1->time == $v->time) {
$list[$k]->plan_type_name = $v1->plan_type_name;
$list[$k]->plan_type_id = $v1->plan_type_id;
break;
}
}
if(!isset($plan_type[$v->plan_type_id])){
$plan_type[$v->plan_type_id]=['name'=>$v->plan_type_name,'count'=>0,'used_count'=>0,'unused_count'=>0];
}
$plan_type[$v->plan_type_id]['count']++;
if($v->status==2){
$plan_type[$v->plan_type_id]['used_count']++;
}else{
$plan_type[$v->plan_type_id]['unused_count']++;
}
}
$list2=[];
foreach ($plan_type as $k => $v) {
$list2[]=$v;
}
return $list2;
}
}

@ -46,6 +46,12 @@ class PlanTypeController extends Controller
}
}
public function GetEnableList()
{
$list=DB::table('plan_type')->where(['is_del'=>0]);
$list=$list ->get();
return \Yz::Return(true,'查询完成',['list'=>$list]);
}
public function GetList()
{
$page =request('page');

@ -51,6 +51,7 @@ class ApiMapController extends Controller
'GetReportJieLunJianYi' => $base_url . '/api/H5/GetReportJieLunJianYi', //获取报告结论建议页面数据
'GetReportDetaiList' => $base_url . '/api/H5/GetReportDetaiList', //完整报告中的列表
'GetReportDetai' => $base_url . '/api/H5/GetReportDetai', //完整报告中的详情
'GetReportDetai2' => $base_url . '/api/H5/GetReportDetai2', //完整报告中的详情
'StartPay' => $base_url . '/api/H5/StartPay', //开始支付
'CheckPay' => $base_url . '/api/H5/CheckPay', //支付查询
'Refund' => $base_url . '/api/H5/Refund', //退款
@ -99,6 +100,8 @@ class ApiMapController extends Controller
'GetHomeNotice' => $base_url . '/api/H5/GetHomeNotice', // 首页消息通知
'GetPersonOrderList' => $base_url . '/api/H5/GetPersonOrderList', // 获取个人订单列表
'ZhongKangGetHexiaoCode' => $base_url . '/api/H5/ZhongKangGetHexiaoCode', // 中康查询核销码
'GetPendingOrders' => $base_url . '/api/H5/GetPendingOrders', // 获取用户待预约订单
'LockPlan' => $base_url . '/api/H5/LockPlan', // 锁定号源
];
}

@ -104,7 +104,7 @@ class ComboController extends Controller
$sql = $sql . " and a.type_id=? ";
$canshu[] = $combo_type;
}else{
$sql = $sql. " and a.type_id<>19 ";
$sql = $sql. " and a.type_id<>19 or a.type_id is null ";
}
if (isset($combo_crowd)) {
$sql = $sql . " and a.crowd_id=? ";
@ -346,6 +346,8 @@ FROM combos;");
$true_price = 0;
$nmr_list=[];
$keshi_fenlei=DB::table('keshi')->get(); //科室分类
if (isset($combo_id) and $combo_id != 0) {
// $combo=DB::table('combos')->where(['hospital_id'=>$hospital_id,'combo_id'=>$combo_id,'status'=>1])->first();
$combo = DB::select("select a.*,b.*,c.name as crowd_name from combos as a LEFT JOIN (
@ -416,7 +418,15 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
$groupedData = [];
$comboItemCount=0;
foreach ($combo_items as $item) {
foreach ($keshi_fenlei as $k=>$v){
if($v->keshi_name===$item['keshi_name']){
$item['keshi_name']=$v->type_name;
}
}
$keshiName = $item['keshi_name'];
if($keshiName<>'材料费'){
$comboItemCount++;
}
@ -427,12 +437,13 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
}
foreach ($groupedData as $keshiName => $children) {
$combo_info['items'][] = [
'keshi_name' => $keshiName,
'children' => $children
];
}
$combo_info['items']= $this->KeShiPaiXu($combo_info['items']);
$combo_info['items']= $this->KeShiPaiXu($combo_info['items'],1);
$pay_item_count += $combo->item_count;
$true_price += $combo_info['price'];
//如果使用了第三方券
@ -498,12 +509,13 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
$items_info['price'] =$item_price;
$items_info['original_price'] = $items_original_price;
foreach ($groupedData as $keshiName => $children) {
$items_info['items'][] = [
'keshi_name' => $keshiName,
'children' => $children
];
}
$items_info['items']= $this->KeShiPaiXu($items_info['items']);
$items_info['items']= $this->KeShiPaiXu($items_info['items'],1);
$items_info['items_count'] = count($item_ids);
$pay_item_count += count($items);
$true_price += $items_info['price'];
@ -585,6 +597,11 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
}
$groupedData = [];
foreach ($item_new as $item) {
foreach ($keshi_fenlei as $k=>$v){
if($v->keshi_name===$item['keshi_name']){
$item['keshi_name']=$v->type_name;
}
}
$keshiName = $item['keshi_name'];
if (!isset($groupedData[$keshiName])) {
$groupedData[$keshiName] = [];
@ -599,6 +616,7 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
'children' => $children
];
}
$group_info[0]['items']= $this->KeShiPaiXu($group_info[0]['items'],1);
}
$temp_nmr=[];
@ -679,7 +697,8 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
}
foreach ($combos as $key => $combo) {
$itemCount=DB::table('combo_items')->where(['combo_id' => $combo->combo_id,'status'=>1])->where('keshi_name','<>','材料费')->count();
$combo->item_count=$itemCount;
$tags = json_decode($combo->tags, true);
$combo->tags2 = json_decode($combo->tags2, true);
foreach ($tags as $k => $tag) {
@ -695,7 +714,7 @@ select combo_id as c_id,count(*) as sale_count from orders where status in(2,4)
'color' => '#E9F8F3',
];
}
return \Yz::Return(true, "查询完成", ['list' => $combos]);
return \Yz::Return(true, "查询完成", ['list' => $combos,'keshi_paixu'=> config('app.globals.KeShiPaiXu')]);
}
//推荐套餐
@ -836,10 +855,13 @@ select combo_id as c_id,count(*) as count from orders where status in(2,4) group
return $true_price;
}
}
public function KeShiPaiXu($data)
public function KeShiPaiXu($data,$order_type=0)
{
// 给定的科室顺序
$sortedOrder = config('app.globals.KeShiPaiXu');
if($order_type==1){
$sortedOrder = config('app.globals.KeShiTypePaiXu');
}
// 创建一个科室到其在期望顺序中位置的映射
$sortedOrderMap = array_flip($sortedOrder);

@ -70,9 +70,22 @@ class FenzhenController extends Controller
$list = DB::table('orders')->where(['id_number' => $id_number])->whereIn('status', [2, 4])->orderBy('id', 'desc')->get();
}
} else {
//如果有多个订单则优先显示到检的如果到检的订单超过了当天则显示最近的一个订单。2025年5月30日与佳豪语音沟通商定。
$l = [];
foreach ($list as $key => $item) {
if ( (!empty($item->check_time)) and substr($item->check_time,0,10) == date('Y-m-d')) {
$l = [$item];
$list = $l;
break;
}
}
if (count($l) == 0) {
$l = [$list[0]];
$list = $l;
}
}
return \Yz::Return(true, "弃检成功", [
'list' => $list,
'type' => $type
@ -133,6 +146,11 @@ class FenzhenController extends Controller
$clinic_map[] = $item['his_number'];
}
}
foreach ($end_queue as $key => $item) {
if (isset($item['his_number'])) {
$clinic_map[] = $item['his_number'];
}
}
$last_time = strtotime('2024-10-10 ' . $time_line[count($time_line) - 1]['time'] . ':00');
if (!$res['data']['queue']) {
$push_end = false;

@ -51,7 +51,7 @@ class HomeController extends Controller
->select("id", "name", "latitude", "longitude", "logo","address")
->where(['status' => 1, 'is_del' => 0])->get();
if (count($hospitals) < 1) return \Yz::echoError1('');
$db_config = DB::table('configs')->whereIn('label', ['首页欢迎词', '首页banner'])->get();
$db_config = DB::table('configs')->whereIn('label', ['首页欢迎词', '首页banner','首页轮播图'])->get();
$config = [
'hospital' => $hospitals,
// [[
@ -62,6 +62,7 @@ class HomeController extends Controller
// ]]
'tip' => $this->getValueByLabel($db_config, '首页欢迎词'),
'logo' => $hospitals[0]->logo,
'lunbo'=>json_decode( $this->getValueByLabel($db_config, '首页轮播图'),true),
'banner' => [
'image' => $this->getValueByLabel($db_config, '首页banner'),
'jump' => 'https://www.hnxd.org/list-jkglzx.html',
@ -69,7 +70,8 @@ class HomeController extends Controller
'order' => [[
'message' => '',
'name' => '个人体检预约',
'jump' => '/pages/buy/choose/choose?url=api://CheckUpTypeGetList',
//'jump' => '/pages/buy/choose/choose?url=api://CheckUpTypeGetList',
'jump' => '/pages/main/yytjsj/yytjsj_front',
'icon' => '/assets/h5/gejianyuyue.png'
], [
'message' => '',
@ -79,17 +81,31 @@ class HomeController extends Controller
]],
'button' => [[[
'message' => '',
'name' => '健康问卷',
'jump' => '/pages/main/question/choose/choose',
'icon' => '/assets/h5/a_jiankangwenjuan.png'
'name' => '报告解读预约',
'jump' => 'XCX/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1002&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904',
'icon' => '/assets/h5/a_jiedubaogao.png'
],[
'message' => '',
'name' => '购买套餐',
'jump' => '/pages/main/combo/combo',
'icon' => '/assets/h5/a_manyidudiaocha.png'
],
// [
// 'message' => '暂未开放',
// 'name' => '预检咨询',
// 'jump' => '/pages/main/cjwt/cjwt',
// 'icon' => '/assets/h5/changjianwenti.png'
// ],
[
'message' => '',
'name' => '预检咨询',
'jump' => '/pages/main/tj/zhuanjiaxq?comboid=2814',
'icon' => '/assets/h5/yujianzx.png'
],[
'message' => '',
'name' => '婚检预约',
'jump' => '/pages/premarital/readme/readme',
'icon' => '/assets/h5/hunjianyy.png'
]], [[
'message' => '',
'name' => '转赠码核销',
'jump' => '/pages/buy/choose/sanfang',
'icon' => '/assets/h5/a_jiankangzhidao.png'
], [
'message' => '',
'name' => '体检注意事项',
'jump' => '/pages/posts/posts/posts?type=2',
@ -99,41 +115,43 @@ class HomeController extends Controller
'name' => '体检引导',
'jump' => '/pages/user/pick/pick',
'icon' => '/assets/h5/a_tijianyindao.png'
]], [[
'message' => '',
'name' => '报告解读预约',
'jump' => 'XCX/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1035&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904',
'icon' => '/assets/h5/a_jiedubaogao.png'
],[
'message' => '',
'name' => '健康问卷',
'jump' => '/pages/main/question/choose/choose',
'icon' => '/assets/h5/a_jiankangwenjuan.png'
],], [[
'message' => '',
'name' => '健康指导',
'jump' => '/pages/posts/posts/posts?type=1',
'icon' => '/assets/h5/a_jiankangzhidao.png'
], [
'message' => '',
'name' => '满意度调查',
'jump' => '/pages/main/questionnaire/index',
// 'jump' => 'https://www.wjx.cn/vm/Q9A0NRI.aspx',
'icon' => '/assets/h5/a_manyidudiaocha.png'
]], [[
'message' => '',
'name' => '报告查询',
'jump' => '/pages/main/bgcx/bgcx',
'icon' => '/assets/h5/a_baogaochaxun.png'
],
// [
// 'message' => '',
// 'name' => '报告查询',
// 'jump' => '/pages/main/bgcx/bgcx',
// 'icon' => '/assets/h5/a_baogaochaxun.png'
// ],
[
'message' => '',
'name' => '健康宣教',
'jump' => '/pages/posts/posts/posts?type=4',
'icon' => '/assets/h5/xuanjiao.png'
],
[
'message' => '',
'name' => '我的订单',
'jump' => '/pages/main/order/order',
'icon' => '/assets/h5/a_wodedingdan.png'
'name' => '满意度调查',
'jump' => '/pages/main/questionnaire/index',
'icon' => '/assets/h5/a_manyidudiaocha.png'
]
// ,
//
// [
// 'message' => '',
// 'name' => '我的订单',
// 'jump' => '/pages/main/order/order',
// 'icon' => '/assets/h5/a_wodedingdan.png'
// ]
]
],

@ -12,7 +12,49 @@ class HospitalExtraController extends Controller
public function GetReadme()
{
$type= request('type');
$readme_config="1、检前受检者保证充足睡眠时间保持良好身心状态。体检当日须空腹体检前一日避免油腻、辛辣刺激性食物勿饮酒彩超男士适量憋尿女士须憋足量尿。<br/>\n2、体检时着宽松衣物不要佩戴金属物品以防丢失或影响检查结果。<br/>\n3、做妇科检查的女士请避开生理期48小时内避免性生活。\n1未婚有性生活史选择检查妇科的需签署妇科知情同意书方可进行检查。<br/>\n4、孕期、哺乳期及半年内有备孕计划的男士、女士不建议做胸片、CT、钼靶、碳13、碳14检查。<br/>\n5、体检时服用特殊药品或身体有其它不适症状请及时向检查医师说明<br/>\n6、涉及幽门螺杆菌检查项目的碳13或14近期吃过胃药及消炎药的请提醒护士以免影响数值<br/>\n7、做过心脏支架、搭桥手术、四肢有钢钉钢板、腿部有严重静脉曲张者请您不要选做动脉硬化检测。<br/>\n8、体检结束后将指引单交回前台如未体检完成请勿将指引单带走。<br/>\n备注当日因各种原因未体检完成的请尽快补检完成。";
$sex= request('sex');
$readme_config="1、检前受检者保证充足睡眠时间保持良好身心状态。体检当日须空腹体检前一日避免油腻、辛辣刺激性食物勿饮酒彩超男士适量憋尿女士须憋足量尿。<br/>\n2、体检时着宽松衣物不要佩戴金属物品以防丢失或影响检查结果。<br/>\n3、做妇科检查的女士请避开生理期48小时内避免性生活。未婚有性生活史选择检查妇科的需签署妇科知情同意书方可进行检查。<br/>\n4、孕期、哺乳期及半年内有备孕计划的男士、女士不建议做胸片、CT、钼靶、碳13、碳14检查。<br/>\n5、体检时服用特殊药品或身体有其它不适症状请及时向检查医师说明。<br/>\n6、涉及幽门螺杆菌检查项目的碳13或14近期吃过胃药及消炎药的请提醒护士以免影响数值。<br/>\n7、做过心脏支架、搭桥手术、四肢有钢钉钢板、腿部有严重静脉曲张者请您不要选做动脉硬化检测。<br/>\n8、体检结束后将指引单交回前台如未体检完成请勿将指引单带走。<br/>\n备注当日因各种原因未体检完成的请尽快补检完成。";
if(isset($sex) and $sex==1){
$readme_config= "<div>
1、饮食要求体检前三天保持正常饮食避免暴饮暴食体检当天早晨需空腹禁食、禁水慢性病患者服药请遵医嘱
</div>
<div>
2、生活习惯体检前三天避免剧烈运动保证充足睡眠体检前一天避免饮酒避免服用对肝肾功能有影响的药物。
</div>
<div>
3、着装要求穿着宽松舒适衣物不佩戴金属物品以防丢失或影响检查结果。
</div>
<div>
4、精液检查如需进行精液检查请提前禁欲 3-5 天。
</div>
<div>
5、注意事项涉及幽门螺杆菌检查(碳 13 或碳 14),两周内吃过胃药或一个月内吃过消炎药,请告知医生择期检查,以免影响数值。
</div>
<div>
6、特殊说明使用抗凝药、抗血小板聚集药、高血压药等请与客服联系。<span style='color:#E53333;'>(特殊情况应主动告知医生)</span></div>
<br />";
}
if(isset($sex) and $sex==2){
$readme_config= "<div>
1、饮食要求体检前三天保持正常饮食避免暴饮暴食体检当天早晨需空腹禁食、禁水慢性病患者服药请遵医嘱
</div>
<div>
2、生活习惯体检前三天避免剧烈运动保证充足睡眠体检前一天避免饮酒避免服用对肝肾功能有影响的药物。
</div>
<div>
3、着装要求穿着宽松舒适衣物不佩戴金属物品以防丢失或影响检查结果。
</div>
<div>
4、月经期间不宜进行妇科检查建议月经干净后 3-7 天进行检查,检查前 24 小时内避免性生活、阴道冲洗和上药。
</div>
<div>
5、注意事项涉及幽门螺杆菌检查(碳 13 或碳 14),两周内吃过胃药或一个月内吃过消炎药,请告知医生择期检查,以免影响数值。
</div>
<div>
6、特殊说明使用抗凝药、抗血小板聚集药、高血压药等请与客服联系。<span style='color:#E53333;'>(特殊情况应主动告知医生)</span>
</div>
<br />";
}
//type=2 婚检注意事项
if(isset($type) and $type==2){
$info=DB::table("articles")->where("id",75)->first();

@ -146,6 +146,7 @@ class OrderController extends Controller
$yucunkuan = request('yucunkuan', 0);//使用的预存款数量
$erxian_info= request('erxian_info');//使用的预存款数量
$sanfang_code=request('sanfang_code'); //第三方code
$yuyue_fangshi=request('yuyue_fangshi'); //预约方式 个检、团检、个检先选号源等,非必填
$wj_flag = request('wj'); //问卷标记
@ -166,7 +167,7 @@ class OrderController extends Controller
if ($type != 1 && $type != 2) {
return \Yz::echoError1('type参数体检类型错误');
}
if (!isset($plan_id)) return \Yz::echoError1('号源id不能为空');
if (!isset($plan_id)) return \Yz::echoError1('请选择预约时间');
if ($type == 2 and !isset($group_id)) return \Yz::echoError1('团检group_id不能为空');
if ($type == 1 and isset($group_id)) return \Yz::echoError1('体检类型:个检 与group_id冲突');
@ -203,6 +204,9 @@ class OrderController extends Controller
$combo_info = DB::table('combos')->where(['combo_id' => $combo_id, 'status' => 1])->first();
if (!$combo_info) return \Yz::echoError1("套餐不存在");
if (!isset($combo_info->checkup_type_id)) return \Yz::echoError1("套餐未关联体检类型");
if($combo_info->sex<>0 and $combo_info->sex<>$person->sex) {
return \Yz::echoError1("套餐性别与体检人性别不匹配");
}
$checkup_type_id = $combo_info->checkup_type_id;
//构建多选一数据
@ -349,7 +353,7 @@ class OrderController extends Controller
'have_Nx1'=> !empty($Nx1_arrInfo)
];
$TJ_Leixing_id = $group_info['checkup_type_id'];
$title = "单位团检" . $group_info['combo_name'];
$title = "单位团检" . $group_info['danwei_name'];
$price = $price + $group_info['sixi_zong_ji_jin_e'];
$need_pay = ($price - $group_info['tongshou_xiane']) > 0 ? $price - $group_info['tongshou_xiane'] : 0;
//团检订单金额为减去统收后的金的
@ -406,7 +410,7 @@ class OrderController extends Controller
//检查号源是否可用
$plan = new PlanController();
$plan_check = $plan->CheckPlan($plan_id, $hospital_id, $type, $person->sex, $price, $checkup_type_id);
$plan_check = $plan->CheckPlan($plan_id, $hospital_id, $type, $person->sex, $price, $checkup_type_id,$user->id);
if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']);
$plan = $plan_check['plan'];
@ -441,9 +445,10 @@ class OrderController extends Controller
if (isset($erxian_info) and !empty($erxian_info)) {
foreach ($erxian_info as $erxian_item) {
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$plan->date],'action'=>"1"],uniqid());
if($plan->time<="12:00") $end_time="12:00";
if($plan->time>"12:00") $end_time="23:59";
if(!isset($nmrPlans[$plan->date]) or empty($nmrPlans[$plan->date])) return \Yz::echoError1("二线号源不可用,请重新选则日期");
// if($plan->time<="12:00") $end_time="12:00";
// if($plan->time>"12:00") $end_time="23:59";
$end_time="23:59";
if(!isset($nmrPlans[$plan->date]) or empty($nmrPlans[$plan->date])) return \Yz::echoError1("二线号源不可用,请重新选择日期");
$temp_date=[];
$planTime = new DateTime($plan->time);
$planTime->modify('+1 hour');
@ -460,7 +465,14 @@ class OrderController extends Controller
break;
}
}
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选则日期");
if(empty($temp_date)) {
if(isset($yuyue_fangshi) and $yuyue_fangshi<>'GeJianPlanFront') { //个检先选号源此处不提示 不拦截
return \Yz::echoError1("二线号源不可用,请重新选择日期");
}
}
}
}
@ -480,7 +492,13 @@ class OrderController extends Controller
];
//调用接口校验号源是否可用
$erxian_status = $AspNet::ErXian(['YYRQ' => $p_nmr_data['date'], 'YYSJ' => $p_nmr_data['time'], 'yyid' => $yyid, 'action' => 4], uniqid());
if ($erxian_status !== true) return \Yz::echoError1($p_nmr_data['name'] . '号源不可用,请重新选择');
if ($erxian_status !== true) {
if(isset($yuyue_fangshi) and $yuyue_fangshi<>'GeJianPlanFront') { //个检先选号源此处不提示 不拦截
return \Yz::echoError1($p_nmr_data['name'] . '号源不可用,请重新选择');
}
}
$plan_nmr_temp[] = $p_nmr_data;
}
}
@ -695,14 +713,31 @@ class OrderController extends Controller
return \Yz::Return(true,"操作完成",[]);
}
//如果有二线号源,根据体检时间查询二线可用号源区分上下午二线需预约体检时间1小时后
$buyInfo=json_decode($orderInfo->buy_info,true);
$db_nmr_info=json_decode($orderInfo->erxian_appointment_info,true);
if(isset($buyInfo['nmr_list']) and !empty($buyInfo['nmr_list']) and isset($db_nmr_info) and empty($db_nmr_info)){
$temp_erxian=[];
foreach ($buyInfo['nmr_list'] as $k=>$v){
$cha_item=DB::table('items')->where(['item_id'=>$v['item_id'],'status'=>1])->first();
if(!!$cha_item){
$temp_erxian[]=[
'item_id'=>$v['item_id'],
'name'=>$cha_item->name,
'price'=>$cha_item->price,
'time'=>'',
'date'=>'',
'gid'=>'',
];
}
}
$db_nmr_info=$temp_erxian;
}
$nmr_info=[];
if (isset($db_nmr_info) and !empty($db_nmr_info)) {
foreach ($db_nmr_info as $erxian_item) {
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$planInfo->date],'action'=>"1"],uniqid());
if($planInfo->time<="12:00") $end_time="12:00";
if($planInfo->time>"12:00") $end_time="23:59";
if(!isset($nmrPlans[$planInfo->date]) or empty($nmrPlans[$planInfo->date])) return \Yz::echoError1("二线号源不可用,请重新选则日期");
$end_time="23:59";
if(!isset($nmrPlans[$planInfo->date]) or empty($nmrPlans[$planInfo->date])) return \Yz::echoError1("二线号源不可用,请重新选择日期");
$temp_date=[];
$planTime = new DateTime($planInfo->time);
$planTime->modify('+1 hour');
@ -720,7 +755,7 @@ class OrderController extends Controller
break;
}
}
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选日期");
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选日期");
}
}
@ -940,6 +975,9 @@ class OrderController extends Controller
'可选项目信息' => $item_arr,
]);
if (count($item_check['data']) != 1) {
if(strpos( $item_check['message'], '与套餐允许性别') !== false){
$item_check['message']= '套餐性别与体检人性别不匹配';
}
return ['status' => false, 'msg' => "体检系统提示:" . $item_check['message']];
}
}
@ -1325,7 +1363,7 @@ class OrderController extends Controller
];
$dnet = new AspNetZhuanController();
$res = $dnet->WeiXinSend($data);
return \Yz::Return(true, "推送完成", ['res' => $res]);
}
//判断今天是否是给定日期的前一天

@ -99,7 +99,10 @@ class OrderNewController extends Controller
$combo_info = DB::table('combos')->where(['combo_id' => $combo_id, 'status' => 1])->first();
if (!$combo_info) return \Yz::echoError1("套餐不存在");
if (!isset($combo_info->checkup_type_id)) return \Yz::echoError1("套餐未关联体检类型");
// if($combo_info->sex<>0 and $combo_info->sex<>$person->sex) { //医院要求购买套餐时,不限制性别,预约和转赠时再限制,所以这段注释掉了
//医院要求购买套餐时,不限制性别,预约和转赠时再限制,所以这段注释掉了
//2025-04-30 18:45又要求限制性别所以又取消注释了
//2025-05-7 16:28 购买不限制性别,所以又注释掉了
// if($combo_info->sex<>0 and $combo_info->sex<>$person->sex) {
// return \Yz::echoError1("套餐性别与体检人性别不匹配");
// }
$checkup_type_id = $combo_info->checkup_type_id;
@ -268,27 +271,28 @@ class OrderNewController extends Controller
}
//调用思信接口判断各个项目是否可用
$check_items = [];
foreach ($item_ids as $item_id) {
$check_items[] = ['Id' => $item_id];
}
if ((isset($combo_id) and $combo_id <> 0) || count($check_items) != 0) {
$item_check = self::item_check($hospital_id, [
'人员信息列表' => [[
"序号" => 0,
"性别" => $person->sex == 1 ? '男' : '女',
"年龄" => floor((time() - strtotime($person->birthday)) / 86400 / 360),
"婚姻状态" => $person->married == 1 ? '已婚' : '未婚',
]],
'套餐Id' => $combo_id == 0 ? null : $combo_id,
'可选项目信息' => $check_items,
]);
if (count($item_check['data']) != 1) {
return \Yz::echoError1("体检系统提示:" . $item_check['message']);
}
}
//调用思信接口判断各个项目是否可用,单纯购买,不预约,不调用思信接口,所以注释掉了------------------------⬇⬇⬇⬇⬇⬇
// $check_items = [];
// foreach ($item_ids as $item_id) {
// $check_items[] = ['Id' => $item_id];
// }
// if ((isset($combo_id) and $combo_id <> 0) || count($check_items) != 0) {
// $item_check = self::item_check($hospital_id, [
// '人员信息列表' => [[
// "序号" => 0,
// "性别" => $person->sex == 1 ? '男' : '女',
// "年龄" => floor((time() - strtotime($person->birthday)) / 86400 / 360),
// "婚姻状态" => $person->married == 1 ? '已婚' : '未婚',
// ]],
// '套餐Id' => $combo_id == 0 ? null : $combo_id,
// '可选项目信息' => $check_items,
// ]);
// if (count($item_check['data']) != 1) {
// return \Yz::echoError1("体检系统提示:" . $item_check['message']);
// }
// }
//------------------------------------------------------------------------------⬆⬆⬆⬆
$plan_nmr_appointment_info = [];
//校验积分和预存款
@ -433,12 +437,34 @@ class OrderNewController extends Controller
$plan_id = request('plan_id');
$orderid = request('orderid');
$doctor = request('doctor');
$person_id = request('person_id');
$order = DB::table('orders')->where(['id' => $orderid])->first();
if(!$order) return \Yz::echoError1("订单不存在");
if($order->status!== 2) return \Yz::echoError1("订单不是已支付状态不能预约");
if (!isset($plan_id)) return \Yz::echoError1('号源id不能为空');
if (!isset($plan_id)) return \Yz::echoError1('请选择预约时间');
if(isset($person_id)){ //如果默认体检人与订单不符 则更换为默认体检人
$person_new=DB::table('web_user_person')->where(['id' => $person_id,'is_del' => 0])->first();
if(!!$person_new){
DB::table('orders')->where(['id' => $orderid])->update([
'person_id' => $person_id,
'name' => $person_new->name,
'phone' => $person_new->phone,
'id_number' => $person_new->id_number,
'birthday' => $person_new->birthday,
'sex'=>$person_new->sex
]);
$order->person_id=$person_id;
}
}
$person = DB::table('web_user_person')->where(['id' => $order->person_id, 'is_del' => 0])->first();
if (!$person) return \Yz::echoError1('体检人不存在');
if(empty($person->id_number)) return \Yz::echoError1("用户证件号不能为空");
$combo_info = DB::table('combos')->where(['combo_id' => $order->combo_id, 'status' => 1])->first();
if (!$combo_info) return \Yz::echoError1("套餐不存在");
if($combo_info->sex<>0 and $combo_info->sex<>$person->sex) {
return \Yz::echoError1("套餐性别与体检人性别不匹配");
}
if ($order->hospital_id == 1) {
$yyid = 6;
}
@ -447,7 +473,7 @@ class OrderNewController extends Controller
}
//检查号源是否可用
$plan = new PlanController();
$plan_check = $plan->CheckPlan($plan_id, $order->hospital_id, $order->type, $order->sex, $order->price, $order->checkup_type_id);
$plan_check = $plan->CheckPlan($plan_id, $order->hospital_id, $order->type, $order->sex, $order->price, $order->checkup_type_id,$order->web_user_id);
if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']);
$plan = $plan_check['plan'];
//校验号源日期是否超过订单有效期
@ -462,9 +488,8 @@ class OrderNewController extends Controller
if (isset($erxian_info) and !empty($erxian_info)) {
foreach ($erxian_info as $erxian_item) {
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$plan->date],'action'=>"1"],uniqid());
if($plan->time<="12:00") $end_time="12:00";
if($plan->time>"12:00") $end_time="23:59";
if(!isset($nmrPlans[$plan->date]) or empty($nmrPlans[$plan->date])) return \Yz::echoError1("二线号源不可用,请重新选则日期");
$end_time="23:59";
if(!isset($nmrPlans[$plan->date]) or empty($nmrPlans[$plan->date])) return \Yz::echoError1("二线号源不可用,请重新选择日期");
$temp_date=[];
$planTime = new DateTime($plan->time);
$planTime->modify('+1 hour');
@ -481,7 +506,7 @@ class OrderNewController extends Controller
break;
}
}
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选日期");
if(empty($temp_date)) return \Yz::echoError1("二线号源不可用,请重新选日期");
}
}
//校验二线号源
@ -668,7 +693,21 @@ class OrderNewController extends Controller
$status=$s->CancelZhuanZeng($order_id);
return \Yz::Return($status['status'],$status['msg'],['new_orderid'=>$order_id]);
}
//获取用户待预约订单
public function GetPendingOrders()
{
$openid = request('openid');
$person_id = request('person_id');
$user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1('用户不存在');
$list=DB::table('orders')->where(['web_user_id'=>$user->id,'status'=>2,'type'=>1])
->whereNotNull('combo_id')
->where(function($query) {
$query->where('appointment_number', '=', '')
->orWhereNull('appointment_number');
})->get();
return \Yz::Return(true,'查询完成',['list'=>$list]);
}
public function item_check($hospital, $data)
{
$peis = new PEISApiController();

@ -110,6 +110,9 @@ class PayController extends Controller
}
}
if(!!$order->plan_id){
$is_yuyue=true;
}
return \Yz::Return(true, "支付成功", ['id' => $order->id,'is_yuyue'=>$is_yuyue]);
} else {

@ -98,7 +98,7 @@ class PersonController extends Controller
'start_time' => $group_info['预约开始日期'],
'end_time' => $group_info['预约结束日期'],
'danwei_name' => $group_info['单位名称'],
'group_name' => $group_info['单位名称'] . ($group_info['部门名称']),
'group_name' => $group_info['单位名称'] ,
'bumen_name' => $group_info['部门名称'],
'group_id' => $group_info['预约Id'],
'tongshou_xiane'=>$group_info['统收限额']==0?0.00:$group_info['统收限额'],
@ -125,7 +125,7 @@ class PersonController extends Controller
if (!isset($id_number)) return \Yz::echoError1('身份证不能为空');
if (!isset($hospital_id)) return \Yz::echoError1('医院id不能为空');
$data = [
'电话号码' => $phone,
'电话号码' => null,
'证件号码' => $id_number
];
$res = self::group_info($hospital_id, $data);

@ -15,6 +15,7 @@ class PlanController extends Controller
$hospital_id = request('hospital');
$openid = request('openid');
$person_id = request('person_id');
$combo_id = request('combo_id');
$month = request('month');
$use_type = request('use_type');//使用类型 1个检 2团检
$checkup_type_id = request('checkup_type_id');//体检类型表对应id
@ -33,10 +34,16 @@ class PlanController extends Controller
->whereBetween('date', [$first_day, $last_day])->whereIn('status', [1])
->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [json_encode($checkup_type_id)])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0,'is_lock' => 0])
->where('is_vip', '<>', 1)
->whereIn('use_type', [0, $use_type]);
if (!!$combo_id) {
$comboInfo = DB::table('combos')->where(['combo_id' => $combo_id])->first();
if (!empty($comboInfo->keyue_start_time) and !empty($comboInfo->keyue_end_time)) {
$list = $list->whereBetween('time', [$comboInfo->keyue_start_time, $comboInfo->keyue_end_time]);
}
}
if (!empty($danwei_id)) {
$cha_bind_danwei = DB::table('plan_type')->WhereRaw('JSON_CONTAINS(bind_units, ?)', [json_encode($danwei_id)])->where(['is_del' => 0])->get();
if (count($cha_bind_danwei) > 0) {
@ -126,6 +133,8 @@ class PlanController extends Controller
$use_type = request('use_type');//使用类型 1个检 2团检
$checkup_type_id = (string)request('checkup_type_id');//体检类型表对应id
$amount = request('amount');//总金额
$big_date = request('big_date');//从月历选择的日期然后返回这个日期7天内的所有日期
if(!isset($big_date)) $big_date=date('Y-m-d');
if (!isset($checkup_type_id)) return \Yz::echoError1("体检类型不能为空");
$danwei_id = request('danwei_id');//单位名称
@ -137,7 +146,7 @@ class PlanController extends Controller
$currentDateTime = now();
$list = DB::table('plans')
->where('date', $date)->whereIn('status', [1, 2])
->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
// ->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [$checkup_type_id])
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0])
->where('is_vip', '<>', 1)
@ -191,7 +200,7 @@ class PlanController extends Controller
//如果有核磁项目11点往后的号源不可用
foreach ($list as $key => $item) {
if ($item->time > '11:00:00' and $item->time <= '12:00:00') {
$list[$key]->status = 2;
// $list[$key]->status = 2; //要求放开全天核磁
}
}
}
@ -206,10 +215,25 @@ class PlanController extends Controller
}
if(isset($openid))
{
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1("openid对应用户不存在");
foreach ($list as $key=> $l) {
//判断锁定
if($l->is_lock==1 and $l->lock_user_id==$user->id){
$list[$key]->is_lock=0;
}
//判断是否超时,超时设置为已经被占用,不可用
if($l->date . ' '.$l->time< date('Y-m-d H:i:s') ){
$list[$key]->status=2;
}
}
}
// 获取前后各三天的日期
$dateTime = new DateTime($date);
$dateTime = new DateTime($big_date);
$days7 = [];
for ($i = -3; $i <= 3; $i++) {
for ($i = 0; $i < 7; $i++) {
$dateTimeClone = clone $dateTime; // 克隆对象以避免修改原对象
$dateTimeClone->modify("$i days"); // 修改日期
$days7[] = $dateTimeClone->format('Y-m-d'); // 按照需要的格式添加到结果数组
@ -222,6 +246,17 @@ class PlanController extends Controller
->where(['hospital_id' => $hospital_id, 'type' => 1, 'is_del' => 0])
->where('is_vip', '<>', 1)
->whereIn('use_type', [0, $use_type]);
if(isset($user)){
$weeklist = $weeklist
->where(function ($query) use ($user) {
$query->where('is_lock', '=', 0)
->orWhere(function ($query) use ($user) {
$query->where('is_lock', 1) // 已锁定但属于当前用户
->where('lock_user_id', $user->id);
});
});
}
if (!empty($danwei_id)) {
$cha_bind_danwei = DB::table('plan_type')->WhereRaw('JSON_CONTAINS(bind_units, ?)', [json_encode($danwei_id)])->where(['is_del' => 0])->get();
if (count($cha_bind_danwei) > 0) {
@ -239,7 +274,7 @@ class PlanController extends Controller
if (count($comboItemsNmr) > 0 or count($ItemsNmr) > 0 or !empty($er_xian_info)) {
//如果有核磁项目11点往后的号源不可用
$weeklist = $weeklist->where('time', '<=', '11:00');
//$weeklist = $weeklist->where('time', '<=', '11:00'); //要求放开全天核磁
}
if (!!$combo_id) {
$comboInfo = DB::table('combos')->where(['combo_id' => $combo_id])->first();
@ -247,7 +282,7 @@ class PlanController extends Controller
$weeklist = $weeklist->whereBetween('time', [$comboInfo->keyue_start_time, $comboInfo->keyue_end_time]);
}
if (count($comboItemsNmr) > 0) {
$weeklist = $weeklist->whereNotBetween('time', ['11:00:00', '12:00:00']);
// $weeklist = $weeklist->whereNotBetween('time', ['11:00:00', '12:00:00']); //要求放开全天核磁
}
}
if (!!$personInfo) {
@ -306,11 +341,13 @@ class PlanController extends Controller
}
//检查号源是否可用
public function CheckPlan($plan_id, $hospital_id, $type, $sex, $price, $checkup_type_id)
public function CheckPlan($plan_id, $hospital_id, $type, $sex, $price, $checkup_type_id,$user_id=0)
{
$plan = DB::table('plans')->where(['id' => $plan_id, 'hospital_id' => $hospital_id, 'status' => 1, 'is_del' => 0])->first();
if (!$plan) return ['status' => false, 'msg' => "号源不可用"];
if($plan->is_lock==1 and $plan->lock_user_id<>$user_id){ //判断锁定
return ['status' => false, 'msg' => "号源不可用"];
}
//判断个检/团检类型
if ($plan->use_type <> 0 and $plan->use_type <> $type) {
$type_temp = '';
@ -344,4 +381,35 @@ class PlanController extends Controller
return ['status' => true, 'msg' => "", 'plan' => $plan];
}
//锁定号源,标记锁定状态,锁定时间,超过锁定时间自动释放
public function LockPlan()
{
$openid = request('openid');
$plan_id = request('plan_id');
$user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1("openid对应用户不存在");
$planInfo=DB::table('plans')->where(['id' => $plan_id,'status'=>1,'is_del'=>0])->first();
if(!$planInfo) return \Yz::echoError1("此号源不可用");
if($planInfo->is_lock<>0 and $planInfo->lock_user_id<>$user->id) return \Yz::echoError1("此号源不可用");
$lock_endtime = strtotime('+'.config('app.globals.plan_lock_time').' minutes');
$lock_endtime = date('Y-m-d H:i:s', $lock_endtime);
$u=DB::table('plans')->where(['id' => $plan_id])->update(['is_lock'=>1,'lock_endtime'=>$lock_endtime,'lock_user_id'=>$user->id]);
if($u){
return \Yz::Return(true, "锁定成功", ['plan_id' => $plan_id,'lock_endtime' => $lock_endtime]);
}else{
return \Yz::echoError1("锁定失败");
}
}
//释放锁定
public function UnLockPlan(){
$plan_id = request('plan_id');
$u=DB::table('plans')->where(['id' => $plan_id])->update(['is_lock'=>0,'lock_endtime'=>null,'lock_user_id'=>null]);
if($u){
return \Yz::Return(true, "释放成功", ['plan_id' => $plan_id]);
}else{
return \Yz::echoError1("释放失败");
}
}
}

@ -232,6 +232,18 @@ class QuestionnairesLogsController extends Controller
}
}
}
//先根据人员信息进行性别和婚姻赋值,如果传参有这两个 再覆盖
if($person_info->sex==1){
$content_sex="男";
}
if($person_info->sex==2){
$content_sex="女";
$content_hunyin="未婚";
if($person_info->married==1){
$content_hunyin="已婚";
}
}
foreach ($content as $key => $value) {
$question_ids[] = $value['id'];
$question_map["q{$value['id']}"] = $value;
@ -267,21 +279,21 @@ class QuestionnairesLogsController extends Controller
//获取套餐的项目
$jichu_items_ids = [];
if ($jichu_combo_new) {
if (isset($jichu_combo_new)) {
$jichu_combo_items = DB::table('combo_items')->where('combo_id', $jichu_combo_new)->get();
foreach ($jichu_combo_items as $key => $value) {
$jichu_items_ids[]=$value->item_id;
}
}
$tuijian_items_ids = [];
if ($tuijian_combo_new) {
if (isset($tuijian_combo_new)) {
$tuijian_combo_items = DB::table('combo_items')->where('combo_id', $tuijian_combo_new)->get();
foreach ($tuijian_combo_items as $key => $value) {
$tuijian_items_ids[]=$value->item_id;
}
}
$gaoduan_items_ids = [];
if ($gaoduan_combo_new) {
if (isset($gaoduan_combo_new)) {
$gaoduan_combo_items = DB::table('combo_items')->where('combo_id', $gaoduan_combo_new)->get();
foreach ($gaoduan_combo_items as $key => $value) {
$gaoduan_items_ids[]=$value->item_id;

@ -20,14 +20,14 @@ class ReportController extends Controller
$user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first();
if (!$user) return \Yz::echoError1('用户不存在');
$persons = DB::table('web_user_person')->where(['user_id' => $user->id, 'is_del' => 0])->pluck('id_number')->toArray();
$persons = DB::table('web_user_person')->where(['user_id' => $user->id, 'is_del' => 0])->whereNotIn('id_number',['-','*','--','---','----','无','未上户','未上户口','未落户'])->get();
$report_list=[];
$peis = new PEISApiController();
foreach ($persons as $key => $id_number) {
if(strlen($id_number)==0) continue;
foreach ($persons as $key => $person) {
if(strlen($person->id_number)==0) continue;
$data = [
'电话号码' => "",
'证件号码' => $id_number,
'电话号码' => $person->phone,
'证件号码' => $person->id_number,
'体检号' => ""
];
$reports = $peis::Post('体检报告查询', $hospital_id, $data);
@ -91,10 +91,12 @@ class ReportController extends Controller
'code' => "SG",'item_id' => ['5853094','5852882','5853229']],
['name' => "体重(kg)",
'code' => "TZ",'item_id' => ['5853095','5852883','5853228']],
['name' => "体重指数",
'code' => "TZZS",'item_id' => ['5852884','5853096']],
['name' => "收缩压",
'code' => "XY(SSY)",'item_id' => ['5853097']],
['name' => "血红蛋白",
'code' => "BXBSM",'item_id' => ['5852944']],
'code' => "XY(SSY)",'item_id' => ['5852927','5853097','5853225']],
['name' => "舒张压",
'code' => "XY(SZY)",'item_id' => ['5852926','5853098','5853226']],
];
$tijian_num = request('tijian_num');
$hospital_id=request('hospital_id');
@ -131,16 +133,22 @@ class ReportController extends Controller
$v_error_items = [];
$error_items = [];
$base_items = [];
foreach ($items as $item) {
// 遍历 YiBanJianChaList确保顺序一致
foreach ($YiBanJianChaList as $ybitem) {
if ($item->基础项目代码 == $ybitem['code'] or in_array($item->基础项目代码, $ybitem['item_id'])) {
foreach ($items as $item) {
if ($item->基础项目代码 == $ybitem['code'] || in_array($item->基础项目代码, $ybitem['item_id'])) {
$base_items[] = [
'name' => $ybitem['name'],
'value' => $item->结果值,
];
break; // 匹配到后跳出内层循环,避免重复匹配
}
}
if ($item->异常标识 != null and $item->异常标识 != '') {
}
// 收集异常项
foreach ($items as $item) {
if (!empty($item->异常标识)) {
$error_items[] = $item;
}
}
@ -184,6 +192,8 @@ class ReportController extends Controller
return \Yz::Return(true, "查询完成", ['list' => $list]);
}
//完整报告中的详情,返回单项 范围格式范围格式不统一容易出现bug
public function GetReportDetai()
{
$id = request('id');
@ -207,6 +217,7 @@ class ReportController extends Controller
$error_items = [];
foreach ($items as $item) {
$item->表格类型='范围表';
if ($item->异常标识 != null and $item->异常标识 != '') {
$m = '';
if ($item->异常标识 == '↓') {
@ -218,9 +229,12 @@ class ReportController extends Controller
$error_items[] = $item->基础项目名称 . $m;
}
if($item->结果类型=='数值' and $item->结果值!='' and $item->结果值!=null and $item->结果值范围!='' and $item->结果值范围 !=null){
try{
$range = $this->convertToArray($item->结果值范围);
// if(!is_array($range)){
// $item->表格类型='表格';
// continue;
// }
$item->结果值范围=$range;
$item->最大范围=[];
if(count($range)>1){
@ -233,6 +247,10 @@ class ReportController extends Controller
}
$item->最大范围=[0,$max];
}
}catch (\Exception $e){
}
}
}
if (count($items) > 0) {
@ -243,6 +261,56 @@ class ReportController extends Controller
}
}
//完整报告中的详情,返回单项 范围格式,为应对范围格式不统一,改为返回表格数据
public function GetReportDetai2()
{
$id = request('id');
$l2 = DB::table('report_l2_items')->where(['id' => $id])->first();
$items = DB::table('report_l3_base_items')->where(['report_l2_id' => $id])->orderBy('基础项目顺序')->get();
if ($l2->科室类型 == 'PACS') {
$suojian = [];
$zhenduan = [];
foreach ($items as $item) {
$suojian[] = empty($item->所见)?$item->结果值:$item->所见;
$jielun[] = $item->结果值;
}
if (count($items) > 0) {
return \Yz::Return(true, "查询完成", ['is_pacs'=>true,'suojian' => $suojian,'jielun' => $jielun]);
} else {
return \Yz::echoError1('此项暂无内容');
}
} else {
$error_items = [];
$is_fanwei="无范围";
foreach ($items as $item) {
if($item->结果类型=='数值'){
$is_fanwei="有范围";
}
$item->表格类型='范围表';
if ($item->异常标识 != null and $item->异常标识 != '') {
$m = '';
if ($item->异常标识 == '↓') {
$m = '低';
}
if ($item->异常标识 == '↑') {
$m = '高';
}
$error_items[] = $item->基础项目名称 . $m;
}
}
if (count($items) > 0) {
return \Yz::Return(true, "查询完成", ['is_pacs'=>false,'is_fanwei'=>$is_fanwei,'list' => $items, 'error_items' => $error_items]);
} else {
return \Yz::echoError1('此项暂无内容');
}
}
}
function convertToArray($input) {
// 检查是否是范围表示法

@ -4,6 +4,7 @@ namespace App\Http\Controllers\API\Internal;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller;
use App\Services\FenZhenService;
use DateInterval;
use DatePeriod;
use DateTime;
@ -18,7 +19,25 @@ use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class FenZhenController extends Controller
{
public function GetFenZhenInfo(){
$dates=request('dates');
$key=request('key');
if($key <>"ddXPpBrM3C93PHFdWDXbMX2vQ2AJQFFy"){
return \Yz::echoErrorJson('无权访问');
}
if(!$dates){
return \Yz::echoErrorJson('请选择日期');
}
$dates=$this->generateDateArray($dates[0],$dates[1]);
if(count($dates)>31){
return \Yz::echoErrorJson('最多只能选择31天');
}
$service=new FenZhenService();
$res=$service->export($dates);
return \Yz::Return($res['status'],$res['msg'],['url'=>$res['url']]);
}
public function GetFenZhenInfo_feiqi(){//废弃
ini_set('memory_limit', '256M');
$dates=request('dates');
$key=request('key');

@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\API\Internal;
use App\Http\Controllers\API\AspNetZhuanController;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class PersonController extends Controller
{
public function GetHzidAndGhzid(){
$id_number=request('id_number');
$key=request('key');
if($key <>"ddXPpBrM3C93PHFdWDXbMX2vQ2AJQFFy"){
return \Yz::echoError1('无权访问');
}
$person=DB::table('web_user_person')->where(['id_number'=>$id_number,'is_del'=>0])->first();
if($person){
$data = [
"ghzid" => $person->ghzid,
"yyid" => "6",
];
$hzid="";
$dnet = new AspNetZhuanController();
$res = $dnet->GetHzid($data);
if(isset($res['hzid'])){
$hzid=$res['hzid'];
}
return \Yz::Return(true,"查询完成",['hzid'=>$hzid,'ghzid'=>$person->ghzid]);
}else{
return \Yz::echoError1('该身份证号不存在');
}
}
}

@ -15,15 +15,17 @@ class PlanController extends Controller
$hospital_id =request('hospital');
$date=request('date');
$is_vip=request('is_vip');
$checkup_type_id=(string)request('checkup_type_id');//体检类型表对应id
$checkup_type_id= request('checkup_type_id');//体检类型表对应id
if(!isset($checkup_type_id)) return \Yz::echoError1("体检类型不能为空");
$currentDateTime = now();
$list=DB::table('plans')
->where('date',$date)->whereIn('status',[1])
->whereRaw('CONCAT(date, " ", time) >?', [$currentDateTime])
->whereNull('bind_work_unit_id')
->where(function($query) use ($checkup_type_id) {
$query->whereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', [$checkup_type_id])
->orWhereRaw('JSON_CONTAINS(checkup_type_id, ?, "$")', ["8"]);
foreach ($checkup_type_id as $id) {
$query->orWhereRaw('JSON_CONTAINS(checkup_type_id, CAST(? AS JSON), "$")', [$id]);
}
})
->where(['hospital_id'=>$hospital_id,'type'=>1,'is_del'=>0])
->where('is_vip','=',$is_vip);
@ -54,6 +56,15 @@ class PlanController extends Controller
$plan=DB::table('plans')->where('id',$id)->first();
if(!$plan) return \Yz::echoError1("该号源不存在");
if($plan->status<>2) return \Yz::echoError1("该号源未被占用,无需撤销");
$order=DB::table('orders')->where(['plan_id'=>$id,'status'=>2])->whereNull('source')->first();
if($order){
if($order->type ==1){
return \Yz::echoError1("该预约来自小程序,请顾客在小程序操作,或到号源后台取消订单");
}
if($order->type ==2){
return \Yz::echoError1("该预约来自小程序,请到号源后台取消订单");
}
}
$u=DB::table('plans')->where(['id'=>$id])->update(['status'=>1]);
if($u){
return \Yz::Return(true,'撤销占用成功',['id'=>$id]);

@ -33,7 +33,7 @@ class TransferCodeController extends Controller
//查询本地库是否有记录,进行相应的更新
$db_zk_code = DB::table('transfer_code')->where(['sanfang_qudao' => $qudao, 'code' => $code_num, 'is_del' => 0])->first();
if (!!$db_zk_code && $db_zk_code->status <> $res['data']['status']) {
return \Yz::echoError1("此转赠码状态不正确,暂不可用(中康)code:".$code_num);
return \Yz::echoErrorJson("此转赠码状态不正确,暂不可用(中康)code:".$code_num);
}
if (!$db_zk_code) {
$data = [
@ -47,13 +47,13 @@ class TransferCodeController extends Controller
}
}else{
return \Yz::echoError1("此转赠码不可用。码号为:".$code_num."请核对后再试");
return \Yz::echoErrorJson("此转赠码不可用。码号为:".$code_num."请核对后再试");
}
}
$code=$code->where('sanfang_qudao',$qudao);
}
$code=$code->where(['code'=>$code_num,'status'=>1,'is_del'=>0])->first();
if(!$code) return \Yz::echoError1("此转赠码不可用。码号为:".$code_num."请核对后再试");
if(!$code) return \Yz::echoErrorJson("此转赠码不可用。码号为:".$code_num."请核对后再试");
$u=DB::table('transfer_code')->where(['code'=>$code_num])->update([
'user_name'=>$user_name,
'user_id_number'=>$user_id_number,
@ -81,7 +81,7 @@ class TransferCodeController extends Controller
$qudao = $validatedData['qudao'];
$tj_num = request('tj_num');
$code_info=DB::table('transfer_code')->where(['code'=>$code_num,'is_del'=>0,'sanfang_qudao'=>$qudao])->first();
if(!$code_info) return \Yz::echoError1("此转赠码不存在");
if(!$code_info) return \Yz::echoErrorJson("此转赠码不存在");
$data=[];
$u=false;
$where=['code'=>$code_num,'is_del'=>0,'sanfang_qudao'=>$qudao];
@ -104,7 +104,7 @@ class TransferCodeController extends Controller
$service=new ZhongKangService();
$res=$service->HandleTransferCode($type,$code_num,$code_info->user_name,$code_info->user_id_number);
if (!$res['status']) {
return \Yz::echoError1( $res['msg']);
return \Yz::echoErrorJson( $res['msg']);
}
}
$u=DB::table('transfer_code')->where($where)->update($data);
@ -112,7 +112,7 @@ class TransferCodeController extends Controller
if($u){
return \Yz::Return(true,"操作成功",['code_num'=>$code_num,'status'=>$cha->status]);
}else{
return \Yz::echoError1("操作失败");
return \Yz::echoErrorJson("操作失败");
}
}
}

@ -7,8 +7,15 @@ use App\Http\Controllers\API\H5\PersonController;
use App\Http\Controllers\API\H5\PlanController;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller;
use DateInterval;
use DatePeriod;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class OrderController extends Controller
{
@ -492,6 +499,71 @@ class OrderController extends Controller
return \Yz::echoError1('操作失败');
}
}
public function export()
{
$dates=request('dates');
$key=request('key');
if($key <>"ddXPpBrM3C93PHFdWDXbMX2vQ2AJQFFy"){
return \Yz::echoErrorJson('无权访问');
}
if(!$dates){
return \Yz::echoErrorJson('请选择日期');
}
$table_list=DB::table('orders')->where(['source'=>'web'])->whereBetween('created_at',[$dates[0].' 00:00:00',$dates[1].' 23:59:59'])
->select(DB::raw("*, CASE WHEN sex = 1 THEN '男' WHEN sex = 2 THEN '女' ELSE '未知' END as sex"))
->get();
$status_array=[
1=>'未支付',
2=>'已支付',
3=>'已取消',
4=>'到检',
5=>'已退款',
];
foreach ($table_list as $list_item) {
$list_item->status=$status_array[$list_item->status];
}
$template_path = Storage::path('public/excel/hiszhuanzhen.xlsx');
$spreadsheet = IOFactory::load($template_path);
$worksheet = $spreadsheet->getActiveSheet();
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$row = 3;
$col = [
'A' => 'title',
'B' => 'name',
'C' => 'id_number',
'D' => 'price',
'E' => 'appdoctor',
'F' => 'phone',
'G' => 'sex',
'H' => 'appointment_date',
'I' => 'appointment_time',
'J' => 'status',
];
foreach ($table_list as $table_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_item->$key, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$file_name = Str::orderedUuid();
$dir_path = "public/excel/" . date('Ym') . '/' . $file_name;
Storage::makeDirectory($dir_path);
$name_date = date('n.j', strtotime($dates[1] . ' 00:00:00'));
$excel_path = $dir_path . "/His转诊$name_date.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save(Storage::path($excel_path));
$url = Storage::url($excel_path);
return ['status'=>true,'msg'=>'查询完成','url'=> env('APP_URL').$url];
}
public function item_check($hospital, $data)
{
$peis = new PEISApiController();
@ -511,4 +583,5 @@ class OrderController extends Controller
return $orderNumber;
}
}

@ -4,6 +4,7 @@ namespace App\Http\Controllers\H5;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller;
use App\Services\FenZhenService;
use DateInterval;
use DatePeriod;
use DateTime;
@ -320,260 +321,8 @@ class FenzhenController extends Controller
if(count($dates)>31){
return \Yz::echoError1('最多只能选择31天');
}
$table_list=[];
$clinic_list=[];
$table_list3=[];
$client = new Client();
$url = env('FENZHEN_URL');
$header=[
'Authorization' => 'Bearer BD30333C-CBD4-4BA3-A27C-76727FF4D8B1',
'Content-Type' => 'application/json; charset=utf-8',
];
$promises=[];
foreach ($dates as $date) {
$promises[]=$client->postAsync($url.'/api/Open/TiJian/export',['headers' => $header, 'json' => ['date'=>$date]]);
}
// 等待所有请求完成
$results = Promise\Utils::settle($promises)->wait();
foreach ($results as $key => $result) {
if ($result['state'] === 'fulfilled') {
$response = $result['value'];
$res=json_decode($response->getBody(),true);
// echo "Response from $key: " . $response->getBody() . "\n";
$table_list = array_merge($table_list, $res['data']['table1'] ?? []);
$clinic_list = array_merge($clinic_list, $res['data']['table2'] ?? []);
$table_list3 = array_merge($table_list3, $res['data']['table3'] ?? []);
}
}
// foreach ($dates as $date) {
// $res = $fzc->fz('export', [
// 'date' => $date
// ]);
//
// // 使用 array_merge 逐个追加每日期的数据到总列表中
// $table_list = array_merge($table_list, $res['data']['table1'] ?? []);
// $clinic_list = array_merge($clinic_list, $res['data']['table2'] ?? []);
// $table_list3 = array_merge($table_list3, $res['data']['table3'] ?? []);
// }
$template_path = Storage::path('public/excel/check_time.xlsx');
$spreadsheet = IOFactory::load($template_path);
$worksheet = $spreadsheet->getActiveSheet();
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$row = 3;
$col = [
'A' => 'date',
'B' => 'name',
'C' => 'number',
'D' => 'phone',
'E' => 'group_name',
'F' => 'clinic',
'G' => 'doctor',
'H' => 'queue',
'I' => 'calling',
'J' => 'done',
'K' => 'clinic_check_time',
'L' => 'true_check_time',
'M' => 'timeout_check_time',
'N' => 'clinic_wait_time',
'O' => 'true_wait_time',
'P' => 'timeout_wait_time',
'Q' => 'clinic_all_time',
'R' => 'true_all_time',
'S' => 'timeout_all_time',
];
foreach ($table_list as $table_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('A3:S' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'U' => 'group_name',
'V' => 'clinic',
'W' => 'doctor',
'X' => 'check',
'Y' => 'check_out',
'Z' => 'wait',
'AA' => 'wait_out',
];
foreach ($clinic_list as $clinic_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $clinic_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('U3:AA' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'AC' => 'date',
'AD' => 'name',
'AE' => 'number',
'AF' => 'phone',
'AG' => 'combo',
'AH' => 'clinic_time',
'AI' => 'used_time',
'AJ' => 'timeout',
];
//汇总信息
$usercount=count($table_list3);
$biaozhun_timecount=0;
$shiji_timecount=0;
$chaoshi_timecount=0;
$weichaoshi_count=0;
$tj_numbers=[];
$peis = new PEISApiController();
foreach ($table_list3 as $table_list3_i) {
$tj_numbers[]=$table_list3_i['uuid'];
$biaozhun_timecount+=$table_list3_i['clinic_time'];
$shiji_timecount+=$table_list3_i['used_time'];
$chaoshi_timecount+=$table_list3_i['timeout'];
if($table_list3_i['timeout']<=0){
$weichaoshi_count++;
}
$data = [
'电话号码' => "",
'证件号码' => "",
'体检号' => $table_list3_i['uuid'],
'包含内部信息' => true
];
$reports = $peis::Post('体检报告查询', 1, $data);
if(isset($reports['data'][0]['套餐名称'])){
$table_list3_i['combo']=$reports['data'][0]['套餐名称'];
}else{
$table_list3_i['combo']='';
}
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_list3_i[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$zhushilv=0;
if($usercount>0){
$zhushilv=$weichaoshi_count/$usercount;
}
$worksheet->setCellValueExplicit('AC' . $row, '汇总', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AD' . $row, '客户总数', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . $row, $usercount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AG' . $row, '总用时:', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AH' . $row, $biaozhun_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AI' . $row, $shiji_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AJ' . $row, $chaoshi_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AD' . ($row+1), '未超时总数', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . ($row+1), $weichaoshi_count, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AD' . ($row+2), "体检准时率", \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . ($row+2),$zhushilv , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AC3:AJ' . ($row +2))->applyFromArray($styleArray);
//准时到检率
$jianhou_sign_count=0;
$zhunshi_count=0;
$tj_numbers_group= array_chunk($tj_numbers, 100);
$waitGroup=[];
foreach ($tj_numbers_group as $index => $tj_number) {
$tj_number=implode(",", $tj_number);
$wait=$peis::Get($peis::Api('报告时间计算',$tj_number),'460107000001',"报告时间计算");
if(isset($wait['Data'])){
$jianhou_sign_count=$jianhou_sign_count+count($wait['Data']);
$waitGroup=array_merge($waitGroup,$wait['Data']);
}
}
//dd($wait);
foreach ($table_list3 as $key=> $fz_value) {
foreach ($waitGroup as $index => $sx_value) {
if($fz_value['uuid']==$sx_value['体检号']){
if($fz_value['date'].' '.$fz_value['end_time']>$sx_value['检后签到时间']){
$zhunshi_count++;
}
}
}
}
$daojianlv=0;
if($jianhou_sign_count>0){
$daojianlv=$zhunshi_count/$jianhou_sign_count;
}
$datesRange=$dates[0].'~'.$dates[count($dates) - 1];
$worksheet->setCellValueExplicit('AL' . 3,$datesRange, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AM' . 3,$zhunshi_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AN' . 3,$jianhou_sign_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 3,round($daojianlv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AL3:AO' . 3)->applyFromArray($styleArray);
//预约率
$yyl_yuyue_count=0;//预约人数
$yyl_tj_count=0;//体检总人数
$yuyuelv=0;
$yuyueList=DB::table('orders')->whereIn('appointment_date',$dates)->whereIn('status',[2,4])->whereNotNull(['appointment_number'])->get();
$yyl_yuyue_count=count($yuyueList);
$yyl_tj_count=$usercount;
if($yyl_tj_count>0){
$yuyuelv=$yyl_yuyue_count/$yyl_tj_count;
}
$worksheet->setCellValueExplicit('AL' . 7,$datesRange , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AM' . 7,$yyl_yuyue_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AN' . 7,$yyl_tj_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 7,round($yuyuelv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AL7:AO' . 7)->applyFromArray($styleArray);
//预约准时率
$yyzsl_ren_count=0;//预约准时到达人数
$yyzsl_zong_count=0;//预约总人数
$yyzsl_zong_count=$yyl_yuyue_count;
foreach ($yuyueList as $key=> $yy_value) {
if($yy_value->appointment_date.' '.$yy_value->appointment_time > $yy_value->check_time){
$yyzsl_ren_count++;
}
}
$zhunshilv=0;
if($yyzsl_zong_count>0){
$zhunshilv=$yyzsl_ren_count/$yyzsl_zong_count;
}
$worksheet->setCellValueExplicit('AL' . 11,$datesRange , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AM' . 11,$yyzsl_ren_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AN' . 11,$yyzsl_zong_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 11,round($zhunshilv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AL11:AO' . 11)->applyFromArray($styleArray);
//新建Sheet2
// $worksheet2 = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'Sheet2');
// $spreadsheet->addSheet($worksheet2);
// $worksheet2->setCellValue('A1', 'Foo');
// $worksheet2->setCellValue('B1', 'Bar');
$file_name = Str::orderedUuid();
$dir_path = "public/excel/" . date('Ym') . '/' . $file_name;
Storage::makeDirectory($dir_path);
$name_date = date('n.j', strtotime($date . ' 00:00:00'));
$excel_path = $dir_path . "/体检报表-时间监控$name_date.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save(Storage::path($excel_path));
$url = Storage::url($excel_path);
return \Yz::Return(true,"获取成功",['url' => env('APP_URL').$url]);
$service=new FenZhenService();
$res=$service->export($dates);
return \Yz::Return($res['status'],$res['msg'],['url'=>$res['url']]);
}
}

@ -16,14 +16,14 @@ class TestController extends Controller
{
public function DBtest(){
//微信推送
$peis = new PEISApiController();
$data = [
"ghzid" => "b3346cd4d63b49a58dbd9a41d69efde2",
"yyid" => "6",
'电话号码' => "",
'证件号码' => "130321199502212117"
];
$dnet = new AspNetZhuanController();
$res = $dnet->GetHzid($data);
dd($res);
$reports = $peis::Post('团检登记查询', 1, $data);
dd($reports);
// echo DB::table('users')->count();
// $dnet = new AspNetZhuanController();

@ -20,6 +20,14 @@ class Yz{
$result['data']=$data;
return response()->json($result)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
public static function echoErrorJson($msg,$data=null){
$result=array();
$result['status']=false;
$result['msg']=$msg;
$result['data']= null;
return response()->json($result)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
public static function Return($status,$msg,$data=[]){
$result=array();

@ -31,7 +31,7 @@ class ComboItemGroupService
if($combo['可选']===false){//如果可选为false,则删除
DB::table('combos')->where(['combo_id' => $combo['Id']])->delete();
DB::table('combo_items')->where(['combo_id' => $combo['Id']])->delete();
return \Yz::echoError1('删除成功');
continue;
}
$item = [];
foreach ($combo['包含项目'] as $key => $v) {
@ -85,6 +85,11 @@ class ComboItemGroupService
}
$db_combo = DB::table('combos')->where(['combo_id' => $combo['Id']])->first();
$crowd_name='';
if(json_decode($combo['备注'], JSON_UNESCAPED_UNICODE)){
$beizhu=json_decode($combo['备注'], JSON_UNESCAPED_UNICODE);
$crowd_name=isset($beizhu['适用人群'])?$beizhu['适用人群']:'';
}
$comboData = [
'combo_id' => $combo['Id'],
'sex' => $sex,
@ -94,6 +99,8 @@ class ComboItemGroupService
'price' => $combo['价格'],
'items' => $item,
'item_count' => $combo['项目数量'],
'type_name' => $combo['标签名称'],
'crowd_name' =>$crowd_name,
'duo_xuan_yi'=>json_encode($combo['包含多选一组'], JSON_UNESCAPED_UNICODE),
'keyue_start_time' => $combo['可约开始时间'],
'keyue_end_time' => $combo['可约截止时间'],

@ -0,0 +1,340 @@
<?php
namespace App\Services;
use App\Http\Controllers\API\PEISApiController;
use Carbon\Carbon;
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class FenZhenService
{
public function export($dates){
ini_set('memory_limit', '512M');
$table_list=[];
$clinic_list=[];
$table_list3=[];
$client = new Client();
$url = env('FENZHEN_URL');
$header=[
'Authorization' => 'Bearer BD30333C-CBD4-4BA3-A27C-76727FF4D8B1',
'Content-Type' => 'application/json; charset=utf-8',
];
$api_dates=[];
$promises=[];
foreach ($dates as $date) {
//遍历缓存,如果没有则请求接口,否则直接读取缓存文件
$fileFound = $this->findFilesByDate($date);
if ($fileFound !== null) {
$fileContent = Storage::get($fileFound);
$dataArray = json_decode($fileContent, true);
$table_list = array_merge($table_list, $dataArray['data']['table1'] ?? []);
$clinic_list = array_merge($clinic_list, $dataArray['data']['table2'] ?? []);
$table_list3 = array_merge($table_list3, $dataArray['data']['table3'] ?? []);
}else{
$api_dates[]=$date;
$promises[]=$client->postAsync($url.'/api/Open/TiJian/export',['headers' => $header, 'json' => ['date'=>$date]]);
}
}
$all_request_status=true;//所有接口请求状态
// 等待所有请求完成
$results = Promise\Utils::settle($promises)->wait();
foreach ($results as $key => $result) {
if ($result['state'] === 'fulfilled') {
Log::info('请求接口'.$api_dates[$key]);
$response = $result['value'];
$responseBody=(string) $response->getBody();
//把接口请求成功的缓存到本地txt
$txtName=$api_dates[$key].'created_at'.date('Y-m-d H:m:s');
$TxtfilePath = 'fenzhen_tongji_temp/'.$txtName.'.txt';
Storage::put($TxtfilePath, $responseBody);
$res=json_decode($responseBody,true);
// echo "Response from $key: " . $response->getBody() . "\n";
$table_list = array_merge($table_list, $res['data']['table1'] ?? []);
$clinic_list = array_merge($clinic_list, $res['data']['table2'] ?? []);
$table_list3 = array_merge($table_list3, $res['data']['table3'] ?? []);
}else{
$all_request_status=false;
Log::info("Request failed with key: $key, reason: " . $result['reason']->getMessage());
}
}
if($all_request_status===false){
return ['status'=>false,'msg'=>'部分请求失败,请重新尝试','url'=>''];
}
foreach ($table_list as $key=> $table_item) { //匹配$table_list3获取体检号
foreach ($table_list3 as $table_item3) {
if($table_item['name']==$table_item3['name'] and $table_item['phone']==$table_item3['phone']){
$table_list[$key]['tj_number']=$table_item3['uuid'];
break;
}else{
$table_list[$key]['tj_number']="";
}
}
}
// foreach ($dates as $date) {
// $res = $fzc->fz('export', [
// 'date' => $date
// ]);
//
// // 使用 array_merge 逐个追加每日期的数据到总列表中
// $table_list = array_merge($table_list, $res['data']['table1'] ?? []);
// $clinic_list = array_merge($clinic_list, $res['data']['table2'] ?? []);
// $table_list3 = array_merge($table_list3, $res['data']['table3'] ?? []);
// }
$template_path = Storage::path('public/excel/check_time.xlsx');
$spreadsheet = IOFactory::load($template_path);
$worksheet = $spreadsheet->getActiveSheet();
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$row = 3;
$col = [
'A' => 'date',
'B' => 'name',
'C' => 'number',
'D' => 'tj_number', // 新增列
'E' => 'phone', // 原 phone 列往后移动
'F' => 'group_name',
'G' => 'clinic',
'H' => 'doctor',
'I' => 'queue',
'J' => 'calling',
'K' => 'done',
'L' => 'clinic_check_time',
'M' => 'true_check_time',
'N' => 'timeout_check_time',
'O' => 'clinic_wait_time',
'P' => 'true_wait_time',
'Q' => 'timeout_wait_time',
'R' => 'clinic_all_time',
'S' => 'true_all_time',
'T' => 'timeout_all_time',
];
foreach ($table_list as $table_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('A3:T' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'V' => 'group_name',
'W' => 'clinic',
'X' => 'doctor',
'Y' => 'check',
'Z' => 'check_out',
'AA' => 'wait',
'AB' => 'wait_out',
];
foreach ($clinic_list as $clinic_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $clinic_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('V3:AB' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'AD' => 'date',
'AE' => 'name',
'AF' => 'number',
'AG' => 'uuid',
'AH' => 'phone',
'AI' => 'combo',
'AJ' => 'clinic_time',
'AK' => 'used_time',
'AL' => 'timeout',
];
//汇总信息
$usercount=count($table_list3);
$biaozhun_timecount=0;
$shiji_timecount=0;
$chaoshi_timecount=0;
$weichaoshi_count=0;
$tj_numbers=[];
$peis = new PEISApiController();
foreach ($table_list3 as $table_list3_i) {
$tj_numbers[]=$table_list3_i['uuid'];
$biaozhun_timecount+=$table_list3_i['clinic_time'];
$shiji_timecount+=$table_list3_i['used_time'];
$chaoshi_timecount+=$table_list3_i['timeout'];
if($table_list3_i['timeout']<=0){
$weichaoshi_count++;
}
$data = [
'电话号码' => "",
'证件号码' => "",
'体检号' => $table_list3_i['uuid'],
'包含内部信息' => true
];
$reports = $peis::Post('体检报告查询', 1, $data);
if(isset($reports['data'][0]['套餐名称'])){
$table_list3_i['combo']=$reports['data'][0]['套餐名称'];
}else{
$table_list3_i['combo']='';
}
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_list3_i[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$zhushilv=0;
if($usercount>0){
$zhushilv=$weichaoshi_count/$usercount;
}
$worksheet->setCellValueExplicit('AD' . $row, '汇总', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . $row, '客户总数', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AF' . $row, $usercount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AH' . $row, '总用时:', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AJ' . $row, $biaozhun_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AK' . $row, $shiji_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AL' . $row, $chaoshi_timecount, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . ($row+1), '未超时总数', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AF' . ($row+1), $weichaoshi_count, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AE' . ($row+2), "体检准时率", \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AF' . ($row+2),$zhushilv , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AD3:AL' . ($row +2))->applyFromArray($styleArray);
//准时到检率
$jianhou_sign_count=0;
$zhunshi_count=0;
$tj_numbers_group= array_chunk($tj_numbers, 100);
$waitGroup=[];
foreach ($tj_numbers_group as $index => $tj_number) {
$tj_number=implode(",", $tj_number);
$wait=$peis::Get($peis::Api('报告时间计算',$tj_number),'460107000001',"报告时间计算");
if(isset($wait['Data'])){
$jianhou_sign_count=$jianhou_sign_count+count($wait['Data']);
$waitGroup=array_merge($waitGroup,$wait['Data']);
}
}
//dd($wait);
foreach ($table_list3 as $key=> $fz_value) {
foreach ($waitGroup as $index => $sx_value) {
if($fz_value['uuid']==$sx_value['体检号']){
if($fz_value['date'].' '.$fz_value['end_time']>$sx_value['检后签到时间']){
$zhunshi_count++;
}
}
}
}
$daojianlv=0;
if($jianhou_sign_count>0){
$daojianlv=$zhunshi_count/$jianhou_sign_count;
}
$datesRange=$dates[0].'~'.$dates[count($dates) - 1];
$worksheet->setCellValueExplicit('AN' . 3,$datesRange, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 3,$zhunshi_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AP' . 3,$jianhou_sign_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AQ' . 3,round($daojianlv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AN3:AQ' . 3)->applyFromArray($styleArray);
//预约率
$yyl_yuyue_count=0;//预约人数
$yyl_tj_count=0;//体检总人数
$yuyuelv=0;
$yuyueList=DB::table('orders')->whereIn('appointment_date',$dates)->whereIn('status',[2,4])->whereNotNull(['appointment_number'])->get();
$yyl_yuyue_count=count($yuyueList);
$yyl_tj_count=$usercount;
if($yyl_tj_count>0){
$yuyuelv=$yyl_yuyue_count/$yyl_tj_count;
}
$worksheet->setCellValueExplicit('AN' . 7,$datesRange , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 7,$yyl_yuyue_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AP' . 7,$yyl_tj_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AQ' . 7,round($yuyuelv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AN7:AQ' . 7)->applyFromArray($styleArray);
//预约准时率
$yyzsl_ren_count=0;//预约准时到达人数
$yyzsl_zong_count=0;//预约总人数
$yyzsl_zong_count=$yyl_yuyue_count;
foreach ($yuyueList as $key=> $yy_value) {
if($yy_value->appointment_date.' '.$yy_value->appointment_time > $yy_value->check_time){
$yyzsl_ren_count++;
}
}
$zhunshilv=0;
if($yyzsl_zong_count>0){
$zhunshilv=$yyzsl_ren_count/$yyzsl_zong_count;
}
$worksheet->setCellValueExplicit('AN' . 11,$datesRange , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AO' . 11,$yyzsl_ren_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AP' . 11,$yyzsl_zong_count , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->setCellValueExplicit('AQ' . 11,round($zhunshilv, 2) , \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
$worksheet->getStyle('AN11:AQ' . 11)->applyFromArray($styleArray);
//新建Sheet2
// $worksheet2 = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, 'Sheet2');
// $spreadsheet->addSheet($worksheet2);
// $worksheet2->setCellValue('A1', 'Foo');
// $worksheet2->setCellValue('B1', 'Bar');
$file_name = Str::orderedUuid();
$dir_path = "public/excel/" . date('Ym') . '/' . $file_name;
Storage::makeDirectory($dir_path);
$name_date = date('n.j', strtotime($date . ' 00:00:00'));
$excel_path = $dir_path . "/体检报表-时间监控$name_date.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save(Storage::path($excel_path));
$url = Storage::url($excel_path);
return ['status'=>true,'msg'=>'查询完成','url'=> env('APP_URL').$url];
}
function findFilesByDate($datePart, $basePath = 'fenzhen_tongji_temp')
{
// 获取今天的日期格式与文件中的一致
$todayFormatted = Carbon::today()->format('Y-m-d');
// 遍历指定路径下的所有文件
$files = Storage::files($basePath);
foreach ($files as $file) {
// 使用 basename 获取文件名
$fileName = basename($file);
// 检查文件名是否匹配给定的模式
if (preg_match('/^(.+?)created_at(\d{4}-\d{2}-\d{2}).+\.txt$/', $fileName, $matches)) {
list(, $namePart, $createdAtDate) = $matches;
// 如果日期部分和创建日期符合条件,则返回该文件
if ($namePart === $datePart && $createdAtDate === $todayFormatted) {
return $file; // 返回找到的文件路径
}
}
}
// 如果没有找到任何符合条件的文件,返回 null 或其他信息
return null;
}
}

@ -10,8 +10,7 @@ class NmrService
// 根据时间查询二线可用号源区分上下午二线需预约体检时间1小时后
$AspNet = new AspNetZhuanController();
$nmrPlans=$AspNet::ErXian(['yyid'=>6,'data'=>[$date],'action'=>"1"],uniqid());
if($time<="12:00") $end_time="12:00";
if($time>"12:00") $end_time="23:59";
$end_time="23:59";
if(!isset($nmrPlans[$date]) or empty($nmrPlans[$date])) return ['status'=>false,'datetime'=>''];
$planTime = new DateTime($time);
$planTime->modify('+1 hour');

@ -6,6 +6,7 @@ use App\Http\Controllers\API\H5\OrderController;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\API\XCXApiController;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class OrderService
{
@ -60,6 +61,20 @@ class OrderService
$combo_items=DB::table('combo_items')->where(['combo_id'=>$buy_info['combo']['id'],'status'=>1])->get();
foreach($combo_items as $item){
if(!in_array((string)$item->keshi_id,$drop_ids)){
if($item->keshi_id==711){
if($order->sex==1){
$item->keshi_id=526;
$item->keshi_name='外科';
}
if($order->sex==2){
$item->keshi_id=570;
$item->keshi_name='内科';
}
}
if($item->keshi_id==695 or $item->keshi_id==559){
$item->keshi_id=532;
$item->keshi_name='妇科';
}
$list[]=[
'item_id'=>$item->item_id,
'keshi_name'=>$item->keshi_name,
@ -75,6 +90,20 @@ class OrderService
}
$itemsInfo=DB::table('items')->whereIn('item_id',$item_ids)->get();
foreach($itemsInfo as $item){
if($item->keshi_id==711){
if($order->sex==1){
$item->keshi_id=526;
$item->keshi_name='外科';
}
if($order->sex==2){
$item->keshi_id=570;
$item->keshi_name='内科';
}
}
if($item->keshi_id==695 or $item->keshi_id==559){
$item->keshi_id=532;
$item->keshi_name='妇科';
}
$list[]=[
'item_id'=>$item->item_id,
'keshi_name'=>$item->keshi_name,
@ -89,12 +118,29 @@ class OrderService
}
$itemsInfo=DB::table('items')->whereIn('item_id',$item_ids)->get();
foreach($itemsInfo as $item){
if(!in_array((string)$item->keshi_id,$drop_ids)){
if($item->keshi_id==711){
if($order->sex==1){
$item->keshi_id=526;
$item->keshi_name='外科';
}
if($order->sex==2){
$item->keshi_id=570;
$item->keshi_name='内科';
}
}
if($item->keshi_id==695 or $item->keshi_id==559){
$item->keshi_id=532;
$item->keshi_name='妇科';
}
$list[]=[
'item_id'=>$item->item_id,
'keshi_name'=>$item->keshi_name,
'keshi_id'=>$item->keshi_id,
];
}
}
}
$groupedData = [];
foreach ($list as $key => $item) {
@ -116,6 +162,7 @@ class OrderService
return ['department_list'=>$de_list,'wait_day'=>$wait_day,'is_checked_sign_in'=>$is_checked_sign_in];
}
public function Cancel($orderInfo)
{
$person=DB::table('web_user_person')->where(['id' => $orderInfo->person_id])->first();

@ -13,7 +13,9 @@ return [
'Wj_ZheKou'=>1,//问卷带出项目,折扣率
'ZiXuan_ZheKou'=>0.8,//自选项目折扣
'erxian_kuadu'=>3,//二线时间跨度,单位天
'KeShiPaiXu'=>["预检咨询","体格检查","人体成分","呼气试验","采血室(化验)","内科","妇科","妇科(化验)","妇科(病理)","婚前医学检查","外科","眼科","耳鼻喉科","肺功能室","口腔科","骨密度室","CT室","影像科","住院体检","胃肠镜室"]
'plan_lock_time'=>10,//先选号源,号源锁定时长,超过时长未预约 进行释放,单位分钟
'KeShiPaiXu'=>["预检咨询","体格检查","人体成分","呼气试验","采血室(化验)","内科","妇科","妇科(化验)","妇科(病理)","婚前医学检查","外科","外科(化验)","眼科","耳鼻喉科","肺功能室","口腔科","超声科","骨密度室","CT室","影像科","住院体检","胃肠镜室"],
'KeShiTypePaiXu'=>["预检","检查","检验","病理","超声","影像"]
],
/*

@ -816,6 +816,7 @@
for (let i in select_data_default) {
select_data.value[i] = query[i] || select_data_default[i];
}
};
const item_table_ref = ref(false);
const select_table_computed = computed(() => {
@ -1020,6 +1021,7 @@
hospital: input_data.value.hospital,
openid: "",
person_id: "",
combo_id:select_data.value.combo,
person_sex:input_data.value.gender,
date: plan_data.value.date,
use_type: 1,
@ -1118,6 +1120,8 @@
}
onMounted(() => {
getQueryData();
if(input_data.value.hospital == '6') input_data.value.hospital = '1'
if(input_data.value.hospital == '2') input_data.value.hospital = '4'
getItemGetList();
// getPlanList();
});

@ -77,6 +77,7 @@ Route::group(['middleware' => ['checktoken', 'log'], 'prefix' => 'v1'], function
Route::post('admin/CalendarListDel', 'App\Http\Controllers\API\Admin\YeWu\healthCalendarController@Del'); //admin后台删除日历
Route::post('admin/CalendarChangeInfo', 'App\Http\Controllers\API\Admin\YeWu\healthCalendarController@ChangeInfo'); //admin后台更新日历
Route::post('admin/PlanTypeGetList', 'App\Http\Controllers\API\Admin\YeWu\PlanTypeController@GetList');//号源类型列表
Route::post('admin/PlanTypeGetEnableList', 'App\Http\Controllers\API\Admin\YeWu\PlanTypeController@GetEnableList');//号源类型可用列表
Route::post('admin/PlanTypeSave', 'App\Http\Controllers\API\Admin\YeWu\PlanTypeController@Save');//号源类型保存
Route::post('admin/PlanTypeGetDetail', 'App\Http\Controllers\API\Admin\YeWu\PlanTypeController@GetDetail');//号源类型详情
Route::post('admin/PlanTypeDel', 'App\Http\Controllers\API\Admin\YeWu\PlanTypeController@Del');//号源类型删除
@ -92,6 +93,8 @@ Route::group(['middleware' => ['checktoken', 'log'], 'prefix' => 'v1'], function
Route::post('admin/PlanSave', 'App\Http\Controllers\API\Admin\YeWu\PlanController@Save');//保存号源详情
Route::post('admin/PlanDel', 'App\Http\Controllers\API\Admin\YeWu\PlanController@Del');//
Route::post('admin/PlanBatchUpdatePlanType', 'App\Http\Controllers\API\Admin\YeWu\PlanController@BatchUpdatePlanType');//保存号源详情
Route::post('admin/GetPlanTypeTJ', 'App\Http\Controllers\API\Admin\YeWu\PlanController@GetPlanTypeTJ');//号源类型使用统计
Route::post('admin/ExportPlanTypeTJ', 'App\Http\Controllers\API\Admin\YeWu\PlanController@ExportPlanTypeTJ');//导出号源类型使用统计
Route::post('admin/PlanListGetList', 'App\Http\Controllers\API\Admin\YeWu\PlanListController@GetList');//号源列表的列表
Route::post('admin/ComboGetList', 'App\Http\Controllers\API\Admin\YeWu\ComboController@GetList');//获取套餐列表

@ -63,6 +63,7 @@ Route::group(['middleware' => ['log'],'prefix' => 'api/H5'], function () {
Route::post('/GetReportJieLunJianYi', 'App\Http\Controllers\API\H5\ReportController@GetReportJieLunJianYi');//获取报告结论建议页面数据
Route::post('/GetReportDetaiList', 'App\Http\Controllers\API\H5\ReportController@GetReportDetaiList');//完整报告中的列表
Route::post('/GetReportDetai', 'App\Http\Controllers\API\H5\ReportController@GetReportDetai');//完整报告某项详情
Route::post('/GetReportDetai2', 'App\Http\Controllers\API\H5\ReportController@GetReportDetai2');//完整报告某项详情
Route::post('/StartPay', 'App\Http\Controllers\API\H5\PayController@StartPay');//开始支付接口
Route::post('/CheckPay', 'App\Http\Controllers\API\H5\PayController@CheckPay');//支付结果查询接口
Route::post('/Refund', 'App\Http\Controllers\API\H5\PayController@Refund');//退款
@ -121,15 +122,18 @@ Route::any('/GetH5Order', 'App\Http\Controllers\API\Internal\OrderController@Get
Route::any('/PlanList', 'App\Http\Controllers\API\Internal\PlanController@PlanList')->middleware('log');//获取可用号源列表
Route::any('/UsePlan', 'App\Http\Controllers\API\Internal\PlanController@UsePlan')->middleware('log');//占用号源
Route::any('/CancelUsePlan', 'App\Http\Controllers\API\Internal\PlanController@CancelUsePlan')->middleware('log');//取消占用号源
Route::any('/GetFenZhenInfo', 'App\Http\Controllers\API\Internal\FenZhenController@GetFenZhenInfo');//获取分诊统计数据
Route::any('/GetFenZhenInfo', 'App\Http\Controllers\API\Internal\FenZhenController@GetFenZhenInfo')->middleware('log');//获取分诊统计数据
Route::any('/GetHzidAndGhzid', 'App\Http\Controllers\API\Internal\PersonController@GetHzidAndGhzid');//获取用户hzid和GHzid
Route::any('GetZhuanZhenInfo', 'App\Http\Controllers\API\Web\OrderController@export')->middleware('log');//导出医生预约订单
Route::post('/RoundPayCheck', 'App\Http\Controllers\API\H5\OrderController@RoundPayCheck');//轮询支付检查
Route::post('/Day1WXSend', 'App\Http\Controllers\API\H5\OrderController@Day1WXSend');//提前1天微信通知
Route::post('/Day1WXSend', 'App\Http\Controllers\API\H5\OrderController@Day1WXSend')->middleware('log');//提前1天微信通知
Route::post('/AutoRefund', 'App\Http\Controllers\API\H5\PayController@AutoRefund')->middleware('log');//对外退款接口
Route::any('api/FenzhenInfoExport', 'App\Http\Controllers\H5\FenzhenController@export')->middleware('log');//导出报表
Route::any('api/FenzhenInfoExport2', 'App\Http\Controllers\H5\FenzhenController@export2')->middleware('log');//导出报表
Route::any('/GetTransferCode', 'App\Http\Controllers\API\Internal\TransferCodeController@GetTransferCode')->middleware('log');//查询转赠码
Route::any('/HandleTransferCode', 'App\Http\Controllers\API\Internal\TransferCodeController@HandleTransferCode')->middleware('log');//查询转赠码

@ -116,6 +116,9 @@ export const GetLogTableName = (data = {}) => {
export const PlanTypeGetList = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/PlanTypeGetList', data: data })
}
export const PlanTypeGetEnableList = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/PlanTypeGetEnableList', data: data })
}
//可用体检类型列表
export const CheckUpTypeGetEnableList = (data = {}) => {
return axios({
@ -179,6 +182,14 @@ export const PlanDel = (data = {}) => {
export const PlanBatchUpdatePlanType = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/PlanBatchUpdatePlanType', data: data })
}
//号源类型使用统计
export const GetPlanTypeTJ = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/GetPlanTypeTJ', data: data })
}
//号源类型使用统计导出
export const ExportPlanTypeTJ = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/ExportPlanTypeTJ', data: data })
}
//获取套餐列表
export const ComboGetList = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/ComboGetList', data: data })

@ -19,8 +19,14 @@
</el-row>
</div>
</div>
<div style="display: flex;">
<div style="display: flex;align-items: center;">
<div class="status_zhengchang shili" >空余</div><div class="plan_block shili">预留</div><div class="status_zhanyong shili">已占用</div><div class="status_tingyong shili">停用</div>
<el-select :filterable="true" clearable @change="PlanTypeChange()" v-model="searchInfo.plan_type" placeholder="号源类型(全部)" style="margin-left: 20px;">
<el-option v-for="(item,index) in PlanTypeList" :label="item.name"
:value="item.id" />
</el-select>
<div style="font-size: 14px;color: 333;margin-left: 8px;">已经使用<span style="font-weight: 700;color: chocolate;">{{used_count}}</span> 剩余<span style="font-weight: 700; color:#30ccaa;">{{unused_count}}</span></div>
<div><el-button type="primary" size="small" @click="TongjiClick()" style="margin-left: 10px;">统计全部</el-button></div>
</div>
<div style="display: flex;justify-content: space-around; flex-wrap: wrap;" v-loading="loading">
<div :class="itemClasses(item)" v-for="(item,index) in list" :key="index" @click="TimeListClick(item,index)">
@ -98,7 +104,27 @@
</span>
</template>
</el-dialog>
<el-dialog v-model="TongJiDialogVisible" title="号源类型统计">
<div >
<div>
<el-button type="primary" @click="ExportPlanTypeTJFunc()" style="margin-bottom: 8px;">
导出
</el-button>
</div>
<el-table :data="PlanTypeTJList" style="width: 100%;" v-loading="loading">
<el-table-column prop="" label="类型">
<template #default="scope">
<span v-if="scope.row.name">{{scope.row.name}} </span>
<span v-else> </span>
</template>
</el-table-column>
<el-table-column prop="count" label="总数" />
<el-table-column prop="used_count" label="使用数" />
<el-table-column prop="unused_count" label="剩余数量" />
</el-table>
</div>
</el-dialog>
</div>
</template>
@ -117,7 +143,10 @@
CheckUpTypeGetEnableList,
PlanSave,
PlanBatchUpdatePlanType,
PlanDel
PlanDel,
PlanTypeGetEnableList,
GetPlanTypeTJ,
ExportPlanTypeTJ
} from '@/api/api.js'
import {
useRoute,
@ -128,6 +157,8 @@
let loading = ref(false)
let searchInfo = ref({})
let list = ref([]);
let unused_count=ref(0);
let used_count=ref(0);
const GetList = () => {
loading.value = true
PlanGetList({
@ -136,6 +167,8 @@
loading.value = false
if (res.status) {
list.value = res.data.list
unused_count.value=res.data.unused_count
used_count.value=res.data.used_count
searchInfo.value.date=res.data.date
} else {
ElMessage.error(res.msg)
@ -286,8 +319,53 @@
}
})
}
let PlanTypeList=ref([]);
const GetPlanTypeList = () => {
loading.value = true
PlanTypeGetEnableList().then(res => {
loading.value = false
if (res.status) {
PlanTypeList.value=res.data.list
} else {
ElMessage.error(res.msg)
}
})
}
const PlanTypeChange=()=>{
GetList()
}
let TongJiDialogVisible=ref(false);
let PlanTypeTJList=ref([])
const TongjiClick=()=>{
TongJiDialogVisible.value=true
loading.value = true
GetPlanTypeTJ({date:searchInfo.value.date}).then(res => {
loading.value = false
if (res.status) {
PlanTypeTJList.value=res.data.list
} else {
ElMessage.error(res.msg)
}
})
}
const ExportPlanTypeTJFunc=()=>{
loading.value = true
ExportPlanTypeTJ({date:searchInfo.value.date}).then(res => {
loading.value = false
if (res.status) {
const a = document.createElement('a');
a.style.display = 'none';
a.href = res.url;
document.body.appendChild(a);
a.click();
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
searchInfo.value.date=route.query.date
GetPlanTypeList()
GetList()
})
</script>

@ -386,6 +386,8 @@
CreatPlanDialogVisible.value = true
CPlan.value.name=row.name
CPlan.value.model_id=row.id
CPlan.value.workday_create=1
CPlan.value.holiday_create=1
success_daterange.value=[];
}
const CPanCheckAll=()=>{//

@ -42,7 +42,7 @@
<el-input v-model="UserInfo.cname" />
</el-form-item>
<el-form-item label="账号">
<el-input v-model="UserInfo.uname" disabled/>
<el-input v-model="UserInfo.uname" />
</el-form-item>
<el-form-item label="状态">
<el-switch v-model="UserInfo.status" size="large" active-text="" inactive-text=""

@ -21,7 +21,7 @@ function HunJianOrderReFund($order_id)
function HunJianOrderCheck()
{
$db = Db::get();
$hunjian_check= $db->getRow("select * from orders where checkup_type_id = 4
$hunjian_check= $db->getRow("select * from orders where checkup_type_id = 4 and (title='男性免费婚检' or title='女性免费婚检')
and status = 2
and appointment_number is not null
and hunjian_status=0

@ -0,0 +1,38 @@
<?php
namespace Workerman\Lib;
use Workerman\Worker;
$bot_loop = new Worker();
$bot_loop->count = 1;
$bot_loop->name = 'PlanUnlock';
function PlanUnlock($plan_id)
{
Tool::log('开始执行号源解锁任务', 2);
$url = Tool::ini('PLAN_UNLOCK');
$res = Tool::post($url, [
'plan_id' => $plan_id
]);
Tool::log(json_encode($res, JSON_UNESCAPED_UNICODE), 2);
}
function PlanUnlockFunc()
{
$db = Db::get();
$plan = $db->getRow("select * from plans where status = 1 and is_lock=1 and lock_endtime < ?", [
date('Y-m-d H:i:s')
]);
if (!!$plan) {
PlanUnlock($plan['id']);
} else {
Tool::log('号源解锁未检测到任务');
}
}
$bot_loop->onWorkerStart = function () {
PlanUnlockFunc();
Timer::add(10, function () {
PlanUnlockFunc();
});
};

@ -23,10 +23,11 @@ function WxSendFunc()
$pay_check = $db->getRow("select * from orders where wx_day1_sendmsg_status = 0
and status = ?
and appointment_number is not null
and appointment_date = ?
and wx_day1_sendmsg_time is not null
and wx_day1_sendmsg_time <= ? and wx_day1_sendmsg_time > ?
order by wx_day1_sendmsg_time asc", [
2, date('Y-m-d H:i:s'),date('Y-m-d')." 00:00:01"
2,date('Y-m-d', strtotime('+1 day')), date('Y-m-d H:i:s'),date('Y-m-d')." 00:00:01"
]);
if (!!$pay_check) {
Db2::u($db, 'orders', [

@ -14,7 +14,7 @@
import {
onShow,
onHide,
onLoad
onLoad,onError
} from '@dcloudio/uni-app'
import {
@ -67,22 +67,47 @@
}
}
uni.setStorageSync('CONFIG_VERSION', response.data.version)
if (!!get_config) {
//if (!!get_config) {
if (true) {
getConfigConfig()
} else {
setConfigStore()
}
})
}
const handleFontSize=()=> {
//
WeixinJSBridge.invoke('setFontSizeCallback', {
'fontSize': 0
});
//
WeixinJSBridge.on('menu:setfont', function() {
WeixinJSBridge.invoke('setFontSizeCallback', {
'fontSize': 0
});
});
}
onShow(() => {
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
handleFontSize();
} else {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", handleFontSize);
document.attachEvent("onWeixinJSBridgeReady", handleFontSize);
}
}
console.log(`\n %c 鹿和 %c https://sa0.online/ \n\n`, 'color: #ffffff; background: #fd6b60; padding:5px 0;',
'color: #fd6b60;background: #ffffff; padding:5px 0;')
getConfigVersion()
})
onLoad(()=>{
})
</script>
<style lang="scss">
@ -148,4 +173,12 @@
</style>
<style>
@import "@/static/iconfont.css";
/* #ifdef H5 */
body { /* IOS禁止微信调整字体大小 */
-webkit-text-size-adjust: 100% !important;
text-size-adjust: 100% !important;
-moz-text-size-adjust: 100% !important;
}
/* #endif */
</style>

@ -0,0 +1,64 @@
<template>
<view class="callkefu_main">
<view class="row">
<view style="display: flex;align-items: center;">
<view class="phoneLogo">
<uni-icons type="phone" size="20" color="#fff"></uni-icons>
</view>
<view style="margin-left: 20rpx;font-size: 28rpx;">0898-6659 5555</view>
</view>
<view class="hujiao_button">
<a href="tel:089866595555">呼叫</a>
</view>
</view>
</view>
</template>
<script setup>
</script>
<style scoped>
a {
color: #fff;
text-decoration: none;
}
a:visited {
color: #fff;
}
.callkefu_main {
}
.row {
display: flex;
justify-content: space-between;
padding: 20rpx;
}
.phoneLogo {
border: 1px solid #ccc;
border-radius: 50%;
width: 50rpx;
height: 50rpx;
background-color: #239ea3;
display: flex;
align-items: center;
justify-content: center;
}
.hujiao_button {
background-color: #239ea3;
color: #fff;
font-size: 26rpx;
line-height: 50rpx;
height: 50rpx;
width: 110rpx;
text-align: center;
border-radius: 60rpx;
}
</style>

@ -0,0 +1,91 @@
<template>
<view class="tab-bar">
<view class="tab-bar-row">
<view class="tab-bar-col" @click="toUrl('/')">
<view>
<uni-icons v-if="nowPath === '/'" type="home-filled" size="30" color="#499495"></uni-icons>
<uni-icons v-else type="home" size="30" color="#7f7f7f"></uni-icons>
</view>
<view :class="nowPath === '/' ? 'active' : ''">首页</view>
</view>
<view class="tab-bar-col" @click="toUrl('/pages/main/bgcx/bgcx')">
<view>
<uni-icons v-if="nowPath === '/pages/main/bgcx/bgcx'" type="wallet-filled" size="30" color="#499495"></uni-icons>
<uni-icons v-else type="wallet" size="30" color="#7f7f7f"></uni-icons>
</view>
<view :class="nowPath === '/pages/main/bgcx/bgcx' ? 'active' : ''">报告查询</view>
</view>
<view class="tab-bar-col" @click="toUrl('/pages/main/order/order')">
<view>
<uni-icons v-if="nowPath === '/pages/main/order/order'" type="person-filled" size="30" color="#499495"></uni-icons>
<uni-icons v-else type="person" size="30" color="#7f7f7f"></uni-icons>
</view>
<view :class="nowPath === '/pages/main/order/order' ? 'active' : ''">我的订单</view>
</view>
</view>
</view>
</template>
<script setup>
import { useRoute } from 'vue-router';
import { ref, onMounted, watch } from 'vue';
import {
onShow,onLoad
} from '@dcloudio/uni-app'
let nowPath = ref('/');
const route = useRoute();
onShow(()=>{
setTimeout(()=>{
document.title = '健康管理中心';
},300)
})
// nowPath
onMounted(() => {
nowPath.value = route.path
});
//
watch(
() => route.path,
(newPath) => {
console.log('路由路径已更新:', newPath);
nowPath.value = newPath.replace(/\/$/, ''); //
}
);
//
const toUrl = (url) => {
uni.redirectTo({ url }); // TabBar 使 navigateTo
};
</script>
<style scoped>
.tab-bar {
position: fixed;
bottom: 0;
width: 100%;
background-color: #fff;
height: 110rpx;
z-index: 999;
}
.tab-bar-row {
display: flex;
justify-content: space-around;
padding: 10rpx 40rpx;
}
.tab-bar-col {
display: flex;
flex-direction: column;
align-items: center;
color: #6f6f6f;
font-size: 22rpx;
}
.active {
color: #499495;
}
</style>

@ -2,11 +2,12 @@
<view style="background-color: #fff;">
<view class="zhou" >
<view class="day" v-for="(item,index) in dataInfo.weeklist">
<view :class="index==3?'day_top selected':'day_top'" @click="selectDate(item.date)">
<view :class="selected_date==item.date?'day_top selected':'day_top'" @click="selectDate(item)">
<view>{{item.date.split('-').slice(1).join('/')}}</view>
<view class="zhou_title">{{ item.xingqi.replace('星期', '周')}}</view>
</view>
<view class="yu">{{item.count}}</view>
<view class="yu" v-if="item.count>0">{{item.count}}</view>
<view class="yu2" v-else></view>
</view>
<view class="xian_k">
@ -19,13 +20,16 @@
</view>
<view class="hengxian"></view>
<view class="timelist">
<view v-for="(item,index) in dataInfo.list" @click="timeClick(item)" :class="(item.time==selectedTime)?'time selected':'time'" ><span :class="item.status==2?'used':''">{{item.time.substring(0, 5)}}</span></view>
<view v-for="(item,index) in dataInfo.list" @click="timeClick(item)" :class="(item.time==selectedTime)?'time selectedtime':'time'" ><span :class="(item.status==2 || item.is_lock==1)?'used':''">{{item.time.substring(0, 5)}}</span></view>
</view>
</view>
</template>
<script setup>
import { defineEmits } from 'vue';
import { defineEmits,ref,watch } from 'vue';
import {
onShow
} from '@dcloudio/uni-app'
const emit = defineEmits();
const props = defineProps({
dataInfo: {
@ -51,11 +55,27 @@
});
const selectDate = (date) => {
emit('selectDate', date);
let weekInfo=ref([]);
let selected_date=ref('');//
onShow(()=>{
weekInfo.value=props.dataInfo.weeklist
selected_date.value=props.dataInfo.weeklist[0].date
})
watch(()=>props.TjDTime,(newvalue,oldvalue)=>{
console.log('777777777',newvalue)
selected_date.value=newvalue.substring(0,10)
})
const selectDate = (item) => {
// if(item.count<=0){
// uni.$lu.toast("");
// return false
// }
selected_date.value=item.date
emit('selectDate', item.date);
};
const timeClick=(timeInfo)=>{
if(timeInfo.status==2){
if(timeInfo.status==2 || timeInfo.is_lock==1 ){
uni.$lu.toast("该号源已经被占用");
return false;
}
@ -147,6 +167,10 @@
}
.selected {
/* background-color: #239EA3; */
color: #008F96 !important;
}
.selectedtime{
background-color: #239EA3;
color: #fff !important;
}
@ -160,10 +184,18 @@
background-color: #E0F5F6;
margin-top: 8rpx;
border-radius: 6rpx;
padding: 2rpx 20rpx;
padding: 2rpx 16rpx;
font-size: 20rpx;
color: #239EA3;
}
.yu2 {
background-color: #f4f4f4;
margin-top: 8rpx;
border-radius: 6rpx;
padding: 2rpx 20rpx;
font-size: 20rpx;
color: #c7c7c7;
}
.xian_k {
display: flex;

@ -1,7 +1,7 @@
const app_type = 'gzh'
//const base_url = "https://api.hainan2024.sa0.online" //开发环境
//const base_url="https://tj-h5.hnxdfe.com" //正式环境
const base_url="http://124.225.137.54:39081" //测试环境
const base_url="https://tj-h5.hnxdfe.com" //正式环境
//const base_url="http://124.225.137.54:39081" //测试环境
const config = {
api_map_url: base_url + '/api/ApiMap/h5',
base_assets_url: base_url,

@ -187,6 +187,11 @@
"style": {
"navigationBarTitleText": "预约时间"
}
},{
"path": "pages/main/yytjsj/yytjsj_front",
"style": {
"navigationBarTitleText": "预约时间"
}
},
{
"path": "pages/main/tjyy/tjyy",
@ -252,7 +257,7 @@
{
"path": "pages/main/question/question/question",
"style": {
"navigationBarTitleText": ""
"navigationBarTitleText": "健康问卷"
}
},
{
@ -277,7 +282,7 @@
{
"path": "pages/main/question/choose/choose",
"style": {
"navigationBarTitleText": ""
"navigationBarTitleText": "健康问卷"
}
},
{
@ -307,6 +312,15 @@
"navigationBarTitleText" : "",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/main/tj/zhuanjiaxq",
"style" :
{
"navigationBarTitleText" : "预检咨询",
"enablePullDownRefresh" : false
}
}
],

@ -83,6 +83,7 @@
if(response.status){
buy_info.value.sanfang_code=response.data
$store.setBuyInfo(buy_info.value)
$store.setCheckupTypeId({id:1})
let query="?comboId="+response.data.combo_id
uni.navigateTo({
url: "/pages/main/tj/tjxq" + query,
@ -123,7 +124,7 @@
</view>
<view :class="['button_name_wrapper',{'active':i.id==99}]">{{ i.name }}</view>
<view class="button_right_wrapper">
<uni-icons type="compose" size="20"></uni-icons>
<!-- <uni-icons type="compose" size="20"></uni-icons> -->
</view>
</view>
</view>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usersa0ChunLuyu
@ -26,7 +27,7 @@
let item_map = [];
for (let i = 0; i <= 2; i++) {
if (!!combo_info.value[i]) {
for (let j = 0; j <= combo_info.value[i].items.length - 1; j++) {
for (let j = 0; j < combo_info.value[i].items.length; j++) {
let item_id = combo_info.value[i].items[j].id;
let existingItem = item_map.find(item => item.id === item_id);
@ -44,41 +45,24 @@
}
}
// let data = item_map.filter(item => !same_item_show.value || item.value.some(v => v));
let data = item_map.filter(item => {
// same_item_show.value false
if (!same_item_show.value) return true;
// combo_info.value 3
const isThirdColumnValid = !!combo_info.value[2];
// item value
const valueLength = item.value.length;
// value
if (!isThirdColumnValid && valueLength >= 2) {
if (!isThirdColumnValid && item.value.length >= 2) {
const firstTwoSame = item.value[0] === item.value[1];
if (firstTwoSame) {
return false; //
}
if (firstTwoSame) return false;
}
// item.value true false
const allTrue = item.value.every(v => v === true);
const allFalse = item.value.every(v => v === false);
// true false
if (allTrue || allFalse) {
return false;
}
if (allTrue || allFalse) return false;
//
return true;
});
console.log(data)
let group_map = [];
data.forEach(item => {
let group = group_map.find(g => g.group === item.group);
@ -89,6 +73,19 @@
group.items.push(item);
});
// keshi_paixu
group_map.sort((a, b) => {
const indexA = keshi_paixu.value.indexOf(a.group);
const indexB = keshi_paixu.value.indexOf(b.group);
if (indexA !== -1 && indexB !== -1) {
return indexA - indexB;
}
if (indexA !== -1) return -1;
if (indexB !== -1) return 1;
return 0;
});
return group_map;
});
const base_info = computed(() => {
@ -105,7 +102,7 @@
value: ['-', '-', '-'],
show: true
}, {
title: '性别婚否',
title: '性别',
value: ['-', '-', '-'],
show: true
} ]
@ -117,9 +114,9 @@
let sex = '通用'
if (combo_info.value[i].sex !== 0) {
if (combo_info.value[i].sex === 1) {
sex = '男通用'
sex = '男'
} else {
sex = '女通用'
sex = '女'
}
}
data[3].value[i] = sex
@ -127,7 +124,7 @@
}
return data
})
let keshi_paixu=ref([]);
const getComboCompare = async () => {
let combo_ids = []
$store.getComboContrast()
@ -143,6 +140,7 @@
})
uni.hideLoading()
$response(response, () => {
keshi_paixu.value=response.data.keshi_paixu
combo_info.value = [null, null, null]
if (response.data.list.length > 0) {
combo_info.value[0] = response.data.list[0]
@ -184,7 +182,7 @@
const chooseComboClick = () => {
// uni.navigateBack()
uni.navigateTo({
url: '/pages/main/combo/combo?status=1'
url: '/pages/main/combo/combo?status=1&isduibi=1'
})
}
const toComboClick = (index) => {
@ -207,12 +205,12 @@
})
</script>
<template>
<DraggableButton />
<TabBar />
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
<view class="top_background_wrapper"></view>
<!-- <view class="top_background_wrapper"></view>
<view class="combo_list_wrapper">
<view class="combo_item_wrapper" v-for="(i,k) in 3" :key="k">
<view v-if="!!combo_info[k]">
@ -230,16 +228,52 @@
<view class="add_text_wrapper">添加套餐</view>
</view>
</view>
</view>
</view> -->
<view class="item_info_wrapper">
<view class="title_wrapper">基本信息</view>
<view class="table_wrapper">
<view class="table_line_wrapper" >
<view class="table_title_wrapper">套餐名称</view>
<view class="table_item_wrapper" v-for="(i,k) in 3" :key="k">
<view v-if="!!combo_info[k]" style="display: flex;justify-content: center; align-items: center; height: 100%; padding: 0rpx 10rpx;">
<view class="combo_title">{{ combo_info[k].name }}</view>
<view @click="closeComboClick(k)" class="combo_close_wrapper" style="margin-left: 10rpx;">
<image src="@/static/assets/contrast/close@2x.png"></image>
</view>
</view>
<view @click="chooseComboClick()" v-else>
<view style="color: #239EA3;" >添加套餐</view>
</view>
</view>
</view>
<view class="table_line_wrapper" >
<view class="table_title_wrapper">价格</view>
<view class="table_item_wrapper" v-for="(i,k) in 3" :key="k">
<view v-if="!!combo_info[k]" style="display: flex;justify-content: center; align-items: center; height: 100%; padding: 0rpx 10rpx;">
<view class="combo_title" >{{ combo_info[k].price }}</view>
</view>
<view @click="chooseComboClick()" v-else>
-
</view>
</view>
</view>
<template v-for="(i,k) in base_info">
<view class="table_line_wrapper" v-if="!!i.show" :key="k">
<view class="table_title_wrapper">{{ i.title }} </view>
<view class="table_item_wrapper" v-for="(ii,ik) in i.value" :key="ik">{{ ii }}</view>
</view>
</template>
<view class="table_line_wrapper" >
<view class="table_title_wrapper"></view>
<view class="table_item_wrapper" v-for="(i,k) in 3" :key="k">
<view v-if="!!combo_info[k]" style="display: flex;justify-content: center; align-items: center; height: 100%; padding: 0rpx 10rpx;">
<view @click="toComboClick(k)" class="combo_choose_wrapper">购买</view>
</view>
<view @click="chooseComboClick()" v-else>
-
</view>
</view>
</view>
</view>
<view class="title_line_wrapper">
<view class="title_wrapper">项目信息</view>
@ -277,6 +311,15 @@
</view>
</template>
<style scoped>
.combo_title{
display: -webkit-box; /* 必须结合弹性盒子布局 */
-webkit-box-orient: vertical; /* 设置为垂直方向 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
-webkit-line-clamp: 2; /* 最多显示两行 */
line-height: 30rpx;
min-height: 30rpx;
}
.show_text_wrapper {
font-size: 14rpx;
color: #05050580;
@ -302,7 +345,7 @@
text-align: center;
width: 142rpx;
text-align: center;
height: 91rpx;
height: 120rpx;
position: relative;
background: #F2F2F2;
border-bottom: 1rpx solid #F2F2F2;
@ -381,7 +424,7 @@
}
.table_large_item_wrapper {
height: 91rpx;
height: 120rpx;
line-height: 30rpx;
display: flex;
align-items: center;
@ -398,7 +441,7 @@
margin: 0 auto;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
@ -410,9 +453,9 @@
background: #FFFFFF;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.04);
border-radius: 5rpx;
margin: 15rpx auto 0;
margin: 0rpx auto 0;
overflow: hidden;
padding-bottom: 33rpx;
padding-bottom: 133rpx;
}
.title_wrapper {
@ -431,11 +474,11 @@
}
.combo_choose_wrapper {
width: 180rpx;
height: 54rpx;
width: 120rpx;
height: 50rpx;
background: #239EA3;
border-radius: 8rpx;
margin: 23rpx auto 0;
font-weight: 500;
font-size: 24rpx;
@ -471,7 +514,7 @@
}
.combo_close_wrapper {
position: absolute;
width: 18rpx;
height: 19rpx;
top: 7rpx;

@ -130,15 +130,19 @@
<uni-icons type="info-filled" size="18" color="#009DA6"></uni-icons>
</view>
<view style="line-height: 38rpx;margin-left: 6rpx;">
请提前10分钟凭身份证原件到现代妇儿秀英院区健康管理中心(<span v-if="order_info.sex==1"></span><span v-if="order_info.sex==2"></span>)36659555565781993
请提前10分钟凭身份证原件到现代妇儿秀英院区健康管理中心(<span v-if="order_info.sex==1"></span><span v-if="order_info.sex==2"></span>)36659555565781993
</view>
</view>
<view class="tishi2">温馨提示<span style="color: #e95513;">若要增加项目可以到现场预检咨询</span></view>
<view class="order_info_price_wrapper">
<view class="order_info_price_label_wrapper">订单金额</view>
<view class="order_info_value_wrapper">¥{{ order_info.true_price }}</view>
</view>
</view>
<view v-if="order_info.source !='web'" @click="toPlan()" class="check_done_wrapper"></view>
<view @click="toOrderList()" class="next_done_wrapper">
<view style="margin-right: 6rpx;">下次预约</view>
@ -156,6 +160,12 @@
}
</style>
<style scoped>
.tishi2{
font-size: 26rpx;
padding-top: 16rpx;
background-color: #fff;
}
.next_done_wrapper{
display: flex;
width: 100%;

@ -80,6 +80,14 @@
url: '/pages/main/order/order'
})
}
const toCombo = () => {
$store.setCheckupTypeId({id:1});
$store.setTempPlan({})
uni.reLaunch({
url: '/pages/main/combo/combo'
})
}
const toIndex=()=>{
uni.reLaunch({
url: '/'
@ -103,8 +111,8 @@
<view class="order_icon_image_wrapper">
<image src="@/static/assets/buy/yuan_duihao.png"></image>
</view>
<view class="order_icon_tip_wrapper">预约成功</view>
<view v-if="order_info.checkup_type_id==4"
<view class="order_icon_tip_wrapper"><span v-if="($store.getTempPlan()?.plan_id || order_info.combo_id=='2814')"></span><span v-else></span></view>
<view v-if="order_info.checkup_type_id==4 && (order_info.title=='' || order_info.title=='')"
style="font-size: 24rpx;padding:20rpx 40rpx; 0rpx 40rpx;color:#FF0000;">
请您的配偶在15分钟内完成预约否则本次预约将会失效如有支付金额会原路退回
</view>
@ -151,10 +159,12 @@
</view>
</view> -->
<view class="tishi2">温馨提示<span style="color: #ff0000;">若要增加项目可以到现场预检咨询</span></view>
<view class="order_info_yuyue" @click="toOrderList()">
查看预约记录
</view>
</view>
<view @click="toCombo()" class="buycombo_button">购买套餐</view>
<view @click="toIndex()" class="check_done_wrapper">返回首页</view>
</view>
@ -167,6 +177,24 @@
}
</style>
<style scoped>
.buycombo_button{
width: 660rpx;
height: 60rpx;
line-height: 60rpx;
margin: 80rpx auto -60rpx auto;
border-radius: 60rpx;
background: #FC8A51;
font-weight: 700;
font-size: 29rpx;
color: #F6FDFD;
text-align: center;
}
.tishi2{
font-size: 26rpx;
padding-top: 16rpx;
background-color: #fff;
}
.next_done_wrapper{
display: flex;
width: 100%;

@ -6,7 +6,7 @@
@mousedown="dragButton"
@touchstart="dragButton"
>
<uni-icons @click="goHome" style="padding-right: 10rpx;" custom-prefix="iconfont" type="icon-subdirectory_arrow_left" size="20" color="#fff"></uni-icons>
<!-- <uni-icons @click="goHome" style="padding-right: 10rpx;" custom-prefix="iconfont" type="icon-subdirectory_arrow_left" size="20" color="#fff"></uni-icons> -->
</div>
</template>
@ -75,8 +75,8 @@ const dragButton = (event) => {
/* 其他样式 */
right: 20rpx;
top: 14rpx;
width: 60rpx;
height: 60rpx;
width: 0rpx;
height: 0rpx;
border-radius: 50%;
background-color: #cdcdcd;
display: flex;

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* userbgcx
@ -42,7 +43,8 @@ import DraggableButton from "@/pages/components/goHome.vue";
console.log(tabIndex.value);
console.log($store, "store");
let obj = {
tj_status: tabIndex.value,
// tj_status: tabIndex.value,
tj_status: 1,
hospital_id: $store.save.hospital
};
uni.showLoading({
@ -76,7 +78,7 @@ import DraggableButton from "@/pages/components/goHome.vue";
const tzroutes = (url) => {
if (url == 'bgjd') {
wx.miniProgram.navigateTo({
url: '/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1035&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904'
url: '/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1002&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904'
})
}
//
@ -92,7 +94,7 @@ import DraggableButton from "@/pages/components/goHome.vue";
});
</script>
<template>
<DraggableButton />
<TabBar></TabBar>
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
@ -100,24 +102,24 @@ import DraggableButton from "@/pages/components/goHome.vue";
</view>
<view class="bgcx pl-10rpx pr-10rpx">
<view class="bgcx_header">
<view @click="tzroutes('bgjd')" class="bgcx_header_bgcolor"
<view @click="tzroutes('')" class="bgcx_header_bgcolor"
style="background: linear-gradient(-30deg, #3bcda9, #3dcbd1)">
<view class="bgcx_header_text"> 报告解读 </view>
<view class="bgcx_header_text"> 报告列表 </view>
<image src="@/static/assets/slices/bgjd.png"></image>
</view>
<view @click="tzroutes('bgdb')" class="bgcx_header_bgcolor"
<view @click="tzroutes('bgjd')" class="bgcx_header_bgcolor"
style="background: linear-gradient(-30deg, #fec546, #ffae22)">
<view class="bgcx_header_text"> 报告对比 </view>
<view class="bgcx_header_text"> 报告解读 </view>
<image src="@/static/assets/slices/bgdb.png"></image>
</view>
<view @click="tzroutes('qsfx')" class="bgcx_header_bgcolor"
<view @click="tzroutes('bgdb')" class="bgcx_header_bgcolor"
style="background: linear-gradient(-30deg, #8bbafe, #7898fe)">
<view class="bgcx_header_text"> 趋势分析 </view>
<view class="bgcx_header_text"> 报告对比 </view>
<image src="@/static/assets/slices/xsfx.png"></image>
</view>
</view>
<view class="bgcx_fullReport">
<view class="text-#123531 text-34rpx"> 全部报告 </view>
<!-- <view class="text-#123531 text-34rpx"> 全部报告 </view>
<view class="bgcx_fullReport_query mb-38rpx">
<view @click="gettjbgInfo(0)" :class="tabIndex == 0 ? 'bgcx_fullReport_query_button_active' : ''"
class="bgcx_fullReport_query_button">全部</view>
@ -125,7 +127,7 @@ import DraggableButton from "@/pages/components/goHome.vue";
class="bgcx_fullReport_query_button">已出报告</view>
<view @click="gettjbgInfo(2)" :class="tabIndex == 2 ? 'bgcx_fullReport_query_button_active' : ''"
class="bgcx_fullReport_query_button">未出报告</view>
</view>
</view> -->
<view v-for="(val, i) in bgcx_list" :key="i" @click="routesDeatils(val)">
<view class="flex items-center">
<view class="w-8rpx h-8rpx bg-#239EA3 rounded-15rpx"> </view>

@ -204,7 +204,7 @@ onShow(() => {
<view v-show="tabIndex == 1" class="text-center">
<view class="text-32rpx">
<text class="text-#D01615 text-28rpx">{{
item.r2?.icoin
item.r1?.icon
}}</text
>{{ item.r1?.content }}
</view>
@ -224,7 +224,7 @@ onShow(() => {
<view v-show="tabIndex == 1" class="text-center">
<view class="text-32rpx">
<text class="text-#D01615 text-28rpx">{{
item.r2?.icoin
item.r2?.icon
}}</text
>{{ item.r2?.content }}
</view>

@ -5,10 +5,19 @@ import DraggableButton from "@/pages/components/goHome.vue";
* userxzbg
* date2024年9月27日 16:01:08
*/
import { ref } from "vue";
import { $api, $response } from "@/api";
import { onShow } from "@dcloudio/uni-app";
import { useStore } from "@/store";
import {
ref
} from "vue";
import {
$api,
$response
} from "@/api";
import {
onShow
} from "@dcloudio/uni-app";
import {
useStore
} from "@/store";
const $store = useStore();
let bgcx_list = ref([]); //
@ -24,6 +33,7 @@ const gettjbgInfo = async () => {
tj_status: 1,
hospital_id: $store.save.hospital,
};
uni.showLoading();
const response = await $api("GetReportList", obj);
$response(response, () => {
console.log(response, "response");
@ -31,25 +41,55 @@ const gettjbgInfo = async () => {
uni.hideLoading();
});
};
// const bgList = ref([1, 2, 3, 4])
let tjbgList = ref([]);
// const selectdbObj = async (item) => {
// tjbgList.value = $store.getTjbgInfo();
// if ($store.setTjbgInfo?.length < 2) {
// console.log(item.);
// console.log(tjbgList.value.length);
// if (tjbgList.value.length == 1 && item. == tjbgList.value[0].) {
// uni.$lu.toast("");
// return false;
// }
// tjbgList.value.push(item);
// }
// $store.setTjbgInfo(tjbgList.value);
// // console.log(item.name)
// // item.name
// // uni.navigateBack({
// // delta: 1,
// // });
// };
const selectdbObj = async (item) => {
let tjbgList = $store.getTjbgInfo();
if($store.setTjbgInfo?.length < 2){
console.log(item.体检号);
console.log(tjbgList.length);
if(tjbgList.length==1 && item.体检号==tjbgList[0].体检号){
uni.$lu.toast("请选择两份不同的报告");
// tjbgList
tjbgList.value = $store.getTjbgInfo();
// tjbgList item.
const index = tjbgList.value.findIndex(tjbg => tjbg.体检号 === item.体检号);
if (index !== -1) {
// tjbgList
tjbgList.value.splice(index, 1);
} else {
// item tjbgList
if (tjbgList.value.length >= 2) {
uni.$lu.toast("最多只能选择两份报告");
return false;
}
tjbgList.push(item);
tjbgList.value.push(item);
}
$store.setTjbgInfo(tjbgList);
// console.log(item.name)
// item.name
uni.navigateBack({
delta: 1,
});
// store
$store.setTjbgInfo(tjbgList.value);
};
const selectdbDone =()=>{
uni.redirectTo({
url:"/pages/main/bgcx/bgdb/bgdb"
});
}
const config_ref = ref(null);
const configRef = (e) => {
@ -60,6 +100,8 @@ const configRef = (e) => {
};
onShow(() => {
tjbgList.value = $store.getTjbgInfo();
console.log('666666666', tjbgList.value)
if (!!config_ref.value) {
mountedAction();
}
@ -72,21 +114,18 @@ onShow(() => {
<view :ref="configRef"></view>
</view>
<view class="">
<view
style="box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.05)"
class="text-24rpx text-#333 m-20rpx p-24rpx bg-#fff rounded-10rpx"
v-for="(item, index) in bgcx_list"
:key="index"
>
<view
class="pb-30rpx text-#0E0E0E text-34rpx flex flex-justify-between"
>
<view style="box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.05)"
class="text-24rpx text-#333 m-20rpx p-24rpx bg-#fff rounded-10rpx" v-for="(item, index) in bgcx_list"
:key="index">
<view class="pb-30rpx text-#0E0E0E text-34rpx flex flex-justify-between">
<text class="line-clamp-1">{{ item["套餐名称"] }}</text>
<text
class="w-90rpx h-42rpx bg-#32A8D9 text-#fff text-24rpx rounded-rb-20rpx rounded-lt-20rpx text-center line-height-[1.6]"
>{{ item["团检"] ? "团检" : "个检" }}</text
>
class="w-90rpx h-42rpx bg-#32A8D9 text-#fff text-24rpx rounded-rb-20rpx rounded-lt-20rpx text-center line-height-[1.6]">
{{ item["团检"] ? "团检" : "个检" }}
</text>
</view>
<view style="display: flex;align-items: center;justify-content: space-between;">
<view>
<view class="pb-15rpx">
<text class="text-#8B8B8B">体检人</text>
<text class="ml-25rpx">{{ item["姓名"] }}</text>
@ -103,19 +142,42 @@ onShow(() => {
<text class="text-#8B8B8B">报告日期</text>
<text>{{ item["报告日期"]?.split("T").join(" ") }}</text>
</view>
</view>
<view style="margin-right: 40rpx;" @click="selectdbObj(item)">
<view class="checkbox" v-if="tjbgList.some(tjbg => tjbg.体检号 === item.体检号)">
<uni-icons type="checkmarkempty" size="16" color="#239ea3"></uni-icons>
</view>
<view class="checkbox" v-else>
<view
style="border-top: 1px solid #e6e9e9"
class="pt-20rpx flex flex-justify-end"
>
<view
@click="selectdbObj(item)"
class="bg-#33ACB5 w-200rpx rounded-5rpx text-#fff text-center line-height-[2.5]"
>报告对比</view
>
</view>
</view>
</view>
<!-- <view style="border-top: 1px solid #e6e9e9" class="pt-20rpx flex flex-justify-end">
<view @click="selectdbObj(item)"
class="bg-#33ACB5 w-200rpx rounded-5rpx text-#fff text-center line-height-[2.5]">
报告对比
</view>
</view> -->
</view>
<view style="display: flex;justify-content: center; width: 100%;" v-if="bgcx_list.length>0">
<view @click="selectdbDone()"
class="bg-#33ACB5 w-200rpx rounded-5rpx text-#fff text-center line-height-[2.5]">
选择完成
</view>
</view>
</view>
</view>
</template>
<style scoped></style>
<style scoped>
.checkbox {
height: 30rpx;
width: 30rpx;
border: 1px solid #009FA8;
display: flex;
justify-items: center;
align-items: center;
text-align: center;
}
</style>

@ -0,0 +1,547 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
/**
* name
* userckbg
* date2024年9月21日
*/
import { ref } from "vue";
import { $api, $response, $image } from "@/api";
import { onShow } from "@dcloudio/uni-app";
import { useStore } from "@/store";
const $store = useStore();
const mountedAction = async () => {
uni.showLoading({
title: "加载中",
});
if (tjhNum.value) {
await getList(); //
}
};
const $props = defineProps({
tjh: {
type: String,
default: "",
},
});
const bgjl_obj = ref(false);
const wzbg_list = ref(null);
let tabIndex = ref(0); //
let currentIndex = ref(0); //
const getBtn = (e) => {
tabIndex.value = e;
getList();
};
const getList = async () => {
//
console.log(tabIndex.value, "tabIndex");
let obj = {
tijian_num: tjhNum.value, //
hospital_id: $store.save.hospital,
};
let url = "GetReportJieLunJianYi";
if (tabIndex.value == 1) {
url = "GetReportDetaiList";
}
const response = await $api(url, obj);
$response(response, () => {
console.log(response.data, "response");
if (tabIndex.value == 1) {
for (let key in response.data.list) {
response.data.list[key].isopen = false;
}
wzbg_list.value = response.data.list;
console.log(response.data.list);
} else {
bgjl_obj.value = response.data.info;
}
console.log(wzbg_list.value, "wzbg_list.value");
uni.hideLoading();
});
};
const isopen = ref(false); //
const config_ref = ref(null);
const tjhNum = ref(""); //url
const configRef = (e) => {
if (!config_ref.value) {
config_ref.value = e;
tjhNum.value = $props.tjh;
console.log(tjhNum.value, "tjh"); //url
mountedAction();
}
};
const dqArr = ref([]);
const collapseClick = async (e) => {
let id = e; //id
let itemWithId120 = null; //id itemWithId120['details']
if (e) {
for (let key in wzbg_list.value) {
if (
wzbg_list.value.hasOwnProperty(key) &&
wzbg_list.value[key].id === id
) {
itemWithId120 = wzbg_list.value[key];
break; // 退
}
}
// return
if (itemWithId120.hasOwnProperty("details")) {
console.log(itemWithId120["details"], "itemWithId120");
return;
}
uni.showLoading({
title: "加载中",
});
let obj = {
id,
};
const response = await $api("GetReportDetai2", obj);
console.log(response);
$response(response, () => {
itemWithId120["details"] = response.data;
console.log(itemWithId120["details"], "itemWithId120");
// itemWithId120.isopen = itemWithId120.isopen
// ? !itemWithId120.isopen
// : true;
itemWithId120.isopen = true;
});
uni.hideLoading();
}
};
const getOpenClick = () => {
isopen.value = !isopen.value;
console.log(wzbg_list.value);
for (let key in wzbg_list.value) {
wzbg_list.value[key].isopen = !wzbg_list.value[key].isopen;
}
console.log(wzbg_list.value);
// open
};
const calculatePercentage = (value, start, end, maxNum) => {
if (value >= start && value <= end) {
const rangeLength = end - start;
const distanceFromStart = value - start;
const proportion = distanceFromStart / rangeLength;
const percentage = proportion * 50 + 25;
return percentage.toFixed(2);
}
if (value < start) {
const rangeLength = start;
const distanceFromStart = value;
const proportion = distanceFromStart / rangeLength;
const percentage = proportion * 25;
return percentage.toFixed(2);
}
if (value > end) {
const rangeLength = maxNum - end;
const distanceFromStart = value - end;
const proportion = distanceFromStart / rangeLength;
const percentage = proportion * 25 + 75;
return percentage.toFixed(2);
}
};
onShow(() => {
if (!!config_ref.value) {
mountedAction();
}
});
</script>
<template>
<DraggableButton />
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
<view class="box-border ma pt-20rpx pb-20rpx pl-10rpx pr-10rpx">
<view
class="mb-20rpx flex rounded-8rpx w-428rpx h-66rpx ma b-0 b-1 b-solid b-#239EA3"
>
<view
@click="getBtn(0)"
:class="tabIndex == 0 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 text-#26rpx bg-#D9F3F2 flex flex-items-center flex-justify-center rounded-l-8rpx"
>
结论建议
</view>
<view
@click="getBtn(1)"
:class="tabIndex == 1 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 flex flex-items-center flex-justify-center bg-#D9F3F2 rounded-r-8rpx"
>完整报告
</view>
</view>
<view v-if="tabIndex == 0">
<view
class="bg-#239EA3 position-relative h-390rpx ma mb-10rpx border-rd-5rpx"
>
<view
class="text-36rpx text-#fff position-absolute top-33rpx left-28rpx"
>
{{ bgjl_obj.name }}
</view>
<image
class="w-279rpx h-329rpx position-absolute bottom-0 left-80rpx"
src="@/static/assets/slices/avatar.png"
></image>
<view class="relative center h-full">
<view
class="absolute right-335rpx"
style="
width: 0;
height: 0;
border-top: 15rpx solid transparent;
border-right: 15rpx solid #fff;
border-bottom: 15rpx solid transparent;
"
>
</view>
<view
class="bg-#fff rounded-20rpx pb-27rpx pl-33rpx pr-33rpx position-absolute right-20rpx w-250rpx"
>
<view class="text-#239EA3 text-28rpx line-height-[2.8] font-500">
基本健康数据
</view>
<view
class="flex flex-justify-between text-24rpx line-height-[1.5]"
v-for="(item, index) in bgjl_obj.base_date"
:key="index"
>
<view class="text-#8A8A8A"> {{ item.name }} </view>
<view class="text-#101010"> {{ item.value }} </view>
</view>
</view>
</view>
</view>
<view
class="flex flex-justify-evenly pb-20rpx pt-14rpx"
style="
background: linear-gradient(
-360deg,
#f3f3f3 0%,
#edf6f5 55%,
#bbdfe1 99%
);
"
>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
<view class="text-26rpx font-500">
<span class="text-36rpx mr-10rpx">
{{ bgjl_obj ? bgjl_obj.items.all_count : 0 }}</span
>
</view>
<view class="text-#8C8C8C text-22rpx"> 总指标 </view>
</view>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
<view class="text-26rpx font-500">
<span
class="text-36rpx mr-10rpx"
:class="
bgjl_obj && bgjl_obj.items.ipt_error_count > 0
? 'color-red'
: ''
"
>
{{ bgjl_obj ? bgjl_obj.items.ipt_error_count : 0 }}</span
>
</view>
<view class="text-#8C8C8C text-22rpx"> 重要异常结果 </view>
</view>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
<view class="text-26rpx font-500">
<span
class="text-36rpx mr-10rpx"
:class="
bgjl_obj && bgjl_obj.items.error_count > 0 ? 'color-red' : ''
"
>{{ bgjl_obj ? bgjl_obj.items.error_count : 0 }}</span
>
</view>
<view class="text-#8C8C8C text-22rpx"> 异常结果 </view>
</view>
</view>
<view class="rounded-15rpx bg-#fff pt-22rpx pb-22rpx">
<view
class="w-154rpx h-60rpx rounded-r-30rpx text-center center text-#123531 text-25rpx font-500"
style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)"
>
总检建议
</view>
<view class="pl-15rpx pr-25rpx pt-45rpx box-border">
<text class="text-#0B0B0B line-height-[2] text-26rpx">{{
bgjl_obj.content
}}</text>
<!-- <view class=" flex flex-justify-between line-height-[2]">
<view class="font-500 text-28rpx">{{item}}舒张压降低
</view>
<view class="">
<image class="w-25rpx h-25rpx mr-4rpx" src="@/static/assets/slices/wjx.png"></image>
<image class="w-25rpx h-25rpx" src="@/static/assets/slices/wjx.png"></image>
</view>
</view>
<view class="text-26rpx text-#0B0B0B pl-15rpx">
<view class="flex">
<view class="mr-5rpx"> (1) </view>
<view class="">
收缩压正常舒张压降低为身低于60mm降低为身低于60mmHg 收缩压正常舒张压降低为身低于60mmHg
</view>
</view>
</view> -->
</view>
</view>
</view>
<view v-if="tabIndex == 1">
<view class="rounded-15rpx bg-#fff pt-22rpx pb-50rpx position-relative">
<view
class="w-154rpx h-60rpx mb-20rpx rounded-r-30rpx text-center line-height-[2.3] text-#123531 text-25rpx font-500"
style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)"
>
全部检查
</view>
<!-- 展开全部 -->
<!-- <view
class="position-absolute top-20rpx right-0rpx text-#6D6D6D text-26rpx"
>
<view
id="qcInline"
class="flex flex-items-center"
@click="getOpenClick"
>
<view class="position-absolute right-35px w-120rpx">
{{ isopen ? "收起全部" : "展开全部" }}
</view>
<uni-collapse-item id="qcInline-item" :open="isopen">
</uni-collapse-item>
</view>
</view> -->
<view v-for="(item, index) in wzbg_list">
<uni-collapse
class="collapse-w"
@change="collapseClick"
v-model="currentIndex"
accordion
>
<view class="position-relative" :key="index">
<view
v-if="item && item.error_count > 0"
class="position-absolute line-height-[96rpx] right-40px text-#6D6D6D text-15px"
>
<span class="text-#E46B1A">{{ item.error_count }}</span>
项异常
</view>
<uni-collapse-item
:name="item.id"
:open="item.isopen"
thumb=""
:title="index"
>
<view
class="p-20rpx pl-30rpx pr-30rpx"
v-if="item && item.details"
>
<view
class="bg-#FBF0EE b-0 b-1 b-solid b-#EADEDB rounded-15rpx pb-10rpx"
:class="item.error_count == 0 ? 'greenClor' : ''"
>
<view
:class="item.error_count == 0 ? 'greenTextClor' : ''"
class="w-141rpx line-height-[2] text-center text-#fff bg-#F6725B rounded-lt-15rpx rounded-rb-15rpx text-22rpx"
>
初步意见
</view>
<template v-if="item.error_count > 0">
<view
class="text-#E33939 text-22rpx line-height-[2] pl-20rpx pr-20rpx"
v-for="(text, i) in item.details.error_items"
:key="i"
>
{{ text }}
</view>
</template>
<view
class="text-#239EA3 text-22rpx line-height-[2] pl-20rpx pr-20rpx"
v-else
>
<!-- {{item.details.error_items.length}} -->
<text
v-if="
!item.details.suojian?.length &&
!item.details.error_items?.length
"
>
未见明显异常</text
>
<template v-else>
<text
v-for="(text, i) in item.details.suojian"
:key="i"
>
{{ text }}</text
>
</template>
</view>
</view>
<!-- <view v-if="1 < 0" class="flex flex-justify-around m-20rpx">
<view>
<view class="text-36rpx font-500"> 162.0 </view>
<view class="text-20rpx"> 身高cm </view>
</view>
<view>
<view class="text-40rpx font-500"> 58.8 </view>
<view class="text-20rpx"> 体重Kg </view>
</view>
</view> -->
<view class="p-10rpx pt-20rpx pb-20rpx">
<view v-for="(obj, k) in item.details.list" :key="k">
<view class="font-500 text-24rpx line-height-[2]">
{{ obj["基础项目名称"] }}
<span class="text-#737373 text-18rpx"
>({{obj["结果值"]}} {{ obj["结果值单位"] }})</span
>
</view>
<view class="pt-80rpx pb-30rpx">
<view class="h-4rpx bg-#E2E2E2 rounded-2rpx relative">
<view
class="bg-#239EA3 h-4rpx w-50% rounded-2rpx ma flex text-24rpx text-#7B7B7B flex-justify-between"
>
<!-- {{obj['结果值范围']}} -->
<text>{{ obj["结果值范围"][0] }}</text>
<text>正常</text>
<text>{{ obj["结果值范围"][1] }}</text>
</view>
<view
v-if="
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1]
"
class="bg-#F8C9C7 h-4rpx w-25% rounded-2rpx ma absolute bottom-0"
:class="{
'left-0': obj['结果值'] < obj['结果值范围'][0],
'right-0': obj['结果值'] > obj['结果值范围'][1],
}"
></view>
<view
class="center flex-col absolute"
:style="{
left:
calculatePercentage(
obj['结果值'],
obj['结果值范围'][0],
obj['结果值范围'][1],
obj['最大范围'][1]
) + '%',
}"
>
<view
class="text-34rpx absolute top--50rpx"
:class="{
'text-#239EA3':
obj['结果值'] >= obj['结果值范围'][0] &&
obj['结果值'] <= obj['结果值范围'][1],
'text-#F34932':
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1],
}"
>
<text>{{ obj["结果值"] }}</text>
<uni-icons
v-if="obj['结果值'] < obj['结果值范围'][0]"
type="arrow-down"
:size="16"
color="#F34932"
></uni-icons>
<uni-icons
v-if="obj['结果值'] > obj['结果值范围'][1]"
type="arrow-up"
:size="16"
color="#F34932"
></uni-icons>
</view>
<view
class="w-8rpx h-8rpx rounded-50% bg-#fff b-4rpx b-solid absolute -top-8rpx"
:class="{
'b-#1F8F94':
obj['结果值'] >= obj['结果值范围'][0] &&
obj['结果值'] <= obj['结果值范围'][1],
'b-#F34932':
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1],
}"
>
</view>
</view>
</view>
</view>
</view>
<view class=""> </view>
</view>
</view>
</uni-collapse-item>
</view>
</uni-collapse>
</view>
</view>
</view>
</view>
</view>
</template>
<style scoped>
/* uni-collapse-item__title.uni-collapse-item-border */
::v-deep
#qcInline
#qcInline-item
.uni-collapse-item__title.uni-collapse-item-border {
border: none !important;
}
::v-deep
#qcInline
#qcInline-item
.uni-collapse-item__wrap
.uni-collapse-item__wrap-content.open {
border: none !important;
}
::v-deep .collapse-w .uni-collapse-item__title-box {
width: 560rpx;
}
.ckjg_active {
background: #239ea3;
color: #fff;
}
.color-red {
color: #e46b1a;
}
.greenTextClor {
background-color: #239ea3;
}
.greenClor {
background-color: #e8f6f5;
border: 2px solid #dce9e8;
}
</style>

@ -5,11 +5,21 @@ import DraggableButton from "@/pages/components/goHome.vue";
* userckbg
* date2024年9月21日
*/
import { ref } from "vue";
import { $api, $response, $image } from "@/api";
import { onShow } from "@dcloudio/uni-app";
import {
ref
} from "vue";
import {
$api,
$response,
$image
} from "@/api";
import {
onShow
} from "@dcloudio/uni-app";
import { useStore } from "@/store";
import {
useStore
} from "@/store";
const $store = useStore();
const mountedAction = async () => {
uni.showLoading({
@ -102,7 +112,7 @@ const collapseClick = async (e) => {
let obj = {
id,
};
const response = await $api("GetReportDetai", obj);
const response = await $api("GetReportDetai2", obj);
console.log(response);
$response(response, () => {
itemWithId120["details"] = response.data;
@ -163,124 +173,84 @@ onShow(() => {
<view :ref="configRef"></view>
</view>
<view class="box-border ma pt-20rpx pb-20rpx pl-10rpx pr-10rpx">
<view
class="mb-20rpx flex rounded-8rpx w-428rpx h-66rpx ma b-0 b-1 b-solid b-#239EA3"
>
<view
@click="getBtn(0)"
:class="tabIndex == 0 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 text-#26rpx bg-#D9F3F2 flex flex-items-center flex-justify-center rounded-l-8rpx"
>
<view class="mb-20rpx flex rounded-8rpx w-428rpx h-66rpx ma b-0 b-1 b-solid b-#239EA3">
<view @click="getBtn(0)" :class="tabIndex == 0 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 text-#26rpx bg-#D9F3F2 flex flex-items-center flex-justify-center rounded-l-8rpx">
结论建议
</view>
<view
@click="getBtn(1)"
:class="tabIndex == 1 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 flex flex-items-center flex-justify-center bg-#D9F3F2 rounded-r-8rpx"
>完整报告
<view @click="getBtn(1)" :class="tabIndex == 1 ? 'ckjg_active' : ''"
class="text-#239EA3 flex-1 flex flex-items-center flex-justify-center bg-#D9F3F2 rounded-r-8rpx">
完整报告
</view>
</view>
<view v-if="tabIndex == 0">
<view
class="bg-#239EA3 position-relative h-390rpx ma mb-10rpx border-rd-5rpx"
>
<view
class="text-36rpx text-#fff position-absolute top-33rpx left-28rpx"
>
<view class="bg-#239EA3 position-relative h-390rpx ma mb-10rpx border-rd-5rpx">
<view class="text-36rpx text-#fff position-absolute top-33rpx left-28rpx">
{{ bgjl_obj.name }}
</view>
<image
class="w-279rpx h-329rpx position-absolute bottom-0 left-80rpx"
src="@/static/assets/slices/avatar.png"
></image>
<image class="w-279rpx h-329rpx position-absolute bottom-0 left-80rpx"
src="@/static/assets/slices/avatar.png"></image>
<view class="relative center h-full">
<view
class="absolute right-335rpx"
style="
<view class="absolute right-335rpx" style="
width: 0;
height: 0;
border-top: 15rpx solid transparent;
border-right: 15rpx solid #fff;
border-bottom: 15rpx solid transparent;
"
>
">
</view>
<view
class="bg-#fff rounded-20rpx pb-27rpx pl-33rpx pr-33rpx position-absolute right-20rpx w-250rpx"
>
class="bg-#fff rounded-20rpx pb-27rpx pl-33rpx pr-33rpx position-absolute right-20rpx w-250rpx">
<view class="text-#239EA3 text-28rpx line-height-[2.8] font-500">
基本健康数据
健康数据
</view>
<view
class="flex flex-justify-between text-24rpx line-height-[1.5]"
v-for="(item, index) in bgjl_obj.base_date"
:key="index"
>
<view class="flex flex-justify-between text-24rpx line-height-[1.5]"
v-for="(item, index) in bgjl_obj.base_date" :key="index">
<view class="text-#8A8A8A"> {{ item.name }} </view>
<view class="text-#101010"> {{ item.value }} </view>
</view>
</view>
</view>
</view>
<view
class="flex flex-justify-evenly pb-20rpx pt-14rpx"
style="
<view class="flex flex-justify-evenly pb-20rpx pt-14rpx" style="
background: linear-gradient(
-360deg,
#f3f3f3 0%,
#edf6f5 55%,
#bbdfe1 99%
);
"
>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
">
<view class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx">
<view class="text-26rpx font-500">
<span class="text-36rpx mr-10rpx">
{{ bgjl_obj ? bgjl_obj.items.all_count : 0 }}</span
>
{{ bgjl_obj ? bgjl_obj.items.all_count : 0 }}</span>
</view>
<view class="text-#8C8C8C text-22rpx"> 总指标 </view>
</view>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
<view class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx">
<view class="text-26rpx font-500">
<span
class="text-36rpx mr-10rpx"
:class="
<span class="text-36rpx mr-10rpx" :class="
bgjl_obj && bgjl_obj.items.ipt_error_count > 0
? 'color-red'
: ''
"
>
{{ bgjl_obj ? bgjl_obj.items.ipt_error_count : 0 }}</span
>
">
{{ bgjl_obj ? bgjl_obj.items.ipt_error_count : 0 }}</span>
</view>
<view class="text-#8C8C8C text-22rpx"> 重要异常结果 </view>
</view>
<view
class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx"
>
<view class="bg-#fff rounded-20rpx w-30% text-center pt-36rpx pb-36rpx">
<view class="text-26rpx font-500">
<span
class="text-36rpx mr-10rpx"
:class="
<span class="text-36rpx mr-10rpx" :class="
bgjl_obj && bgjl_obj.items.error_count > 0 ? 'color-red' : ''
"
>{{ bgjl_obj ? bgjl_obj.items.error_count : 0 }}</span
>
">{{ bgjl_obj ? bgjl_obj.items.error_count : 0 }}</span>
</view>
<view class="text-#8C8C8C text-22rpx"> 异常结果 </view>
</view>
</view>
<view class="rounded-15rpx bg-#fff pt-22rpx pb-22rpx">
<view
class="w-154rpx h-60rpx rounded-r-30rpx text-center center text-#123531 text-25rpx font-500"
style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)"
>
<view class="w-154rpx h-60rpx rounded-r-30rpx text-center center text-#123531 text-25rpx font-500"
style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)">
总检建议
</view>
<view class="pl-15rpx pr-25rpx pt-45rpx box-border">
@ -311,75 +281,47 @@ onShow(() => {
</view>
<view v-if="tabIndex == 1">
<view class="rounded-15rpx bg-#fff pt-22rpx pb-50rpx position-relative">
<view
class="w-154rpx h-60rpx mb-20rpx rounded-r-30rpx text-center line-height-[2.3] text-#123531 text-25rpx font-500"
style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)"
>
<view class="w-154rpx h-60rpx mb-20rpx rounded-r-30rpx text-center line-height-[2.3] text-#123531 text-25rpx font-500" style="background: linear-gradient(90deg, #edf6f5 0%, #bbdfe1 99%)">
全部检查
</view>
<!-- 展开全部 -->
<!-- <view
class="position-absolute top-20rpx right-0rpx text-#6D6D6D text-26rpx"
>
<view
id="qcInline"
class="flex flex-items-center"
@click="getOpenClick"
>
<view class="position-absolute right-35px w-120rpx">
{{ isopen ? "收起全部" : "展开全部" }}
</view>
<uni-collapse-item id="qcInline-item" :open="isopen">
</uni-collapse-item>
</view>
</view> -->
<view v-for="(item, index) in wzbg_list">
<uni-collapse
class="collapse-w"
@change="collapseClick"
v-model="currentIndex"
accordion
>
<uni-collapse class="collapse-w" @change="collapseClick" v-model="currentIndex" accordion>
<view class="position-relative" :key="index">
<view
v-if="item && item.error_count > 0"
class="position-absolute line-height-[96rpx] right-40px text-#6D6D6D text-15px"
>
<span class="text-#E46B1A">{{ item.error_count }}</span>
项异常
</view>
<uni-collapse-item
:name="item.id"
:open="item.isopen"
thumb=""
:title="index"
>
<view
class="p-20rpx pl-30rpx pr-30rpx"
v-if="item && item.details"
>
<view
class="bg-#FBF0EE b-0 b-1 b-solid b-#EADEDB rounded-15rpx pb-10rpx"
:class="item.error_count == 0 ? 'greenClor' : ''"
>
<view
:class="item.error_count == 0 ? 'greenTextClor' : ''"
class="w-141rpx line-height-[2] text-center text-#fff bg-#F6725B rounded-lt-15rpx rounded-rb-15rpx text-22rpx"
>
初步意见
<view v-if="item && item.error_count > 0" class="position-absolute line-height-[96rpx] right-40px text-#6D6D6D text-15px" style="pointer-events: none;">
<span class="text-#E46B1A">{{ item.error_count }}</span> 项异常
</view>
<uni-collapse-item :name="item.id" :open="item.isopen" thumb="" :title="index">
<view class="p-20rpx pl-30rpx pr-30rpx" v-if="item && item.details">
<view class="p-10rpx pt-20rpx pb-20rpx">
<view v-if="!item.details.is_pacs">
<table style="width: 100%; text-align: left ; ">
<thead>
<tr>
<th >项目名称</th>
<th >结果</th>
<th v-if="item.details.is_fanwei==''" >范围值</th>
</tr>
</thead>
<tbody>
<tr v-for="(obj, k) in item.details.list" :key="k">
<td> {{obj.基础项目名称}}</td>
<td>{{obj.结果值}} <span style="color: red;">{{obj.异常标识}}</span></td>
<td v-if="item.details.is_fanwei==''" >{{obj.结果值范围}}</td>
</tr>
</tbody>
</table>
<template v-if="item.error_count > 0">
<view
class="text-#E33939 text-22rpx line-height-[2] pl-20rpx pr-20rpx"
v-for="(text, i) in item.details.error_items"
:key="i"
>
{{ text }}
</view>
</template>
<view
class="text-#239EA3 text-22rpx line-height-[2] pl-20rpx pr-20rpx"
class=" text-22rpx line-height-[2] pl-20rpx pr-20rpx"
v-else
>
<!-- {{item.details.error_items.length}} -->
@ -392,107 +334,39 @@ onShow(() => {
未见明显异常</text
>
<template v-else>
<table style="width: 100%; text-align: left ;">
<thead>
<tr>
<th >检查所见</th>
<th >结论</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<text
v-for="(text, i) in item.details.suojian"
:key="i"
>
{{ text }}</text
>
</template>
</view>
</view>
<!-- <view v-if="1 < 0" class="flex flex-justify-around m-20rpx">
<view>
<view class="text-36rpx font-500"> 162.0 </view>
<view class="text-20rpx"> 身高cm </view>
</view>
<view>
<view class="text-40rpx font-500"> 58.8 </view>
<view class="text-20rpx"> 体重Kg </view>
</view>
</view> -->
<view class="p-10rpx pt-20rpx pb-20rpx">
<view v-for="(obj, k) in item.details.list" :key="k">
<view class="font-500 text-24rpx line-height-[2]">
{{ obj["基础项目名称"] }}
<span class="text-#737373 text-18rpx"
>({{obj["结果值"]}} {{ obj["结果值单位"] }})</span
>
</view>
<view class="pt-80rpx pb-30rpx">
<view class="h-4rpx bg-#E2E2E2 rounded-2rpx relative">
<view
class="bg-#239EA3 h-4rpx w-50% rounded-2rpx ma flex text-24rpx text-#7B7B7B flex-justify-between"
>
<!-- {{obj['结果值范围']}} -->
<text>{{ obj["结果值范围"][0] }}</text>
<text>正常</text>
<text>{{ obj["结果值范围"][1] }}</text>
</view>
<view
v-if="
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1]
"
class="bg-#F8C9C7 h-4rpx w-25% rounded-2rpx ma absolute bottom-0"
:class="{
'left-0': obj['结果值'] < obj['结果值范围'][0],
'right-0': obj['结果值'] > obj['结果值范围'][1],
}"
></view>
<view
class="center flex-col absolute"
:style="{
left:
calculatePercentage(
obj['结果值'],
obj['结果值范围'][0],
obj['结果值范围'][1],
obj['最大范围'][1]
) + '%',
}"
>
<view
class="text-34rpx absolute top--50rpx"
:class="{
'text-#239EA3':
obj['结果值'] >= obj['结果值范围'][0] &&
obj['结果值'] <= obj['结果值范围'][1],
'text-#F34932':
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1],
}"
</td>
<td>
<text
v-for="(text, i) in item.details.jielun"
:key="i"
>
<text>{{ obj["结果值"] }}</text>
<uni-icons
v-if="obj['结果值'] < obj['结果值范围'][0]"
type="arrow-down"
:size="16"
color="#F34932"
></uni-icons>
<uni-icons
v-if="obj['结果值'] > obj['结果值范围'][1]"
type="arrow-up"
:size="16"
color="#F34932"
></uni-icons>
</view>
<view
class="w-8rpx h-8rpx rounded-50% bg-#fff b-4rpx b-solid absolute -top-8rpx"
:class="{
'b-#1F8F94':
obj['结果值'] >= obj['结果值范围'][0] &&
obj['结果值'] <= obj['结果值范围'][1],
'b-#F34932':
obj['结果值'] < obj['结果值范围'][0] ||
obj['结果值'] > obj['结果值范围'][1],
}"
{{ text }}</text
>
</view>
</view>
</view>
</view>
</td>
</tr>
</tbody>
</table>
</template>
</view>
<view class=""> </view>
</view>
@ -508,18 +382,11 @@ onShow(() => {
</template>
<style scoped>
/* uni-collapse-item__title.uni-collapse-item-border */
::v-deep
#qcInline
#qcInline-item
.uni-collapse-item__title.uni-collapse-item-border {
::v-deep #qcInline #qcInline-item .uni-collapse-item__title.uni-collapse-item-border {
border: none !important;
}
::v-deep
#qcInline
#qcInline-item
.uni-collapse-item__wrap
.uni-collapse-item__wrap-content.open {
::v-deep #qcInline #qcInline-item .uni-collapse-item__wrap .uni-collapse-item__wrap-content.open {
border: none !important;
}
@ -544,4 +411,17 @@ onShow(() => {
background-color: #e8f6f5;
border: 2px solid #dce9e8;
}
table {
border-collapse: collapse;
width: 50%;
}
th, td {
border: 1px solid #e5e5e5;
padding: 8px;
}
th {
background-color: #f2f2f2;
}
</style>

File diff suppressed because it is too large Load Diff

@ -1,7 +1,9 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import PriceRange from "@/common/PriceRange.vue";
import Top from "../../../common/Top.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usersa0ChunLuyu
@ -37,6 +39,10 @@
type: String,
default: "",
},
isduibi:{
type:String,
default:""
}
});
const combo_active = ref("");
@ -65,6 +71,7 @@
let zhuangjianType=ref(19);
let TiShiPopupRef=ref(null);//
let SelectedComboInfo=ref(null);//
let CheckBoxComboIds=ref([]);
let sex_range=ref([
{ value: 0, text: "不限" },
@ -257,20 +264,29 @@
});
};
const contrastClick = async (item) => {
const contrastClick = async (item,k) => {
if (comboIds.value.includes(item.combo_id)) {
comboIds.value.splice(comboIds.value.indexOf(item.combo_id), 1);
$store.setComboContrast(comboIds.value);
} else {
if (comboIds.value.length < 3) {
comboIds.value.push(item.combo_id);
$store.setComboContrast(comboIds.value);
if($props.isduibi==1){
uni.navigateTo({
url: "/pages/buy/contrast/contrast",
});
}
} else {
uni.showToast({
title: "最多对比3个套餐",
icon: "none",
});
}
}
$store.setComboContrast(comboIds.value);
};
const hospital_active = ref(0);
@ -377,6 +393,21 @@
})
const buyClick = async (item) => {
if($store.getUser()?.id_number==""){
uni.$lu.toast("当前体检人身份证信息有误,请先完善身份证信息");
return false;
}
if($store.getTempPlan()?.plan_time && item.keyue_start_time!=null && item.keyue_end_time!=null){
let planTime=$store.getTempPlan()?.plan_time
let can= isTimeInRange(item.keyue_start_time,item.keyue_end_time,planTime)
if(!can){
uni.$lu.toast("此套餐不能预约当前时间,请选择"+item.keyue_start_time+'-'+item.keyue_end_time);
return false;
}
}
SelectedComboInfo.value=item
let checkup_type_id = $store.getCheckupTypeId();
console.log("----", checkup_type_id.id);
@ -401,6 +432,24 @@
// }
toDetail();
};
function isTimeInRange(startTime, endTime, targetTime) {
//
const convertToMinutes = (timeStr) => {
const [hours, minutes, seconds] = timeStr.split(':').map(Number);
return hours * 60 + minutes + seconds / 60;
};
const start = convertToMinutes(startTime);
const end = convertToMinutes(endTime);
const target = convertToMinutes(targetTime);
//
if (end < start) {
return target >= start || target <= end; //
} else {
return target >= start && target <= end; //
}
}
const nextItemClick = () => {
if (!itemId.value) {
@ -443,8 +492,9 @@
});
return;
}
$store.setComboContrast(comboIds.value);
uni.navigateTo({
url: "/pages/main/combo/tcdb",
url: "/pages/buy/contrast/contrast",
});
};
const ComboTypeClickFunc=(id)=>{
@ -482,6 +532,10 @@
const combosex_change=(value)=>{
screenObj.value.combo_sex=value
}
const sex_change=(value)=>{
screenObj.value.combo_sex=value
selectDone()
}
const tabsClickFunc=(value)=>{
tabs_active_id.value=value
if(value==2){
@ -501,38 +555,23 @@
</script>
<template>
<DraggableButton />
<view style="background-color: #d8eef3; padding-top: 20rpx;">
<TabBar></TabBar>
<view style="background-color: #fff;">
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
<view class="header_wrapper">
<view @click="toRouter"
class="center fixed pt-10rpx box-border left-40rpx bottom-5% rounded-full w-110rpx h-110rpx bg-#239EA3 flex-col">
class="center fixed pt-10rpx box-border left-40rpx bottom-12% rounded-full w-110rpx h-110rpx bg-#239EA3 flex-col">
<uni-badge :text="comboIds.length" absolute="rightTop" size="small">
<image src="@/static/assets/slices/duibi.png" mode="widthFix" class="w-42rpx" />
</uni-badge>
<text class="text-22rpx text-#fff -mt-5rpx">对比</text>
</view>
<!-- <view v-if="!!combo_list.hospital.id" class="hospital_wrapper">
<view class="hospital_icon_wrapper">
<image src="@/static/assets/dingwei@2x.png"></image>
</view>
<view class="hospital_name_wrapper">{{combo_list.hospital.name}}</view>
</view>
<view v-if="!!combo_list.info.name" class="user_wrapper" @click="tabPatients()">
<view class="user_title_wrapper">体检人</view>
<view class="user_name_wrapper">{{ combo_list.info.name }}</view>
<view v-if="combo_list.info.count > 1" class="user_choose_wrapper">
<image src="@/static/assets/qiehuan@2x.png"></image>
</view>
</view> -->
</view>
<Top></Top>
<!-- <Top></Top>
<view class="bg-#d8edf2" style="margin-top: -10rpx;">
<uni-search-bar class="search" radius="100" placeholder="请输入关键字搜索" @clear="getComboList()"
@cancel="getComboList()" @confirm="getComboList" />
@ -541,6 +580,17 @@
<view @click="tabsClickFunc(0)" :class="['top_button',{'top_button_active':tabs_active_id==false}]">选择套餐</view>
<view @click="tabsClickFunc(1)" :class="['top_button',{'top_button_active':tabs_active_id==true}]">专家定制</view>
<view @click="tabsClickFunc(2)" class="top_button">项目自选</view>
</view> -->
<view style="display: flex;flex-wrap: wrap; ">
<view @click="sex_change(0)" :class="['shaixuan_button',{'shaixuan_button_active': screenObj.combo_sex==0}]">
不限
</view>
<view @click="sex_change(1)" :class="['shaixuan_button',{'shaixuan_button_active': screenObj.combo_sex==1}]">
</view>
<view @click="sex_change(2)" :class="['shaixuan_button',{'shaixuan_button_active': screenObj.combo_sex==2}]">
</view>
</view>
<view class="select_wrapper flex" v-if="selectKey">
<template v-for="(value, key, index) in combo_select" :key="index">
@ -551,13 +601,13 @@
<view v-if="key == 'sort_list'">
{{ value[sortIndex]?.name || "综合排序" }}
</view>
<view v-if="key == 'sort_sale_count'">
<!-- <view v-if="key == 'sort_sale_count'">
{{ value[sort_salecount_index]?.name || "按销量" }}
</view>
<view v-if="key == 'sort_price'">
{{ value[sort_price_index]?.name || "按价格" }}
</view>
<view class="select_item_icon_wrapper">
</view> -->
<view v-if="key == 'sort_list'" class="select_item_icon_wrapper">
<image src="@/static/assets/xuanzegengduo@2x.png"></image>
</view>
</view>
@ -578,7 +628,7 @@
<view class="combo_info_wrapper">
<view class="combo_content_wrapper">
<view style="display: flex;">
<view class="combo_name_wrapper">{{ i.name }}
<view class="combo_name_wrapper" @click="buyClick(i)">{{ i.name }}
</view>
<uni-tooltip>
@ -620,10 +670,17 @@
</view>
</view>
<view class="combo_button_wrapper">
<view v-if="i.type_id!=zhuangjianType" @click="contrastClick(i)" class="combo_pick_button_wrapper">
{{comboIds.includes(i.combo_id) ? "已加入" : "对比"}}
<view v-if="i.type_id!=zhuangjianType" @click="contrastClick(i,k)" class="combo_pick_button_wrapper">
<view class="checkbox" v-if="comboIds.includes(i.combo_id)">
<uni-icons type="checkmarkempty" size="16" color="#239ea3"></uni-icons>
</view>
<view class="checkbox" v-else>
</view>
<view style="margin-left: 10rpx;">{{comboIds.includes(i.combo_id) ? "对比" : "对比"}}</view>
</view>
<view class="combo_buy_button_wrapper" @click="buyClick(i)"></view>
<view class="combo_buy_button_wrapper" @click="buyClick(i)"></view>
</view>
</view>
<view class="combo_line_wrapper"></view>
@ -659,7 +716,7 @@
</view>
</uni-popup>
<uni-popup ref="popup" mask-background-color="transparent" :animation="false">
<view class="pt-330rpx w-full h-100vh" @click="popup.close()">
<view class="pt-80rpx w-full h-100vh" @click="popup.close()">
<view class="bg-[rgba(0,0,0,0.3)] h-100%">
<view class="bg-#fff" :class="
selectKey != 'sort_list'
@ -693,10 +750,10 @@
</view>
</uni-popup>
<uni-popup ref="popup_new" mask-background-color="transparent" :animation="false" :is-mask-click="true" >
<view class="pt-292rpx w-full h-100vh" >
<view class="pt-100rpx w-full h-100vh" >
<view class="bg-[rgba(0,0,0,0.3)] h-100%">
<view class="popup_new_main">
<view style="">
<!-- <view style="">
<view class="shaixuan_title">性别</view>
<view style="display: flex;flex-wrap: wrap; ">
<view @click="combosex_change(0)" :class="['shaixuan_button',{'shaixuan_button_active': screenObj.combo_sex==0}]">
@ -709,14 +766,8 @@
</view>
</view>
<!-- <view>
<uni-data-select
v-model="screenObj.combo_sex"
:localdata="sex_range"
@change="combosex_change"
></uni-data-select>
</view> -->
</view>
<view class="shaixuan_title">套餐类型</view>
<view style="display: flex;flex-wrap: wrap; ">
<view v-for="(item,index) in combo_select.combo_type" @click="ComboTypeClickFunc(item.id)" :class="['shaixuan_button',{'shaixuan_button_active': comboIndex==item.id}]">
@ -764,7 +815,9 @@
</uni-popup>
</view>
</template>
<style scoped>
.tishi_main{
background-color: #fff;
padding: 40rpx 50rpx;
@ -837,7 +890,7 @@
.list_wrapper {
padding-top: 30rpx;
height: calc(100vh - 100rpx - 10rpx - 70rpx - 80rpx - 30rpx - 190rpx);
height: calc(100vh - 100rpx - 10rpx - 70rpx - 180rpx );
width: 750rpx;
overflow-y: auto;
padding-bottom: 30rpx;
@ -864,13 +917,17 @@
.combo_pick_button_wrapper {
width: 160rpx;
height: 60rpx;
background: #e1ecee;
border-radius: 30rpx;
margin-bottom: -20rpx;
font-weight: 400;
font-size: 28rpx;
color: #239ea3;
text-align: center;
line-height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
}
.combo_buy_button_wrapper {
@ -1261,5 +1318,14 @@
font-size: 20rpx;
margin-left: 10rpx;margin-top: 4rpx;
}
.checkbox{
height: 30rpx;
width: 30rpx;
border: 1px solid #009FA8;
display: flex;
justify-items: center;
align-items: center;
text-align: center;
}
</style>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usertcdb
@ -84,7 +85,7 @@
});
</script>
<template>
<DraggableButton />
<TabBar />
<view style="background-color: #c4d7db;min-height: calc(100vh - 100rpx);">
<view v-if="!!$store.config">
<view :ref="configRef"></view>

@ -1,4 +1,5 @@
<template>
<TabBar/>
<view class="ctime_main">
<view class="zhouli">
@ -24,7 +25,7 @@
:class="itemSelected.type=='tj'?'itemSelected':''">体检日期 <span v-if="tj_date && tj_time">{{tj_date}}
{{tj_time}}</span></view>
<view v-if="orderInfo" style="display: flex;justify-content: space-between;padding: 20rpx;color: #666;">
<view style="font-size: 26rpx; color: #666;">体检医生 - <span v-if="doctor_name"
<view style="font-size: 26rpx; color: #666;">体检医生 - <span v-if="doctor_name" @click="doctorNameClick()"
style="font-size: 28rpx;font-weight: 700;"> {{doctor_name}}</span></view>
<view style="font-size: 26rpx; color: #333;font-weight: 700;" @click="selectDoctor()"> </view>
</view>
@ -40,10 +41,11 @@
</view>
<view id="ylrl">
<uni-calendar :insert="false" :showMonth="false" ref="DoctorMonthCalendar" @confirm="DoctMonthConfirm" />
<uni-calendar :selected="MonthList" @monthSwitch="monthSwitch" :insert="false"
:showMonth="false" ref="MonthCalendar" @confirm="MonthConfirm" />
<uni-calendar ref="MonthCalendar" :start-date="GetToday()" :date="currentDate" :selected="MonthList" @monthSwitch="monthSwitch" :insert="false"
:showMonth="false" @confirm="MonthConfirm" />
</view>
</view>
</template>
<script setup>
@ -64,6 +66,7 @@
onShow,onLoad
} from "@dcloudio/uni-app";
import WeeklyCalendar from '@/common/WeeklyCalendar.vue';
import TabBar from "@/common/TabBar.vue";
let nmr_date = ref(null);
let nmr_time = ref(null);
let nmr_plan_id = ref(null); //id
@ -76,6 +79,23 @@
let weekList = ref(null);
let doctor_name = ref(null);
const doctorNameClick=()=>{
if (doctor_name.value) {
uni.showModal({
title: '提示',
content: '是否取消预约此医生',
cancelText: '关闭',
confirmText: '确定',
success: function(res) {
if (res.confirm) {
doctor_name.value = null //
} else if (res.cancel) {
}
}
});
}
}
//
const GetDayPlanListFunc = async () => {
uni.showLoading();
@ -86,7 +106,9 @@
use_type: orderInfo.value.type,
checkup_type_id: orderInfo.value.checkup_type_id,
amount: orderInfo.value.true_price,
combo_id: orderInfo.value.combo_id?orderInfo.value.combo_id:""
combo_id: orderInfo.value.combo_id?orderInfo.value.combo_id:"",
danwei_id:orderInfo.value.appointment_back_info?.单位Id,
big_date:MonthSelectedDate.value
}
const response = await $api("GetDayPlanList", data);
uni.hideLoading();
@ -166,6 +188,7 @@
confirmText:'确定',
success: function (res) {
if (res.confirm) {
currentDate.value=date
DateChange(date)
} else if (res.cancel) {
@ -173,6 +196,7 @@
}
});
}else{
currentDate.value=date
DateChange(date)
}
}
@ -188,6 +212,9 @@
if (itemSelected.value.type == 'tj') {
tj_time.value = timeinfo.time
tj_plan_id.value = timeinfo.id
let temp = $store.getYytjInfo()
temp.nmr_list[0].time = selectedDate.value+ ' '+ timeinfo.time
$store.setYytjInfo(temp)
}
}
let itemSelected = ref({
@ -260,8 +287,12 @@
GetMonthPlanListFunc(ym)
}
}
let MonthSelectedDate=ref('');//,7
const MonthConfirm = (e) => { //
console.log(e.fulldate)
// if(e.extraInfo.date ==undefined){
// uni.$lu.toast("");
// return false
// }
if(doctor_name.value){
uni.showModal({
@ -271,6 +302,7 @@
confirmText:'确定',
success: function (res) {
if (res.confirm) {
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
} else if (res.cancel) {
@ -278,6 +310,7 @@
}
});
}else{
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
}
@ -293,17 +326,35 @@
use_type: orderInfo.value.type,
checkup_type_id: orderInfo.value.checkup_type_id,
amount: orderInfo.value.true_price,
danwei_id:orderInfo.value.appointment_back_info?.单位Id,
combo_id: orderInfo.value.combo_id?orderInfo.value.combo_id:"",
}
const response = await $api("GetMonthPlanCount", data);
uni.hideLoading();
$response(response, () => {
let rlArr = [];
response.data.list.forEach((item) => {
let info=""
if(item.count===0){
info="满号"
}
if(item.date<GetToday()){
info=" "
}
if(item.count == -1){
info=" "
}
let o = {
date: item.date,
info: "余号" + item.count,
// info: "" + item.count,
info:info
};
if ((item.count >= -1 && item.date!=GetToday()) ||(item.date==GetToday() && item.count === 0) ) {
rlArr.push(o);
}
});
MonthList.value = rlArr;
//MonthCalendar.value.open()
@ -337,7 +388,11 @@
await NMRGetMonthPlanListFunc()
}
if (itemSelected.value.type == 'tj') {
await GetMonthPlanListFunc()
let ym=''
if(tj_date.value<GetToday()){
ym=GetToday()
}
await GetMonthPlanListFunc(ym)
}
MonthCalendar.value.open()
}
@ -413,6 +468,18 @@ const DateChange=(date)=>{
onShow(() => {
temp = $store.getYytjInfo()
if(temp.nmr_list && temp.nmr_list[0].name=='体检时间' && temp.nmr_list[0].time!=''){
tj_time.value = temp.nmr_list[0].time.substring(11,19)
tj_date.value = temp.nmr_list[0].time.substring(0,10)
selectedDate.value=tj_date.value
selectedTime.value =tj_time.value
tj_plan_id.value=temp.nmr_list[0].id
console.log(tj_time.value)
console.log(tj_date.value)
console.log(tj_plan_id.value)
}
if (temp.doctor_name != null && temp.doctor_name != '') {
doctor_name.value = temp.doctor_name
}
@ -421,13 +488,25 @@ const DateChange=(date)=>{
tj_date.value = null
tj_plan_id.value=null
}
if(temp.doctor_date){
if(temp.doctor_date!=tj_date.value && temp.doctor_date!=undefined){
selectedTime.value = null
tj_date.value = temp.doctor_date
MonthSelectedDate.value=temp.doctor_date
currentDate.value=temp.doctor_date
DateChange(temp.doctor_date)
}
})
const GetToday = () => {
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
</script>
<style scoped lang="scss">
@ -462,27 +541,35 @@ const DateChange=(date)=>{
}
::v-deep #ylrl {
.uni-calendar--fixed{
bottom: 110rpx !important;
}
.uni-calendar__header,
.uni-calendar__weeks-day {
border: none;
}
.uni-calendar-item--checked {
background-color: transparent;
color: #239ea3 !important;
.uni-calendar-item__weeks-box-item {
background-color: #239ea3 !important;
background-color: #EBFBFF !important;
border-radius: 12rpx;
.uni-calendar-item--extra {
color: #fff !important;
color: #239ea3 !important;
}
}
}
.uni-calendar-item--isDay {
background-color: #239ea3 !important;
background-color: #EBFBFF !important;
border-radius: 12rpx;
color: #fff !important;
color: #239ea3 !important;
.uni-calendar-item--extra{
color:#ff5500 !important;
}
}
.uni-calendar-item--extra {
color: #239ea3;
color: #ff5500;
font-size: 21rpx !important;
}
.uni-calendar-item__weeks-box {
@ -497,10 +584,22 @@ const DateChange=(date)=>{
color: #333;
}
.uni-calendar-item__weeks-box-text {
font-size: 26rpx;
font-size: 30rpx;
// font-weight: 700;
color: #239ea3;
}
.uni-calendar-item--disable{
color:#c0c0c0 !important;
font-weight: 400;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--extra) {
color: #ccc ;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--disable) {
color: #ccc !important;
}
.uni-calendar-item__weeks-lunar-text {
font-size: 16rpx;
font-size: 30rpx;
}
.uni-calendar-item__weeks-box-item {
@ -510,4 +609,5 @@ const DateChange=(date)=>{
display: none;
}
}
</style>

@ -4,6 +4,7 @@
* usersa0ChunLuyu
* date2024年8月7日 20:05:05
*/
import TabBar from "@/common/TabBar.vue";
import {
ref
} from 'vue'
@ -211,18 +212,24 @@
url: '/pages/other/entry/index?path=/pages/physical-examination/location/index'+p
})
};
const gotoo=()=>{
const gotoUrl=(url)=>{
if (url.includes('https://')) {
window.location.href = $store.config.banner.jump
} else if (url.includes('/pages/')) {
uni.navigateTo({
url: "/pages/test/test"
url: url
})
}
}
//
let NoticeInfo=ref([])
const GetNoticeFunc = async () => {
uni.showLoading();
const response = await $api("GetHomeNotice",{person_id:$store.getUser().person_id,id_number:$store.getUser().id_number});
uni.hideLoading();
$response(response, async () => {
$response(response, () => {
NoticeInfo.value=response.data
if (!!$props.path && $props.path=='order') {
uni.navigateTo({
@ -262,33 +269,39 @@
getUserInfo()
let buyinfo=$store.getBuyInfo()
buyinfo.combo_id=''
buyinfo.item_ids=[]
buyinfo.combo_sex=''
buyinfo.group_id=''
buyinfo.person_id=''
buyinfo.sanfang_code={}
$store.setBuyInfo(buyinfo)
$store.setCheckupTypeId({});
$store.setDuoXuanYi({});
$store.setPeiOuUser({});
})
onLoad(()=>{
$store.setTempPlan({})
$store.setYytjInfo({})
$store.setYuYueFangShi('')
$store.setGroupInfo({})
$store.setComboContrast([]);
})
</script>
<template>
<TabBar></TabBar>
<view>
<view v-if="!!$store.config">
<view @click="bannderClick()" class="bannder_wrapper">
<!-- <view @click="bannderClick()" class="bannder_wrapper">
<image :src="$image($store.config.banner.image)"></image>
</view>
</view> -->
<view v-if="!!$store.user" class="user_wrapper">
<view class="user_box_wrapper" :ref="userBoxRef">
<view v-if="!!hospital_info" class="map_wrapper">
<!-- <view v-if="!!hospital_info" class="map_wrapper">
<view class="map_icon_wrapper">
<image src="@/static/assets/dingwei.png"></image>
</view>
<view class="map_name_wrapper" @click="OpenMap()">{{ hospital_info.name }}</view>
<view v-if="!!hospital_info.long" class="map_long_wrapper">{{ hospital_info.long }}km</view>
</view>
</view> -->
<view class="logo_wrapper">
<image :src="$image($store.config.logo)"></image>
</view>
@ -326,8 +339,16 @@
</view>
</view>
</view>
<view class="botm_blank_wrapper" style="font-size: 18rpx;color: #ccc;">04042207</view>
<view>
<swiper v-if="$store.config?.lunbo" class="bannder_wrapper" circular interval="2000" autoplay="true" >
<swiper-item v-for="(item,index) in $store.config.lunbo" :key="index" @click="gotoUrl(item.action)">
<image :src="$image(item.url)"></image>
</swiper-item>
</swiper>
</view>
<view class="botm_blank_wrapper" style="font-size: 18rpx;color: #ccc;">05122226</view>
</view>
</view>
</template>
<style scoped>
@ -627,6 +648,7 @@
position: relative;
z-index: 1;
margin: 0 auto;
margin-top: 20rpx;
}
.bannder_wrapper image {
@ -641,6 +663,7 @@
height: 75rpx;
margin: 0 auto;
position: relative;
margin-top: 110rpx;
}
.user_box_wrapper {

@ -31,11 +31,11 @@
title: '支付成功'
});
if(response.data.is_yuyue){
uni.redirectTo({
uni.reLaunch({
url: '/pages/buy/done/yuyue_done?id='+response.data.id
});
}else{
uni.redirectTo({
uni.reLaunch({
url: '/pages/buy/done/done?id='+response.data.id
});
}

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usersa0ChunLuyu
@ -132,7 +133,8 @@ import DraggableButton from "@/pages/components/goHome.vue";
})
</script>
<template>
<DraggableButton />
<TabBar></TabBar>
<!-- <DraggableButton /> -->
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
@ -157,7 +159,7 @@ import DraggableButton from "@/pages/components/goHome.vue";
height: calc(100vh - 100rpx - 30rpx);
width: 750rpx;
overflow-y: auto;
padding-bottom: 30rpx;
padding-bottom: 140rpx;
margin: 0 auto;
overflow-x: hidden;
background: #F8F8F8;

@ -386,7 +386,7 @@
<view style="font-size: 26rpx; text-align: center; color:#ec4d15 ;margin-top: 16rpx;">温馨提示转赠成功后无法线上退款</view>
</view>
<view v-if="OrderInfoDetail.transfer_type==2">
<view>转赠码</view>
<view>转赠码<span style="color: #ec4d15;">仅限一人使用</span></view>
<view style="display: flex;align-items: center;">
<view style="margin-right: 10rpx;">{{OrderInfoDetail.transfer_code?OrderInfoDetail.transfer_code:''}}</view>
@ -421,15 +421,15 @@
<view style="background-color: #fff;padding: 20rpx;border-radius: 10rpx; width: 600rpx;" v-if="OrderInfoDetail.buy_info">
<view>{{OrderInfoDetail.title}}</view>
<view class="OrderInfoRow">
<view class="row_label">体检人:</view>
<view class="row_label">体检人:</view>
<view class="row_value">{{OrderInfoDetail.name}}</view>
</view>
<view class="OrderInfoRow">
<view class="row_label">订单:</view>
<view class="row_label">订单:</view>
<view class="row_value">{{OrderInfoDetail.order_number}}</view>
</view>
<view class="OrderInfoRow">
<view class="row_label">类型:</view>
<view class="row_label">体检类型:</view>
<view class="row_value"><span v-if="OrderInfoDetail.type==1"></span><span
v-if="OrderInfoDetail.type==2">团检</span></view>
</view>
@ -438,6 +438,11 @@
<view class="row_value">{{OrderInfoDetail.appointment_date}} {{OrderInfoDetail.appointment_time}}
</view>
</view>
<view class="OrderInfoRow" v-if="OrderInfoDetail.doctor">
<view class="row_label">预约医生:</view>
<view class="row_value">{{OrderInfoDetail.doctor}}
</view>
</view>
<view class="OrderInfoRow" v-if="OrderInfoDetail.erxian_appointment_info &&OrderInfoDetail.erxian_appointment_info.length>0">
<view class="row_label">核磁项目:</view>
<view class="row_value" v-for="(item,index) in OrderInfoDetail.erxian_appointment_info" :key="index">
@ -489,14 +494,18 @@
<view style="margin-right: 10rpx;">{{OrderInfoDetail.transfer_code?OrderInfoDetail.transfer_code:''}}</view>
<button @click="fuzhi()" size="mini" type="default" >复制</button>
</view>
<view style="border: 1px solid #ccc;padding: 10rpx;">
<w-qrcode :options="{
level: 4,
size: 240,
size: 260,
code: OrderInfoDetail.transfer_code?OrderInfoDetail.transfer_code:'',
}"></w-qrcode>
</view>
</view>
</view>
<view class="OrderInfoRow" v-if="OrderInfoDetail.transfer_type==1">
<view class="row_label">已转赠至:</view>
<view class="row_value">{{OrderInfoDetail.transfer_order?OrderInfoDetail.transfer_order.name:''}}</view>
@ -517,12 +526,16 @@
<view v-if="[4].includes(order_info.status)"> </view>
<view v-if="[6].includes(order_info.status)"> </view>
</view>
<view style="display: flex;align-items: center;padding-left: 24rpx; ">
<uni-icons type="vip" color="#b2d8df" size="26"></uni-icons>
<view class="combo_name_wrapper">{{ order_info.title }}</view>
</view>
<view class="line"></view>
<view class="order_info_wrapper">
<view style="display: flex;">
<view>
<view class="order_info_line_wrapper">
<view class="order_info_line_label_wrapper">体检人</view>
<view class="order_info_line_label_wrapper">体检人</view>
<view class="order_info_line_value_wrapper">{{
order_info.name
}}</view>
@ -536,21 +549,21 @@
</view>
<view v-if="(order_info.status==2 || order_info.status==4) && order_info.appointment_number">
<w-qrcode @click="erweima_click(order_info.appointment_number)"
class="absolute top-80rpx right-15rpx b-1 b-dashed b-#000 p-8rpx" :options="{
class="absolute top-90rpx right-15rpx b-1 b-dashed b-#000 p-8rpx" :options="{
level: 4,
size: 150,
size: 122,
code: order_info.appointment_number,
}"></w-qrcode>
</view>
</view>
<view class="order_info_line_wrapper" v-if="order_info.order">
<view class="order_info_line_label_wrapper">订单</view>
<view class="order_info_line_label_wrapper">订单</view>
<view class="order_info_line_value_wrapper">
{{order_info.order}}
</view>
</view>
<view class="order_info_line_wrapper">
<view class="order_info_line_label_wrapper">类型</view>
<view class="order_info_line_label_wrapper">体检类型</view>
<view class="order_info_line_value_wrapper">
{{order_info.type}}
</view>
@ -575,7 +588,7 @@
<text class="time_red">{{ count_down_text }}</text>
<text>内完成支付</text>
</view>
<view style="margin-top: 4rpx;" v-if="[2].includes(order_info.status) && order_info.checkup_type_id==4 && order_info.end_time">
<view style="margin-top: 4rpx;" v-if="[2].includes(order_info.status) && order_info.checkup_type_id==4 && (order_info.title=='男性免费婚检(双方)' || order_info.title=='女性免费婚检(双方)') && order_info.end_time">
<text>请让您的配偶在</text>
<text class="time_red">{{ count_down_text }}</text>
<text>内完成婚检预约</text>
@ -602,7 +615,7 @@
<view
v-if="[2].includes(order_info.status) && (order_info.plan_id=='' || order_info.plan_id==null) && order_info.person_id !==0 "
@click="toPlan(order_info.id)" class="button_item_wrapper change_button_wrapper">
开始预约</view>
预约</view>
<view
v-if="[2].includes(order_info.status) && (order_info.plan_id=='' || order_info.plan_id==null) && order_info.type=='个检' && order_info.title!='自选项目' && order_info.person_id !=0 && order_info.checkup_type_id != 4"
@click="ZhuanZeng(order_info.id)" class="button_item_wrapper change_button_wrapper">
@ -614,7 +627,7 @@
报告解读
</view> -->
<view v-if="[2].includes(order_info.status) && order_info.type=='' && !order_info.source?.includes('')" @click="Refound(order_info)"
class="button_item_wrapper refund_button_wrapper">退款</view>
class="button_item_wrapper refund_button_wrapper"><span v-if="order_info.true_price>0">退</span><span v-else></span></view>
</view>
</view>
<view v-else class="order_pay_blank_wrapper"></view>
@ -671,9 +684,8 @@
}
.order_pay_time_wrapper {
font-weight: 500;
font-size: 20rpx;
color: #8b8b8b;
font-size: 24rpx;
color: #101010;
line-height: 26rpx;
}
@ -694,7 +706,7 @@
.order_line_wrapper {
width: 660rpx;
height: 1rpx;
background: #ebeaea;
background: #f0f0f0;
margin: 19rpx auto 0;
}
@ -717,7 +729,7 @@
}
.order_info_wrapper {
margin-top: 14rpx;
margin-top: 0rpx;
}
.order_info_line_wrapper {
@ -727,18 +739,18 @@
}
.order_info_line_label_wrapper {
width: 120rpx;
width: 140rpx;
font-weight: 400;
font-size: 24rpx;
color: #8b8b8b;
font-size: 26rpx;
color: #101010;
line-height: 1;
margin-left: 30rpx;
}
.order_info_line_value_wrapper {
font-weight: 400;
font-size: 24rpx;
color: #333333;
font-size: 26rpx;
color: #101010;
line-height: 1;
margin-left: 10rpx;
}
@ -746,11 +758,10 @@
.combo_name_wrapper {
padding-top: 4rpx;
width: calc(550rpx - 30rpx);
font-weight: bold;
font-size: 32rpx;
color: #0e0e0e;
font-size: 26rpx;
color: #101010;
line-height: 1;
margin-left: 30rpx;
margin-left: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@ -758,7 +769,7 @@
.order_status_wrapper {
position: absolute;
top: 30rpx;
top: 27rpx;
right: 27rpx;
font-size: 26rpx;
}
@ -790,7 +801,7 @@
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.05);
border-radius: 10rpx;
margin: 0 auto;
padding-top: 35rpx;
padding-top: 20rpx;
margin-top: 16rpx;
}
@ -854,4 +865,8 @@
margin-top: 30rpx;
color:#474241;
}
.line{
border-bottom: 1rpx solid #f0f0f0;
margin: 10rpx 30rpx -10rpx 30rpx;
}
</style>

@ -73,7 +73,11 @@
})
})
}
const gotoUrl=(url)=>{
uni.redirectTo({
url:url
})
}
onShow(() => {
if (!!config_ref.value) {
mountedAction()
@ -92,6 +96,7 @@
<uni-icons color="#ffffff" type="checkmarkempty" size="80"></uni-icons>
</view>
<view class="done_tip_wrapper">问卷已提交感谢您的参与</view>
<view class="done_tip_button" @click="gotoUrl('/pages/main/index/index')"></view>
</view>
<view v-else>
<view class="banner_wrapper">
@ -323,4 +328,16 @@
display: block;
object-fit: contain;
}
.done_tip_button{
border: 1px solid #239EA3;
width: 400rpx;
margin: auto;
text-align: center;
border-radius: 20rpx;
background-color: #239EA3;
color: #fff;
margin-top: 100rpx;
height: 80rpx;
line-height: 80rpx;
}
</style>

@ -21,6 +21,7 @@
import QuestionComponent from '../src/question.vue'
import Question2Component from '../src2/question.vue'
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
const $store = useStore()
const $props = defineProps({
id: {
@ -312,8 +313,8 @@
}
</script>
<template>
<DraggableButton />
<view style="background-color:#d8eef3 ;">
<TabBar />
<view style="background-color:#d8eef3 ;padding-bottom: 40rpx;">
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usermyddc
@ -219,7 +220,7 @@ const sumbilt = async () => {
if (!val.answer.length) {
//
uni.showToast({
title: "请完成当前问题",
title: "请完成全部问题",
icon: "none",
});
return;
@ -229,7 +230,7 @@ const sumbilt = async () => {
let indexItem = val.index[j];
if (!val.more[indexItem] && val.isInputList[indexItem]) {
uni.showToast({
title: "请完成当前问题",
title: "请填写第"+(i+1)+"题原因",
icon: "none",
});
return;
@ -268,8 +269,8 @@ onShow(() => {
});
</script>
<template>
<DraggableButton />
<view>
<TabBar />
<view style="padding-bottom: 140rpx;">
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* userselectDoctor
@ -30,6 +31,10 @@
type: String,
default: "",
},
person: {
type: String,
default: "",
},
month: {
type: String,
default: "",
@ -63,7 +68,7 @@
hospital: $store.save.hospital,
date: dqDate.value,
month: $props.month,
person_id: user_person.value.person_id,
person_id: $props.person?$props.person: user_person.value.person_id,
checkup_type: c_type.id,
zhou_firstday: zhou_firstday.value
};
@ -109,8 +114,7 @@
}
};
const clickDoctor = (item) => {
if(yytjInfo.value.nmr_list != null && yytjInfo.value.nmr_list.length>0 && yytjInfo.value.nmr_list[0].time.substring(0,10) != selectedDate.value && selectedDate.value!='' &&selectedDate.value!=null){
if(yytjInfo.value.nmr_list != null && yytjInfo.value.nmr_list.length>0 && yytjInfo.value.nmr_list[0].time !="" && yytjInfo.value.nmr_list[0].time.substring(0,10) != selectedDate.value && selectedDate.value!='' &&selectedDate.value!=null){
console.log('日期不一致');
uni.showModal({
title: "提示",
@ -241,7 +245,7 @@
});
</script>
<template>
<DraggableButton />
<TabBar />
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
@ -416,15 +420,16 @@
.uni-calendar-item--isDay-text {
color: #333;
}
.uni-calendar-item__weeks-box-text {
font-size: 26rpx;
font-size: 29rpx;
}
.uni-calendar-item__weeks-lunar-text {
font-size: 16rpx;
font-size: 30rpx;
}
.uni-calendar-item__weeks-box-item {

@ -69,7 +69,12 @@ const choosePersonClick = async (info) => {
id_number: info.id_number,
phone: info.phone,
});
uni.hideLoading();
if(response.status==false && response.msg=='体检系统提示找不到预约Id关联的团检登记信息'){
uni.$lu.toast("没有可预约的团检信息");
return false;
}
$response(response, () => {
unitList.value = response.data.unit;
if(unitList.value.length==0){

@ -174,7 +174,7 @@ const toDetails = (type) => {
<text class="text-#000000 text-32rpx">按套餐选择</text>
<uni-icons type="right" color="#595757" size="26"></uni-icons>
</view>
<view
<!-- <view
class="py-30rpx mt-70rpx pl-50rpx pr-130rpx between box-border rounded-15rpx shadow-[0px_1rpx_4rpx_0px_rgba(0,164,172,0.16)]"
@click="toDetails(2)"
>
@ -183,7 +183,7 @@ const toDetails = (type) => {
</view>
<text class="text-#000000 text-32rpx">按项目选择</text>
<uni-icons type="right" color="#595757" size="26"></uni-icons>
</view>
</view> -->
</view>
</view>
</view>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usersa0ChunLuyu
@ -16,6 +17,7 @@
import {
onShow
} from "@dcloudio/uni-app";
import wx from "weixin-js-sdk";
import {
useStore
} from "@/store";
@ -44,9 +46,26 @@
let popupXuZhi=ref(null);
let active_miaoshu=ref([]);//
let buy_info=ref({});
let userInfo = ref(""); //
let buyInfo = ref({}); //
let yytjInfo = ref({}); //
let truePrice = ref(0); //
let save_money = ref(0);
let integral = ref(0);
let couponList = ref([]);
let yucunkuan = ref(0); //
let jifen = ref(0); //
let keyong_jifen = ref(0); //
let netReceiptsPrice = ref(0);
let erxianInfo = ref(null);
let selectStatus = ref(null);
let popup = ref(null);
let selectIndex = ref(0);
let PayPopupTip=ref(null);
let CreatedOrderId=ref(0);
const GetReadmeDetails = async () => {
const response = await $api("GetReadme");
const response = await $api("GetReadme",{sex:comboInfo.value.combo_sex?comboInfo.value.combo_sex:0});
$response(response, () => {
notice.value = response.data || false;
if (tabIndex.value == 0) {
@ -145,6 +164,13 @@
title: "加载中",
});
getBuyInfo(); //
buyInfo.value = $store.getBuyInfo();
userInfo.value=$store.getUser()
let time = setTimeout(() => {
GetPersonIntegralSaveMoneyCouponInfo();
clearTimeout(time);
}, 500);
};
const buy = async (step=0) => {
@ -171,7 +197,7 @@
person_id: personId.value,
group_id: groupId.value,
item_ids: selectIds.value,
hospital: $store.save_info.hospital,
hospital: $store.save_info?.hospital?$store.save_info?.hospital:1,
duo_xuan_yi: $store.getDuoXuanYi(),
wj: wj.value,
sanfang_code:buy_info.value.sanfang_code?.code_num?buy_info.value.sanfang_code:null
@ -187,9 +213,18 @@
}
uni.setStorageSync("yytjInfoS", {});
popupXuZhi.value.close()
if (groupId.value || buy_info.value.sanfang_code?.code_num) {
//
uni.navigateTo({
url: "/pages/main/tjyy/tjyy",
url: '/pages/main/yytjsj/yytjsj_new'
});
}else{
// uni.navigateTo({
// url: "/pages/main/tjyy/tjyy",
// });
comfrimyy()
}
}
};
@ -252,9 +287,315 @@
tabIndex.value = 0;
contentInfo.value=contentInfo.value.flat()
$store.setBuyInfo({
combo_id: comboId.value,
combo_sex:comboInfo.value.combo_sex,
person_id: personId.value,
group_id: groupId.value,
item_ids: selectIds.value,
hospital: $store.save_info?.hospital?$store.save_info?.hospital:1,
duo_xuan_yi: $store.getDuoXuanYi(),
wj: wj.value,
sanfang_code:buy_info.value.sanfang_code?.code_num?buy_info.value.sanfang_code:null
});
let time2 = setTimeout(() => {
getnmrList();
clearTimeout(time2);
}, 500);
});
};
const getnmrList = async () => {
//
yytjInfo.value = $store.getYytjInfo();
buyInfo.value=$store.getBuyInfo()
console.log(yytjInfo.value);
const response = await $api("BuyInfo", buyInfo.value);
$response(response, () => {
if (buyInfo.value.group_id && response.data.group_info.length) {
//
groupInfo.value = response.data.group_info[0];
}
comboInfo.value = response.data.combo_info;
itemsInfo.value = response.data.items_info;
truePrice.value = response.data.true_price;
erxianInfo.value = response.data.nmr_list2;
yytjInfo.value.erxianInfo = erxianInfo.value;
netReceiptsPrice.value = response.data.true_price;
if (itemsInfo.value.items?.length) { //
let cailiao_price = 0
let cailiao_keshi_key = false;
itemsInfo.value.items.forEach((v, i) => {
if (v.keshi_name == "材料费") {
cailiao_keshi_key = i
v.children.forEach((v2, i2) => {
cailiao_price = (Number(cailiao_price) + Number(v2.price))
.toFixed(2);
})
}
})
if (cailiao_keshi_key) {
itemsInfo.value.items[cailiao_keshi_key] = {
keshi_name: "材料费",
children: [{
name: "材料",
desc: "",
price: cailiao_price
}]
}
}
}
if (yytjInfo.value.couponPrice) {
//
// netReceiptsPrice.value = (
// netReceiptsPrice.value - yytjInfo.value.couponPrice
// ).toFixed(2);
}
if (yytjInfo.value.prepaidPrice) {
//
yucunkuan.value =
yytjInfo.value.prepaidPrice > netReceiptsPrice.value ?
netReceiptsPrice.value :
yytjInfo.value.prepaidPrice;
netReceiptsPrice.value = (
netReceiptsPrice.value - yucunkuan.value
).toFixed(2);
} else {
yucunkuan.value = 0;
}
if (yytjInfo.value.pointsPrice) {
//
jifen.value =
yytjInfo.value.pointsPrice > netReceiptsPrice.value ?
netReceiptsPrice.value :
yytjInfo.value.pointsPrice;
netReceiptsPrice.value = (netReceiptsPrice.value - jifen.value).toFixed(
2
);
} else {
jifen.value = 0;
}
if (!yytjInfo.value?.nmr_list?.length) {
yytjInfo.value.nmr_list = response.data.nmr_list.map((val) => {
return {
...val,
time: "",
id: "",
};
});
yytjInfo.value.nmr_list.push({
item_id: -1,
name: "体检时间",
time: "",
id: "",
});
}
uni.hideLoading();
});
$store.setYytjInfo(yytjInfo.value);
};
const GetPersonIntegralSaveMoneyCouponInfo = async () => {
// , ,
const response = await $api("GetPersonIntegralSaveMoneyCouponInfo", {
person_id: $store.getUser()?.person_id,
combo_id: buyInfo.value.combo_id
});
$response(response, () => {
couponList.value = response.data.coupon_list;
save_money.value = response.data.save_money;
integral.value = response.data.integral;
});
};
const UsableIntegralSaveMoney = async () => {
//
const response = await $api("UsableIntegralSaveMoney", {
person_id: $store.getUser()?.person_id,
ysje: netReceiptsPrice.value,
ssje: truePrice.value,
type: 1,
});
$response(response, () => {
keyong_jifen.value = response.data.keyong_jifen;
if (keyong_jifen.value) {
selectStatus.value = 1;
popup.value.open("bottom");
if (yytjInfo.value.pointsPrice) {
selectIndex.value = 1;
} else {
selectIndex.value = 0;
}
} else {
uni.$lu.toast("暂无积分");
}
});
};
const comfrimyy = async () => {
let plan_id = "";
let plan_nmr_id = "";
uni.showLoading();
console.log(yytjInfo.value?.nmr_list);
if (yytjInfo.value?.nmr_list?.length > 1) {
plan_nmr_id = yytjInfo.value?.nmr_list[0]?.id;
}
if (yytjInfo.value?.nmr_list?.length > 0) {
plan_id = yytjInfo.value?.nmr_list[yytjInfo.value?.nmr_list.length - 1]?.id;
}
console.log(groupInfo.value);
let obj = {
person_id: buyInfo.value.person_id,
type: buyInfo.value.group_id ? 2 : 1,
hospital: buyInfo.value.hospital,
group_id: buyInfo.value.group_id,
combo_id:
buyInfo.value?.combo_id ||
(groupInfo.value?.combo_id ? "" : userInfo.value?.combo_id) ||
"",
item_ids: buyInfo.value.item_ids,
plan_id: plan_id,
plan_nmr_info:yytjInfo.value?.nmr_list || null,
doctor: yytjInfo.value?.doctor_name || "",
duo_xuan_yi: $store.getDuoXuanYi(),
jifen: Math.ceil(jifen.value),
yucunkuan: yucunkuan.value,
coupon_id:yytjInfo.value?.couponId || null,
wj: buyInfo.value.wj,
erxian_info:erxianInfo.value,
peiou_info:$store.getPeiOuUser(),//
sanfang_code:buyInfo.value.sanfang_code?.code_num?buyInfo.value.sanfang_code:null
};
console.log(obj);
let apiName="CreateNewOrder"
let doneUrl="/pages/buy/done/done?id="
if($store.tempPlan?.plan_id){
apiName="OrderCreate"
doneUrl="/pages/buy/done/yuyue_done?id="
obj.plan_id=$store.tempPlan?.plan_id
obj.yuyue_fangshi='GeJianPlanFront'
}
const response = await $api(apiName, obj);
$response(response, () => {
if (response.status) {
CreatedOrderId.value=response.data.orderid
if (response.data.action == "pay") {
StartPay(CreatedOrderId.value);
} else {
uni.reLaunch({
url: doneUrl+ CreatedOrderId.value
});
}
}
uni.hideLoading();
});
};
const selectDiscount = (status) => {
//
if (status == 2) {
//
if (couponList.value.length) {
toRouter("/pages/main/coupon/coupon");
} else {
uni.$lu.toast("暂无优惠券");
}
}
if (status == 1) {
//
if (!jifen.value && !netReceiptsPrice.value) {
uni.$lu.toast("实际金额已为0元无需使用积分");
return;
}
UsableIntegralSaveMoney();
}
if (status == 3) {
//
if (!yucunkuan.value && !netReceiptsPrice.value) {
uni.$lu.toast("实际金额已为0元无需使用预付款");
return;
}
if (save_money.value) {
selectStatus.value = status;
if (yytjInfo.value.prepaidPrice) {
selectIndex.value = 1;
} else {
selectIndex.value = 0;
}
popup.value.open("bottom");
} else {
uni.$lu.toast("暂无预付款");
}
}
};
const comfrimSelect = () => {
//
if (selectStatus.value == 1) {
//
if (selectIndex.value) {
yytjInfo.value.pointsPrice = keyong_jifen.value;
// 使 使
if (keyong_jifen.value > netReceiptsPrice.value) {
jifen.value = netReceiptsPrice.value;
} else {
jifen.value = keyong_jifen.value;
}
netReceiptsPrice.value = (netReceiptsPrice.value - jifen.value).toFixed(
2
);
$store.setYytjInfo(yytjInfo.value);
} else {
if (yytjInfo.value.pointsPrice) {
console.log(jifen.value);
console.log(netReceiptsPrice.value);
netReceiptsPrice.value = (
Number(netReceiptsPrice.value) + Number(jifen.value)
).toFixed(2);
}
yytjInfo.value.pointsPrice = 0;
jifen.value = 0;
$store.setYytjInfo(yytjInfo.value);
}
} else {
console.log(selectIndex.value);
//
if (selectIndex.value) {
yytjInfo.value.prepaidPrice = save_money.value;
// 使 使
if (save_money.value > netReceiptsPrice.value) {
yucunkuan.value = netReceiptsPrice.value;
} else {
yucunkuan.value = save_money.value;
}
netReceiptsPrice.value = (
netReceiptsPrice.value - yucunkuan.value
).toFixed(2);
$store.setYytjInfo(yytjInfo.value);
} else {
if (yytjInfo.value.prepaidPrice) {
// 使
netReceiptsPrice.value = (
Number(netReceiptsPrice.value) + Number(yucunkuan.value)
).toFixed(2);
}
yucunkuan.value = 0;
yytjInfo.value.prepaidPrice = 0;
$store.setYytjInfo(yytjInfo.value);
}
}
popup.value.close();
};
const addCombo = () => {
//
let itemIds = $props.itemIds ? $props.itemIds : "";
@ -277,10 +618,64 @@
mountedAction();
}
};
const toUrl=(url)=>{
uni.reLaunch({
url:url
})
}
const toreadme=()=>{
GetReadmeDetails();
popupTip.value.close()
}
const toPlan=async ()=>{
uni.navigateTo({
url: '/pages/main/yytjsj/yytjsj_new'
});
}
const StartPay = async (id) => {
//
uni.showLoading();
const response = await $api("StartPay", {
openid: localStorage.getItem("OPENID"),
id: id,
});
uni.hideLoading();
$response(response, () => {
if (response.status) {
PayPopupTip.value.open()
let info = response.data.info;
let p =
"&appid=" +
info.appid +
"&sub_org_code=" +
info.sub_org_code +
"&ghzid=" +
info.ghzid +
"&orderid=" +
info.orderid +
"&order_desc=" +
info.order_desc +
"&amount=" +
info.amount +
"&notify_url=" +
info.notify_url +
"&timestamp=" +
info.timestamp +
"&nonce=" +
info.nonce +
"&signature=" +
info.signature;
console.log(p);
wx.miniProgram.navigateTo({
url:
"/pages/other/entry/index?path=/pages/physical-examination/payment/index" +
p,
});
}
});
};
onShow(() => {
buy_info.value=$store.getBuyInfo()
if (!!config_ref.value) {
@ -289,6 +684,85 @@
});
</script>
<template>
<view style="background-color: #fff;">
<TabBar style="z-index: 2;"></TabBar>
<uni-popup ref="PayPopupTip" :mask-click="false">
<view
class="mb-70rpx bg-#fff text-center box-border pt-80rpx pb-50rpx px-65rpx w-90vw rounded-15rpx"
>
<view
class="w-full text-center text-##090909 text-26rpx line-height-[50rpx]"
>是否继续支付</view
>
<view class="mt-50rpx between">
<button
type="primary"
@click="toUrl('/pages/main/order/order')"
class="w-196rpx h-68rpx center text-#fff text-24rpx !bg-#239EA3 rounded-8rpx"
>
取消
</button>
<button
@click=" StartPay(CreatedOrderId)"
class="w-196rpx h-68rpx center text-#239EA3 text-24rpx !bg-#D9F3F2 rounded-8rpx"
>
继续
</button>
</view>
</view>
</uni-popup>
<uni-popup ref="popup">
<view class="center relative px-10rpx pb-30rpx text-36rpx bg-#fff rounded-t-15rpx box-border col">
<view class="text-28rpx p-[40rpx_50rpx_25rpx_50rpx] between w-full bs b-b-1 b-#DEDEDE box-border">
<text class="line-height-[1] text-#171717 mr-10rpx">{{
selectStatus == 1 ? "积分" : "预存款"
}}</text>
<view class="mr-auto text-#888787">
剩余<text class="text-#FB670E">{{
selectStatus == 1 ? keyong_jifen : save_money
}}</text>)
</view>
<uni-icons @click="popup.close()" type="closeempty" color="#A6A6A6" size="26" class=""></uni-icons>
</view>
<view class="text-#171717 text-28rpx px-40rpx box-border w-full">
<view class="between pl-20rpx pr-10rpx box-border bs b-b-1 b-#E1ECEE h-90rpx" @click="selectIndex = 0">
<text>暂不使用{{ selectStatus == 1 ? "积分" : "预存款" }}</text>
<uni-icons :type="!selectIndex ? 'checkbox-filled' : 'circle'"
:color="!selectIndex ? '#239EA3' : '#A6A6A6'" size="20" class=""></uni-icons>
</view>
<view class="between pl-20rpx pr-10rpx box-border bs b-b-1 b-#E1ECEE h-90rpx" @click="selectIndex = 1">
<text v-if="selectStatus == 1">{{
jifen
? jifen
: keyong_jifen > netReceiptsPrice
? netReceiptsPrice
: keyong_jifen
}}使用{{
Math.ceil(
jifen
? jifen
: keyong_jifen > netReceiptsPrice
? netReceiptsPrice
: keyong_jifen
)
}}积分</text>
<text v-else>使{{
yucunkuan
? yucunkuan
: save_money > netReceiptsPrice
? netReceiptsPrice
: save_money
}}</text>
<uni-icons :type="selectIndex ? 'checkbox-filled' : 'circle'"
:color="selectIndex ? '#239EA3' : '#A6A6A6'" size="20" class=""></uni-icons>
</view>
</view>
<view @click="comfrimSelect"
class="text-#fff text-34rpx rounded-full bg-#239EA3 mt-80rpx ma w-520rpx h-100rpx center">
确定
</view>
</view>
</uni-popup>
<uni-popup ref="popupTip">
<view
class="mb-70rpx bg-#fff text-center box-border pt-80rpx pb-50rpx px-65rpx w-90vw rounded-15rpx"
@ -316,21 +790,100 @@
</view>
</view>
</uni-popup>
<DraggableButton />
<view class="tishi2">温馨提示<span style="color: #e95513;">若要增加项目可以到现场预检咨询</span></view>
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
</view>
<view v-if="[1,2].indexOf(status) !== -1">
<!-- 1个检套餐 显示套餐信息 -->
<view class="combo_name_row" >
<text v-if="status==2"> </text>
<text v-if="status==1">{{ comboInfo.combo_name }}</text>
<!-- 人员信息 -->
<view v-if="status == 1 || status==2">
<view style="border: 1px solid #ccc; margin: 20rpx;"
class="p-20rpx pb-20rpx pt-20rpx rounded-15rpx bg-#fff " v-if="userInfo">
<!-- <view class="text-#0E0E0E text-30rpx b-0 b-solid b-b-1 b-#E1ECEE pb-20rpx mb-35rpx">预约人信息</view> -->
<view>
<view style="display: flex;justify-content: space-between;padding-right: 10rpx;">
<view style="display: flex; justify-content: center; align-items: center;">
<view class="text-32rpx text-#000 " style="font-weight: bolder;">{{
userInfo.name
}}</view>
<view class="text-24rpx text-#8B8B8B " style="margin-left: 40rpx;;">
<text>{{ userInfo.sex == 1 ? "男性" : "女性" }}</text>
<!-- <text class="ml-20rpx">{{
userInfo.married == 1
? "已婚"
: userInfo.married == 2
? "未婚"
: "未知"
}}</text> -->
<text class="ml-40rpx mr-auto">{{ userInfo.phone }}</text>
<!-- <button
v-if="!buyInfo.group_id"
@click="toRouter('/pages/user/choose/choose')"
class="text-24rpx text-#fff bg-#31AEB6 rounded-full px-26rpx h55rpx !m-0 center !ml-auto"
>
更改预约人
</button> -->
</view>
</view>
<!-- <image @click="toRouter('/pages/user/choose/choose')" style="width: 50rpx;height: 50rpx;" src="@/static/assets/qiehuan@2x.png"></image> -->
</view>
</view>
</view>
<view v-if="integral || couponList.length || save_money" style="border: 1px solid #ccc;margin: 0rpx 20rpx 20rpx 20rpx; padding: 20rpx;border-radius: 20rpx;">
<view v-if="integral"
class=" pr-17rpx rounded-15rpx bg-#fff between text-24rpx line-height-[1]" style="padding: 10rpx 30rpx;"
@click="selectDiscount(1)">
<view>
<text class="text-#050505">积分</text>
<text class="text-#828383">{{ integral }}</text>
</view>
<view class="ml-auto mr-20rpx">
<text class="text-#FB4F1A" v-if="jifen">-¥{{ Math.ceil(jifen) }}</text>
<text class="text-#070707" v-else></text>
</view>
<uni-icons type="right" size="12"></uni-icons>
</view>
<view v-if="couponList.length"
class=" pr-17rpx rounded-15rpx bg-#fff between text-24rpx line-height-[1] " style="padding: 10rpx 30rpx;"
@click="selectDiscount(2)">
<view>
<text class="text-#050505">优惠券</text>
<text class="text-#828383">{{ couponList.length }}</text>
</view>
<view class="ml-auto mr-20rpx">
<text class="text-#FB4F1A" v-if="yytjInfo.couponName">{{ yytjInfo.couponName }}</text>
<text class="text-#070707" v-else></text>
</view>
<uni-icons type="right" size="12"></uni-icons>
</view>
<view v-if="save_money"
class=" pr-17rpx rounded-15rpx bg-#fff between text-24rpx line-height-[1] " style="padding: 10rpx 30rpx;"
@click="selectDiscount(3)">
<view>
<text class="text-#050505">预存款</text>
<text class="text-#828383">剩余{{ save_money }}</text>
</view>
<view class="ml-auto mr-20rpx">
<text class="text-#FB4F1A" v-if="yucunkuan">-¥{{ yucunkuan }}</text>
<text class="text-#070707" v-else></text>
</view>
<uni-icons type="right" size="12"></uni-icons>
</view>
</view>
</view>
<!-- 人员信息 -->
<view class="px-30rpx box-border comboInfo">
<view v-if="status != 1 && status!=2" class="pt-35rpx rounded-15rpx px-10rpx bg-#fff pb-30rpx box-border b-0 b-t-1 b-solid b-#E1ECEE">
<view v-if="status != 1 && status!=2" class="pt-35rpx rounded-15rpx px-10rpx bg-#fff pb-30rpx box-border b-0 b-t-1 b-solid b-#E1ECEE" style="display: none;">
<view class="px-15rpx pt-10rpx">
<!-- 2个检自选 3团检套餐 4团检自选 都要显示头像和名字 -->
@ -365,42 +918,52 @@
</view>
</view>
<view class="pb-150rpx">
<view class="flex items-center justify-around px-30rpx pt-30rpx">
<!-- <view class="flex items-center justify-around px-30rpx pt-30rpx">
<view>
<text class="text-30rpx text-#2E2E2E">套餐项目</text>
<span v-if="status==1 && JSON.stringify(comboInfo) !== '{}'" class="combo_tag_wrapper" >{{ comboInfo?.tags[0]?.text }}</span>
<span v-if="status==2" class="combo_tag_wrapper">{{ itemsInfo?.itemscount }}</span>
</view>
</view>
<view class="mt--10rpx bg-#fff py-40rpx px-14rpx box-border flex-col flex">
</view> -->
<view class="mt--10rpx bg-#fff py-10rpx px-14rpx box-border flex-col flex">
<!-- 套餐内容 -->
<view v-if="contentInfo.length>0" class="mb-20rpx">
<view v-if="contentInfo.length>0" class="mb-120rpx">
<!-- 套餐项目 -->
<view class="flex h-58rpx bg-#239ea3 mb-26rpx text-#fff text-26rpx rounded-10rpx">
<view class="min-w-220rpx max-w-220rpx keshi_name_k">体检流程</view>
<view class="grow center">检查项目</view>
<view v-if="[1,2].indexOf(status) !== -1" style="text-align: center;width: 100%;height: 58rpx;line-height: 58rpx;">
<!-- 1个检套餐 显示套餐信息 -->
<text v-if="status==2"> </text>
<text v-if="status==1">{{ comboInfo.combo_name }}</text>
</view>
<view v-if="status ==3" style="text-align: center;width: 100%;height: 58rpx;line-height: 58rpx;">
{{ groupInfo.group_name }}
</view>
</view>
<view v-for="(val, index) in contentInfo" :key="index">
<view v-if="val.keshi_name != '材料费'">
<view class="flex h-58rpx bg-#E6F5F6 text-#333 text-27rpx rounded-10rpx mt-10rpx">
<view class="min-w-250rpx max-w-250rpx keshi_name_k ">{{index+1}}.{{ val.keshi_name }}</view>
<view class="flex h-58rpx bg-#E6F5F6 text-#333 text-27rpx rounded-10rpx mt-10rpx" @click="opendDetail(index)">
<view class="min-w-250rpx max-w-250rpx keshi_name_k font-bold">{{ val.keshi_name }}</view>
<view class="grow center">{{ val.children.length }}个项目</view>
<view class="grow center xiangqingbutton" @click="opendDetail(index)"><span style="font-size: 12rpx;">>></span></view>
<view class="grow center xiangqingbutton" >
<uni-icons type="down" size="10"></uni-icons>
</view>
</view>
<view v-if="active_keshi.indexOf(index)!== -1">
<view class="xian mt-10rpx "></view>
<view class=" bg-#FBFBFB text-#000 text-24rpx rounded-10rpx p-20rpx little_item_k " v-for="(v, i) in val.children"
<view class=" bg-#FBFBFB text-#000 text-26rpx rounded-10rpx p-20rpx little_item_k " v-for="(v, i) in val.children"
:key="i">
<view style="display: flex; align-items: center;">
<view class="break-all box-border ">
{{ v.name }}
{{i+1}}.{{ v.name }}
</view>
<view @click="WenHaoClick(index+''+i)" class="wenhao">?</view>
<!-- <view @click="WenHaoClick(index+''+i)" class="wenhao">?</view> -->
</view>
<view v-if="active_miaoshu.indexOf(index+''+i) !== -1" class="grow text-20rpx text-#E95513 mt-10rpx box-border">{{ v.desc || "-" }}</view>
<view v-if="active_miaoshu.indexOf(index+''+i) == -1" class="grow text-24rpx text-#E95513 mt-10rpx box-border">{{ v.desc || "-" }}</view>
</view>
</view>
@ -419,10 +982,10 @@
<view class="text-#2E2E2E text-30rpx font-900 text-center">
体检须知
</view>
<view class="text-28rpx text-#2E2E2E">
<!-- <view class="text-28rpx text-#2E2E2E">
<image class="w-5rpx h-26rpx" src="@/static/assets/slices/tjcol2x.png"></image>
体检须知
</view>
</view> -->
<view class="flex flex-justify-around text-#111111 text-28rpx pt-24rpx pb-40rpx">
<view class="flex flex-col flex-items-center">
@ -455,31 +1018,40 @@
<image class="w-5rpx h-26rpx" src="@/static/assets/slices/tjcol2x.png"></image>
体检注意事项
</view>
<view v-html="notice.content" class="text-20rpx" style="line-height: 36rpx;"></view>
<view v-html="notice.content" class="text-24rpx" style="line-height: 46rpx; max-height: 760rpx;overflow: scroll;"></view>
<view class="tishi_button" @click="buy(2)" >我已知晓</view>
</view>
</uni-popup>
</view>
<view class="fixed bottom-0 h-150rpx left-0 w-full bg-gradient-to-r from-#02b4bd to-#ABD7D7 p-30rpx box-border between">
<view class="fixed bottom-110 h-150rpx left-0 w-full bg-gradient-to-r from-#02b4bd to-#ABD7D7 p-30rpx box-border between">
<view class="grow">
<view class="flex items-end" v-if="comboId != 0">
<text class="original_price_wrapper">¥ {{ total_original_price }} </text>
</view>
<view class="flex items-end">
<text class="text-42rpx text-#ED6907 mr-20rpx font-bold">¥{{
totalPrice
}}</text>
<text class="text-42rpx text-#ED6907 mr-20rpx font-bold">
<!-- ¥{{ totalPrice }} -->
¥{{ netReceiptsPrice }}
</text>
</view>
</view>
<view class="flex">
<button v-if="!buy_info?.sanfang_code?.code_num" @click="addCombo()" class="button bgcolor_huang">
<!-- <button v-if="!buy_info?.sanfang_code?.code_num" @click="addCombo()" class="button bgcolor_huang">
增加项目
</button> -->
<button v-if="status == 1 || status==2" @click="buy(1)" class="button">
<span v-if="comboInfo.combo_name?.indexOf('婚检') != -1"></span><span v-else></span>
</button>
<button @click="buy(1)" class="button">
<button v-else @click="buy(2)" class="button"> <!-- 团检 -->
下一步
</button>
</view>
</view>
</view>
</view>
@ -513,11 +1085,11 @@
<style scoped>
.combo_name_row{
text-align: center;
background-color: #EEF7F7;
color: #009FA8;
width: 100%;
color: #333;
font-weight: 900;
font-size: 28rpx;
height: 80rpx;
line-height: 80rpx;
}
.keshi_name_k{
line-height: 58rpx;
@ -601,4 +1173,11 @@
padding: 20rpx 20rpx 0rpx 20rpx;
border-radius: 20rpx;
}
.tishi2{
font-size: 28rpx;
padding-left: 40rpx;
padding-top: 16rpx;
background-color: #fff;
margin-bottom: 20rpx;
}
</style>

@ -0,0 +1,227 @@
<template>
<TabBar ></TabBar>
<view class="zhuanjiamain">
<view class="tishi">温馨提示<span style="color: #e95513;">若要增加项目可以到现场预检咨询</span></view>
<view v-if="content.combo_info">
<view class="combo_title">
<view>{{content.combo_info.combo_name}}</view>
<uni-tooltip>
<!-- 定义插槽插槽名为 content -->
<template v-slot:content>
<!-- 在这里编写自定义的 HTML 或组件 -->
<view class="w-50vw">
<text>该套餐仅预约专家咨询现场个性化定制套餐</text>
</view>
</template>
<!-- 触发提示的按钮 -->
<view class="wenhao">?</view>
</uni-tooltip>
</view>
<view class="combo_tags_wrapper">
<view class="combo_tag_wrapper" v-for="(ii, kk) in content.combo_info.tags" :key="kk"
:style="{ color: ii.text_color, background: '#fff',}">
{{ ii.text }}
</view>
</view>
<view class="combo_price_wrapper">
<view class="combo_price_box_wrapper">
<view class="combo_true_price_wrapper">
<text class="combo_true_price_icon_wrapper">¥</text>
<text class="combo_true_price_number_wrapper">{{ content.combo_info.price }}</text>
</view>
</view>
</view>
<view class="shuoming">
<view class="title">
说明
</view>
<view>由健康管理中心专家为您推荐适合套餐或制定个性化套餐咨询定制费30元套餐加项享8折优惠</view>
</view>
<view class="shuoming">
<view class="title">
注意事项
</view>
<view>体检前三天保持清淡饮食避免饮酒体检当天早晨需空腹禁食禁水慢性病患者服药请遵医嘱穿着宽松舒适衣物不佩戴金属物品</view>
</view>
<view style="position: absolute; bottom: 140rpx;right: 40rpx;">
<view class="yuyue_button" @click="toUrl('/pages/main/yytjsj/yytjsj_new')">
预约
</view>
</view>
</view>
</view>
</template>
<script setup>
import TabBar from "@/common/TabBar.vue";
import {
ref
} from "vue";
import {
$api,
$response,
$image
} from "@/api";
import {
onShow
} from "@dcloudio/uni-app";
import {
useStore
} from "@/store";
const $store = useStore();
let personId=ref("");
let buy_info=ref({});
let content=ref({});
const $props = defineProps({
comboid: {
type: String,
default: "",
},
})
const getBuyInfo = async () => {
if( $props.comboid=="" || $props.comboid==undefined){
uni.showToast({
title: "套餐id不能为空",
icon: "none",
});
return false
}
buy_info.value.combo_id=$props.comboid
buy_info.value.person_id=personId.value
$store.setBuyInfo(buy_info.value)
//
let obj = {
item_ids: [],
combo_id: $props.comboid,
hospital: $store.save_info?.hospital?$store.save_info?.hospital:1,
person_id: personId.value,
group_id: null,
duo_xuan_yi: null,
wj: null,
sanfang_code:buy_info.value.sanfang_code?.code_num?buy_info.value.sanfang_code:null
};
uni.showLoading();
const response = await $api("BuyInfo", obj);
$response(response, () => {
uni.hideLoading();
content.value=response.data
});
};
const toUrl=(url)=>{
$store.setCheckupTypeId({id:1})
uni.navigateTo({
url: url,
});
}
onShow(() => {
$store.setCheckupTypeId({id:1})
$store.setYuYueFangShi("yujianzixun")
personId.value = $store.getUser().person_id || "";
buy_info.value=$store.getBuyInfo()
getBuyInfo()
});
</script>
<style scoped>
.zhuanjiamain{
padding:40rpx;
background-color: #fff;
height: calc( 100vh - 164rpx);
}
.tishi{
font-size: 28rpx;
margin-bottom: 26rpx;
}
.wenhao{
height: 30rpx;
width: 30rpx;
background-color: #009FA8;
line-height: 30rpx;
border-radius: 30rpx;
color: #fff;
text-align: center;
font-size: 24rpx;
margin-left: 10rpx;margin-top: 4rpx;
}
.combo_title{
display: flex;
font-weight: 900;
font-size: 36rpx;
color: #3E3A39;
line-height: 32rpx;
}
.combo_tags_wrapper {
display: flex;
align-items: center;
margin-top: 13rpx;
}
.combo_tag_wrapper {
padding-left: 13rpx;
padding-right: 13rpx;
height: 30rpx;
line-height: 30rpx;
border-radius: 5rpx;
font-weight: 400;
font-size: 18rpx;
color: #47abd8;
margin: 10rpx 8rpx 10rpx 0rpx;
border: 2rpx solid #009da5;
}
.combo_true_price_wrapper {
font-weight:600;
font-size: 18rpx;
color: #E95513;
line-height: 1;
}
.combo_true_price_number_wrapper {
font-size: 38rpx;
}
.combo_price_wrapper {
display: flex;
align-items: end;
justify-content: space-between;
margin-top: 21rpx;
}
.combo_price_box_wrapper {
display: flex;
align-items: end;
}
.beizhu{
font-size: 26rpx;
color: #333;
margin-top: 40rpx;
}
.yuyue_button{
width: 180rpx;
height: 70rpx;
line-height: 70rpx;
border-radius: 70rpx;
background-color: #009FA8;
color: #fff;
font-size: 32rpx;
text-align: center;
}
.shuoming{
font-size: 28rpx;
margin-top: 20rpx;
margin-bottom: 40rpx;
}
.title{
border-left: 3px solid #009FA8;
padding-left: 8rpx;
margin-top: 40rpx;
margin-bottom: 20rpx;
font-weight: 700;
}
</style>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* useryytjsj
@ -312,14 +313,24 @@ const comfrimyy = async () => {
sanfang_code:buyInfo.value.sanfang_code?.code_num?buyInfo.value.sanfang_code:null
};
console.log(obj);
const response = await $api("CreateNewOrder", obj);
let apiName="CreateNewOrder"
let doneUrl="/pages/buy/done/done?id="
if($store.tempPlan?.plan_id){
apiName="OrderCreate"
doneUrl="/pages/buy/done/yuyue_done?id="
obj.plan_id=$store.tempPlan?.plan_id
obj.yuyue_fangshi='GeJianPlanFront'
}
const response = await $api(apiName, obj);
$response(response, () => {
if (response.status) {
if (response.data.action == "pay") {
StartPay(response.data.orderid);
} else {
uni.navigateTo({
url: "/pages/buy/done/done?id=" + response.data.orderid,
uni.reLaunch({
url: doneUrl+ response.data.orderid
});
}
}
@ -452,7 +463,7 @@ const toRouter = (url, status, index) => {
};
</script>
<template>
<DraggableButton />
<TabBar style="z-index: 2;"></TabBar>
<uni-popup ref="popup">
<view
class="center relative px-10rpx pb-30rpx text-36rpx bg-#fff rounded-t-15rpx box-border col"
@ -577,8 +588,8 @@ const toRouter = (url, status, index) => {
</view>
</view>
<image @click="toRouter('/pages/user/choose/choose')" style="width: 50rpx;height: 50rpx;" src="@/static/assets/qiehuan@2x.png"></image>
<!-- <uni-icons @click="toRouter('/pages/user/choose/choose')" type="loop" color="#31AEB6" size="25"></uni-icons> -->
<!-- <image @click="toRouter('/pages/user/choose/choose')" style="width: 50rpx;height: 50rpx;" src="@/static/assets/qiehuan@2x.png"></image> -->
</view>
</view>
</view>
@ -642,7 +653,7 @@ const toRouter = (url, status, index) => {
</view>
<view class="text-#E95513 text-20rpx mb-40rpx mt-40rpx pl-20rpx pr-20rpx">
<view class="flex items-center mt-20rpx mb-40rpx">
<!-- <view class="flex items-center mt-20rpx mb-40rpx">
<uni-icons
type="info-filled"
class="rotate-180"
@ -650,7 +661,7 @@ const toRouter = (url, status, index) => {
size="18"
></uni-icons>
<text>选择预约人体检时间请点击提交按钮,完成预约</text>
</view>
</view> -->
<view class="flex items-center mt-30rpx">
<uni-icons
type="info-filled"
@ -803,7 +814,7 @@ const toRouter = (url, status, index) => {
}
.button{
position: fixed;
bottom: 80rpx;
bottom: 160rpx;
right: 40rpx;
}
.tags{

@ -854,7 +854,7 @@
}
.uni-calendar-item__weeks-box-text {
font-size: 26rpx;
font-size: 28rpx;
color:#ccc;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--extra) {

@ -0,0 +1,886 @@
<template>
<!-- <DraggableButton /> -->
<TabBar/>
<uni-popup ref="popupMultiple" class="w-full" :mask-click="false">
<view class="rounded-10rpx px-20rpx pb-55rpx box-border bg-#fff w-95vw">
<view
class="center relative pt-40rpx pb-30rpx text-36rpx rounded-t-15rpx box-border"
>
<text class="line-height-[1] text-32rpx">请选择</text>
<uni-icons
@click="TaoCanCloseFunc()"
type="closeempty"
color="#A6A6A6"
size="26"
class="absolute right-40rpx"
></uni-icons>
</view>
<view class="bg-#F8F8F8 px-20rpx box-border rounded-10rpx">
<view
v-for="(item, index) in PendingOrders"
:key="index"
@click="OrderId = item.value"
class="px-20rpx box-border b-b-1 b-#EAEAEA b-solid bs between h-100rpx"
>
<text class="text-#000000 text-30rpx">{{ item.text }}</text>
<view class="center">
<uni-icons
class="ml-28rpx"
color="#239EA3"
:type="OrderId == item.value ? 'checkbox-filled' : 'circle'"
size="30"
></uni-icons>
</view>
</view>
</view>
<view class="text-#239EA3 text-28rpx my-45rpx text-center" >有未预约套餐请选择 </view>
<view class="w-270rpx h-80rpx bg-#239EA3 center text-#F8F8F8 text-30rpx rounded-10rpx mx-auto" @click="PendingOrdersChange(OrderId)" >确定</view >
</view>
</uni-popup>
<view class="ctime_main">
<uni-popup ref="YuYuePopupRef" style="z-index: 999;">
<view class="tishi_main">
<view class="tishi_title">提示</view>
<view class="tishi_title2">
<view class="tishi_shuxian">|</view>
<view>当前日期已有预约记录是否继续预约</view>
</view>
<view style="display: flex;justify-content: space-between;">
<view class="tishi_button" style=" width: 200rpx; background-color: #e1ecee;color:#239ea3"
@click="YuYuePopupRef.close()">关闭</view>
<view class="tishi_button" style="width: 200rpx;" @click="UsePlan()"></view>
</view>
</view>
</uni-popup>
<view style="display: flex;justify-content: space-between;align-items: center; padding: 20rpx 40rpx;">
<view>
<view style="font-size: 33rpx;margin-top: 2rpx;">{{person_name}}</view>
<view style="font-size: 23rpx;color:#008F96;margin-top: 10rpx;">{{combo_name}}</view>
</view>
<view style="display: flex;">
<view class="doctor_button" @click="doctorNameClick()" >
<uni-icons type="search" color="#D8EEF3" size="16"></uni-icons>
<view style="font-size: 26rpx;margin-left: 10rpx;" >{{doctor_name?doctor_name:"体检医生"}}</view>
</view>
</view>
</view>
<view style="background-color: #F8F8F8;margin-bottom: -20rpx;" v-if="showCallKeFu" >
<CallKeFu class="kefu"></CallKeFu>
</view>
<view class="buttom_div">
<view>
<view v-if="PendingOrders.length>0" class="yigou">
<view class="yigou_tishi">请选择已购套餐</view>
<view style="width: 400rpx; " class="select">
<uni-data-select style="border: 0px;" class="uni-data-select" v-model="OrderId" :localdata="PendingOrders" :clear="false"
@change="PendingOrdersChange"></uni-data-select>
</view>
</view>
<!-- <view v-else style="height: 60rpx;"></view> -->
<!-- <view v-else class="yigou">
<view class="yigou_tishi">您未购买套餐可以点击右侧购买套餐</view>
<view>
<view class="buycombo_button">购买套餐</view>
</view>
</view> -->
</view>
<view :class="[PendingOrders.length > 0 ? 'zhouli2' : 'zhouli']">
<WeeklyCalendar v-if="weekList" :dataInfo="weekList" :selectedTime="selectedTime" :YuYueInfo="YuYueInfo"
:TjDTime="tj_date+' '+tj_time" :ItemSelected="itemSelected" @selectDate="selectDateFunc"
@selectTime="selectTimeFunc" @openMonth="openMonthFunc" />
</view>
</view>
<view class="dateitem" v-if="orderInfo">
<view
style="background-color: #f7f7f7; padding: 20rpx; font-size: 30rpx; border-radius: 20rpx;color: #333;">
<view>{{orderInfo.name}}</view>
<view
style="background-color: #f1f1f1;padding: 20rpx 10rpx; margin-top: 10rpx;border-radius: 14rpx;font-size: 28rpx;color: #666;">
<view v-if="YuYueInfo.NmrInfo.length>0">
<view @click="itemClick('nmr',item_nmr,index_nmr)"
v-for="(item_nmr,index_nmr) in YuYueInfo.NmrInfo" :key="index_nmr" style="padding: 20rpx;"
:class="(itemSelected.type=='nmr' && itemSelected.index==index_nmr)?'itemSelected':''">
{{item_nmr.name}} <span v-if="item_nmr.date && item_nmr.time">{{item_nmr.date}}
{{item_nmr.time}}</span>
</view>
</view>
<view @click="itemClick('tj','',0)" style="margin-top: 10rpx;padding: 20rpx;color: #666;"
:class="itemSelected.type=='tj'?'itemSelected':''">体检日期 <span
v-if="tj_date && tj_time">{{tj_date}}
{{tj_time}}</span></view>
</view>
</view>
</view>
<view class="pb-140rpx" style="background-color: #fff;padding-top: 20rpx;">
<!-- <view @click="StartYuYue()"
class="text-#fff text-32rpx rounded-45rpx bg-#239EA3 mt-40rpx ma w-520rpx h-90rpx flex flex-items-center flex-justify-center">
确定
</view> -->
<view @click="ChaPersonAppointment()" v-if=" !(weekList && weekList.weeklist.find(item => item.date === currentDate)?.count === 0)" class="check_done_wrapper"></view>
</view>
<view id="ylrl">
<uni-calendar :insert="false" :showMonth="false" ref="DoctorMonthCalendar" @confirm="DoctMonthConfirm" />
<uni-calendar :start-date="GetToday()" :date="currentDate" :selected="MonthList" @monthSwitch="monthSwitch" :insert="false" :showMonth="false"
ref="MonthCalendar" @confirm="MonthConfirm" />
</view>
</view>
</template>
<script setup>
import {
nextTick,
onMounted,
ref,
watch,computed
} from 'vue';
import {
$image,
$api,
$response
} from "@/api";
import wx from "weixin-js-sdk";
import {
useStore
} from "@/store";
const $store = useStore();
import {
onShow,
onLoad
} from "@dcloudio/uni-app";
import DraggableButton from "@/pages/components/goHome.vue";
import WeeklyCalendar from '@/common/WeeklyCalendar.vue';
import TabBar from "@/common/TabBar.vue";
import CallKeFu from "@/common/CallKeFu.vue";
let nmr_date = ref(null);
let nmr_time = ref(null);
let nmr_plan_id = ref(null); //id
let buyInfo = ref({}); //
let yytjInfo = ref({}); //
let tj_date = ref(null);
let tj_time = ref(null);
let tj_plan_id = ref(null); //id
// let weekList = ref({weeklist: []});
let weekList = ref(null);
let doctor_name = ref(null);
let hospital_id = ref(0);
let person_id = ref(0)
let use_type = ref(0)
let checkup_type_id = ref(0)
let amount = ref(0)
let person_name = ref('')
let combo_name = ref('')
let combo_id = ref(null);
let item_ids = ref([]);
let YuYuePopupRef = ref(null);
let er_xian_info = ref(null);
let PendingOrders = ref([]);
const getBuyInfoFuc = async () => {
//
let obj = {
item_ids: buyInfo.value.item_ids,
combo_id: combo_id.value,
hospital: $store.save_info?.hospital ? $store.save_info?.hospital : 1,
person_id: person_id.value,
group_id: buyInfo.value.group_id,
duo_xuan_yi: $store.getDuoXuanYi(),
wj: buyInfo.value.wj,
sanfang_code: buyInfo.value.sanfang_code?.code_num ? buyInfo.value.sanfang_code : null
};
const response = await $api("BuyInfo", obj);
$response(response, () => {
if (response.data.nmr_list2.length > 0) {
er_xian_info.value = response.data.nmr_list2
}
if (combo_id.value) {
combo_name.value = response.data.combo_info?.combo_name
} else {
combo_name.value = buyInfo.value.group_id ? $store.getGroupInfo()?.group_name : ''
}
})
}
//
const GetDayPlanListFunc = async () => {
uni.showLoading();
let data = {
hospital:1,
person_id: person_id.value,
date: selectedDate.value,
use_type: 1,
checkup_type_id: 1,
amount: amount.value,
combo_id: combo_id.value,
item_ids: item_ids.value,
er_xian_info: er_xian_info.value,
danwei_id: null,
big_date:MonthSelectedDate.value
}
const response = await $api("GetDayPlanList", data);
uni.hideLoading();
$response(response, () => {
weekList.value = response.data
});
};
let selectedTime = ref(null);
let orderInfo = ref(null)
let YuYueInfo = ref({
TjInfo: {},
NmrInfo: {}
})
const doctorNameClick=()=>{
if (doctor_name.value) {
uni.showModal({
title: '提示',
content: '是否取消预约此医生',
cancelText: '取消医生',
confirmText: '重新选择',
success: function(res) {
if (res.confirm) {
selectDoctor()
} else if (res.cancel) {
doctor_name.value = null //
}
}
});
} else{
selectDoctor()
}
}
//weekly
let selectedDate = ref(null);
const selectDateFunc = (date) => {
if (doctor_name.value) {
uni.showModal({
title: '提示',
content: '已选择医生,切换日期将重新选择医生,是否继续',
cancelText: '取消',
confirmText: '确定',
success: function(res) {
if (res.confirm) {
currentDate.value=date
DateChange(date)
} else if (res.cancel) {
}
}
});
} else {
currentDate.value=date
DateChange(date)
}
}
//weekly
let SelectedPlanId = ref(null)
const selectTimeFunc = (timeinfo) => {
selectedTime.value = timeinfo.time
SelectedPlanId.value = timeinfo.id
if (itemSelected.value.type == 'nmr') {
YuYueInfo.value.NmrInfo[itemSelected.value.index].time = timeinfo.time
nmr_plan_id.value = timeinfo.id
}
if (itemSelected.value.type == 'tj') {
tj_time.value = timeinfo.time
tj_plan_id.value = timeinfo.id
yytjInfo.value.nmr_list=[{
item_id: -1,
name: "体检时间",
time: selectedDate.value+' '+timeinfo.time,
id: timeinfo.id,
}];
$store.setYytjInfo(yytjInfo.value)
}
}
let itemSelected = ref({
type: null,
item: {},
index: 0
});
const itemClick = (type, item, index) => {
//weekList.value=null
if (type == 'tj') {
selectedTime.value = tj_time.value
selectedDate.value = tj_date.value
GetDayPlanListFunc()
}
itemSelected.value.type = type
itemSelected.value.item = item
itemSelected.value.index = index
}
let DoctorMonthCalendar = ref(null)
const selectDoctor = () => {
if (tj_date.value == null) { //
DoctorMonthCalendar.value.open();
} else {
uni.navigateTo({
url: `/pages/main/selectDoctor/selectDoctor?date=${tj_date.value}`,
});
}
}
//
const DoctMonthConfirm = (e) => {
tj_date.value = e.year + "-" + e.month + "-" + e.date
uni.navigateTo({
url: `/pages/main/selectDoctor/selectDoctor?date=${tj_date.value}`,
});
}
let MonthCalendar = ref(null)
let MonthList = ref([]); //
let currentDate = ref(null); //
const monthSwitch = (e) => { //
let ym = e.year + "" + "-" + e.month + ""
if (itemSelected.value.type == 'tj') {
GetMonthPlanListFunc(ym)
}
}
let MonthSelectedDate=ref('');//,7
const MonthConfirm = (e) => { //
console.log(e)
// if(e.extraInfo.date ==undefined){
// uni.$lu.toast("");
// return false
// }
if (doctor_name.value) {
uni.showModal({
title: '提示',
content: '已选择医生,切换日期将重新选择医生,是否继续',
cancelText: '取消',
confirmText: '确定',
success: function(res) {
if (res.confirm) {
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
} else if (res.cancel) {
}
}
});
} else {
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
}
}
//
const GetMonthPlanListFunc = async (ym = '') => {
uni.showLoading();
let data = {
hospital: 1,
person_id: person_id.value,
month: ym ? ym : tj_date.value.substring(0, 7),
use_type: 1,
combo_id: combo_id.value,
checkup_type_id: 1,
amount: amount.value,
danwei_id: null
}
const response = await $api("GetMonthPlanCount", data);
uni.hideLoading();
$response(response, () => {
let rlArr = [];
response.data.list.forEach((item) => {
let info=null
if(item.count===0){
info="满号"
}
if(item.date<GetToday()){
info=" "
}
if(item.count == -1){
info=" "
}
let o = {
date: item.date,
// info: "" + item.count,
info:info
};
if ((item.count >= -1 && item.date!=GetToday()) ||(item.date==GetToday() && item.count === 0) ) {
rlArr.push(o);
}
});
MonthList.value = rlArr;
//MonthCalendar.value.open()
});
};
//
const openMonthFunc = async () => {
if (itemSelected.value.type == 'tj') {
await GetMonthPlanListFunc()
}
MonthCalendar.value.open()
}
////
const ChaPersonAppointment = async () => {
console.log(selectedDate.value);
if (selectedDate.value == null || selectedDate.value == '') {
uni.$lu.toast("请选择体检日期");
return false
}
if(tj_plan_id.value==null || tj_plan_id.value==''){
uni.$lu.toast("请选择体检时间");
return false
}
uni.showLoading();
let data = {
person_id: person_id.value,
appointment_date: selectedDate.value,
status: [2]
}
console.log(data);
const response = await $api("GetPersonOrderList", data);
uni.hideLoading();
$response(response, () => {
if (response.data.count > 0) {
YuYuePopupRef.value.open()
} else {
UsePlan()
}
});
}
//
const UsePlan = async () => {
let data= {plan_id:tj_plan_id.value,plan_time:tj_time.value}
const response = await $api("LockPlan",data);
uni.hideLoading();
$response(response, () => {
if(response.status){
YuYuePopupRef.value.close()
let tempPlan = $store.getTempPlan()
tempPlan=data
$store.setTempPlan(tempPlan)
uni.navigateTo({
url:'/pages/main/combo/combo'
})
}
});
}
//
const DateChange = (date) => {
selectedDate.value = date
selectedTime.value = null
if (itemSelected.value.type == 'tj') {
tj_time.value = null
tj_date.value = date
currentDate.value=date
doctor_name.value = null //
GetDayPlanListFunc()
}
}
const TaoCanCloseFunc=()=>{
OrderId.value=0
popupMultiple.value.close()
console.log(PendingOrders.value);
}
//
const GetPendingOrdersFunc = async () => {
PendingOrders.value = []
uni.showLoading();
let data = {
person_id: person_id.value
}
const response = await $api("GetPendingOrders", data);
uni.hideLoading();
$response(response, () => {
response.data.list.forEach((v, i) => {
if(v.title.length>11){
v.title= v.title.substring(0,11)+'...'
}
PendingOrders.value.push({
value: v.id,
text: v.title
})
})
if(PendingOrders.value.length>0){
console.log(PendingOrders.value)
popupMultiple.value.open()
}
});
}
const PendingOrdersChange = (e) => {
if(!e) return false;
uni.redirectTo({
url: '/pages/main/yytjsj/yytjsj_new?id=' + e
})
}
let popupMultiple = ref(false); //
let temp = null
onMounted(async () => {
itemSelected.value.type = 'tj'
buyInfo.value = $store.getBuyInfo();
//
temp = $store.getYytjInfo()
yytjInfo.value=temp
temp.doctor_name = ""
temp.doctor_date = ""
$store.setYytjInfo(temp)
selectedDate.value = GetToday()
console.log(selectedDate.value)
tj_date.value = GetToday()
checkup_type_id.value = buyInfo.value.group_id ?
$store.getGroupInfo()?.checkup_type_id : $store.getCheckupTypeId()?.id
hospital_id.value = buyInfo.value.hospital
person_id.value = $store.getUser()?.person_id
combo_id.value = buyInfo.value.combo_id
use_type.value = buyInfo.value.group_id ? 2 : 1
person_name.value = $store.getUser()?.name
await getBuyInfoFuc()
GetDayPlanListFunc()
GetPendingOrdersFunc()
});
let OrderId = ref(0)
onLoad((e) => {
OrderId.value = Number(e.id)
})
onShow(() => {
temp = $store.getYytjInfo()
if (temp.doctor_name != null && temp.doctor_name != '') {
doctor_name.value = temp.doctor_name
}
if (temp.doctor_date != null && temp.doctor_date != '') {
console.log('6666666',selectedDate.value)
console.log('6666666',temp.doctor_date)
if(selectedDate.value!=temp.doctor_date){
tj_time.value=''
tj_plan_id.value=''
selectedTime.value=''
}
selectedDate.value = temp.doctor_date
tj_date.value = temp.doctor_date
MonthSelectedDate.value=temp.doctor_date
currentDate.value=temp.doctor_date
GetDayPlanListFunc()
}
})
const GetToday = () => {
const date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
currentDate.value=GetToday()
const showCallKeFu = computed(() => {
if (!(weekList.value?.weeklist && weekList.value?.weeklist.length>1)) return false;
const found = weekList.value.weeklist.find(
item => item.date === currentDate.value
);
return found && found.count === 0;
});
</script>
<style scoped lang="scss">
.select {
width: 250rpx;
box-sizing: content-box;
display: flex;
align-items: center;
height: 50rpx;
line-height: 50rpx;
text-align: center;
font-size: 24rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #239ea3;
::v-deep .uni-data-select {
width: 100%;
height: 100%;
.uni-select {
border: none !important;
height: 50rpx;
border-bottom: none !important;
.uni-select__input-text {
color: #8F8F8F;
}
.uni-icons {
font-size: 35rpx !important;
}
}
}
}
.ctime_main {
background-color: #D8EEF3;
height: calc(100vh - 90rpx);
overflow: hidden;
}
.top {
background-color: #fff;
border-radius: 20rpx;
margin-bottom: 20rpx;
padding: 20rpx;
}
.buttom_div{
height: calc(100vh - 400rpx);
background-color: #fff;
}
.zhouli {
padding:10rpx 40rpx;
background-color: #fff;
height:calc(100% - 30rpx) ;
overflow-y: scroll;
}
.zhouli2 {
padding:10rpx 40rpx;
background-color: #fff;
height:calc(100% - 120rpx) ;
overflow-y: scroll;
}
.itemSelected {
background-color: #e0fafa;
border-radius: 10rpx;
}
.dateitem {
display: none;
padding: 20rpx;
background-color: #fff;
border-radius: 20rpx;
margin-top: 20rpx;
}
::v-deep #ylrl {
.uni-calendar--fixed{
bottom: 110rpx !important;
}
.uni-calendar__header,
.uni-calendar__weeks-day {
border: none;
}
.uni-calendar-item--checked {
background-color: transparent;
color: #239ea3 !important;
.uni-calendar-item__weeks-box-item {
background-color: #EBFBFF !important;
border-radius: 12rpx;
.uni-calendar-item--extra {
color: #239ea3 !important;
}
}
}
.uni-calendar-item--isDay {
background-color: #EBFBFF !important;
border-radius: 12rpx;
color: #239ea3 !important;
.uni-calendar-item--extra{
color:#ff5500 !important;
}
}
.uni-calendar-item--extra {
color: #ff5500;
font-size: 21rpx !important;
}
.uni-calendar-item__weeks-box {
// padding: 10rpx;
box-sizing: border-box;
}
.uni-calendar-item__weeks-box-circle {
background-color: rgba(0, 0, 0, 0);
}
.uni-calendar-item--isDay-text {
color: #333;
}
.uni-calendar-item__weeks-box-text {
font-size: 30rpx;
// font-weight: 700;
color: #239ea3;
}
.uni-calendar-item--disable{
color:#c0c0c0;
font-weight: 400;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--extra) {
color: #ccc;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--disable) {
color: #ccc !important;
}
.uni-calendar-item__weeks-lunar-text {
font-size: 30rpx;
}
.uni-calendar-item__weeks-box-item {
width: 100%;
}
.uni-calendar__backtoday {
display: none;
}
}
.doctor_button {
display: flex;
background-color: #fff;
padding-left: 10rpx;
height: 40rpx;
line-height: 40rpx;
border-radius: 24rpx;
margin-top: 5rpx;
margin-left: 10rpx;
color: #9E9E9F;
font-size: 20rpx;
text-align: center;
width: 180rpx;
}
.check_done_wrapper {
width: 660rpx;
height: 70rpx;
line-height: 70rpx;
margin: 0rpx auto 0rpx;
border-radius: 60rpx ;
background: #00939B;
font-weight: 700;
font-size: 29rpx;
color: #F6FDFD;
text-align: center;
}
.tishi_main {
background-color: #fff;
padding: 40rpx 50rpx;
width: 500rpx;
border-radius: 40rpx;
}
.tishi_button {
height: 60rpx;
line-height: 60rpx;
width: 365rpx;
background-color: #009da5;
color: #fff;
text-align: center;
border-radius: 40rpx;
margin: 40rpx auto 10rpx auto;
}
.tishi_title {
text-align: center;
font-size: 30rpx;
font-weight: 600;
color: #2b2827;
}
.tishi_title2 {
display: flex;
font-size: 28rpx;
margin-top: 30rpx;
font-weight: 600;
color: #3a3635;
padding-left: 5rpx;
}
.tishi_content {
font-size: 28rpx;
margin-top: 30rpx;
color: #474241;
}
.tishi_shuxian {
color: #00939B;
font-weight: bolder;
margin-right: 4rpx;
// border-right: 3rpx solid #00939B;
// height: 28rpx;
}
.yigou {
display: flex;
justify-content: space-between;
padding: 30rpx 30rpx 0rpx 60rpx;
background-color: #fff;
}
.buycombo_button {
background-color: #00939B;
color: #fff;
font-size: 26rpx;
padding: 10rpx 60rpx;
border-radius: 20rpx;
}
.yigou_tishi {
font-size: 26rpx;
color: #8b8b8b;
width: 200rpx;
height: 50rpx;
}
.kefu{
margin:-10rpx 20rpx 20rpx 20rpx;
border-radius: 10rpx;
}
</style>

@ -1,6 +1,32 @@
<template>
<DraggableButton />
<!-- <DraggableButton /> -->
<TabBar />
<view class="ctime_main">
<uni-popup ref="PayPopupTip" :mask-click="false">
<view
class="mb-70rpx bg-#fff text-center box-border pt-80rpx pb-50rpx px-65rpx w-90vw rounded-15rpx"
>
<view
class="w-full text-center text-##090909 text-26rpx line-height-[50rpx]"
>是否继续支付</view
>
<view class="mt-50rpx between">
<button
type="primary"
@click="toUrl('/pages/main/order/order')"
class="w-196rpx h-68rpx center text-#fff text-24rpx !bg-#239EA3 rounded-8rpx"
>
取消
</button>
<button
@click=" StartPay(CreatedOrderId)"
class="w-196rpx h-68rpx center text-#239EA3 text-24rpx !bg-#D9F3F2 rounded-8rpx"
>
继续
</button>
</view>
</view>
</uni-popup>
<uni-popup ref="YuYuePopupRef" style="z-index: 999;">
<view class="tishi_main">
<view class="tishi_title">提示</view>
@ -15,69 +41,87 @@
</view>
</view>
</uni-popup>
<view v-if="combo_name" style="display: flex;justify-content: space-between;padding: 40rpx;">
<view style="min-height: 100rpx;">
<view v-if="combo_name" style="display: flex;justify-content: space-between;align-items: center; padding:20rpx 40rpx;">
<view>
<view style="font-size: 33rpx;">{{person_name}}</view>
<view style="font-size: 23rpx;color:#008F96;margin-top: 10rpx;">{{combo_name}}</view>
<view style="font-size: 33rpx;margin-top: 2rpx;">{{person_name}}</view>
<!-- <view style="font-size: 23rpx;color:#008F96;margin-top: 10rpx;">{{combo_name}}</view> -->
<view v-if="checkup_type_id==4" style="font-size: 23rpx;color:#FF0000;margin-top: 10rpx;"></view>
</view>
<view>
<view style="font-size: 33rpx;">{{doctor_name?doctor_name:"体检医生"}}</view>
<view class="doctor_button" @click="selectDoctor()">
<view class="doctor_button" @click="doctorNameClick()" >
<uni-icons type="search" color="#D8EEF3" size="16"></uni-icons>
<view>请选择</view>
<view style="font-size: 26rpx;margin-left: 10rpx;" >{{doctor_name?doctor_name:"体检医生"}}</view>
</view>
</view>
</view>
</view>
<view style="background-color: #F8F8F8;margin-bottom: -20rpx;" v-if="showCallKeFu" >
<CallKeFu class="kefu"></CallKeFu>
</view>
<view class="buttom_div">
<view v-if="checkup_type_id==1 && use_type==1 && combo_id !='2814' && !buyInfo.sanfang_code?.code_num">
<view v-if="PendingOrders.length>0" class="yigou">
<view class="yigou_tishi">请选择已购套餐</view>
<view style="width: 350rpx; " class="select">
<uni-data-select style="border: 0px;" class="uni-data-select" v-model="OrderId" :localdata="PendingOrders" :clear="false"
@change="PendingOrdersChange"></uni-data-select>
</view>
</view>
<view v-else class="yigou">
<view class="yigou_tishi">您未购买套餐可以点击右侧购买套餐</view>
<view>
<view class="buycombo_button">购买套餐</view>
</view>
</view>
</view>
<view class="zhouli">
<view v-if="combo_id =='2814' || buyInfo.sanfang_code?.code_num || use_type==2" style="height: 20rpx">
</view>
<view :class="[PendingOrders.length > 0 ? 'zhouli2' : 'zhouli']">
<WeeklyCalendar v-if="weekList" :dataInfo="weekList" :selectedTime="selectedTime" :YuYueInfo="YuYueInfo"
:TjDTime="tj_date+' '+tj_time" :ItemSelected="itemSelected" @selectDate="selectDateFunc"
@selectTime="selectTimeFunc" @openMonth="openMonthFunc" />
</view>
</view>
<view class="dateitem" v-if="orderInfo">
<view
style="background-color: #f7f7f7; padding: 20rpx; font-size: 30rpx; border-radius: 20rpx;color: #333;">
<view style="background-color: #f7f7f7; padding: 20rpx; font-size: 30rpx; border-radius: 20rpx;color: #333;">
<view>{{orderInfo.name}}</view>
<view
style="background-color: #f1f1f1;padding: 20rpx 10rpx; margin-top: 10rpx;border-radius: 14rpx;font-size: 28rpx;color: #666;">
<view style="background-color: #f1f1f1;padding: 20rpx 10rpx; margin-top: 10rpx;border-radius: 14rpx;font-size: 28rpx;color: #666;">
<view v-if="YuYueInfo.NmrInfo.length>0">
<view @click="itemClick('nmr',item_nmr,index_nmr)"
v-for="(item_nmr,index_nmr) in YuYueInfo.NmrInfo" :key="index_nmr" style="padding: 20rpx;"
:class="(itemSelected.type=='nmr' && itemSelected.index==index_nmr)?'itemSelected':''">
{{item_nmr.name}} <span v-if="item_nmr.date && item_nmr.time">{{item_nmr.date}}
{{item_nmr.time}}</span>
<view @click="itemClick('nmr',item_nmr,index_nmr)" v-for="(item_nmr,index_nmr) in YuYueInfo.NmrInfo" :key="index_nmr" style="padding: 20rpx;" :class="(itemSelected.type=='nmr' && itemSelected.index==index_nmr)?'itemSelected':''">
{{item_nmr.name}} <span v-if="item_nmr.date && item_nmr.time">{{item_nmr.date}} {{item_nmr.time}}</span>
</view>
</view>
<view @click="itemClick('tj','',0)" style="margin-top: 10rpx;padding: 20rpx;color: #666;"
:class="itemSelected.type=='tj'?'itemSelected':''">体检日期 <span
v-if="tj_date && tj_time">{{tj_date}}
{{tj_time}}</span></view>
<view @click="itemClick('tj','',0)" style="margin-top: 10rpx;padding: 20rpx;color: #666;" :class="itemSelected.type=='tj'?'itemSelected':''">
体检日期 <span v-if="tj_date && tj_time">{{tj_date}} {{tj_time}}</span>
</view>
</view>
</view>
</view>
<view class="pb-40rpx" style="background-color: #fff;padding-top: 20rpx;">
<view class="pb-140rpx" style="background-color: #fff;padding-top: 20rpx;">
<!-- <view @click="StartYuYue()"
class="text-#fff text-32rpx rounded-45rpx bg-#239EA3 mt-40rpx ma w-520rpx h-90rpx flex flex-items-center flex-justify-center">
确定
</view> -->
<view @click="ChaPersonAppointment()" class="check_done_wrapper">立即预</view>
<view @click="ChaPersonAppointment()" v-if=" !(weekList && weekList.weeklist.find(item => item.date === currentDate)?.count === 0)" class="check_done_wrapper"></view>
</view>
<view id="ylrl">
<uni-calendar :insert="false" :showMonth="false" ref="DoctorMonthCalendar" @confirm="DoctMonthConfirm" />
<uni-calendar :selected="MonthList" @monthSwitch="monthSwitch" :insert="false" :showMonth="false"
<uni-calendar :start-date="GetToday()" :date="currentDate" :selected="MonthList" @monthSwitch="monthSwitch" :insert="false" :showMonth="false"
ref="MonthCalendar" @confirm="MonthConfirm" />
</view>
</view>
</template>
<script setup>
import {
onMounted,
ref
ref,computed
} from 'vue';
import {
$image,
@ -95,6 +139,8 @@
} from "@dcloudio/uni-app";
import DraggableButton from "@/pages/components/goHome.vue";
import WeeklyCalendar from '@/common/WeeklyCalendar.vue';
import TabBar from "@/common/TabBar.vue";
import CallKeFu from "@/common/CallKeFu.vue";
let nmr_date = ref(null);
let nmr_time = ref(null);
let nmr_plan_id = ref(null); //id
@ -119,7 +165,10 @@
let combo_id=ref(null);
let item_ids=ref([]);
let YuYuePopupRef=ref(null);
let PayPopupTip=ref(null);
let er_xian_info=ref(null);
let PendingOrders=ref([]);
let CreatedOrderId=ref(0);
const getBuyInfoFuc = async () => {
//
let obj = {
@ -161,7 +210,8 @@
combo_id:combo_id.value,
item_ids:item_ids.value,
er_xian_info:er_xian_info.value,
danwei_id:(use_type.value==2 && $store.getGroupInfo()?.danwei_id)?$store.getGroupInfo()?.danwei_id:null
danwei_id:(use_type.value==2 && $store.getGroupInfo()?.danwei_id)?$store.getGroupInfo()?.danwei_id:null,
big_date:MonthSelectedDate.value
}
const response = await $api("GetDayPlanList", data);
uni.hideLoading();
@ -217,7 +267,7 @@
use_type.value = orderInfo.value.type
checkup_type_id.value = orderInfo.value.checkup_type_id
amount.value = orderInfo.value.true_price
person_name.value = orderInfo.value.name
person_name.value = $store.getUser()?.name
combo_name.value = orderInfo.value.title
combo_id.value=orderInfo.value.combo_id
if(orderInfo.value.buy_info?.items){
@ -242,6 +292,7 @@
confirmText: '确定',
success: function(res) {
if (res.confirm) {
currentDate.value=date
DateChange(date)
} else if (res.cancel) {
@ -249,6 +300,7 @@
}
});
} else {
currentDate.value=date
DateChange(date)
}
}
@ -298,7 +350,7 @@
DoctorMonthCalendar.value.open();
} else {
uni.navigateTo({
url: `/pages/main/selectDoctor/selectDoctor?date=${tj_date.value}`,
url: `/pages/main/selectDoctor/selectDoctor?date=${tj_date.value}&person=${ person_id.value}`,
});
}
@ -321,10 +373,15 @@
if (itemSelected.value.type == 'tj') {
GetMonthPlanListFunc(ym)
}
}
let MonthSelectedDate=ref('');//,7
const MonthConfirm = (e) => { //
console.log(e.fulldate)
// if(e.extraInfo.date ==undefined){
// uni.$lu.toast("");
// return false
// }
if (doctor_name.value) {
uni.showModal({
title: '提示',
@ -333,6 +390,7 @@
confirmText: '确定',
success: function(res) {
if (res.confirm) {
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
} else if (res.cancel) {
@ -340,6 +398,7 @@
}
});
} else {
MonthSelectedDate.value=e.fulldate
DateChange(e.fulldate)
}
@ -354,6 +413,7 @@
month: ym ? ym : tj_date.value.substring(0, 7),
use_type: use_type.value,
checkup_type_id: checkup_type_id.value,
combo_id:combo_id.value,
amount: amount.value,
danwei_id:(use_type.value==2 && $store.getGroupInfo()?.danwei_id)?$store.getGroupInfo()?.danwei_id:null
}
@ -362,11 +422,24 @@
$response(response, () => {
let rlArr = [];
response.data.list.forEach((item) => {
let info=""
if(item.count===0){
info="满号"
}
if(item.date<GetToday()){
info=" "
}
if(item.count == -1){
info=" "
}
let o = {
date: item.date,
info: "余号" + item.count,
// info: "" + item.count,
info:info
};
if( item.count>0){
if ((item.count >= -1 && item.date!=GetToday()) ||(item.date==GetToday() && item.count === 0) ) {
rlArr.push(o);
}
});
@ -432,8 +505,9 @@
}
//
const StartYuYue = async () => {
if (buyInfo.value.group_id || buyInfo.value.sanfang_code?.code_num) {
// /
let yuyuefangshi=$store.getYuYueFangShi()
if (buyInfo.value.group_id || buyInfo.value.sanfang_code?.code_num || yuyuefangshi=='yujianzixun') {
// / /
comfrimyy()
} else {
//
@ -488,11 +562,12 @@
const response = await $api("OrderCreate", obj);
$response(response, () => {
if (response.status) {
CreatedOrderId.value=response.data.orderid
if (response.data.action == "pay") {
StartPay(response.data.orderid);
StartPay(CreatedOrderId.value);
} else {
uni.navigateTo({
url: "/pages/buy/done/yuyue_done?id=" + response.data.orderid,
url: "/pages/buy/done/yuyue_done?id=" + CreatedOrderId.value,
});
}
}
@ -511,7 +586,8 @@
orderid: orderInfo.value.id,
plan_id: tj_plan_id.value,
nmr_info: YuYueInfo.value.NmrInfo,
doctor: doctor_name.value
doctor: doctor_name.value,
person_id:$store.getUser()?.person_id
}
console.log(data);
const response = await $api("StartYuYue", data);
@ -539,6 +615,8 @@
uni.hideLoading();
$response(response, () => {
if (response.status) {
YuYuePopupRef.value.close();
PayPopupTip.value.open()
let info = response.data.info;
let p =
"&appid=" +
@ -585,11 +663,41 @@
if (itemSelected.value.type == 'tj') {
tj_time.value = null
tj_date.value = date
currentDate.value=date
doctor_name.value = null //
GetDayPlanListFunc()
}
}
//
const GetPendingOrdersFunc=async()=>{
PendingOrders.value=[]
uni.showLoading();
let data = {
person_id: person_id.value
}
const response = await $api("GetPendingOrders", data);
uni.hideLoading();
$response(response, () => {
response.data.list.forEach((v,i)=>{
if(v.title.length>8){
v.title= v.title.substring(0,8)+'...'
}
PendingOrders.value.push({value:v.id,text: v.title})
})
});
}
const PendingOrdersChange=(e)=>{
uni.reLaunch({
url:'/pages/main/yytjsj/yytjsj_new?id='+e
})
}
const toUrl=(url)=>{
uni.reLaunch({
url:url
})
}
let temp = null
onMounted(async() => {
itemSelected.value.type = 'tj'
@ -603,7 +711,7 @@
console.log(selectedDate.value)
tj_date.value = GetToday()
if (OrderId.value) {
GetOrderInfo()
await GetOrderInfo()
} else {
checkup_type_id.value = buyInfo.value.group_id ?
$store.getGroupInfo()?.checkup_type_id : $store.getCheckupTypeId()?.id
@ -617,16 +725,36 @@
}else{
person_name.value = $store.getUser()?.name
}
await getBuyInfoFuc()
GetDayPlanListFunc()
}
GetPendingOrdersFunc()
});
const doctorNameClick=()=>{
if (doctor_name.value) {
uni.showModal({
title: '提示',
content: '是否取消预约此医生',
cancelText: '取消医生',
confirmText: '重新选择',
success: function(res) {
if (res.confirm) {
selectDoctor()
} else if (res.cancel) {
doctor_name.value = null //
}
}
});
} else{
selectDoctor()
}
}
let OrderId = ref(0)
onLoad((e) => {
OrderId.value = e.id
OrderId.value = Number(e.id)
})
onShow(() => {
@ -638,6 +766,9 @@
if (temp.doctor_date != null && temp.doctor_date != '') {
selectedDate.value = temp.doctor_date
tj_date.value = temp.doctor_date
MonthSelectedDate.value=temp.doctor_date
currentDate.value=temp.doctor_date
GetDayPlanListFunc()
}
@ -649,12 +780,52 @@
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
currentDate.value=GetToday()
const showCallKeFu = computed(() => {
if (!(weekList.value?.weeklist && weekList.value?.weeklist.length>1)) return false;
const found = weekList.value.weeklist.find(
item => item.date === currentDate.value
);
return found && found.count === 0;
});
</script>
<style scoped lang="scss">
.select {
width: 250rpx;
box-sizing: content-box;
display: flex;
align-items: center;
height: 50rpx;
line-height: 50rpx;
text-align: center;
font-size: 24rpx;
border-radius: 16rpx 16rpx 16rpx 16rpx;
border: 2rpx solid #239ea3;
::v-deep .uni-data-select {
width: 100%;
height: 100%;
.uni-select {
border: none !important;
height: 50rpx;
border-bottom: none !important;
.uni-select__input-text {
color: #8F8F8F;
}
.uni-icons {
font-size: 35rpx !important;
}
}
}
}
.ctime_main {
background-color: #D8EEF3;
height: calc(100vh - 80rpx);
height: calc(100vh - 90rpx);
overflow: hidden;
}
.top {
@ -663,11 +834,20 @@
margin-bottom: 20rpx;
padding: 20rpx;
}
.buttom_div{
min-height: calc(100vh - 450rpx);
background-color: #fff;
}
.zhouli {
padding: 40rpx;
padding:10rpx 40rpx;
background-color: #fff;
height: calc(100vh - 460rpx);
height: calc(100vh - 430rpx);
overflow-y: scroll;
}
.zhouli2 {
padding:10rpx 40rpx;
background-color: #fff;
height: calc(100vh - 500rpx);
overflow-y: scroll;
}
@ -686,7 +866,9 @@
}
::v-deep #ylrl {
.uni-calendar--fixed{
bottom: 110rpx !important;
}
.uni-calendar__header,
.uni-calendar__weeks-day {
border: none;
@ -694,25 +876,29 @@
.uni-calendar-item--checked {
background-color: transparent;
color: #239ea3 !important;
.uni-calendar-item__weeks-box-item {
background-color: #239ea3 !important;
background-color: #EBFBFF !important;
border-radius: 12rpx;
.uni-calendar-item--extra {
color: #fff !important;
color: #239ea3 !important;
}
}
}
.uni-calendar-item--isDay {
background-color: #239ea3 !important;
background-color: #EBFBFF !important;
border-radius: 12rpx;
color: #fff !important;
color: #239ea3 !important;
.uni-calendar-item--extra{
color:#ff5500 !important;
}
}
.uni-calendar-item--extra {
color: #239ea3;
color: #ff5500;
font-size: 21rpx !important;
}
.uni-calendar-item__weeks-box {
@ -729,12 +915,16 @@
}
.uni-calendar-item__weeks-box-text {
font-size: 26rpx;
color:#ccc;
font-size: 30rpx;
// font-weight: 700;
color: #239ea3;
}
.uni-calendar-item--disable{
color:#c0c0c0;
font-weight: 400;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--extra) {
color: #666;
color: #ccc;
}
.uni-calendar-item__weeks-box-text:has(+ .uni-calendar-item--disable) {
@ -742,7 +932,7 @@
}
.uni-calendar-item__weeks-lunar-text {
font-size: 16rpx;
font-size: 30rpx;
}
.uni-calendar-item__weeks-box-item {
@ -766,7 +956,7 @@
color: #9E9E9F;
font-size: 20rpx;
text-align: center;
width: 120rpx;
width: 180rpx;
}
.check_done_wrapper {
@ -774,7 +964,7 @@
height: 70rpx;
line-height: 70rpx;
margin: 0rpx auto 0rpx;
border-radius: 20rpx 20rpx 0rpx 0rpx;
border-radius: 60rpx ;
background: #00939B;
font-weight: 700;
font-size: 29rpx;
@ -825,4 +1015,28 @@
// border-right: 3rpx solid #00939B;
// height: 28rpx;
}
.yigou{
display: flex;
justify-content: space-between;
padding: 30rpx 60rpx 0rpx 60rpx;
background-color: #fff;
}
.buycombo_button{
background-color: #00939B;
color:#fff;
font-size: 26rpx;
padding: 10rpx 60rpx;
border-radius: 20rpx;
}
.yigou_tishi{
font-size: 22rpx;
color:#8b8b8b;
width: 200rpx;
}
.kefu{
margin:-10rpx 20rpx 20rpx 20rpx;
border-radius: 10rpx;
}
</style>

@ -1,5 +1,6 @@
<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
import TabBar from "@/common/TabBar.vue";
/**
* name
* usersa0ChunLuyu
@ -13,7 +14,7 @@ import DraggableButton from "@/pages/components/goHome.vue";
$response
} from '@/api'
import {
onShow
onShow,onLoad
} from '@dcloudio/uni-app'
import {
useStore
@ -53,12 +54,29 @@ import DraggableButton from "@/pages/components/goHome.vue";
onShow(() => {
if (!!config_ref.value) {
mountedAction()
}
})
onLoad(()=>{
let title=''
if($props.type==2){
title='注意事项'
}
if($props.type==1){
title='健康指导'
}
if($props.type==4){
title='健康宣教'
}
uni.setNavigationBarTitle({
title:title
});
})
</script>
<template>
<DraggableButton />
<view>
<TabBar />
<view style="padding-bottom: 110rpx;">
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>

@ -8,7 +8,8 @@
watch,
computed,
onMounted,
ref
ref,
nextTick
} from 'vue'
import {
$api,
@ -25,6 +26,9 @@
}, {
title: '注意事项',
desc: 'Physical Examination Notices'
}, {
title: '',
desc: ''
},{
title: '健康宣教',
desc: 'Health Education'
@ -63,13 +67,26 @@
id: item.id
})
$response(response, () => {
posts_list.value[key].content = htmlToText(response.data.info.content)
posts_list_show.value[key].content = htmlToText(response.data.info.content)
})
}
const contentShow = (info, key) => {
console.log(info)
console.log(key)
posts_list.value[key].open = !posts_list.value[key].open
if (posts_list.value[key].open && !posts_list.value[key].content) {
const showIndex = posts_list_show.value.findIndex(item => item.id === info.id);
if (showIndex !== -1) {
posts_list_show.value[showIndex].open = posts_list.value[key].open;
posts_list_show.value[showIndex].content = posts_list.value[key].content;
}
console.log(posts_list.value[key].open)
if (posts_list.value[key].open ) {
getDetail(info, key)
}
}
@ -110,7 +127,7 @@
<view class="search_input_icon_wrapper">
<image src="@/static/assets/posts/sousuo@2x.png"></image>
</view>
<input class="search_input_input_wrapper" v-model="search_input" type="text" placeholder="搜索">
<input class="search_input_input_wrapper" v-model="search_input" placeholder="搜索" >
</view>
</view>
<view class="item_list_wrapper">
@ -122,9 +139,18 @@
<view :class="!i.open ?'item_title_text_wrapper':'item_title_text_wrapper2'" class="">{{ i.title }}</view>
<view class="item_title_icon_wrapper">
<view class="item_title_icon_text_wrapper">{{ !i.open ? '展开' : '收起' }}</view>
<image v-if="!i.open" src="@/static/assets/posts/sanjiao@2x.png"></image>
<image v-else src="@/static/assets/posts/xsanjiao@2x.png"></image>
<image v-if="!i.open" src="@/static/assets/posts/xsanjiao@2x.png"></image>
<image v-else src="@/static/assets/posts/sanjiao@2x.png"></image>
</view>
<!-- <view class="item_title_icon_wrapper">
<view class="item_title_icon_text_wrapper">{{ !i.open ? '展开' : '收起' }}</view>
<view v-if="!i.open" style="display: flex; flex-direction: column;">
<image src="@/static/assets/posts/sanjiao@2x.png"></image>
<image style="margin-top: 4rpx;" src="@/static/assets/posts/xsanjiao@2x.png"></image>
</view>
<image v-else src="@/static/assets/posts/xsanjiao@2x.png"></image>
</view> -->
<image class="item_title_background_wrapper" src="@/static/assets/posts/biaoti@2x.png"></image>
</view>
<view v-if="!!i.open" class="item_content_wrapper">

@ -35,6 +35,7 @@
const mountedAction = () => {
getTipContent()
$store.setCheckupTypeId({id:4})
}
const config_ref = ref(null)

@ -31,6 +31,7 @@
default: "0",
},
});
let tips_popup=ref(null)
let erweima_popup = ref(null)
const fenzhen_list = ref(false);
const check_tip_show = ref(false);
@ -70,6 +71,7 @@
fenzhen_list.value = response.data;
if (!check_tip_show.value) {
checkTipShow(response.data.check_tip, response.data.info.tj_number)
return false;
}
if (fenzhen_active.value !== -1) {
getFenzhenInfo(fenzhen_active.value)
@ -110,7 +112,7 @@
};
const tip_show = ref(false);
const tip_content = ref("");
const tip_content = ref('');
const getTipContent = async () => {
uni.showLoading();
const response = await $api("GetReadme");
@ -118,19 +120,18 @@
$response(response, () => {
tip_content.value = response.data.content;
tip_show.value = true;
tips_popup.value.open()
});
};
const tipShowClick = () => {
if (!!tip_content.value) {
tip_show.value = true;
} else {
getTipContent();
}
};
const toReport = () => {
wx.miniProgram.navigateTo({
url: '/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1035&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904'
url: '/pages/other/entry/index?path=/pages/outpatient/doctor-appointment/index&scene=1002&hospitalAreaId=6&departmentCode=A0030077&subDepartmentCode=4773794195699464904'
})
}
@ -183,7 +184,18 @@
erweimaText.value = ''
console.log(erweimaText.value)
}
const tipsClose=()=>{
tips_popup.value.close();
tip_show.value = false;
}
const processString=(str, substring)=> {
const index = str.indexOf(substring);
if(index !== -1) {
//
return str.substring(index + substring.length).trim();
}
return ""; //
}
onShow(() => {
if (!!config_ref.value) {
mountedAction();
@ -195,10 +207,10 @@
<view>
<uni-popup ref="erweima_popup" type="center" :animation="false" @maskClick="MaskClickFunc()">
<view style="background-color: #fff;padding: 20rpx;border-radius: 10rpx;">
<view>扫码预约取号</view>
<view></view>
<w-qrcode :options="{
level: 4,
size: 460,
size: 470,
code: erweimaText,
}"></w-qrcode>
</view>
@ -206,14 +218,17 @@
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
<uni-popup style="z-index: 999;" ref="tips_popup" type="center" :animation="false" @maskClick="MaskClickFunc()">
<view class="tip_dialog_wrapper" v-if="!!tip_show">
<view class="tip_dialog_box_wrapper">
<view @click="tip_show = !tip_show" class="tip_dialog_close_wrapper">
<view @click="tipsClose()" class="tip_dialog_close_wrapper">
<image src="@/static/assets/contrast/close@2x.png"></image>
</view>
<view class="tip_dialog_text_wrapper" v-html="tip_content"></view>
</view>
</view>
</uni-popup>
<view v-if="!!fenzhen_list">
<view class="order_info_wrapper relative">
<w-qrcode v-if="fenzhen_list.info.kahao" @click="erweima_click(fenzhen_list.info.kahao)"
@ -231,11 +246,13 @@
}}</view>
</view>
<view class="info_box_wrapper">
<view class="info_wrapper">
<view class="info_wrapper" v-if="!fenzhen_list.info.combo_name.includes('单位团检')">
<view class="info_title_wrapper">体检套餐</view>
<view class="info_text_wrapper">{{
fenzhen_list.info.combo_name
}}</view>
<view class="info_text_wrapper">{{ fenzhen_list.info.combo_name }}</view>
</view>
<view class="info_wrapper" v-else>
<view class="info_title_wrapper">体检单位</view>
<view class="info_text_wrapper">{{ processString(fenzhen_list.info.combo_name, "单位团检") }}</view>
</view>
<view class="info_wrapper info2_wrapper">
<view class="info_title_wrapper">体检日期</view>
@ -296,7 +313,7 @@
<view class="time_line_box_wrapper">
<view v-for="(i, k) in fenzhen_list.list" :key="k">
<view class="time_line_item_wrapper" :class="[`time_line_item-${i.status}_wrapper`]">
<view class="time_line_item_time_wrapper">
<view class="time_line_item_time_wrapper" v-if="i.name!='体检结束'">
<view v-if="!!i.time" class="time_line_item_time_value_wrapper">{{
i.time
}}</view>
@ -306,9 +323,9 @@
<view v-if="!!i.time" class="time_line_item_time_line_wrapper"></view>
<view v-if="!i.time" class="time_line_item_time_cover_wrapper"></view>
</view>
<view class="time_line_item_content_wrapper">
<view class="time_line_item_content_wrapper" v-if="i.name!=''" >
<view class="time_line_item_triangle_wrapper" ></view>
<view class="time_line_item_flex_wrapper">
<view class="time_line_item_flex_wrapper" v-if="i.name!='体检结束'">
<view class="time_line_item_title_wrapper">{{ k + 1 }}.{{ i.name }}</view>
<view class="time_line_item_box_wrapper">{{ i.desc }}</view>
</view>
@ -436,11 +453,14 @@
border-radius: 15rpx;
padding-left: 50rpx;
padding-right: 50rpx;
padding-bottom: 90rpx;
padding-top: 130rpx;
padding-bottom: 60rpx;
padding-top: 80rpx;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
font-size: 28rpx;
line-height: 56rpx;
color: #666;
}
.time_line_item_more_wrapper {
@ -474,6 +494,7 @@
.time_line_item_box_wrapper {
width: 400rpx;
overflow: hidden;
margin-left: 20rpx;
height: 40rpx;
background: #5a75ca30;
@ -487,7 +508,7 @@
}
.time_line_item_title_wrapper {
/* width: 140rpx; */
width: 170rpx;
font-weight: bold;
font-size: 28rpx;
color: #0d0d0d;
@ -537,7 +558,7 @@
left: 50%;
top: 50%;
transform: translate(-50%, calc(-50% + 26rpx));
z-index: 999;
z-index: 998;
}
.time_line_item_time_dot_in_wrapper {

@ -22,6 +22,8 @@ export const useStore = defineStore('counter', {
count: 0,
loading: 0,
buyInfo: {}, // 购买信息接口配置 预约页面使用 别的地方最好不要用
tempPlan:{},//临时占用号源
yuyue_fangshi:"",//个检、团检、个检先号源、专家定制 等等
}),
actions: {
setComboContrast(comboContrast) {
@ -86,6 +88,25 @@ export const useStore = defineStore('counter', {
getPeiOuUser() {
return JSON.parse(uni.getStorageSync('PEIOU') || '{}') || this.user;
},
//临时占用号源
setTempPlan(plan) {
this.tempPlan = plan;
uni.setStorageSync('TEMP_PLAN', JSON.stringify(plan));
},
//临时占用号源
getTempPlan() {
return JSON.parse(uni.getStorageSync('TEMP_PLAN') || '{}') || this.tempPlan;
},
//预约方式
setYuYueFangShi(type) {
this.yuyue_fangshi = type;
uni.setStorageSync('YUYUE_FANGSHI', JSON.stringify(type));
},
//预约方式
getYuYueFangShi() {
return JSON.parse(uni.getStorageSync('YUYUE_FANGSHI') || {}) || this.yuyue_fangshi;
},
setGroupInfo(info) {
this.groupInfo = info;
uni.setStorageSync('GROUP_INFO', JSON.stringify(info));

@ -1,3 +1,23 @@
## 2.0.102024-06-07
- 优化 uni-app x 中size 属性的类型
## 2.0.92024-01-12
fix: 修复图标大小默认值错误的问题
## 2.0.82023-12-14
- 修复 项目未使用 ts 情况下打包报错的bug
## 2.0.72023-12-14
- 修复 size 属性为 string 时不加单位导致尺寸异常的bug
## 2.0.62023-12-11
- 优化 兼容老版本icon类型如 top bottom 等
## 2.0.52023-12-11
- 优化 兼容老版本icon类型如 top bottom 等
## 2.0.42023-12-06
- 优化 uni-app x 下示例项目图标排序
## 2.0.32023-12-06
- 修复 nvue下引入组件报错的bug
## 2.0.22023-12-05
-优化 size 属性支持单位
## 2.0.12023-12-05
- 新增 uni-app x 支持定义图标
## 1.3.52022-01-24
- 优化 size 属性可以传入不带单位的字符串数值
## 1.3.42022-01-24

@ -0,0 +1,91 @@
<template>
<text class="uni-icons" :style="styleObj">
<slot>{{unicode}}</slot>
</text>
</template>
<script>
import { fontData, IconsDataItem } from './uniicons_file'
/**
* Icons 图标
* @description 用于展示 icon 图标
* @tutorial https://ext.dcloud.net.cn/plugin?id=28
* @property {Number,String} size 图标大小
* @property {String} type 图标图案,参考示例
* @property {String} color 图标颜色
* @property {String} customPrefix 自定义图标
* @event {Function} click 点击 Icon 触发事件
*/
export default {
name: "uni-icons",
props: {
type: {
type: String,
default: ''
},
color: {
type: String,
default: '#333333'
},
size: {
type: [Number, String],
default: 16
},
fontFamily: {
type: String,
default: ''
}
},
data() {
return {};
},
computed: {
unicode() : string {
let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type })
if (codes !== null) {
return codes.unicode
}
return ''
},
iconSize() : string {
const size = this.size
if (typeof size == 'string') {
const reg = /^[0-9]*$/g
return reg.test(size as string) ? '' + size + 'px' : '' + size;
// return '' + this.size
}
return this.getFontSize(size as number)
},
styleObj() : UTSJSONObject {
if (this.fontFamily !== '') {
return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily }
}
return { color: this.color, fontSize: this.iconSize }
}
},
created() { },
methods: {
/**
* 字体大小
*/
getFontSize(size : number) : string {
return size + 'px';
},
},
}
</script>
<style scoped>
@font-face {
font-family: UniIconsFontFamily;
src: url('./uniicons.ttf');
}
.uni-icons {
font-family: UniIconsFontFamily;
font-size: 18px;
font-style: normal;
color: #333;
}
</style>

@ -1,18 +1,22 @@
<template>
<!-- #ifdef APP-NVUE -->
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
<text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text>
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
<text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick">
<slot></slot>
</text>
<!-- #endif -->
</template>
<script>
import icons from './icons.js';
import { fontData } from './uniicons_file_vue.js';
const getVal = (val) => {
const reg = /^[0-9]*$/g
return (typeof val === 'number' || reg.test(val) )? val + 'px' : val;
return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;
}
// #ifdef APP-NVUE
var domModule = weex.requireModule('dom');
import iconUrl from './uniicons.ttf'
@ -51,23 +55,33 @@
customPrefix: {
type: String,
default: ''
},
fontFamily: {
type: String,
default: ''
}
},
data() {
return {
icons: icons.glyphs
icons: fontData
}
},
computed: {
unicode() {
let code = this.icons.find(v => v.font_class === this.type)
if (code) {
return unescape(`%u${code.unicode}`)
return code.unicode
}
return ''
},
iconSize() {
return getVal(this.size)
},
styleObj() {
if (this.fontFamily !== '') {
return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`
}
return `color: ${this.color}; font-size: ${this.iconSize};`
}
},
methods: {
@ -81,9 +95,10 @@
<style lang="scss">
/* #ifndef APP-NVUE */
@import './uniicons.css';
@font-face {
font-family: uniicons;
src: url('./uniicons.ttf') format('truetype');
src: url('./uniicons.ttf');
}
/* #endif */
@ -92,5 +107,4 @@
text-decoration: none;
text-align: center;
}
</style>

@ -1,3 +1,12 @@
.uniui-cart-filled:before {
content: "\e6d0";
}
.uniui-gift-filled:before {
content: "\e6c4";
}
.uniui-color:before {
content: "\e6cf";
}
@ -58,10 +67,6 @@
content: "\e6c3";
}
.uniui-gift-filled:before {
content: "\e6c4";
}
.uniui-fire-filled:before {
content: "\e6c5";
}
@ -82,6 +87,18 @@
content: "\e698";
}
.uniui-arrowthinleft:before {
content: "\e6d2";
}
.uniui-arrowthinup:before {
content: "\e6d3";
}
.uniui-arrowthindown:before {
content: "\e6d4";
}
.uniui-back:before {
content: "\e6b9";
}
@ -94,55 +111,43 @@
content: "\e6bb";
}
.uniui-arrowthinright:before {
content: "\e6bb";
}
.uniui-arrow-left:before {
content: "\e6bc";
}
.uniui-arrowthinleft:before {
content: "\e6bc";
}
.uniui-arrow-up:before {
content: "\e6bd";
}
.uniui-arrowthinup:before {
content: "\e6bd";
}
.uniui-arrow-down:before {
content: "\e6be";
}
.uniui-arrowthindown:before {
content: "\e6be";
.uniui-arrowthinright:before {
content: "\e6d1";
}
.uniui-bottom:before {
.uniui-down:before {
content: "\e6b8";
}
.uniui-arrowdown:before {
.uniui-bottom:before {
content: "\e6b8";
}
.uniui-right:before {
content: "\e6b5";
.uniui-arrowright:before {
content: "\e6d5";
}
.uniui-arrowright:before {
.uniui-right:before {
content: "\e6b5";
}
.uniui-top:before {
.uniui-up:before {
content: "\e6b6";
}
.uniui-arrowup:before {
.uniui-top:before {
content: "\e6b6";
}
@ -150,8 +155,8 @@
content: "\e6b7";
}
.uniui-arrowleft:before {
content: "\e6b7";
.uniui-arrowup:before {
content: "\e6d6";
}
.uniui-eye:before {
@ -638,10 +643,6 @@
content: "\e627";
}
.uniui-cart-filled:before {
content: "\e629";
}
.uniui-checkbox:before {
content: "\e62b";
}

@ -0,0 +1,664 @@
export type IconsData = {
id : string
name : string
font_family : string
css_prefix_text : string
description : string
glyphs : Array<IconsDataItem>
}
export type IconsDataItem = {
font_class : string
unicode : string
}
export const fontData = [
{
"font_class": "arrow-down",
"unicode": "\ue6be"
},
{
"font_class": "arrow-left",
"unicode": "\ue6bc"
},
{
"font_class": "arrow-right",
"unicode": "\ue6bb"
},
{
"font_class": "arrow-up",
"unicode": "\ue6bd"
},
{
"font_class": "auth",
"unicode": "\ue6ab"
},
{
"font_class": "auth-filled",
"unicode": "\ue6cc"
},
{
"font_class": "back",
"unicode": "\ue6b9"
},
{
"font_class": "bars",
"unicode": "\ue627"
},
{
"font_class": "calendar",
"unicode": "\ue6a0"
},
{
"font_class": "calendar-filled",
"unicode": "\ue6c0"
},
{
"font_class": "camera",
"unicode": "\ue65a"
},
{
"font_class": "camera-filled",
"unicode": "\ue658"
},
{
"font_class": "cart",
"unicode": "\ue631"
},
{
"font_class": "cart-filled",
"unicode": "\ue6d0"
},
{
"font_class": "chat",
"unicode": "\ue65d"
},
{
"font_class": "chat-filled",
"unicode": "\ue659"
},
{
"font_class": "chatboxes",
"unicode": "\ue696"
},
{
"font_class": "chatboxes-filled",
"unicode": "\ue692"
},
{
"font_class": "chatbubble",
"unicode": "\ue697"
},
{
"font_class": "chatbubble-filled",
"unicode": "\ue694"
},
{
"font_class": "checkbox",
"unicode": "\ue62b"
},
{
"font_class": "checkbox-filled",
"unicode": "\ue62c"
},
{
"font_class": "checkmarkempty",
"unicode": "\ue65c"
},
{
"font_class": "circle",
"unicode": "\ue65b"
},
{
"font_class": "circle-filled",
"unicode": "\ue65e"
},
{
"font_class": "clear",
"unicode": "\ue66d"
},
{
"font_class": "close",
"unicode": "\ue673"
},
{
"font_class": "closeempty",
"unicode": "\ue66c"
},
{
"font_class": "cloud-download",
"unicode": "\ue647"
},
{
"font_class": "cloud-download-filled",
"unicode": "\ue646"
},
{
"font_class": "cloud-upload",
"unicode": "\ue645"
},
{
"font_class": "cloud-upload-filled",
"unicode": "\ue648"
},
{
"font_class": "color",
"unicode": "\ue6cf"
},
{
"font_class": "color-filled",
"unicode": "\ue6c9"
},
{
"font_class": "compose",
"unicode": "\ue67f"
},
{
"font_class": "contact",
"unicode": "\ue693"
},
{
"font_class": "contact-filled",
"unicode": "\ue695"
},
{
"font_class": "down",
"unicode": "\ue6b8"
},
{
"font_class": "bottom",
"unicode": "\ue6b8"
},
{
"font_class": "download",
"unicode": "\ue68d"
},
{
"font_class": "download-filled",
"unicode": "\ue681"
},
{
"font_class": "email",
"unicode": "\ue69e"
},
{
"font_class": "email-filled",
"unicode": "\ue69a"
},
{
"font_class": "eye",
"unicode": "\ue651"
},
{
"font_class": "eye-filled",
"unicode": "\ue66a"
},
{
"font_class": "eye-slash",
"unicode": "\ue6b3"
},
{
"font_class": "eye-slash-filled",
"unicode": "\ue6b4"
},
{
"font_class": "fire",
"unicode": "\ue6a1"
},
{
"font_class": "fire-filled",
"unicode": "\ue6c5"
},
{
"font_class": "flag",
"unicode": "\ue65f"
},
{
"font_class": "flag-filled",
"unicode": "\ue660"
},
{
"font_class": "folder-add",
"unicode": "\ue6a9"
},
{
"font_class": "folder-add-filled",
"unicode": "\ue6c8"
},
{
"font_class": "font",
"unicode": "\ue6a3"
},
{
"font_class": "forward",
"unicode": "\ue6ba"
},
{
"font_class": "gear",
"unicode": "\ue664"
},
{
"font_class": "gear-filled",
"unicode": "\ue661"
},
{
"font_class": "gift",
"unicode": "\ue6a4"
},
{
"font_class": "gift-filled",
"unicode": "\ue6c4"
},
{
"font_class": "hand-down",
"unicode": "\ue63d"
},
{
"font_class": "hand-down-filled",
"unicode": "\ue63c"
},
{
"font_class": "hand-up",
"unicode": "\ue63f"
},
{
"font_class": "hand-up-filled",
"unicode": "\ue63e"
},
{
"font_class": "headphones",
"unicode": "\ue630"
},
{
"font_class": "heart",
"unicode": "\ue639"
},
{
"font_class": "heart-filled",
"unicode": "\ue641"
},
{
"font_class": "help",
"unicode": "\ue679"
},
{
"font_class": "help-filled",
"unicode": "\ue674"
},
{
"font_class": "home",
"unicode": "\ue662"
},
{
"font_class": "home-filled",
"unicode": "\ue663"
},
{
"font_class": "image",
"unicode": "\ue670"
},
{
"font_class": "image-filled",
"unicode": "\ue678"
},
{
"font_class": "images",
"unicode": "\ue650"
},
{
"font_class": "images-filled",
"unicode": "\ue64b"
},
{
"font_class": "info",
"unicode": "\ue669"
},
{
"font_class": "info-filled",
"unicode": "\ue649"
},
{
"font_class": "left",
"unicode": "\ue6b7"
},
{
"font_class": "link",
"unicode": "\ue6a5"
},
{
"font_class": "list",
"unicode": "\ue644"
},
{
"font_class": "location",
"unicode": "\ue6ae"
},
{
"font_class": "location-filled",
"unicode": "\ue6af"
},
{
"font_class": "locked",
"unicode": "\ue66b"
},
{
"font_class": "locked-filled",
"unicode": "\ue668"
},
{
"font_class": "loop",
"unicode": "\ue633"
},
{
"font_class": "mail-open",
"unicode": "\ue643"
},
{
"font_class": "mail-open-filled",
"unicode": "\ue63a"
},
{
"font_class": "map",
"unicode": "\ue667"
},
{
"font_class": "map-filled",
"unicode": "\ue666"
},
{
"font_class": "map-pin",
"unicode": "\ue6ad"
},
{
"font_class": "map-pin-ellipse",
"unicode": "\ue6ac"
},
{
"font_class": "medal",
"unicode": "\ue6a2"
},
{
"font_class": "medal-filled",
"unicode": "\ue6c3"
},
{
"font_class": "mic",
"unicode": "\ue671"
},
{
"font_class": "mic-filled",
"unicode": "\ue677"
},
{
"font_class": "micoff",
"unicode": "\ue67e"
},
{
"font_class": "micoff-filled",
"unicode": "\ue6b0"
},
{
"font_class": "minus",
"unicode": "\ue66f"
},
{
"font_class": "minus-filled",
"unicode": "\ue67d"
},
{
"font_class": "more",
"unicode": "\ue64d"
},
{
"font_class": "more-filled",
"unicode": "\ue64e"
},
{
"font_class": "navigate",
"unicode": "\ue66e"
},
{
"font_class": "navigate-filled",
"unicode": "\ue67a"
},
{
"font_class": "notification",
"unicode": "\ue6a6"
},
{
"font_class": "notification-filled",
"unicode": "\ue6c1"
},
{
"font_class": "paperclip",
"unicode": "\ue652"
},
{
"font_class": "paperplane",
"unicode": "\ue672"
},
{
"font_class": "paperplane-filled",
"unicode": "\ue675"
},
{
"font_class": "person",
"unicode": "\ue699"
},
{
"font_class": "person-filled",
"unicode": "\ue69d"
},
{
"font_class": "personadd",
"unicode": "\ue69f"
},
{
"font_class": "personadd-filled",
"unicode": "\ue698"
},
{
"font_class": "personadd-filled-copy",
"unicode": "\ue6d1"
},
{
"font_class": "phone",
"unicode": "\ue69c"
},
{
"font_class": "phone-filled",
"unicode": "\ue69b"
},
{
"font_class": "plus",
"unicode": "\ue676"
},
{
"font_class": "plus-filled",
"unicode": "\ue6c7"
},
{
"font_class": "plusempty",
"unicode": "\ue67b"
},
{
"font_class": "pulldown",
"unicode": "\ue632"
},
{
"font_class": "pyq",
"unicode": "\ue682"
},
{
"font_class": "qq",
"unicode": "\ue680"
},
{
"font_class": "redo",
"unicode": "\ue64a"
},
{
"font_class": "redo-filled",
"unicode": "\ue655"
},
{
"font_class": "refresh",
"unicode": "\ue657"
},
{
"font_class": "refresh-filled",
"unicode": "\ue656"
},
{
"font_class": "refreshempty",
"unicode": "\ue6bf"
},
{
"font_class": "reload",
"unicode": "\ue6b2"
},
{
"font_class": "right",
"unicode": "\ue6b5"
},
{
"font_class": "scan",
"unicode": "\ue62a"
},
{
"font_class": "search",
"unicode": "\ue654"
},
{
"font_class": "settings",
"unicode": "\ue653"
},
{
"font_class": "settings-filled",
"unicode": "\ue6ce"
},
{
"font_class": "shop",
"unicode": "\ue62f"
},
{
"font_class": "shop-filled",
"unicode": "\ue6cd"
},
{
"font_class": "smallcircle",
"unicode": "\ue67c"
},
{
"font_class": "smallcircle-filled",
"unicode": "\ue665"
},
{
"font_class": "sound",
"unicode": "\ue684"
},
{
"font_class": "sound-filled",
"unicode": "\ue686"
},
{
"font_class": "spinner-cycle",
"unicode": "\ue68a"
},
{
"font_class": "staff",
"unicode": "\ue6a7"
},
{
"font_class": "staff-filled",
"unicode": "\ue6cb"
},
{
"font_class": "star",
"unicode": "\ue688"
},
{
"font_class": "star-filled",
"unicode": "\ue68f"
},
{
"font_class": "starhalf",
"unicode": "\ue683"
},
{
"font_class": "trash",
"unicode": "\ue687"
},
{
"font_class": "trash-filled",
"unicode": "\ue685"
},
{
"font_class": "tune",
"unicode": "\ue6aa"
},
{
"font_class": "tune-filled",
"unicode": "\ue6ca"
},
{
"font_class": "undo",
"unicode": "\ue64f"
},
{
"font_class": "undo-filled",
"unicode": "\ue64c"
},
{
"font_class": "up",
"unicode": "\ue6b6"
},
{
"font_class": "top",
"unicode": "\ue6b6"
},
{
"font_class": "upload",
"unicode": "\ue690"
},
{
"font_class": "upload-filled",
"unicode": "\ue68e"
},
{
"font_class": "videocam",
"unicode": "\ue68c"
},
{
"font_class": "videocam-filled",
"unicode": "\ue689"
},
{
"font_class": "vip",
"unicode": "\ue6a8"
},
{
"font_class": "vip-filled",
"unicode": "\ue6c6"
},
{
"font_class": "wallet",
"unicode": "\ue6b1"
},
{
"font_class": "wallet-filled",
"unicode": "\ue6c2"
},
{
"font_class": "weibo",
"unicode": "\ue68b"
},
{
"font_class": "weixin",
"unicode": "\ue691"
}
] as IconsDataItem[]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

@ -0,0 +1,649 @@
export const fontData = [
{
"font_class": "arrow-down",
"unicode": "\ue6be"
},
{
"font_class": "arrow-left",
"unicode": "\ue6bc"
},
{
"font_class": "arrow-right",
"unicode": "\ue6bb"
},
{
"font_class": "arrow-up",
"unicode": "\ue6bd"
},
{
"font_class": "auth",
"unicode": "\ue6ab"
},
{
"font_class": "auth-filled",
"unicode": "\ue6cc"
},
{
"font_class": "back",
"unicode": "\ue6b9"
},
{
"font_class": "bars",
"unicode": "\ue627"
},
{
"font_class": "calendar",
"unicode": "\ue6a0"
},
{
"font_class": "calendar-filled",
"unicode": "\ue6c0"
},
{
"font_class": "camera",
"unicode": "\ue65a"
},
{
"font_class": "camera-filled",
"unicode": "\ue658"
},
{
"font_class": "cart",
"unicode": "\ue631"
},
{
"font_class": "cart-filled",
"unicode": "\ue6d0"
},
{
"font_class": "chat",
"unicode": "\ue65d"
},
{
"font_class": "chat-filled",
"unicode": "\ue659"
},
{
"font_class": "chatboxes",
"unicode": "\ue696"
},
{
"font_class": "chatboxes-filled",
"unicode": "\ue692"
},
{
"font_class": "chatbubble",
"unicode": "\ue697"
},
{
"font_class": "chatbubble-filled",
"unicode": "\ue694"
},
{
"font_class": "checkbox",
"unicode": "\ue62b"
},
{
"font_class": "checkbox-filled",
"unicode": "\ue62c"
},
{
"font_class": "checkmarkempty",
"unicode": "\ue65c"
},
{
"font_class": "circle",
"unicode": "\ue65b"
},
{
"font_class": "circle-filled",
"unicode": "\ue65e"
},
{
"font_class": "clear",
"unicode": "\ue66d"
},
{
"font_class": "close",
"unicode": "\ue673"
},
{
"font_class": "closeempty",
"unicode": "\ue66c"
},
{
"font_class": "cloud-download",
"unicode": "\ue647"
},
{
"font_class": "cloud-download-filled",
"unicode": "\ue646"
},
{
"font_class": "cloud-upload",
"unicode": "\ue645"
},
{
"font_class": "cloud-upload-filled",
"unicode": "\ue648"
},
{
"font_class": "color",
"unicode": "\ue6cf"
},
{
"font_class": "color-filled",
"unicode": "\ue6c9"
},
{
"font_class": "compose",
"unicode": "\ue67f"
},
{
"font_class": "contact",
"unicode": "\ue693"
},
{
"font_class": "contact-filled",
"unicode": "\ue695"
},
{
"font_class": "down",
"unicode": "\ue6b8"
},
{
"font_class": "bottom",
"unicode": "\ue6b8"
},
{
"font_class": "download",
"unicode": "\ue68d"
},
{
"font_class": "download-filled",
"unicode": "\ue681"
},
{
"font_class": "email",
"unicode": "\ue69e"
},
{
"font_class": "email-filled",
"unicode": "\ue69a"
},
{
"font_class": "eye",
"unicode": "\ue651"
},
{
"font_class": "eye-filled",
"unicode": "\ue66a"
},
{
"font_class": "eye-slash",
"unicode": "\ue6b3"
},
{
"font_class": "eye-slash-filled",
"unicode": "\ue6b4"
},
{
"font_class": "fire",
"unicode": "\ue6a1"
},
{
"font_class": "fire-filled",
"unicode": "\ue6c5"
},
{
"font_class": "flag",
"unicode": "\ue65f"
},
{
"font_class": "flag-filled",
"unicode": "\ue660"
},
{
"font_class": "folder-add",
"unicode": "\ue6a9"
},
{
"font_class": "folder-add-filled",
"unicode": "\ue6c8"
},
{
"font_class": "font",
"unicode": "\ue6a3"
},
{
"font_class": "forward",
"unicode": "\ue6ba"
},
{
"font_class": "gear",
"unicode": "\ue664"
},
{
"font_class": "gear-filled",
"unicode": "\ue661"
},
{
"font_class": "gift",
"unicode": "\ue6a4"
},
{
"font_class": "gift-filled",
"unicode": "\ue6c4"
},
{
"font_class": "hand-down",
"unicode": "\ue63d"
},
{
"font_class": "hand-down-filled",
"unicode": "\ue63c"
},
{
"font_class": "hand-up",
"unicode": "\ue63f"
},
{
"font_class": "hand-up-filled",
"unicode": "\ue63e"
},
{
"font_class": "headphones",
"unicode": "\ue630"
},
{
"font_class": "heart",
"unicode": "\ue639"
},
{
"font_class": "heart-filled",
"unicode": "\ue641"
},
{
"font_class": "help",
"unicode": "\ue679"
},
{
"font_class": "help-filled",
"unicode": "\ue674"
},
{
"font_class": "home",
"unicode": "\ue662"
},
{
"font_class": "home-filled",
"unicode": "\ue663"
},
{
"font_class": "image",
"unicode": "\ue670"
},
{
"font_class": "image-filled",
"unicode": "\ue678"
},
{
"font_class": "images",
"unicode": "\ue650"
},
{
"font_class": "images-filled",
"unicode": "\ue64b"
},
{
"font_class": "info",
"unicode": "\ue669"
},
{
"font_class": "info-filled",
"unicode": "\ue649"
},
{
"font_class": "left",
"unicode": "\ue6b7"
},
{
"font_class": "link",
"unicode": "\ue6a5"
},
{
"font_class": "list",
"unicode": "\ue644"
},
{
"font_class": "location",
"unicode": "\ue6ae"
},
{
"font_class": "location-filled",
"unicode": "\ue6af"
},
{
"font_class": "locked",
"unicode": "\ue66b"
},
{
"font_class": "locked-filled",
"unicode": "\ue668"
},
{
"font_class": "loop",
"unicode": "\ue633"
},
{
"font_class": "mail-open",
"unicode": "\ue643"
},
{
"font_class": "mail-open-filled",
"unicode": "\ue63a"
},
{
"font_class": "map",
"unicode": "\ue667"
},
{
"font_class": "map-filled",
"unicode": "\ue666"
},
{
"font_class": "map-pin",
"unicode": "\ue6ad"
},
{
"font_class": "map-pin-ellipse",
"unicode": "\ue6ac"
},
{
"font_class": "medal",
"unicode": "\ue6a2"
},
{
"font_class": "medal-filled",
"unicode": "\ue6c3"
},
{
"font_class": "mic",
"unicode": "\ue671"
},
{
"font_class": "mic-filled",
"unicode": "\ue677"
},
{
"font_class": "micoff",
"unicode": "\ue67e"
},
{
"font_class": "micoff-filled",
"unicode": "\ue6b0"
},
{
"font_class": "minus",
"unicode": "\ue66f"
},
{
"font_class": "minus-filled",
"unicode": "\ue67d"
},
{
"font_class": "more",
"unicode": "\ue64d"
},
{
"font_class": "more-filled",
"unicode": "\ue64e"
},
{
"font_class": "navigate",
"unicode": "\ue66e"
},
{
"font_class": "navigate-filled",
"unicode": "\ue67a"
},
{
"font_class": "notification",
"unicode": "\ue6a6"
},
{
"font_class": "notification-filled",
"unicode": "\ue6c1"
},
{
"font_class": "paperclip",
"unicode": "\ue652"
},
{
"font_class": "paperplane",
"unicode": "\ue672"
},
{
"font_class": "paperplane-filled",
"unicode": "\ue675"
},
{
"font_class": "person",
"unicode": "\ue699"
},
{
"font_class": "person-filled",
"unicode": "\ue69d"
},
{
"font_class": "personadd",
"unicode": "\ue69f"
},
{
"font_class": "personadd-filled",
"unicode": "\ue698"
},
{
"font_class": "personadd-filled-copy",
"unicode": "\ue6d1"
},
{
"font_class": "phone",
"unicode": "\ue69c"
},
{
"font_class": "phone-filled",
"unicode": "\ue69b"
},
{
"font_class": "plus",
"unicode": "\ue676"
},
{
"font_class": "plus-filled",
"unicode": "\ue6c7"
},
{
"font_class": "plusempty",
"unicode": "\ue67b"
},
{
"font_class": "pulldown",
"unicode": "\ue632"
},
{
"font_class": "pyq",
"unicode": "\ue682"
},
{
"font_class": "qq",
"unicode": "\ue680"
},
{
"font_class": "redo",
"unicode": "\ue64a"
},
{
"font_class": "redo-filled",
"unicode": "\ue655"
},
{
"font_class": "refresh",
"unicode": "\ue657"
},
{
"font_class": "refresh-filled",
"unicode": "\ue656"
},
{
"font_class": "refreshempty",
"unicode": "\ue6bf"
},
{
"font_class": "reload",
"unicode": "\ue6b2"
},
{
"font_class": "right",
"unicode": "\ue6b5"
},
{
"font_class": "scan",
"unicode": "\ue62a"
},
{
"font_class": "search",
"unicode": "\ue654"
},
{
"font_class": "settings",
"unicode": "\ue653"
},
{
"font_class": "settings-filled",
"unicode": "\ue6ce"
},
{
"font_class": "shop",
"unicode": "\ue62f"
},
{
"font_class": "shop-filled",
"unicode": "\ue6cd"
},
{
"font_class": "smallcircle",
"unicode": "\ue67c"
},
{
"font_class": "smallcircle-filled",
"unicode": "\ue665"
},
{
"font_class": "sound",
"unicode": "\ue684"
},
{
"font_class": "sound-filled",
"unicode": "\ue686"
},
{
"font_class": "spinner-cycle",
"unicode": "\ue68a"
},
{
"font_class": "staff",
"unicode": "\ue6a7"
},
{
"font_class": "staff-filled",
"unicode": "\ue6cb"
},
{
"font_class": "star",
"unicode": "\ue688"
},
{
"font_class": "star-filled",
"unicode": "\ue68f"
},
{
"font_class": "starhalf",
"unicode": "\ue683"
},
{
"font_class": "trash",
"unicode": "\ue687"
},
{
"font_class": "trash-filled",
"unicode": "\ue685"
},
{
"font_class": "tune",
"unicode": "\ue6aa"
},
{
"font_class": "tune-filled",
"unicode": "\ue6ca"
},
{
"font_class": "undo",
"unicode": "\ue64f"
},
{
"font_class": "undo-filled",
"unicode": "\ue64c"
},
{
"font_class": "up",
"unicode": "\ue6b6"
},
{
"font_class": "top",
"unicode": "\ue6b6"
},
{
"font_class": "upload",
"unicode": "\ue690"
},
{
"font_class": "upload-filled",
"unicode": "\ue68e"
},
{
"font_class": "videocam",
"unicode": "\ue68c"
},
{
"font_class": "videocam-filled",
"unicode": "\ue689"
},
{
"font_class": "vip",
"unicode": "\ue6a8"
},
{
"font_class": "vip-filled",
"unicode": "\ue6c6"
},
{
"font_class": "wallet",
"unicode": "\ue6b1"
},
{
"font_class": "wallet-filled",
"unicode": "\ue6c2"
},
{
"font_class": "weibo",
"unicode": "\ue68b"
},
{
"font_class": "weixin",
"unicode": "\ue691"
}
]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)

@ -1,7 +1,7 @@
{
"id": "uni-icons",
"displayName": "uni-icons 图标",
"version": "1.3.5",
"version": "2.0.10",
"description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
"keywords": [
"uni-ui",
@ -17,10 +17,6 @@
"example": "../../temps/example_temps"
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
@ -37,7 +33,8 @@
"data": "无",
"permissions": "无"
},
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
"npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
"type": "component-vue"
},
"uni_modules": {
"dependencies": ["uni-scss"],
@ -45,12 +42,14 @@
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
"aliyun": "y",
"alipay": "n"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
"app-nvue": "y",
"app-uvue": "y"
},
"H5-mobile": {
"Safari": "y",
@ -70,11 +69,15 @@
"阿里": "y",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
"QQ": "y",
"钉钉": "y",
"快手": "y",
"飞书": "y",
"京东": "y"
},
"快应用": {
"华为": "u",
"联盟": "u"
"华为": "y",
"联盟": "y"
},
"Vue": {
"vue2": "y",

Loading…
Cancel
Save