first commit

This commit is contained in:
2025-03-17 10:56:09 +08:00
parent b65a5fd005
commit afec54dafe
6918 changed files with 1199199 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
sudo: false
language: php
branches:
only:
- stable
cache:
directories:
- $HOME/.composer/cache
before_install:
- composer self-update
install:
- composer install --no-dev --no-interaction --ignore-platform-reqs
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
script:
- php think unit
deploy:
provider: releases
api_key:
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
file:
- ThinkPHP_Core.zip
- ThinkPHP_Full.zip
skip_cleanup: true
on:
tags: true

946
digital_doctor/CHANGELOG.md Normal file
View File

@@ -0,0 +1,946 @@
## V5.1.41 LTS2021-1-11
本版本为PHP8兼容更新
## V5.1.40 LTS2020-10-09
本版本为常规更新,主要包括:
* 改进redis驱动`has`方法
* 修正XA事务
* 修正`HasManyThrough`关联
* 增加mysql json类型字段->>方式获取支持
* 改进路由加载 避免加载编辑器临时文件影响
* 修复关联模型的属性直接附加到当前模型,当关联模型字段名为name时获取的值为模型的属性name值
* 修复多态关联预加载`field`无效
* 改进Collection类的`column`方法的PHP兼容性问题
* 改进mysql驱动
* 改进`parseclosure`方法
* SoftDelete删除条件做空判断
* 改进验证类`append`方法
## V5.1.39 LTS2019-11-18
本次更新为常规更新,主要包括:
* 修正`memcached`驱动
* 改进`HasManyThrough`关联查询
* 改进`Request``isJson`方法
* 改进关联查询
* 改进`redis`驱动
* 增加 Model类`getWhere`方法对复合主键的支持
* 改进`newQuery`方法
* 改进闭包查询的参数绑定
* 修正`Validate`
* 修复某些情况下URL会多一个冒号
* 调整composer.json
* 修复使用`Cache::clear()`时,报错缓存文件不存在问题
* 使用File类的unlink方法进行文件删除
* 改进`paraseData`方法
* 修正image验证方法
* 改进Url生成
* 改进空操作对数字的支持
* 改进一处PHP7.4兼容性问题
## V5.1.38 LTS2019-8-8
本次更新为常规更新,主要包括:
* `Request`类增加`isJson`方法
* 改进浮点型查询
* 修正关联查询关联外键为空的查询错误
* 远程一对多支持关联统计和预载入查询
* 远程一对多关联支持`has`/`hasWhere`查询
* 优化`parseIn`解析
* 改进`parseLike`查询
* 改进Url生成
* 改进模型的`toArray`方法
* 修正`notIn`查询
* 改进`JSON`字段查询
* 改进Controller类`display`/`fetch`方法返回`ViewResponse`对象
* 改进`param`方法
* 改进`mysql`驱动`getExplain`方法
* 改进时间查询
* 改进模型关联的`has`/`hasWhere`方法对软删除的支持
* 修正社区反馈的BUG
## V5.1.37 LTS2019-5-26
本次更新为常规更新,主要更新如下:
* 改进关联数据更新
* 修正关联动态获取器
* 改进`redis`驱动
* 修复验证规则里面出现二维数组时的错误
* 改进跨域请求支持
* 完善模型`hidden`方法对关联属性的支持
* 改进`where`查询方法传入`Query`对象的支持`bind`数据
* 改进数据集对象的`load`方法
* 修正缓存类`clear`方法对`tag`的支持
## V5.1.36 LTS2019-4-28
本次更新为常规更新,主要更新如下:
* 修正`chunk`方法一处异常抛出的错误
* 修正模型输出的`visible`
* 改进环境变量加载
* 改进命令行日志的`level`配置支持
* 修复设置有缓存前缀时,无法清空缓存标签的问题
* HasMony对象`saveAll`方法兼容`Collection`格式参数格式
* 修正`whereOr`查询使用字符串的问题
* 改进`dateFormat`设置对写入数据的影响
* 修正查询缓存
* 记住指定的跳转地址
* 改进软删除
* 改进聚合查询SQL去除limit 1
* 改进缓存驱动
## V5.1.35 LTS2019-3-2
本次主要为常规更新,修正了一些反馈的问题。
* 修正验证类自定义验证方法执行两次的问题
* 模型增加`isEmpty`方法用于判断是否空模型
* 改进获取器对`append`的支持
* 修正一对多关联的`withCount`自关联问题
* facade类注释调整
* 改进关联属性的`visible``hidden`判断
* 修正路由分组的`MISS`路由
* 改进pgsql.sql
## V5.1.34 LTS2019-1-30
本次更新为常规更新,修正了一些反馈的问题。
* 改进Request类的`has`方法,支持`patch`
* 改进`unique`验证的多条件支持
* 修复自定义上传验证,检测文件大小
* 改进`in`查询支持表达式
* 改进路由的`getBind`方法
* 改进验证类的错误信息获取
* 改进`response`助手函数默认值
* 修正mysql的`regexp`查询
* 改进模型类型强制转换写入对`Expression`对象的支持
## V5.1.33 LTS2019-1-16
* 修复路由中存在多个相同替换的正则BUG
* 修正whereLike查询
* join方法支持参数绑定
* 改进union方法
* 修正多对多关联的attach方法
* 改进验证类的正则规则自定义
* 改进Request类method方法
* 改进File日志类型的CLI日志写入
* 改进文件日志time_format配置对JSON格式的支持
## V5.1.32 LTS2018-12-24
本次主要为常规更新,修正了一些反馈的问题。
* 改进多对多关联的`attach`方法
* 改进聚合查询的`field`处理
* 改进关联的`save`方法
* 修正模型`exists`方法返回值
* 改进时间字段写入和输出
* 改进控制器中间件的调用
* 改进路由变量替换的性能
* 改进缓存标签的处理机制
## V5.1.31 LTS (2018-12-9)
本次版本包含一个安全更新,建议升级。
* 改进`field`方法
* 改进`count`方法返回类型
* `download`函数增加在浏览器中显示文件功能
* 修正多对多模型的中间表数据写入
* 改进`sqlsrv`驱动支持多个Schemas模式查询
* 统一助手函数与\think\response\Download函数文件过期时间
* 完善关联模型的`save`方法 增加`make`方法仅创建对象不保存
* 修改条件表达式对静态变量的支持
* 修正控制器名获取
* 改进view方法的`field`解析
## V5.1.30 LTS2018-11-30
该版本为常规更新,修正了一些社区反馈的问题。
主要更新如下:
* 改进查询类的`execute`方法
* 判断路由规则定义添加对请求类型的判断
* 修复`orderRaw`异常
* 修正 `optimize:autoload`指令
* 改进软删除的`destroy`方法造成重复执行事件的问题
* 改进验证类对扩展验证规则 始终验证 不管是否`require`
* 修复自定义验证`remove`所有规则的异常
* 改进时间字段的自动写入支持微秒数据
* 改进`Connection`类的`getrealsql`方法
* 修正`https`地址的URL生成
* 修复 `array_walk_recursive` 在低于PHP7.1消耗内部指针问题
* 改进手动参数绑定使用
* 改进聚合查询方法的`field`参数支持`Expression`
## V5.1.29 LTS2018-11-11
该版本主要改进了参数绑定的解析问题和提升性能,并修正了一些反馈的问题。
* 改进手动参数绑定
* 修正MISS路由的分组参数无效问题
* 行为支持对象的方法
* 修正全局查询范围
* 改进`belongsto`关联的`has`方法
* 改进`hasMany`关联
* 改进模型观察者多次注册的问题
* 改进`query`类的默认查询参数处理
* 修正`parseBetween`解析方法
* 改进路由地址生成的本地域名支持
* 改进参数绑定的实际URL解析性能
* 改进`Env`类的`getEnv``get`方法
* 改进模板缓存的生成优化
* 修复验证类的多语言支持
* 修复自定义场景验证`remove`规则异常
* File类添加是否自动补全扩展名的选项
* 改进`strpos`对子串是否存在的判断
* 修复`choice`无法用值选择第一个选项问题
* 验证器支持多维数组取值验证
* 改进解析`extend``block`标签的正则
## V5.1.28 LTS2018-10-29
该版本主要修正了上一个版本存在的一些问题,并改进了关联查询
* 改进聚合查询方法的字段支持DISTINCT
* 改进定义路由后url函数的端口生成
* 改进控制器中间件对`swoole`等的支持
* 改进Log类`save`方法
* 改进验证类的闭包验证参数
* 多对多关联支持指定中间表数据的名称
* 关联聚合查询支持闭包方式指定聚合字段
* 改进Lang类`get`方法
* 多对多关联增加判断关联数据是否存在的方法
* 改进关联查询使用`fetchsql`的情况
* 改进修改器的是否已经执行判断
* 增加`afterWith``beforeWith`验证规则 用于比较日期字段
## V5.1.27 LTS2018-10-22
该版本主要修正了路由绑定的参数改进了修改器的执行多次问题并正式宣布为LTS版本
* 修正路由绑定的参数丢失问题
* 修正路由别名的参数获取
* 改进修改器会执行多次的问题
## V5.1.262018-10-12
该版本主要修正了上一个版本的一些问题,并改进了全局查询范围的支持,同时包含了一个安全更新。
* 修正单一模块下注解路由无效的问题
* 改进数据库的聚合查询的字段处理
* 模型类增加`globalScope`属性定义 用于指定全局的查询范围
* 模型的`useGlobalScope`方法支持传入数组 用于指定当前查询需要使用的全局查询范围
* 改进数据集的`order`方法对数字类型的支持
* 修正上一个版本`order`方法解析的一处BUG
* 排序字段不合法或者错误的时候抛出异常
* 改进`Request`类的`file`方法对上传文件的错误判断
## V5.1.252018-9-21
该版本主要改进了查询参数绑定的性能和对浮点型的支持,以及一些细节的完善。
* 修正一处命令行问题
* 改进`Socketlog`日志驱动,支持自定义默认展开日志类别
* 修正`MorphMany`一处bug
* 跳转到上次记住的url并支持默认值
* 改进模型的异常提示
* 改进参数绑定对浮点型的支持
* 改进`order`方法解析
* 改进`json`字段数据的自动编码
* 改进日志`log_write`可能造成的日志写入死循环
* Log类增加`log_level`行为标签位置,用于对某个类型的日志进行处理
* Route类增加`clear`方法清空路由规则
* 分布式数据库配置支持使用数组
* 单日志文件也支持`max_files`参数
* 改进查询参数绑定的性能
* 改进别名路由的URL后缀参数检测
* 控制器前置方法和控制器中间件的`only``except`定义不区分大小写
## V5.1.242018-9-5
该版本主要增加了命令行的表格输出功能,并增加了查看路由定义的指令,以及修正了社区的一些反馈问题。
* 修正`Request`类的`file`方法
* 修正路由的`cache`方法
* 修正路由缓存的一处问题
* 改进上传文件获取的异常处理
* 改进`fetchCollection`方法支持传入数据集类名
* 修正多级控制器的注解路由生成
* 改进`Middleware``clear`方法
* 增加`route:list`指令用于[查看定义的路由](752690) 并支持排序
* 命令行增加`Table`输出类
* `Command`类增加`table`方法用于输出表格
* 改进搜索器查询方法支持别名定义
* 命令行配置增加`auto_path`参数用于定义自动载入的命令类路径
* 增加`make:command`指令用于[快速生成指令](354146)
* 改进`make:controller`指令对操作方法后缀的支持
* 改进命令行的定义文件支持索引数组 用于指令对象的惰性加载
* 改进`value``column`方法对后续查询结果的影响
* 改进`RuleName`类的`setRule`方法
## V5.1.232018-8-23
该版本主要改进了数据集对象的处理,增加了`findOrEmpty`方法并且修正了一些社区反馈的BUG。
* 数据集类增加`diff`/`intersect`方法用于获取差集和交集(默认根据主键值比较)
* 数据集类增加`order`方法支持指定字段排序
* 数据集类增加`map`方法使用回调函数处理数据并返回新的数据集对象
* Db增加`allowEmpty`方法允许`find`方法在没有数据的时候返回空数组或者空模型对象而不是null
* Db增加`findOrEmpty`方法
* Db增加`fetchCollection`方法用于指定查询返回数据集对象
* 改进`order`方法的数组方式解析,增强安全性
* 改进`withSearch`方法,支持第三个参数传入字段前缀标识,用于多表查询字段搜索
* 修正`optimize:route`指令开启类库后缀后的注解路由生成
* 修正redis缓存及session驱动
* 支持指定`Yaconf`的独立配置文件
* 增加`yaconf`助手函数用于配置文件
## V5.1.222018-8-9
该版本主要增加了模型搜索器和`withJoin`方法,完善了模型输出和对`Yaconf`的支持修正了一些社区反馈的BUG。
* 改进一对一关联的`table`识别问题
* 改进内置`Facade`
* 增加`withJoin`方法支持`join`方式的[一对一关联](一对一关联.md)查询
* 改进`join`预载入查询的空数据问题
* 改进`Config`类的`load`方法支持快速加载配置文件
* 改进`execute`方法和事务的断线重连
* 改进`memcache`驱动的`has`方法
* 模型类支持定义[搜索器](搜索器.md)方法
* 完善`Config`类对`Yaconf`的支持
* 改进模型的`hidden/visible/append/withAttr`方法,支持在[查询前后调用](数组访问.md),以及支持数据集对象
* 数据集对象增加`where`方法根据字段或者关联数据[过滤数据](模型数据集.md)
* 改进AJAX请求的`204`判断
## V5.1.212018-8-2
该版本主要增加了下载响应对象和数组查询对象的支持,并修正了一些社区反馈的问题。
* 改进核心对象的无用信息调试输出
* 改进模型的`isRelationAttr`方法判断
* 模型类的`get``all`方法并入Db类
* 增加[下载响应对象](文件下载.md)和`download`助手函数
* 修正别名路由配置定义读取
* 改进`resultToModel`方法
* 修正开启类库后缀后的注解路由生成
* `Response`类增加`noCache`快捷方法
* 改进路由对象在`Swoole`/`Workerman`下面参数多次合并问题
* 修正路由`ajax`/`pjax`参数后路由变量无法正确获取的问题
* 增加清除中间件的方法
* 改进依赖注入的参数规范自动识别(便于对接前端小写+下划线规范)
* 改进`hasWhere`的数组条件的字段判断
* 增加[数组查询对象](高级查询.md)`Where`支持(喜欢数组查询的福音)
* 改进多对多关联的闭包支持
## V5.1.202018-7-25
该版本主要增加了Db和模型的动态获取器的支持并修正了一些已知问题。
* Db类添加[获取器支持](703981)
* 支持模型及关联模型字段[动态定义获取器](354046)
* 动态获取器支持`JSON`字段
* 改进路由的`before`行为执行(匹配后执行)
* `Config`类支持`Yaconf`
* 改进Url生成的端口问题
* Request类增加`setUrl``setBaseUrl`方法
* 改进页面trace的信息显示
* 修正`MorphOne`关联
* 命令行添加[查看版本指令](703994)
## V5.1.19 2018-7-13
该版本是一个小幅改进版本,针对`Swoole``Workerman``Cookie`支持做了一些改进,并修正了一些已知的问题。
* 改进query类`delete`方法对软删除条件判断
* 修正分表查询的软删除问题
* 模型查询的时候同时传入`table``name`属性
* 容器类增加`IteratorAggregate``Countable`接口支持
* 路由分组支持对下面的资源路由统一设置`only/except/vars`参数
* 改进Cookie类更好支持扩展
* 改进Request类`post`方法
* 改进模型自关联的自动识别
* 改进Request类对`php://input`数据的处理
## V5.1.18 2018-6-30
该版本主要完善了对`Swoole``Workerman``HttpServer`运行支持,改进`Request`类,并修正了一些已知的问题。
* 改进关联`append`方法的处理
* 路由初始化和检测方法分离
* 修正`destroy`方法强制删除
* `app_init`钩子位置移入`run`方法
* `think-swoole`扩展更新到2.0版本
* `think-worker`扩展更新到2.0版本
* 改进Url生成的域名自动识别
* `Request`类增加`setPathinfo`方法和`setHost`方法
* `Request`类增加`withGet`/`withPost`/`withHeader`/`withServer`/`withCookie`/`withEnv`方法进行赋值操作
* Route类改进`host`属性的获取
* 解决注解路由配置不生效的问题
* 取消Test日志驱动改为使用`close`设置关闭全局日志写入
* 修正路由的`response`参数
* 修正204响应输出的判断
## V5.1.17 2018-6-18
该版本主要增加了控制器中间件的支持,改进了路由功能,并且修正了社区反馈的一些问题。
* 修正软删除的`delete`方法
* 修正Query类`Count`方法
* 改进多对多`detach`方法
* 改进Request类`Session`方法
* 增加控制器中间件支持
* 模型类增加`jsonAssoc`属性用于定义json数据是否返回数组
* 修正Request类`method`方法的请求伪装
* 改进静态路由的匹配
* 分组首页路由自动完整匹配
* 改进sqlsrv的`column`方法
* 日志类的`apart_level`配置支持true自动生成对应类型的日志文件
* 改进`204`输出判断
* 修正cli下页面输出的BUG
* 验证类使用更高效的`ctype`验证机制
* 改进Request类`cookie`方法
* 修正软删除的`withTrashed`方法
* 改进多态一对多的预载入查询
* 改进Query类`column`方法的缓存读取
* Query类增加`whereBetweenTimeField`方法
* 改进分组下多个相同路由规则的合并匹配问题
* 路由类增加`getRule`/`getRuleList`方法获取定义的路由
## V5.1.16 2018-6-7
该版本主要修正了社区反馈的一些问题并对Request类做了进一步规范和优化。
* 改进Session类的`boot`方法
* App类的初始化方法可以单独执行
* 改进Request类的`param`方法
* 改进资源路由的变量替换
* Request类增加`__isset`方法
* 改进`useGlobalScope`方法对软删除的影响
* 修正命令行调用
* 改进Cookie类`init`方法
* 改进多对多关联删除的返回值
* 一对多关联写入支持`replace`
* 路由增加`filter`检测方法,用于通过请求参数检测路由是否匹配
* 取消Request类`session/env/server`方法的`filter`参数
* 改进关联的指定属性输出
* 模型删除操作删除后不清空对象数据仅作标记
* 调整模型的`save`方法返回值为布尔值
* 修正Request类`isAjax`方法
* 修正中间件的模块配置读取
* 取消Request类的请求变量的设置功能
* 取消请求变量获取的默认修饰符
* Request类增加`setAction/setModule/setController`方法
* 关联模型的`delete`方法调用Query类
* 改进URL生成的域名识别
* 改进URL检测对已定义路由的域名判断
* 模型类增加`isExists``isForce`方法
* 软删除的`destroy``restore`方法返回值调整为布尔值
## V5.1.15 2018-6-1
该版本主要改进了路由缓存的性能和缓存方式设置增加了JSON格式文件日志的支持并修正了社区反馈的一些问题。
* 容器类增加`exists`方法 仅判断是否存在对象实例
* 取消配置类的`autoload`方法
* 改进路由缓存大小提高性能
* 改进Dispatch类`init`方法
* 增加`make:validate`指令生成验证器类
* Config类`get`方法支持默认值参数
* 修正字段缓存指令
* 改进App类对`null`数据的返回
* 改进模型类的`__isset`方法判断
* 修正`Query`类的`withAggregate`方法
* 改进`RuleItem`类的`setRuleName`方法
* 修正依赖注入和参数的冲突问题
* 修正Db类对第三方驱动的支持
* 修正模型类查询对象问题
* 修正File缓存驱动的`has`方法
* 修正资源路由嵌套
* 改进Request类对`$_SERVER`变量的读取
* 改进请求缓存处理
* 路由缓存支持指定单独的缓存方式和参数
* 修正资源路由的中间件多次执行问题
* 修正`optimize:config`指令
* 文件日志支持`JSON`格式日志保存
* 修正Db类`connect`方法
* 改进Log类`write`方法不会自动写入之前日志
* 模型的关联操作默认启用事务
* 改进软删除的事件响应
## V5.1.14 2018-5-18
该版本主要对底层容器进行了一些优化改进,并增加了路由缓存功能,可以进一步提升路由性能。
* 依赖注入的对象参数传入改进
* 改进核心类的容器实例化
* 改进日期字段的读取
* 改进验证类的`getScene`方法
* 模型的`create`方法和`save`方法支持`replace`操作
* 改进`Db`类的调用机制
* App类调整为容器类
* 改进容器默认绑定
* `Loader`类增加工厂类的实例化方法
* 增加路由变量默认规则配置参数
* 增加路由缓存设计
* 错误处理机制改进
* 增加清空路由缓存指令
## V5.1.13 2018-5-11
该版本主要增加了MySQL的XA事务支持模型事件支持观察者以及对Facade类的改进。
* 改进自动缓存
* 改进Url生成
* 修正数据缓存
* 修正`value`方法的缓存
* `join`方法和`view`方法的条件支持使用`Expression`对象
* 改进驱动的`parseKey`方法
* 改进Request类`host`方法和`domain`方法对端口的处理
* 模型增加`withEvent`方法用于控制当前操作是否需要执行模型事件
* 模型`setInc/setDec`方法支持更新事件
* 模型添加`before_restore/after_restore`事件
* 增加模型事件观察者
* 路由增加`mobile`方法设置是否允许手机访问
* 数据库XA事务支持
* 改进索引数组查询对`IN`查询的支持
* 修正`invokeMethod`方法
* 修正空数据写入返回值的BUG
* redis驱动支持`predis`
* 改进`parseData`方法
* 改进模块加载
* App类初始化方法调整
* 改进数组查询对表达式`Expression`对象支持
* 改进闭包的依赖注入调用
* 改进多对多关联的中间表模型更新
* 增加容器中对象的自定义实例化
## V5.1.12 2018-4-25
该版本主要改进了主从查询的及时性,并支持动态设置请求数据。
* 支持动态设置请求数据
* 改进`comment`方法解析
* 修正App类`__unset`方法
* 改进url生成的域名绑定
* 改进主从查询的及时性
* 修正`value`的数据缓存功能
* 改进分页类的集合对象方法调用
* 改进Db类的代码提示
* SQL日志增加主从标记
## V5.1.11 2018-4-19
该版本为安全和修正版本改进了JSON查询的参数绑定问题和容器类对象实例获取并包含一处可能的安全隐患建议更新。
* 支持指定JSON数据查询的字段类型
* 修正`selectInsert`方法
* `whereColumn`方法支持数组方式
* 改进容器类`make`方法
* 容器类`delete`方法支持数组
* 改进`composer`自动加载
* 改进模板引擎
* 修正`like`查询的一处安全隐患
## V5.1.10 2018-4-16
该版本为修正版本修正上一个版本的一些BUG并增强了`think clear`指令。
* 改进`orderField`方法
* 改进`exists`查询
* 修改cli模式入口文件位置计算
* 修正`null`查询
* 改进`parseTime`方法
* 修正关联预载入查询
* 改进`mysql`驱动
* 改进`think clear`指令 支持 `-c -l -r `选项
* 改进路由规则对`/`结尾的支持
## V5.1.9 2018-4-12
该版本主要是一些改进和修正,并包含一个安全更新,是一个推荐更新版本。
* 默认模板渲染规则支持配置保持操作方法名
* 改进`Request`类的`ip`方法
* 支持模型软删除字段的默认值定义
* 改进路由变量规则对中文的支持
* 使用闭包查询的时候使用`cache(true)` 抛出异常提示
* 改进`Loader``loadComposerAutoloadFiles`方法
* 改进查询方法安全性
* 修正路由地址中控制器名驼峰问题
* 调整上一个版本的`module_init``app_begin`的钩子顺序问题
* 改进CLI命令行执行的问题
* 修正社区反馈的其它问题
## V5.1.8 2018-4-5
该版本主要改进了中间件的域名和模块支持,并同时修正了几个已知问题。
* 增加`template.auto_rule` 参数设置默认模板渲染的操作名自动转换规则
* 默认模板渲染规则改由视图驱动实现
* 修正路由标识定义
* 修正控制器路由方法
* 改进Request类`ip`方法支持自定义代理IP参数
* 路由注册中间件支持数组方式别名
* 改进命令行执行下的`composer`自动加载
* 添加域名中间件注册支持
* 全局中间件支持模块定义文件
* Log日志配置支持`close`参数可以全局关闭日志写入
* 中间件方法中捕获`HttpResponseException`异常
* 改进中间件的闭包参数传入
* 改进分组路由的延迟解析
* 改进URL生成对域名绑定的支持
* 改进文件缓存和文件日志驱动的并发支持
## V5.1.7 2018-3-28
该版本主要修正了路由的一些问题,并改进了查询的安全性。
* 支持`middleware`配置文件预先定义中间件别名方便路由调用
* 修正资源路由
* 改进`field`方法 自动识别`fieldRaw`
* 增加`Expression`
* Query类增加`raw`方法
* Query类的`field`/ `order`` where`方法都支持使用`raw`表达式查询
* 改进`inc/dec`查询 支持批量更新
* 改进路由分组
* 改进Response类`create`方法
* 改进composer自动加载
* 修正域名路由的`append`方法
* 修正操作方法的初始化方法获取不到问题
## V5.1.6 2018-3-26
该版本主要改进了路由规则的匹配算法,大幅提升了路由性能。并正式引入了中间件的支持,可以在路由中定义或者全局定义。另外包含了一个安全更新,是一个建议更新版本。
* 改进URL生成对路由`ext`方法的支持
* 改进查询缓存对不同数据库相同表名的支持
* 改进composer自动加载的性能
* 改进空路由变量对默认参数的影响
* mysql的`json`字段查询支持多级
* Query类增加`option`方法
* 优化路由匹配
* 修复验证规则数字键名丢失问题
* 改进路由Url生成
* 改进一对一关联预载入查询
* Request类增加`rootDomain`方法
* 支持API资源控制器生成 `make:controller --api`
* 优化Template类的标签解析
* 容器类增加删除和清除对象实例的方法
* 修正MorphMany关联的`eagerlyMorphToMany`方法一处错误
* Container类的异常捕获改进
* Domain对象支持`bind`方法
* 修正分页参数
* 默认模板的输出规则不受URL影响
* 注解路由支持多级控制器
* Query类增加`getNumRows`方法获取前次操作影响的记录数
* 改进查询条件的性能
* 改进模型类`readTransform`方法对序列化类型的处理
* Log类增加`close`方法可以临时关闭当前请求的日志写入
* 文件日志方式增加自动清理功能(设置`max_files`参数)
* 修正Query类的`getPk`方法
* 修正模板缓存的布局开关问题
* 修正Query类`select`方法的缓存
* 改进input助手函数
* 改进断线重连的信息判断
* 改进正则验证方法
* 调整语言包的加载顺序 放到`app_init`之前
* controller类`fetch`方法改为`final`
* 路由地址中的变量支持使用`<var>`方式
* 改进XMLResponse 支持传入编码过的xml内容
* 修正Query类`view`方法的数组表名支持
* 改进路由的模型闭包绑定
* 改进分组变量规则的继承
* 改进`cli-server`模式下的`composer`自动加载
* 路由变量规则异常捕获
* 引入中间件支持
* 路由定义增加`middleware`方法
* 增加生成中间件指令`make:middleware`
* 增加全局中间件定义支持
* 改进`optimize:config`指令对全局中间件的支持
* 改进config类`has`方法
* 改进时间查询的参数绑定
* 改进`inc/dec/exp`查询的安全性
## V5.1.5 2018-1-31
该版本主要增强了数据库的JSON查询并支持JSON字段的聚合查询改进了一些性能问题修正了路由的一些BUG主要更新如下
* 改进数据集查询对`JSON`数据的支持
* 改进聚合查询对`JSON`字段的支持
* 模型类增加`getOrFail`方法
* 改进数据库驱动的`parseKey`方法
* 改进Query类`join`方法的自关联查询
* 改进数据查询不存在不生成查询缓存
* 增加`run`命令行指令启动内置服务器
* `Request``pathinfo`方法改进对`cli-server`支持
* `Session`类增加`use_lock`配置参数设置是否启用锁机制
* 优化`File`缓存自动生成空目录的问题
* 域名及分组路由支持`append`方法传递隐式参数
* 改进日志的并发写入问题
* 改进`Query`类的`where`方法支持传入`Query`对象
* 支持设置单个日志文件的文件名
* 修正路由规则的域名条件约束
* `Request`类增加`subDomain`方法用于获取当前子域名
* `Response`类增加`allowCache`方法控制是否允许请求缓存
* `Request`类增加`sendData`方法便于扩展
* 改进`Env`类不依赖`putenv`方法
* 改进控制台`trace`显示错误
* 改进`MorphTo`关联
* 改进完整路由匹配后带斜线访问出错的情况
* 改进路由的多级分组问题
* 路由url地址生成支持多级分组
* 改进路由Url生成的`url_convert`参数的影响
* 改进`miss``auto`路由内部解析
* 取消预载入关联查询缓存功能
## V5.1.4 2018-1-19
该版本主要增强了数据库和模型操作,主要更新如下:
* 支持设置 `deleteTime`属性为`false` 关闭软删除
* 模型增加`getError`方法
* 改进Query类的`getTableFields`/`getFieldsType`方法 支持表名自动获取
* 模型类`toCollection`方法增加参数指定数据集类
* 改进`union`查询
* 关联预载入`with`方法增加缓存参数
* 改进模型类的`get``all`方法的缓存 支持关联缓存
* 支持`order by field`操作
* 改进`insertAll`分批写入
* 改进`json`字段数据支持
* 增加JSON数据的模型对象化操作
* 改进路由`ext`参数检测
* 修正`rule`方法的`method`参数使用 `get|post` 方式注册路由的问题
## V5.1.3 2018-1-12
该版本主要改进了路由及调整函数加载顺序,主要更新如下:
* 增加`env`助手函数;
* 增加`route`助手函数;
* 增加视图路由方法;
* 增加路由重定向方法;
* 路由默认区分最后的目录斜杆(支持设置不区分);
* 调整公共文件和配置文件的加载顺序(可以在配置文件中直接使用助手函数);
* 视图类增加`filter`方法设置输出过滤;
* `view`助手函数增加`filter`参数;
* 改进缓存生成指令;
* Session类的`get`方法支持获取多级;
* Request类`only`方法支持指定默认值;
* 改进路由分组;
* 修正使用闭包查询的时候自动数据缓存出错的情况;
* 废除`view_filter`钩子位置;
* 修正分组下面的资源路由;
* 改进session驱动;
## V5.1.2 2018-1-8
该版本改进了配置类及数据库类,主要更新如下:
* 修正嵌套路由分组;
* 修正自定义模板标签界定符后表达式语法出错的情况;
* 修正自关联的多次调用问题;
* 修正数组查询的`null`条件查询;
* 修正Query类的`order``field`的一处可能的BUG
* 配置参数设置支持三级;
* 配置对象支持`ArrayAccess`
* App类增加`path`方法用于设置应用目录;
* 关联定义增加`selfRelation`方法用于设置是否为自关联;
## V5.1.1 2018-1-3
修正一些反馈的BUG包括
* 修正Cookie类存取数组的问题
* 修正Controller的`fetch`方法
* 改进跨域请求
* 修正`insertAll`方法
* 修正`chunk`方法
## V5.1.0 2018-1-1
主要更新如下:
* 增加注解路由支持
* 路由支持跨域请求设置
* 增加`app_dispatch`钩子位置
* 修正多对多关联的`detach`方法
* 修正软删除的`destroy`方法
* Cookie类`httponly`参数默认为false
* 日志File驱动增加`single`参数配置记录同一个文件(不按日期生成)
* 路由的`ext``denyExt`方法支持不传任何参数
* 改进模型的`save`方法对`oracle`的支持
* Query类的`insertall`方法支持配合`data``limit`方法
* 增加`whereOr`动态查询支持
* 日志的ip地址记录改进
* 模型`saveAll`方法支持`isUpdate`方法
* 改进`Pivot`模型的实例化操作
* 改进Model类的`data`方法
* 改进多对多中间表模型类
* 模型增加`force`方法强制更新所有数据
* Hook类支持设置入口方法名称
* 改进验证类
* 改进`hasWhere`查询的数据重复问题
* 模型的`saveall`方法返回数据集对象
* 改进File缓存的`clear`方法
* 缓存添加统一的序列化机制
* 改进泛三级域名的绑定
* 改进泛域名的传值和取值
* Request类增加`panDomain`方法
* 改进废弃字段判断
* App类增加`create`方法用于实例化应用类库
* 容器类增加`has`方法
* 改进多数据库切换连接
* 改进断线重连的异常捕获
* 改进模型类`buildQuery`方法
* Query类增加`unionAll`方法
* 关联统计功能增强支持Sum/Max/Min/Avg
* 修正延迟写入
* chunk方法支持复合主键
* 改进JSON类型的写入
* 改进Mysql的insertAll方法
* Model类`save`方法改进复合主键包含自增的情况
* 改进Query类`inc``dec`方法的关键字处理
* File缓存inc和dec方法保持原来的有效期
* 改进redis缓存的有效期判断
* 增加checkRule方法用于单独数据的多个验证规则
* 修正setDec方法的延迟写入
* max和min方法增加force参数
* 二级配置参数区分大小写
* 改进join方法自关联的问题
* 修正关联模型自定义表名的情况
* Query类增加getFieldsType和getTableFields方法
* 取消视图替换功能及view_replace_str配置参数
* 改进域名绑定模块后的额外路由规则问题
* 改进mysql的insertAll方法
* 改进insertAll方法写入json字段数据的支持
* 改进redis长连接多编号库的情况
## RC3版本2017-11-6
主要更新如下:
* 改进redis驱动的`get`方法
* 修正Query类的`alias`方法
* `File`类错误信息支持多语言
* 修正路由的额外参数解析
* 改进`whereTime`方法
* 改进Model类`getAttr`方法
* 改进App类的`controller``validate`方法支持多层
* 改进`HasManyThrough`
* 修正软删除的`restore`方法
* 改进`MorpthTo`关联
* 改进数据库驱动类的`parseKey`方法
* 增加`whereField`动态查询方法
* 模型增加废弃字段功能
* 改进路由的`after`行为检查和`before`行为机制
* 改进路由分组的检查
* 修正mysql的`json`字段查询
* 取消Connection类的`quote`方法
* 改进命令行的支持
* 验证信息支持多语言
* 修正路由模型绑定
* 改进参数绑定类型对枚举类型的支持
* 修正模板的`{$Think.version} `输出
* 改进模板`date`函数解析
* 改进`insertAll`方法支持分批执行
* Request类`host`方法支持反向代理
* 改进`JumpResponse`支持区分成功和错误模板
* 改进开启类库后缀后的关联外键自动识别问题
* 修正一对一关联的JOIN方式预载入查询问题
* Query类增加`hidden`方法
## RC2版本2017-10-17
主要更新如下:
* 修正视图查询
* 修正资源路由
* 修正`HasMany`关联 修正`where`方法的闭包查询
* 一对一关联绑定属性到父模型后 关联属性不再保留
* 修正应用的命令行配置文件读取
* 改进`Connection`类的`getCacheKey`方法
* 改进文件上传的非法图像异常
* 改进验证类的`unique`规则
* Config类`get`方法支持获取一级配置
* 修正count方法对`fetchSql`的支持
* 修正mysql驱动对`socket`支持
* 改进Connection类的`getRealSql`方法
* 修正`view`助手函数
* Query类增加`leftJoin` `rightJoin``fullJoin`方法
* 改进app_namespace的获取
* 改进`append`方法对一对一`bind`属性的支持
* 改进关联的`saveall`方法的返回值
* 路由标识设置异常修复
* 改进Route类`rule`方法
* 改进模型的`table`属性设置
* 改进composer autofile的加载顺序
* 改进`exception_handle`配置对闭包的支持
* 改进app助手函数增加参数
* 改进composer的加载路径判断
* 修正路由组合变量的URL生成
* 修正路由URL生成
* 改进`whereTime`查询并支持扩展规则
* File类的`move`方法第二个参数支持`false`
* 改进Config类
* 改进缓存类`remember`方法
* 惯例配置文件调整 Url类当普通模式参数的时候不做`urlencode`处理
* 取消`ROOT_PATH``APP_PATH`常量定义 如需更改应用目录 自己重新定义入口文件
* 增加`app_debug``Env`获取
* 修正泛域名绑定
* 改进查询表达式的解析机制
* mysql增加`regexp`查询表达式 支持正则查询
* 改进查询表达式的异常判断
* 改进model类的`destroy`方法
* 改进Builder类 取消`parseValue`方法
* 修正like查询的参数绑定问题
* console和start文件移出核心纳入应用库
* 改进Db类主键删除方法
* 改进泛域名绑定模块
* 取消`BIND_MODULE`常量 改为在入口文件使用`bind`方法设置
* 改进数组查询
* 改进模板渲染的异常处理
* 改进控制器基类的架构方法参数
* 改进Controller类的`success``error`方法
* 改进对浏览器`JSON-Handle`插件的支持
* 优化跳转模板的移动端显示
* 修正模型查询的`chunk`方法对时间字段的支持
* 改进trace驱动
* Collection类增加`push`方法
* 改进Redis Session驱动
* 增加JumpResponse驱动
## RC12017-9-8
主要新特性为:
* 引入容器和Facade支持
* 依赖注入完善和支持更多场景
* 重构的(对象化)路由
* 配置和路由目录独立
* 取消系统常量
* 助手函数增强
* 类库别名机制
* 模型和数据库增强
* 验证类增强
* 模板引擎改进
* 支持PSR-3日志规范
* RC1版本取消了5.0多个字段批量数组查询的方式

