CaseQualityBox2.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. <template>
  2. <div class="CaseQualityBox2">
  3. <el-row style="padding: 10px;line-height: 20px;" type="flex" justify="space-between">
  4. <span><span class="text-bold">病案号:</span>{{baseInfo.AAA28}}</span>
  5. <span><span class="text-bold">床号:</span>{{baseInfo.CH}}</span>
  6. <span><span class="text-bold">患者:</span>{{baseInfo.BRXM}}</span>
  7. </el-row>
  8. <el-tabs v-model="tabsActive" style="padding: 0 10px;background-color: #fff;">
  9. <el-tab-pane v-for="(item, index) in tabsArray" :key="index" :label="item.label" :name="item.name" >
  10. </el-tab-pane>
  11. </el-tabs>
  12. <div v-if="tabsActive == 1" class="tabContent">
  13. <div
  14. class="taskNameListAndMessage"
  15. :style="{
  16. width: currentTaskName ? '840px' : '340px'
  17. }"
  18. >
  19. <el-menu
  20. v-if="showTaskNameMenu"
  21. :default-active="currentTaskName"
  22. class="el-menu-vertical-demo"
  23. :style="{
  24. width: currentTaskName ? '230px' : '340px'
  25. }"
  26. >
  27. <div v-for="item in taskNameList">
  28. <el-submenu :index="`${item.id}`" v-if="item.child">
  29. <template slot="title">
  30. <span style="padding-left:20px">{{item.name}}</span>
  31. </template>
  32. <div v-for="element in item.child">
  33. <el-submenu :index="`${element.parent_id}-${element.id}`" v-if="element.child">
  34. <template slot="title">
  35. <span style="padding-left:40px">{{element.name}}</span>
  36. </template>
  37. <el-menu-item v-for="elementItem in element.child" :index="`${item.id}-${elementItem.parent_id}-${elementItem.id}`" @click="handleTaskNameSelect(elementItem, `${item.id}-${elementItem.parent_id}-${elementItem.id}`)">
  38. <span slot="title">{{elementItem.name}}</span>
  39. </el-menu-item>
  40. </el-submenu>
  41. <el-menu-item :index="`${element.parent_id}-${element.id}`" v-else @click="handleTaskNameSelect(element, `${element.parent_id}-${element.id}`)">
  42. <span slot="title">{{element.name}}</span>
  43. </el-menu-item>
  44. </div>
  45. </el-submenu>
  46. <el-menu-item :index="`${item.id}`" v-else @click="handleTaskNameSelect(item, item.id)">
  47. <span slot="title">{{item.name}}</span>
  48. </el-menu-item>
  49. </div>
  50. </el-menu>
  51. <div class="messageBox" v-if="currentTaskName">
  52. <div class="message">
  53. <div v-for="(item,index) in chatMessages" :key="index">
  54. <div v-if="item.role == 'user'" class="user-message">
  55. <div class="user-content">
  56. <div>{{item.content}}</div>
  57. </div>
  58. <el-avatar src="static/img/avatar07.7b002992.png" fit="contain"></el-avatar>
  59. </div>
  60. <div v-if="item.role == 'assistant'" class="record-message">
  61. <el-avatar :src="require('../../../assets/images/jiqiren.png')" fit="contain"></el-avatar>
  62. <div class="record-content">
  63. <div>{{item.content}}</div>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. <div class="sendMessageBox">
  69. <!-- <div style="width: 80px;border-radius: 10px 0 0 10px; background-color: #DDDDDD;display: flex;flex-wrap: wrap;justify-content: center;padding-bottom: 5px;">
  70. <button style="width: 60px;margin-top: 5px;border-radius: 5px;border: 1px solid blue;color: blue">“ 病历</button>
  71. <button style="width: 60px;margin-top: 5px;border-radius: 5px;border: 1px solid blue;color: blue">“ 检查</button>
  72. <button style="width: 60px;margin-top: 5px;border-radius: 5px;border: 1px solid blue;color: blue">“ 检验</button>
  73. <button style="width: 60px;margin-top: 5px;border-radius: 5px;border: 1px solid blue;color: blue">“知识库</button>
  74. </div> -->
  75. <div style="width: calc(100%)">
  76. <textarea class="inputText" v-model="inputMessage" placeholder="请输入您的问题,帮您深度解答"></textarea>
  77. <el-row type="flex" justify="space-between" align="middle">
  78. <!-- <el-icon class="iconfont zj-damuzhi" style="margin-left: 20px;line-height: 35px;"></el-icon>
  79. <el-icon class="iconfont zj-zanxia" style="margin-left: 20px;line-height: 35px;"></el-icon> -->
  80. <!-- <el-button type="primary" @click="sendMessage()" icon="el-icon-top" circle> -->
  81. <div @click="showTaskNameMenu = !showTaskNameMenu"><Hamburger/></div>
  82. <!-- </el-button> -->
  83. <el-button type="primary" @click="sendMessage()" icon="el-icon-top" circle></el-button>
  84. </el-row>
  85. </div>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. <!--病案首页-->
  91. <div v-else-if="tabsActive == 3" class="tabContent">
  92. <div ref="box" class="box22" :style="{width: width ? width + 'px' : '100%'}" :class="{'nocopy': $route.meta.nocopy}">
  93. <div class="score-box" :class="scoreLevel == '甲'? 'scoreLevel_1' : ( scoreLevel == '乙'?'scoreLevel_2': (scoreLevel == '丙'?'scoreLevel_3':'' ) ) ">
  94. <div>病案评分<span class="score-f">{{ data.score }}分</span></div>
  95. <!-- <h2 class="score-dj">{{ scoreLevel }}</h2> -->
  96. </div>
  97. <el-row type="flex" justify="space-between" align="middle" class="card-box card-box-noStyle" v-if="data.is_case">
  98. <span class="title font-size12">
  99. <i :class="`el-icon-arrow-${!filterCollapse ? 'up' : 'down'}`" style="cursor: pointer" @click="filterCollapse = !filterCollapse"/>
  100. <span class="text-bold" style="margin-left: 5px;cursor: pointer;" @click="setFilterForm('')">
  101. 问题数量:
  102. <span class="problem_count">{{data.data && Array.isArray(data.data) ? data.data.length : 0 }}</span>
  103. </span>
  104. </span>
  105. <span class="font-size12">{{ data.quality_time }}</span>
  106. <el-tag type="danger" v-if="data.is_case == 1" class="font-size12">质控中</el-tag>
  107. <el-tag v-if="data.is_case == 2" class="font-size12">已质控</el-tag>
  108. </el-row>
  109. <div class="filterBox" v-if="!filterCollapse">
  110. <div v-for="(value, key) in filterList" :class="`${filterFormData.type == key ? 'filterRow selected' : 'filterRow'}`" @click="setFilterForm(key)">
  111. <div class="filterLabel text-bold">{{value.label}}</div>
  112. <span style="margin-left: 10px">({{data.summary[key] && Array.isArray(data.summary[key]) ? data.summary[key].length : 0}})</span>
  113. </div>
  114. </div>
  115. <el-scrollbar ref="scrollRef" class="scrollBox" :style="`height: ${scrollHeight}`">
  116. <template v-if="(!filterFormData.type? !!(data.data.length) : !!((data.summary)[filterFormData.type].length)) ">
  117. <template v-for="(item, index) in (!filterFormData.type? data.data : (data.summary)[filterFormData.type])">
  118. <!-- is_appeal: 是否申述 -->
  119. <div class="list-box box-card" :key="index">
  120. <div class="list-score-tips-box">
  121. <el-row type="flex" align="middle" justify="space-between" style="margin-bottom: 15px;">
  122. <el-row type="flex">
  123. <div class="list-item-score" :class="item.level == -1 ? 'hover-0' : item.level == 1 ? 'hover-1' : 'hover-2' ">
  124. {{ item.level == -1 ? '预警' : item.level == 1? '必改':'建议' }}
  125. </div>
  126. <div class="list-item-field" :title="item.error_field">
  127. {{ item.error_field }}
  128. </div>
  129. </el-row>
  130. <div v-if="item.level != -1" style="color: #DA1515;" class="text-bold">
  131. -{{ item.score }}分
  132. </div>
  133. </el-row>
  134. <el-row type="flex" justify="space-between" align="top">
  135. <div>
  136. <div class="list-item-title">错误描述:</div>
  137. <div class="list-item-value" style="margin-bottom: 15px">{{ item.notice }}</div>
  138. </div>
  139. <el-image class="list-item-image" v-if="item.is_artificial == 0" :src="require('../../../assets/images/zsicon.png')" fit="contain">
  140. </el-image>
  141. <el-image v-if="item.is_artificial == 1" class="list-item-image" :src="require('../../../assets/images/ysicon.png')" fit="contain">
  142. </el-image>
  143. </el-row>
  144. <div class="list-item-title" @click="item.basis && clickListItem(index)">
  145. 质控依据 <i :class="`el-icon-arrow-${item.show ? 'up' : 'down'}`" style="cursor: pointer;font-weight: bold"></i>
  146. </div>
  147. <div class="list-item-basis-box">
  148. <div class="list-basis-text">
  149. <div class="list-basis-text-t" :class="item.show?'show':''">
  150. <div v-for="(yItem, yIndex) of item.basis" :key="yIndex" style="margin-bottom: 10px;">
  151. <div v-if="typeof yItem == 'string'">
  152. <span class="span-index">{{ yIndex+1 }}</span>
  153. <span class="list-item-value">{{yItem}}</span><br/>
  154. </div>
  155. <el-row v-else class="list-basis-text-t-noString">
  156. <span class="span-index">{{ yIndex+1 }}</span>
  157. <span v-for="(cItem, cIndex) in yItem" :key="cIndex" v-if="!isNaN(parseFloat(cIndex))">
  158. <span class="list-item-value">{{cItem}}</span>
  159. <div style="height: 10px"></div>
  160. </span>
  161. </el-row>
  162. </div>
  163. </div>
  164. <div class="list-basis-bottom-box" v-if="$route.path == '/whitelist-caseControl'">
  165. <div class="list-basis-bottom-tips">
  166. <div class="appeal_no" @click="clickAppeal('appeal_no', item, 2 )" v-if="item.appeal_type == 2 && item.appeal_status == 2">驳回</div>
  167. <div class="appeal_progress" v-if="item.appeal_type == 2 && item.appeal_status == 0">申诉中</div>
  168. <div class="appeal_in_edit" @click="clickAppealEdit(item, 2)" v-if="item.is_artificial == 1">已整改</div>
  169. </div>
  170. <div class="list-basis-bottom-btn" v-if="item.appeal_type == 0">
  171. <div class="appeal" @click="clickAppeal('appeal', item, 2 )">申诉</div>
  172. <div class="appeal_in_ignore" @click="clickAppeal('appeal_in_ignore', item, 2 )">忽略</div>
  173. </div>
  174. </div>
  175. </div>
  176. </div>
  177. </div>
  178. </template>
  179. </template>
  180. <template v-else>
  181. <el-empty :image-size="100"></el-empty>
  182. </template>
  183. </el-scrollbar>
  184. </div>
  185. </div>
  186. <AppealModal ref="AppealModalRef" @onUpdate="getTableData()"/>
  187. </div>
  188. </template>
  189. <script>
  190. import Hamburger from '@/components/Hamburger';
  191. import AppealModal from '@/components/appealModal/index.vue'
  192. import { setCorrection } from '@/api/qc'
  193. import { examineAppeal, getAppealData, getBrry } from '@/api/qc';
  194. export default {
  195. components: {
  196. Hamburger,
  197. AppealModal
  198. },
  199. props: {
  200. // data: {
  201. // type: Object,
  202. // default() {
  203. // return {
  204. // data: {}
  205. // }
  206. // }
  207. // },
  208. // mainHomeData: {
  209. // type: Object,
  210. // default() {
  211. // return {
  212. // data: {}
  213. // }
  214. // }
  215. // },
  216. // type:{
  217. // type: String,
  218. // default() {
  219. // return ''
  220. // }
  221. // },
  222. height: {
  223. type: Number,
  224. default() {
  225. return 0
  226. }
  227. },
  228. width: {
  229. type: Number,
  230. default() {
  231. return 0
  232. }
  233. },
  234. MED_REC_ID: {
  235. type: String,
  236. default() {
  237. return ''
  238. }
  239. }
  240. },
  241. data(){
  242. return {
  243. data: {},
  244. inputMessage:'',//消息输入框
  245. chatMessages:[],//内容显示
  246. tabsActive:'3',//tabs选择
  247. tabsArray:[
  248. {'name':'3','label':'质控结果'},
  249. {'name':'1','label':'病历生成'},
  250. // {'name':'2','label':'病案首页'},
  251. // {'name':'4','label':'编目首页'},
  252. ],
  253. is_show: true,
  254. taskNameList: [],
  255. currentTaskName: '',
  256. showTaskNameMenu: true,
  257. baseInfo: {},
  258. filterCollapse: false,
  259. filterFormData: {
  260. type: ''
  261. },
  262. filterList: {
  263. ryjl: {
  264. label: '入院记录',
  265. value: 0
  266. },
  267. bcjl: {
  268. label: '病程记录',
  269. value: 0
  270. },
  271. ssjl: {
  272. label: '手术记录',
  273. value: 0
  274. },
  275. cyjl: {
  276. label: '出院记录',
  277. value: 0
  278. },
  279. tys: {
  280. label: '同意书',
  281. value: 0
  282. },
  283. qt: {
  284. label: '其他文书',
  285. value: 0
  286. }
  287. }
  288. }
  289. },
  290. computed: {
  291. scoreLevel() {
  292. /**
  293. * 甲>90分
  294. * 乙75-90分
  295. * 丙<75分
  296. * */
  297. let str
  298. const { score } = this.data
  299. if (score > 90) {
  300. str = '甲'
  301. } else if (score < 75) {
  302. str = '丙'
  303. } else if ( score <= 90 && score >= 75 ) {
  304. str = '乙'
  305. }
  306. return str
  307. },
  308. scrollHeight() {
  309. // if (this.height) {
  310. // return (this.height - 214)+'px'
  311. // } else {
  312. // return `calc(100vh - 314px)`
  313. // }
  314. return `100%`
  315. }
  316. },
  317. mounted(){
  318. this.getInitData();
  319. },
  320. methods: {
  321. setFilterForm(key) {
  322. this.filterFormData.type = key;
  323. // this.getTableData();
  324. },
  325. getInitData() {
  326. if(this.$route.path != '/whitelist-caseControl' ) {
  327. this.getTableData();
  328. }
  329. this.getTaskNameList();
  330. this.getBaseInfo();
  331. },
  332. getBaseInfo() {
  333. getBrry({zyh: this.$props.MED_REC_ID}).then(res => {
  334. if (res.code == 200) {
  335. this.baseInfo = res.data || {}
  336. }
  337. })
  338. },
  339. getTaskNameList() {
  340. this.$axios2.get('/big_model/get_task_name', {}).then(res => {
  341. if(res.code == 200){
  342. this.taskNameList = res.data || []
  343. }
  344. })
  345. },
  346. handleTaskNameSelect(menuItem, indexId) {
  347. this.currentTaskName = indexId
  348. this.$axios.post('/get_big_model_task', {
  349. rule_id: indexId.split('-').map(Number),
  350. MED_REC_ID: this.$props.MED_REC_ID
  351. }).then(res => {
  352. if(res.code == 200){
  353. this.sendMessage(res.data)
  354. }
  355. })
  356. window.electronAPI.middle()
  357. },
  358. //发送消息
  359. async sendMessage(params){
  360. const messages = params ? params : this.inputMessage.trim();
  361. if (messages){
  362. //添加用户信息到聊天记录
  363. this.chatMessages.push({
  364. role: 'user',
  365. content: messages
  366. });
  367. // 清空输入框
  368. this.inputMessage = '';
  369. // this.$axios.post('/predict', {
  370. // query: messages
  371. // }).then(res => {
  372. // if(res.code == 200){
  373. // // 添加模型响应消息到聊天记录
  374. // this.chatMessages.push({
  375. // role: 'assistant',
  376. // content: res.data
  377. // });
  378. // }
  379. // })
  380. //大模型请求
  381. const modelResponse = await this.simulateModelResponse(messages);
  382. // 添加模型响应消息到聊天记录
  383. this.chatMessages.push({
  384. role: 'assistant',
  385. content: modelResponse
  386. });
  387. }
  388. },
  389. //大模型请求
  390. simulateModelResponse(userMessage) {
  391. //请求内容
  392. const options = {
  393. method: 'POST',
  394. headers: {
  395. Authorization: 'Bearer sk-ttnryoxayznjgquagdfwjefbkubdnezabsotuczokunwkjin',
  396. 'Content-Type': 'application/json'
  397. },
  398. // body: '{"model":"Qwen/QwQ-32B","messages":[{"role":"user","content":"当前时间"}],"stream":false,"max_tokens":512,"stop":null,"temperature":0.7,"top_p":0.7,"top_k":50,"frequency_penalty":0.5,"n":1,"response_format":{"type":"text"},"tools":[{"type":"function","function":{"description":"<string>","name":"<string>","parameters":{},"strict":false}}]}'
  399. };
  400. const body = {};
  401. body.model = "deepseek-ai/DeepSeek-R1";
  402. body.messages = [{"role":"user","content":userMessage}];
  403. options.body = JSON.stringify(body);
  404. //请求
  405. return fetch('https://api.siliconflow.cn/v1/chat/completions', options).then(response => {
  406. return response.json();
  407. }).then(data => {
  408. const content = data.choices[0].message.content;
  409. return content;
  410. }).catch(err => console.error(err));
  411. },
  412. getTableData(isRender = false){
  413. const params = {
  414. id: this.$props.MED_REC_ID,
  415. show_correction: this.$route.path == '/whitelist-caseControl' ? 2 : 1,
  416. };
  417. this.$axios2.post('/get_case_quality_v2', params, {
  418. headers: {
  419. isNoLoading: isRender ? true : false
  420. }
  421. }).then(res => {
  422. this.$nextTick(() =>{
  423. console.log('this.data', this.data, res.data)
  424. if(isRender) {
  425. if(this.data.is_case != res.data.is_case) {
  426. this.data = res.data;
  427. this.data && this.data.data && Array.isArray(this.data.data)&& this.data.data.map((item) => {
  428. item.show = false
  429. })
  430. }
  431. } else {
  432. this.data = res.data;
  433. this.data && this.data.data && Array.isArray(this.data.data)&& this.data.data.map((item) => {
  434. item.show = true
  435. })
  436. }
  437. let ruleId = this.storageGet('getDataRule');
  438. if(this.data && this.data.data && Array.isArray(this.data.data) && ruleId) {
  439. this.data.data = this.data.data.filter(item => item.rule_id == ruleId).concat(this.data.data.filter(item => item.rule_id != ruleId))
  440. }
  441. })
  442. });
  443. },
  444. clickAppealEdit(item, quality_type) {
  445. this.$confirm('是否确认已整改?', '提示', {
  446. confirmButtonText: '确定',
  447. cancelButtonText: '取消',
  448. type: 'warning',
  449. customClass: 'customClass-el-message-box-center'
  450. }).then(() => {
  451. setCorrection({
  452. id: item.id,
  453. quality_type
  454. }).then(res => {
  455. if(res.code == 200) {
  456. this.$message.success('已整改成功!')
  457. this.getTableData()
  458. }
  459. });
  460. }).catch(() => {
  461. });
  462. },
  463. onScroll(index) {
  464. const el = this.$el.querySelector(`.category${index}`);
  465. const node = el.parentNode.parentNode.parentNode
  466. this.$refs["scrollRef"].wrap.scrollTop = node.offsetTop;
  467. },
  468. hightRight(hightKeyWord, bllb, zyh) {
  469. this.$emit('hightRight',hightKeyWord,bllb,zyh)
  470. },
  471. clickListItem(idx){
  472. if(this.filterFormData.type) {
  473. (this.data.summary[this.filterFormData.type])[idx].show = !((this.data.summary[this.filterFormData.type])[idx]).show
  474. } else {
  475. this.data.data[idx].show = !this.data.data[idx].show
  476. }
  477. this.$forceUpdate();
  478. },
  479. // 点击申诉、忽略按钮
  480. clickAppeal(type,items,quality_type){
  481. if(type == 'appeal_in_ignore') {
  482. this.$refs.AppealModalRef.handleIgnore(items, quality_type)
  483. } else {
  484. this.$refs.AppealModalRef.openAppealDialog(type, items, quality_type)
  485. }
  486. }
  487. }
  488. }
  489. </script>
  490. <style lang="scss" scoped>
  491. .CaseQualityBox2 {
  492. height: 100%;
  493. .tabContent {
  494. height: calc(100% - 94px);
  495. }
  496. .text-bold {
  497. font-weight: bold;
  498. }
  499. .problem_count {
  500. color: rgba(239, 31, 58, 1);
  501. font-size: 14px;
  502. font-weight: 700;
  503. line-height: 20px;
  504. }
  505. .filterBox {
  506. padding: 0 5px;
  507. display: grid;
  508. grid-template-columns: repeat(3, 1fr); /* 创建4列,每列占据可用空间的1份 */
  509. gap: 5px; /* 可选,添加间隙 */
  510. font-size: 14px;
  511. line-height: 23px;
  512. margin-bottom: 10px;
  513. .filterRow {
  514. display: flex;
  515. align-items: center;
  516. cursor: pointer;
  517. .filterLabel {
  518. width: 56px;
  519. white-space: nowrap;
  520. text-align: right;
  521. }
  522. }
  523. .selected {
  524. color: #409EFF
  525. }
  526. }
  527. }
  528. ::v-deep.el-submenu {
  529. &>.el-submenu__title {
  530. padding-left: 0 !important;
  531. .el-submenu__icon-arrow {
  532. display: block !important;
  533. }
  534. }
  535. }
  536. .taskNameListAndMessage {
  537. height: 100%;
  538. overflow-y: auto;
  539. background-color: white;
  540. border-radius: 10px;
  541. display: flex;
  542. .el-menu-vertical-demo {
  543. // width:340px;
  544. height: 100%;
  545. overflow-y: scroll;
  546. width: 230px;
  547. }
  548. }
  549. .messageBox {
  550. flex: 1;
  551. display: flex;
  552. flex-direction: column;
  553. height: 100%;
  554. .message {
  555. flex: 1;
  556. margin-bottom: 20px;
  557. max-height: 85%;
  558. overflow-y: auto;
  559. height: 480px;
  560. background-color: white;
  561. border-radius: 10px;
  562. .user-message{
  563. display: flex;
  564. margin: 10px 10px 20px 10px;
  565. justify-content: right;
  566. .user-content {
  567. line-height: 40px;
  568. margin-right: 10px;
  569. border-radius: 5px;
  570. flex: 1;
  571. & div {
  572. background: #bee2f8;
  573. padding: 0 10px;
  574. float: right;
  575. }
  576. }
  577. }
  578. .record-message {
  579. display: flex;
  580. margin: 10px 10px 20px 10px;
  581. .record-content {
  582. margin-left:10px;
  583. border-radius: 5px;
  584. line-height: 40px;
  585. flex: 1;
  586. & div {
  587. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  588. padding: 0 10px;
  589. float: right;
  590. }
  591. }
  592. }
  593. }
  594. .sendMessageBox {
  595. margin: 10px;
  596. padding: 10px;
  597. border: 1px solid #bbb;
  598. border-radius: 8px;
  599. display: flex;
  600. height: 150px;
  601. .inputText {
  602. height: 80px;
  603. border: none;
  604. outline:none;
  605. width: 100%;
  606. resize: none;
  607. }
  608. }
  609. }
  610. ::v-deep .el-scrollbar__wrap {
  611. overflow-x: hidden;
  612. }
  613. ::v-deep .el-divider--horizontal {
  614. margin: 10px 0;
  615. }
  616. .box22 {
  617. padding: 0 10px;
  618. background: #FFFFFF;
  619. border-radius: 5px;
  620. height: 100%;
  621. overflow-y: scroll;
  622. display: flex;
  623. flex-direction: column;
  624. .score-box{
  625. width: 100%;
  626. margin-bottom: 16px;
  627. padding: 30px 50px 30px 20px;
  628. border-radius: 4px;
  629. display: flex;
  630. align-items: center;
  631. justify-content: space-between;
  632. color: #fff;
  633. div{
  634. font-size: 20px;
  635. }
  636. .score-f{
  637. padding-left: 20px;
  638. font-size: 20px;
  639. }
  640. .score-dj,.score-f{
  641. font-weight: bold;
  642. }
  643. }
  644. .score-box.scoreLevel_1{
  645. background: rgb(11, 133, 63);
  646. background-image: url('../../../assets/images/icon-jia.png');
  647. background-repeat: no-repeat;
  648. background-size: 60px 52px;
  649. background-position:80% 50%;
  650. }
  651. .score-box.scoreLevel_2{
  652. background: rgb(152, 112, 20);
  653. background-image: url('../../../assets/images/icon-yi.png');
  654. background-repeat: no-repeat;
  655. background-size: 60px 52px;
  656. background-position:80% 50%;
  657. }
  658. .score-box.scoreLevel_3{
  659. background: rgb(199, 54, 13);
  660. background-image: url('../../../assets/images/icon-bing.png');
  661. background-repeat: no-repeat;
  662. background-size: 60px 52px;
  663. background-position:80% 50%;
  664. }
  665. .card-box-noStyle {
  666. background: transparent !important;
  667. padding: 0px !important;
  668. }
  669. .card-box {
  670. // height: 175px;
  671. // background: #FFFFFF;
  672. // border: 1px solid #E2E2E2;
  673. background: #f1f5fe;
  674. padding: 10px;
  675. box-sizing: border-box;
  676. margin-bottom: 14px;
  677. display: flex;
  678. align-items: center;
  679. justify-content: space-between;
  680. .title {
  681. font-size: 12px;
  682. font-family: PingFang-SC-Bold, PingFang-SC;
  683. // font-weight: bold;
  684. color: #333333;
  685. line-height: 22px;
  686. // span {
  687. // margin-left: 7px;
  688. // }
  689. }
  690. .card-icon-btn{
  691. width: auto;
  692. padding: 4px 8px;
  693. border-radius: 4px;
  694. background: rgb(254, 240, 240);
  695. color: rgb(245, 128, 140);
  696. border: 1px solid rgb(245, 128, 140);
  697. font-size: 10px;
  698. }
  699. .title2 {
  700. font-size: 14px;
  701. font-family: PingFang-SC-Bold, PingFang-SC;
  702. // font-weight: bold;
  703. color: #333333;
  704. line-height: 26px;
  705. cursor: pointer;
  706. span {
  707. margin-left: 7px;
  708. }
  709. }
  710. .error {
  711. color: #D81E06;
  712. }
  713. }
  714. .box-card {
  715. margin-bottom: 10px;
  716. position: relative;
  717. background: rgb(241, 245, 254);
  718. .category {
  719. font-family: PingFangSC-Semibold, PingFang SC;
  720. font-weight: bold;
  721. color: #333333;
  722. }
  723. .koufen {
  724. font-weight: bold;
  725. vertical-align: middle;
  726. margin-left: 16px;
  727. }
  728. .typeImg {
  729. width: 53px;
  730. height: 53px;
  731. position: absolute;
  732. top: 12px;
  733. right: 12px;
  734. z-index: 999;
  735. }
  736. }
  737. .box-card .el-table ::v-deep tr{
  738. background: transparent;
  739. }
  740. ::v-deep .el-table__row {
  741. background: #185DA6 !important;
  742. color: #FFFFFF;
  743. .el-icon-arrow-right {
  744. color: #FFFFFF;
  745. }
  746. }
  747. ::v-deep .el-descriptions__body{
  748. background: transparent;
  749. }
  750. ::v-deep .el-table tr{
  751. background: transparent;
  752. }
  753. ::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell {
  754. background: #185DA6;
  755. }
  756. ::v-deep .el-table_1_column_1 {
  757. border-radius: 8px 0 0 8px;
  758. }
  759. ::v-deep .el-table_1_column_2 {
  760. border-radius: 0 8px 8px 0;
  761. font-weight: bold;
  762. }
  763. ::v-deep .el-descriptions-item__label {
  764. font-family: PingFang-SC-Bold, PingFang-SC;
  765. font-weight: bold;
  766. color: #333333;
  767. }
  768. }
  769. .span-index{
  770. width: 20px;
  771. height: 20px;
  772. line-height: 20px;
  773. text-align: center;
  774. display: inline-block;
  775. border-radius: 50%;
  776. background: #185DA6;
  777. color: #fff;
  778. margin-right: 10px;
  779. margin-bottom: 4px;
  780. font-size: 12px;
  781. }
  782. ::v-deep .el-table .el-table__row td {
  783. color: #fff;
  784. }
  785. ::v-deep .el-tag{
  786. height: auto;
  787. line-height: 22px;
  788. }
  789. // ================= 2024-07-27 新样式 ↓ ===============
  790. .font-size12{
  791. font-size: 12px;
  792. }
  793. .list-box{
  794. width: 100%;
  795. padding: 10px 0;
  796. .title-color{
  797. color: rgba(27,100,176,1);
  798. font-weight: bold;
  799. }
  800. .list-score-tips-box{
  801. width: 100%;
  802. padding: 0 10px;
  803. box-sizing: border-box;
  804. position: relative;
  805. .list-item-image {
  806. // position: absolute;
  807. // top: 0;
  808. // right: 0;
  809. width: 25px;
  810. height: 25px;
  811. }
  812. .list-item-title {
  813. font-family: PingFang-SC, PingFang-SC;
  814. font-weight: bold;
  815. font-size: 18px;
  816. color: #333333;
  817. line-height: 25px;
  818. text-align: left;
  819. font-style: normal;
  820. margin-bottom: 10px;
  821. }
  822. .list-item-value {
  823. font-family: PingFangSC, PingFang SC;
  824. font-weight: 400;
  825. font-size: 14px;
  826. color: #333333;
  827. line-height: 20px;
  828. text-align: left;
  829. font-style: normal;
  830. }
  831. .list-item-field {
  832. padding: 10px;
  833. background: #D3E3FF;
  834. border-radius: 8px;
  835. font-family: PingFangSC, PingFang SC;
  836. font-weight: 600;
  837. font-size: 16px;
  838. color: #333333;
  839. line-height: 16px;
  840. text-align: center;
  841. font-style: normal;
  842. // max-width: 200px;
  843. text-overflow: ellipsis;
  844. white-space: inherit;
  845. overflow: hidden;
  846. }
  847. .list-item-score {
  848. padding: 10px 15px;
  849. border-radius: 6px;
  850. font-family: DINAlternate, DINAlternate;
  851. font-weight: bold;
  852. font-size: 16px;
  853. // color: #DA1515;
  854. line-height: 16px;
  855. text-align: center;
  856. font-style: normal;
  857. margin-right: 5px;
  858. &.hover-1{
  859. background: #FFDFDF;
  860. color: #DA1515;
  861. }
  862. &.hover-2{
  863. background: rgb(190, 226, 248);
  864. color: rgb(52, 140, 235);
  865. }
  866. &.hover-0{
  867. background: rgb(253, 246, 236);
  868. color: rgb(230, 162, 60);
  869. }
  870. }
  871. .list-item-basis-box{
  872. .list-basis-title{
  873. padding: 10px 0 10px 10px;
  874. position: relative;
  875. &>span{
  876. font-size: 12px;
  877. color: rgba(27,100,176,1);
  878. font-weight: bold;
  879. }
  880. .typeImg {
  881. width: 34px;
  882. height: 34px;
  883. position: absolute;
  884. top: 0;
  885. right: 12px;
  886. z-index: 999;
  887. }
  888. }
  889. .list-basis-text {
  890. height: auto;
  891. .list-basis-text-t{
  892. height: 0;
  893. overflow: hidden;
  894. position: relative;
  895. &> div:last-child {
  896. margin-bottom: 0 !important;
  897. }
  898. &.show{
  899. height: auto;
  900. // padding: 10px 0 10px 10px;
  901. }
  902. .list-basis-text-t-noString {
  903. &> span:last-child {
  904. div {
  905. height: 0 !important;
  906. }
  907. }
  908. }
  909. }
  910. }
  911. .list-basis-bottom-box{
  912. margin-top: 14px;
  913. width: 100%;
  914. display: flex;
  915. align-items: center;
  916. justify-content: space-between;
  917. padding: 0 10px;
  918. .list-basis-bottom-tips{
  919. flex: 1;
  920. display: flex;
  921. gap: 10px;
  922. }
  923. .list-basis-bottom-btn{
  924. flex: 1;
  925. display: flex;
  926. justify-content: flex-end;
  927. gap: 10px;
  928. // width: auto;
  929. }
  930. }
  931. }
  932. // .list-left-score{
  933. // width: 70px;
  934. // height: 66px;
  935. // text-align: center;
  936. // font-size: 20px;
  937. // font-weight: 700;
  938. // position: relative;
  939. // display: flex;
  940. // flex-direction: column;
  941. // align-items: center;
  942. // justify-content: center;
  943. // padding: 10px 0;
  944. // &.hover-1{
  945. // background: rgb(254, 240, 240);
  946. // color: rgb(238, 14, 14);
  947. // border-right: 3px solid rgb(238, 14, 14);
  948. // }
  949. // &.hover-2{
  950. // background: rgb(236, 245, 255);
  951. // color: rgb(52, 140, 235);
  952. // border-right: 3px solid rgb(52, 140, 235);
  953. // }
  954. // &.hover-0{
  955. // background: rgb(253, 246, 236);
  956. // color: rgb(230, 162, 60);
  957. // border-right: 3px solid rgb(230, 162, 60);
  958. // }
  959. // &>div{
  960. // font-size: 20px;
  961. // }
  962. // }
  963. // .list-right-tips{
  964. // flex: 1;
  965. // font-size: 12px;
  966. // padding-left: 10px;
  967. // .notice-box{
  968. // margin-top: 8px;
  969. // }
  970. // }
  971. }
  972. // .list-basis-box{
  973. // .list-basis-title{
  974. // padding: 10px 0 10px 10px;
  975. // position: relative;
  976. // &>span{
  977. // font-size: 12px;
  978. // color: rgba(27,100,176,1);
  979. // font-weight: bold;
  980. // }
  981. // .typeImg {
  982. // width: 34px;
  983. // height: 34px;
  984. // position: absolute;
  985. // top: 0;
  986. // right: 12px;
  987. // z-index: 999;
  988. // }
  989. // }
  990. // .list-basis-text {
  991. // height: auto;
  992. // .list-basis-text-t{
  993. // height: 0;
  994. // overflow: hidden;
  995. // position: relative;
  996. // &.show{
  997. // height: auto;
  998. // padding: 10px 0 10px 10px;
  999. // }
  1000. // }
  1001. // }
  1002. // .list-basis-bottom-box{
  1003. // margin-top: 14px;
  1004. // width: 100%;
  1005. // display: flex;
  1006. // align-items: center;
  1007. // justify-content: space-between;
  1008. // padding: 0 10px;
  1009. // .list-basis-bottom-tips{
  1010. // flex: 1;
  1011. // display: flex;
  1012. // gap: 10px;
  1013. // }
  1014. // .list-basis-bottom-btn{
  1015. // flex: 1;
  1016. // display: flex;
  1017. // justify-content: flex-end;
  1018. // gap: 10px;
  1019. // // width: auto;
  1020. // }
  1021. // }
  1022. // }
  1023. }
  1024. </style>