View File

@@ -0,0 +1,32 @@
ThinkPHP遵循Apache2开源协议发布并提供免费使用。
版权所有Copyright © 2006-2018 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
Apache Licence是著名的非盈利开源组织Apache采用的协议。
该协议和BSD类似鼓励代码共享和尊重原作者的著作权
允许代码修改,再作为开源或商业软件发布。需要满足
的条件:
1 需要给代码的用户一份Apache Licence
2 如果你修改了代码,需要在被修改的文件中说明;
3 在延伸的代码中(修改和有源代码衍生的代码中)需要
带有原来代码中的协议,商标,专利声明和其他原来作者规
定需要包含的说明;
4 如果再发布的产品中包含一个Notice文件则在Notice文
件中需要带有本协议内容。你可以在Notice中增加自己的
许可但不可以表现为对Apache Licence构成更改。
具体的协议参考http://www.apache.org/licenses/LICENSE-2.0
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,36 @@
# digital_doctor
#### Description
数智人医生,疼痛科数智人医生
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

37
digital_doctor/README.md Normal file
View File

@@ -0,0 +1,37 @@
# digital_doctor
#### 介绍
数智人医生,疼痛科数智人医生
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

View File

@@ -0,0 +1 @@
deny from all

View File

@@ -0,0 +1,72 @@
<?php
/*
* description
* authorwh
* email
* createTime{2023/1/21} {16:22}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Controller;
use think\Db;
use think\Request;
use wanghua\general_utility_tools_php\framework\BaseController;
use wanghua\general_utility_tools_php\tool\Tools;
class BaseCommonController extends BaseController
{
function __construct()
{
parent::__construct();
}
/**
* desc检查路径维护状态
*
* “===”完全匹配不能使用like
*
* authorwh
*/
protected function checkMaintain(){
$configs = Db::table(TabConf::$fa_sys_maintain_config)
->where('status','1')
->cache()
->select();
//模块
$strmodule = request()->module();
foreach ($configs as $config){
if($strmodule == $config['url']){
//模块维护中
return ['is_maintain'=>true,'msg'=>$config['msg'],'openid'=>$config['openid']];
}
}
//模块/控制器
$strcontroller = strtolower(request()->module().'/'.request()->controller());
foreach ($configs as $config){
if($strcontroller == $config['url']){
//模块维护中
return ['is_maintain'=>true,'msg'=>$config['msg'],'openid'=>$config['openid']];
}
}
//模块/控制器/方法
$straction = strtolower(request()->module().'/'.request()->controller().'/'.request()->action());
foreach ($configs as $config){
if($straction == $config['url']){
//模块维护中
return ['is_maintain'=>true,'msg'=>$config['msg'],'openid'=>$config['openid']];
}
}
//未维护
return ['is_maintain'=>false,'msg'=>'服务运行中'];
}
}

View File

@@ -0,0 +1,34 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/4/22} {11:52}
*/
namespace app\api\controller;
use app\index\controller\BaseCommonController;
use think\App;
use think\Controller;
use think\Exception;
use wanghua\general_utility_tools_php\tool\Ip;
class BaseHttpApi extends BaseCommonController
{
/**
http请求专用
*/
public function __construct()
{
parent::__construct();
//ip校验
//$ip = request()->ip();
//$res = Ip::ip_is_china($ip,false);
//if(!$res){
// throw new Exception('ip不合法');
//}
}
}

View File

@@ -0,0 +1,34 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/4/5} {19:55}
*/
namespace app\api\controller;
class BaseWssApi extends BaseCommonController
{
/**
* descsocket专用json格式
*
* authorwh
* @param $action
* @param string $msg
* @param array $items
* @param string $method
* @return false|string
*/
static function json_wss($action,$msg='', $items=[], $method='response'){
$json = [
'action'=>$action,
'method'=>$method,
'msg'=>$msg,
'items'=>$items
];
return json_encode($json, JSON_UNESCAPED_UNICODE);
}
}

View File

@@ -0,0 +1,49 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/8/13} {17:27}
*/
namespace app\api\controller;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
class Common extends BaseHttpApi
{
/**
* desc唯一id
* 参数:无
*
* api/Common/getUniqueId
*
* authorwh
*/
function getUniqueId(){
return Mmodel::catchJson(function (){
$uniqueid = md5(Tools::getMillisecond());
return Tools::set_ok('ok',['uniqueid'=>$uniqueid]);
});
}
/**
* desc获取对话token在听译对话开始之前调用用于隔离聊天记录
* 参数:无
*
* api/Common/getSayToken
*
* authorwh
*/
function getSayToken(){
return Mmodel::catchJson(function (){
$uniqueid = md5(Tools::getMillisecond());
return Tools::set_ok('ok',['uniqueid'=>$uniqueid]);
});
}
}

View File

@@ -0,0 +1,103 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/11/27} {10:11}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
class Drugsimagesmedicaltasknotify extends BaseHttpApi
{
/**
* desc药品CT病例上传AI分析任务回调地址
*
* 回调地址会在请求ai接口时传递
*(参考):
* 线上域名https://ybx_prediagnosis.excn.top
* /api/Drugsimagesmedicaltasknotify/notify
*
* method: post
*
* 数据结构建议:
* {
* "code":200,//500(失败、异常、错误),可以是其它有意义的值
* "msg":'提示信息',//eg处理成功、请求失败处理中等
* "data":[],//该值可以是任意数据eg数组、字符串等
* }
*
* authorwh
*/
function notify(){
return Mmodel::catchJson(function (){
Tools::log_to_write_txt(['药品CT病例上传AI分析任务回调入参'=>input()]);
$this->notify_test();
});
}
private function notify_test(){
$jsondecode = input();
$task_id = $jsondecode['task_id'];
$result = $jsondecode['result'];
if(empty($task_id)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息task_id错误']);
}
//$log_file_name = 'drugs_images_medical';
//$header = [
// //'Accept: application/json',
// "Content-Type: application/json"
//];
//$url = "https://image_fastapi.excn.vip/imgs-task/{$task_id}";
//Tools::log_to_write_txt(['异步查询图片处理结果,请求地址'=>$url,'task_id'=>$task_id],$log_file_name);
//$process_images_res = Curl::curl_request($url,'GET',[],$header);
//Tools::log_to_write_txt(['异步查询图片处理结果,返回结果'=>$process_images_res],$log_file_name);
//if(isset($process_images_res['status']) && $process_images_res['status'] == 'error'){
// return Tools::set_fail($process_images_res['message']);
//}
if(isset($result['detail']) && $result['detail'] == '未知的任务 ID'){
return Tools::set_fail($result['detail']);
}
if(isset($result['status']) && $result['status'] == 'pending'){
return Tools::set_fail('处理中请等待');
}
//if(!isset($result['result']) || $result['result'] == ''){
// return Tools::set_fail('未查询到结果');
//}
//保存处理结果
Db::table(TabConf::$fa_drugs_images_medical_task)
->data([
'result'=>json_encode($jsondecode),
])
->where('task_id',$task_id)
->update();
//遍历二维数组,将每张图片的分析同步到
foreach ($result as $item){
Db::table(TabConf::$fa_drugs_images_medical_result)
->where('imageid',$item['id'])
->data([
'ai_result'=>$item['result'],
'type'=>$item['type'],
])
->update();
}
return Tools::set_ok('ok',$result);
}
}

View File

@@ -0,0 +1,249 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/11/27} {15:10}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
class Drugsimagesmedicalupload extends BaseHttpApi
{
/**
* 药品、影像、病历上传(多文件)
*
* 流程前端上传图片发给ai不等待分析结果异步查询结果
*
* 参数:
* phone 患者手机号码
*
* 文件上传控件name值设置为file_upload否则无法上传
*
* 返回task_id前端手机号查询处理任务列表
*
* /api/Drugsimagesmedicalupload/uploadDrugsImagesMedical
*/
public function uploadDrugsImagesMedical(){
return Mmodel::catchJson(function (){
$sessionid = input('sessionid');
if(empty($sessionid)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息sessionid错误']);
}
$phone = input('phone');
if(empty($phone)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']);
}
//存在没有生成报告的上传的基本信息就删除
Db::table(TabConf::$fa_drugs_images_medical_result)
->where('phone',$phone)
->where('reportid','eq','')
->delete();
$ai_config = config('medicine_image_report_config');
$oss_config = config('aliyun_oss_config');
$file_obj = new FileUpload();
$file_res = $file_obj->filesUploadToAliCloudOss($oss_config);
Tools::log_to_write_txt(['文件上传结果'=>$file_res]);
if($file_res['code']!=200){
return Tools::set_fail($file_res['msg']);
}
//发现之前存在没生成报告的附件则清理掉
Db::table(TabConf::$fa_drugs_images_medical_result)
->where('phone',$phone)
->where('reportid','eq','')
->delete();
$sub_content_imgarr = ['images'=>[],'webhooks'=>[$ai_config['notify_url']]];
foreach ($file_res['data'] as $key=>$item){
$md5id = md5($item['outer_req_url'].Tools::rand_str());
$sub_content_imgarr['images'][$md5id] = $item['outer_req_url'];
$item['phone'] = $phone;
$item['imageid'] = $md5id;
$item['sessionid'] = $sessionid;
//新增
Db::table(TabConf::$fa_drugs_images_medical_result)
->data($item)
->insert();
}
$header = [
'Accept: application/json',
"Content-Type: application/json"
];
$url = "https://image_fastapi.excn.vip/imgs-task";
Tools::log_to_write_txt(['药品、影像、病历上传图片处理,请求地址'=>$url,'请求参数'=>$sub_content_imgarr]);
$process_images_res = Curl::curl_request($url,'POST',json_encode($sub_content_imgarr),$header);
Tools::log_to_write_txt(['药品、影像、病历上传图片处理,返回结果'=>$process_images_res]);
//保存处理任务
$task_res = json_decode($process_images_res,true);
$task_data = [
'phone'=>$phone,
'task_id'=>$task_res['task_id'],
'msg'=>$task_res['msg'],
];
//每次都是新任务
Db::table(TabConf::$fa_drugs_images_medical_task)
->data($task_data)
->insert();
//返回分析结果
return Tools::set_ok('任务处理中,等待处理结果',['result'=>$process_images_res,'file_info'=>$file_res['data']]);
});
}
//public function testUploadFiles(){
// return Mmodel::catchJson(function (){
// $phone = input('phone');
// if(empty($phone)){
// return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']);
// }
//
// $res = (new FileUpload())->files();
// Tools::log_to_write_txt(['文件上传结果'=>$res]);
// return Tools::set_ok('测试结果',$res);
// });
//}
/**
* 消费者队列【wh专用】
*
* /api/Drugsimagesmedicalupload/queryDrugsImagesMedicalTask
*/
public function queryDrugsImagesMedicalTask(){
//查询
$obj = Db::table(TabConf::$fa_drugs_images_medical_task);
$res_lists = $obj
->whereNull('result')
//时间在10分钟之内
->where('create_time','>=',date('Y-m-d H:i:s',time()-600))
->select();
//Tools::log_to_write_txt(['查询结果'=>$res_lists,'sql:'=>$obj->getLastSql()]);
//消费者队列终止开关
$consumer_switch = SundryConfig::val('drugs_images_medical_task_consumer_switch');
if(empty($res_lists)){
return json(Tools::set_fail('无数据可处理',$consumer_switch));
}
foreach ($res_lists as $item){
$this->querySaveTaskProcessByTaskId($item['task_id']);
}
return json(Tools::set_ok('处理成功,数量:'.count($res_lists),$consumer_switch));
}
/**
* 根据报告id查询附件
*
* 参数:
* reportid 数字人报告id
* type 类型,如:影像报告 病历报告
*
*/
public function queryDrugsImagesMedicalReportId(){
return Mmodel::catchJson(function (){
//$phone = input('phone');
//if(empty($phone)){
// return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']);
//}
$type = input('type');
if(empty($type)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息type错误']);
}
$reportid = input('reportid');
if( empty($reportid)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息reportid错误']);
}
//根据报告id查询附件列表
$lists = Db::table(TabConf::$fa_drugs_images_medical_result)
//->field('id,phone,imageid,ai_result')
//->where('phone',$phone)
->where('reportid',$reportid)
->where('type',$type)
->select();
return Tools::set_ok('ok',$lists);
});
}
/**
* desc查询并更新ai分析结果
* authorwh
*
* api/Drugsimagesmedicalupload/querySaveTaskProcessByTaskId
*/
function querySaveTaskProcessByTaskId($taskid=''){
return Mmodel::catchJson(function () use ($taskid){
$task_id = '';
if($taskid){
$task_id = $taskid;
}
if(input('task_id')){
$task_id = input('task_id');
}
if(empty($task_id)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息task_id错误']);
}
//$log_file_name = 'drugs_images_medical';
//$header = [
// //'Accept: application/json',
// "Content-Type: application/json"
//];
//$url = "https://image_fastapi.excn.vip/imgs-task/{$task_id}";
//Tools::log_to_write_txt(['异步查询图片处理结果,请求地址'=>$url,'task_id'=>$task_id],$log_file_name);
//$process_images_res = Curl::curl_request($url,'GET',[],$header);
//Tools::log_to_write_txt(['异步查询图片处理结果,返回结果'=>$process_images_res],$log_file_name);
//if(isset($process_images_res['status']) && $process_images_res['status'] == 'error'){
// return Tools::set_fail($process_images_res['message']);
//}
//$jsondec = json_decode($process_images_res,true);
//if(isset($jsondec['detail']) && $jsondec['detail'] == '未知的任务 ID'){
// return Tools::set_fail($jsondec['detail']);
//}
//if(isset($jsondec['status']) && $jsondec['status'] == 'pending'){
// return Tools::set_fail('处理中请等待');
//}
//if(!isset($jsondec['result']) || $jsondec['result'] == ''){
// return Tools::set_fail('未查询到结果');
//}
//保存处理结果
//Db::table(TabConf::$fa_drugs_images_medical_task)
// ->data([
// 'result'=>$process_images_res
// ])
// ->where('task_id',$task_id)
// ->update();
//遍历二维数组,将每张图片的分析同步到
//foreach ($jsondec as $item){
// Db::table(TabConf::$fa_drugs_images_medical_result)
// ->where('imageid',$item['id'])
// ->data([
// 'ai_result'=>$item['result'],
// 'type'=>$item['type'],
// ])
// ->update();
//}
$process_images_res = Db::table(TabConf::$fa_drugs_images_medical_result)
->where('task_id',$task_id)
->find();
return Tools::set_ok('ok',json_decode($process_images_res,true));
});
}
}

View File

@@ -0,0 +1,253 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
use think\Controller;
class Guliangqarecord extends BaseHttpApi
{
protected $controller_comments = '估量-问答记录';
/**
* desc估量量表会话记录ai处理
*
* api/Guliangqarecord/guliangSessionDeal
* 参数:
* sessionid 会话id
* phone 手机
* name 姓名
*
* authorwh
*/
function guliangSessionDeal(){
return Mmodel::catch(function (){
//会话id
$sessionid = input('sessionid');
if(empty($sessionid)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'sessionid(会话id)不能为空通过getUniqueId接口获取']));
}
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'phone(手机号)不能为空']));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'name(姓名)不能为空']));
}
//content
//根据会话id查询对话记录
$guliang_record_list = Db::table(TabConf::$fa_guliangqarecord)
->where('sessionid',$sessionid)
->select();
if(empty($guliang_record_list)){
return json(Tools::set_fail('参数错误.3',['error_msg'=>'未查询到对话记录']));
}
//ai生成报告
$report_config = config('scale_processing_ai_config');
$chatobj = new ChatGPT();
$chatobj->url = $report_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $report_config['APIKey'];
$answer_json_arr = [];
$date = date('Y-m-d');
$ctn_msg_str = <<<EOF
用户姓名:{$name} 用户手机号:{$phone}
日期:{$date} 会话ID{$sessionid}
EOF;
foreach ($guliang_record_list as $k=>$val){
$ctn_msg_str .= "\n 问题($k)".$val['guliangquestion'];
$ctn_msg_str .= "\n 答案选项:".$val['choose'];
$ctn_msg_str .= "\n 用户选择项:".$val['answer']?:'未回答';
}
$sub_content_msg = [
["role" => "user", "content" => $ctn_msg_str]
];
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
//chatGpt设置前置聊天上下文
$chatobj->setBefore($sub_content_msg);
$question = '';
//回答
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['请求gpt'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['gpt回复'=>$answer_json_arr]);
//保存处理结果
$answer_result = json_decode($answer_json_arr[0],true);
$data = [
'sessionid'=>$sessionid,//不可以重复
'phone'=>$guliang_record_list[0]['phone'],//可以重复
'name'=>$guliang_record_list[0]['name'],//可以重复
'content'=>$answer_result['choices'][0]['message']['content'],
];
//一个手机可以有多个处理结果,但一个会话只能有一个处理结果
Mmodel::existsUpdateInsert(TabConf::$fa_guliang_ai_deal_result,['sessionid'=>$sessionid],$data);
return json(Tools::set_ok());
});
}
/**
* 新增估量-问答记录
*
* 参数:
* sessionid 会话id
* gulianguser_id 估量-用户ID
* name 用户姓名
* phone 手机号
* guliangquestion 用户选择的问题
* choose 可选项
* answer 回答选项(逗号隔开)
* api/Guliangqarecord/addGuliangqarecord
*/
function addGuliangqarecord(){
Tools::log_to_write_txt(['新增估量-问答记录'=>input()]);
$api_desc = '新增估量-问答记录';
Db::startTrans();
try {
//会话id
$sessionid = input('sessionid');
if(empty($sessionid)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'sessionid(会话id)不能为空通过getUniqueId接口获取']));
}
$gulianguser_id = input('gulianguser_id');
$guliangquestion = input('guliangquestion');
$choose = input('choose');
$answer = input('answer');
$name = input('name');
$phone = input('phone');
if(empty($name)){
return json(Tools::set_fail('姓名不能为空'));
}
if(empty($phone)){
return json(Tools::set_fail('手机号不能为空'));
}
$data = [
'gulianguser_id'=>$gulianguser_id?:'',
'guliangquestion'=>$guliangquestion?:'',
'choose'=>$choose?:'',
'answer'=>$answer?:'',
'name'=>$name?:'',
'phone'=>$phone?:'',
'sessionid'=>$sessionid?:'',
];
$dataid = Db::table(TabConf::$fa_guliangqarecord)->insertGetId($data);
//$this->operateLog('新增估量-问答记录',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增估量-问答记录.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取估量-问答记录
*
* api/Guliangqarecord/getGuliangqarecordList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* guliangquestion 用户选择的问题
* gulianguser_id 估量-用户ID
* guliangquestion 用户选择的问题
* name 姓名
* phone 手机号
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* gulianguser_id 估量-用户ID
* guliangquestion 用户选择的问题
* choose 回答选项
* answer 回答选项(逗号隔开)
* name 姓名
* phone 手机号
* create_time 创建时间
* authorwh
*/
function getGuliangqarecordList(){
Tools::log_to_write_txt(['获取估量-问答记录 入参:'=>input()]);
$api_desc = '获取估量-问答记录';
try {
$gulianguser_id = input('gulianguser_id');
$guliangquestion = input('guliangquestion');
$name = input('name');
$phone = input('phone');
$model_obj = Db::table(TabConf::$fa_guliangqarecord);
if(input('guliangquestion')){
$model_obj->whereLike('guliangquestion','%'.input('guliangquestion').'%');
}
if(input('gulianguser_id')){
$model_obj->where('gulianguser_id',input('gulianguser_id'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('phone')){
$model_obj->where('phone',input('phone'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取估量-问答记录.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Guliangquestion extends BaseHttpApi
{
protected $controller_comments = '估量-问答配置';
/**
* desc获取估量-问答配置
*
* api/Guliangquestion/getGuliangquestionList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* name 问题
* answer 答案
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* name 问题
* answer 答案
* authorwh
*/
function getGuliangquestionList(){
Tools::log_to_write_txt(['获取估量-问答配置 入参:'=>input()]);
$api_desc = '获取估量-问答配置';
try {
$name = input('name');
$answer = input('answer');
$model_obj = Db::table(TabConf::$fa_guliangquestion);
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('answer')){
$model_obj->where('answer',input('answer'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取估量-问答配置.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,128 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
use think\Controller;
class Gulianguser extends BaseHttpApi
{
protected $controller_comments = '估量-用户';
/**
* 新增估量-用户
*
* 参数:
* name 姓名 【必须】
* phone 手机号 【必须】
* api/Gulianguser/addGulianguser
*/
function addGulianguser(){
Tools::log_to_write_txt(['新增估量-用户'=>input()]);
$api_desc = '新增估量-用户';
Db::startTrans();
try {
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'错误信息name错误']));
}
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息phone错误']));
}
$data = [
'name'=>$name?:'',
'phone'=>$phone?:'',
];
$dataid = Mmodel::existsUpdateInsert(TabConf::$fa_gulianguser,['phone'=>$phone],$data);
//$dataid = Db::table(TabConf::$fa_gulianguser)->insertGetId($data);
//$this->operateLog('新增估量-用户',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增估量-用户.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取估量-用户
*
* api/Gulianguser/getGulianguserList
*
* 参数:
* name 姓名
* phone 手机号
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* name 姓名
* phone 手机号
* authorwh
*/
function getGulianguserList(){
Tools::log_to_write_txt(['获取估量-用户 入参:'=>input()]);
$api_desc = '获取估量-用户';
try {
$name = input('name');
$phone = input('phone');
$model_obj = Db::table(TabConf::$fa_gulianguser);
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('phone')){
$model_obj->where('phone',input('phone'));
}
//$model_obj->field('name,phone');
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取估量-用户.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,66 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/8/7} {13:50}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
class Hdradmin extends BaseHttpApi
{
/**
* desc管理员登录
* api/Hdradmin/adminLogin
* authorwh
*/
function adminLogin(){
return Mmodel::catchJson(function (){
$username = input('username');
if(empty($username)){
return Tools::set_fail('参数错误:1');
}
$password = input('password');
if(empty($password)){
return Tools::set_fail('参数错误:2');
}
$user = Db::table(TabConf::$fa_hdradmin)
->where('username',$username)
->find();
if(empty($user)){
return Tools::set_fail('用户不存在');
}
if($password != $user['password']){
return Tools::set_fail('密码错误');
}
//session('api_user_info',$user);
unset($user['password']);
$expires = 7*86400+time();//报告完成之后重新获取票据
//返回票据
$ticketstr = md5($user['username'].$expires);
//修改有效期
Db::table('fa_hdradmin')
->data([
'ticket'=>$ticketstr,
'expires'=>$expires,//7天
])
->where('username',$username)
->update();
return Tools::set_ok('登录成功',['ticket'=>$ticketstr,'user'=>$user]);
});
}
}

View File

@@ -0,0 +1,59 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Hdrdepartment extends BaseHttpApi
{
protected $controller_comments = '科室';
/**
* desc获取科室
*
* api/Hdrdepartment/getHdrdepartmentList
*
* 参数:
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* name 科室名称
* authorwh
*/
function getHdrdepartmentList(){
Tools::log_to_write_txt(['获取科室 入参:'=>input()]);
$api_desc = '获取科室';
try {
$model_obj = Db::table(TabConf::$fa_hdrdepartment);
$data = $model_obj->select();
if(empty($data)){
return json(Tools::set_ok('ok',$data));
}
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取科室.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,291 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use think\Controller;
class Hdrdoctorusers extends BaseHttpApi
{
protected $controller_comments = '医生账户信息';
/**
* 新增医生账户信息
*
* 参数:
* doctor 医生昵称(杨教授) 医生昵称(杨教授) 必须
* username 用户名(手机号) 用户名(手机号) 必须
* hdrdepartment_id 科室 科室 必须
* name 姓名(杨玉环) 姓名(杨玉环) 必须
* password 密码a123456 密码a123456 必须
* api/Hdrdoctorusers/addHdrdoctorusers
*/
function addHdrdoctorusers(){
Tools::log_to_write_txt(['新增医生账户信息'=>input()]);
$api_desc = '新增医生账户信息';
Db::startTrans();
try {
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.0'));
}
$username = input('username');
if(empty($username)){
return json(Tools::set_fail('参数错误.1'));
}
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.2'));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.3'));
}
$password = input('password');
if(empty($password)){
return json(Tools::set_fail('参数错误.4'));
}
$data = [
'doctor'=>$doctor?:'',
'username'=>$username?:'',
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'name'=>$name?:'',
'password'=>$password?:'',
];
$dataid = Db::table(TabConf::$fa_hdrdoctorusers)->insertGetId($data);
//$this->operateLog('新增医生账户信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增医生账户信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改医生账户信息
* 参数:
* id ID ID 必须
* doctor 医生昵称(杨教授)
* username 用户名(手机号)
* hdrdepartment_id 科室
* name 姓名(杨玉环)
* password 密码a123456
* sex 性别
* age 年龄
* address 住址
* api/Hdrdoctorusers/updateHdrdoctorusers
*/
function updateHdrdoctorusers(){
Tools::log_to_write_txt(['修改医生账户信息'=>input()]);
$api_desc = '修改医生账户信息';
Db::startTrans();
try {
$doctor = input('doctor');
$username = input('username');
$hdrdepartment_id = input('hdrdepartment_id');
$name = input('name');
$password = input('password');
$sex = input('sex');
$age = input('age');
$address = input('address');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0'));
}
$data = [
'doctor'=>$doctor?:'',
'username'=>$username?:'',
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'name'=>$name?:'',
'password'=>$password?:'',
'sex'=>$sex?:'',
'age'=>$age?:'',
'address'=>$address?:'',
];
$dataid = Db::table(TabConf::$fa_hdrdoctorusers)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改医生账户信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改医生账户信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取医生账户信息
*
* api/Hdrdoctorusers/getHdrdoctorusersList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* doctor 医生昵称(杨教授)
* name 姓名(杨玉环)
* doctor 医生昵称(杨教授)
* username 用户名(手机号)
* hdrdepartment_id 科室
* name 姓名(杨玉环)
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* doctor 医生昵称(杨教授)
* username 用户名(手机号)
* hdrdepartment_id 科室
* name 姓名(杨玉环)
* password 密码a123456
* sex 性别
* age 年龄
* type 用户类型:user=用户,doc=医生
* address 住址
* clientid 客户端ID
* expires 有效期
* ticket 票据
* create_time 创建时间
* authorwh
*/
function getHdrdoctorusersList(){
Tools::log_to_write_txt(['获取医生账户信息 入参:'=>input()]);
$api_desc = '获取医生账户信息';
try {
$doctor = input('doctor');
$username = input('username');
$hdrdepartment_id = input('hdrdepartment_id');
$name = input('name');
$model_obj = Db::table(TabConf::$fa_hdrdoctorusers);
if(input('doctor')){
$model_obj->whereLike('doctor','%'.input('doctor').'%');
}
if(input('name')){
$model_obj->whereLike('name','%'.input('name').'%');
}
if(input('doctor')){
$model_obj->where('doctor',input('doctor'));
}
if(input('username')){
$model_obj->where('username',input('username'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
$ret_field_name_arr = Tools::delete_str_empty_ele(',,,hdrdepartment_id--name,,,,,,,,,,');
//处理为外键字段+外键对应数据的字段名 egusers_id=>nickname
$ret_field_name2 = [];
foreach ($ret_field_name_arr as $ret_typ_field) {
$exp_arr = explode('--',$ret_typ_field);
//$exp_arr[0] 主表字段,$exp_arr[1] 副表字段
$ret_field_name2[$exp_arr[0]] = [$exp_arr[0],$exp_arr[1]];
}
//返回数据类型处理
$return_type_exp_arr = Tools::delete_str_empty_ele(',,,hdrdepartment_id==field_val,,,,,,,,,,');
//处理为类型+字段
$return_type_exp_arr2 = [];
foreach ($return_type_exp_arr as $ret_type_field) {
$exp_arr = explode('==',$ret_type_field);
$return_type_exp_arr2[$exp_arr[0]] = $exp_arr[1];
}
//返回数组 eg: [id-fa_goods_deal==goods_id,id-fa_goods_deal==goods_id]
$rel_table_arr = Tools::delete_str_empty_ele(',,,hdrdepartment_id-fa_hdrdepartment==id,,,,,,,,,,');
//关联的字段和表
$rel_field_table_arr2 = [];
//关系
foreach ($rel_table_arr as $rel_str) {
$exp_arr = explode('-',$rel_str);
$rel_field_table_arr2[$exp_arr[0]] = [explode('==',$exp_arr[1])[0],explode('==',$exp_arr[1])[1]];
}
foreach($item as $it_key=>$it_val){
if(empty($rel_field_table_arr2[$it_key])){
continue;
}
foreach($return_type_exp_arr as $key=>$val){
$val_arr = explode('==',$val);
if($it_key == $val_arr[0]){
switch($val_arr[1]){
case 'two_arr':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->select();
break;
case 'one_arr':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->find();
break;
case 'field_val':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->value("{$ret_field_name2[$it_key][1]}");
break;
}
}
}
}
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取医生账户信息.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,328 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use think\Controller;
class Hdrfollowup extends BaseHttpApi
{
protected $controller_comments = '统一随访记录';
/**
* 删除随访
* 参数:
* id ID
* api/Hdrfollowup/del
*/
function del(){
Tools::log_to_write_txt(['删除统一随访记录'=>input()]);
$api_desc = '删除统一随访记录';
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('参数错误。0'));
}
Db::table(TabConf::$fa_hdrfollowup)
->where('id',$id)
->delete();
return json(Tools::set_ok('ok'));
} catch (\Exception $e) {
Tools::log_to_write_txt([
'error'=>'删除统一随访记录.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取统一随访记录
*
* api/Hdrfollowup/getHdrfollowupList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* id ID
* report_dataid 报告ID
* hdruserbaseinfo_id 统一基本信息
* userbaseid 基本信息ID
* name 姓名
* phone 电话
* status 状态:0=待发送,1=已发送
* hdrfollowuptemplate_id 随访模板ID
* flow 诊断流程:0=初诊,1=复诊
* send_time 发送时间
* create_time 创建时间
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* report_dataid 报告ID
* hdruserbaseinfo_id 统一基本信息
* userbaseid 基本信息ID
* name 姓名
* phone 电话
* content 随访内容
* status 状态:0=待发送,1=已发送
* hdrfollowuptemplate_id 随访模板ID
* flow 诊断流程:0=初诊,1=复诊
* send_time 发送时间
* create_time 创建时间
* authorwh
*/
function getHdrfollowupList(){
Tools::log_to_write_txt(['获取统一随访记录 入参:'=>input()]);
$api_desc = '获取统一随访记录';
try {
$id = input('id');
$report_dataid = input('report_dataid');
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
$userbaseid = input('userbaseid');
$name = input('name');
$phone = input('phone');
$status = input('status');
$hdrfollowuptemplate_id = input('hdrfollowuptemplate_id');
$flow = input('flow');
$send_time = input('send_time');
$create_time = input('create_time');
$model_obj = Db::table(TabConf::$fa_hdrfollowup);
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('report_dataid')){
$model_obj->where('report_dataid',input('report_dataid'));
}
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
if(input('userbaseid')){
$model_obj->where('userbaseid',input('userbaseid'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('phone')){
$model_obj->where('phone',input('phone'));
}
if(input('status')){
$model_obj->where('status',input('status'));
}
if(input('hdrfollowuptemplate_id')){
$model_obj->where('hdrfollowuptemplate_id',input('hdrfollowuptemplate_id'));
}
if(input('flow')){
$model_obj->where('flow',input('flow'));
}
if(input('send_time')){
$model_obj->where('send_time',input('send_time'));
}
if(input('create_time')){
$model_obj->where('create_time',input('create_time'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取统一随访记录.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 新增统一随访记录
*
* 参数:
* hdruserbaseinfo_id 统一基本信息 统一基本信息 必须
* name 姓名 姓名 必须
* phone 电话 电话 必须
* content 随访内容 随访内容 必须
* hdrfollowuptemplate_id 随访模板ID 随访模板ID 必须
* send_time 发送时间
* api/Hdrfollowup/addHdrfollowup
*/
function addHdrfollowup(){
Tools::log_to_write_txt(['新增统一随访记录'=>input()]);
$api_desc = '新增统一随访记录';
Db::startTrans();
try {
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('参数错误.0'));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.1'));
}
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.2'));
}
$content = input('content');
if(empty($content)){
return json(Tools::set_fail('参数错误.3'));
}
$hdrfollowuptemplate_id = input('hdrfollowuptemplate_id');
if(empty($hdrfollowuptemplate_id)){
return json(Tools::set_fail('参数错误.4'));
}
$send_time = input('send_time');
$data = [
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id?:'',
'name'=>$name?:'',
'phone'=>$phone?:'',
'content'=>$content?:'',
'hdrfollowuptemplate_id'=>$hdrfollowuptemplate_id?:'',
'send_time'=>$send_time?:'',
];
$dataid = Db::table(TabConf::$fa_hdrfollowup)->insertGetId($data);
//$this->operateLog('新增统一随访记录',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增统一随访记录.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改统一随访记录
* 参数:
* id ID ID 必须
* hdruserbaseinfo_id 统一基本信息
* name 姓名
* phone 电话
* content 随访内容
* status 状态:0=待发送,1=已发送
* hdrfollowuptemplate_id 随访模板ID
* flow 诊断流程:0=初诊,1=复诊
* send_time 发送时间
* api/Hdrfollowup/updateHdrfollowup
*/
function updateHdrfollowup(){
Tools::log_to_write_txt(['修改统一随访记录'=>input()]);
$api_desc = '修改统一随访记录';
Db::startTrans();
try {
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
$name = input('name');
$phone = input('phone');
$content = input('content');
$status = input('status');
$hdrfollowuptemplate_id = input('hdrfollowuptemplate_id');
$flow = input('flow');
$send_time = input('send_time');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0'));
}
$data = [
//'hdruserbaseinfo_id'=>$hdruserbaseinfo_id?:'',
//'name'=>$name?:'',
//'phone'=>$phone?:'',
//'content'=>$content?:'',
//'hdrfollowuptemplate_id'=>$hdrfollowuptemplate_id?:'',
////'flow'=>$flow?:'',
//'send_time'=>$send_time?:'',
];
if(isset($hdruserbaseinfo_id)){
$data['hdruserbaseinfo_id'] = $hdruserbaseinfo_id;
}
if(isset($name)){
$data['name'] = $name;
}
if(isset($phone)){
$data['phone'] = $phone;
}
if(isset($content)){
$data['content'] = $content;
}
if(isset($hdrfollowuptemplate_id)){
$data['hdrfollowuptemplate_id'] = $hdrfollowuptemplate_id;
}
if(isset($send_time)){
$data['send_time'] = $send_time;
}
if(isset($status)){
$data['status'] = $status;
}
//'status'=>$status?:'',
$dataid = Db::table(TabConf::$fa_hdrfollowup)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改统一随访记录',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改统一随访记录.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
}

View File

@@ -0,0 +1,217 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Hdrfollowuptemplate extends BaseHttpApi
{
protected $controller_comments = '随访模板';
/**
* 新增随访模板
*
* 参数:
* name 模板名称 模板名称 必须
* content 模板内容 模板内容 必须
* api/Hdrfollowuptemplate/addHdrfollowuptemplate
*/
function addHdrfollowuptemplate(){
Tools::log_to_write_txt(['新增随访模板'=>input()]);
$api_desc = '新增随访模板';
Db::startTrans();
try {
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.0'));
}
$content = input('content');
if(empty($content)){
return json(Tools::set_fail('参数错误.1'));
}
$data = [
'name'=>$name?:'',
'content'=>$content?:'',
];
$dataid = Db::table(TabConf::$fa_hdrfollowuptemplate)->insertGetId($data);
//$this->operateLog('新增随访模板',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增随访模板.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改随访模板
* 参数:
* id ID ID 必须
* name 模板名称
* content 模板内容
* api/Hdrfollowuptemplate/updateHdrfollowuptemplate
*/
function updateHdrfollowuptemplate(){
Tools::log_to_write_txt(['修改随访模板'=>input()]);
$api_desc = '修改随访模板';
Db::startTrans();
try {
$name = input('name');
$content = input('content');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0'));
}
$data = [
'name'=>$name?:'',
'content'=>$content?:'',
];
$dataid = Db::table(TabConf::$fa_hdrfollowuptemplate)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改随访模板',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改随访模板.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取随访模板
*
* api/Hdrfollowuptemplate/getHdrfollowuptemplateList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* id ID
* name 模板名称
* content 模板内容
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* name 模板名称
* content 模板内容
* authorwh
*/
function getHdrfollowuptemplateList(){
Tools::log_to_write_txt(['获取随访模板 入参:'=>input()]);
$api_desc = '获取随访模板';
try {
$id = input('id');
$name = input('name');
$content = input('content');
$model_obj = Db::table(TabConf::$fa_hdrfollowuptemplate);
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('content')){
$model_obj->where('content',input('content'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取随访模板.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 删除模板
*
* api/Hdrfollowuptemplate/del
* 参数:
* id ID ID 必须
*/
function del(){
Tools::log_to_write_txt(['删除随访模板 入参:'=>input()]);
$api_desc = '删除随访模板';
Db::startTrans();
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('参数错误.0'));
}
$data = Db::table(TabConf::$fa_hdrfollowuptemplate)
->where('id',$id)
->delete();
Db::commit();
return json(Tools::set_ok('ok',$data));
} catch (\Exception $e) {
Db::rollback();
Tools::log_to_write_txt([
'error'=>'删除随访模板.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Hdrhealthinsight extends BaseHttpApi
{
protected $controller_comments = '患者健康洞察';
/**
* desc获取患者健康洞察
*
* api/Hdrhealthinsight/getHdrhealthinsightList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* id ID
* hdruserbaseinfo_id 统一基本信息 【必须】
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* hdruserbaseinfo_id 统一基本信息
* content 洞察内容
* authorwh
*/
function getHdrhealthinsightList(){
Tools::log_to_write_txt(['获取患者健康洞察 入参:'=>input()]);
$api_desc = '获取患者健康洞察';
try {
$id = input('id');
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息hdruserbaseinfo_id错误']));
}
$model_obj = Db::table(TabConf::$fa_hdrhealth_insight);
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取患者健康洞察.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,220 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Hdrquestionnaireanswer extends BaseHttpApi
{
protected $controller_comments = '科室问卷答案';
/**
* desc获取科室问卷答案
*
* api/Hdrquestionnaireanswer/getHdrquestionnaireanswerList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* id ID
* hdrquestionnairequestion_id 问卷问题ID
* answer 问卷答案
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* hdrquestionnairequestion_id 问卷问题ID
* answer 问卷答案
* create_time 创建时间
* update_time 更新时间
* authorwh
*/
function getHdrquestionnaireanswerList(){
Tools::log_to_write_txt(['获取科室问卷答案 入参:'=>input()]);
$api_desc = '获取科室问卷答案';
try {
$id = input('id');
$hdrquestionnairequestion_id = input('hdrquestionnairequestion_id');
$answer = input('answer');
$model_obj = Db::table(TabConf::$fa_hdrquestionnaireanswer);
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('hdrquestionnairequestion_id')){
$model_obj->where('hdrquestionnairequestion_id',input('hdrquestionnairequestion_id'));
}
if(input('answer')){
$model_obj->where('answer',input('answer'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取科室问卷答案.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 新增一个问卷答案
*
* 参数:
* hdrquestionnairequestion_id 问卷问题ID 问卷问题ID 必须
* answer 问卷答案 问卷答案 必须
* api/Hdrquestionnaireanswer/addHdrquestionnaireanswer
*/
function addHdrquestionnaireanswer(){
Tools::log_to_write_txt(['新增一个问卷答案'=>input()]);
$api_desc = '新增一个问卷答案';
Db::startTrans();
try {
$hdrquestionnairequestion_id = input('hdrquestionnairequestion_id');
if(empty($hdrquestionnairequestion_id)){
return json(Tools::set_fail('参数错误.0'));
}
$answer = input('answer');
if(empty($answer)){
return json(Tools::set_fail('参数错误.1'));
}
$data = [
'hdrquestionnairequestion_id'=>$hdrquestionnairequestion_id?:'',
'answer'=>$answer?:'',
];
$dataid = Db::table(TabConf::$fa_hdrquestionnaireanswer)->insertGetId($data);
//$this->operateLog('新增一个问卷答案',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增一个问卷答案.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改科室问卷答案
* 参数:
* id ID ID 必须
* hdrquestionnairequestion_id 问卷问题ID
* answer 问卷答案
* api/Hdrquestionnaireanswer/updateHdrquestionnaireanswer
*/
function updateHdrquestionnaireanswer(){
Tools::log_to_write_txt(['修改科室问卷答案'=>input()]);
$api_desc = '修改科室问卷答案';
Db::startTrans();
try {
$hdrquestionnairequestion_id = input('hdrquestionnairequestion_id');
$answer = input('answer');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0'));
}
$data = [
'hdrquestionnairequestion_id'=>$hdrquestionnairequestion_id?:'',
'answer'=>$answer?:'',
];
$dataid = Db::table(TabConf::$fa_hdrquestionnaireanswer)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改科室问卷答案',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改科室问卷答案.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc 删除科室问卷答案
* authorwh
*
* 参数:
* id 数据id 必须
* api/Hdrquestionnaireanswer/del
*/
function del(){
Tools::log_to_write_txt(['删除科室问卷答案'=>input()]);
$api_desc = '删除科室问卷答案';
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('参数错误。0'));
}
Db::table(TabConf::$fa_hdrquestionnairequestion)
->where('id',$id)
->delete();
return json(Tools::set_ok('ok'));
} catch (\Exception $e) {
Tools::log_to_write_txt([
'error'=>'删除科室问卷答案.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
}

View File

@@ -0,0 +1,452 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Hdrquestionnairequestion extends BaseHttpApi
{
protected $controller_comments = '科室问卷问题(一个问题对应多个答案)';
/**
* 新增科室问卷问题(一个问题对应多个答案)
*
* 参数:
* hdrdepartment_id 所属科室 所属科室 必须
* question 问卷问题 问卷问题 必须
* is_common 是否通用:yes=是,no=否 是否通用:yes=是,no=否 必须
* is_only_boy 只适合男:yes=是,no=否 只适合男:yes=是,no=否 必须
* is_only_girl 只适合女:yes=是,no=否 只适合女:yes=是,no=否 必须
* type 选项类型:one=单选,more=多选 选项类型:one=单选,more=多选 必须
* api/Hdrquestionnairequestion/addHdrquestionnairequestion
*/
function addHdrquestionnairequestion()
{
Tools::log_to_write_txt(['新增科室问卷问题(一个问题对应多个答案)' => input()]);
$api_desc = '新增科室问卷问题(一个问题对应多个答案)';
Db::startTrans();
try {
$hdrdepartment_id = input('hdrdepartment_id');
if (empty($hdrdepartment_id)) {
return json(Tools::set_fail('参数错误.0'));
}
$question = input('question');
if (empty($question)) {
return json(Tools::set_fail('参数错误.1'));
}
$is_common = input('is_common');
if (empty($is_common)) {
return json(Tools::set_fail('参数错误.2'));
}
$is_only_boy = input('is_only_boy');
if (empty($is_only_boy)) {
return json(Tools::set_fail('参数错误.3'));
}
$is_only_girl = input('is_only_girl');
if (empty($is_only_girl)) {
return json(Tools::set_fail('参数错误.4'));
}
$type = input('type');
if (empty($type)) {
return json(Tools::set_fail('参数错误.5'));
}
$data = [
'hdrdepartment_id' => $hdrdepartment_id ?: '',
'question' => $question ?: '',
'is_common' => $is_common ?: '',
'is_only_boy' => $is_only_boy ?: '',
'is_only_girl' => $is_only_girl ?: '',
'type' => $type ?: '',
];
$dataid = Db::table(TabConf::$fa_hdrquestionnairequestion)->insertGetId($data);
//$this->operateLog('新增科室问卷问题(一个问题对应多个答案)', api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok', $dataid));
} catch (\Exception $e) {
Db::rollback();
Tools::log_to_write_txt([
'error' => '新增科室问卷问题(一个问题对应多个答案).异常.' . $e->getMessage(),
'input' => input(),
'error_info' => $e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改科室问卷问题(一个问题对应多个答案)
* 参数:
* id ID ID 必须
* hdrdepartment_id 所属科室
* question 问卷问题
* is_common 是否通用:yes=是,no=否
* is_only_boy 只适合男:yes=是,no=否
* is_only_girl 只适合女:yes=是,no=否
* type 选项类型:one=单选,more=多选
* api/Hdrquestionnairequestion/updateHdrquestionnairequestion
*/
function updateHdrquestionnairequestion()
{
Tools::log_to_write_txt(['修改科室问卷问题(一个问题对应多个答案)' => input()]);
$api_desc = '修改科室问卷问题(一个问题对应多个答案)';
Db::startTrans();
try {
$hdrdepartment_id = input('hdrdepartment_id');
$question = input('question');
$is_common = input('is_common');
$is_only_boy = input('is_only_boy');
$is_only_girl = input('is_only_girl');
$type = input('type');
if (empty(input('id'))) {
return json(Tools::set_fail('参数错误。0'));
}
$data = [
'hdrdepartment_id' => $hdrdepartment_id ?: '',
'question' => $question ?: '',
'is_common' => $is_common ?: '',
'is_only_boy' => $is_only_boy ?: '',
'is_only_girl' => $is_only_girl ?: '',
'type' => $type ?: '',
];
$dataid = Db::table(TabConf::$fa_hdrquestionnairequestion)
->data($data)
->where('id', input('id'))
->update();
//$this->operateLog('修改科室问卷问题(一个问题对应多个答案)', api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok', $dataid));
} catch (\Exception $e) {
Db::rollback();
Tools::log_to_write_txt([
'error' => '修改科室问卷问题(一个问题对应多个答案).异常.' . $e->getMessage(),
'input' => input(),
'error_info' => $e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc 删除科室问卷问题(一个问题对应多个答案)
* authorwh
*
* 参数:
* id 数据id 必须
*
* api/Hdrquestionnairequestion/del
*/
function del()
{
Tools::log_to_write_txt(['删除科室问卷问题(一个问题对应多个答案)' => input()]);
$api_desc = '删除科室问卷问题(一个问题对应多个答案)';
try {
$id = input('id');
if (empty($id)) {
return json(Tools::set_fail('参数错误。0'));
}
Db::table(TabConf::$fa_hdrquestionnairequestion)
->where('id', $id)
->delete();
return json(Tools::set_ok('ok'));
} catch (\Exception $e) {
Tools::log_to_write_txt([
'error' => '删除科室问卷问题(一个问题对应多个答案).异常.' . $e->getMessage(),
'input' => input(),
'error_info' => $e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取科室问卷问题(一个问题对应多个答案)
*
* api/Hdrquestionnairequestion/getHdrquestionnairequestionList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* id ID
* hdrdepartment_id 所属科室 【必须】
* group 题目分组
* question 问卷问题
* is_common 是否通用:yes=是,no=否
* is_only_boy 只适合男:yes=是,no=否
* is_only_girl 只适合女:yes=是,no=否
* type 选项类型:one=单选,more=多选
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* hdrdepartment_id 所属科室
* question 问卷问题
* is_common 是否通用:yes=是,no=否
* is_only_boy 只适合男:yes=是,no=否
* is_only_girl 只适合女:yes=是,no=否
* type 选项类型:one=单选,more=多选
* create_time 创建时间
* update_time 更新时间
* authorwh
*/
function getHdrquestionnairequestionList(){
Tools::log_to_write_txt(['获取科室问卷问题(一个问题对应多个答案) 入参:'=>input()]);
$api_desc = '获取科室问卷问题(一个问题对应多个答案)';
try {
$id = input('id');
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$question = input('question');
$is_common = input('is_common');
$is_only_boy = input('is_only_boy');
$is_only_girl = input('is_only_girl');
$type = input('type');
//$uniqueid = input('uniqueid');
//if(empty($uniqueid)){
// return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息uniqueid当次请求唯一标识不能为空,答题前获取api调用地址api/Common/getUniqueId']));
//}
$group = input('group');
$model_obj = Db::table(TabConf::$fa_hdrquestionnairequestion);
if(isset($group) && $group!=''){
$model_obj->whereLike('group',"%{$group}%");
}else{
$model_obj->where('group',$group);
}
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
if(input('question')){
$model_obj->where('question',input('question'));
}
if(input('is_common')){
$model_obj->where('is_common',input('is_common'));
}
if(input('is_only_boy')){
$model_obj->where('is_only_boy',input('is_only_boy'));
}
if(input('is_only_girl')){
$model_obj->where('is_only_girl',input('is_only_girl'));
}
if(input('type')){
$model_obj->where('type',input('type'));
}
//过滤已答过的题目
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
$ret_field_name_arr = Tools::delete_str_empty_ele('id--testname,hdrdepartment_id--name,,,,,,,');
//处理为外键字段+外键对应数据的字段名 egusers_id=>nickname
$ret_field_name2 = [];
foreach ($ret_field_name_arr as $ret_typ_field) {
$exp_arr = explode('--',$ret_typ_field);
//$exp_arr[0] 主表字段,$exp_arr[1] 副表字段
$ret_field_name2[$exp_arr[0]] = [$exp_arr[0],$exp_arr[1]];
}
//返回数据类型处理
$return_type_exp_arr = Tools::delete_str_empty_ele('id==two_arr,hdrdepartment_id==field_val,,,,,,,');
//处理为类型+字段
$return_type_exp_arr2 = [];
foreach ($return_type_exp_arr as $ret_type_field) {
$exp_arr = explode('==',$ret_type_field);
$return_type_exp_arr2[$exp_arr[0]] = $exp_arr[1];
}
//返回数组 eg: [id-fa_goods_deal==goods_id,id-fa_goods_deal==goods_id]
$rel_table_arr = Tools::delete_str_empty_ele('id-fa_hdrquestionnaireanswer==hdrquestionnairequestion_id,hdrdepartment_id-fa_hdrdepartment==id,,,,,,,');
//关联的字段和表
$rel_field_table_arr2 = [];
//关系
foreach ($rel_table_arr as $rel_str) {
$exp_arr = explode('-',$rel_str);
$rel_field_table_arr2[$exp_arr[0]] = [explode('==',$exp_arr[1])[0],explode('==',$exp_arr[1])[1]];
}
foreach($item as $it_key=>$it_val){
if(empty($rel_field_table_arr2[$it_key])){
continue;
}
foreach($return_type_exp_arr as $key=>$val){
$val_arr = explode('==',$val);
if($it_key == $val_arr[0]){
switch($val_arr[1]){
case 'two_arr':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->select();
break;
case 'one_arr':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->find();
break;
case 'field_val':
$item[$it_key.'_data'] = Db::table($rel_field_table_arr2[$it_key][0])->where("{$rel_field_table_arr2[$it_key][1]}",$it_val)->value("{$ret_field_name2[$it_key][1]}");
break;
}
}
}
}
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取科室问卷问题(一个问题对应多个答案).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc查询总数
* *
* api/Hdrquestionnairequestion/getHdrQuestionTotal
*
* 参数与查询裂变接口保持一致
*
* 返回总数
*
* authorwh
*/
function getHdrQuestionTotal(){
Tools::log_to_write_txt(['获取科室问卷问题(一个问题对应多个答案) 入参:'=>input()]);
$api_desc = '获取科室问卷问题(一个问题对应多个答案)';
try {
$id = input('id');
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$question = input('question');
$is_common = input('is_common');
$is_only_boy = input('is_only_boy');
$is_only_girl = input('is_only_girl');
$type = input('type');
//$uniqueid = input('uniqueid');
//if(empty($uniqueid)){
// return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息uniqueid当次请求唯一标识不能为空,答题前获取api调用地址api/Common/getUniqueId']));
//}
$group = input('group');
$model_obj = Db::table(TabConf::$fa_hdrquestionnairequestion);
if(isset($group) && $group!=''){
$model_obj->whereLike('group',"%{$group}%");
}else{
$model_obj->where('group',$group);
}
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
if(input('question')){
$model_obj->where('question',input('question'));
}
if(input('is_common')){
$model_obj->where('is_common',input('is_common'));
}
if(input('is_only_boy')){
$model_obj->where('is_only_boy',input('is_only_boy'));
}
if(input('is_only_girl')){
$model_obj->where('is_only_girl',input('is_only_girl'));
}
if(input('type')){
$model_obj->where('type',input('type'));
}
$data = $model_obj->count();
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取科室问卷问题(一个问题对应多个答案).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc根据id查询问题
*
* api/Hdrquestionnairequestion/findQuestionById
*
* 参数id 问题id
*
* authorwh
*/
function findQuestionById(){
return Mmodel::catchJson(function (){
$res = Db::table(TabConf::$fa_hdrquestionnairequestion)->where('id',input('id'))->find();
return Tools::set_ok('ok',$res);
});
}
}

View File

@@ -0,0 +1,194 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use think\Controller;
class Hdrregister extends BaseHttpApi
{
protected $controller_comments = '患者挂号列表(可重复挂号)';
/**
* 新增患者挂号列表(可重复挂号)
*
* 参数:
* date 挂号日期
* name 患者姓名(可重复挂号)
* doctor_name 医生名称
* age 病人年龄
* gender 病人性别
* phone 手机号
* qa_type 问答类型(患者定):1=自由问答,2=固定问答,3=健康问答
* ticket 对话凭据(便于查询)
* api/Hdrregister/addHdrregister
*/
function addHdrregister(){
Tools::log_to_write_txt(['新增患者挂号列表(可重复挂号)'=>input()]);
$api_desc = '新增患者挂号列表(可重复挂号)';
Db::startTrans();
try {
$date = input('date');
if(empty($date)){
return json(Tools::set_fail('参数错误.0'));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.1'));
}
$doctor_name = input('doctor_name');
if(empty($doctor_name)){
return json(Tools::set_fail('参数错误.2'));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.3'));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.4'));
}
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.5'));
}
$qa_type = input('qa_type');
$ticket = input('ticket');
if(empty($ticket)){
return json(Tools::set_fail('参数错误.7'));
}
$data = [
'date'=>$date?:'',
'name'=>$name?:'',
'doctor_name'=>$doctor_name?:'',
'age'=>$age?:'',
'gender'=>$gender?:'',
'phone'=>$phone?:'',
'qa_type'=>$qa_type?:'',
'ticket'=>$ticket?:'',
];
$dataid = Db::table(TabConf::$fa_hdrregister)->insertGetId($data);
//$this->operateLog('新增患者挂号列表(可重复挂号)',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增患者挂号列表(可重复挂号).异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc获取患者挂号列表(可重复挂号)
*
* api/Hdrregister/getHdrregisterList
*
* 参数:
* name 患者姓名(可重复挂号)
* phone 手机号
* id ID
* date 挂号日期
* name 患者姓名(可重复挂号)
* gender 病人性别
* phone 手机号
* status 状态:0=挂号中,1=结束诊断
* qa_type 问答类型(患者定):1=自由问答,2=固定问答,3=健康问答
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 挂号日期
* name 患者姓名(可重复挂号)
* doctor_name 医生名称
* age 病人年龄
* gender 病人性别
* phone 手机号
* create_time 创建时间
* status 状态:0=挂号中,1=结束诊断
* qa_type 问答类型(患者定):1=自由问答,2=固定问答,3=健康问答
* ticket 对话凭据(便于查询)
* authorwh
*/
function getHdrregisterList(){
Tools::log_to_write_txt(['获取患者挂号列表(可重复挂号) 入参:'=>input()]);
$api_desc = '获取患者挂号列表(可重复挂号)';
try {
$id = input('id');
$date = input('date');
$name = input('name');
$gender = input('gender');
$phone = input('phone');
$status = input('status');
$qa_type = input('qa_type');
$model_obj = Db::table(TabConf::$fa_hdrregister);
if(input('name')){
$model_obj->whereLike('name','%'.input('name').'%');
}
if(input('phone')){
$model_obj->whereLike('phone','%'.input('phone').'%');
}
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('date')){
$model_obj->where('date',input('date'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('gender')){
$model_obj->where('gender',input('gender'));
}
if(input('status')){
$model_obj->where('status',input('status'));
}
if(input('qa_type')){
$model_obj->where('qa_type',input('qa_type'));
}
$data = $model_obj->select();
if(empty($data)){
return json(Tools::set_ok('ok',$data));
}
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取患者挂号列表(可重复挂号).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,727 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
/**
* 数字人修改基本信息
*
* Class Hdruserbaseinfo
* @package app\api\controller
*/
class Hdruserbaseinfo extends BaseHttpApi
{
protected $controller_comments = '统一问诊用户基本信息';
/**
* desc获取统一问诊用户基本信息列表后台病历管理列表
*
* api/Hdruserbaseinfo/getHdruserbaseinfoList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* doctor 所属医生
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* create_time 创建时间
* is_flow 是否接受随访:yes=是,no=否
* authorwh
*/
function getHdruserbaseinfoList(){
Tools::log_to_write_txt(['获取统一问诊用户基本信息列表(后台病历管理列表) 入参:'=>input()]);
$api_desc = '获取统一问诊用户基本信息列表(后台病历管理列表)';
try {
$id = input('id');
$date = input('date');
$doctor = input('doctor');
$hdrdepartment_id = input('hdrdepartment_id');
$from = input('from');
$name = input('name');
$model_obj = Db::table(TabConf::$fa_tt_userbaseinfo);
if(input('doctor')){
$model_obj->whereLike('doctor','%'.input('doctor').'%');
}
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('date')){
$model_obj->where('date',input('date'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
if(input('from')){
$model_obj->where('from',input('from'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取统一问诊用户基本信息列表(后台病历管理列表).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc获取统一问诊用户基本信息详情后台病历管理详情
*
* api/Hdruserbaseinfo/getHdruserbaseinfoDetailById
*
* 参数:
* id ID ID 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* create_time 创建时间
* is_flow 是否接受随访:yes=是,no=否
* authorwh
*/
function getHdruserbaseinfoDetailById(){
Tools::log_to_write_txt(['获取统一问诊用户基本信息详情(后台病历管理详情) 入参:'=>input()]);
$api_desc = '获取统一问诊用户基本信息详情(后台病历管理详情)';
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_tt_userbaseinfo);
if(input('id')){
$model_obj->where('id',input('id'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取统一问诊用户基本信息详情(后台病历管理详情).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 根据id修改统一问诊用户基本信息
* 参数:
* id ID 【必须】
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* api/Hdruserbaseinfo/updateHdruserbaseinfoById
*/
function updateHdruserbaseinfoById(){
Tools::log_to_write_txt(['修改统一问诊用户基本信息'=>input()]);
$api_desc = '修改统一问诊用户基本信息';
Db::startTrans();
try {
$name = input('name');
$gender = input('gender');
$age = input('age');
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$phone = input('phone');
$wechat_no = input('wechat_no');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0',['error_msg'=>'错误信息id错误']));
}
//存在则修改
$data = [];
if($name){
$data['name'] = $name;
}
if($gender){
$data['gender'] = $gender;
}
if($age){
$data['age'] = $age;
}
if($edu){
$data['edu'] = $edu;
}
if($career_year){
$data['career_year'] = $career_year;
}
if($power){
$data['power'] = $power;
}
if($satisfaction){
$data['satisfaction'] = $satisfaction;
}
if($old_career_year){
$data['old_career_year'] = $old_career_year;
}
if($old_career_power){
$data['old_career_power'] = $old_career_power;
}
if($support){
$data['support'] = $support;
}
if($marriage){
$data['marriage'] = $marriage;
}
if($live){
$data['live'] = $live;
}
if($home){
$data['home'] = $home;
}
if($address){
$data['address'] = $address;
}
if($phone){
$data['phone'] = $phone;
}
if($wechat_no){
$data['wechat_no'] = $wechat_no;
}
$hdrdepartment = input('hdrdepartment');
if($hdrdepartment){
$data['hdrdepartment'] = $hdrdepartment;
}
$hdrdepartment_id = input('hdrdepartment_id');
if($hdrdepartment_id){
$data['hdrdepartment_id'] = $hdrdepartment_id;
}
$dataid = Db::table(TabConf::$fa_tt_userbaseinfo)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改统一问诊用户基本信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改统一问诊用户基本信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 新增统一问诊用户基本信息
*
* 参数:
* date 日期 【必须】
* doctor 所属医生 【必须】
* hdrdepartment_id 科室 【必须】
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊,doc_add=医生添加 【必须】
* name 病人姓名 【必须】
* gender 病人性别 【必须】
* age 病人年龄 【必须】
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式 【必须】
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* diagnosis 诊断
*/
function addHdruserbaseinfo(){
Tools::log_to_write_txt(['新增统一问诊用户基本信息'=>input()]);
$api_desc = '新增统一问诊用户基本信息';
Db::startTrans();
try {
$date = input('date');
if(empty($date)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'错误信息date错误']));
}
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息doctor错误']));
}
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$from = input('from');
if(empty($from)){
return json(Tools::set_fail('参数错误.3',['error_msg'=>'错误信息from错误']));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.4',['error_msg'=>'错误信息name错误']));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息gender错误']));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息age错误']));
}
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.18',['error_msg'=>'错误信息phone错误']));
}
$wechat_no = input('wechat_no');
$ticket = input('ticket');
$diagnosis = input('diagnosis');
$data = [
'date'=>$date?:'',
'doctor'=>$doctor?:'',
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'from'=>$from?:'',
'name'=>$name?:'',
'gender'=>$gender?:'',
'age'=>$age?:'',
'edu'=>$edu?:'',
'career_year'=>$career_year?:'',
'power'=>$power?:'',
'satisfaction'=>$satisfaction?:'',
'old_career_year'=>$old_career_year?:'',
'old_career_power'=>$old_career_power?:'',
'support'=>$support?:'',
'marriage'=>$marriage?:'',
'live'=>$live?:'',
'home'=>$home?:'',
'address'=>$address?:'',
'phone'=>$phone?:'',
'wechat_no'=>$wechat_no?:'',
'ticket'=>$ticket?:'',
'diagnosis'=>$diagnosis?:'',
];
$dataid = Db::table(TabConf::$fa_tt_userbaseinfo)->insertGetId($data);
//$this->operateLog('新增统一问诊用户基本信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增统一问诊用户基本信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc保存用户基本信息没有就新增
*
* * 参数:
* doctor 所属医生 【必须】
* hdrdepartment_id 科室 【必须】
* name 病人姓名 【必须】
* gender 病人性别 【必须】
* age 病人年龄 【必须】
* phone 图片识别联系方式
* user_phone 当前用户登录的手机号 【必须】
*
*
* authorwh
*/
function saveBaseinfo(){
Tools::log_to_write_txt(['保存用户基本信息,没有就新增'=>input()]);
$api_desc = '保存用户基本信息,没有就新增';
Db::startTrans();
try {
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.4',['error_msg'=>'错误信息name错误']));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息gender错误']));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息age错误']));
}
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.3',['error_msg'=>'错误信息doctor手机号错误']));
}
$hdrdepartment = input('hdrdepartment');
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.18',['error_msg'=>'错误信息phone错误']));
}
$data = [
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'name'=>$name?:'',
'gender'=>$gender?:'',
'age'=>$age?:'',
'phone'=>$phone?:'',
'hdrdepartment'=>$hdrdepartment?:'',
'user_phone'=>api_user_info('username')
];
//同步科室(没有则新增)
$department_data = [
'name'=>$hdrdepartment,
];
$insert_hdrdepartment_id = Mmodel::existsUpdateInsert(TabConf::$fa_hdrdepartment,[
'name'=>$hdrdepartment
],$department_data);
if($insert_hdrdepartment_id){
$data['hdrdepartment_id'] = $insert_hdrdepartment_id;
}
//同步基本信息到fa_tt_userbaseinfo表
$base_info_data = [
'date'=>Tools::get_now_date(),
'doctor'=>$doctor,
'hdrdepartment_id'=>$hdrdepartment_id,
'hdrdepartment'=>$hdrdepartment,
'name'=>$name,
'gender'=>$gender,
'age'=>$age,
'phone'=>$phone,
'user_phone'=>api_user_info('username'),
'from'=>'h5',
];
//只能新增基本信息,不能修改
$base_info_data_id = Db::table(TabConf::$fa_tt_userbaseinfo)
->insertGetId($base_info_data);
//$this->operateLog('保存用户基本信息,没有就新增',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',['base_info_data_id'=>$base_info_data_id]));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'保存用户基本信息,没有就新增.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc根据手机号码获取统一问诊用户基本信息查询最新的一条数据
*
* api/Hdruserbaseinfo/getHdruserbaseinfoByPhone
*
* 参数:
* phone 联系方式 【必须】
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* hdrdepartment_id 科室
* hdrdepartment 科室名称
* name 病人姓名
* gender 病人性别
* age 病人年龄
* phone 联系方式
* authorwh
*/
function getHdruserbaseinfoByPhone(){
Tools::log_to_write_txt(['根据手机号码获取统一问诊用户基本信息 入参:'=>input()]);
$api_desc = '根据手机号码获取统一问诊用户基本信息';
try {
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']));
}
$model_obj = Db::table(TabConf::$fa_ty_userbaseinfo);
$model_obj->order('id desc');
if(input('phone')){
$model_obj->where('user_phone',input('phone'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'根据手机号码获取统一问诊用户基本信息.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 基本信息读取
* 基本信息读取接口(传图片地址)
*
* 参数:
* phone 患者手机号码
*
* 文件上传控件name值设置为file_upload否则无法上传
*
*/
public function getBaseInfoUploadRead(){
return Mmodel::catchJson(function (){
//基本信息读取接口(传图片地址)【一张图片一个chatid】
$phone = input('phone');
if(empty($phone)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']);
}
$sessionid = input('sessionid');
if(empty($sessionid)){
return Tools::set_fail( '参数错误.1',['error_msg'=>'错误信息sessionid错误']);
}
$oss_config = config('aliyun_oss_config');
$file_obj = new FileUpload();
$file_res = $file_obj->fileUploadToAliCloudOss($oss_config);
Tools::log_to_write_txt(['文件上传结果'=>$file_res]);
if($file_res['code']!=200){
return Tools::set_fail($file_res['msg']);
}
$upload_data = $file_res['data'][0];
$upload_data['sessionid'] = $sessionid;
//保存图片信息,存在则更新
$hdruserbaseinfo_upload_id = Db::table(TabConf::$fa_hdruserbaseinfo_upload)
->insertGetId($upload_data);
//ai分析
$ai_config = config('basic_information_read_config');
$chatobj = new ChatGPT();
$chatobj->url = $ai_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $ai_config['APIKey'];
$answer_json_arr = [];
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
$sub_content_msg = [
[
"role" => "user",
"content" => [
[
"type" => "image_url",
"image_url" => [
"url" => $file_res['data'][0]['outer_req_url']
]
]
]
]
];
//chatGpt设置前置聊天上下文
$chatobj->setBefore($sub_content_msg);
$question = '';
//回答
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['请求gpt'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['gpt回复'=>$answer_json_arr]);
//保存处理结果
$answer_result = json_decode($answer_json_arr[0],true);
$ai_result_data = [
'result'=>$answer_result['choices'][0]['message']['content']
];
//保存ai分析结果
Db::table(TabConf::$fa_hdruserbaseinfo_upload)
->where('id',$hdruserbaseinfo_upload_id)
->data($ai_result_data)
->update();
unset($file_res['data'][0]['real_path']);
//返回分析结果
return Tools::set_ok('ok',['result'=>$answer_result['choices'][0]['message']['content'],'file_info'=>$file_res['data']]);
});
}
}

View File

@@ -0,0 +1,731 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
/**
* 听译用户基本信息
*
* Class Hdruserinfotingyi
* @package app\api\controller
*/
class Hdruserinfotingyi extends BaseHttpApi
{
protected $controller_comments = '统一问诊用户基本信息';
/**
* desc获取统一问诊用户基本信息列表后台病历管理列表
*
* api/Hdruserinfotingyi/getHdruserbaseinfoList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* doctor 所属医生
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* create_time 创建时间
* is_flow 是否接受随访:yes=是,no=否
* authorwh
*/
function getHdruserbaseinfoList(){
Tools::log_to_write_txt(['获取统一问诊用户基本信息列表(后台病历管理列表) 入参:'=>input()]);
$api_desc = '获取统一问诊用户基本信息列表(后台病历管理列表)';
try {
$id = input('id');
$date = input('date');
$doctor = input('doctor');
$hdrdepartment_id = input('hdrdepartment_id');
$from = input('from');
$name = input('name');
$model_obj = Db::table(TabConf::$fa_ty_userbaseinfo);
if(input('doctor')){
$model_obj->whereLike('doctor','%'.input('doctor').'%');
}
if(input('id')){
$model_obj->where('id',input('id'));
}
if(input('date')){
$model_obj->where('date',input('date'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
if(input('from')){
$model_obj->where('from',input('from'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取统一问诊用户基本信息列表(后台病历管理列表).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc获取统一问诊用户基本信息详情后台病历管理详情
*
* api/Hdruserinfotingyi/getHdruserbaseinfoDetailById
*
* 参数:
* id ID ID 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 日期
* doctor 所属医生
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* create_time 创建时间
* is_flow 是否接受随访:yes=是,no=否
* authorwh
*/
function getHdruserbaseinfoDetailById(){
Tools::log_to_write_txt(['获取统一问诊用户基本信息详情(后台病历管理详情) 入参:'=>input()]);
$api_desc = '获取统一问诊用户基本信息详情(后台病历管理详情)';
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_ty_userbaseinfo);
if(input('id')){
$model_obj->where('id',input('id'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取统一问诊用户基本信息详情(后台病历管理详情).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 根据id修改统一问诊用户基本信息
* 参数:
* id ID 【必须】
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* api/Hdruserinfotingyi/updateHdruserbaseinfoById
*/
function updateHdruserbaseinfoById(){
Tools::log_to_write_txt(['修改统一问诊用户基本信息'=>input()]);
$api_desc = '修改统一问诊用户基本信息';
Db::startTrans();
try {
$name = input('name');
$gender = input('gender');
$age = input('age');
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$phone = input('phone');
$wechat_no = input('wechat_no');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0',['error_msg'=>'错误信息id错误']));
}
//存在则修改
$data = [];
if($name){
$data['name'] = $name;
}
if($gender){
$data['gender'] = $gender;
}
if($age){
$data['age'] = $age;
}
if($edu){
$data['edu'] = $edu;
}
if($career_year){
$data['career_year'] = $career_year;
}
if($power){
$data['power'] = $power;
}
if($satisfaction){
$data['satisfaction'] = $satisfaction;
}
if($old_career_year){
$data['old_career_year'] = $old_career_year;
}
if($old_career_power){
$data['old_career_power'] = $old_career_power;
}
if($support){
$data['support'] = $support;
}
if($marriage){
$data['marriage'] = $marriage;
}
if($live){
$data['live'] = $live;
}
if($home){
$data['home'] = $home;
}
if($address){
$data['address'] = $address;
}
if($phone){
$data['phone'] = $phone;
}
if($wechat_no){
$data['wechat_no'] = $wechat_no;
}
$hdrdepartment = input('hdrdepartment');
if($hdrdepartment){
$data['hdrdepartment'] = $hdrdepartment;
}
$hdrdepartment_id = input('hdrdepartment_id');
if($hdrdepartment_id){
$data['hdrdepartment_id'] = $hdrdepartment_id;
}
$dataid = Db::table(TabConf::$fa_ty_userbaseinfo)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('修改统一问诊用户基本信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改统一问诊用户基本信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 新增统一问诊用户基本信息
*
* 参数:
* date 日期 【必须】
* doctor 所属医生 【必须】
* hdrdepartment_id 科室 【必须】
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊,doc_add=医生添加 【必须】
* name 病人姓名 【必须】
* gender 病人性别 【必须】
* age 病人年龄 【必须】
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式 【必须】
* wechat_no 微信号
* ticket 对话票据(数据隔离)
* diagnosis 诊断
*/
function addHdruserbaseinfo(){
Tools::log_to_write_txt(['新增统一问诊用户基本信息'=>input()]);
$api_desc = '新增统一问诊用户基本信息';
Db::startTrans();
try {
$date = input('date');
if(empty($date)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'错误信息date错误']));
}
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息doctor错误']));
}
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$from = input('from');
if(empty($from)){
return json(Tools::set_fail('参数错误.3',['error_msg'=>'错误信息from错误']));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.4',['error_msg'=>'错误信息name错误']));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息gender错误']));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息age错误']));
}
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.18',['error_msg'=>'错误信息phone错误']));
}
$wechat_no = input('wechat_no');
$ticket = input('ticket');
$diagnosis = input('diagnosis');
$data = [
'date'=>$date?:'',
'doctor'=>$doctor?:'',
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'from'=>$from?:'',
'name'=>$name?:'',
'gender'=>$gender?:'',
'age'=>$age?:'',
'edu'=>$edu?:'',
'career_year'=>$career_year?:'',
'power'=>$power?:'',
'satisfaction'=>$satisfaction?:'',
'old_career_year'=>$old_career_year?:'',
'old_career_power'=>$old_career_power?:'',
'support'=>$support?:'',
'marriage'=>$marriage?:'',
'live'=>$live?:'',
'home'=>$home?:'',
'address'=>$address?:'',
'phone'=>$phone?:'',
'wechat_no'=>$wechat_no?:'',
'ticket'=>$ticket?:'',
'diagnosis'=>$diagnosis?:'',
];
$dataid = Db::table(TabConf::$fa_tt_userbaseinfo)->insertGetId($data);
//$this->operateLog('新增统一问诊用户基本信息',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增统一问诊用户基本信息.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc保存用户基本信息没有就新增
*
* * 参数:
* doctor 所属医生 【必须】
* hdrdepartment_id 科室 【必须】
* name 病人姓名 【必须】
* gender 病人性别 【必须】
* age 病人年龄 【必须】
* phone 图片识别联系方式
* user_phone 当前用户登录的手机号 【必须】
*
*
* authorwh
*/
function saveBaseinfo(){
Tools::log_to_write_txt(['保存用户基本信息,没有就新增'=>input()]);
$api_desc = '保存用户基本信息,没有就新增';
Db::startTrans();
try {
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.4',['error_msg'=>'错误信息name错误']));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息gender错误']));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息age错误']));
}
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.3',['error_msg'=>'错误信息doctor手机号错误']));
}
$hdrdepartment = input('hdrdepartment');
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.18',['error_msg'=>'错误信息phone错误']));
}
$data = [
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'name'=>$name?:'',
'gender'=>$gender?:'',
'age'=>$age?:'',
'phone'=>$phone?:'',
'hdrdepartment'=>$hdrdepartment?:'',
'user_phone'=>api_user_info('username')
];
//同步科室(没有则新增)
$department_data = [
'name'=>$hdrdepartment,
];
$insert_hdrdepartment_id = Mmodel::existsUpdateInsert(TabConf::$fa_hdrdepartment,[
'name'=>$hdrdepartment
],$department_data);
if($insert_hdrdepartment_id){
$data['hdrdepartment_id'] = $insert_hdrdepartment_id;
}
//同步基本信息到fa_tt_userbaseinfo表
$base_info_data = [
'date'=>Tools::get_now_date(),
'doctor'=>$doctor,
'hdrdepartment_id'=>$hdrdepartment_id,
'hdrdepartment'=>$hdrdepartment,
'name'=>$name,
'gender'=>$gender,
'age'=>$age,
'phone'=>$phone,
'user_phone'=>api_user_info('username'),
'from'=>'h5',
];
//只能新增基本信息,不能修改
$base_info_data_id = Db::table(TabConf::$fa_ty_userbaseinfo)
->insertGetId($base_info_data);
Db::commit();
return json(Tools::set_ok('ok',['base_info_data_id'=>$base_info_data_id]));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'保存用户基本信息,没有就新增.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* desc根据手机号码获取统一问诊用户基本信息查询最新的一条数据
*
* api/Hdruserinfotingyi/getHdruserbaseinfoByPhone
*
* 参数:
* phone 联系方式 【必须】
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* hdrdepartment_id 科室
* hdrdepartment 科室名称
* name 病人姓名
* gender 病人性别
* age 病人年龄
* phone 联系方式
* authorwh
*/
function getHdruserbaseinfoByPhone(){
Tools::log_to_write_txt(['根据手机号码获取统一问诊用户基本信息 入参:'=>input()]);
$api_desc = '根据手机号码获取统一问诊用户基本信息';
try {
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']));
}
$model_obj = Db::table(TabConf::$fa_ty_userbaseinfo);
$model_obj->order('id desc');
if(input('phone')){
$model_obj->where('user_phone',input('phone'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'根据手机号码获取统一问诊用户基本信息.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 基本信息读取
* 基本信息读取接口(传图片地址)
*
* 参数:
* phone 患者手机号码
*
* 文件上传控件name值设置为file_upload否则无法上传
*
*/
public function getBaseInfoUploadRead(){
return Mmodel::catchJson(function (){
//基本信息读取接口(传图片地址)【一张图片一个chatid】
$phone = input('phone');
if(empty($phone)){
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息phone错误']);
}
$sessionid = input('sessionid');
if(empty($sessionid)){
return Tools::set_fail( '参数错误.1',['error_msg'=>'错误信息sessionid错误']);
}
//存在没有生成报告的上传的基本信息就删除
Db::table(TabConf::$fa_hdruserbaseinfo_upload)
->where('user_phone',$phone)
->where('status','new')
->delete();
$oss_config = config('aliyun_oss_config');
$file_obj = new FileUpload();
$file_res = $file_obj->fileUploadToAliCloudOss($oss_config);
Tools::log_to_write_txt(['文件上传结果'=>$file_res]);
if($file_res['code']!=200){
return Tools::set_fail($file_res['msg']);
}
$upload_data = $file_res['data'][0];
$upload_data['sessionid'] = $sessionid;
$upload_data['phone'] = $phone;
$upload_data['user_phone'] = $phone;
//保存图片信息,存在则更新
$hdruserbaseinfo_upload_id = Db::table(TabConf::$fa_hdruserbaseinfo_upload)
->insertGetId($upload_data);
//ai分析
$ai_config = config('basic_information_read_config');
$chatobj = new ChatGPT();
$chatobj->url = $ai_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $ai_config['APIKey'];
$answer_json_arr = [];
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
$sub_content_msg = [
[
"role" => "user",
"content" => [
[
"type" => "image_url",
"image_url" => [
"url" => $file_res['data'][0]['outer_req_url']
]
]
]
]
];
//chatGpt设置前置聊天上下文
$chatobj->setBefore($sub_content_msg);
$question = '';
//回答
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['请求gpt'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['gpt回复'=>$answer_json_arr]);
//保存处理结果
$answer_result = json_decode($answer_json_arr[0],true);
$ai_result_data = [
'result'=>$answer_result['choices'][0]['message']['content']
];
//保存ai分析结果
Db::table(TabConf::$fa_hdruserbaseinfo_upload)
->where('id',$hdruserbaseinfo_upload_id)
->data($ai_result_data)
->update();
unset($file_res['data'][0]['real_path']);
//返回分析结果
return Tools::set_ok('ok',['result'=>$answer_result['choices'][0]['message']['content'],'file_info'=>$file_res['data']]);
});
}
}

View File

@@ -0,0 +1,40 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/12} {17:01}
*/
namespace app\api\controller;
use app\api\logic\TychatLogic;
use wanghua\general_utility_tools_php\Mmodel;
/**
* @deprecated
* 健康洞察
*
* Class HealthInsights
* @package app\api\controller
*/
class HealthInsights
{
/**
* desc健康洞察
* 实时输出
*
* /api/HealthInsights/getHealthInsight
*
* authorwh
*/
function getHealthInsight(){
//return Mmodel::catch(function (){
// $obj = new TychatLogic();
// return $obj->getHealthInsight();
//});
}
}

View File

@@ -0,0 +1,413 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/12} {11:29}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* h5-数字人-报告
* Class Reporth5
* @package app\api\controller
*/
class Reporth5 extends BaseHttpApi
{
public function __construct()
{
//if(!Usersh5::checkLogin()){
// echo json_encode(['code'=>591,'msg'=>'未登录']);exit;
//}
}
/**
* desch5-数字人-生成听诊报告(同时提交固定问答聊天记录)
*
* api/Reporth5/createReport
*
* name 病人姓名
gender 病人性别
age 病人年龄
edu 教育程度
career_year 职业及年限
power 体力要求
satisfaction 经济满意度
old_career_year 过往职业及年限
support 社会支持度
marriage 婚姻状况
live 居住情况
home 家庭关系
address 地址
phone 联系方式
wechat_no 微信号
ticket 登录票据
hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
*
* content 对话内容;格式:
* $content = [
["role" => "user", "content" => '医生说xxxxx'],
["role" => "user", "content" => '患者说xxxxx'],
];
* authorwh
*/
function createReport(){
//header('Content-Type: text/event-stream');
//header('Cache-Control: no-cache');
//header('Connection: keep-alive');
//header('X-Accel-Buffering: no');
$uniqueid = input('uniqueid');
if(empty($uniqueid)){
return json(Tools::set_fail('uniqueid必须'));
}
Tools::log_to_write_txt(['input'=>input()]);
$config = config('ai_num_report_config');
$question = '';//input('question','');
$chatobj = new ChatGPT();
$chatobj->url = $config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $config['APIKey'];
$answer_json_arr = [];
$ticket = input('ticket');
if(empty($ticket)){
return json(Tools::set_fail('对话票据ticket必须(用于隔离用户聊天历史记录),登陆时返回票据,每次诊断结束重新生成票据!'));
}
if(empty(input('from'))){
return json(Tools::set_fail('from必须'));
}
$from = 'h5';
$qa_type = 'fix';
if(empty($qa_type)){
return json(Tools::set_fail('qa_type问答模式必须可选项问答模式:free=自由问答,fix=固定问答'));
}
//用户
$user = Db::table(TabConf::$fa_hdrusersh5)->where('ticket',$ticket)->find();
if(empty($user)){
return json(Tools::set_res(531,'用户不存在'));
}
//查询医生所属部门
$hdrdoctorusers = Db::table(TabConf::$fa_hdrdoctorusers)
->where('username',$user['doctor'])
->find();
if(empty($hdrdoctorusers)){
return json(Tools::set_fail('医生不存在'));
}
//部门id
$hdrdepartment_id = $hdrdoctorusers['hdrdepartment_id'];
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
//验证参数
if(empty(input('name'))){
return json(Tools::set_fail('name必须'));
}
if(empty(input('gender'))){
return json(Tools::set_fail('gender必须'));
}
if(empty(input('age'))){
return json(Tools::set_fail('age必须'));
}
if(empty(input('phone'))){
return json(Tools::set_fail('phone必须'));
}
if(empty(input('hdrdepartment_id'))){
return json(Tools::set_fail('hdrdepartment_id必须'));
}
$basedata = [
'name'=>input('name',''),//病人姓名
'gender'=>input('gender',''),//病人性别
'age'=>input('age',''),//病人年龄
'edu'=>input('edu',''),//教育程度
'career_year'=>input('career_year',''),//职业及年限
'power'=>input('power',''),//体力要求
'satisfaction'=>input('satisfaction',''),//经济满意度
'old_career_year'=>input('old_career_year',''),//过往职业及年限
'old_career_power'=>input('old_career_power',''),//过往体力要求
'support'=>input('support',''),//社会支持度
'marriage'=>input('marriage',''),//婚姻状况
'live'=>input('live',''),//居住情况
'home'=>input('home',''),//家庭关系
'address'=>input('address',''),//地址
'phone'=>input('phone',''),//联系方式
'wechat_no'=>input('wechat_no',''),//微信号
'from'=>$from,//来源
'ticket'=>$ticket,//登录票据'
'date'=>date('Y-m-d'),
'hdrdepartment_id'=>$hdrdepartment_id,//科室
];
//$uniqueid = md5(json_encode($basedata));
//查询报告
$report = Db::table('fa_tt_medical_report')
->where('uniqueid',$uniqueid)
->find();
if($report){
return json(Tools::set_fail('报告重复'));
}
$contentstr = input('content');
if(empty($contentstr)){
return json(Tools::set_fail('content必须'));
}
$content['name'] = '【姓名】:'.$basedata['name'];
$content['gender'] = '【性别】:'.$basedata['gender'];
$content['age'] = '【年龄】:'.$basedata['age'];
$content['edu'] = '【教育程度】:'.$basedata['edu'];
$content['career_year'] = '【职业及年限】:'.$basedata['career_year'];
$content['power'] = '【体力要求】:'.$basedata['power'];
$content['satisfaction'] = '【经济满意度】:'.$basedata['satisfaction'];
$content['old_career_year'] = '【过往职业及年限】:'.$basedata['old_career_year'];
$content['old_career_power'] = '【过往体力要求】:'.$basedata['old_career_power'];
$content['support'] = '【社会支持度】:'.$basedata['support'];
$content['marriage'] = '【婚姻状况】:'.$basedata['marriage'];
$content['live'] = '【居住情况】:'.$basedata['live'];
$content['home'] = '【家庭关系】:'.$basedata['home'];
$content['address'] = '【地址】:'.$basedata['address'];
$content['phone'] = '【联系方式】:'.$basedata['phone'];
$content['wechat_no'] = '【微信号】:'.$basedata['wechat_no'];
//
////设置基本信息
//$chatobj->setBefore($content);
$sub_content = json_decode($contentstr,true);
if(empty($sub_content)){
return json(Tools::set_fail('没有对话诊断信息'));
}
Tools::log_to_write_txt(['聊天记录content'=>$sub_content]);
//$content = [
// //["role" => "user", "content" => '']
//];
//$sub_content = array_merge($content,$sub_content);
$ctn_msg_str = implode('',array_column($sub_content,'content'));
foreach ($content as $val){
$ctn_msg_str .= ','.$val;
}
$sub_content_msg = [
["role" => "user", "content" => $ctn_msg_str]
];
//chatGpt设置前置聊天上下文
$chatobj->setBefore($sub_content_msg);
//回答
$chatobj->returnAnswer($question,$config,$answer_json_arr);
//dump($answer_json_arr);die;
$res_content = [];
$data = [];
Tools::log_to_write_txt(['gpt回复'=>$answer_json_arr]);
//把返回的报告保存起来
foreach ($answer_json_arr as $josn){
$item = json_decode($josn,true);
if(empty($item['choices'])){
return json(Tools::set_fail('choices is empty',$answer_json_arr));
}
$choices = $item['choices'];
foreach ($choices as $choice){
$data[] = [
'username'=>$hdrdoctorusers['username'],//登录的医生
'report_content'=>$choice['message']['content'],
'name'=>$basedata['name'],
'phone'=>$basedata['phone'],
];
$res_content[] = $choice['message']['content'];
}
}
if(empty($data)){
return json(Tools::set_fail('没有获取到报告'));
}
Db::startTrans();
try {
foreach ($data as $item){
//新增统一基本信息
$hdruserbaseinfo_id = Db::table('fa_tt_userbaseinfo')->insertGetId($basedata);
//只新增不修改
$userbaseinfo_id = Db::table('fa_tt_userbaseinfo')->insert($basedata);
//保存疼痛科聊天记录
$this->setTtChatHistory($sub_content,$hdrdoctorusers['username'],$hdruserbaseinfo_id,$userbaseinfo_id,$ticket);
$item['userbaseid'] = $userbaseinfo_id;
$item['hdruserbaseinfo_id'] = $hdruserbaseinfo_id;//统一病历基本信息ID
$item['hdrdepartment_id'] = $hdrdepartment_id;
$item['from'] = $from;//来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
$item['doctor'] = $hdrdoctorusers['name'];
$item['qa_type'] = $qa_type;
$item['uniqueid'] = $uniqueid;
//保存报告
Db::table('fa_tt_medical_report')->insert($item);
//日期
//$item['date'] = date('Y-m-d');
////统一存档(暂时不用)
//Db::table(TabConf::$fa_hdrmedical_report)->insert($item);
}
Db::commit();
return json(Tools::set_ok(['base_data'=>$content,'res_content'=>$res_content]));
}catch (\Exception $e){
Db::rollback();
Tools::error_txt_log($e);
return json(Tools::set_fail('新增报告失败.'.$e->getMessage()));
}
}
/**
* desc保存疼痛科聊天记录
* authorwh
* @param $sub_content
*/
private function setTtChatHistory($sub_content,$username,$hdruserbaseinfo_id,$userbaseinfo_id,$ticket){
//$content = [
// //["role" => "user", "content" => '']
//];
$data = [];
foreach ($sub_content as $item){
//$content = explode('',$item['content']);
$d = [
'username'=>$username,
//'type'=>empty($content[0])?'':$content[0],
'chat_msg'=>$item['content'],
'ticket'=>$ticket,
'userbaseinfo_id'=>$userbaseinfo_id,
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
'type'=>$item['type'],
];
$data[] = $d;
}
Db::table(TabConf::$fa_tt_chathistory)->insertAll($data);
}
/**
* desc查询报告详情
*
* api/Reporth5/getReportById
* 参数dataid 报告id
* ticket用户ticket
* authorwh
*/
function getReportById(){
return Mmodel::catchJson(function (){
$info = Db::table('fa_tt_medical_report')
->where('id',input('dataid'))
->find();
return Tools::set_ok($info);
});
}
/**
* desc查询报告列表
*
* api/Reporth5/getReportList
* 参数username
* ticket用户ticket
*
* authorwh
*/
function getReportList(){
return Mmodel::catchJson(function (){
$info = Db::table('fa_tt_medical_report')
->select();
return Tools::set_ok($info);
});
}
/**
* 修改报告
* api/Reporth5/editReport
* 参数dataid 报告数据id
name 病人姓名
gender 病人性别: M=男性, F=女性
age 病人年龄
main_complaint 主诉
medical_history 病史
past_history 既往史
allergy_history 过敏史
family_history 家族史
personal_history 个人史
menstrual_marital_history 月经婚育史
diagnosis 诊断
treatment 医嘱
*/
function editReport(){
return Mmodel::catchJson(function (){
//$ticket = input('ticket');
//if(empty($ticket)){
// return Tools::set_fail('ticket必须');
//}
//修改基本信息
$data = [
//'username'=>$hdrdoctorusers['username'],//医生
'name'=>input('name',''),//病人姓名
'gender'=>input('gender',''),//病人性别: M=男性, F=女性
'age'=>input('age',''),//病人年龄
'main_complaint'=>input('main_complaint',''),//主诉
'medical_history'=>input('medical_history',''),//病史
'past_history'=>input('past_history',''),//既往史
'allergy_history'=>input('allergy_history',''),//过敏史
'family_history'=>input('family_history',''),//家族史
'personal_history'=>input('personal_history',''),//个人史
'menstrual_marital_history'=>input('menstrual_marital_history',''),//月经婚育史
'diagnosis'=>input('diagnosis',''),//诊断
'treatment'=>input('treatment',''),//医嘱
];
//修改基本信息
Mmodel::existsUpdateInsert('fa_tt_userbaseinfo',[
//'username'=>input('username',''),
'name'=>input('name',''),
],$data);
//修改报告
$str = <<<EOF
【姓名】:{$data['name']}
【年龄】:{$data['age']}
【性别】:{$data['gender']}
【主诉】:{$data['main_complaint']}
【病史】:{$data['medical_history']}
【既往史】:{$data['past_history']}
【过敏史】:{$data['allergy_history']}
【家族史】:{$data['family_history']}
【个人史】:{$data['personal_history']}
【月经婚育史】:{$data['menstrual_marital_history']}
【诊断】:{$data['diagnosis']}
【医嘱】:{$data['treatment']}
EOF;
$dataid = input('dataid');
if(empty($dataid)){
return Tools::set_fail('dataid必须');
}
Db::table('fa_tt_medical_report')
->where('id',$dataid)
->data(['report_content'=>$str])
->update();
return Tools::set_ok();
});
}
}

View File

@@ -0,0 +1,462 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/12} {11:29}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
/**
* 疼痛科-数字人-报告
* Class Reporttt
* @package app\api\controller
*/
class Reporttt extends BaseHttpApi
{
/**
* desc疼痛科-数字人-生成听诊报告(同时提交固定问答聊天记录)
*
* api/Reporttt/createReport
* username 用户名
*
* name 病人姓名
gender 病人性别
age 病人年龄
edu 教育程度
career_year 职业及年限
power 体力要求
satisfaction 经济满意度
old_career_year 过往职业及年限
support 社会支持度
marriage 婚姻状况
live 居住情况
home 家庭关系
address 地址
phone 联系方式
wechat_no 微信号
ticket 对话票据
hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* hdrdepartment 科室名称
*
* content 对话内容;格式:
* $content = [
["role" => "user", "content" => '医生说xxxxx'],
["role" => "user", "content" => '患者说xxxxx'],
];
* authorwh
*/
function createReport(){
//header('Content-Type: text/event-stream');
//header('Cache-Control: no-cache');
//header('Connection: keep-alive');
//header('X-Accel-Buffering: no');
Tools::log_to_write_txt(['input'=>input()]);
$report_config = config('ai_num_report_config');
$h5_login_user_phone = input('h5_login_user_phone');//h5端上传附件登录号码
//if (empty($h5_login_user_phone)){
// return json(Tools::set_fail('h5_login_user_phone必须','使用h5端上传附件那个号码'));
//}
$question = '';//input('question','');
$chatobj = new ChatGPT();
$chatobj->url = $report_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $report_config['APIKey'];
$answer_json_arr = [];
$ticket = input('ticket');
if(empty($ticket)){
return json(Tools::set_fail('对话票据ticket必须(用于隔离用户聊天历史记录),登陆时返回票据,每次诊断结束重新生成票据!'));
}
if(empty(input('from'))){
return json(Tools::set_fail('from必须'));
}
$from = input('from');
$qa_type = input('qa_type');
if($from=='h5'){
$qa_type = 'fix';
}
if(empty($qa_type)){
return json(Tools::set_fail('qa_type问答模式必须可选项问答模式:free=自由问答,fix=固定问答'));
}
$user = Db::table('fa_hdrdoctorusers')->where('ticket',$ticket)->find();
if(empty($user)){
return json(Tools::set_res(531,'医生不存在,请登录'));
}
$hdrdepartment_id = input('hdrdepartment_id');
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
//验证参数
if(empty(input('name'))){
return json(Tools::set_fail('name必须'));
}
if(empty(input('gender'))){
return json(Tools::set_fail('gender必须'));
}
if(empty(input('age'))){
return json(Tools::set_fail('age必须'));
}
if(empty(input('phone'))){
return json(Tools::set_fail('phone必须'));
}
if(!Validate::is_mobile(input('phone'))){
return json(Tools::set_fail('phone格式错误'));
}
//if(empty(input('hdrdepartment_id'))){
// return json(Tools::set_fail('hdrdepartment_id必须'));
//}
$basedata = [
'name'=>input('name',''),//病人姓名
'gender'=>input('gender',''),//病人性别
'age'=>input('age',''),//病人年龄
'edu'=>input('edu',''),//教育程度
'career_year'=>input('career_year',''),//职业及年限
'power'=>input('power',''),//体力要求
'satisfaction'=>input('satisfaction',''),//经济满意度
'old_career_year'=>input('old_career_year',''),//过往职业及年限
'old_career_power'=>input('old_career_power',''),//过往体力要求
'support'=>input('support',''),//社会支持度
'marriage'=>input('marriage',''),//婚姻状况
'live'=>input('live',''),//居住情况
'home'=>input('home',''),//家庭关系
'address'=>input('address',''),//地址
'phone'=>input('phone',''),//联系方式
'wechat_no'=>input('wechat_no',''),//微信号
'from'=>$from,//来源
'ticket'=>$ticket,//对话票据'
'date'=>date('Y-m-d'),
'hdrdepartment_id'=>$hdrdepartment_id,//科室
];
$contentstr = input('content');//对话记录
if(empty($contentstr)){
return json(Tools::set_fail('content必须'));
}
$content['name'] = "\n\n".'【姓名】:'.$basedata['name'];
$content['gender'] = '【性别】:'.$basedata['gender'];
$content['age'] = '【年龄】:'.$basedata['age'];
$content['edu'] = '【教育程度】:'.$basedata['edu'];
$content['career_year'] = '【职业及年限】:'.$basedata['career_year'];
$content['power'] = '【体力要求】:'.$basedata['power'];
$content['satisfaction'] = '【经济满意度】:'.$basedata['satisfaction'];
$content['old_career_year'] = '【过往职业及年限】:'.$basedata['old_career_year'];
$content['old_career_power'] = '【过往体力要求】:'.$basedata['old_career_power'];
$content['support'] = '【社会支持度】:'.$basedata['support'];
$content['marriage'] = '【婚姻状况】:'.$basedata['marriage'];
$content['live'] = '【居住情况】:'.$basedata['live'];
$content['home'] = '【家庭关系】:'.$basedata['home'];
$content['address'] = '【地址】:'.$basedata['address'];
$content['phone'] = '【联系方式】:'.$basedata['phone'];
$content['wechat_no'] = '【微信号】:'.$basedata['wechat_no'];
//
////设置基本信息
//$chatobj->setBefore($content);
$sub_content = json_decode($contentstr,true);
if(empty($sub_content)){
return json(Tools::set_fail('没有对话诊断信息'));
}
//Tools::log_to_write_txt(['聊天记录content'=>$sub_content]);
//$sub_content = array_merge($content,$sub_content);
$ctn_msg_str = implode('',array_column($sub_content,'content'));
foreach ($content as $val){
$ctn_msg_str .= ','.$val;
}
$report_ai_content = '';
//$last_file_report = [];
//if($h5_login_user_phone){
//查询最新的附件
$last_file_report = Db::table(TabConf::$fa_drugs_images_medical_result)
->where('reportid','eq','')
->field('id,reportid,ai_result')
->where('phone',$h5_login_user_phone?$h5_login_user_phone:$basedata['phone'])
->select();
foreach ($last_file_report as $val){
if($report_ai_content){
$report_ai_content.= ',';
}
$report_ai_content .= $val['ai_result']?$val['ai_result']:'';
}
//}
//追加附件
$ctn_msg_str .= <<<EOF
【附件】:{$report_ai_content}
EOF;
$sub_content_msg = [
["role" => "user", "content" => $ctn_msg_str]
];
//chatGpt设置前置聊天上下文
$chatobj->setBefore($sub_content_msg);
//回答
$chatobj->returnAnswer($question,$config,$answer_json_arr);
//dump($answer_json_arr);die;
$res_content = [];
$data = [];
Tools::log_to_write_txt(['请求gpt'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['gpt回复'=>$answer_json_arr]);
//把返回的报告保存起来
foreach ($answer_json_arr as $josn){
$item = json_decode($josn,true);
if(empty($item['choices'])){
return json(Tools::set_fail('choices is empty',$answer_json_arr));
}
$choices = $item['choices'];
foreach ($choices as $choice){
$data[] = [
'username'=>$user['username'],//登录的医生
'report_content'=>$choice['message']['content'],
'name'=>$basedata['name'],
'phone'=>$basedata['phone'],
];
$res_content[] = $choice['message']['content'];
}
}
if(empty($data)){
return json(Tools::set_fail('没有获取到报告'));
}
try {
$medical_report_id = '';
foreach ($data as $item){
//只新增不修改
$userbaseinfo_id = Db::table('fa_tt_userbaseinfo')->insert($basedata);
//表示用户信息从h5里面查询而来
if($h5_login_user_phone){//存在表示是通过搜索手机号进入数字人的
$baseuserinfo = Db::table(TabConf::$fa_ty_userbaseinfo)
->where('phone',$h5_login_user_phone)
->order('id desc')
->find();
if(empty($baseuserinfo)){
return json(Tools::set_fail('没有查询到用户信息'));
}
// 科室名称
$basedata['hdrdepartment'] = input('hdrdepartment','');
////修改
//Db::table(TabConf::$fa_tt_userbaseinfo)
// ->where('id',$baseuserinfo['id'])
// ->data($basedata)
// ->update();
$hdruserbaseinfo_id = $baseuserinfo['id'];
}else{
//新增统一基本信息
$basedata['hdrdepartment'] = input('hdrdepartment','');
$hdruserbaseinfo_id = Db::table(TabConf::$fa_tt_userbaseinfo)->insertGetId($basedata);
}
$item['userbaseid'] = $userbaseinfo_id;
$item['hdruserbaseinfo_id'] = $hdruserbaseinfo_id;//统一病历基本信息ID
$item['hdrdepartment_id'] = $hdrdepartment_id;
$item['from'] = $from;//来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
$item['doctor'] = $user['name'];
$item['qa_type'] = $qa_type;
$tmp_data = array_merge($item,$basedata);
//保存报告
$medical_report_id = Db::table('fa_tt_medical_report')->insertGetId($tmp_data);
//日期
//$item['date'] = date('Y-m-d');
//保存疼痛科聊天记录【对话记录跟着报告走】
$this->setTtChatHistory($sub_content,$user['username'],$hdruserbaseinfo_id,$userbaseinfo_id,$ticket,$medical_report_id);
////统一存档(暂时不用)
//Db::table(TabConf::$fa_hdrmedical_report)->insert($item);
}
//循环修改报告id
foreach ($last_file_report as $item_info){
Db::table(TabConf::$fa_drugs_images_medical_result)
->where('id',$item_info['id'])
->data(['reportid'=>$medical_report_id])
->update();
}
return json(Tools::set_ok(['base_data'=>$content,'res_content'=>$res_content,'medical_report_id'=>$medical_report_id]));
}catch (\Exception $e){
Tools::error_txt_log($e);
return json(Tools::set_fail('新增报告失败.'.$e->getMessage()));
}
}
/**
* desc保存疼痛科聊天记录
* authorwh
* @param $sub_content
*/
private function setTtChatHistory($sub_content,$username,$hdruserbaseinfo_id,$userbaseinfo_id,$ticket,$reportid){
//$content = [
// //["role" => "user", "content" => '']
//];
$data = [];
foreach ($sub_content as $item){
$content = explode('',$item['content']);
$d = [
'username'=>$username,
'type'=>empty($content[0])?'':$content[0],
'chat_msg'=>$item['content'],
'ticket'=>$ticket,
'userbaseinfo_id'=>$userbaseinfo_id,
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
'reportid'=>$reportid,
];
$data[] = $d;
}
Db::table(TabConf::$fa_tt_chathistory)->insertAll($data);
}
/**
* desc查询报告详情
*
* api/Reporttt/getReportById
* 参数dataid 报告id
* ticket用户ticket
* authorwh
*/
function getReportById(){
return Mmodel::catchJson(function (){
$info = Db::table('fa_tt_medical_report')
->where('id',input('dataid'))
->find();
return Tools::set_ok($info);
});
}
/**
* desc查询报告列表
*
* api/Reporttt/getReportList
* 参数phone
*
* authorwh
*/
function getReportList(){
return Mmodel::catchJson(function (){
$phone = input('phone');
if(empty( $phone)){
return Tools::set_fail( 'phone is empty');
}
$info = Db::table('fa_tt_medical_report')
->where('phone',$phone)
->select();
foreach ($info as &$item){
$item['hdruserbaseinfo_id_data'] = Db::table(TabConf::$fa_tt_userbaseinfo)
->where('id',$item['hdruserbaseinfo_id'])
->find();
}
return Tools::set_ok($info);
});
}
/**
* 修改报告
* api/Reporttt/editReport
* 参数dataid 报告数据id
name 病人姓名
gender 病人性别: M=男性, F=女性
age 病人年龄
main_complaint 主诉
medical_history 病史
past_history 既往史
allergy_history 过敏史
family_history 家族史
personal_history 个人史
menstrual_marital_history 月经婚育史
diagnosis 诊断
treatment 医嘱
*/
// function editReport(){
// return Mmodel::catchJson(function (){
// $dataid = input('dataid');
// if(empty($dataid)){
// return Tools::set_fail('dataid必须');
// }
// //$ticket = input('ticket');
// //if(empty($ticket)){
// // return Tools::set_fail('ticket必须');
// //}
// //修改基本信息
// $data = [
// //'username'=>$user['username'],//医生
// 'name'=>input('name',''),//病人姓名
// 'gender'=>input('gender',''),//病人性别: M=男性, F=女性
// 'age'=>input('age',''),//病人年龄
// 'main_complaint'=>input('main_complaint',''),//主诉
// 'medical_history'=>input('medical_history',''),//病史
// 'past_history'=>input('past_history',''),//既往史
// 'allergy_history'=>input('allergy_history',''),//过敏史
// 'family_history'=>input('family_history',''),//家族史
// 'personal_history'=>input('personal_history',''),//个人史
// 'menstrual_marital_history'=>input('menstrual_marital_history',''),//月经婚育史
// 'diagnosis'=>input('diagnosis',''),//诊断
// 'treatment'=>input('treatment',''),//医嘱
// ];
// //查询报告
// $report = Db::table('fa_tt_medical_report')
// ->where('id',$dataid)
// ->find();
// if(empty($report)){
// return Tools::set_fail('报告不存在');
// }
//
// //修改基本信息
// //Mmodel::existsUpdateInsert('fa_tt_userbaseinfo',[
// // 'id'=>$report['userbaseid'],
// //],$data);
//
// //修改报告
// $str = <<<EOF
//【姓名】:{$data['name']}
//【年龄】:{$data['age']}
//【性别】:{$data['gender']}
//【主诉】:{$data['main_complaint']}
//【病史】:{$data['medical_history']}
//【既往史】:{$data['past_history']}
//【过敏史】:{$data['allergy_history']}
//【家族史】:{$data['family_history']}
//【个人史】:{$data['personal_history']}
//【月经婚育史】:{$data['menstrual_marital_history']}
//【诊断】:{$data['diagnosis']}
//【医嘱】:{$data['treatment']}
//EOF;
//
//
//
// Db::table('fa_tt_medical_report')
// ->where('id',$dataid)
// ->data(['report_content'=>$str])
// ->update();
//
// return Tools::set_ok();
// });
// }
}

View File

@@ -0,0 +1,442 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/12} {11:29}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* 听译-报告
* Class Reportty
* @package app\api\controller
*/
class Reportty extends BaseHttpApi
{
/**
* desc听译-生成听诊报告
*
* api/Reportty/createReport
* 参数ticket
* from 来源
* client_id
*
* authorwh
*/
function createReport(){
Tools::log_to_write_txt(['input'=>input()]);
//header('Content-Type: text/event-stream');
//header('Cache-Control: no-cache');
//header('Connection: keep-alive');
//header('X-Accel-Buffering: no');
$config = config('ai_listen_report_config');
//$question = '';//input('question','');
$chatobj = new ChatGPT();
$chatobj->url = $config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $config['APIKey'];
$answer_json_arr = [];
//医生登录的ticket
$qa_chat_ticket = input('ticket');
if(empty($qa_chat_ticket)){
return json(Tools::set_fail('qa_chat_ticket必须'));
}
$phone = input('phone');//患者手机号
if (empty($phone)){
return json(Tools::set_fail('患者手机号必须'));
}
//医生开始对话的token
$say_token = input('say_token');
if(empty($say_token)){
return json(Tools::set_fail('say_token必须'));
}
$user = Db::table('fa_hdrdoctorusers')->where('qa_chat_ticket',$qa_chat_ticket)->find();
if(empty($user)){
return json(Tools::set_fail('医生不存在请确认qa_chat_ticket'));
}
//$before_report_dataid = input('before_report_dataid');//上一次生成的疼痛科报告id
//$before_report_content = '';
//$base_info = [];
//if($before_report_dataid){
// $before_report = Db::table('fa_tt_medical_report')
// ->where('id',$before_report_dataid)
// ->find();
// if($before_report){
// $before_report_content = $before_report['report_content'];
// //查询基本信息
// $base_info = Db::table(TabConf::$fa_tt_userbaseinfo)
// ->where('id',$before_report['hdruserbaseinfo_id'])
// ->find();
// }
//}
$gender = input('sex');
if(empty($gender)){
return json(Tools::set_fail('性别必须'));
}
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('姓名必须'));
}
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('hdruserbaseinfo_id必须'));
}
//查询历史聊天记录
$his_record = Db::table('fa_ty_chathistory')
->where('say_token',$say_token)
->order('id asc')
->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
//->where('createtime','>',$day3)//3天之内
->select();
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
//必须
$reportid = input('reportid');
if(empty($reportid)){
return json(Tools::set_fail('数字人的报告id必修'));
}
//查询数字人报告
$report = Db::table(TabConf::$fa_tt_medical_report)
->where('id',$reportid)
->find();
if(empty($report)){
return json(Tools::set_fail('数字人报告不存在'));
}
$body_check = input('body_check');
if(empty($body_check)){
return json(Tools::set_fail('体格检查必须'));
}
//设置之前的报告内容
//$content = [
// ["role" => "user", "content" => $before_report_content]
//];
//添加性别
//if($gender){
// $content[] = ["role" => "user", "content" => '【性别】:'.$gender];
//}
//$age = $report['age'];
//$edu = $report['edu'];
//$career_year = $report['career_year'];
//$power = $report['power'];
//$satisfaction = $report['satisfaction'];
//$old_career_year = $report['old_career_year'];
//$old_career_power = $report['old_career_power'];
//$support = $report['support'];
//$marriage = $report['marriage'];
//$live = $report['live'];
//构建基本信息
//$content[] = ["role" => "user", "content" => "\n\n".'【病人姓名】:'.$name];
//$content[] = ["role" => "user", "content" => '【病人性别】:'.$gender];
//$content[] = ["role" => "user", "content" => '【病人年龄】:'.$age];
//$content[] = ["role" => "user", "content" => '【教育程度】:'.$edu];
//$content[] = ["role" => "user", "content" => '【职业及年限】:'.$career_year];
//$content[] = ["role" => "user", "content" => '【体力要求】:'.$power];
//$content[] = ["role" => "user", "content" => '【经济满意度】:'.$satisfaction];
//$content[] = ["role" => "user", "content" => '【过往职业及年限】:'.$old_career_year];
//$content[] = ["role" => "user", "content" => '【过往职业体力要求】:'.$old_career_power];
//$content[] = ["role" => "user", "content" => '【社会支持度】:'.$support];
//$content[] = ["role" => "user", "content" => '【婚姻状况】:'.$marriage];
//$content[] = ["role" => "user", "content" => '【居住情况】:'.$live];
//对话记录
$chat_his = "\n\n";
foreach ($his_record as $item){
//$content[] = ["role" => "user", "content" => "\n\n".$item['chat_msg']];
$chat_his .= $item['chat_msg']."\n";
}
//$sub_content_msg = [
// ["role" => "user", "content" => implode('',array_column($content,'content'))]
//];
//$chatobj->setBefore($sub_content_msg);
$num_per_report = $report['report_content'];
//数字人报告+对话记录
$question = <<<EOF
【对话记录】
$chat_his
【病例报告】
$num_per_report
【体格检查】
{$body_check}
EOF;
//$question = $num_per_report;
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['听译生成报告请求gpt:'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['听译生成报告gpt回复:'=>$answer_json_arr]);
$res_content = [];
//把返回的报告保存起来
foreach ($answer_json_arr as $josn){
$item = json_decode($josn,true);
$choices = $item['choices'];
foreach ($choices as $choice){
$data = [
'doctor'=>$user['username'],
//病人
'report_content'=>$choice['message']['content'],
'ticket'=>$qa_chat_ticket,
'from'=>input('from','ty'),//来源
'name'=>$name,
'gender'=>$gender,
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
'username'=>$phone,
'userbaseid'=>$report['userbaseid'],
//'diagnostic_result'=>$report['diagnostic_result'],
//'create_time'=>$report['create_time'],
'age'=>$report['age'],
'main_complaint'=>$report['main_complaint'],
'medical_history'=>$report['medical_history'],
'past_history'=>$report['past_history'],
'allergy_history'=>$report['allergy_history'],
'family_history'=>$report['family_history'],
'personal_history'=>$report['personal_history'],
'menstrual_marital_history'=>$report['menstrual_marital_history'],
'diagnosis'=>$report['diagnosis'],
'treatment'=>$report['treatment'],
'phone'=>$report['phone'],
'status'=>$report['status'],
//'user_phone'=>$report['user_phone'],
'date'=>$report['date'],//
'hdrdepartment_id'=>$report['hdrdepartment_id'],
'hdrdepartment'=>$report['hdrdepartment'],
'edu'=>$report['edu'],
'career_year'=>$report['career_year'],
'power'=>$report['power'],
'satisfaction'=>$report['satisfaction'],
'old_career_year'=>$report['old_career_year'],
'old_career_power'=>$report['old_career_power'],
'support'=>$report['support'],
'marriage'=>$report['marriage'],
'live'=>$report['live'],
'home'=>$report['home'],
'address'=>$report['address'],
'wechat_no'=>$report['wechat_no'],
//'is_flow'=>$report['is_flow'],
];
$report_id = Db::table('fa_ty_medical_report')->insertGetId($data);
//日期
//$data['date'] = date('Y-m-d');
//【对话记录跟着报告走】
Db::table(TabConf::$fa_ty_chathistory)
->where('say_token',$qa_chat_ticket)
->data(['reportid'=>$report_id])
->update();
$res_content[] = ['report_id'=>$report_id,'report_content'=>$choice['message']['content']];
}
}
$client_id = input('client_id');
if(empty($client_id)){
return json(Tools::set_fail('client_id必须'));
}
//查询广播客户端id
$arr = Db::table('fa_device')
->where('ticket',$qa_chat_ticket)
->select();
$clientid_arr = array_column($arr,'clientid');
$json = Tools::wss_json_ok('Reportty/createReport','ok',['flow_code'=>'create_report_end']);
Gateway::sendToAll($json,$clientid_arr,[$client_id]);
return json(Tools::set_ok($res_content));
}
/**
* desc查询报告详情
*
* api/Reportty/getReportById
* 参数dataid 报告id
* ticket用户ticket
* authorwh
*/
function getReportById(){
return Mmodel::catchJson(function (){
$info = Db::table('fa_ty_medical_report')
->where('id',input('dataid'))
->find();
return Tools::set_ok($info);
});
}
/**
* desc查询报告列表
*
* api/Reportty/getReportList
* 参数phone
*
*
* authorwh
*/
function getReportList(){
return Mmodel::catchJson(function (){
$phone = input('phone');
$obj = Db::table('fa_ty_medical_report');
if($phone){
$obj->where('username',$phone);
}
$info = $obj->select();
return Tools::set_ok($info);
});
}
/**
* 修改报告
* api/Reportty/editReport
* 参数dataid 报告数据id
* username 医生登录账号(必须)
name 病人姓名
gender 病人性别: M=男性, F=女性
age 病人年龄
main_complaint 主诉
medical_history 病史
past_history 既往史
allergy_history 过敏史
family_history 家族史
personal_history 个人史
menstrual_marital_history 月经婚育史
diagnosis 诊断
treatment 医嘱
ticket 对话票据
hdrdepartment_id 科室
*/
function editReport(){
return Mmodel::catchJson(function (){
$qa_chat_ticket = input('ticket');
if(empty($qa_chat_ticket)){
return Tools::set_fail('qa_chat_ticket必须');
}
if(empty(input('username'))){
return Tools::set_fail('医生登录账号必须');
}
if(empty(input('name',''))){
return Tools::set_fail('病人姓名必须');
}
if(empty(input('phone',''))){
return Tools::set_fail('病人手机号必须');
}
if(empty(input('diagnosis'))){
return Tools::set_fail('diagnosis诊断内容必须');
}
if(empty(input('gender'))){
return Tools::set_fail('gender必须');
}
//听译问诊-患者病历信息
$data = [
'username'=>input('username'),//医生
'name'=>input('name',''),//病人姓名
'gender'=>input('gender',''),//病人性别: M=男性, F=女性
'age'=>input('age',''),//病人年龄
'main_complaint'=>input('main_complaint','无'),//主诉
'medical_history'=>input('medical_history','无'),//病史
'past_history'=>input('past_history','无'),//既往史
'allergy_history'=>input('allergy_history','无'),//过敏史
'family_history'=>input('family_history','无'),//家族史
'personal_history'=>input('personal_history','无'),//个人史
'menstrual_marital_history'=>input('menstrual_marital_history','无'),//月经婚育史
'diagnosis'=>input('diagnosis','无'),//诊断
'treatment'=>input('treatment','无'),//医嘱
'ticket'=>$qa_chat_ticket,
'hdrdepartment_id'=>input('hdrdepartment_id'),//科室
];
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty(input('hdruserbaseinfo_id'))){
return Tools::set_fail('hdruserbaseinfo_id必须');
}
//医生开始对话的token
$say_token = input('say_token');
if(empty($say_token)){
return Tools::set_fail('say_token必须');
}
//查询统一基本信息
$base_info = Db::table('fa_tt_userbaseinfo')
->where('id',$hdruserbaseinfo_id)
->find();
//校验
if(empty($base_info)){
return Tools::set_fail('统一基本信息不存在');
}
//修改历史记录的hdruserbaseinfo_id
Db::table('fa_ty_chathistory')
->where('say_token',$say_token)
->update(['hdruserbaseinfo_id'=>$hdruserbaseinfo_id]);
//听译问诊-患者病历信息
$medicalrecord = Db::table('fa_ty_userbaseinfo')
->where('name',input('name',''))
->find();
if(empty($medicalrecord)){
$data['ticket'] = $qa_chat_ticket;
//新增听译病历信息
$userbaseid = Db::table('fa_ty_userbaseinfo')->insertGetId($data);
}else{
$userbaseid = $medicalrecord['id'];
Db::table('fa_ty_userbaseinfo')
->where('ticket',$qa_chat_ticket)
->update($data);
}
$rehabilitation_advice = input('rehabilitation_advice','无');//康复建议
$test_advice = input('test_advice','无');//检测建议
//修改报告
$str = <<<EOF
【主诉】:{$data['main_complaint']}
【病史】:{$data['medical_history']}
【个人史】:{$data['personal_history']}
【婚姻史】:{$data['menstrual_marital_history']}
【家族史】:{$data['family_history']}
【诊断】:{$data['diagnosis']}
【康复建议】:{$rehabilitation_advice}
【检查建议】:{$test_advice}
EOF;
$dataid = input('dataid');
if(empty($dataid)){
return Tools::set_fail('dataid必须');
}
Db::table('fa_ty_medical_report')
->where('id',$dataid)
->data([
//病历信息id
'userbaseid'=>$userbaseid,//创建报告的时候这个字段是空,修改报告再补填这个字段
'report_content'=>$str,
'name'=>$data['name'],
'gender'=>$data['gender'],
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,//统一病历基本信息ID
])
->update();
return Tools::set_ok();
});
}
}

View File

@@ -0,0 +1,88 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/10/21} {14:52}
*/
namespace app\api\controller;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
class Service extends BaseHttpApi
{
/**
* desc文本转语音
*
* 语音转换服务
*
* api/Service/azurettsAudio
*
* 参数:
* text: 文本内容
*
* authorwh
*/
public function azurettsAudio()
{
$text = input('text','Bagaimana keadaan pernafasan anda?');
$data_raw = input('data_raw','ms-MY');
$data_neural = input('data_neural','YasminNeural');
$service_config = config('voice_to_text_service');
//回答
$url = $service_config['base_url'];//"https://eastasia.tts.speech.microsoft.com/cognitiveservices/v1";
$subscriptionKey = $service_config['APIKey'];//"090287baa7b14fcfb060a70bd1863f2f";
$outputFormat = "audio-48khz-192kbitrate-mono-mp3";
$xmlContent = <<<XML
<?xml version='1.0'?>
<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='{$data_raw}'>
<voice name='{$data_raw}-{$data_neural}'>
{$text}
</voice>
</speak>
XML;
$options = array(
'http' => array(
'header' => "Ocp-Apim-Subscription-Key: $subscriptionKey\r\n" .
"Content-Type: application/ssml+xml\r\n" .
"X-Microsoft-OutputFormat: $outputFormat\r\n" .
"User-Agent: MyTTSApp\r\n", // 添加 User-Agent 头
'method' => 'POST',
'content' => $xmlContent,
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) {
// 处理错误
//echo "请求失败";
return json(Tools::set_fail('请求失败'));
} else {
$date = date("YmdHis");
$root_path = Tools::get_root_path();
$request_path = '/audio/azure_tts';
$save_path = 'public'.$request_path;
$filepath = $root_path . $save_path;
if (!file_exists($filepath)) {
mkdir($filepath, 0777, true); // 确保目录存在
}
$filename = "/output_$date.mp3";
file_put_contents($filepath . $filename, $result);
//echo "音频文件已生成: $filename";
$domain = request()->domain();
return json(Tools::set_ok('请求成功',$domain.$request_path.$filename));
}
}
function test(){
}
}

View File

@@ -0,0 +1,80 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/8/13} {11:22}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\sms\AliSms;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
class Sms extends BaseHttpApi
{
/**
* desc发送短信验证码
* 参数:
* mobile 手机号
* event 发送场景
*
* api/sms/send
* authorwh
*/
function send(){
return Mmodel::catchJson(function (){
$mobile = input('mobile');
if(empty($mobile)){
return Tools::set_fail('手机号错误');
}
if(!Validate::is_mobile($mobile)){
return Tools::set_fail('手机号错误');
}
//发送间隔不能低于60秒
$sms_record = Db::table(TabConf::$fa_sms)
->where('create_time','>',date('Y-m-d H:i:s',time()-60))
->where('mobile',$mobile)
->order('id desc')
->find();
if($sms_record){
return Tools::set_fail('发送太频繁,请稍后再试');
}
//查询记录10分钟内超过10次禁止发送
$count = Db::table(TabConf::$fa_sms)
->where('create_time','>',date('Y-m-d H:i:s',time()-600))
->where('mobile',$mobile)
->count();
if($count>=10){
return Tools::set_fail('发送次数过多,请稍后再试');
}
$config = config('sms_config');
$code = Tools::rand_str(6,3);
Tools::log_to_write_txt(['发送短信,开始','mobile'=>$mobile,'code'=>$code,'$config'=>$config]);
$res = (new AliSms($config,$config['sms_sign_name'],$config['sms_template_code']))
->send($mobile,json_encode(['code'=>$code]));
Tools::log_to_write_txt(['发送短信,结束',$res]);
//写入发送记录
$sms_data = [
'event'=>input('event'),
'mobile'=>$mobile,
'code'=>$code,
'times'=>0,
'ip'=>request()->ip(),
];
Db::table(TabConf::$fa_sms)->insert($sms_data);
return Tools::set_ok('操作成功',$res);
});
}
}

View File

@@ -0,0 +1,223 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/11/21} {14:14}
*/
namespace app\api\controller;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* 听译优医助手
* Tingyi Youyi Assistant
*
* Class Tingyiueassistant
* @package app\api\controller
*/
class Tingyiueassistant extends BaseHttpApi
{
/**
* desc听译助手对话优医助手
*
* 参数:
* type助手类型选择助手类型如疼痛科指导医师【必须】
* question :问题【必须】
* phone 患者手机号【必须】
* doctor 医生手机号【必须】
* sessionid 会话id【必须】 从getSayToken接口获得每次对话之前生成用于区分不同会话
*
* 注意:回答完成之后再保存回答记录
*
* authorwh
*/
function chatTy(){
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no');
Tools::log_to_write_txt(['input'=>input()]);
$type = input('type');//选择助手类型
if(empty($type)){
//return json(Tools::set_fail('type必须,选择助手类型:如疼痛科指导医师'));
return Tools::set_event_stream_fail('type必须,选择助手类型:如疼痛科指导医师');
}
$phone = input('phone');
if(empty($phone)){
//return json(Tools::set_fail('phone必须'));
return Tools::set_event_stream_fail('phone患者手机号必须');
}
$doctor = input('doctor');
if(empty($doctor)){
//return json(Tools::set_fail('doctor必须'));
return Tools::set_event_stream_fail('doctor医生手机号必须');
}
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
//return json(Tools::set_fail('hdruserbaseinfo_id必须'));
return Tools::set_event_stream_fail('hdruserbaseinfo_id患者id必须');
}
//会话id
$sessionid = input('sessionid');
if(empty($sessionid)){
//return json(Tools::set_fail('sessionid必须'));
return Tools::set_event_stream_fail('sessionid会话id必须','从getSayToken接口获得每次对话之前生成用于区分不同会话');
}
$reportid = input('reportid');//报告id
if(empty($reportid)){
//return json(Tools::set_fail('reportid必须'));
return Tools::set_event_stream_fail('reportid报告id必须');
}
//查询历史对话记录
//$records = Db::table(TabConf::$fa_tingyiueassistantchathis)
// ->where('sessionid',$sessionid)
// ->where('reportid',$reportid)
// ->order('id desc')
// ->select();
//ai那边不需要对话记录
$qa_history = '';
//foreach ($records as $record) {
// $qa_history .= "{" . $record['question'] . ":
// " . $record['answer'] . "},\n";
//}
$ai_config = config('ai_medical_assistant_config');
$question = input('question','hi');
$chatobj = new ChatGPT();
$chatobj->url = $ai_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $ai_config['APIKey'];
$answer_json_arr = [];
$medical_record = Db::table(TabConf::$fa_tt_medical_report)
->where('phone',$phone)
->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
->find();
$medical_record_report_txt = <<<EOF
患者姓名:{$medical_record['name']}
性别:{$medical_record['gender']}
年龄:{$medical_record['age']}
教育程度:{$medical_record['edu']}
职业及年限:{$medical_record['career_year']}
体力要求:{$medical_record['power']}
经济满意度:{$medical_record['satisfaction']}
过往职业及年限:{$medical_record['old_career_year']}
过往职业体力要求:{$medical_record['old_career_power']}
社会支持度:{$medical_record['support']}
居住情况:{$medical_record['live']}
家庭关系:{$medical_record['home']}
诊断:{$medical_record['diagnosis']}
主诉:{$medical_record['main_complaint']}
病史:{$medical_record['medical_history']}
家族史:{$medical_record['family_history']}
月经婚育史:{$medical_record['menstrual_marital_history']}
医嘱:{$medical_record['treatment']}
EOF;
$config = [
'stream'=>true,
'chatId'=>$sessionid,
'variables'=>[
'agent_selection'=>$type,
'medical_record'=>$medical_record_report_txt,
]
];
//$sub_content_msg = [
// ["role" => "user", "content" => $question]
//];
//$chatobj->setBefore($sub_content_msg);
$chat_content = <<<EOF
$question
$qa_history
EOF;
$chatobj->chat($chat_content,$config,$answer_json_arr);
//保存对话记录
$data = [
'phone'=>$phone,
'question'=>$question,
'doctor'=>$doctor,
'sessionid'=>$sessionid,
'reportid'=>$reportid
];
$record_id = Db::table(TabConf::$fa_tingyiueassistantchathis)
->insertGetId($data);
Tools::log_to_write_txt(['听译助手对话优医助手请求gpt:'=>$chatobj->post_msg_body,'患者资料'=>$medical_record_report_txt]);
Tools::log_to_write_txt(['听译助手对话优医助手gpt回复:'=>$answer_json_arr]);
//return json(Tools::set_ok('ok',['record_id'=>$record_id]));
return Tools::set_event_stream_ok('ok',['record_id'=>$record_id]);
}
/**
* 保存回答记录
*
* 参数:
* record_id记录id
* answer回答
* phone患者手机号
*
* authorwh
*/
function saveAnswer(){
return Mmodel::catchJson(function (){
$record_id = input('record_id');
$answer = input('answer');
$phone = input('phone');//患者手机号
if(empty($record_id)){
return Tools::set_fail('record_id必须');
}
if(empty($answer)){
return Tools::set_fail('answer必须');
}
if(empty($phone)){
return Tools::set_fail('患者手机号必须');
}
$record = Db::table(TabConf::$fa_tingyiueassistantchathis)
->where('id',$record_id)
->where('phone',$phone)
->find();
if(empty($record)){
return Tools::set_fail('记录不存在');
}
Db::table(TabConf::$fa_tingyiueassistantchathis)
->data([
'answer'=>$answer,
])
->where('id',$record_id)
->where('phone',$phone)
->update();
return Tools::set_ok('ok');
});
}
}

View File

@@ -0,0 +1,101 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Ttchathistory extends BaseHttpApi
{
protected $controller_comments = '疼痛科聊天历史';
/**
* desc获取疼痛科聊天历史
*
* api/Ttchathistory/getTtchathistoryList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* hdruserbaseinfo_id 统一基本信息 统一基本信息 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* username 用户
* type 聊天角色
* chat_msg 问诊内容
* ticket 对话票据(用于隔离用户聊天历史记录)
* userbaseinfo_id 基本信息ID
* create_time 创建时间
* hdruserbaseinfo_id 统一基本信息
* authorwh
*/
function getTtchathistoryList(){
Tools::log_to_write_txt(['获取疼痛科聊天历史 入参:'=>input()]);
$api_desc = '获取疼痛科聊天历史';
try {
//$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
//if(empty($hdruserbaseinfo_id)){
// return json(Tools::set_fail('hdruserbaseinfo_id参数错误'));
//}
$reportid = input('reportid');
if(empty($reportid)){
return json(Tools::set_fail('reportid参数错误'));
}
//查询最新的ticket
//$last_ticket = Db::table(TabConf::$fa_tt_chathistory)
// ->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
// ->order('id desc')
// ->value('ticket');
$model_obj = Db::table(TabConf::$fa_tt_chathistory);
//if(!empty($last_ticket)){
// $model_obj->where('ticket',$last_ticket);
//}
//【对话记录跟着报告走】
$model_obj->where('reportid',$reportid);
//if(input('hdruserbaseinfo_id')){
// $model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
//}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取疼痛科聊天历史.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,664 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Ttmedicalreport extends BaseHttpApi
{
protected $controller_comments = '疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)';
/**
* desc获取疼痛科病历报告一个基本信息对应一个报告
*
* api/Ttmedicalreport/getTtmedicalreportDetail
*
* 参数:
* hdruserbaseinfo_id 统一基本信息 统一基本信息 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* userbaseid 基本信息ID
* doctor 所属医生
* username 病人
* report_content 报告内容
* name 病人姓名
* phone 病人电话
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* create_time 生成时间
* ticket 对话票据(数据隔离)
* hdruserbaseinfo_id 统一基本信息
* authorwh
*/
function getTtmedicalreportDetail(){
Tools::log_to_write_txt(['获取疼痛科病历报告(一个基本信息对应一个报告) 入参:'=>input()]);
$api_desc = '获取疼痛科病历报告(一个基本信息对应一个报告)';
try {
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('hdruserbaseinfo_id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_tt_medical_report);
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取疼痛科病历报告(一个基本信息对应一个报告).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc根据id查询报告
*
* reportid 报告id
*
* api/Ttmedicalreport/getTtmedicalreportDetailbyId
* authorwh
*/
function getTtmedicalreportDetailbyId(){
Tools::log_to_write_txt(['根据id查询报告 入参:'=>input()]);
$api_desc = '根据id查询报告';
try {
$reportid = input('reportid');
if(empty($reportid)){
return json(Tools::set_fail('reportid参数错误'));
}
$model_obj = Db::table(TabConf::$fa_tt_medical_report);
$model_obj->where('id',$reportid);
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'根据id查询报告.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* desc获取疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)
*
* api/Ttmedicalreport/getTtmedicalreportList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* userbaseid 基本信息ID
* doctor 所属医生
* username 病人
* report_content 报告内容
* name 病人姓名
* phone 病人电话
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* hdruserbaseinfo_id 统一基本信息
* hdrdepartment_id 科室
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* userbaseid 基本信息ID
* doctor 所属医生
* username 病人
* report_content 报告内容
* name 病人姓名
* phone 病人电话
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* create_time 生成时间
* ticket 对话票据(数据隔离)
* hdruserbaseinfo_id 统一基本信息
* hdrdepartment_id 科室
* authorwh
*/
function getTtmedicalreportList(){
Tools::log_to_write_txt(['获取疼痛科病历报告(听译问诊)(一个基本信息对应一个报告) 入参:'=>input()]);
$api_desc = '获取疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)';
try {
$userbaseid = input('userbaseid');
$doctor = input('doctor');
$username = input('username');
$report_content = input('report_content');
$name = input('name');
$phone = input('phone');
$from = input('from');
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
$hdrdepartment_id = input('hdrdepartment_id');
$status = input('status');
$model_obj = Db::table(TabConf::$fa_tt_medical_report);
if(input('userbaseid')){
$model_obj->where('userbaseid',input('userbaseid'));
}
if(isset($status)){
$model_obj->where('status',$status);
}
if(input('doctor')){
$model_obj->where('doctor',input('doctor'));
}
if(input('username')){
$model_obj->where('username',input('username'));
}
if(input('report_content')){
$model_obj->where('report_content',input('report_content'));
}
if(input('name')){
$model_obj->where('name',input('name'));
}
if(input('phone')){
$model_obj->where('phone',input('phone'));
}
if(input('from')){
$model_obj->where('from',input('from'));
}
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
if(input('hdrdepartment_id')){
$model_obj->where('hdrdepartment_id',input('hdrdepartment_id'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
Tools::log_to_write_txt(['查询sql:'=>$model_obj->getLastSql()]);
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取疼痛科病历报告(听译问诊)(一个基本信息对应一个报告).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
/**
* 新增疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)
*
* 参数:
* userbaseid 基本信息ID
* doctor 所属医生 【必须】
* username 医生电话(账号) 【必须】
* report_content 报告内容
* name 病人姓名 【必须】
* phone 病人电话 【必须】
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊,doc_add=医生添加 【必须】
* ticket 对话票据(数据隔离) 【必须】
* qa_type 问答模式:free=自由问答,fix=固定问答 【必须】
* hdruserbaseinfo_id 统一基本信息 【必须】
* hdrdepartment_id 科室 【必须】
* uniqueid 唯一ID 【必须】
* api/Ttmedicalreport/addTtmedicalreport
*/
function addTtmedicalreport(){
Tools::log_to_write_txt(['新增疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)'=>input()]);
$api_desc = '新增疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)';
Db::startTrans();
try {
$userbaseid = input('userbaseid');
$doctor = input('doctor');
if(empty($doctor)){
return json(Tools::set_fail('参数错误.1',['error_msg'=>'错误信息doctor错误']));
}
$username = input('username');
if(empty($username)){
return json(Tools::set_fail('参数错误.2',['error_msg'=>'错误信息username错误']));
}
$report_content = input('report_content');
$name = input('name');
if(empty($name)){
return json(Tools::set_fail('参数错误.4',['error_msg'=>'错误信息name错误']));
}
$phone = input('phone');
if(empty($phone)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息phone错误']));
}
$from = input('from');
if(empty($from)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息from错误']));
}
$ticket = input('ticket');
if(empty($ticket)){
return json(Tools::set_fail('参数错误.7',['error_msg'=>'错误信息ticket错误']));
}
$qa_type = input('qa_type');
if(empty($qa_type)){
return json(Tools::set_fail('参数错误.8',['error_msg'=>'错误信息qa_type错误']));
}
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('参数错误.9',['error_msg'=>'错误信息hdruserbaseinfo_id错误']));
}
$hdrdepartment_id = input('hdrdepartment_id');
if(empty($hdrdepartment_id)){
return json(Tools::set_fail('参数错误.10',['error_msg'=>'错误信息hdrdepartment_id错误']));
}
$uniqueid = input('uniqueid');
if(empty($uniqueid)){
return json(Tools::set_fail('参数错误.11',['error_msg'=>'错误信息uniqueid错误']));
}
$gender = input('gender');
if(empty($gender)){
return json(Tools::set_fail('参数错误.5',['error_msg'=>'错误信息gender错误']));
}
$age = input('age');
if(empty($age)){
return json(Tools::set_fail('参数错误.6',['error_msg'=>'错误信息age错误']));
}
$data = [
'userbaseid'=>$userbaseid?:'',
'doctor'=>$doctor?:'',
'username'=>$username?:'',
'report_content'=>$report_content?:'',
'name'=>$name?:'',
'phone'=>$phone?:'',
'from'=>$from?:'',
'ticket'=>$ticket?:'',
'qa_type'=>$qa_type?:'',
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id?:'',
'hdrdepartment_id'=>$hdrdepartment_id?:'',
'uniqueid'=>$uniqueid?:'',
'gender'=>$gender?:'',
'age'=>$age?:''
];
$dataid = Db::table(TabConf::$fa_tt_medical_report)->insertGetId($data);
//$this->operateLog('新增疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)',api_user_info('id'));
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'新增疼痛科病历报告(听译问诊)(一个基本信息对应一个报告).异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 根据报告ID修改报告
* 参数:
* id ID 【必须】
* doctor 所属医生
* username 医生电话(账号)
* report_content 报告内容
* name 病人姓名
* phone 病人电话
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊,doc_add=医生添加
* qa_type 问答模式:free=自由问答,fix=固定问答
* hdruserbaseinfo_id 统一基本信息
* hdrdepartment_id 科室
* hdrdepartment 科室名称
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* wechat_no 微信号
* is_flow 是否接受随访:yes=是,no=否
* diagnosis 诊断
* main_complaint 主诉
* medical_history 病史
* past_history 既往史
* allergy_history 过敏史
* family_history 家族史
* personal_history 个人史
* menstrual_marital_history 月经婚育史
* treatment 医嘱
* api/Ttmedicalreport/updateTtReportById
*
*/
function updateTtReportById(){
Tools::log_to_write_txt(['根据报告ID修改报告'=>input()]);
$api_desc = '根据报告ID修改报告';
Db::startTrans();
try {
$doctor = input('doctor');
$username = input('username');
$report_content = input('report_content');
$name = input('name');
$phone = input('phone');
$from = input('from');
$qa_type = input('qa_type');
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
$hdrdepartment_id = input('hdrdepartment_id');
$hdrdepartment = input('hdrdepartment');
$gender = input('gender');
$age = input('age');
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$wechat_no = input('wechat_no');
$is_flow = input('is_flow');
$diagnosis = input('diagnosis');
$main_complaint = input('main_complaint');
$medical_history = input('medical_history');
$past_history = input('past_history');
$allergy_history = input('allergy_history');
$family_history = input('family_history');
$personal_history = input('personal_history');
$menstrual_marital_history = input('menstrual_marital_history');
$treatment = input('treatment');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0',['error_msg'=>'错误信息id错误']));
}
//存在则修改
$data = [];
if($doctor){
$data['doctor'] = $doctor;
}
if($username){
$data['username'] = $username;
}
if($name){
$data['name'] = $name;
}
if($phone){
$data['phone'] = $phone;
}
if($from){
$data['from'] = $from;
}
if($qa_type){
$data['qa_type'] = $qa_type;
}
if($hdruserbaseinfo_id){
$data['hdruserbaseinfo_id'] = $hdruserbaseinfo_id;
}
if($hdrdepartment_id){
$data['hdrdepartment_id'] = $hdrdepartment_id;
}
if($hdrdepartment){
$data['hdrdepartment'] = $hdrdepartment;
}
if($gender){
$data['gender'] = $gender;
}
if($age){
$data['age'] = $age;
}
if($edu){
$data['edu'] = $edu;
}
if($career_year){
$data['career_year'] = $career_year;
}
if($power){
$data['power'] = $power;
}
if($satisfaction){
$data['satisfaction'] = $satisfaction;
}
if($old_career_year){
$data['old_career_year'] = $old_career_year;
}
if($old_career_power){
$data['old_career_power'] = $old_career_power;
}
if($support){
$data['support'] = $support;
}
if($marriage){
$data['marriage'] = $marriage;
}
if($live){
$data['live'] = $live;
}
if($home){
$data['home'] = $home;
}
if($address){
$data['address'] = $address;
}
if($wechat_no){
$data['wechat_no'] = $wechat_no;
}
if($is_flow){
$data['is_flow'] = $is_flow;
}
if($main_complaint){
$data['main_complaint'] = $main_complaint;
// $report_content .= <<<EOF
//\n【主诉】$main_complaint
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【主诉】
//EOF;
}
if($medical_history){
$data['medical_history'] = $medical_history;
// $report_content .= <<<EOF
//\n【病史】$medical_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【病史】
//EOF;
}
if($personal_history){
$data['personal_history'] = $personal_history;
// $report_content .= <<<EOF
//\n【个人史】$personal_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【个人史】
//EOF;
}
if($menstrual_marital_history){
$data['menstrual_marital_history'] = $menstrual_marital_history;
// $report_content .= <<<EOF
//\n【婚姻史】$menstrual_marital_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【婚姻史】
//EOF;
}
if($family_history){
$data['family_history'] = $family_history;
// $report_content .= <<<EOF
//\n【家族史】$family_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【家族史】
//EOF;
}
if($diagnosis){
$data['diagnosis'] = $diagnosis;
// $report_content .= <<<EOF
//\n【诊断】$diagnosis
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【诊断】
//EOF;
}
if($past_history){
$data['past_history'] = $past_history;
// $report_content .= <<<EOF
//\n【既往史】$past_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【既往史】
//EOF;
}
if($allergy_history){
$data['allergy_history'] = $allergy_history;
// $report_content .= <<<EOF
//\n【过敏史】$allergy_history
//EOF;
// }else{
// $report_content .= <<<EOF
//\n【过敏史】
//EOF;
}
if($treatment){
$data['treatment'] = $treatment;
}
if($report_content){
$data['report_content'] = $report_content;
}
$dataid = Db::table(TabConf::$fa_tt_medical_report)
->data($data)
->where('id',input('id'))
->update();
//$this->operateLog('根据报告ID修改报告',api_user_info('id'));
Db::commit();
//if($hdruserbaseinfo_id){
// $data['id'] = $hdruserbaseinfo_id;
// $url = request()->domain().'/api/Hdruserbaseinfo/updateHdruserbaseinfoById';
// Tools::log_to_write_txt(['修改基本信息'=>$data,'url'=>$url]);
// $res = Curl::curl_post($url,$data);
// Tools::log_to_write_txt(['修改基本信息返回,结束'=>$res]);
//}
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'根据报告ID修改报告.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Ttuserbaseinfo extends BaseHttpApi
{
protected $controller_comments = '疼痛科用户基本信息';
/**
* desc获取疼痛科用户基本信息
*
* api/Ttuserbaseinfo/getTtuserbaseinfoDetail
*
* 参数:
* id ID ID 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* date 日期
* doctor 所属医生
* name 病人姓名
* gender 病人性别
* age 病人年龄
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* phone 联系方式
* wechat_no 微信号
* create_time 创建时间
* is_flow 是否接受随访:yes=是,no=否
* ticket 对话票据(数据隔离)
* hdrdepartment_id 科室
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* authorwh
*/
function getTtuserbaseinfoDetail(){
Tools::log_to_write_txt(['获取疼痛科用户基本信息 入参:'=>input()]);
$api_desc = '获取疼痛科用户基本信息';
try {
$id = input('id');
if(empty($id)){
return json(Tools::set_fail('id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_tt_userbaseinfo);
if(input('id')){
$model_obj->where('id',input('id'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取疼痛科用户基本信息.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}

View File

@@ -0,0 +1,25 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/15} {16:13}
*/
namespace app\api\controller;
/**
* @deprecated
* 听译聊天
* Class Tychat
* @package app\api\controller
*/
class Tychat
{
function saveChat(){
return Mmodel::catchJson(function (){
});
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Tychathistory extends BaseHttpApi
{
protected $controller_comments = '听译-聊天历史';
/**
* desc获取听译-聊天历史
*
* api/Tychathistory/getTychathistoryList
*
* 参数:
* 带分页
* current_page 当前页码
* list_rows 每页显示条数 默认15
* hdruserbaseinfo_id 统一基本信息 统一基本信息 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* username 用户
* type 聊天角色
* chat_msg 问诊内容
* ticket 对话票据(数据隔离)
* create_time 创建时间
* hdruserbaseinfo_id 统一基本信息
* authorwh
*/
function getTychathistoryList(){
Tools::log_to_write_txt(['获取听译-聊天历史 入参:'=>input()]);
$api_desc = '获取听译-聊天历史';
try {
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('hdruserbaseinfo_id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_ty_chathistory);
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
$data = $model_obj->paginate(['page'=>input('current_page',1),'list_rows'=>input('list_rows',15)])
->each(function($item, $key){
return $item;
});
// ['total'] => int(30)
// ['per_page'] => int(15)
// ['current_page'] => int(1)
// ['last_page''] => int(2)
$data = $data->toArray();//包含 data列表
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取听译-聊天历史.异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,67 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Tyfollowup extends BaseHttpApi
{
protected $controller_comments = '随访记录(听译助手)';
/**
* desc获取随访记录(听译助手)
*
* api/Tyfollowup/getTyfollowupDetail
*
* 参数:
* report_dataid 报告ID 报告ID 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* report_dataid 报告ID
* name 姓名
* phone 电话
* content 随访内容
* create_time 随访时间
* authorwh
*/
function getTyfollowupDetail(){
Tools::log_to_write_txt(['获取随访记录(听译助手) 入参:'=>input()]);
$api_desc = '获取随访记录(听译助手)';
try {
$report_dataid = input('report_dataid');
if(empty($report_dataid)){
return json(Tools::set_fail('report_dataid参数错误'));
}
$model_obj = Db::table(TabConf::$fa_ty_followup);
if(input('report_dataid')){
$model_obj->where('report_dataid',input('report_dataid'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取随访记录(听译助手).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
}

View File

@@ -0,0 +1,414 @@
<?php
namespace app\api\controller;
use think\Db;
use app\common\model\TabConf;
use wanghua\general_utility_tools_php\file\upload\FileUpload;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\Validate;
use think\Controller;
class Tymedicalreport extends BaseHttpApi
{
protected $controller_comments = '听译-病历报告(听译问诊)(一个基本信息对应一个报告)';
/**
* desc获取听译-病历报告(听译问诊)(一个基本信息对应一个报告)
*
* api/Tymedicalreport/getTymedicalreportDetail
*
* 参数:
* hdruserbaseinfo_id 统一基本信息 统一基本信息 必须
*
* 所有字段说明<span style="color: gray">(可能有部分额外字段未在此体现)</span>
* id ID
* userbaseid 听译病历ID
* doctor 所属医生
* username 病人
* report_content 报告内容
* name 病人姓名
* gender 病人性别
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* ticket 对话票据(数据隔离)
* diagnostic_result 诊断结果
* create_time 生成时间
* hdruserbaseinfo_id 统一基本信息
* authorwh
*/
function getTymedicalreportDetail(){
Tools::log_to_write_txt(['获取听译-病历报告(听译问诊)(一个基本信息对应一个报告) 入参:'=>input()]);
$api_desc = '获取听译-病历报告(听译问诊)(一个基本信息对应一个报告)';
try {
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
return json(Tools::set_fail('hdruserbaseinfo_id参数错误'));
}
$model_obj = Db::table(TabConf::$fa_ty_medical_report);
if(input('hdruserbaseinfo_id')){
$model_obj->where('hdruserbaseinfo_id',input('hdruserbaseinfo_id'));
}
$item = $model_obj->find();
$data = $item;
return json(Tools::set_ok('ok',$data));
}catch(\Exception $e){
Tools::log_to_write_txt([
'error'=>'获取听译-病历报告(听译问诊)(一个基本信息对应一个报告).异常.'.$e->getMessage(),
'参数'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_res(500,'操作异常',[]));
}
}
function updateTingyiReportById(){
Tools::log_to_write_txt(['根据报告ID修改听译报告最终报告'=>input()]);
$api_desc = '根据报告ID修改听译报告最终报告';
Db::startTrans();
try {
$username = input('username');
$report_content = input('report_content');
$name = input('name');
$gender = input('gender');
$from = input('from');
$diagnostic_result = input('diagnostic_result');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0',['error_msg'=>'错误信息id错误']));
}
//存在则修改
$data = [];
if($username){
$data['username'] = $username;
}
if($report_content){
$data['report_content'] = $report_content;
}
if($name){
$data['name'] = $name;
}
if($gender){
$data['gender'] = $gender;
}
if($from){
$data['from'] = $from;
}
if($diagnostic_result){
$data['diagnostic_result'] = $diagnostic_result;
}
$dataid = Db::table(TabConf::$fa_ty_medical_report)
->data($data)
->where('id',input('id'))
->update();
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'根据报告ID修改听译报告最终报告.异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}
/**
* 修改听译-病历报告(听译问诊)(一个基本信息对应一个报告)
* 参数:
* id ID 【必须】
* userbaseid 听译病历ID
* doctor 所属医生
* username 病人
* report_content 报告内容
* name 病人姓名
* gender 病人性别
* from 来源:num_per=数智人,ty=听译助手,h5=h5网页问诊
* ticket 对话票据(数据隔离)
* diagnostic_result 诊断结果
* hdruserbaseinfo_id 统一基本信息
* create_time 生成时间
* age 病人年龄
* main_complaint 主诉
* medical_history 病史
* past_history 既往史
* allergy_history 过敏史
* family_history 家族史
* personal_history 个人史
* menstrual_marital_history 月经婚育史
* diagnosis 诊断
* treatment 医嘱
* phone 联系方式
* status 问诊状态
* user_phone 登录手机号
* date 日期
* hdrdepartment 科室名称
* hdrdepartment_id 科室
* edu 教育程度
* career_year 职业及年限
* power 体力要求
* satisfaction 经济满意度
* old_career_year 过往职业及年限
* old_career_power 过往职业体力要求
* support 社会支持度
* marriage 婚姻状况
* live 居住情况
* home 家庭关系
* address 地址
* wechat_no 微信号
* api/Tymedicalreport/updateTymedicalreportById
*/
function updateTymedicalreportById(){
Tools::log_to_write_txt(['修改听译-病历报告(听译问诊)(一个基本信息对应一个报告)'=>input()]);
$api_desc = '修改听译-病历报告(听译问诊)(一个基本信息对应一个报告)';
Db::startTrans();
try {
$userbaseid = input('userbaseid');
$doctor = input('doctor');
$username = input('username');
$report_content = input('report_content');
$name = input('name');
$gender = input('gender');
$from = input('from');
$ticket = input('ticket');
$diagnostic_result = input('diagnostic_result');
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
$create_time = input('create_time');
$age = input('age');
$main_complaint = input('main_complaint');
$medical_history = input('medical_history');
$past_history = input('past_history');
$allergy_history = input('allergy_history');
$family_history = input('family_history');
$personal_history = input('personal_history');
$menstrual_marital_history = input('menstrual_marital_history');
$diagnosis = input('diagnosis');
$treatment = input('treatment');
$phone = input('phone');
$status = input('status');
$user_phone = input('user_phone');
$date = input('date');
$hdrdepartment = input('hdrdepartment');
$hdrdepartment_id = input('hdrdepartment_id');
$edu = input('edu');
$career_year = input('career_year');
$power = input('power');
$satisfaction = input('satisfaction');
$old_career_year = input('old_career_year');
$old_career_power = input('old_career_power');
$support = input('support');
$marriage = input('marriage');
$live = input('live');
$home = input('home');
$address = input('address');
$wechat_no = input('wechat_no');
if(empty(input('id'))){
return json(Tools::set_fail('参数错误。0',['error_msg'=>'错误信息id错误']));
}
//存在则修改
$data = [];
if($userbaseid){
$data['userbaseid'] = $userbaseid;
}
if($doctor){
$data['doctor'] = $doctor;
}
if($username){
$data['username'] = $username;
}
if($report_content){
$data['report_content'] = $report_content;
}
if($name){
$data['name'] = $name;
}
if($gender){
$data['gender'] = $gender;
}
if($from){
$data['from'] = $from;
}
if($ticket){
$data['ticket'] = $ticket;
}
if($diagnostic_result){
$data['diagnostic_result'] = $diagnostic_result;
}
if($hdruserbaseinfo_id){
$data['hdruserbaseinfo_id'] = $hdruserbaseinfo_id;
}
if($create_time){
$data['create_time'] = $create_time;
}
if($age){
$data['age'] = $age;
}
if($main_complaint){
$data['main_complaint'] = $main_complaint;
}
if($medical_history){
$data['medical_history'] = $medical_history;
}
if($past_history){
$data['past_history'] = $past_history;
}
if($allergy_history){
$data['allergy_history'] = $allergy_history;
}
if($family_history){
$data['family_history'] = $family_history;
}
if($personal_history){
$data['personal_history'] = $personal_history;
}
if($menstrual_marital_history){
$data['menstrual_marital_history'] = $menstrual_marital_history;
}
if($diagnosis){
$data['diagnosis'] = $diagnosis;
}
if($treatment){
$data['treatment'] = $treatment;
}
if($phone){
$data['phone'] = $phone;
}
if($status){
$data['status'] = $status;
}
if($user_phone){
$data['user_phone'] = $user_phone;
}
if($date){
$data['date'] = $date;
}
if($hdrdepartment){
$data['hdrdepartment'] = $hdrdepartment;
}
if($hdrdepartment_id){
$data['hdrdepartment_id'] = $hdrdepartment_id;
}
if($edu){
$data['edu'] = $edu;
}
if($career_year){
$data['career_year'] = $career_year;
}
if($power){
$data['power'] = $power;
}
if($satisfaction){
$data['satisfaction'] = $satisfaction;
}
if($old_career_year){
$data['old_career_year'] = $old_career_year;
}
if($old_career_power){
$data['old_career_power'] = $old_career_power;
}
if($support){
$data['support'] = $support;
}
if($marriage){
$data['marriage'] = $marriage;
}
if($live){
$data['live'] = $live;
}
if($home){
$data['home'] = $home;
}
if($address){
$data['address'] = $address;
}
if($wechat_no){
$data['wechat_no'] = $wechat_no;
}
$dataid = Db::table(TabConf::$fa_ty_medical_report)
->data($data)
->where('id',input('id'))
->update();
Db::commit();
return json(Tools::set_ok('ok',$dataid));
}catch (\Exception $e){
Db::rollback();
Tools::log_to_write_txt([
'error'=>'修改听译-病历报告(听译问诊)(一个基本信息对应一个报告).异常.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail());
}
}

View File

@@ -0,0 +1,253 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/8/10} {11:25}
*/
namespace app\api\controller;
use app\api\logic\TtchatLogic;
use app\common\model\TabConf;
use think\Db;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\Validate;
use wanghua\general_utility_tools_php\tool\Tools;
class Usersh5 extends BaseHttpApi
{
public function __construct()
{
//if(!self::checkLogin()){
// echo json_encode(['code'=>591,'msg'=>'未登录']);exit;
//}
}
/**
* 检查登录
*/
static function checkLogin(){
return Mmodel::catch(function (){
$ticket = input('ticket');
if(empty($ticket)){
return false;//默认未登录
}
$user = Db::table(TabConf::$fa_hdrusersh5)->where('ticket',$ticket)->cache(300)->find();
if(empty($user)){
return false;//默认未登录
}
return true;
});
}
/**
* desch5-授权,登录
*
* /api/Usersh5/login
*
* 参数:
* username 用户名(手机号)
* code 验证码
*
* authorwh
*/
function login()
{
return Mmodel::catchJson(function (){
$doctor = input('doctor');
if(empty($doctor)){
return Tools::set_fail('doctor所属医生参数错误:1');
}
if(!Validate::is_mobile($doctor)){
return Tools::set_fail('doctor医生手机号错误:2');
}
$username = input('username');
if(empty($username)){
return Tools::set_fail('参数错误:1');
}
$code = input('code');//验证码
if(empty($code)){
return Tools::set_fail('验证码错误:2');
}
if(!Validate::is_mobile($username)){
return Tools::set_fail('手机号错误:2');
}
//校验验证码
if(empty($code)){
return Tools::set_fail('验证码错误:2');
}
//查询短信验证码
$sms = Db::table(TabConf::$fa_sms)
->where('mobile',$username)
->where('code',$code)
->order('id desc')
->find();
if(empty($sms)){
return Tools::set_res(340,'验证码错误:3');
}
if($sms['event'] != 'login'){
return Tools::set_fail('场景错误:4');
}
if($sms['times'] > 1){
return Tools::set_fail('该验证码已失效:4');
}
$user = Db::table(TabConf::$fa_hdrusersh5)
->where('username',$username)
->find();
//返回票据
$ticketstr = md5($username);
$expires = 30*86400+time();//报告完成之后重新获取票据
if(empty($user)){
//注册
$user = Db::table(TabConf::$fa_hdrusersh5)
->data([
'username'=>$username,
'ticket'=>$ticketstr,
'expires'=>$expires,
'doctor'=>$doctor,
'expire_time'=>date('Y-m-d H:i:s',$expires)
])
->insert();
}
//修改验证码验证次数
Db::table(TabConf::$fa_sms)
->where('id',$sms['id'])
->setInc('times');
$uniqueid = md5($ticketstr.$expires.Tools::rand_str(6));
//修改有效期
Db::table(TabConf::$fa_hdrusersh5)
->data([
'ticket'=>$ticketstr,
'expires'=>$expires,//7天
'doctor'=>$doctor,//每次扫码更新医生
'expire_time'=>date('Y-m-d H:i:s',$expires)
])
->where('username',$username)
->update();
//查询最新的基本信息id
$baseuserinfo_id = Db::table(TabConf::$fa_ty_userbaseinfo)
->where('phone',$username)
->order('id desc')
->value('id');
return Tools::set_ok('登录成功',[
'ticket'=>$ticketstr,'uniqueid'=>$uniqueid,
'username'=>$username,'user'=>$user,
'baseuserinfo_id'=>$baseuserinfo_id
]);
});
}
/**
* desch5-根据id查询用户
* api/Usersh5/getUserById
* 参数:
* dataid 用户id
* authorwh
*/
function getUserById(){
return Mmodel::catchJson(function (){
$dataid = input('dataid');
if(empty($dataid)){
return Tools::set_fail('参数错误');
}
$data = Db::table(TabConf::$fa_hdrusersh5)
->where('id',$dataid)
->find();
return Tools::set_res(200,'查询成功',$data);
});
}
/**
* desch5-保存聊天记录
*
* api/Usersh5/saveChatHistory
*
* authorwh
*/
//function saveChatHistory(){
// return Mmodel::catchJson(function (){
// $obj = new TtchatLogic();
// $chat_content = input('chat_content');
// if(empty($chat_content)){
// return Tools::set_fail('参数错误');
// }
// $res = $obj->saveChatHistory($chat_content);
// return Tools::set_ok('ok',$res);
// });
//}
/**
* h5-修改基本信息
* api/Usersh5/editBaseinfo
* 参数ticket
*
name 病人姓名
gender 病人性别
age 病人年龄
edu 教育程度
caree职业及年限r_year
power体力要求
satisfaction 经济满意度
old_car过往职业及年限eer_year
support 社会支持度
marriage 婚姻状况
live 居住情况
home 家庭关系
addres地址s
phone 联系方式
wechat_no微信号
*/
//function editBaseinfo(){
// return Mmodel::catchJson(function (){
// //$ticket = input('ticket');
// //if(empty($ticket)){
// // return Tools::set_fail('ticket必须');
// //}
// //$user = Db::table(TabConf::$fa_hdrusersh5)->where('ticket',$ticket)->find();
// //if(empty($user)){
// // return Tools::set_fail('ticket错误未查询到用户');
// //}
// $userid = input('userid');
// if(empty($userid)){
// return Tools::set_fail('h5用户id必须');
// }
// //修改基本信息
// $data = [
// //'doctor'=>$user['username'],//医生
// 'name'=>input('name',''),//病人姓名
// 'gender'=>input('gender',''),//病人性别
// 'age'=>input('age',''),//病人年龄
// 'edu'=>input('edu',''),//教育程度
// 'career_year'=>input('career_year',''),//职业及年限
// 'power'=>input('power',''),//体力要求
// 'satisfaction'=>input('satisfaction',''),//经济满意度
// 'old_career_year'=>input('old_career_year',''),//过往职业及年限
// 'support'=>input('support',''),//社会支持度
// 'marriage'=>input('marriage',''),//婚姻状况
// 'live'=>input('live',''),//居住情况
// 'home'=>input('home',''),//家庭关系
// 'address'=>input('address',''),//地址
// 'phone'=>input('phone',''),//联系方式
// 'wechat_no'=>input('wechat_no',''),//微信号
//
// ];
// Mmodel::existsUpdateInsert(TabConf::$fa_ty_userbaseinfo,[
// 'id'=>$userid,
// ],$data);
//
// return Tools::set_ok();
// });
//}
}

View File

@@ -0,0 +1,278 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/3/26} {20:55}
*/
namespace app\api\controller;
use app\api\logic\TtchatLogic;
use app\api\logic\TychatLogic;
use app\api\logic\UserOfflinePrizeLogic;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use think\Exception;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\wechat\UserAuth;
/**
* 疼痛科用户
* Class Userstt
* @package app\api\controller
*/
class Userstt extends BaseHttpApi
{
/**
* desc疼痛科-根据id查询用户
* api/Userstt/getUserById
* 参数:
* dataid 用户id
* authorwh
*/
function getUserById(){
return Mmodel::catchJson(function (){
$dataid = input('dataid');
if(empty($dataid)){
return Tools::set_fail('参数错误');
}
$data = Db::table('fa_hdrdoctorusers')
->where('id',$dataid)
->find();
return Tools::set_res(200,'查询成功',$data);
});
}
/**
* desc疼痛科-授权,登录
*
* /api/Userstt/login
*
* 参数:clientid 客户端标识
* username 用户名
* password 密码
*
* authorwh
*/
function login()
{
return Mmodel::catchJson(function (){
//$clientid = input('clientid');
//if(empty($clientid)){
// return Tools::set_fail('clientid error');
//}
$username = input('username');
if(empty($username)){
return Tools::set_fail('参数错误:1');
}
$password = input('password');
if(empty($password)){
return Tools::set_fail('参数错误:2');
}
$user = Db::table('fa_hdrdoctorusers')
->where('username',$username)
->find();
if(empty($user)){
return Tools::set_fail('用户不存在');
}
if($password != $user['password']){
return Tools::set_fail('密码错误');
}
//session('api_user_info',$user);
unset($user['password']);
$expires = 7*86400+time();//报告完成之后重新获取票据
//返回票据
$ticketstr = md5($user['username']);
//修改有效期
Db::table('fa_hdrdoctorusers')
->data([
'ticket'=>$ticketstr,
'expires'=>$expires,//7天
//'clientid'=>$clientid,
])
->where('username',$username)
->update();
return Tools::set_ok('登录成功',['ticket'=>$ticketstr,'username'=>$username,'user'=>$user]);
});
}
/**
* desc疼痛科-保存聊天记录
*
* api/Userstt/saveChatHistory
*
* authorwh
*/
function saveChatHistory(){
return Mmodel::catchJson(function (){
$obj = new TtchatLogic();
$chat_content = input('chat_content');
if(empty($chat_content)){
return Tools::set_fail('参数错误');
}
$res = $obj->saveChatHistory($chat_content);
return Tools::set_ok('ok',$res);
});
}
/**
* 疼痛科-修改基本信息
* api/Userstt/editBaseinfo
* 参数ticket
*
name 病人姓名
gender 病人性别
age 病人年龄
edu 教育程度
caree职业及年限r_year
power体力要求
satisfaction 经济满意度
old_car过往职业及年限eer_year
support 社会支持度
marriage 婚姻状况
live 居住情况
home 家庭关系
addres地址s
phone 联系方式
wechat_no微信号
*/
function editBaseinfo(){
return Mmodel::catchJson(function (){
$ticket = input('ticket');
if(empty($ticket)){
return Tools::set_fail('ticket必须');
}
$user = Db::table('fa_hdrdoctorusers')->where('ticket',$ticket)->find();
if(empty($user)){
return Tools::set_fail('ticket错误');
}
//修改基本信息
$data = [
'doctor'=>$user['username'],//医生
'name'=>input('name',''),//病人姓名
'gender'=>input('gender',''),//病人性别
'age'=>input('age',''),//病人年龄
'edu'=>input('edu',''),//教育程度
'career_year'=>input('career_year',''),//职业及年限
'power'=>input('power',''),//体力要求
'satisfaction'=>input('satisfaction',''),//经济满意度
'old_career_year'=>input('old_career_year',''),//过往职业及年限
'support'=>input('support',''),//社会支持度
'marriage'=>input('marriage',''),//婚姻状况
'live'=>input('live',''),//居住情况
'home'=>input('home',''),//家庭关系
'address'=>input('address',''),//地址
'phone'=>input('phone',''),//联系方式
'wechat_no'=>input('wechat_no',''),//微信号
];
Mmodel::existsUpdateInsert('fa_tt_userbaseinfo',[
'username'=>$user['username'],
'name'=>input('name',''),
],$data);
return Tools::set_ok();
});
}
/**
* desc提交自由问答记录后台需要单独列出来对话时前端缓存在本地对话结束提交
*
* 参数:
* ticket 对话票据(结束问诊时重新生成)
* username 用户名
* content 对话内容,格式:
* content = [
["role" => "user", "content" => '1'],
["role" => "user", "content" => '2'],
["role" => "user", "content" => '3'],
];
*
* api/Userstt/subFreeQuestionAnswerRecord
*
* authorwh
*/
function subFreeQuestionAnswerRecord(){
return Mmodel::catchJson(function (){
$ticket = input('ticket');
if(empty($ticket)){
return Tools::set_fail('ticket必须');
}
$content = input('content');
if(empty($content)){
return Tools::set_fail('content对话内容必须');
}
$username = input('username');
if(empty($username)){
return Tools::set_fail('username必须');
}
$this->setTtFreeChatHistory($content,$username,$ticket);
return Tools::set_ok();
});
}
/**
* desc保存疼痛科自由对话聊天记录
* authorwh
* @param $sub_content
*/
private function setTtFreeChatHistory($sub_content,$username,$ticket){
//$content = [
// //["role" => "user", "content" => '']
//];
$data = [];
foreach ($sub_content as $item){
$content = explode('',$item['content']);
$d = [
'username'=>$username,
'type'=>empty($content[0])?'':$content[0],
'chat_msg'=>$item['content'],
'ticket'=>$ticket,
];
$data[] = $d;
}
Db::table(TabConf::$fa_tt_free_chathistory)->insertAll($data);
}
/**
* 诊断完成
* api/Userstt/diagFinish
* 参数report_id 报告id
*/
function diagFinish(){
return Mmodel::catchJson(function (){
$report_id = input('report_id');
if(empty($report_id)){
return Tools::set_fail('参数错误');
}
//查询报告
$report = Db::table(TabConf::$fa_tt_medical_report)->where('id',$report_id)->find();
if(empty($report)){
return Tools::set_fail('报告不存在');
}
if($report['status']==2){
return Tools::set_fail('报告已诊断完成,请勿重复提交');
}
$res = Db::table(TabConf::$fa_tt_medical_report)->where('id',$report_id)->update(['status'=>2]);
return Tools::set_ok('ok',$res);
});
}
}

View File

@@ -0,0 +1,174 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/3/26} {20:55}
*/
namespace app\api\controller;
use app\api\logic\TychatLogic;
use app\api\logic\UserOfflinePrizeLogic;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use think\Exception;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\SundryConfig;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\wechat\UserAuth;
/**
* 听译-用户
* Class Users
* @package app\api\controller
*/
class Usersty extends BaseHttpApi
{
/**
* desc听译-授权,登录
*
* /api/Usersty/login
*
* 参数:clientid 客户端标识
* username 用户名
* password 密码
*
* authorwh
*/
function login()
{
return Mmodel::catchJson(function (){
$clientid = input('clientid');
if(empty($clientid)){
return Tools::set_fail('clientid error');
}
$username = input('username');
if(empty($username)){
return Tools::set_fail('参数错误:1');
}
$password = input('password');
if(empty($password)){
return Tools::set_fail('参数错误:2');
}
$user = Db::table('fa_hdrdoctorusers')
->where('username',$username)
->find();
if(empty($user)){
return Tools::set_fail('用户不存在');
}
if($password != $user['password']){
return Tools::set_fail('密码错误');
}
//session('api_user_info',$user);
unset($user['password']);
//未登录
$expires = 7*86400+time();
$ticketstr = md5($user['username']);
//修改有效期
Db::table('fa_hdrdoctorusers')
->data([
'qa_chat_ticket'=>$ticketstr,
'ticket'=>$ticketstr,
'expires'=>$expires,//7天
])
->where('username',$username)
->update();
unset($user['qa_chat_ticket']);
return Tools::set_ok('登录成功',['ticket'=>$ticketstr,'user'=>$user]);
});
}
/**
* desc 绑定设备(选择角色时调用)
*
* api/Usersty/bindDevice
*
* 参数username
* clientid
* type 用户类型:user=用户,doc=医生
*/
//function bindDevice(){
// return Mmodel::catchJson(function (){
// //绑定设备
// $devidata = [
// 'username'=>input('username'),
// 'clientid'=>input('clientid'),
// 'type'=>input('type'),
// 'login_time'=>Tools::get_now_date(),
// ];
// Mmodel::existsUpdateInsert('fa_device',[
// 'username'=>input('username'),
// 'clientid'=>input('clientid'),
// ],$devidata);
// return Tools::set_ok('绑定成功');
// });
//}
/**
* 医生问诊提示
*
* 请求类型post
* 请求地址:/api/Usersty/getTips
* 参数:
* hdruserbaseinfo_id 基本信息id
*/
function getTips(){
return Mmodel::catchJson(function (){
$config = config('ai_doctor_tips_config');
//$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
//if(empty($hdruserbaseinfo_id)){
// return Tools::set_fail('hdruserbaseinfo_id参数错误');
//}
$reportid = input('reportid');
if(empty($reportid)){
return Tools::set_fail('reportid参数错误');
}
//$content = [
// ["role" => "user", "content" => '']
//];
$chatobj = new ChatGPT();
$chatobj->url = $config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $config['APIKey'];
$answer_json_arr = [];
//查询病历报告
$report = Db::table(TabConf::$fa_tt_medical_report)
//->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
//->order('id desc')
->where('id',$reportid)
->find();
if(empty($report)){
return Tools::set_fail('暂无病历报告');
}
$config = [
'stream'=>false,
];
$question = $report['report_content'];//input('question','');
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['医生问诊提示gpt请求参数'=>$chatobj->post_msg_body]);
Tools::log_to_write_txt(['医生问诊提示gpt回复'=>$answer_json_arr]);
return Tools::set_ok('ok',['tips'=>$answer_json_arr]);
});
}
}

View File

@@ -0,0 +1,98 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/4/5} {19:51}
*/
namespace app\api\controller;
use app\api\logic\StatisticsLogic;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\Date;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* socket 主动推送
*
* Class Wsspush
* @package app\api\controller
*/
class Wsspush extends BaseWssApi
{
/**
* desc向指定客户端发送信息
*
* api/wsspush/index/socketTaskId/xxxx
*
* authorwh
*/
public function index()
{
$socketTaskId = input('socketTaskId');
Gateway::sendToClient($socketTaskId,json_encode(Tools::set_ok('向指定客户端发送信息。',$socketTaskId),JSON_UNESCAPED_UNICODE));
}
/**
* desc向所有客户端发消息
* api/wsspush/pushToAll
* authorwh
* @throws \Exception
*/
function pushToAll(){
//$json = Tools::wss_json_ok('Reportty/createReport','ok',['flow_code'=>'create_report_end']);
//Gateway::sendToAll($json);
}
public function hello($name = 'ThinkPHP5')
{
return 'hello,' . $name;
}
/**
* desc向客户端推送消息
*
* 接收一维数组表单
*
* /api/wsspush/pushMessageToClient
*
* authorwh
*/
function pushMessageToClient(){
$socketTaskId = input('clientid');
if(empty($socketTaskId)){
return json(Tools::set_fail('客户端id必须'));
}
$action = input('action');
if(empty($action)){
return json(Tools::set_fail('ACTION MUST'));
}
$msg = input('msg');
if(empty($msg)){
return json(Tools::set_fail('MSG MUST'));
}
$all_params = [];
foreach (input() as $key=>$item){
if(in_array($key, ['clientid','action','msg'])){
continue;
}
$all_params[$key] = $item;
}
//json_encode(Tools::set_ok('向指定客户端发送信息。',$socketTaskId),JSON_UNESCAPED_UNICODE);
$json = self::json_wss($action,$msg,$all_params);
Gateway::sendToClient($socketTaskId, $json);
return json(Tools::set_ok('向指定客户端发送信息成功。'));
}
}

View File

@@ -0,0 +1,141 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/12} {17:41}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use GatewayWorker\Lib\Gateway;
use IFlytek\Xfyun\Speech\LfasrClient;
use wanghua\general_utility_tools_php\tool\Tools;
class AudioRevertLogic extends BaseLogic
{
function revert($client_id,$audioData)
{
$xunfei_record_config = config('xunfei_record_config');
$appId = $xunfei_record_config['appid'];
$secretKey = $xunfei_record_config['secretKey'];
// 设置转写参数
$lfasrConfig = [
//'hasParticiple' => 'true'
//'verify_ssl' => false,
//...
];
// 这里的$app_id、$secret_key是在开放平台控制台获得
$client = new LfasrClient($appId, $secretKey, $lfasrConfig);
$filePath = Tools::get_root_path().'public/iseTest.mp3';
dump($filePath);
// $filePath为待转写的本地文件路径返回taskId作为后续查询进度、获取结果操作的参数
$taskId = $client->combineUpload($filePath);
dump($taskId);
// 查询进度json格式
$progress = $client->getProgress($taskId)->getBody()->getContents();
dump($progress);
// 获取结果json格式
$result = $client->getResult($taskId)->getBody()->getContents();
dump($result);
//// 将音频数据转换为文件以便传递给iFLYTEK SDK
//$tempFile = tempnam(sys_get_temp_dir(), 'audio');
//Tools::log_to_write_txt(['tempFile:',$tempFile]);
//file_put_contents($tempFile, $audioData);
//
//Tools::log_to_write_txt(['$xunfei_record_config'=>$xunfei_record_config]);
////$appId = '5ca1e5**';// 此行代码需要更换为用户自己的appid
////$secretKey = '4e41a9b93846815****************';// 此行代码需要更换为用户自己的secretKey
//$client = new LfasrClient($appId, $secretKey);
//Tools::log_to_write_txt(['开始上传音频']);
////echo "开始上传音频...\n";
////$taskId = $client->combineUpload(__DIR__ . '/../resource/lfasrTest.wav');
//$taskId = $client->combineUpload($tempFile);
//Tools::log_to_write_txt(['音频上传成功']);
////echo "音频上传成功task_id: $taskId\n";
////do {
//$progress = json_decode($client->getProgress($taskId)->getBody()->getContents(), true);
//Tools::log_to_write_txt(['进度'=>$progress]);
//
//if ($progress['ok'] !== 0) {
// //echo "获取任务进度失败\n";
// $res_json = BaseWssApi::json_wss('error','获取任务进度失败',$progress);
// Tools::log_to_write_txt($res_json);
// Gateway::sendToClient($client_id, $res_json);
// return;
//}
//
//if ($progress['err_no'] !== 0) {
// $res_json = BaseWssApi::json_wss('error','获取任务进度失败',$progress);
// Tools::log_to_write_txt($res_json);
// Gateway::sendToClient($client_id, $res_json);
// return;
//}
//$data = json_decode($progress['data'], true);
//
//if ($data['status'] == 9) {
//
// $result = $client->getResult($taskId)->getBody()->getContents();
// $res_json = BaseWssApi::json_wss('wss_revert_audio','音频转写成功开始获取结果',$result);
// Tools::log_to_write_txt($res_json);
// Gateway::sendToClient($client_id, $res_json);
// return;
//} else {
// $res_json = BaseWssApi::json_wss('error','持续转写中,错误:',$data);
// Tools::log_to_write_txt($res_json);
// Gateway::sendToClient($client_id, $res_json);
// return;
//}
}
function revert_test($client_id,$audioData){
$xunfei_record_config = config('xunfei_record_config');
$appId = $xunfei_record_config['appid'];
$secretKey = $xunfei_record_config['APIKey'];
dump($xunfei_record_config);
$client = new LfasrClient($appId, $secretKey);
echo "开始上传音频...\n";
$filePath = Tools::get_root_path().'public/iseTest.mp3';
$taskId = $client->combineUpload($filePath);
echo "音频上传成功task_id: $taskId\n";
do {
$progress = json_decode($client->getProgress($taskId)->getBody()->getContents(), true);
dump($progress);die;
if ($progress['ok'] !== 0) {
echo "获取任务进度失败\n";
exit;
}
if ($progress['err_no'] !== 0) {
echo "获取任务进度失败,错误码:" . $progress['err_no'] . "\n";
exit;
}
$data = json_decode($progress['data'], true);
if ($data['status'] == 9) {
echo "音频转写成功,开始获取结果...\n";
break;
} else {
echo "音频转写中...\n";
}
sleep(5);
} while (true);
$result = $client->getResult($taskId)->getBody()->getContents();
echo $result;
return $result;
}
}

View File

@@ -0,0 +1,103 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/5/23} {18:01}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\tool\Tools;
class BaseLogic
{
function domsg($client_id, $data){
try {
$res = @json_decode($data, true);
Tools::log_to_write_txt(['json_decode:', $res]);
if (!$res) {
$json = BaseWssApi::json_wss('error', '消息格式错误');
Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
return;
}
if (empty($res['action'])) {
$json = BaseWssApi::json_wss('error', '消息格式错误action必须');
Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
return;
}
$act_arr = explode('/', $res['action']);
if (empty($act_arr[0])) {
$json = BaseWssApi::json_wss('error', '错误的action格式');
Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
return;
}
if (empty($act_arr[1])) {
$json = BaseWssApi::json_wss('error', '错误的action格式');
Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
return;
}
//根据action执行业务逻辑
$controller = ucfirst($act_arr[0]);
$function = $act_arr[1];
$object = '\\app\\api\\logic\\' . $controller . 'Logic';
$obj = $this->getinstance($object);
$obj->$function($client_id, $res);
} catch (\Exception $e) {
Tools::error_txt_log($e);
$json = BaseWssApi::json_wss('error', '服务繁忙');
Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
}
}
function getinstance($className)
{
// 类名字符串
// 参数数组
// 确保类存在
if (!class_exists($className)) {
throw new \InvalidArgumentException("Class {$className} does not exist.");
}
// 创建反射类实例
$reflection = new \ReflectionClass($className);
// 检查构造函数是否存在
//if (!$reflection->hasMethod('__construct')) {
// throw new \LogicException("Class {$className} has no constructor.");
//}
//$constructor = $reflection->getConstructor();
// 如果构造函数有参数,我们需要匹配参数
//if ($constructor !== null) {
// $constructorParams = $constructor->getParameters();
//
// // 确保参数数量匹配
// if (count($constructorParams) !== count($params)) {
// throw new \InvalidArgumentException("Number of constructor parameters does not match provided arguments.");
//
// }
// // 创建参数数组,将参数类型与值匹配
// $matchedParams = [];
// foreach ($constructorParams as $index => $param) {
// // 如果参数允许null或者参数类型与传递的值兼容添加到匹配参数数组
// if ($param->allowsNull() || $param->getClass() === null || $param->getClass()->isInstance($params[$index])) {
// $matchedParams[] = $params[$index];
// } else {
// throw new \InvalidArgumentException("Provided argument does not match constructor parameter type at position {$index}.");
// }
// }
// // 使用反射类创建并初始化类实例
// $instance = $reflection->newInstanceArgs($matchedParams);
//} else {
//
//}
// 构造函数无参数,直接创建实例
$instance = $reflection->newInstanceWithoutConstructor();
return $instance;
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace app\api\logic;
use React\EventLoop\Factory;
use React\Socket\Connector;
use React\Http\Browser;
use React\Promise\Timer\Timeout;
use React\Stream\ThroughStream;
use React\WebSocket\ConnectionContext;
use React\WebSocket\WebSocketFactory;
class RealTimeASRClient
{
/**
* 根据所提供信息返回签名
*
* @param string $appId appid
* @param string $secretKey secretKey
* @param string $timestamp 时间戳,不传的话使用系统时间
* @return string
*/
function sign_V1($appId, $secretKey, $timestamp = null){
$timestamp = $timestamp ?: time();
$baseString = $appId . $timestamp;
$signa_origin = hash_hmac('sha1', md5($baseString), $secretKey, true);
return base64_encode($signa_origin);
}
function req(){
$loop = Factory::create();
$connector = new Connector($loop);
$browser = new Browser($connector);
$appid = 'your_appid';
$ts = strval(time());
$apiKey = 'your_apiKey';
// 生成signa
$baseString = $appid . $ts;
$md5BaseString = md5($baseString);
$signa = base64_encode(hash_hmac('sha1', $md5BaseString, $apiKey, true));
$url = "ws://rtasr.xfyun.cn/v1/ws?appid={$appid}&ts={$ts}&signa={$signa}";
$browser->request('GET', $url)
->then(function ($request) use ($loop) {
$request->on('response', function ($response) use ($loop) {
$response->on('data', function ($chunk) {
echo "Received: " . $chunk . PHP_EOL;
});
$response->on('close', function () {
echo "Connection closed." . PHP_EOL;
});
// 创建一个通过流,用于发送音频数据
$stream = new ThroughStream();
$stream->pipe($response);
// 这里可以发送音频数据,假设你有一个音频文件
// 注意:这只是一个示例,你需要根据实际情况发送数据
// $audioData = file_get_contents('/path/to/audio.pcm');
// $stream->write($audioData);
// 发送结束标志
$stream->end(json_encode(["end" => true]));
});
})
->then(null, function ($e) {
echo "Error: " . $e->getMessage() . PHP_EOL;
});
$loop->run();
}
}

View File

@@ -0,0 +1,98 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/15} {16:14}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* 听译聊天
* Class TychatLogic
* @package app\api\logic
*/
class TtchatLogic extends BaseLogic
{
/**
* desc保存听译聊天记录
*
* 注:
* 在websocket 的onMessage中send消息消息格式如下
*
* json参数
* [
'action'=>'TychatLogic/saveChatHistory',
'items'=>[
'content'=>'聊天内容',
'username'=>'用户名',//医生说话就传医生的username病人说话就传病人的username
]
];
*/
function saveChatHistory($chat_content){
$data = [
'chat_msg'=>$chat_content,
];
Db::table('fa_tt_chathistory')->insert($data);
return Tools::set_ok();
}
/**
* desc健康洞察
*
* api/HealthInsights/getHealthInsight
*
* authorwh
*/
function getHealthInsight(){
$config = config('ai_health_insight_config');
$question = '';//input('question','');
$chatobj = new ChatGPT();
$chatobj->url = $config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $config['APIKey'];
$answer_json_arr = [];
$ticket = input('ticket');
if(empty($ticket)){
return json(Tools::set_fail('ticket必须'));
}
$user = Db::table('fa_hdrdoctorusers')->where('ticket',$ticket)->find();
if(empty($user)){
return json(Tools::set_fail('用户不存在'));
}
$day3 = date('Y-m-d 00:00:00',strtotime('-3 day'));
$his_record = Db::table('fa_ty_chathistory')
//->where('username',$user['username'])
->order('id asc')
->where('createtime','>',$day3)//3天之内
->select();
$config = [
'stream'=>false,
];
$content = [
//["role" => "user", "content" => '']
];
foreach ($his_record as $item){
$content[] = ["role" => "user", "content" => $item['chat_msg']];
}
$chatobj->setBefore($content);
$chatobj->chat($question,$config,$answer_json_arr);
}
}

View File

@@ -0,0 +1,318 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/7/15} {16:14}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* 听译聊天
* Class TychatLogic
* @package app\api\logic
*/
class TychatLogic extends BaseLogic
{
/**
* desc听译-保存听译聊天记录,同时分发消息
*
* action:Tychat/saveChatHistory
* items:[
* 'chat_msg'=>'你好',
* ]
* authorwh
*/
function saveChatHistory($client_id,$data){
return Mmodel::catchJson(function ()use ($client_id,$data){
Tools::log_to_write_txt(['保存历史记录,入参'=>['域名'=>request()->controller().'/'.request()->action()]]);
$action = 'Tychat/saveChatHistory';
if(empty($data['items'])){
$json = Tools::wss_json_fail($action, 'items参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['chat_msg'])){
$json = Tools::wss_json($action, 550,'chat_msg参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['type'])){
$json = Tools::wss_json_fail($action, 'type参数错误缺少角色类型:doc、user');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['say_token'])){
$json = Tools::wss_json_fail($action, 'say_token参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['ticket'])){
$json = Tools::wss_json_fail($action, 'ticket参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['hdruserbaseinfo_id'])){
$json = Tools::wss_json_fail($action, 'hdruserbaseinfo_id 参数错误患者基本信息id必须。');
return Gateway::sendToClient($client_id, $json);
}
$hdruserbaseinfo_id = $data['items']['hdruserbaseinfo_id'];
$type = $data['items']['type'];//角色类型
$ticket = $data['items']['ticket'];
$say_token = $data['items']['say_token'];//对话票据
//{\"role\":\"patient\",\"text\":\" get message\"}
$chat_msg_arr = $data['items']['chat_msg'];//对话内容 $chat_msg是个数组
//保存历史记录 $chat_msg是个数组
$data = [
'chat_msg'=>json_encode($chat_msg_arr, JSON_UNESCAPED_UNICODE),
'username'=>'',
'type'=>$type,//聊天角色
'say_token'=>$say_token,//对话凭据
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
];
Tools::log_to_write_txt(['开始保存聊天记录'=>$data]);
Db::table(TabConf::$fa_ty_chathistory)
->data($data)
->insert();
Tools::log_to_write_txt(['结束保存聊天记录.']);
//广播消息
//查询广播客户端id
$arr = Db::table(TabConf::$fa_device)
->where('ticket',$ticket)
->where('clientid','neq',$client_id)//不给自己发
->find();
if(empty($arr)){
$json = Tools::wss_json_fail($action, '未找到广播对象,请确认目标对象是否登录并绑定设备关系');
return Gateway::sendToClient($client_id, $json);
}
if(empty($arr['clientid'])){
$json = Tools::wss_json_fail($action, '未找到广播对象,请确认目标对象是否登录并绑定设备关系!');
return Gateway::sendToClient($client_id, $json);
}
$clientid = $arr['clientid'];
//向客户端发送消息
$json = Tools::wss_json_ok($action, $chat_msg_arr);
Tools::log_to_write_txt(['向客户端广播消息,入参:clientid='.$clientid=>$json]);
Gateway::sendToClient($clientid,$json);
Tools::log_to_write_txt(['开始健康小洞察'=>$chat_msg_arr]);
//健康小洞察
$this->getHealthInsight2($hdruserbaseinfo_id,$chat_msg_arr);
});
}
/**
* desc保存听译聊天记录
*
*/
//private function saveHistory(string $username,string $chat_content,string $type,string $ticket){
// $data = [
// 'chat_msg'=>$chat_content,
// 'username'=>$username,
// 'type'=>$type,//聊天角色
// 'ticket'=>$ticket,//对话凭据
// ];
// Db::table('fa_ty_chathistory')
// ->data($data)
// ->insert();
//
//
// return Tools::set_ok();
//}
/**
* 查询聊天记录
*/
function getChatHistory(){
return Mmodel::catchJson(function (){
$ticket = input('ticket');
if(empty($ticket)){
return Tools::set_fail('ticket参数错误');
}
$list = Db::table('fa_ty_chathistory')
->where('ticket',$ticket)
->order('id desc')
->select();
return Tools::set_ok('查询成功',$list);
});
}
/**
* desc健康洞察
* 请求类型wss
* action: Tychat/getHealthInsight2
* items:[
* username:'18922226666',
* content=>[
["role" => "user", "content" => '']
],
* ]
* authorwh
*/
private function getHealthInsight2($hdruserbaseinfo_id,$chat_msg_arr){
Tools::log_to_write_txt(['健康洞察,入参'=>['域名'=>request()->controller().'/'.request()->action()]]);
//$action = 'Tychat/getHealthInsight2';
$config = config('ai_health_insight_config');
$question = '';//input('question','');
//$content = [
// ["role" => "user", "content" => '']
//];
$chatobj = new ChatGPT();
$chatobj->url = $config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $config['APIKey'];
$answer_json_arr = [];
$config = [
'stream'=>false,
'chatId'=>Tools::getMillisecond(),
];
$content = [
["role" => "user", "content" => $chat_msg_arr['text']]
];
$chatobj->setBefore($content);
$chatobj->returnAnswer($question,$config,$answer_json_arr);
Tools::log_to_write_txt(['健康洞察gpt请求参数'=>$chatobj->post_msg_body]);
////return json(Tools::set_ok('查询成功',$answer_json_arr));
Tools::log_to_write_txt(['健康洞察,出参'=>$answer_json_arr]);
$content_arr = json_decode($answer_json_arr[0],true);
if(empty($content_arr['choices'][0]['message']['content'])){
return;
}
$ctx_msg = $content_arr['choices'][0]['message']['content'];
//存储洞察内容
Db::table(TabConf::$fa_hdrhealth_insight)
->data([
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
'content'=>$ctx_msg,
])
->insert();
//$json = Tools::wss_json_ok($action, 'ok',$answer_json_arr);
//Gateway::sendToClient($clientid,$json);
}
/**
* desc医生打开诊断窗口记录打开诊断窗口时调用该接口发送对话数据给客户端客户端拿本地登录的票据与该票据参数做相等匹配
* 相等表示同一个医生,否则提示切换医生登录账号
*
* 请求类型wss
* action: Tychat/openChatRoomWriteRecord
* items:[
* doctor_name //医生姓名
doctor_phone //医生电话
name //患者姓名
phone //患者电话
ticket //对话票据
* ]
* 【注意】医患对话只会一对一
* authorwh
*/
function openChatRoomWriteRecord($client_id,$data){
return Mmodel::catchJson(function () use ($client_id,$data){
Tools::log_to_write_txt(['打开诊断窗口记录,入参'=>$data]);
$action = 'Tychat/openChatRoomWriteRecord';
if(empty($data['items'])){
$json = Tools::wss_json_fail($action, 'items参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['doctor_name'])){
$json = Tools::wss_json_fail($action, 'doctor_name参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['doctor_phone'])){
$json = Tools::wss_json_fail($action, 'doctor_phone参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['name'])){
$json = Tools::wss_json_fail($action, 'name 参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['phone'])){
$json = Tools::wss_json_fail($action, 'phone 参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['ticket'])){
$json = Tools::wss_json_fail($action, 'ticket 参数错误');
return Gateway::sendToClient($client_id, $json);
}
if(empty($data['items']['hdruserbaseinfo_id'])){
$json = Tools::wss_json_fail($action, 'hdruserbaseinfo_id 参数错误');
return Gateway::sendToClient($client_id, $json);
}
$hdruserbaseinfo_id = $data['items']['hdruserbaseinfo_id'];
$upd_data = [
'doctor_name'=>$data['items']['doctor_name'],
'doctor_phone'=>$data['items']['doctor_phone'],
'name'=>$data['items']['name'],
'phone'=>$data['items']['phone'],
'ticket'=>$data['items']['ticket'],
];
Db::table(TabConf::$fa_hdropen_chat_room_record)
->insert($upd_data);
//【注意】医患对话只会一对一
////更新医生对话设备目标
Db::table(TabConf::$fa_device)
->where('clientid',$client_id)
->data([
'target_name'=>$data['items']['name'],
'target_phone'=>$data['items']['phone'],
])
->update();
//查询患者设备
$device = Db::table(TabConf::$fa_device)
->where('username',$data['items']['doctor_phone'])
->where('clientid','neq',$client_id)//不是自己
->select();//严格来说只有一条数据
if(empty($device)){
$json = Tools::wss_json_fail($action, '错误:当前医生没有对应患者设备');
return Gateway::sendToClient($client_id, $json);
}
//医患只能一对一
if(count($device) > 1){
$json = Tools::wss_json_fail($action, '错误:当前医生存在多个患者设备,无法确认目标');
return Gateway::sendToClient($client_id, $json);
}
//更新患者设备的ticket为医生的ticket保持在一个组
Db::table(TabConf::$fa_device)
->where('clientid',$device[0]['clientid'])
->data([
'ticket'=>$data['items']['ticket'],
])
->update();
//向客户端发消息
$json = Tools::wss_json_ok($action,'诊断医生已打开诊断窗口',[
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
]);
Tools::log_to_write_txt(['打开诊断窗口记录,出参,向客户端发消息。'=>$json,'device:'=>$device]);
Gateway::sendToClient($device[0]['clientid'],$json);
});
}
}

View File

@@ -0,0 +1,117 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/5/23} {18:01}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use app\common\model\TabConf;
use GatewayWorker\Lib\Gateway;
use think\Db;
use wanghua\general_utility_tools_php\Mmodel;
use wanghua\general_utility_tools_php\tool\Tools;
/**
* Class TyuserLogic
* @package app\api\logic
*/
class TyuserLogic extends BaseLogic
{
/**
* desc客户端离线
* authorwh
*/
function offline($client_id){
Mmodel::catchTrans(function () use ($client_id){
Tools::log_to_write_txt(['服务端收到客户端离线消息client_id:' . $client_id]);
$user = Db::table(TabConf::$fa_device)
->where('clientid', $client_id)
->find();
if(empty($user)){
Tools::log_to_write_txt(['error:客户端离线用户不存在client_id:' . $client_id]);
return ;
}
Tools::log_to_write_txt(['设置离线时间clientid:' . $client_id]);
//$username = $user['username'];
Db::table(TabConf::$fa_device)
->where('clientid', $client_id)
->delete();
//把ticket设置为空标识离线不能清因为听译和数字人用的同一个账号否则查不到账号信息
//Db::table('fa_hdrdoctorusers')
// ->data([
// 'ticket'=>'',//修改为离线
// ])
// ->where('username',$username)
// ->update();
//在$client_id无效的情况下可能会抛出异常
//$json = BaseWssApi::wss_json('ok', '用户已离线');
//Gateway::sendToClient($client_id, json_encode($json, JSON_UNESCAPED_UNICODE));
});
}
/**
* desc登录选择角色时绑定设备关系
* 请求类型wss
*请求参数:
* json消息格式[
'action'=>'Tyuser/bindRelation',
'items'=>[
'username'=>'13333322323',
'ticket'=>'sadddddddddddddddddddddddddddd',
]
]
* authorwh
*/
function bindRelation($clientid,$data){
$action = 'Tyuser/bindRelation';
if(empty($data['items'])){
$json = Tools::wss_json($action,'items参数错误');
return Gateway::sendToClient($clientid, $json);
}
$items = $data['items'];
if(empty($items['username'])){
$json = Tools::wss_json($action,'username参数错误');
return Gateway::sendToClient($clientid, $json);
}
if(empty($items['ticket'])){
$json = Tools::wss_json($action,'ticket参数错误');
return Gateway::sendToClient($clientid, $json);
}
//验证clientid重复
$arr = Db::table(TabConf::$fa_device)
->where('clientid',$clientid)
->find();
if(!empty($arr)){
$json = Tools::wss_json($action,'clientid重复请重新登录');
return Gateway::sendToClient($clientid, $json);
}
//先清除这个医生的其它设备(可能是之前绑定的设备,因为医患设备只能一对一),不能清除自己的设备
Db::table(TabConf::$fa_device)
->where('username',$items['username'])
->where('clientid','neq',$clientid)
->delete();
//绑定设备
Db::table(TabConf::$fa_device)
->insert([
'username'=>$items['username'],
'clientid'=>$clientid,
'ticket'=>$items['ticket'],//对话票据,根据票据分发消息
]);
return null;
}
}

View File

@@ -0,0 +1,19 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/5/23} {17:34}
*/
namespace app\api\logic;
use app\api\controller\BaseWssApi;
use GatewayWorker\Lib\Gateway;
use wanghua\general_utility_tools_php\tool\Tools;
class WssMessageLogic extends BaseLogic
{
}

View File

@@ -0,0 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [];

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,63 @@
<?php
/*
* description
* authorwh
* email
* createTime{2023/12/5} {15:45}
*/
namespace app\common\behavior;
use app\api\logic\LoginLogic;
use wanghua\general_utility_tools_php\api\BaseUserLogic;
use wanghua\general_utility_tools_php\tool\Tools;
class LoginBehavior
{
//public function run(&$params)
//{
// // 行为逻辑
//}
public function actionBegin(){
return true;
//白名单
$white_arr = [
//【全小写】
'api/login/login',
'api/reg/reg',
'api/email/sendemail',
'api/email/check',
'api/users/forgot',
//public
'api/twitter/search',
];
$module = request()->module();
$controller = request()->controller();
$action = request()->action();
if($module != 'api'){
return false;
}
$url = strtolower($module.'/'.$controller.'/'.$action);
//dump($url);
if(in_array($url, $white_arr)){
//dump('不校验');
return true;//不校验
}
Tools::log_to_write_txt(['action log'=>input()]);
$r = session('api_user_info');
//dump($r);die;
if(empty($r)){
Tools::log_to_write_txt(['api_user_info'=>$r]);
echo json_encode(Tools::set_fail('登录失效'),JSON_UNESCAPED_UNICODE);die;
}
}
}

View File

@@ -0,0 +1,42 @@
<?php
/*
* description
* authorwh
* email
* createTime{2022/03/08} {14:17}
*/
namespace app\common\exception;
use think\exception\Handle;
use think\Request;
use wanghua\general_utility_tools_php\tool\Tools;
class SystemException extends Handle
{
public function render(\Exception $e)
{
// 参数验证错误
//if ($e instanceof ValidateException) {
// return json($e->getError(), 422);
//}
// 请求异常
//if ($e instanceof HttpException && request()->isAjax()) {
// return response($e->getMessage(), $e->getStatusCode());
//}
Tools::log_to_write_txt([
'error'=>'系统错误.'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
//request()->LogObj->flush();
//可以在此交由系统处理
return parent::render($e);
}
}

View File

@@ -0,0 +1,31 @@
<?php
/*
* description
* authorwh
* email
* createTime{2021/6/21} {15:02}
*/
namespace app\common\model;
use think\Db;
use think\Model;
class BaseModel extends Model
{
protected static $log_file = '';//日志文件名
/**
* desc
* authorwh
* @param $self_table
* @return \think\db\Query
*/
protected static function tab($self_table){
return Db::table($self_table);
}
}

View File

@@ -0,0 +1,421 @@
<?php
namespace app\common\model;
class TabConf
{
/**
* ai分析药品、影像、病历结果
*/
static $___fa_drugs_images_medical_task = '___fa_drugs_images_medical_task';
/**
* AI药品、影像、病历上传任务记录
*/
static $__fa_drugs_images_medical_result = '__fa_drugs_images_medical_result';
/**
* 基本信息图片上传并AI分析结果
*/
static $__fa_hbruser_drugs_images_medical_report = '__fa_hbruser_drugs_images_medical_report';
/**
* 管理员表
*/
static $fa_admin = 'fa_admin';
/**
* 管理员日志表
*/
static $fa_admin_log = 'fa_admin_log';
/**
* 地区表
*/
static $fa_area = 'fa_area';
/**
* 附件表
*/
static $fa_attachment = 'fa_attachment';
/**
* 分组表
*/
static $fa_auth_group = 'fa_auth_group';
/**
* 权限分组表
*/
static $fa_auth_group_access = 'fa_auth_group_access';
/**
* 节点表
*/
static $fa_auth_rule = 'fa_auth_rule';
/**
* 分类表
*/
static $fa_category = 'fa_category';
/**
* 在线命令表
*/
static $fa_command = 'fa_command';
/**
* 系统配置
*/
static $fa_config = 'fa_config';
/**
* 登录设备(一个医生有多个病历,一个医生同时只有一个客户端)
*/
static $fa_device = 'fa_device';
/**
* 基本信息图片上传和AI分析结果
*/
static $fa_drugs_images_medical_result = 'fa_drugs_images_medical_result';
/**
* 任务处理进度记录
*/
static $fa_drugs_images_medical_task = 'fa_drugs_images_medical_task';
/**
* 邮箱验证码表
*/
static $fa_ems = 'fa_ems';
/**
* 估量-ai处理结果
*/
static $fa_guliang_ai_deal_result = 'fa_guliang_ai_deal_result';
/**
* 估量-问答记录
*/
static $fa_guliangqarecord = 'fa_guliangqarecord';
/**
* 估量-问答配置
*/
static $fa_guliangquestion = 'fa_guliangquestion';
/**
* 估量-用户
*/
static $fa_gulianguser = 'fa_gulianguser';
/**
* 基本信息图片上传和AI分析结果
*/
static $fa_hbruser_drugs_images_medical = 'fa_hbruser_drugs_images_medical';
/**
* 基本信息图片上传并AI分析结果
*/
static $fa_hbruser_drugs_images_medical_report = 'fa_hbruser_drugs_images_medical_report';
/**
* 任务处理进度记录
*/
static $fa_hbruser_drugs_images_medical_task = 'fa_hbruser_drugs_images_medical_task';
/**
* 短信发送记录
*/
static $fa_hdr_sms_record = 'fa_hdr_sms_record';
/**
* 管理员
*/
static $fa_hdradmin = 'fa_hdradmin';
/**
* 科室
*/
static $fa_hdrdepartment = 'fa_hdrdepartment';
/**
* 医生账户信息
*/
static $fa_hdrdoctorusers = 'fa_hdrdoctorusers';
/**
* 统一随访记录
*/
static $fa_hdrfollowup = 'fa_hdrfollowup';
/**
* 随访模板
*/
static $fa_hdrfollowuptemplate = 'fa_hdrfollowuptemplate';
/**
* 患者健康洞察
*/
static $fa_hdrhealth_insight = 'fa_hdrhealth_insight';
/**
* 问诊报告存档疼痛科、听译、h5问诊统一存放一个基本信息对应一个报告
*/
static $fa_hdrmedical_report = 'fa_hdrmedical_report';
/**
* 打开对话窗口记录(同时向患者端发送当前对话患者信息)
*/
static $fa_hdropen_chat_room_record = 'fa_hdropen_chat_room_record';
/**
* 人格测试结果
*/
static $fa_hdrpersonalitytest = 'fa_hdrpersonalitytest';
/**
* 科室问卷答案
*/
static $fa_hdrquestionnaireanswer = 'fa_hdrquestionnaireanswer';
/**
* 科室问卷问题(一个问题对应多个答案)
*/
static $fa_hdrquestionnairequestion = 'fa_hdrquestionnairequestion';
/**
* 患者挂号列表(可重复挂号)
*/
static $fa_hdrregister = 'fa_hdrregister';
/**
* 用户答题记录
*/
static $fa_hdruseranswerrecord = 'fa_hdruseranswerrecord';
/**
* 统一问诊用户基本信息
*/
static $fa_hdruserbaseinfo = 'fa_hdruserbaseinfo';
/**
* 基本信息图片上传并AI分析结果
*/
static $fa_hdruserbaseinfo_upload = 'fa_hdruserbaseinfo_upload';
/**
* H5用户
*/
static $fa_hdrusersh5 = 'fa_hdrusersh5';
/**
* 智语医助-设备关联表
*/
static $fa_healdevicerelation = 'fa_healdevicerelation';
/**
* 医生新消息
*/
static $fa_message = 'fa_message';
/**
* 短信验证码表
*/
static $fa_sms = 'fa_sms';
/**
* 系统维护配置,支持模块、控制器、方法。全等匹配。
*/
static $fa_sys_maintain_config = 'fa_sys_maintain_config';
/**
* 测试表
*/
static $fa_test = 'fa_test';
/**
* 听译优医助手对话记录
*/
static $fa_tingyiueassistantchathis = 'fa_tingyiueassistantchathis';
/**
* 疼痛科聊天历史
*/
static $fa_tt_chathistory = 'fa_tt_chathistory';
/**
* 随访记录(数智人医生)
*/
static $fa_tt_followup = 'fa_tt_followup';
/**
* 疼痛科自由对话聊天历史
*/
static $fa_tt_free_chathistory = 'fa_tt_free_chathistory';
/**
* 疼痛科病历报告(听译问诊)(一个基本信息对应一个报告)
*/
static $fa_tt_medical_report = 'fa_tt_medical_report';
/**
* 疼痛科用户基本信息
*/
static $fa_tt_userbaseinfo = 'fa_tt_userbaseinfo';
/**
* 疼痛科用户
*/
static $fa_tt_users = 'fa_tt_users';
/**
* 听译-聊天历史
*/
static $fa_ty_chathistory = 'fa_ty_chathistory';
/**
* 随访记录(听译助手)
*/
static $fa_ty_followup = 'fa_ty_followup';
/**
* 听译-病历报告(听译问诊)(一个基本信息对应一个报告)
*/
static $fa_ty_medical_report = 'fa_ty_medical_report';
/**
* 听译问诊-患者病历信息
*/
static $fa_ty_userbaseinfo = 'fa_ty_userbaseinfo';
/**
* 听译问诊-患者病历信息
*/
static $fa_ty_usermedicalrecord = 'fa_ty_usermedicalrecord';
/**
* 听译-医生账号
*/
static $fa_ty_users = 'fa_ty_users';
/**
* 会员表
*/
static $fa_user = 'fa_user';
/**
* 会员组表
*/
static $fa_user_group = 'fa_user_group';
/**
* 会员余额变动表
*/
static $fa_user_money_log = 'fa_user_money_log';
/**
* 会员规则表
*/
static $fa_user_rule = 'fa_user_rule';
/**
* 会员积分变动表
*/
static $fa_user_score_log = 'fa_user_score_log';
/**
* 会员Token表
*/
static $fa_user_token = 'fa_user_token';
/**
* 用户
*/
static $fa_users = 'fa_users';
/**
* 用户操作日志
*/
static $fa_users_operate_log = 'fa_users_operate_log';
/**
* 版本表
*/
static $fa_version = 'fa_version';
/**
* 系统杂项配置
*/
static $fa_zc_sundry_config = 'fa_zc_sundry_config';
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,100 @@
<?php
/*
* description
* authorwh
* email
* createTime{2022/5/4} {9:12}
*/
namespace app\index\controller;
use app\apidata\Config;
use app\common\consts\LogDir;
use app\common\model\TabConf;
use app\index\model\WechatUserModel;
use think\Controller;
use think\Db;
use think\Request;
use wanghua\general_utility_tools_php\framework\base\OuterController;
use wanghua\general_utility_tools_php\tool\Tools;
class BaseAuthController extends BaseCommonController
{
public function __construct(Request $request = null)
{
parent::__construct($request);
//首页提示语
$this->assign('index_msg',cache('index_msg_alert_cache_time'));
//线上环境加载微信授权
if(config('sys_env') == 'PROD'){
$wx_user_info = session('wx_user_info');
if(empty($wx_user_info['openid'])) {
//重定向之前保存当前url, 在获取授权信息之后,回跳到授权之前的网页地址
session('redirect_before_url_session',request()->url(true));
//没有则重定向去授权
return $this->redirect(url('Wexinauth/usrAuth','',301,true));
}
$this->saveWechatUser($wx_user_info);
}
//校验系统维护状态 start
$chm = $this->checkMaintain();
if($chm['is_maintain']){
if($chm['openid']){
//解析openid
if(!in_array(index_user_openid(), explode(',',$chm['openid']))){
//白名单之外维护中
//Tools::log_to_write_txt([
// '维护测试'=>$chm['openid'],
// 'my'=>index_user_openid()
//]);
return $this->error($chm['msg']);
}
}else{
//不存在,直接维护中
return $this->error($chm['msg'].'');
}
}
//校验系统维护状态 end
}
/**
* desc
* authorwh
* @param $wx_user_info
*/
private function saveWechatUser($wx_user_info){
try {
$wechat_user = WechatUserModel::getWxUserByOpenid($wx_user_info['openid']);
if(empty($wechat_user)){
return WechatUserModel::insertInfo($wx_user_info);
}
//扩展,按周期更新,而不是不更新
if(empty($wechat_user['update_time']) || time()-strtotime($wechat_user['update_time'])>5*3600){
return WechatUserModel::updateUser($wx_user_info);
}
}catch (\Exception $e){
Tools::log_to_write_txt([
'error'=>'存储异常.'.$e->getMessage(),
'wx_user_info'=>$wx_user_info,
'error_info'=>$e->getTraceAsString()
],LogDir::WECHAT_USER_INFO_LOG);
}
}
}

View File

@@ -0,0 +1,29 @@
<?php
/*
* description
* authorwh
* email
* createTime{2023/1/21} {16:22}
*/
namespace app\index\controller;
use app\apidata\Config;
use app\common\model\TabConf;
use think\Controller;
use think\Db;
use think\Request;
use wanghua\general_utility_tools_php\framework\BaseController;
use wanghua\general_utility_tools_php\tool\Tools;
class BaseCommonController extends BaseController
{
function __construct(Request $request = null)
{
parent::__construct($request);
}
}

View File

@@ -0,0 +1,47 @@
<?php
/*
* description
* authorwh
* email
* createTime{2022/5/4} {9:39}
*/
namespace app\index\controller;
use think\Request;
use wanghua\general_utility_tools_php\framework\base\PublicController;
use wanghua\general_utility_tools_php\tool\Tools;
class BasePublicController extends BaseCommonController
{
public function __construct(Request $request = null)
{
parent::__construct($request);
//校验系统维护状态 start
$chm = $this->checkMaintain();
if($chm['is_maintain']){
if($chm['openid']){
//解析openid
if(!in_array(index_user_openid(), explode(',',$chm['openid']))){
//白名单之外维护中
//Tools::log_to_write_txt([
// '维护测试'=>$chm['openid'],
// 'my'=>index_user_openid()
//]);
return $this->error($chm['msg']);
}
}else{
//不存在,直接维护中
return $this->error($chm['msg'].'');
}
}
//校验系统维护状态 end
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace app\index\controller;
use GatewayWorker\Lib\Gateway;
use think\Controller;
use think\Db;
use wanghua\general_utility_tools_php\tool\Tools;
use Workerman\Worker;
class Index extends Controller
{
function index()
{
return $this->redirect(request()->domain().'/ai');
}
}

View File

@@ -0,0 +1,63 @@
<?php
/*
* description
* authorwh
* email
* createTime{2023/11/19} {22:32}
*/
namespace app\index\controller;
use think\Controller;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\wechat\TmpWexinauth;
use wanghua\general_utility_tools_php\wechat\UserAuth;
use wanghua\general_utility_tools_php\wechat\WechatLogic;
/**
*
*/
class Login extends Controller
{
function login()
{
$username = input('username');
$password = input('password');
return json(Tools::set_res(200,'ok',['username'=>$username]));
}
/**
* desc微信授权
* authorwh
*/
function wxauth()
{
try {
$code = input('code');
if(empty($code)){
return Tools::set_fail('CODE参数错误');
}
$wxconfig = get_boom_union_wechat_config();
$res = (new UserAuth($wxconfig,$wxconfig['access_token_path']))->usrAccessTokenApplet($code);
//绑定客户端ID和用户openid
return json(Tools::set_ok('ok',$res));
}catch (\Exception $e){
Tools::log_to_write_text([
'error'=>'微信授权异常。'.$e->getMessage(),
'input'=>input(),
'error_info'=>$e->getTraceAsString()
]);
return json(Tools::set_fail('请求异常'));
}
}
}

View File

@@ -0,0 +1,137 @@
<?php
/*
* description
* authorwh
* email
* createTime{2023/11/20} {10:28}
*/
namespace app\index\controller;
use app\api\logic\AudioRevertLogic;
use React\EventLoop\Factory;
use React\Socket\TcpConnector;
use React\Socket\SecureConnector;
use React\Socket\ConnectionInterface;
use wanghua\general_utility_tools_php\sms\AliSms;
/**
* @deprecated
*/
class Test extends BasePublicController
{
function test()
{
$config = config('sms_config');
$obj = new AliSms($config,$config['sms_sign_name'],$config['sms_template_code']);
//$obj->addTemplate();
//die;
$res = $obj->send('18290416033',json_encode(['code'=>1223]));
dump($res);
die;
$api_cache_arr['aaa'][] = ['api_name'=>111,'doc_txt'=>222];
$api_cache_arr['bb'][] = ['api_name'=>777,'doc_txt'=>777];
$api_cache_arr['aaa'][] = ['api_name'=>666,'doc_txt'=>666];
$api_cache_arr['ccc'][] = ['api_name'=>111,'doc_txt'=>222];
$api_cache_arr['aaa'][] = ['api_name'=>555,'doc_txt'=>555];
$api_cache_arr['ccc'][] = ['api_name'=>333,'doc_txt'=>333];
dump($api_cache_arr);die;
// 使用示例
$color = $this->stringToColor("example string");
//echo $color; // 输出颜色码
die;
$color_code = substr(md5('asdfasdf'),0,6);
echo '<div style="background-color:'.$color_code.'">test</div>';die;
// 使用示例
$color = $this->stringToColor("example string");
echo $color; // 输出颜色码
die;
// 配置您的讯飞应用信息
$appId = 'd482af59';
$apiKey = '0d20dab630904ad8676d9075375a1914';
// 创建事件循环
$loop = Factory::create();
// 创建TcpConnector它实现了ConnectorInterface
$tcpConnector = new TcpConnector($loop);
// 使用TcpConnector创建SecureConnector
$secureConnector = new SecureConnector($tcpConnector, $loop);
// 实时语音转写API地址
//ws://8.130.29.83:2700
//$url = 'ws://8.130.29.83:2700';
$url = 'wss://rtasr.xfyun.cn/v1/ws';
// 计算签名
$ts = time();
$baseString = $appId . $ts;
$md5BaseString = md5($baseString);
$signa = base64_encode(hash_hmac('sha1', $md5BaseString, $apiKey, true));
dump($signa);
$params = [
'appid' => $appId,
'ts' => $ts,
'signa' => $signa,
'lang' => 'zh-cn', // 中文普通话
];
dump($params);
$str = '';
$i = 0;
foreach ($params as $key => $value){
if($i==count($params)-1){
$str .= $key . '=' . $value ;
}else{
$str .= $key . '=' . $value . '&';
}
$i++;
}
$encodedParams = urlencode($str); // 对查询参数进行URL编码
// 构建WebSocket请求URL
$requestUrl = $url . '?' . $encodedParams;
dump($requestUrl);
// 使用SecureConnector连接到WebSocket服务器
$secureConnector->connect($requestUrl)->then(function (ConnectionInterface $conn) {
echo "Connected to the WebSocket server\n";
// ... 其他逻辑 ...
}, function ($error) {
// 连接失败处理
echo "Connection error: " . $error->getMessage() . "\n";
});
// 运行事件循环
$loop->run();
}
function callback($resource, $buffer, $length) {
global $audioQueue;
array_push($audioQueue, $buffer);
}
function testwss(){
return view();
}
function testwss2(){
return view();
}
function buildApiDoc()
{
parent::buildApiDoc();
}
public function buildTablesConf()
{
parent::buildTablesConf(); // TODO: Change the autogenerated stub
}
public function clearCache()
{
parent::clearCache(); // TODO: Change the autogenerated stub
}
}

View File

@@ -0,0 +1,173 @@
<?php
namespace app\index\logic\events;
use app\api\controller\BaseWssApi;
use app\api\logic\AudioRevertLogic;
use app\api\logic\BaseLogic;
use app\api\logic\TyuserLogic;
use app\api\logic\WssMessageLogic;
use GatewayWorker\Lib\Gateway;
use IFlytek\Xfyun\Speech\LfasrClient;
use think\Db;
use think\worker\Application;
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\tool\Tools;
use wanghua\general_utility_tools_php\websocket\BaseEvents;
use Workerman\Worker;
/**
* 本事件监控逻辑
*
* 1、安装长连接框架composer require workerman/gateway-worker
* 2、配置基本参数
* 配置为文件为 config/gateway_worker.php必须使用对应命令才能启动
* 配置端口startPortpingDataeventHandler其它默认就好
* eventHandler配置为app\index\logic\events\Events.php类用于处理监听后的业务逻辑
* 3、启动服务
* 启动命令为php think worker:gateway
* 4、 nginx服务配置以支持/wss方式访问
* 参考配置:
* location /wss
{
proxy_pass http://127.0.0.1:2000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
* 5、JavaScript客户端建立连接并访问
* ws = new WebSocket("wss://boomim.playone.cn/wss");//这种访问方式需要nginx配置
ws.onopen = function() {
alert("连接成功");
ws.send('hello,thinkphp');
alert("给服务端发送一个字符串hello,thinkphp");
};
*/
class Events extends BaseEvents
{
// /**
// * onWorkerStart 事件回调
// * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
// *
// * @access public
// * @param \Workerman\Worker $businessWorker
// * @return void
// */
// public static function onWorkerStart(Worker $businessWorker)
// {
// $app = new Application;
//
// $app->initialize();
//
//
// }
//
// /**
// * onConnect 事件回调
// * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
// *
// * @access public
// * @param int $client_id
// * @return void
// */
// public static function onConnect($client_id)
// {
// //一个连接只触发一次
// Tools::log_to_write_txt(['客户端完成TCP握手'=>"[{$client_id}]"]);
//
// $json = BaseWssApi::json_wss('onConnect','连接成功',['client_id'=>$client_id]);
// Gateway::sendToCurrentClient($json);
// }
//
// public static function onWebSocketConnect($client_id, $data)
// {
//
//// var_export($data);
// //对应客户端打开连接, 一个连接只触发一次
// Tools::log_to_write_txt(['客户端打开了websocket连接',$client_id,$data]);
// //$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'客户端打开连接时,发送到服务端的消息:','data'=>$data]);
// //
// //Gateway::sendToCurrentClient(json_encode($res,JSON_UNESCAPED_UNICODE));
// //$json = BaseWssApi::json_wss('openConnect','打开连接成功',['client_id'=>$client_id,'data'=>$data]);
// //Gateway::sendToCurrentClient($json);
// }
//
// /**
// * onMessage 事件回调
// * 当客户端发来数据(Gateway进程收到数据)后触发
// *
// * 解析消息,根据action处理业务逻辑
// *
// * @access public
// * @param int $client_id
// * @param mixed $data
// * @return void
// */
// public static function onMessage($client_id, $data)
// {
// Tools::log_to_write_txt(['客户端发来数据(Gateway进程收到数据).client_id:'.$client_id,$data]);
// //$res = Tools::set_ok('ok',['client_id'=>$client_id,'msg'=>'你发来的消息我接收到了:',$client_id=>$data]);
// //Gateway::sendToClient($client_id,json_encode($res,JSON_UNESCAPED_UNICODE));
//
// //if(empty($data)){
// // $json = BaseWssApi::json_wss('error','消息为空');
// //
// // Gateway::sendToClient($client_id, $json);
// // return ;
// //}
// ////解析消息
// //$xunfei_record_config = config('xunfei_record_config');
// //$appId = $xunfei_record_config['appid'];
// //$secretKey = $xunfei_record_config['secretKey'];
// //
// ////解析action
// //// 处理接收到的语音数据
// //// 这里需要将二进制数据转换为讯飞API所需的格式
// //// 以下代码仅为示例具体实现需要根据讯飞API文档进行调整
// //$lfasrClient = new LfasrClient($appId, $secretKey);
// //$lfasrClient->sendBinaryData($data, function ($result) use ($client_id) {
// // // 处理讯飞API返回的实时转写结果
// // // 将结果发送回客户端
// // Gateway::sendToClient($client_id, json_encode(['type' => 'transcription', 'data' => $result]));
// //});
// $obj = new BaseLogic();
// $obj->domsg($client_id,$data);
//
// }
/**
* onClose 事件回调 当用户断开连接时触发的方法
*
* @param integer $client_id 断开连接的客户端client_id
* @return void
*/
public static function onClose($client_id)
{
//GateWay::sendToAll("client[$client_id] logout\n");
Tools::log_to_write_txt(['断开连接.client_id:'.$client_id]);
//$url = 'https://boomim.playone.cn/api/Partnermerchants/offline';
//Curl::curl_post($url,['clientid'=>$client_id]);
(new TyuserLogic())->offline($client_id);
}
/**
* onWorkerStop 事件回调
* 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
*
* @param \Workerman\Worker $businessWorker
* @return void
*/
//public static function onWorkerStop(Worker $businessWorker)
//{
// //echo "WorkerStop\n";
// Tools::log_to_write_txt(['businessWorker进程退出时触发。每个进程生命周期内都只会触发一次.',$businessWorker]);
// //所有人离线,不需要修改所有用户离线状态,
// //因为离线后再上线clint_id会重新生成
//}
}

View File

@@ -0,0 +1,18 @@
<?php
/*
* description
* authorwh
* email
* createTime{2021/1/14} {14:37}
*/
namespace app\index\model;
use think\Db;
class BaseModel extends \app\common\model\BaseModel
{
}

View File

@@ -0,0 +1,320 @@
<?php
/*
* description
* authorwh
* email
* createTime{2022/01/18} {16:24}
*/
namespace app\index\model;
use app\apidata\Config;
use app\common\model\TabConf;
use think\Db;
class WechatUserModel extends \app\index\model\BaseModel
{
/**
* desc
* authorwh
* @param $wx_user_info \app\index\model\微信用户
*
* {
* "openid":"or9D2vs863Ky5Py2ovkAiu9XFLO4",
* "nickname":"起源果蔬副食大华",
* "sex":0,
* "language":"",
* "city":"",
* "province":"",
* "country":"",
* "headimgurl":"https://thirdwx.qlogo.cn/mmopen/vi_32/joiaA475nx3fJiaqx0ibdnWo4A7Q3uCgu2hsribI0ATLItORjuUgCSP8mCaBkqL61ibGojib4pQYX1djUhZpF5zoqpSg/132",
* "privilege":[]
* }
*/
static function insertInfo(array $wx_user_info)
{
if (isset($wx_user_info['privilege'])) {
$wx_user_info['privilege'] = json_encode($wx_user_info['privilege']);
}
$data = [
'nickname' => $wx_user_info['nickname'],
'country' => $wx_user_info['country'],
'province' => $wx_user_info['province'],
'city' => $wx_user_info['city'],
'headimage' => $wx_user_info['headimgurl'],
'language' => $wx_user_info['language'],
'openid' => $wx_user_info['openid'],
'unionid' => isset($wx_user_info['unionid']) ? $wx_user_info['unionid'] : '',
'privilege' => $wx_user_info['privilege'],
'sex' => $wx_user_info['sex'],
'arm_group' => '',
'score' => 0,//积分
'group_buy_earnings' => 0,//拼团收益
'water_drop_balance' => 0,//水滴
];
self::tab(TabConf::$fa_wechatuser)
->data($data)
->insert();
}
/**
* desc更新用户信息
*
* authorwh
* @throws \think\Exception
* @throws \think\exception\PDOException
*/
static function updateUser($wx_user_info)
{
$data = [
'nickname' => $wx_user_info['nickname'],
'headimage' => $wx_user_info['headimgurl'],
'unionid' => isset($wx_user_info['unionid']) ? $wx_user_info['unionid'] : '',
];
self::tab(TabConf::$fa_wechatuser)
->data($data)
->where('openid', index_user_openid())
->update();
}
/**
* desc
* authorwh
* @param string $unionid
* @return array|bool|\PDOStatement|string|\think\Model|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
static function getWxUserByUnionid(string $unionid)
{
return Db::table(TabConf::$fa_wechatuser)
->field('id')
->where('unionid', $unionid)
->find();
}
/**
* desc
* authorwh
* @param string $openid
* @return array|bool|\PDOStatement|string|\think\Model|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
static function getWxUserByOpenid(string $openid)
{
return Db::table(TabConf::$fa_wechatuser)
//->field('id')
->where('openid', $openid)
->find();
}
/**
* desc
* authorwh
* @param string $openid
* @return array|bool|\PDOStatement|string|\think\Model|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
static function getNicknameByOpenid(string $openid)
{
return Db::table(TabConf::$fa_wechatuser)
->where('openid', $openid)
->value('nickname');
}
/**
* desc增加店铺会员积分
*
* authorwh
*/
static function addShopMemberScore(string $openid, $shop_member_score)
{
Db::table(TabConf::$fa_wechatuser)
->where('openid', $openid)
->setInc('shop_member_score', $shop_member_score);
}
/**
* desc增加积分、积分变动记录
* authorwh
*/
static function addScore(string $openid, $order_real_amount)
{
$score = $order_real_amount * 100;
//用户
$user = Db::table(TabConf::$fa_wechatuser)
->where('openid', $openid)
->find();
//增加积分变动记录
Db::table(TabConf::$fa_score_change_record)
->data([
'nickname' => $user['nickname'],
'openid' => $user['openid'],
'score' => $score,
'score_before' => $user['score'],
'score_after' => $user['score'] + $score,
'from' => 'main_store_goods_buy_order',
])
->insert();
//增加积分
return self::tab(TabConf::$fa_wechatuser)
->where('openid', $openid)
->setInc('score', $score);//分为单位
}
/**
* desc减去积分 扣除积分、积分变动记录
* authorwh
*/
static function deductScore(string $openid, $order_real_amount, $remark = '')
{
$score = $order_real_amount * 100;
//用户
$user = Db::table(TabConf::$fa_wechatuser)
->where('openid', $openid)
->find();
//增加积分变动记录
Db::table(TabConf::$fa_score_change_record)
->data([
'nickname' => $user['nickname'],
'openid' => $user['openid'],
'score' => -$score,
'score_before' => $user['score'],
'score_after' => $user['score'] - $score,
'from' => 'system_deduct_score',//系统冲扣积分
'remark' => $remark,
])
->insert();
//增加积分
return self::tab(TabConf::$fa_wechatuser)
->where('openid', $openid)
->setDec('score', $score);//分为单位
}
/**
* desc积分冲补
*
* authorwh
* @param string $openid
* @param $order_real_amount
* @param string $remark
* @return bool|int|string|true
* @throws \think\Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
static function repairScore(string $openid, $order_real_amount, $remark = '')
{
$score = $order_real_amount * 100;
//用户
$user = Db::table(TabConf::$fa_wechatuser)
->where('openid', $openid)
->find();
//增加积分变动记录
Db::table(TabConf::$fa_score_change_record)
->data([
'nickname' => $user['nickname'],
'openid' => $user['openid'],
'score' => $score,
'score_before' => $user['score'],
'score_after' => $user['score'] + $score,
'from' => 'system_repair_score',//系统冲补积分
'remark' => $remark,
])
->insert();
//增加积分
return self::tab(TabConf::$fa_wechatuser)
->where('openid', $openid)
->setInc('score', $score);//分为单位
}
/**
* desc每笔订单成功之后增加水滴
*
* authorwh
* @param string $openid
* @param $order_real_amount
* @return bool|int|string|true
* @throws \think\Exception
*/
static function addWaterDropBalance(string $openid, $order_real_amount)
{
$water_drop_basic_num = (int)Config::sundryConfigVal('water_drop_basic_num');
$water = 0;
if ($order_real_amount < 1) {
$water = 1;//小于1积累1滴水滴
} else if ($order_real_amount >= 1 && $order_real_amount < 10) {
$water = 2;
} else if ($order_real_amount >= 10 && $order_real_amount < 50) {
$water = 3;
} else if ($order_real_amount >= 50 && $order_real_amount < 100) {
$water = 4;
} else if ($order_real_amount >= 100 && $order_real_amount < 500) {
$water = 5;
} else if ($order_real_amount >= 500 && $order_real_amount < 2000) {
$water = 6;
} else if ($order_real_amount >= 2000) {
$water = 7;
}
return self::tab(TabConf::$fa_wechatuser)
->where('openid', $openid)
->setInc('water_drop_balance', $water * $water_drop_basic_num);
}
/**
* desc实时获取用户身上的微信拼团收益
* authorwh
*/
static function getUserEarnings()
{
$val = self::tab(TabConf::$fa_wechatuser)
->where('openid', index_user_openid())
->value('group_buy_earnings');
return 1 * $val;
}
static function getUserTypeByOpenid(string $openid)
{
return self::tab(TabConf::$fa_wechatuser)
->where('openid', $openid)
->value('user_type');
}
/**
* desc实时获取用户身上的积分
* authorwh
*/
static function getUserScore()
{
return self::tab(TabConf::$fa_wechatuser)
->where('openid', index_user_openid())
->value('score');
}
/**
* desc实时获取用户身上的水滴
* authorwh
*/
static function getUserWater()
{
return self::tab(TabConf::$fa_wechatuser)
->where('openid', index_user_openid())
->value('water_drop_balance');
}
}

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<textarea type="text" id="msg">{"action":"user/offline","method":"response","msg":"22222","items":[]}</textarea> <button onclick="sendmsg()">发送消息</button>
</body>
<script>
let ws = new WebSocket("wss://ybx_prediagnosis.excn.top/wss");//这种访问方式需要nginx配置
ws.onopen = function() {
console.log("连接成功");
// ws.send('hello,thinkphp');
// let str = '{"action":"Tychat/saveChatHistory","items":{"chat_msg":"你好","type":"doc"}';
// console.log(str);
};
ws.onmessage = function(e){
// console.log(e);
//e.data 的数据格式也是字符串,手动解析这些数据才能得到其他格式的数据。
const _data = JSON.parse(e.data);
console.log(e.data,_data);
}
//当客户端收到服务端发送的关闭连接请求时触发onclose事件
ws.onclose = function(e){
console.log("close");
}
//如果出现连接、处理、接收、发送数据失败的时候触发onerror事件
ws.onerror = function(error){
console.log(error);
}
function sendmsg(){
let msg = document.getElementById("msg").value;
console.log('发送:'+msg);
ws.send(msg);
}
</script>
</html>

View File

@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="msg" value='{"action":"user/offline","method":"response","msg":"22222","items":[]}'> <button onclick="sendmsg()">发送消息</button>
</body>
<script>
let ws = new WebSocket("wss://rtasr.xfyun.cn/v1/ws?appid=d482af59&ts=1721021537&signa=WuLBMEvYlr7T1NKZLeQOiCU%2FJIo%3D&lang=zh-cn");//这种访问方式需要nginx配置
ws.onopen = function() {
console.log("连接成功");
ws.send('hello,thinkphp');
console.log("给服务端发送一个字符串hello,thinkphp");
};
ws.onmessage = function(e){
// console.log(e);
//e.data 的数据格式也是字符串,手动解析这些数据才能得到其他格式的数据。
const _data = JSON.parse(e.data);
console.log(e.data,_data);
}
//当客户端收到服务端发送的关闭连接请求时触发onclose事件
ws.onclose = function(e){
console.log("close");
}
//如果出现连接、处理、接收、发送数据失败的时候触发onerror事件
ws.onerror = function(error){
console.log(error);
}
function sendmsg(){
let msg = document.getElementById("msg").value;
console.log('发送:'+msg);
ws.send(msg);
}
</script>
</html>

View File

@@ -0,0 +1,14 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用容器绑定定义
return [
];

View File

@@ -0,0 +1,45 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 动态绑定属性
//框架生命周期日志(只支持tp5.0)
//\think\facade\Request::instance()->bind('LogObj',new \wanghua\general_utility_tools_php\log\Driver('mysql'));
//业务日志对象
//\think\Request::instance()->bind('ServeLogObj',new \wanghua\general_utility_tools_php\log\Driver('file'));
// 注册 app\index\behavior\CheckLang行为类到app_init标签位
//\think\Hook::add('app_init', '\\wanghua\\general_utility_tools_php\\log\\example\\LoggerBehavior');
//注册 app\admin\behavior\CronRun行为类到app_init标签位
//\think\Hook::add('app_end', '\\wanghua\\general_utility_tools_php\\log\\example\\LoggerBehavior');
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [
'app\\common\\behavior\\LoginBehavior',
],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
];

26
digital_doctor/build.php Normal file
View File

@@ -0,0 +1,26 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
return [
// 生成应用公共文件
'__file__' => ['common.php'],
// 定义demo模块的自动生成 (按照实际定义的文件名生成)
'demo' => [
'__file__' => ['common.php'],
'__dir__' => ['behavior', 'controller', 'model', 'view'],
'controller' => ['Index', 'Test', 'UserType'],
'model' => ['User', 'UserType'],
'view' => ['index/index'],
],
// 其他更多的模块定义
];

View File

@@ -0,0 +1,51 @@
{
"name": "topthink/think",
"description": "the new thinkphp framework",
"type": "project",
"keywords": [
"framework",
"thinkphp",
"ORM"
],
"homepage": "http://thinkphp.cn/",
"license": "Apache-2.0",
"authors": [
{
"name": "liu21st",
"email": "liu21st@gmail.com"
}
],
"require": {
"php": ">=7.4",
"topthink/framework": "5.1.*",
"topthink/think-worker": "2.0.*",
"workerman/gateway-worker": "^3.0",
"ext-json": "*",
"ext-mbstring": "*",
"doing/phpqrcode": "dev-master",
"iflytekop/xfyun-sdk": "^2.0",
"alibabacloud/dysmsapi-20170525": "dev-master",
"aliyuncs/oss-sdk-php": "^2.7",
"wanghua/general-utility-tools-php": "dev-master"
},
"autoload": {
"psr-4": {
"app\\": "application"
}
},
"extra": {
"think-path": "thinkphp"
},
"config": {
"preferred-install": "dist",
"allow-plugins": {
"topthink/think-installer": true
}
},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
}
}

View File

@@ -0,0 +1,307 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use \think\facade\Env;
use think\facade\Request;
// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------
//定位到项目根目录 E:\wh\projects\boom_im
$root_path = str_replace('config','',__DIR__);
list($debug,$trace,$sys_env) = [false,false,'DEV'];
if (!function_exists('is_main_domain')) {
function is_main_domain($domain, $main_domain)
{
$exp_arr = explode('.', $domain);
$str = $exp_arr[count($exp_arr) - 2] . '.' . $exp_arr[count($exp_arr) - 1];
return in_array($str, $main_domain);//$str == $main_domain;
}
}
if (!function_exists('auto_choose_app_conf')) {
function auto_choose_app_conf(&$debug,&$trace,&$sys_env){
$domain = Request::host(); //获取当前域名
if(in_array($domain, ['aaa.excn.top'])){
//正式 - 全域名
$debug = false;
$trace = false;
$sys_env = 'PROD';
}
//测试
else if(in_array($domain, ['ybx_prediagnosis.excn.top'])) {
$debug = true;
$trace = false;
$sys_env = 'DEV';
}
else {
//本地
$debug = true;
$trace = false;
$sys_env = 'LOCAL';
}
}
}
auto_choose_app_conf($debug,$trace,$sys_env);
return [
// 应用名称
'app_name' => '',
// 应用地址
'app_host' => '',
// 应用调试模式
'app_debug' => $debug,
// 应用Trace
'app_trace' => $trace,
// 是否支持多模块
'app_multi_module' => true,
// 入口自动绑定模块
'auto_bind_module' => false,
// 注册的根命名空间
'root_namespace' => [],
// 默认输出类型
'default_return_type' => 'html',
// 默认AJAX 数据返回格式,可选json xml ...
'default_ajax_return' => 'json',
// 默认JSONP格式返回的处理方法
'default_jsonp_handler' => 'jsonpReturn',
// 默认JSONP处理方法
'var_jsonp_handler' => 'callback',
// 默认时区
'default_timezone' => 'Asia/Shanghai',
// 是否开启多语言
'lang_switch_on' => false,
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => '',
// 默认语言
'default_lang' => 'zh-cn',
// 应用类库后缀
'class_suffix' => false,
// 控制器类后缀
'controller_suffix' => false,
// +----------------------------------------------------------------------
// | 模块设置
// +----------------------------------------------------------------------
// 默认模块名
'default_module' => 'index',
// 禁止访问模块
'deny_module_list' => ['common'],
// 默认控制器名
'default_controller' => 'Index',
// 默认操作名
'default_action' => 'index',
// 默认验证器
'default_validate' => '',
// 默认的空模块名
'empty_module' => '',
// 默认的空控制器名
'empty_controller' => 'Error',
// 操作方法前缀
'use_action_prefix' => false,
// 操作方法后缀
'action_suffix' => '',
// 自动搜索控制器
'controller_auto_search' => false,
// +----------------------------------------------------------------------
// | URL设置
// +----------------------------------------------------------------------
// PATHINFO变量名 用于兼容模式
'var_pathinfo' => 's',
// 兼容PATH_INFO获取
'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
// pathinfo分隔符
'pathinfo_depr' => '/',
// HTTPS代理标识
'https_agent_name' => '',
// IP代理获取标识
'http_agent_ip' => 'X-REAL-IP',
// URL伪静态后缀
'url_html_suffix' => 'html',
// URL普通方式参数 用于自动生成
'url_common_param' => false,
// URL参数方式 0 按名称成对解析 1 按顺序解析
'url_param_type' => 0,
// 是否开启路由延迟解析
'url_lazy_route' => false,
// 是否强制使用路由
'url_route_must' => false,
// 合并路由规则
'route_rule_merge' => false,
// 路由是否完全匹配
'route_complete_match' => false,
// 使用注解路由
'route_annotation' => false,
// 域名根如thinkphp.cn
'url_domain_root' => '',
// 是否自动转换URL中的控制器和操作名
'url_convert' => true,
// 默认的访问控制器层
'url_controller_layer' => 'controller',
// 表单请求类型伪装变量
'var_method' => '_method',
// 表单ajax伪装变量
'var_ajax' => '_ajax',
// 表单pjax伪装变量
'var_pjax' => '_pjax',
// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
'request_cache' => false,
// 请求缓存有效期
'request_cache_expire' => null,
// 全局请求缓存排除规则
'request_cache_except' => [],
// 是否开启路由缓存
'route_check_cache' => false,
// 路由缓存的Key自定义设置闭包默认为当前URL和请求类型的md5
'route_check_cache_key' => '',
// 路由缓存类型及参数
'route_cache_option' => [],
// 默认跳转页面对应的模板文件
'dispatch_success_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl',
'dispatch_error_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl',
// 异常页面的模板文件
'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl',
// 错误显示信息,非调试模式有效
'error_message' => '页面错误!请稍后再试~',
// 显示错误信息
'show_error_msg' => false,
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => '\\app\\common\\exception\\SystemException',
'pay_config'=>[
'wechat' => [
//小白菜商城
],
],
//数字人-报告生成接口(预问诊)(h5固定问答自由问答这几个在前端翔宇处配置key)
'ai_num_report_config'=>[
'base_url'=>'https://ue-ai.excn.top/api/v1/chat/completions',
//'APIKey'=>'fastgpt-jrmdlpu4ijKDl8dvh0zkHmk7m2smjXpM4stas9UnNQJOyjkNmGKM',
'APIKey'=>'fastgpt-wgZVEbXVl2egotIcTdDOmhhrbfyrtmWMyjz8Fqa1L581OegT9gMpvb',
],
//听译-报告生成接口(问诊)
'ai_listen_report_config'=>[
'base_url'=>'https://ue-ai.excn.top/api/v1/chat/completions',
'APIKey'=>'fastgpt-aA4mHjZZ3IVGX8mnwUHW8Ip9qdXfp8cWok26l0fRKQHa01hfsZCPF9',
],
//听译-健康小洞察
'ai_health_insight_config'=>[
'base_url'=>'https://serverfastgpt.excn.top/api/v1/chat/completions',
'APIKey'=>'fastgpt-slpyh4HgrcmxeKFKHK58OXwOUAqPvz5aa6kfyAhmGA8tK0cQef6WUhNDZ8nPDaZ',
],
//医生提示,问诊提示
'ai_doctor_tips_config'=>[
'base_url'=> 'https://ue-ai.excn.top/api/v1/chat/completions',
'APIKey'=>'fastgpt-b5JYnBaeESH2ExiwEg95PE3qP4SZNxUflCqZTLINslzefLQ9W2JJmXwfMyS',
],
//听译-讯飞录音接口
'xunfei_record_config'=>[
//优一
'appid'=>'de02dasd',
'APIKey'=>'31ce3f96c062958df3c426da4903540c',
'secretKey'=>'MjcyOGE5ODg3ODM2ZWU5MTNiODc0M2Zl',
//测试
//'appid'=>'d482af59',
//'APIKey'=>'0d20dab630904ad8676d9075375a1914',
//'secretKey'=>'Yjg0YTAyNmE5OGUwNDE3YjU4NWE4NmZh',
],
//azure文本转语音服务
'voice_to_text_service'=>[
'base_url'=> 'https://eastasia.tts.speech.microsoft.com/cognitiveservices/v1',
'APIKey'=>'090287baa7b14fcfb060a70bd1863f2f',
],
//量表处理ai
'scale_processing_ai_config'=>[
'base_url'=>'https://ue-ai.excn.vip/api/v1/chat/completions',
'APIKey'=>'fastgpt-fBwUxCwO4AE6aBEa6kmPl6BfCVr8vqKOe8F80nZG6zRgjQ9kNnD9',
],
//基本信息读取接口(传图片地址)【一张图片一个chatid】
'basic_information_read_config'=>[
'base_url'=>'https://ue-ai.excn.vip/api/v1/chat/completions',
'APIKey'=>'fastgpt-xQfBX6pAIFsEBlssRsPOo2kHJ80STZxkTahbThzVVY8fU0n5fomUd7YuLr',
],
//药品、影像、病历上传AI分析
'medicine_image_report_config'=>[
'base_url'=>'https://ue-ai.excn.vip/api/v1/chat/completions',
'APIKey'=>'fastgpt-cTEwcjNHtYLNa0ockBMGZmJJMS2XIvHQGjfg8AlPlnyNzg58555gKDtPz',
'notify_url'=>'https://ybx_prediagnosis.excn.top/api/Drugsimagesmedicaltasknotify/notify'
],
//听译优医AI助手
'ai_medical_assistant_config'=>[
'base_url'=>'https://ue-ai.excn.vip/api/v1/chat/completions',
'APIKey'=>'fastgpt-qglbpakk93NM7tLmhBxAIMk0AcyItx3RaLzifNgNAXRcc1sfd42Z',
],
//阿里云oss配置
'aliyun_oss_config' => [
//项目应用名称
'bucket'=>'wanlliuyinli-adm',//每创建一个bucket必须标明前缀代表这个bucket属于哪个项目
'UserPrincipalName'=>'wanghua@1113242774600735.onaliyun.com',
'Password'=>'(BgvEvL#7FQ%ZXRVc0kYCrOa2kd9ace!',
'AccessKeyId'=>'LTAI5tPqn1n7jugviVoGqFfa',
'AccessKeySecret'=>'BRoB5TdcUAFEuIR11BbN3R47Cm4Yep',
//https://help.aliyun.com/zh/oss/user-guide/regions-and-endpoints?spm=a2c4g.11186623.0.0.41ae2effA6oZar
'region_id'=>'cn-chengdu',//这里配置不能包含oss-前缀否则提示Invalid signing region in Authorization header
//西南1成都
//oss-cn-chengdu
//oss-cn-chengdu.aliyuncs.com
//oss-cn-chengdu-internal.aliyuncs.com
'endpoint'=>'oss-cn-chengdu.aliyuncs.com',//成都节点
'sts_endpoint'=>'sts.cn-chengdu.aliyuncs.com',//sts服务节点
//邮件配置
'accountName'=>'libin@mail.excn.vip',//发信服务地址
'fromAlias'=>'优一科技',//发信人昵称
],
//短信配置
'sms_config'=>[
//短信配置 start
//主号
//'AccessKeyId'=>'LTAI5tSEhubcsKbZsNM1GGZQ',
//'AccessKeySecret'=>'JgjBrCDYXMNsiLmoaE2bjMZFw7F9fu',
//副号
'AccessKeyId'=>'LTAI5tPqn1n7jugviVoGqFfa',
'AccessKeySecret'=>'BRoB5TdcUAFEuIR11BbN3R47Cm4Yep',
//优一科技 验证码配置
'sms_sign_name'=>'优一科技',//关联签名
'sms_template_code'=>'SMS_471455330',//模板CODE
'sms_template_name'=>'智语医助',//模板名称
//短信配置 end
],
//业务基础架构配置
'service_framework_config'=>[
//内网访问架构中放行的端口
'inner_allow_ports'=>[8080],
//错误重定向URL
'auth_err_redirect_url'=>'/index/err/checkfailed',
'sign_token'=>'ASbn56&1^%_qsdcvb',
//业务架构调试模式 false 关闭, true开启
'debug'=>false,
],
//当前系统环境类型
'sys_env'=>$sys_env,
//系统日志驱动
'sys_log_type'=>'file',//file mysql email
];

View File

@@ -0,0 +1,25 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
return [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
];

View File

@@ -0,0 +1,20 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
'name' => 'Think Console',
'version' => '0.1',
'user' => null,
'auto_path' => env('app_path') . 'command' . DIRECTORY_SEPARATOR,
];

View File

@@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Cookie设置
// +----------------------------------------------------------------------
return [
// cookie 名称前缀
'prefix' => '',
// cookie 保存时间
'expire' => 0,
// cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => '',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => '',
// 是否使用 setcookie
'setcookie' => true,
];

View File

@@ -0,0 +1,118 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use \think\facade\Env;
use think\facade\Request;
list($hostname,$database,$username,$password,$hostport) = ['','','','',''];
if (!function_exists('is_main_domain')) {
function is_main_domain($domain, $main_domain)
{
$exp_arr = explode('.', $domain);
$str = $exp_arr[count($exp_arr) - 2] . '.' . $exp_arr[count($exp_arr) - 1];
return in_array($str, $main_domain);//$str == $main_domain;
}
}
if (!function_exists('auto_choose_db_conf')) {
function auto_choose_db_conf(&$hostname,&$database,&$username,&$password,&$hostport){
$domain = Request::host(); //获取当前域名
//正式
if(in_array($domain, [
'sdsdsd.ss.cn'
])){
$hostname = 'mysql57.excn.top';
$database = 'digital_doctor';
$username = 'sss';
$password = 'sss';
$hostport = '3307';
}
//测试 socket请求这里$domain=null【上线正式环境之后把null移动到正式环境配置】
else if(in_array($domain, [null,'ybx_prediagnosis.excn.top'])) {
$hostname = '8.130.29.83';
$database = 'digital_doctor';
$username = 'wanghua';
$password = '1m2s3456';
$hostport = '3308';
//$hostname = 'mysql57.excn.top';
//$database = 'digital_doctor';
//$username = 'root';
//$password = '8m9s6843';
//$hostport = '3307';
}
//本地
else{
$hostname = '127.0.0.1';
$database = 'digital_doctor';
$username = 'root';
$password = 'root';//root or 123456
$hostport = '3306';
}
}
}
auto_choose_db_conf($hostname,$database,$username,$password,$hostport);
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => $hostname,
// 数据库名
'database' => $database,
// 用户名
'username' => $username,//正式:root,测试zc_game_admin本地root
// 密码.
'password' => $password,//正式:hbDB8SRa3Ix3poVi,测试KZK4cGd4XYsbNG5w本地root
// 端口
'hostport' => $hostport,
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 默认时区
'default_timezone' => 'PRC',
// 数据库调试模式
'debug' => false,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 自动读取主库数据
'read_master' => false,
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
// Builder类
'builder' => '',
// Query类
'query' => '\\think\\db\\Query',
// 是否需要断线重连
'break_reconnect' => true,
// 断线标识字符串
'break_match_str' => [],
];

View File

@@ -0,0 +1,52 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker:gateway 指令有效
// +----------------------------------------------------------------------
return [
/**
* https://blog.csdn.net/qq_15941409/article/details/135760559?spm=1001.2014.3001.5502
* 【长连接使用此配置,启动命令: php think worker:gateway 】
*/
// 扩展自身需要的配置
'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 监听地址
'port' => 2000, // 监听端口
'socket' => '', // 完整监听地址
'context' => [], // socket 上下文选项
'register_deploy' => true, // 是否需要部署register
'businessWorker_deploy' => true, // 是否需要部署businessWorker
'gateway_deploy' => true, // 是否需要部署gateway
// Register配置
'registerAddress' => '127.0.0.1:1256',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '127.0.0.1',
'startPort' => 1370,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"action":"ping"}',
// BusinsessWorker配置
'businessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
// 'eventHandler' => '\think\worker\Events',
'eventHandler' => 'app\index\logic\events\Events',
],
'sendToWorkerBufferSize' => 262144, // 设置为 128KB
];

View File

@@ -0,0 +1,30 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 日志设置
// +----------------------------------------------------------------------
return [
// 日志记录方式,内置 file socket 支持扩展
'type' => 'File',
// 日志保存目录
'path' => '',
// 日志记录级别
'level' => [],
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 0,
// 是否关闭日志写入
'close' => false,
];

View File

@@ -0,0 +1,18 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 中间件配置
// +----------------------------------------------------------------------
return [
// 默认中间件命名空间
'default_namespace' => 'app\\http\\middleware\\',
];

View File

@@ -0,0 +1,26 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 会话设置
// +----------------------------------------------------------------------
return [
'id' => '',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// SESSION 前缀
'prefix' => 'think',
// 驱动方式 支持redis memcache memcached
'type' => '',
// 是否自动开启 SESSION
'auto_start' => true,
];

View File

@@ -0,0 +1,35 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | 模板设置
// +----------------------------------------------------------------------
return [
// 模板引擎类型 支持 php think 支持扩展
'type' => 'Think',
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
'auto_rule' => 1,
// 模板路径
'view_path' => '',
// 模板后缀
'view_suffix' => 'html',
// 模板文件名分隔符
'view_depr' => DIRECTORY_SEPARATOR,
// 模板引擎普通标签开始标记
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' => '}',
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
];

View File

@@ -0,0 +1,18 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Trace设置 开启 app_trace 后 有效
// +----------------------------------------------------------------------
return [
// 内置Html Console 支持扩展
'type' => 'Html',
];

View File

@@ -0,0 +1,34 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Env;
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker 指令有效
// +----------------------------------------------------------------------
$app_path = explode('config',__FILE__)[0];
//dump($app_path);die;
return [
/** 【php think worker 命令默认启动的此文件 】 */
// 扩展自身需要的配置
'host' => '0.0.0.0', // 监听地址
'port' => 2006, // 监听端口
'root' => Env::get('root_path') . 'public', // WEB 根目录 默认会定位public目录
'app_path' => $app_path.'application', // 应用目录 守护进程模式必须设置(绝对路径)
'file_monitor' => false, // 是否开启PHP文件更改监控调试模式下自动开启
'file_monitor_interval' => 2, // 文件监控检测时间间隔(秒)
'file_monitor_path' => [], // 文件监控目录 默认监控application和config目录
// 支持workerman的所有配置参数
'name' => 'thinkphp',
'count' => 4,
'daemonize' => false,
'pidFile' => Env::get('runtime_path') . 'worker.pid',
];

View File

@@ -0,0 +1,85 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Env;
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker:server 指令有效
// +----------------------------------------------------------------------
return [
/**
* 2024-1-21日测试通过可以发信息
* php think worker:server
* 【php think worker:server start命令对应的是此文件】
*/
// 扩展自身需要的配置
'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 监听地址
'port' => 2001, // 监听端口
'socket' => '', // 完整监听地址
'context' => [], // socket 上下文选项
'worker_class' => '', // 自定义Workerman服务类名 支持数组定义多个服务
// 支持workerman的所有配置参数
'name' => 'thinkphp',
'count' => 4,
'daemonize' => false,
'pidFile' => Env::get('runtime_path') . 'worker.pid',
// 支持事件回调
// onWorkerStart
'onWorkerStart' => function ($worker) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onWorkerStart'=>$worker
]);
},
// onWorkerReload
'onWorkerReload' => function ($worker) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onWorkerReload'=>$worker
]);
},
// onConnect
'onConnect' => function ($connection) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onConnect'=>'onConnect'
]);
$connection->send(json_encode(['msg_type'=>'onConnect']));
//$connection->send(json_encode(['test'=>'test','conn'=>$connection],JSON_UNESCAPED_UNICODE));
},
// onMessage
'onMessage' => function ($connection, $data) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onMessage'=>$data
]);
$connection->send(json_encode(['msg_type'=>'onMessage']));
//$connection->send($connection.' === receive ,,,success');
},
// onClose
'onClose' => function ($connection) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onClose'=>'onClose'
]);
$connection->send(json_encode(['msg_type'=>'onClose']));
},
// onError
'onError' => function ($connection, $code, $msg) {
\wanghua\general_utility_tools_php\tool\Tools::log_to_write_txt([
'onError'=>[$code=>$msg]
]);
$connection->send(json_encode(['msg_type'=>'onError']));
//echo "error [ $code ] $msg\n";
},
];

2
digital_doctor/extend/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1,8 @@
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

View File

@@ -0,0 +1,26 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404您请求的文件不存在!</h3>
</body>
</html>

View File

@@ -0,0 +1,109 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/11/26} {15:41}
*/
set_time_limit(0);
//var_dump(111);die;
//创建一个循环,每隔三秒钟执行一次,调用接口
try {
while (true) {
//调用接口
$url = "https://ybx_prediagnosis.excn.top/api/Drugsimagesmedicalupload/queryDrugsImagesMedicalTask";
$res = curl_get($url);
//var_dump($res);
if($res['code'] == 200){
$arr_res = json_decode($res['data'],true);
//var_dump($arr_res);die;
//yes终止no不终止
if($arr_res['data'] == 'yes'){
echo "队列消费已终止";
break;
}
sleep(3);
}else{
echo "队列消费失败,已终止";
log_to_write_txt($res);
break;
}
}
}catch (\Exception $e){
log_to_write_txt(['error'=>'队列消费异常',$e->getMessage(),$e->getTraceAsString()]);
}
function curl_get(string $url, int $timeout = 10, $header=[])
{
$header = $header?:array(
'Accept: application/json',
);
$curl = curl_init();
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
//curl_setopt($curl, CURLOPT_SSLVERSION, 3);
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
// 超时设置,以秒为单位
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
// 超时设置,以毫秒为单位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
//执行命令
$data = curl_exec($curl);
// 显示错误信息
if (curl_error($curl)) {
//print "Error: ".curl_errno($curl).'-' . curl_error($curl);
//返回错误码
return ['code' => curl_errno($curl), 'msg' => curl_error($curl)];
} else {
//关闭句柄
curl_close($curl);
// 返回的内容
return ['code' => 200, 'msg' => 'cURL ok', 'data' => $data];
}
}
function log_to_write_txt($data = 'test', $dirname = '')
{
$root_path = explode('vendor',__DIR__)[0];
$runtime_path = $root_path.'runtime/';
if ($dirname) {
$filepath = $runtime_path . 'log/' . ($dirname).'/'.date('Ymd');//运行时日志
}else{
$filepath = $runtime_path . 'log/'.date('Ym');//运行时日志
}
if (!file_exists($filepath)) {
mkdir($filepath, 0777, true);
}
if($dirname){
$filepath .= '/log' . date('YmdH') . '.txt';
}else{
$filepath .= '/' . date('d') . '_error.log';
}
$ip = request()->ip();
list($t1, $t2) = explode(' ', microtime());
$write_time = date('Y-m-d H:i:s',$t2).' '.sprintf('%.0f',$t1*1000);
$str = "\n" . $write_time . ' | '. $ip.' | ' . request()->baseUrl() . "\n";
$data = is_object($data) || is_array($data) ? $str . json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $str . $data;
file_put_contents($filepath, $data, FILE_APPEND);
}

View File

@@ -0,0 +1 @@
[data-v-a393941b] .uni-forms-item__label{width:90px!important}

View File

@@ -0,0 +1 @@
[data-v-2f722e9b] .uni-forms-item__label{width:90px!important}

View File

@@ -0,0 +1 @@
.icon-modal-box[data-v-8a6af66a]{padding-top:var(--top-window-height)}.icon-modal[data-v-8a6af66a]{width:350px;background-color:#fff;height:500px;overflow-y:scroll}@media screen and (min-width: 768px){.icon-modal-pc[data-v-8a6af66a]{width:600px}}

View File

@@ -0,0 +1 @@
.uni-tooltip[data-v-01b56913]{position:relative;cursor:pointer;display:inline-block}.uni-tooltip-popup[data-v-01b56913]{z-index:1;display:none;position:absolute;background-color:#333;border-radius:8px;color:#fff;font-size:12px;text-align:left;line-height:16px;padding:12px;overflow:auto}.uni-tooltip:hover .uni-tooltip-popup[data-v-01b56913]{display:block}.uni-stat-tooltip-s[data-v-e336599b]{width:160px;white-space:normal}.uni-label-text[data-v-e336599b]{font-size:14px;font-weight:700;color:#555;margin-top:17px;margin-bottom:17px;margin-right:5px}.uni-stat--tab-x[data-v-e336599b]{display:flex;margin:0 15px;white-space:nowrap}.uni-stat--tab[data-v-e336599b]{display:flex;flex-wrap:wrap;align-items:center}.uni-stat--tab-item[data-v-e336599b]{white-space:nowrap;font-size:14px;color:#666;text-align:center;cursor:pointer;box-sizing:border-box;margin:15px 0}.uni-stat--tab-item-disabled[data-v-e336599b]{cursor:unset;opacity:.4}.uni-stat--tab-item-line[data-v-e336599b]{margin-right:30px;padding:2px 0;border-bottom:1px solid transparent;height:32px}.uni-stat--tab-item-line[data-v-e336599b]:last-child{margin-right:0}.uni-stat--tab-item-line-active[data-v-e336599b]{color:#000;border-bottom:2px solid #127FFF;font-size:22px;font-weight:700;height:42px}.uni-stat--tab-item-boldLine[data-v-e336599b]{box-sizing:border-box;margin-right:30px;padding:2px 0;border-bottom:2px solid transparent}.uni-stat--tab-item-boldLine[data-v-e336599b]:last-child{margin-right:0}.uni-stat--tab-item-boldLine-active[data-v-e336599b]{box-sizing:border-box;color:#127fff;border-bottom:2px solid #127FFF}.uni-stat--tab-item-box[data-v-e336599b]{padding:5px 15px;border:1px solid #dcdfe6}.uni-stat--tab-item-box[data-v-e336599b]:not(:last-child){border-right-color:transparent}.uni-stat--tab-item-box-active[data-v-e336599b]{box-sizing:border-box;border:1px solid #127FFF!important}@media screen and (max-width: 500px){.hide-on-phone[data-v-e336599b]{display:none}.uni-stat--tab[data-v-e336599b]{flex-wrap:unset;overflow-x:auto!important}[data-v-e336599b]::-webkit-scrollbar{display:none}}.record-container[data-v-13de40ec]{padding:30px;height:460px;overflow:hidden;overflow-y:scroll;box-sizing:border-box}.record-title[data-v-13de40ec]{font-size:24px;font-weight:700;color:#000}.record-content[data-v-13de40ec]{margin-top:20px}.record-content .question[data-v-13de40ec]{font-weight:600;color:#000}.record-content .answer[data-v-13de40ec]{color:#df5555}.poput-box[data-v-500a6d12]{width:400px;padding:19px 41px;background-color:#fff}.poput-box .title[data-v-500a6d12]{font-size:16px;color:#000;text-align:center}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[data-v-ab433150] .uni-forms-item__label{width:90px!important}

View File

@@ -0,0 +1 @@
.icon-modal-box[data-v-2ca0600e]{padding-top:var(--top-window-height)}.icon-modal[data-v-2ca0600e]{width:350px;background-color:#fff;height:500px;overflow-y:scroll}@media screen and (min-width: 768px){.icon-modal-pc[data-v-2ca0600e]{width:600px}}

View File

@@ -0,0 +1 @@
.reset-password-btn[data-v-c5633962]{line-height:36px;color:#007aff;text-decoration:underline;cursor:pointer}.cancel-reset-password-btn[data-v-c5633962]{color:#007aff;padding-right:10px;cursor:pointer}[data-v-c5633962] .uni-forms-item__label{width:90px!important}

View File

@@ -0,0 +1 @@
.poput-box[data-v-932b6e28]{width:400px;padding:19px 41px;background-color:#fff}.poput-box .title[data-v-932b6e28]{font-family:Source Sans Pro,Source Sans Pro;font-weight:600;font-size:20px;color:#000;text-align:center}

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More