commit b8a2ae896d5926aa8eb80c37688367254c2722cd Author: developer Date: Sun Mar 1 20:02:55 2026 +0800 feat: initial commit - 远程超声诊断平台 monorepo 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0363f0c --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +# ============================= +# 通用忽略规则 +# ============================= + +# 依赖目录 +node_modules/ +vendor/ + +# 构建产物 +dist/ +build/ +target/ +out/ +*.class + +# 环境变量(敏感配置,不上传) +.env +.env.local +.env.*.local +*.env + +# 日志文件 +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# 运行时数据 +pids/ +*.pid +*.seed +*.pid.lock + +# ============================= +# 前端(frontend/) +# ============================= +frontend/node_modules/ +frontend/dist/ +frontend/.vite/ +frontend/vite.config.js.timestamp-* + +# ============================= +# 后端(backend/) +# ============================= +backend/target/ +backend/*.class +backend/.classpath +backend/.project +backend/.settings/ +backend/logs/ +backend/.svn/ + +# ============================= +# AI/QA 模块(qa/) +# ============================= +qa/__pycache__/ +qa/*.pyc +qa/*.pyo +qa/.pytest_cache/ +qa/venv/ +qa/.venv/ +# 大文件(PDF等) +qa/*.pdf +qa/*.docx + +# ============================= +# SFU 服务器(sfu-server/) +# ============================= +sfu-server/node_modules/ +sfu-server/.svn/ + +# ============================= +# SVN 残留(如项目原来用SVN管理) +# ============================= +.svn/ +.github/java-upgrade/ + +# ============================= +# IDE / 编辑器 +# ============================= +.idea/ +.vscode/ +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.DS_Store +Thumbs.db + +# ============================= +# 系统文件 +# ============================= +*.tmp +*.bak +*.bak[0-9]* +*.bak2 +*.bak3 +*.bak4 +*.bak5 diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea73709 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# 远程超声诊断平台 - Monorepo + +## 项目简介 + +本仓库为远程超声诊断平台的统一代码仓库,包含前端、后端、AI质控模块以及专网实时通信中间件。 +采用 Monorepo 结构管理,方便统一版本控制,支持针对不同医院/客户进行定制化开发。 + +--- + +## 目录结构 + +``` +monorepo/ +├── frontend/ # 前端(Vue 3 + Vite)- 远程超声Web端 +├── backend/ # 后端(Java Spring Boot)- 业务逻辑与数据库服务 +├── qa/ # AI质控模块(Python)- 超声报告质量控制 +└── sfu-server/ # 专网中间件(Node.js + mediasoup)- 实时音视频SFU服务 +``` + +--- + +## 各模块说明 + +### 🖥️ frontend(前端) +- 技术栈:Vue 3、Vite、Element Plus +- 功能:远程超声申请、会诊、报告管理、实时视频通话 +- 启动:`cd frontend && npm install && npm run dev` + +### ☕ backend(后端) +- 技术栈:Java、Spring Boot、Maven +- 功能:用户管理、医院管理、超声申请流程、数据存储 +- 启动:`cd backend && mvn spring-boot:run` + +### 🤖 qa(AI质控) +- 技术栈:Python、FastAPI +- 功能:超声报告AI质量控制与评分 +- 启动:`cd qa && pip install -r requirements.txt && python admin_app.py` + +### 📡 sfu-server(专网中间件) +- 技术栈:Node.js、mediasoup +- 功能:专网环境下的实时音视频SFU服务器 +- 启动:`cd sfu-server && npm install && npm start` + +--- + +## 分支策略 + +| 分支 | 说明 | +|------|------| +| `main` | 生产环境稳定版本 | +| `develop` | 日常开发集成分支 | +| `feature/xxx` | 功能开发分支,从 develop 切出 | +| `hotfix/xxx` | 紧急修复分支,从 main 切出 | + +--- + +## 开发流程 + +1. 从 `develop` 创建功能分支:`git checkout -b feature/your-feature develop` +2. 开发完成后提交 PR/MR 合并到 `develop` +3. 测试通过后合并到 `main` 并打 Tag 发布 + +--- + +## 注意事项 + +- `.env.local`、`.env.*.local` 等敏感配置文件**不提交**到仓库 +- 请将环境变量参考 `.env.example`(如有)进行本地配置 +- 各模块的 `node_modules/`、`dist/`、`target/` 目录均已忽略 diff --git a/backend/ApplyBModeController.java b/backend/ApplyBModeController.java new file mode 100644 index 0000000..ba92782 --- /dev/null +++ b/backend/ApplyBModeController.java @@ -0,0 +1,575 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.dto.SpecialistSubmitDto; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyBModeSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.service.impl.ApplyBModeServiceImpl; +import com.imurs.service.impl.BmodeMachineModelServiceImpl; +import com.imurs.util.DateUtils; +import com.imurs.util.page.Pagetion; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Controller +@RestController +@RequestMapping({"bmode"}) +public class ApplyBModeController { + @Autowired + ApplyBModeService applyBModeService; + + @Autowired + ApplyBModeServiceImpl applyBModeServiceImpl; + + @Autowired + PatientService patientService; + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + + @Autowired + UserService userService; + + @Autowired + BmodeMachineModelServiceImpl bmodeMachineModelServiceImpl; + + @Transactional + @RequestMapping({"insertBmodeImg"}) + public Map insertBmodeImg(@RequestBody List abmiList) { + Map map = new HashMap<>(); + try { + if (!abmiList.isEmpty()) { + boolean result = this.applyBModeImgService.insertBatch(abmiList); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({"insertBmode"}) + public Map insertBmode(@RequestBody List abmList) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!abmList.isEmpty() && abmList.get(0) != null) { + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()).eq("category_hospital_id", ((ApplyBMode)abmList.get(0)).getCategoryHospitalId()).and().ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and().le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + abm.setBtype(DateUtils.format(date, "yyyyMMdd") + "0" + abmNo); + // abm.setGroupDate(new Timestamp(date.getTime())); + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (result == true) { + map.put("id", ((ApplyBMode)abmList.get(0)).getId()); + map.put("msg", "1"); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getHisEsrdNumber())) { + wrapper.eq("his_esrd_number", ((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + } else { + wrapper.eq("out_patien", ((ApplyBMode)abmList.get(0)).getOutPatien()); + wrapper2.eq("out_patien", ((ApplyBMode)abmList.get(0)).getOutPatien()); + } + wrapper.eq("hospital_id", ((ApplyBMode)abmList.get(0)).getCategoryHospitalId()); + Patient patient2 = (Patient)this.patientService.selectOne((Wrapper)wrapper); + wrapper2.eq("hospital_id", ((ApplyBMode)abmList.get(0)).getGroupHospitalId()); + Patient patient3 = (Patient)this.patientService.selectOne((Wrapper)wrapper2); + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtCard())) + patient.setCard(((ApplyBMode)abmList.get(0)).getPtCard()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getSex())) + patient.setSex(((ApplyBMode)abmList.get(0)).getSex()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPatientName())) + patient.setPatientName(((ApplyBMode)abmList.get(0)).getPatientName()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtCity())) + patient.setFamily(((ApplyBMode)abmList.get(0)).getPtCity()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtPhone())) + patient.setPhone(((ApplyBMode)abmList.get(0)).getPtPhone()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getHisEsrdNumber())) + patient.setHisEsrdNumber(((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getOutPatien())) + patient.setOutPatien(((ApplyBMode)abmList.get(0)).getOutPatien()); + if (patient2 == null) { + patient.setHospitalId(((ApplyBMode)abmList.get(0)).getCategoryHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = "yd03" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(((ApplyBMode)abmList.get(0)).getGroupHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber : ("yd03" + patient.getId()); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + Long id = ((ApplyBMode)abmList.get(0)).getId(); + ((ApplyBMode)abmList.get(0)).setEsrdNumber(ptEsrdNumber); + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) + ((ApplyBModeImg)ImgList.get(i)).setbId(id); + this.applyBModeImgService.insertBatch(ImgList); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateBmode"}) + public Map updateBmode(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(8); + boolean result = false; + try { + if (applyBMode != null) + result = this.applyBModeService.updateBmodeById(applyBMode); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateBmodeImg"}) + public Map updateBmodeImg(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(); + try { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", applyBMode.getId()); + List idList = this.applyBModeImgService.selectList((Wrapper)wrapper); + List abmList = applyBMode.getAbmList(); + if (!idList.isEmpty()) { + if (!abmList.isEmpty()) { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } else { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + } + } else if (!abmList.isEmpty()) { + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } + boolean result = this.applyBModeService.updateById(applyBMode); + map.put("msg", (result == true) ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({"deleteBmodeById"}) + public Map deleteBmodeById(Long id) { + Map map = new HashMap<>(); + try { + boolean result = this.applyBModeService.deleteById(id); + if (result == true) { + map.put("b_id", id); + this.applyBModeImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodeById"}) + public Map selectBmodeById(Long id) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode)this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User)this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper)wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper)wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist)abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist)abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist)abmSp.get(0)).getSpeId(); + //医生删了 那user 就为null 2025 0211 + User selectById = (User)this.userService.selectById(speId); + if(selectById!=null) + phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodePage"}) + public Map selectBmodePage(String categoryHospitalId, String groupHospitalId, String startTime, String endTime, String patientName, Integer pageNo, Integer pageSize, Integer type, String part, Long docId, Integer cureType, String diagnosisType, String status, String isRemote) { + Map map = new HashMap<>(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + map.put("isRemote", isRemote); + map.put("diagnosisType", diagnosisType); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("status", status); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + try { + Pagetion pagetion = this.applyBModeService.selectBmodePage(map, pageNo, pageSize); + map.clear(); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((ApplyBMode)pagetion.getList().get(i)).getId()).ne("state", "80"); + List abmSp = this.applyBModeSpecialistService.selectList((Wrapper)wrapper); + if (!abmSp.isEmpty()) + ((ApplyBMode)pagetion.getList().get(i)).setAbmSp(abmSp); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + map.remove("cureType"); + map.remove("status"); + } + return map; + } + + @RequestMapping({"insertBModeSpecialist"}) + public Map insertBModeSpecialist(@RequestBody List acList) { + Map map = new HashMap<>(); + boolean insert = false; + try { + Long bId = ((ApplyBModeSpecialist)acList.get(0)).getbId(); + EntityWrapper bModeWrapper = new EntityWrapper(); + bModeWrapper.eq("id", bId); + ApplyBMode bMode = (ApplyBMode)this.applyBModeService.selectOne((Wrapper)bModeWrapper); + for (ApplyBModeSpecialist applyBModeSpecialist : acList) { + EntityWrapper wrapper = new EntityWrapper(); + if (applyBModeSpecialist.getbId() != null && applyBModeSpecialist.getSpeId() != null) { + wrapper.eq("b_id", applyBModeSpecialist.getbId()) + .eq("spe_id", applyBModeSpecialist.getSpeId()); + ApplyBModeSpecialist queryApply = (ApplyBModeSpecialist)this.applyBModeSpecialistService.selectOne((Wrapper)wrapper); + if (queryApply != null) { + applyBModeSpecialist.setId(queryApply.getId()); + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.updateById(applyBModeSpecialist); + } else { + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.insert(applyBModeSpecialist); + } + } + if (!insert) + break; + } + map.put("msg", insert ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateConSpecialist"}) + public Map updateConSpecialist(ApplyBModeSpecialist abmSp) { + ApplyBMode bmode = (ApplyBMode)this.applyBModeService.selectById(abmSp.getbId()); + Map map = new HashMap<>(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + EntityWrapper wrapper = new EntityWrapper(); + String status = ""; + try { + if (abmSp != null) { + abmSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", abmSp.getSpeId()).eq("b_id", abmSp.getbId()); + boolean result = this.applyBModeSpecialistService.update(abmSp, (Wrapper)wrapper); + if (result == true) { + if ("1".equals(bmode.getConsultationWay())) { + status = abmSp.getState() + ""; + } else { + map.put("b_id", abmSp.getbId()); + List accList = this.applyBModeSpecialistService.selectByMap(map); + if (!accList.isEmpty()) { + Map collect = (Map)accList.stream().collect(Collectors.groupingBy(ApplyBModeSpecialist::getState, Collectors.counting())); + int sum30 = (collect.get(Integer.valueOf(30)) != null) ? ((Long)collect.get(Integer.valueOf(30))).intValue() : 0; + int sum40 = (collect.get(Integer.valueOf(40)) != null) ? ((Long)collect.get(Integer.valueOf(40))).intValue() : 0; + int sum80 = (collect.get(Integer.valueOf(80)) != null) ? ((Long)collect.get(Integer.valueOf(80))).intValue() : 0; + if (sum40 != 0 && sum30 == 0 && sum80 == 0) { + status = "40"; + } else if (sum80 != 0 && sum40 == 0 && sum30 == 0) { + status = "20"; + } else { + status = "30"; + } + } + } + if (StringUtils.isNotEmpty(status)) { + ApplyBMode ab = new ApplyBMode(); + ab.setStatus(status); + ab.setId(abmSp.getbId()); + ab.setDismissReason(abmSp.getDismissReason()); + this.applyBModeService.updateById(ab); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodeSpePage"}) + public Map selectBmodeSpePage(Integer pageNo, Integer pageSize, String patientName, String startTime, String endTime, String specialistId, Integer cureType, String diagnosisType, Integer part, Integer type, String status) { + Map map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId", specialistId); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("diagnosisType", diagnosisType); + map.put("part", part); + map.put("type", type); + map.put("status", status); + try { + Pagetion> pagetion = this.applyBModeService.selectBmodeSpePage(map, pageNo, pageSize); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((Map)pagetion.getList().get(i)).get("id")); + List applyBModeSpecialists = this.applyBModeSpecialistService.selectList((Wrapper)wrapper); + pagetion.getList().get(i).put("abmSp", applyBModeSpecialists); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("cureType"); + map.remove("part"); + map.remove("type"); + map.remove("status"); + } + return map; + } + + @RequestMapping({"selectMachineModel"}) + public Map selectMachineModel() { + Map map = this.bmodeMachineModelServiceImpl.selectMachineModel(); + return map; + } + + @RequestMapping({"DataStatistics"}) + public Map DataStatistics() { + Map dataStatistics = this.applyBModeServiceImpl.DataStatistics(); + return dataStatistics; + } + + @RequestMapping({"categoryHospitalStatistics"}) + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = this.applyBModeService.categoryHospitalStatistics(id, startTime, endTime); + return map; + } + + @RequestMapping({"manageHospitalDataStatistics"}) + public Map dataStatisticsForHospital(String startTime, String endTime) { + Map map = this.applyBModeService.dataStatisticsForHospital(startTime, endTime); + return map; + } + + @RequestMapping({"queuing"}) + public Map getQueuing(Long id) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + int people = 0; + int waitTime = 0; + int active = 1; + try { + wrapper.eq("status", "40").eq("active", Integer.valueOf(3)); + wrapper.orderBy("active", false); + List applyBModes = this.applyBModeService.selectList((Wrapper)wrapper); + if (!applyBModes.isEmpty()) + for (int i = 0; i < applyBModes.size(); i++) { + ApplyBMode bMode = applyBModes.get(i); + if (bMode.getId().equals(id)) { + people = i; + waitTime = i * 15; + active = bMode.getActive().intValue(); + break; + } + } + map.put("msg", "1"); + map.put("people", Integer.valueOf(people)); + map.put("waitTime", Integer.valueOf(waitTime)); + map.put("active", Integer.valueOf(active)); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = {Exception.class}) + @RequestMapping({"updateSpecialistBySubmit"}) + public Map updateSpecialistBySubmit(@RequestBody List submitDtos) { + Map map = new HashMap<>(4); + SpecialistSubmitDto submitDto = submitDtos.get(0); + EntityWrapper speWrapper = new EntityWrapper(); + speWrapper.eq("spe_id", submitDto.getContactsId()); + speWrapper.eq("b_id", submitDto.getbId()); + try { + Long bId = null; + String type = null; + int successCount = 0; + ApplyBModeSpecialist bModeSpecialist = (ApplyBModeSpecialist)this.applyBModeSpecialistService.selectOne((Wrapper)speWrapper); + if (bModeSpecialist != null) { + bId = bModeSpecialist.getbId(); + type = bModeSpecialist.getDiagnosisType(); + bModeSpecialist.setSpeId(submitDto.getUserId()); + bModeSpecialist.setSpeName(submitDto.getUserName()); + bModeSpecialist.setState(Integer.valueOf(70)); + boolean updateResult = this.applyBModeSpecialistService.updateById(bModeSpecialist); + if (updateResult) + successCount++; + } + if (submitDtos.size() > 1) + for (int i = 1; i < submitDtos.size(); i++) { + ApplyBModeSpecialist addSpecialist = new ApplyBModeSpecialist(); + addSpecialist.setSpeId(((SpecialistSubmitDto)submitDtos.get(i)).getUserId()); + addSpecialist.setSpeName(((SpecialistSubmitDto)submitDtos.get(i)).getUserName()); + addSpecialist.setState(Integer.valueOf(70)); + if (bId != null && type != null) { + addSpecialist.setbId(bId); + addSpecialist.setDiagnosisType(type); + } + boolean addResult = this.applyBModeSpecialistService.insert(addSpecialist); + if (addResult) + successCount++; + } + if (successCount == submitDtos.size()) + map.put("msg", "1"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/WebContent/META-INF/MANIFEST.MF b/backend/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/backend/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/backend/extract_struct.py b/backend/extract_struct.py new file mode 100644 index 0000000..21d7ba4 --- /dev/null +++ b/backend/extract_struct.py @@ -0,0 +1,74 @@ +import os +import re + +entity_dir = r"d:/Projects/洛川康复中医院/imurs/src/main/java/com/imurs/entity" + +# Header +print("| Table Name | Entity Class | Description |") +print("| :--- | :--- | :--- |") + +files = sorted([f for f in os.listdir(entity_dir) if f.endswith(".java")]) + +for f in files: + path = os.path.join(entity_dir, f) + content = "" + try: + with open(path, 'r', encoding='utf-8') as file: + content = file.read() + except UnicodeDecodeError: + try: + with open(path, 'r', encoding='gbk') as file: + content = file.read() + except: + pass + + if not content: + continue + + # Extract Table Name + table_match = re.search(r'@TableName\s*\(\s*(?:value\s*=\s*)?"([^"]+)"\s*\)', content) + if not table_match: + table_match = re.search(r"@TableName\s*\(\s*(?:value\s*=\s*)?'([^']+)'\s*\)", content) + + table_name = table_match.group(1) if table_match else "" + + # Extract Class Name + class_match = re.search(r'public\s+class\s+(\w+)', content) + class_name = class_match.group(1) if class_match else f.replace(".java", "") + + # Extract Description + description = "" + if class_match: + start_index = class_match.start() + # Search backwards from class definition + preceding = content[:start_index] + # Find all javadoc blocks + # We want the one closest to the class def, but typically it is the last one in 'preceding' + # unless there are other methods/fields above (unlikely for entity start) + comments = list(re.finditer(r'/\*\*(.*?)\*/', preceding, re.DOTALL)) + if comments: + # Use the last one + last_comment = comments[-1] + raw_comment = last_comment.group(1) + + # Clean comment + lines = raw_comment.split('\n') + desc_lines = [] + for line in lines: + line = line.strip() + # Remove comment markers * + line = re.sub(r'^\*+', '', line).strip() + + if not line: + continue + if line.startswith("@"): + continue + desc_lines.append(line) + + description = " ".join(desc_lines) + + # Escape pipes + description = description.replace("|", "\\|") + + if table_name: + print(f"| `{table_name}` | `{class_name}` | {description} |") diff --git a/backend/lunqin.iml b/backend/lunqin.iml new file mode 100644 index 0000000..1daccae --- /dev/null +++ b/backend/lunqin.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/backend/mapping_with_desc.md b/backend/mapping_with_desc.md new file mode 100644 index 0000000..371d784 Binary files /dev/null and b/backend/mapping_with_desc.md differ diff --git a/backend/mapping_with_desc_v2.md b/backend/mapping_with_desc_v2.md new file mode 100644 index 0000000..593d8fa Binary files /dev/null and b/backend/mapping_with_desc_v2.md differ diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..aed7c00 --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,529 @@ + + 4.0.0 + com.imurs + lunqin + 0.0.1-SNAPSHOT + jar + + imurs + Demo project for Spring Boot + + org.springframework.boot + spring-boot-starter-parent + + 2.6.6 + + + + + + + + + + org.springframework.boot + spring-boot-starter-cache + + + com.alibaba + easyexcel + 1.1.2-beta5 + + + org.projectlombok + lombok + 1.18.30 + true + + + org.elasticsearch + elasticsearch + + 7.17.16 + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + + 7.17.16 + + + + org.springframework.boot + spring-boot-starter-web + + 2.6.6 + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.apache.tomcat + tomcat-servlet-api + 8.0.36 + provided + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + mybatis-spring + org.mybatis + + + mybatis + org.mybatis + + + + + + mysql + mysql-connector-java + + 8.0.33 + + + io.agora + agora-rest-client-core + 0.1.3-BETA + + + io.agora + authentication + 2.1.2 + + + + com.alibaba + druid + 1.0.29 + + + + com.baomidou + mybatis-plus + 2.3 + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + commons-logging + commons-logging + + + + + + + org.springframework.boot + spring-boot-starter-test + + + + + com.alibaba + fastjson + 1.2.83 + + + org.jsoup + jsoup + 1.16.1 + + + org.apache.shiro + shiro-spring + + 1.13.0 + + + org.apache.shiro + shiro-ehcache + 1.13.0 + + + org.apache.commons + commons-lang3 + 3.1 + + + + + de.codecentric + spring-boot-admin-starter-client + 2.2.4 + + + + commons-lang + commons-lang + 2.4 + + + commons-beanutils + commons-beanutils + 1.11.0 + + + org.apache.commons + commons-collections4 + 4.4 + + + commons-logging + commons-logging + 1.2 + + + + org.springframework.boot + spring-boot-devtools + true + + + + com.aliyun.oss + aliyun-sdk-oss + 2.8.2 + + + commons-lang + commons-lang + + + commons-logging + commons-logging + + + + + + com.aliyun + aliyun-java-sdk-core + 3.3.1 + + + + + com.thoughtworks.xstream + xstream + + 1.4.20 + + + net.sourceforge.jexcelapi + jxl + 2.6.12 + + + + log4j + log4j + + + + + + com.xiaoleilu + hutool-all + 3.2.3 + + + + + org.apache.poi + poi + 3.17 + + + com.alibaba + easyexcel + 2.2.11 + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + + + org.dom4j + dom4j + 2.1.4 + + + + org.apache.poi + poi-ooxml + 3.17 + + + org.json + json + 20230227 + + + net.coobird + thumbnailator + 0.4.8 + + + jaxen + jaxen + + + + org.jsoup + jsoup + 1.16.1 + + + org.apache.pdfbox + pdfbox + 1.8.13 + + + commons-logging + commons-logging + + + + + cn.licoy + encrypt-body-spring-boot-starter + 1.0.2.RELEASE + + + + org.bouncycastle + bcprov-ext-jdk15on + 1.59 + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 2.1.2 + + + + org.springframework.boot + spring-boot-starter-aop + + + + nl.bitwalker + UserAgentUtils + 1.2.4 + + + + + com.aliyun + aliyun-java-sdk-live + 2.3.0 + + + + + + cn.smallbun.screw + screw-core + 1.0.3 + + + fastjson + com.alibaba + + + commons-lang + commons-lang + + + + + + + com.zaxxer + HikariCP + 3.4.5 + + + + + io.github.yedaxia + japidocs + 1.4.3 + + + fastjson + com.alibaba + + + + + + + org.springframework.boot + spring-boot-starter-websocket + + + + com.google.guava + guava + 28.1-jre + + + + com.google.code.gson + gson + 2.8.0 + + + + javax.websocket + javax.websocket-api + 1.1 + provided + + + + + com.google.guava + failureaccess + 1.0.1 + + + org.springframework.security + spring-security-crypto + 5.3.6.RELEASE + + + + + com.google.code.gson + gson + 2.10 + + + + com.aliyun + alibabacloud-ocr_api20210707 + 2.0.3 + + + + com.aliyun + ocr_api20210707 + 2.0.3 + + + com.aliyun + tea-openapi + 0.3.2 + + + com.aliyun + tea-console + 0.0.1 + + + com.aliyun + tea-util + 0.2.21 + + + com.aliyun + darabonba-stream + 0.0.1 + + + + + + compile + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.mybatis.generator + mybatis-generator-maven-plugin + 1.3.5 + + + true + + true + + ${basedir}/src/main/resources/mybatis-generator.xml + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + false + + + + org.springframework.boot + spring-boot-maven-plugin + + true + exec + + + + imurs + + \ No newline at end of file diff --git a/backend/remove_spaces.py b/backend/remove_spaces.py new file mode 100644 index 0000000..cbbac0a --- /dev/null +++ b/backend/remove_spaces.py @@ -0,0 +1,18 @@ +import sys + +path = r'd:/Projects/洛川康复中医院/imurs/src/main/java/com/imurs/controller/ApplyBModeController.java' + +try: + with open(path, 'r', encoding='utf-8') as f: + content = f.read() + + # Remove spaces: { " -> {" and " } -> "} + new_content = content.replace('{ "', '{"').replace('" }', '"}') + + with open(path, 'w', encoding='utf-8') as f: + f.write(new_content) + + print("Successfully removed spaces from RequestMapping annotations.") +except Exception as e: + print(f"Error: {e}") + sys.exit(1) diff --git a/backend/src/main/java/com/imurs/Application.java b/backend/src/main/java/com/imurs/Application.java new file mode 100644 index 0000000..77b7af3 --- /dev/null +++ b/backend/src/main/java/com/imurs/Application.java @@ -0,0 +1,85 @@ + + +package com.imurs; + +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; + +import org.jasypt.encryption.StringEncryptor; +/** + *运行代码 + */ +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.imurs.util.MsgCode; + + +/** + * springboot口 + * + */ +// 扫描指定包下面的dao接口 +@MapperScan({"com.imurs.shiro","com.imurs.dao"}) +@ServletComponentScan +@SpringBootApplication +@EnableScheduling +@EnableTransactionManagement +@EnableCaching(proxyTargetClass = true) // 开启缓存功能 +public class Application extends SpringBootServletInitializer implements CommandLineRunner { + + + // 入口 + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + System.setProperty("es.set.netty.runtime.available.processors", "false"); + } + + // Java EE应用服务器配置, + // 如果要使用tomcat来加载jsp的话就必须继承SpringBootServletInitializer类并且重写其中configure方法 + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + // springboot运行后此方法首先被调用 + // 实现CommandLineRunner抽象类中的run方法 + @Override + public void run(String... args) throws Exception { + System.out.println("springboot启动完成!"); + System.out.println(" _____ ______ __ __ _____ \r\n" + + " / ____| |___ / \\ \\ / / | __ \\ \r\n" + + " | | __ / / \\ \\_/ / | | | |\r\n" + + " | | |_ | / / \\ / | | | |\r\n" + + " | |__| | / /__ | | | |__| |\r\n" + + " \\_____| /_____| |_| |_____/ \r\n" + + " \r\n" + + " "); + } + /** + * 配置StringEncryptor + */ + @Bean("jasyptStringEncryptor") + public StringEncryptor stringEncryptor() { + PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); + SimpleStringPBEConfig config = new SimpleStringPBEConfig(); + config.setPassword(MsgCode.MYSQL_PUBLICKEY_BD_TEST); + config.setAlgorithm("PBEWithMD5AndDES"); + config.setKeyObtentionIterations("1000"); + config.setPoolSize("1"); + config.setProviderName("SunJCE"); + config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); + config.setStringOutputType("base64"); + encryptor.setConfig(config); + return encryptor; + } +} diff --git a/backend/src/main/java/com/imurs/api/AgoreApiController.java b/backend/src/main/java/com/imurs/api/AgoreApiController.java new file mode 100644 index 0000000..f96f59b --- /dev/null +++ b/backend/src/main/java/com/imurs/api/AgoreApiController.java @@ -0,0 +1,223 @@ +package com.imurs.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.dto.AgoraLoginUserDTO; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author wdh + */ +@RestController +@RequestMapping("agoraApi") +public class AgoreApiController { + @Autowired + UserService userService; + + /** + * 客户 ID + */ + final String customerKey = "b85a527055eb4b82b06f34d95edcf21c"; + /** + * 客户密钥 + */ + final String customerSecret = "0cc3f5806c6445e69ee233098c7aa78a"; + + /** + * 拼接客户 ID 和客户密钥并使用 base64 编码 + */ + String plainCredentials = customerKey + ":" + customerSecret; + String base64Credentials = new String(Base64.getEncoder().encode(plainCredentials.getBytes())); + /** + * 创建 authorization header + */ + String authorizationHeader = "Basic " + base64Credentials; + + @RequestMapping("getChannel") + public Map test(String appId) throws IOException { + Map map = new HashMap<>(); + //建立URL连接对象 + String httpUrl = "https://api.agora.io/dev/v1/channel/" + appId; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("GET"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + //conn.getOutputStream().write(dataJson.getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("response",data); + return map; + } + + /** + * @param appId appId + * @param cname 频道名 + * @return 踢出该频道的用户 + */ + @RequestMapping("leftChannel") + public Map leftChannel(String appId, String cname) { + Map map = new HashMap<>(8); + // 封禁为加入频道封禁 + String[] privileges = new String[1]; + privileges[0] = "join_channel"; + JSONObject dataJson = new JSONObject(); + dataJson.put("appid",appId); + dataJson.put("cname",cname); + dataJson.put("time",0); + dataJson.put("privileges",privileges); + try { + //建立URL连接对象 + String httpUrl = "https://api.agora.io/dev/v1/kicking-rule"; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("POST"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + conn.getOutputStream().write(dataJson.toString().getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("response",data); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + @RequestMapping("byTime") + public Map byTime() throws IOException { + Map map = new HashMap<>(); + long startTime = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) + .parse("2020-01-30 20:00:00", new ParsePosition(0)).getTime() / 1000; + long endTime= (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) + .parse("2021-02-10 20:00:00", new ParsePosition(0)).getTime() / 1000; + String appid = "dbe6c79f3c8045b4abbf8429838189db"; + String metric = "userCount"; + //建立URL连接对象 + String httpUrl = "https://api.agora.io/beta/live/experience/by_time?start_ts=" + startTime + +"&end_ts=" + endTime + "&appid=" + appid + "&metric=" + metric; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("GET"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + //conn.getOutputStream().write(dataJson.getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("data",data); + return map; + } + + @RequestMapping("getHospitalNameByPhone") + public Map getHospitalNameByPhone(String phone) { + Map map = new HashMap<>(8); + try { + User user = userService.selectUserByPhone(phone); + if (user != null) { + map.put("name",user.getHospitalName()); + map.put("msg","1"); + } else { + map.put("msg","2"); + } + } catch (Exception e) { + map.put("msg","4"); + } + return map; + } + + /** + * @param userDTO 用户名 密码 权限id + * @return 监控平台的登录验证 + */ + @RequestMapping("login") + public Map login(@RequestBody AgoraLoginUserDTO userDTO) { + Map map = new HashMap<>(8); + try { + User user = userService.selectOne(new EntityWrapper() + .eq("phone", userDTO.getUsername()) + .eq("password", userDTO.getPassword()) + .eq("rid", userDTO.getRid())); + if (user != null) { + map.put("status","200"); + } else { + map.put("status","404"); + } + } catch (Exception e) { + map.put("status","4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/api/ApiController.java b/backend/src/main/java/com/imurs/api/ApiController.java new file mode 100644 index 0000000..c9afd9e --- /dev/null +++ b/backend/src/main/java/com/imurs/api/ApiController.java @@ -0,0 +1,64 @@ +package com.imurs.api; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.jasypt.util.text.BasicTextEncryptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import com.imurs.util.MD5; +import com.imurs.util.MsgCode; + + +@RestController +@RequestMapping("api") +public class ApiController { + + @Autowired + UserService userService; + + + /** + * 查询医生详情 + * sign= MD5(MD5(uid +timestamp)+ secretKey) + */ + @RequestMapping(value = "selectDoctorByPhone",method=RequestMethod.POST) + public Map selectDoctorByPhone(String phone,String timestamp,String sign) { + Map map = new HashMap(); + try { + if(StringUtils.isNotEmpty(phone)&& StringUtils.isNotEmpty(timestamp) && StringUtils.isNotEmpty(sign)){ + //加密判断 + String signServer=MD5.GetMD5Code(MD5.GetMD5Code(phone +timestamp)+ "X8O2b79XiZFVQOX5X049Sw=="); + if(signServer.equals(sign)){ + User user = userService.selectUserByPhone(phone); + if(user!=null){ + BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); + textEncryptor.setPassword(MsgCode.API); + map.put("user",textEncryptor.encrypt(JSON.toJSONString(user))); + + }else{ + map.put("msg", "3"); + } + }else{ + map.put("msg", "1004"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + +} diff --git a/backend/src/main/java/com/imurs/config/CorsFilter.java b/backend/src/main/java/com/imurs/config/CorsFilter.java new file mode 100644 index 0000000..66c2470 --- /dev/null +++ b/backend/src/main/java/com/imurs/config/CorsFilter.java @@ -0,0 +1,65 @@ +package com.imurs.config; + +import org.springframework.stereotype.Component; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@Component +public class CorsFilter implements Filter { + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + // 解决跨域问题 + HttpServletResponse res1 = (HttpServletResponse) res; + HttpServletRequest req1 = (HttpServletRequest) req; + res1.setContentType("html;charset=UTF-8"); + // request.setCharacterEncoding("UTF-8"); + res1.setCharacterEncoding("UTF-8"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Origin", "*"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Methods", "POST, GET, + // OPTIONS, DELETE"); + // ((HttpServletResponse) response).setHeader("Access-Control-Max-Age", + // "3600"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Headers","x-requested-with,content-type"); + String[] allowdomain = { "http://192.168.1.111:8020", "http://192.168.1.120:8080", "http://192.168.1.3", + "http://127.0.0.1:1002", "http://localhost:8080", "http://localhost:5050" }; + Set allowOrigins = new HashSet(Arrays.asList(allowdomain)); + String origionHeader = req1.getHeader("origin"); + // System.out.println("origin" + req1.getHeader("origin")); + + if (origionHeader != null && allowOrigins.contains(origionHeader)) { + //// 指定允许其他域名访问 + res1.setHeader("Access-Control-Allow-Origin", origionHeader); + } else { + res1.setHeader("Access-Control-Allow-Origin", "*"); + } + res1.setHeader("Content-type", "text/html;charset=UTF-8"); + // 响应类型 + res1.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + res1.setHeader("Access-Control-Max-Age", "3600"); + // 响应头设置 + res1.setHeader("Access-Control-Allow-Headers", + "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token,Authorization"); + res1.setHeader("Access-Control-Allow-Credentials", "true"); + res1.setHeader("XDomainRequestAllowed", "1"); + + // System.out.println("*********************************过滤器被使用**************************"); + chain.doFilter(req, res); + } + + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/config/ElasticSearchConfig.java b/backend/src/main/java/com/imurs/config/ElasticSearchConfig.java new file mode 100644 index 0000000..0f18f81 --- /dev/null +++ b/backend/src/main/java/com/imurs/config/ElasticSearchConfig.java @@ -0,0 +1,33 @@ +package com.imurs.config; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author laier + * @date 2022-12-12 14:21 + */ + +@Configuration +@ConditionalOnProperty(name = "es.enabled", havingValue = "true") +public class ElasticSearchConfig { + + @Value("${es.url}") + private String url; + + @Value("${es.port}") + private Integer port; + + public static String index="es_lunqin"; + + @Bean + public RestHighLevelClient client(){ + RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(url, port))); + return client; + } +} diff --git a/backend/src/main/java/com/imurs/config/MybatisPlusConfig.java b/backend/src/main/java/com/imurs/config/MybatisPlusConfig.java new file mode 100644 index 0000000..d3a2cab --- /dev/null +++ b/backend/src/main/java/com/imurs/config/MybatisPlusConfig.java @@ -0,0 +1,105 @@ +package com.imurs.config; + +import javax.sql.DataSource; + +import com.baomidou.mybatisplus.mapper.ISqlInjector; +import com.baomidou.mybatisplus.mapper.LogicSqlInjector; +import org.apache.ibatis.logging.stdout.StdOutImpl; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.plugin.Interceptor; +//import org.apache.log4j.Logger; +import org.mybatis.spring.boot.autoconfigure.MybatisProperties; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ResourceLoader; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import com.baomidou.mybatisplus.MybatisConfiguration; +import com.baomidou.mybatisplus.MybatisXMLLanguageDriver; +import com.baomidou.mybatisplus.entity.GlobalConfiguration; +import com.baomidou.mybatisplus.enums.DBType; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean; + +@Configuration +public class MybatisPlusConfig { + @Autowired + private DataSource dataSource; + + @Autowired + private MybatisProperties properties; + + @Autowired + private ResourceLoader resourceLoader = new DefaultResourceLoader(); + + @Autowired(required = false) + private Interceptor[] interceptors; + + @Autowired(required = false) + private DatabaseIdProvider databaseIdProvider; + + // @Autowired + // private MyMetaObjectHandler myMetaObjectHandler; + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor page = new PaginationInterceptor(); + page.setDialectType("mysql"); +// Logger.getLogger(getClass()).info("PaginationInterceptor注入成功!!"); + return page; + } + + /** + * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 配置文件和mybatis-boot的配置文件同步 + * + * @return + */ + @Bean + public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() { + MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean(); + mybatisPlus.setDataSource(dataSource); + mybatisPlus.setVfs(SpringBootVFS.class); + if (StringUtils.hasText(this.properties.getConfigLocation())) { + mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation())); + } + mybatisPlus.setConfiguration(properties.getConfiguration()); + if (!ObjectUtils.isEmpty(this.interceptors)) { + mybatisPlus.setPlugins(this.interceptors); + } + // MP 全局配置,更多内容进入类看注释 + GlobalConfiguration globalConfig = new GlobalConfiguration(); + // 配置公共字段自动填写 + // globalConfig.setMetaObjectHandler(myMetaObjectHandler); + globalConfig.setDbType(DBType.MYSQL.name()); + // ID 策略 AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") + // ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") + globalConfig.setIdType(3); + mybatisPlus.setGlobalConfig(globalConfig); + MybatisConfiguration mc = new MybatisConfiguration(); + //配置sql日志打印 + mc.setLogImpl(StdOutImpl.class); + mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); + mybatisPlus.setConfiguration(mc); + if (this.databaseIdProvider != null) { + mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider); + } + if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) { + mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); + } + if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) { + mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage()); + } + if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) { + mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations()); + } + return mybatisPlus; + } + +} diff --git a/backend/src/main/java/com/imurs/constant/ModelActiveConstant.java b/backend/src/main/java/com/imurs/constant/ModelActiveConstant.java new file mode 100644 index 0000000..74de726 --- /dev/null +++ b/backend/src/main/java/com/imurs/constant/ModelActiveConstant.java @@ -0,0 +1,27 @@ +package com.imurs.constant; + +/** + * @author wang + * @date 2021年08月17日 15:51 + * 超声病例的会诊状态 + */ +public class ModelActiveConstant { + /** + * 超声病例正在进行 + */ + public final static int ACTIVE_DOING = 3; + /** + * 超声病例待审核报告 + */ + public final static int ACTIVE_CHECKING = 2; + /** + * 超声病例未开始会诊 + */ + public final static int ACTIVE_NOT_BEGIN = 1; + /** + * 超声病例已结束 + */ + public final static int ACTIVE_FINISH = 0; + + private ModelActiveConstant() {} +} diff --git a/backend/src/main/java/com/imurs/controller/AgoraController.java b/backend/src/main/java/com/imurs/controller/AgoraController.java new file mode 100644 index 0000000..f74d333 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/AgoraController.java @@ -0,0 +1,157 @@ +/* +package com.imurs.controller; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.AgoraRecord; +import com.imurs.oss.AliyunOSSClientUtil; +import com.imurs.service.AgoraRecordService; + + +import io.agora.recording.RecordingSDK; +import io.agora.recording.test.RecordingSample; + +@RestController +@RequestMapping("agora") +public class AgoraController { + private static String isSucess = null; + @Autowired + AgoraRecordService agoraRecordService; + + @RequestMapping("Record") + public String AgnoraRecord(String esrdNumber,String id ){ + + String[] s= {"--appId", "7bbabfd2f5a84a6591fc7b863e2c901e","--uid","0","--channel","1000","--appliteDir","/usr/Agorao/Agorao_Linux_FULL/bin","--isAudioOnly","1","--isVideoOnly","0","--isMixingEnabled","1","--mixedVideoAudio","0","--recordFileRootDir","/usr/recording_output","--idle","10"}; + s[5] = id; + */ +/* RecordingSDK RecordingSdk = new RecordingSDK(); + RecordingSample ars = new RecordingSample(RecordingSdk); + String dir= ars.createChannel(s); + ars.unRegister(); + // + System.out.println("zp AgoraController dir..."+dir);//file directory + File des = new File(dir); + File[] sub =des.listFiles(); + for(File file:sub) { + if(file.isFile()&&file.getName().endsWith(".aac")) { + System.out.println("now exiting .aac...!"+dir+file.getName()); + String s2=excle(dir+file.getName()); + AgoraRecord arec =new AgoraRecord(); + arec.setEsrdNumber(esrdNumber); + arec.setRegDir(s2+".acc");//加文件目录 + boolean isSave=agoraRecordService.insert(arec); + System.out.println("s2"+s2+"保存是否成功"+isSave); + } + }*//* + + excuteAsync(s,esrdNumber); + return "isok"; + } + //需要异步处理的业务方法 + @Async + public String excuteAsync(String[] param,String esrdNumber){ + // do something; + // final String isSucess=""; + Timer timer = new Timer();// 实例化Timer类 + timer.schedule(new TimerTask() { + public void run() { + //System.out.println("退出"); + isSucess=parseAgiao(param,esrdNumber); + this.cancel(); + } + }, 1000);// 这里百毫秒 + return isSucess; + + } + + public String parseAgiao(String[] parms,String esrdNumber ){ + RecordingSDK RecordingSdk = new RecordingSDK(); + RecordingSample ars = new RecordingSample(RecordingSdk); + String dir= ars.createChannel(parms); + ars.unRegister(); + // + // System.out.println("zp AgoraController dir..."+dir);//file directory + boolean isSave=false; + File des = new File(dir); + File[] sub =des.listFiles(); + if(sub.length<0){ + return "无录音文件"; + } + for(File file:sub) { + if(file.isFile()&&file.getName().endsWith(".aac")) { + // System.out.println("now exiting .aac...!"+dir+file.getName()); + String s2=excle(dir+file.getName()); + AgoraRecord arec =new AgoraRecord(); + arec.setEsrdNumber(esrdNumber); + arec.setRegDir(s2+".aac");//加文件目录 + isSave=agoraRecordService.insert(arec); + // System.out.println("s2"+s2+"保存是否成功"+isSave); + } + } + return isSave==true?"保存成功":"保存失败"; + } + public String excle(String fileName) { + AliyunOSSClientUtil.FOLDER = "gansu/record/"; + AliyunOSSClientUtil ossClient = new AliyunOSSClientUtil();// oss上传工具类 + // 文件名称 + String img =fileName; + String fileName1=null; + try { + // 将图片转换输入流 + InputStream is = new FileInputStream(img); + fileName1 =String.valueOf(UUID.randomUUID());//String.valueOf(UUID.randomUUID()); + //System.out.println(fileName1); + // 获取图片后缀名 + URL url = ossClient.uploadObject3OSS(is,fileName1+".aac"); + //System.out.println("url的网址"+url); + is.close(); + // 删除本地文件 + */ +/*File files = new File(img); + if (files.exists()) { + System.gc(); + files.delete(); + }*//* + + //将数据文件保存到数据库里去,按病案号。日期201804011205 到分。id 做主健,可以一个病案号插入多个文件。 + } catch (IOException e) { + e.printStackTrace(); + return "error"; + } + return "gansu/record/"+fileName1; + } + //录音文件查询 + @RequestMapping("selectAgoraById") + public Map selectAgoraById(String id){ + Map map=new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List RecordFileList=new ArrayList(); + try { + wrapper.eq("esrd_number", id); + RecordFileList=agoraRecordService.selectList(wrapper); + map.put("recordlist", RecordFileList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} +*/ diff --git a/backend/src/main/java/com/imurs/controller/AgoraRecordController.java b/backend/src/main/java/com/imurs/controller/AgoraRecordController.java new file mode 100644 index 0000000..69d0b91 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/AgoraRecordController.java @@ -0,0 +1,433 @@ +package com.imurs.controller; + +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; + +import com.imurs.entity.LayoutConfig; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.*; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.google.gson.JsonArray; +import com.imurs.sound.ConnUtil; + +/** + * 云端录制 + */ +@RestController +@RequestMapping("Agora") +public class AgoraRecordController { + @RequestMapping(method = RequestMethod.POST,value="/StartRecord") + public Map StartRecord(@RequestBody List LayoutConfigList) throws Exception{ + LayoutConfig layoutConfig = LayoutConfigList.get(0); + String appid = layoutConfig.getAppid(); + Integer streamTypes = layoutConfig.getStreamTypes(); + String cname = layoutConfig.getCname(); + Integer channelType = layoutConfig.getChannelType(); + String rdirectory = layoutConfig.getRdirectory(); + String sdirectory = layoutConfig.getSdirectory(); + Integer twidth = layoutConfig.getTwidth(); + JSONObject recordingFileConfig = new JSONObject(); + org.json.JSONArray avFileType = new org.json.JSONArray(); + avFileType.put("hls"); + avFileType.put("mp4"); + recordingFileConfig.put("avFileType",avFileType); + //System.out.println(twidth+"!!!"); + Integer theight = layoutConfig.getTheight(); + Integer fps = layoutConfig.getFps(); + Integer bitrate = layoutConfig.getBitrate(); + Integer mixedVideoLayout = layoutConfig.getMixedVideoLayout(); + + Map map=new HashMap(); + JSONObject nullObj = new JSONObject(); + //合流模式下录制 + String reasourceId = reasourceId(cname,appid); + //System.out.println("查询到的id值"+reasourceId); + String durl = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+reasourceId+"/mode/mix/start"; + //测试超声//测试超声59109db67051428f96346260bda5654b + //正式超声7bbabfd2f5a84a6591fc7b863e2c901e + //System.out.println("请求网站"+durl); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(durl);///inoneagent/bloodoxygen + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject clientRequest = new JSONObject(); + JSONObject recordingConfig = new JSONObject(); + recordingConfig.put("channelType", channelType);//0,通信模式,1,直播模式 + //recordingConfig.put("maxIdleTime", 6);//频道内最长6秒 + //recordingConfig.put("streamTypes", streamTypes);//0,仅录制音频,1,仅录制视频,2,同时录制音视频 + JSONObject transcodingConfig = new JSONObject(); +// transcodingConfig.put("width", width);//宽度 +// transcodingConfig.put("height", height);//高度 + transcodingConfig.put("width", twidth);//宽度 + transcodingConfig.put("height", theight);//高度 + transcodingConfig.put("fps", fps);//帧率 + transcodingConfig.put("bitrate", bitrate);//码率 + + //2020.10.28修改xfh + transcodingConfig.put("mixedVideoLayout",mixedVideoLayout);//0、1、2 为预设的合流布局,3 为自定义合流布局 + //System.out.println(transcodingConfig+"~~~~~~~~~~~~~~~"); + org.json.JSONArray config = new org.json.JSONArray(); + for (int i=1;i StopRecord(String appid,String cname,String resourceid,String sid,String uid ) throws Exception{ + Map map=new HashMap(); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + String STOPURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+resourceid+"/sid/"+sid+"/mode/mix/stop"; + URL url = new URL(STOPURL);///inoneagent/bloodoxygen + // System.out.println("结束网址"+url); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + // System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + JSONObject clientRequest = new JSONObject(); + clientRequest.put("async_stop",true); + params.put("cname",cname);//待录制的频道名 + params.put("uid","16555"); + params.put("clientRequest",clientRequest); + //params.put("clientRequest",storageConfig); + // System.out.println("打印参数"+params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ""; + try{ + result = ConnUtil.getResponseString(conn); + // map.put("error", result); + }catch (Exception e){ + String s= e.toString(); + + // e.printStackTrace(); + //System.out.println(s); + map.put("error", s); + return map ; + } + + //System.out.println("收到的结果"+result); + //获取存储文件列表名字。 + JSONObject jsonObject = new JSONObject(result); + // String bsid = jsonObject.getString("serverResponse"); + JSONObject sr= (JSONObject) jsonObject.get("serverResponse"); + org.json.JSONArray fileList = sr.getJSONArray("fileList"); + + /* + * for (int i = 0; i < fileList.length(); i++) { JSONObject fileObj = + * fileList.getJSONObject(i); fileNameList.add(fileObj.getString("fileName"));; + * } + */ + JSONObject fileObj = fileList.getJSONObject(0); + String flie= fileObj.getString("fileName"); + //pfile.p + //System.out.println("文件列表"+flie); + map.put("recordfile", flie); + return map; + + } + //query请求,不需要等待15秒就可以返回文件 + @RequestMapping(method = RequestMethod.POST,value="/QueryRecord") + public Map QueryRecord(String appid,String resourceid,String sid ) throws Exception{ + Map map=new HashMap(); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + String STOPURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+resourceid+"/sid/"+sid+"/mode/mix/query"; + URL url = new URL(STOPURL);///inoneagent/bloodoxygen + // System.out.println("结束网址"+url+"网址结束了"); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + JSONObject clientRequest = new JSONObject(); + //params.put("cname","1000");//待录制的频道名 + //params.put("uid","98765"); + // params.put("clientRequest",clientRequest); + // params.put("clientRequest",storageConfig); + System.out.println(params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + //conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + JSONObject sr= (JSONObject) jsonObject.get("serverResponse"); + String flie= sr.getString("fileList"); + map.put("recordfile", flie); + return map; + + } + //获取请求ID + private String reasourceId(String cname,String appid) throws Exception, Exception{ + String RIDURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/acquire"; + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(RIDURL); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + //待录制的频道名 + JSONObject clientRequestObj = new JSONObject(); + clientRequestObj.put("resourceExpiredHour",24); + clientRequestObj.put("scene",0); + params.put("cname",cname); + params.put("uid","16555"); + params.put("clientRequest",clientRequestObj); + //System.out.println("参数呃呃呃id"+params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + //basic 后面的值是通过客户ID 和证书 通过BASE64认证生成的 + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result =""; + try{ + result = ConnUtil.getResponseString(conn); + }catch (Exception e){ + return "获取reasourceId失败"; + } + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + return jsonObject.get("resourceId").toString(); + } + + @PostMapping("/startPageRecord") + public Map startPageRecord(@RequestBody List LayoutConfigList) throws Exception{ + LayoutConfig layoutConfig = LayoutConfigList.get(0); + String appid = layoutConfig.getAppid(); + String cname = layoutConfig.getCname(); + String rdirectory = layoutConfig.getRdirectory(); + String sdirectory = layoutConfig.getSdirectory(); + Integer twidth = layoutConfig.getTwidth(); + Integer theight = layoutConfig.getTheight(); + String url = layoutConfig.getUrl(); + + Map map = new HashMap<>(8); + JSONObject clientRequestObj = new JSONObject(); + clientRequestObj.put("resourceExpiredHour",24); + clientRequestObj.put("scene",1); + + String resourceId = reasourceId(cname,appid); + + String pageUrl = "https://api.sd-rtn.com/v1/apps/" + appid + "/cloud_recording/resourceid/" + resourceId + "/mode/web/start"; + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL postUrl = new URL(pageUrl); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + JSONObject serviceParam = new JSONObject(); + JSONObject extensionServicesObj = new JSONObject(); + org.json.JSONArray extensionServices = new org.json.JSONArray(); + JSONObject extensionServiceConfig = new JSONObject(); + + serviceParam.put("url",url); + serviceParam.put("audioProfile",0); + serviceParam.put("videoWidth",twidth); + serviceParam.put("videoHeight",theight); + serviceParam.put("maxRecordingHour",72); + + extensionServicesObj.put("serviceName","web_recorder_service"); + extensionServicesObj.put("errorHandlePolicy","error_abort"); + extensionServicesObj.put("serviceParam",serviceParam); + + extensionServices.put(extensionServicesObj); + + extensionServiceConfig.put("errorHandlePolicy","error_abort"); + extensionServiceConfig.put("extensionServices",extensionServices); + + JSONObject recordingFileConfig = new JSONObject(); + org.json.JSONArray avFileType = new org.json.JSONArray(); + avFileType.put("hls"); + avFileType.put("mp4"); + recordingFileConfig.put("avFileType",avFileType); + + JSONObject storageConfig = new JSONObject(); + org.json.JSONArray fileNamePrefix = new org.json.JSONArray(); + fileNamePrefix.put(rdirectory); + fileNamePrefix.put(sdirectory); + storageConfig.put("vendor",2); + storageConfig.put("region",6); + storageConfig.put("bucket","ydlqcs"); + storageConfig.put("accessKey","LTAImVN6wtEJLfH1"); + storageConfig.put("secretKey","lO7FsV3pxSaP6lcd8KP9SsfBIeFhPw"); + storageConfig.put("fileNamePrefix",fileNamePrefix); + + JSONObject clientRequest = new JSONObject(); + //clientRequest.put("token",""); + clientRequest.put("extensionServiceConfig",extensionServiceConfig); + clientRequest.put("recordingFileConfig",recordingFileConfig); + clientRequest.put("storageConfig",storageConfig); + + JSONObject params = new JSONObject(); + params.put("cname",cname); + params.put("uid","16555"); + params.put("clientRequest",clientRequest); + System.out.println("======格式======>" + params); + + HttpsURLConnection conn= (HttpsURLConnection) postUrl.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result =""; + try{ + result = ConnUtil.getResponseString(conn); + }catch (Exception e){ + String s= e.toString(); + map.put("error", s); + return map; + } + //获取成功录制后得SID + JSONObject jsonObject = new JSONObject(result); + System.out.println(jsonObject); + String bsid = jsonObject.getString("sid"); + map.put("sid", bsid); + map.put("resourceid", resourceId); + return map; + } + /* + * private String Toeknid(String cname,String appid,String uid) throws + * Exception, Exception{ String appCertificate + * ="c2809b8ba09e431e84097d60b4406e0a"; int tokenExpirationInSeconds = 3600; int + * privilegeExpirationInSeconds = 3600; RtcTokenBuilder2 token = new + * RtcTokenBuilder2(); String result = token.buildTokenWithUserAccount(appid, + * appCertificate, cname, uid, Role.ROLE_PUBLISHER, tokenExpirationInSeconds, + * privilegeExpirationInSeconds); System.out.printf("Token with uid: %s\n", + * result); return uid; + * + * } + */ + +} diff --git a/backend/src/main/java/com/imurs/controller/AiQcController.java b/backend/src/main/java/com/imurs/controller/AiQcController.java new file mode 100644 index 0000000..d06d620 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/AiQcController.java @@ -0,0 +1,47 @@ +package com.imurs.controller; + +import com.imurs.entity.AiQcVocabulary; +import com.imurs.service.AiQcVocabularyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.Map; + +/** + * AI 质控词库管理接口 + */ +@RestController +@RequestMapping("/ai/vocab") +public class AiQcController { + + @Autowired + private AiQcVocabularyService aiQcVocabularyService; + + /** + * 专家提交纠错建议 + */ + @PostMapping("/suggest") + public Map suggestVocab(@RequestBody AiQcVocabulary vocab) { + Map res = new HashMap<>(); + try { + // 设置初始状态为待审核 + vocab.setStatus("draft"); + vocab.setFrequency(1); + if (vocab.getVocabType() == null) + vocab.setVocabType("L3"); + + boolean success = aiQcVocabularyService.insert(vocab); + if (success) { + res.put("msg", 1); + res.put("data", "提交成功,感谢您的反馈!"); + } else { + res.put("msg", 0); + res.put("data", "提交失败"); + } + } catch (Exception e) { + res.put("msg", 0); + res.put("data", "服务器错误: " + e.getMessage()); + } + return res; + } +} diff --git a/backend/src/main/java/com/imurs/controller/Aliocr.java b/backend/src/main/java/com/imurs/controller/Aliocr.java new file mode 100644 index 0000000..1dd168c --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/Aliocr.java @@ -0,0 +1,27 @@ +package com.imurs.controller; + +import java.io.InputStream; +import java.util.Map; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.imurs.ocr.Sample; + +@RestController +@RequestMapping(value="aocr") +public class Aliocr { + @RequestMapping(value = "/aliocr") + public String saveImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + String s =Sample.aliocr(is); + return s; + } + @RequestMapping(value = "/bocr") + public Map bImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + Map s =Sample.BaiduOcrRecognition("1"); + return s; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyBModeController.java b/backend/src/main/java/com/imurs/controller/ApplyBModeController.java new file mode 100644 index 0000000..103cfe9 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyBModeController.java @@ -0,0 +1,757 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.dto.SpecialistSubmitDto; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyBModeSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.BModeReportService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.service.impl.ApplyBModeServiceImpl; +import com.imurs.service.impl.BmodeMachineModelServiceImpl; +import com.imurs.util.DateUtils; +import com.imurs.util.page.Pagetion; + +import io.netty.util.internal.StringUtil; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Controller +@RestController +@RequestMapping({ "bmode" }) +public class ApplyBModeController { + @Autowired + ApplyBModeService applyBModeService; + + @Autowired + ApplyBModeServiceImpl applyBModeServiceImpl; + + @Autowired + PatientService patientService; + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + + @Autowired + UserService userService; + + @Autowired + BmodeMachineModelServiceImpl bmodeMachineModelServiceImpl; + @Autowired + BModeReportService bModeReportService; + + @Transactional + @RequestMapping({ "insertBmodeImg" }) + public Map insertBmodeImg(@RequestBody List abmiList) { + Map map = new HashMap<>(); + try { + if (!abmiList.isEmpty()) { + boolean result = this.applyBModeImgService.insertBatch(abmiList); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({ "insertBmodeold" }) + public Map insertBmodeold(@RequestBody List abmList) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!abmList.isEmpty() && abmList.get(0) != null) { + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()) + .eq("category_hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()).and() + .ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and() + .le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + abm.setBtype(DateUtils.format(date, "yyyyMMdd") + "0" + abmNo); + // abm.setGroupDate(new Timestamp(date.getTime())); + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (result == true) { + map.put("id", ((ApplyBMode) abmList.get(0)).getId()); + map.put("msg", "1"); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getHisEsrdNumber())) { + wrapper.eq("his_esrd_number", ((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + } else { + wrapper.eq("out_patien", ((ApplyBMode) abmList.get(0)).getOutPatien()); + wrapper2.eq("out_patien", ((ApplyBMode) abmList.get(0)).getOutPatien()); + } + wrapper.eq("hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()); + Patient patient2 = (Patient) this.patientService.selectOne((Wrapper) wrapper); + wrapper2.eq("hospital_id", ((ApplyBMode) abmList.get(0)).getGroupHospitalId()); + Patient patient3 = (Patient) this.patientService.selectOne((Wrapper) wrapper2); + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtCard())) + patient.setCard(((ApplyBMode) abmList.get(0)).getPtCard()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getSex())) + patient.setSex(((ApplyBMode) abmList.get(0)).getSex()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPatientName())) + patient.setPatientName(((ApplyBMode) abmList.get(0)).getPatientName()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtCity())) + patient.setFamily(((ApplyBMode) abmList.get(0)).getPtCity()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtPhone())) + patient.setPhone(((ApplyBMode) abmList.get(0)).getPtPhone()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getHisEsrdNumber())) + patient.setHisEsrdNumber(((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getOutPatien())) + patient.setOutPatien(((ApplyBMode) abmList.get(0)).getOutPatien()); + if (patient2 == null) { + patient.setHospitalId(((ApplyBMode) abmList.get(0)).getCategoryHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = "yd03" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(((ApplyBMode) abmList.get(0)).getGroupHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber : ("yd03" + patient.getId()); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + Long id = ((ApplyBMode) abmList.get(0)).getId(); + ((ApplyBMode) abmList.get(0)).setEsrdNumber(ptEsrdNumber); + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) + ((ApplyBModeImg) ImgList.get(i)).setbId(id); + this.applyBModeImgService.insertBatch(ImgList); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = Exception.class) + @RequestMapping({ "insertBmode" }) + public Map insertBmode(@RequestBody List abmList) { + Map map = new HashMap<>(); + + try { + if (abmList == null || abmList.isEmpty() || abmList.get(0) == null) { + map.put("msg", "3"); + return map; + } + + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()) + .eq("category_hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()).and() + .ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and() + .le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + // New ID Generation Logic: Hex(CRC32(4)) + yyyyMMddHHmmss + Seq(2) + String categoryHospitalId = abm.getCategoryHospitalId(); + java.util.zip.CRC32 crc32 = new java.util.zip.CRC32(); + crc32.update(categoryHospitalId.getBytes()); + String hexCrc = Long.toHexString(crc32.getValue()).toUpperCase(); + // Ensure CRC is exactly 4 characters + if (hexCrc.length() > 4) { + hexCrc = hexCrc.substring(0, 4); + } else { + hexCrc = String.format("%-4s", hexCrc).replace(' ', '0'); + } + + String dateStr = DateUtils.format(date, "yyyyMMddHHmmss"); + String sequence = String.format("%02d", abmNo % 100); // 2-digit sequence + + String eid = hexCrc + dateStr + sequence; + abm.setEsrdNumber(eid); + // 如果医生填了就用医生的,如果没填就用系统生成的 + if (StringUtils.isEmpty(abm.getBtype())) { + abm.setBtype(eid); // 只有在前端没传值(为空)的时候,才把系统生成的号给它 + } + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (!result) { + throw new RuntimeException("主表插入失败"); // 触发回滚 + } + + map.put("id", ((ApplyBMode) abmList.get(0)).getId()); + + Long id = ((ApplyBMode) abmList.get(0)).getId(); + + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) { + ((ApplyBModeImg) ImgList.get(i)).setbId(id); + // ImgList.forEach(img -> img.setbId(abm.getId())); + + } + boolean iresult = this.applyBModeImgService.insertBatch(ImgList); + if (!iresult) { + throw new RuntimeException("图像表插入失败"); // 触发回滚 + } + + } + map.put("msg", "1"); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateBmode" }) + public Map updateBmode(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(8); + boolean result = false; + try { + if (applyBMode != null) + result = this.applyBModeService.updateBmodeById(applyBMode); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateBmodeImg" }) + public Map updateBmodeImg(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(); + try { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", applyBMode.getId()); + List idList = this.applyBModeImgService.selectList((Wrapper) wrapper); + List abmList = applyBMode.getAbmList(); + if (!idList.isEmpty()) { + if (!abmList.isEmpty()) { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } else { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + } + } else if (!abmList.isEmpty()) { + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } + boolean result = this.applyBModeService.updateById(applyBMode); + map.put("msg", (result == true) ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({ "deleteBmodeById" }) + public Map deleteBmodeById(Long id) { + Map map = new HashMap<>(); + try { + boolean result = this.applyBModeService.deleteById(id); + if (result == true) { + map.put("b_id", id); + this.applyBModeImgService.deleteByMap(map); + bModeReportService.deleteByMap(map); + applyBModeSpecialistService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeByIdnew" }) + public Map selectBmodeByIdnew(Long id, HttpSession session) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode) this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User) this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist) abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist) abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist) abmSp.get(0)).getSpeId(); + // 医生删了 那user 就为null 2025 0211 + User selectById = (User) this.userService.selectById(speId); + if (selectById != null) + phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + // 锁定的机制,查询的时候 保存,而且只有状态status为40的 + String status = applyBMode.getStatus(); + if (status.equals("40")) { + System.out.println("状态为" + status); + String name = (String) session.getAttribute("name"); + // System.out.println("用户"+usr); + EntityWrapper wrapperu = new EntityWrapper(); + User u = userService.selectOne(wrapperu); + long rid = u.getRid(); + if (rid == 6) {// 如果是专家操作,就保存对应的操作者医生名字。 + ApplyBMode applyBMode2 = new ApplyBMode(); + applyBMode2.setLoginDoc(name); + // System.out.println("数据为"+applyBMode2.getLoginDoc()); + EntityWrapper wrapper4 = new EntityWrapper(); + wrapper4.eq("id", id); + if (applyBMode2.getLoginDoc() != null) { + boolean issucess = applyBModeService.update(applyBMode2, wrapper4); + } + + } + // System.out.println("更新是否成功"+issucess); + + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeById" }) + public Map selectBmodeById(Long id) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode) this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User) this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist) abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist) abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist) abmSp.get(0)).getSpeId(); + User selectById = (User) this.userService.selectById(speId); + if (selectById != null) + phone = selectById.getPhone(); + + // phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodePage" }) + public Map selectBmodePage(String categoryHospitalId, String groupHospitalId, + String startTime, String endTime, + String patientName, Integer pageNo, Integer pageSize, + String conditions, Integer type, String part, Long docId, Integer cureType, + String diagnosisType, String status, String isRemote, + String groupAlias, Long active) { + Map map = new HashMap<>(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + map.put("isRemote", isRemote); + map.put("diagnosisType", diagnosisType); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("status", status); + map.put("groupAlias", groupAlias); + map.put("active", active); + if (!StringUtil.isNullOrEmpty(conditions)) { + map.put("conditions", Arrays.asList(conditions.split(","))); + } + + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + try { + Pagetion pagetion = this.applyBModeService.selectBmodePage(map, pageNo, pageSize); + map.clear(); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((ApplyBMode) pagetion.getList().get(i)).getId()).ne("state", "80"); + List abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty()) + ((ApplyBMode) pagetion.getList().get(i)).setAbmSp(abmSp); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + map.remove("cureType"); + map.remove("status"); + } + return map; + } + + @RequestMapping({ "insertBModeSpecialist" }) + public Map insertBModeSpecialist(@RequestBody List acList) { + Map map = new HashMap<>(); + boolean insert = false; + try { + Long bId = ((ApplyBModeSpecialist) acList.get(0)).getbId(); + EntityWrapper bModeWrapper = new EntityWrapper(); + bModeWrapper.eq("id", bId); + ApplyBMode bMode = (ApplyBMode) this.applyBModeService.selectOne((Wrapper) bModeWrapper); + for (ApplyBModeSpecialist applyBModeSpecialist : acList) { + EntityWrapper wrapper = new EntityWrapper(); + if (applyBModeSpecialist.getbId() != null && applyBModeSpecialist.getSpeId() != null) { + wrapper.eq("b_id", applyBModeSpecialist.getbId()) + .eq("spe_id", applyBModeSpecialist.getSpeId()); + ApplyBModeSpecialist queryApply = (ApplyBModeSpecialist) this.applyBModeSpecialistService + .selectOne((Wrapper) wrapper); + if (queryApply != null) { + applyBModeSpecialist.setId(queryApply.getId()); + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.updateById(applyBModeSpecialist); + } else { + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.insert(applyBModeSpecialist); + } + } + if (!insert) + break; + } + map.put("msg", insert ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateConSpecialist" }) + public Map updateConSpecialist(ApplyBModeSpecialist abmSp) { + ApplyBMode bmode = (ApplyBMode) this.applyBModeService.selectById(abmSp.getbId()); + Map map = new HashMap<>(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + EntityWrapper wrapper = new EntityWrapper(); + String status = ""; + try { + if (abmSp != null) { + abmSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", abmSp.getSpeId()).eq("b_id", abmSp.getbId()); + boolean result = this.applyBModeSpecialistService.update(abmSp, (Wrapper) wrapper); + if (result == true) { + if ("1".equals(bmode.getConsultationWay())) { + status = abmSp.getState() + ""; + } else { + map.put("b_id", abmSp.getbId()); + List accList = this.applyBModeSpecialistService.selectByMap(map); + if (!accList.isEmpty()) { + Map collect = (Map) accList.stream() + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getState, Collectors.counting())); + int sum30 = (collect.get(Integer.valueOf(30)) != null) + ? ((Long) collect.get(Integer.valueOf(30))).intValue() + : 0; + int sum40 = (collect.get(Integer.valueOf(40)) != null) + ? ((Long) collect.get(Integer.valueOf(40))).intValue() + : 0; + int sum80 = (collect.get(Integer.valueOf(80)) != null) + ? ((Long) collect.get(Integer.valueOf(80))).intValue() + : 0; + if (sum40 != 0 && sum30 == 0 && sum80 == 0) { + status = "40"; + } else if (sum80 != 0 && sum40 == 0 && sum30 == 0) { + status = "20"; + } else { + status = "30"; + } + } + } + if (StringUtils.isNotEmpty(status)) { + ApplyBMode ab = new ApplyBMode(); + ab.setStatus(status); + ab.setId(abmSp.getbId()); + ab.setDismissReason(abmSp.getDismissReason()); + this.applyBModeService.updateById(ab); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeSpePage" }) + public Map selectBmodeSpePage(Integer pageNo, String categoryHospitalId, String conditions, + Integer pageSize, String patientName, String startTime, String endTime, String specialistId, Integer cureType, + String diagnosisType, Integer part, Integer type, String status) { + Map map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + map.put("patientName", patientName); + map.put("categoryHospitalId", categoryHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId", specialistId); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("diagnosisType", diagnosisType); + map.put("part", part); + map.put("type", type); + map.put("status", status); + map.put("conditions", conditions); + try { + Pagetion> pagetion = this.applyBModeService.selectBmodeSpePage(map, pageNo, pageSize); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((Map) pagetion.getList().get(i)).get("id")); + List applyBModeSpecialists = this.applyBModeSpecialistService + .selectList((Wrapper) wrapper); + pagetion.getList().get(i).put("abmSp", applyBModeSpecialists); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("cureType"); + map.remove("part"); + map.remove("type"); + map.remove("status"); + } + return map; + } + + @RequestMapping({ "selectMachineModel" }) + public Map selectMachineModel() { + Map map = this.bmodeMachineModelServiceImpl.selectMachineModel(); + return map; + } + + @RequestMapping({ "DataStatistics" }) + public Map DataStatistics() { + Map dataStatistics = this.applyBModeServiceImpl.DataStatistics(); + return dataStatistics; + } + + @RequestMapping({ "categoryHospitalStatistics" }) + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = this.applyBModeService.categoryHospitalStatistics(id, startTime, endTime); + return map; + } + + @RequestMapping({ "manageHospitalDataStatistics" }) + public Map dataStatisticsForHospital(String startTime, String endTime) { + Map map = this.applyBModeService.dataStatisticsForHospital(startTime, endTime); + return map; + } + + @RequestMapping({ "queuing" }) + public Map getQueuing(Long id) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + int people = 0; + int waitTime = 0; + int active = 1; + try { + wrapper.eq("status", "40").eq("active", Integer.valueOf(3)); + wrapper.orderBy("active", false); + List applyBModes = this.applyBModeService.selectList((Wrapper) wrapper); + if (!applyBModes.isEmpty()) + for (int i = 0; i < applyBModes.size(); i++) { + ApplyBMode bMode = applyBModes.get(i); + if (bMode.getId().equals(id)) { + people = i; + waitTime = i * 15; + active = bMode.getActive().intValue(); + break; + } + } + map.put("msg", "1"); + map.put("people", Integer.valueOf(people)); + map.put("waitTime", Integer.valueOf(waitTime)); + map.put("active", Integer.valueOf(active)); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = { Exception.class }) + @RequestMapping({ "updateSpecialistBySubmit" }) + public Map updateSpecialistBySubmit(@RequestBody List submitDtos) { + Map map = new HashMap<>(4); + SpecialistSubmitDto submitDto = submitDtos.get(0); + EntityWrapper speWrapper = new EntityWrapper(); + speWrapper.eq("spe_id", submitDto.getContactsId()); + speWrapper.eq("b_id", submitDto.getbId()); + try { + Long bId = null; + String type = null; + int successCount = 0; + ApplyBModeSpecialist bModeSpecialist = (ApplyBModeSpecialist) this.applyBModeSpecialistService + .selectOne((Wrapper) speWrapper); + if (bModeSpecialist != null) { + bId = bModeSpecialist.getbId(); + type = bModeSpecialist.getDiagnosisType(); + bModeSpecialist.setSpeId(submitDto.getUserId()); + bModeSpecialist.setSpeName(submitDto.getUserName()); + bModeSpecialist.setState(Integer.valueOf(70)); + boolean updateResult = this.applyBModeSpecialistService.updateById(bModeSpecialist); + if (updateResult) + successCount++; + } + if (submitDtos.size() > 1) + for (int i = 1; i < submitDtos.size(); i++) { + ApplyBModeSpecialist addSpecialist = new ApplyBModeSpecialist(); + addSpecialist.setSpeId(((SpecialistSubmitDto) submitDtos.get(i)).getUserId()); + addSpecialist.setSpeName(((SpecialistSubmitDto) submitDtos.get(i)).getUserName()); + addSpecialist.setState(Integer.valueOf(70)); + if (bId != null && type != null) { + addSpecialist.setbId(bId); + addSpecialist.setDiagnosisType(type); + } + boolean addResult = this.applyBModeSpecialistService.insert(addSpecialist); + if (addResult) + successCount++; + } + if (successCount == submitDtos.size()) + map.put("msg", "1"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyBModeImageController.java b/backend/src/main/java/com/imurs/controller/ApplyBModeImageController.java new file mode 100644 index 0000000..7142ecd --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyBModeImageController.java @@ -0,0 +1,68 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.controller.ApplyBModeImageController; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.service.ApplyBModeImgService; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"modeImage"}) +public class ApplyBModeImageController { + Logger logger = LoggerFactory.getLogger(ApplyBModeImageController.class); + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @PostMapping({"insertBModeImage"}) + public Map insertBModeImage(@RequestBody ApplyBModeImg applyBModeImg) { + Map resultMap = new HashMap<>(8); + try { + this.applyBModeImgService.insert(applyBModeImg); + resultMap.put("msg", "1"); + resultMap.put("applyBModeImg", applyBModeImg); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } + + @RequestMapping({"deleteBmodeById"}) + public Map deleteBmodeById(Long imageId) { + Map resultMap = new HashMap<>(8); + try { + this.applyBModeImgService.deleteById(imageId); + resultMap.put("msg", "1"); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } + + @GetMapping({"selectBModeImageByBId"}) + public Map selectBModeImageByBId(Long bId) { + Map resultMap = new HashMap<>(8); + try { + List bModeImgs = this.applyBModeImgService.selectList((new EntityWrapper()) + .eq("b_id", bId)); + resultMap.put("bModeImgs", bModeImgs); + resultMap.put("msg", "1"); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyCaseController.java b/backend/src/main/java/com/imurs/controller/ApplyCaseController.java new file mode 100644 index 0000000..35a4335 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyCaseController.java @@ -0,0 +1,477 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyCase; +import com.imurs.entity.ApplyCaseImg; +import com.imurs.entity.Patient; +import com.imurs.service.ApplyCaseImgService; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.util.page.Pagetion; + +/** + * + * @author Server + * 就诊表 + */ +@RestController +@RequestMapping("case") +public class ApplyCaseController { + + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyCaseImgService applyCaseImgService; + @Autowired + PatientService patientService; + @Autowired + ApplyInformationService applyInformationService; + + /** + * 批量新增 + * @param acList + * @return + */ + @Transactional + @RequestMapping("insertCase") + public Map insertCase(@RequestBody List acList){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if(!acList.isEmpty() && acList.get(0)!=null){ + //双向转诊数据 + boolean result=applyCaseService.insert(acList.get(0)); + if(result==true){ + map.put("msg", "1"); + //第一次新增时患者表新增 + if(acList.get(0).getHisEsrdNumber()!=null){ + wrapper.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", acList.get(0).getOutPatien()); + wrapper2.eq("out_patien", acList.get(0).getOutPatien()); + } + wrapper.eq("hospital_id", acList.get(0).getHospitalId());; + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", acList.get(0).getPlanHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(acList.get(0).getPtSex())){ + patient.setSex(acList.get(0).getPtSex()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCard())){ + patient.setCard(acList.get(0).getPtCard()); + //patient.setBirthDate(acList.get(0).getPtCard().substring(6, 14)); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtName())){ + patient.setPatientName(acList.get(0).getPtName()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCity())){ + patient.setFamily(acList.get(0).getPtCity()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtPhone())){ + patient.setPhone(acList.get(0).getPtPhone()); + } + if(StringUtils.isNotEmpty(acList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(acList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(acList.get(0).getOutPatien())){ + patient.setOutPatien(acList.get(0).getOutPatien()); + } + + if(patient2==null){ + patient.setHospitalId(acList.get(0).getHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 + ptEsrdNumber="yd02"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + + } + if(patient3==null){ + patient.setHospitalId(acList.get(0).getPlanHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd02"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + Long id=acList.get(0).getId(); + acList.get(0).setEsrdNumber(ptEsrdNumber); + applyCaseService.updateById(acList.get(0)); + + if(!acList.get(0).getAciList().isEmpty()){ + for (int i = 0; i < acList.get(0).getAciList().size(); i++) { + acList.get(0).getAciList().get(i).setCaseId(id); + } + applyCaseImgService.insertBatch(acList.get(0).getAciList()); + } + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 批量修改 + * @param acList + * @return + */ + @RequestMapping("updateCase") + public Map updateCase(ApplyCase applyCase){ + Map map=new HashMap(); + try { + boolean result=applyCaseService.updateById(applyCase); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 发送HIS 系统数据 + * @param acList + * @return + * @throws Exception + */ + /*@RequestMapping("SendHisdate") + public String SendHisdate(String id) throws Exception{ + Map map=new HashMap(); + //msg==1 表示那个确定按钮提交了, + if(!msg.equals("1")||!statu.equals("4")){ + // throw new Exception("双向转诊数据保存失败,或已经是已就诊或已住院状态无法发送信息给HIS"); + return "不是已接受状态或"; + } + //查询患者基本数据 + map.put("id", id); + + Map patientmap = applyCaseService.selectPatientById(map); + if(patientmap==null){ + return "数据库无此人信息"; + } + //取出数据保存在ID还是 数据表里暂时是限定statu=4 + String uniid =patientmap.get("id")+"";//唯一主健值 + String pt_name = patientmap.get("pt_name")+"";//姓名 + String pt_sex = patientmap.get("pt_sex")+"";//性别 + if(pt_sex.equals("男")){ + pt_sex="M"; + }else{ + pt_sex="F"; + } + String pt_card = patientmap.get("pt_card")+"";//身份证 不能为NULL值,由于前端已经做判断,所以不做判断 + String pt_city = patientmap.get("pt_city")+"";//家庭地址 + String pt_phone = patientmap.get("pt_phone")+"";//家庭电话 + String prote_type = patientmap.get("protect_type")+"";//医保类型 + //System.out.println(prote_type); + String protect_type=""; + switch(prote_type){ + case "1": + protect_type="省医保"; + break; + case "2": + protect_type="市职工医保"; + break; + case "3": + protect_type="市居民医保"; + break; + case "4": + protect_type="新农合"; + break; + case "5": + protect_type="自费"; + break; + case "6": + protect_type="异地医保"; + break; + default: + protect_type="其他"; + break; + } + String hospital_name = patientmap.get("hospital_name")+"";//医院名字 + String plan_time = patientmap.get("plan_time")+"";//预约时间 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date tim=simpleDateFormat.parse(plan_time); + String date =new SimpleDateFormat("yyyyMMdd").format(tim); + // System.out.println(date); + String soap = "\n" + + "\n" + + " \n" + + " \n" + + " "+ + ""+pt_name+"^"+pt_sex+"^"+pt_card+"^"+pt_city+"^"+pt_phone+"^"+protect_type+"^"+hospital_name+"^"+date+"^"+uniid+ + "]]> \n"+ + " \n" + + " \n" + + ""; + //地址 + String urlString = "http://220.168.26.57:1001/Service.asmx";//57 + // System.out.println(soap); + //String urlString=""; + //方法 + String soapActionString = "http://cardtest.com/DoInterconnectSave"; + URL url = new URL(urlString); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + + byte[] buf = soap.getBytes(); + // System.out.println(soap); + //设置一些头参数 + httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length)); + httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); + httpConn.setRequestProperty("soapActionString", soapActionString); + httpConn.setRequestMethod("POST"); + //输入参数和输出结果 + + + OutputStream out=null; + try{ + httpConn.setConnectTimeout(30000); + httpConn.setReadTimeout(30000); + httpConn.setDoOutput(true); + httpConn.setDoInput(true); + out = httpConn.getOutputStream(); + out.write(buf); + out.close(); + }catch (Exception e){ + //System.out.println("连接不成功"); + DualReferral_His.sendErrorNotice("15602395710", pt_name+pt_card+"建立连接,不成功,数据未发送成功"); + } + + // int responseCode = httpConn.getResponseCode(); + + if(responseCode!=200){ + //说明网络异常需要重新请求 + //throw new Exception("msg"); + + return "4004";//网络异常,再次请求发送 + } + // new DualReferral_His(); + byte[] datas = DualReferral_His.readInputStream(httpConn.getInputStream()); + String result = new String(datas); + // System.out.println("result:" + result); + //new DualReferral_His(); + //接受返回的数据并解析出 + String result2= DualReferral_His.strToHtml(result); + // System.out.println("解析后的结果"+result2); + String[] ss= parxml2(result2); + System.out.println("ErrorMSg"+ss[0]+"Errorcode"+ss[1]); + if(ss[1].equals("1")){ + //信息保存失败,将患者ID。错误信息发送出去 + // sendNotice("15602395710",ss[0],ss[1]); + DualReferral_His.sendErrorNotice("15602395710", pt_name+pt_card+ss[0]); + } + return ""; + } + + //解析XML格式 + public static String[] parxml2(String xml) throws JDOMException, IOException, DocumentException{ + String reg = "<\\?xml\\s+version=\"1.0\"\\s+encoding=\"(.*?)\"\\?>"; + String result = xml.replaceAll(reg,""); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(result.getBytes())); + String[] paresu =new String[2]; + Element out = + document.getRootElement().element("Body").element("DoInterconnectSaveResponse").element("DoInterconnectSaveResult").element("Response"); + //取2个数据.element("ErrorMsg") + Element out2 = out.element("ErrorMsg"); + Element out3 = out.element("ResultCode"); + paresu[0]=out2.getText(); + paresu[1]=out3.getText(); + System.out.println("return 解析ErrorMsg:"+out2.getText()); + System.out.println("return 解析ResultCode:"+out3.getText()); + return paresu; + + + + }*/ + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteCaseById") + public Map deleteCaseById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyCaseService.deleteById(id); + if(result==true){ + map.put("case_id", id); + applyCaseImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectCaseById") + public Map selectCaseById(Long id){ + Map map=new HashMap(); + ApplyCase applyCase=new ApplyCase(); + List imgList=new ArrayList(); + try { + applyCase=applyCaseService.selectCaseById(id); + if(applyCase!=null){ + map.put("case_id", id); + imgList=applyCaseImgService.selectByMap(map); + } + map.put("applyCase", applyCase); + map.put("imgList", imgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("case_id"); + } + return map; + } + + + /** + * 管理医院转诊列表 + * 基层转出,管理转出 + */ + @RequestMapping("selectCasePage") + public Map selectCasePage(String planHospitalId,String type,String ptName, + String startTime,String endTime,Integer pageNo,Integer pageSize,String hospitalId,Long applyUserId, + Long docUserId,Integer state){ + Map map=new HashMap(); + map.put("planHospitalId", planHospitalId); + map.put("type", type); + map.put("ptName", ptName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + map.put("applyUserId", applyUserId); + map.put("docUserId", docUserId); + map.put("state", state); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion list=applyCaseService.selectCasePage(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("planHospitalId"); + map.remove("type"); + map.remove("ptName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + map.remove("applyUserId"); + map.remove("docUserId"); + map.remove("state"); + } + return map; + } + + /** + * 管理医院转诊列表 + * 管理转入 + */ + @RequestMapping("selectAdminCasePage") + public Map selectAdminCasePage(String planHospitalId,String type,String ptName, + String startTime,String endTime,Integer pageNo,Integer pageSize,String hospitalId, + Long applyUserId,Long docUserId,Integer state,String ptCard,String hisId,String esrdNumber){ + Map map=new HashMap(); + map.put("planHospitalId", planHospitalId); + map.put("type", type); + map.put("ptName", ptName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + map.put("applyUserId", applyUserId); + map.put("docUserId", docUserId); + map.put("state", state); + map.put("hisId", hisId); + map.put("ptCard", ptCard); + map.put("esrdNumber", esrdNumber); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion list=applyCaseService.selectAdminCasePage(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("planHospitalId"); + map.remove("type"); + map.remove("ptName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + map.remove("applyUserId"); + map.remove("docUserId"); + map.remove("state"); + map.remove("hisId"); + map.remove("ptCard"); + map.remove("esrdNumber"); + } + return map; + } + + /** + * 根据身份证号码查看患者信息 + * ORDER BY FIELD(c.statu,1,2,3,4,5,6,7,8,9),c.plan_time DESC + */ + @RequestMapping("selectCaseByCard") + public Map selectCaseByCard(String card){ + Map map=new HashMap(); + List acList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("pt_card", card).orderBy("plan_time",false); + try { + acList=applyCaseService.selectList(wrapper); + map.put("acList", acList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyConsultationController.java b/backend/src/main/java/com/imurs/controller/ApplyConsultationController.java new file mode 100644 index 0000000..2b760b9 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyConsultationController.java @@ -0,0 +1,703 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyConsulationSpecialist; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyConsulationSpecialistService; +import com.imurs.service.ApplyConsultationImgService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyLisService; +import com.imurs.service.ApplyPathologyFileService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping(value = "con") +public class ApplyConsultationController { + + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyConsultationImgService applyConsultationImgService; + @Autowired + PatientService patientService; + @Autowired + UserService userService; + @Autowired + ApplyConsulationSpecialistService applyConsulationSpecialistService; + @Autowired + ApplyPathologyFileService applyPathologyFileService; + @Autowired + ApplyLisService applyLisService; + @Autowired + ApplyPathologyService applyPathologyService; + @Autowired + ApplyPathologyImgService applyPathologyImgService; + + + /** + * 批量新增 + * + * @param acList + * @return + */ + @Transactional + @RequestMapping("insertConsultation") + public Map insertConsultation(@RequestBody List acList) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if (!acList.isEmpty() && acList.get(0) != null) { + // 双向转诊数据 + boolean result = applyConsultationService.insert(acList.get(0)); + if (result == true) { + //9.8新增 + map.put("id",acList.get(0).getId()); + map.put("msg", "1"); + + //第一次新增时患者表新增 + if(acList.get(0).getHisEsrdNumber()!=null){ + wrapper.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", acList.get(0).getOutPatien()); + wrapper2.eq("out_patien", acList.get(0).getOutPatien()); + } + + wrapper.eq("hospital_id", acList.get(0).getCategoryHospitalId()); + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", acList.get(0).getGroupHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(acList.get(0).getSex())){ + patient.setSex(acList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCard())){ + patient.setCard(acList.get(0).getPtCard()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPatientName())){ + patient.setPatientName(acList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCity())){ + patient.setFamily(acList.get(0).getPtCity()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtPhone())){ + patient.setPhone(acList.get(0).getPtPhone()); + } + if(StringUtils.isNotEmpty(acList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(acList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(acList.get(0).getOutPatien())){ + patient.setOutPatien(acList.get(0).getOutPatien()); + } + + if(patient2==null){ + patient.setHospitalId(acList.get(0).getCategoryHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 + ptEsrdNumber="yd01"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + if(patient3==null){ + patient.setHospitalId(acList.get(0).getGroupHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd01"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + //修改会诊数据 + Long id = acList.get(0).getId(); + acList.get(0).setEsrdNumber(ptEsrdNumber); + applyConsultationService.updateById(acList.get(0)); + + if (!acList.get(0).getAciList().isEmpty()) { + for (int i = 0; i < acList.get(0).getAciList().size(); i++) { + acList.get(0).getAciList().get(i).setConId(id); + } + applyConsultationImgService.insertBatch(acList.get(0).getAciList()); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家医院远程会诊 + */ + @RequestMapping("selectConsultationSpe") + public Map selectConsultationSpe(Integer pageNo, Integer pageSize, String patientName,String part, + String startTime, String endTime, String categoryHospitalId, Integer type,String ptCard,String hisId,String conditions, + String specialistId, String diagnosisType) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("categoryHospitalId", categoryHospitalId); + map.put("type", type); + map.put("diagnosisType", diagnosisType); + map.put("ptCard", ptCard); + map.put("hisId", hisId); + map.put("part", part); + map.put("specialistId",specialistId); + map.put("conditions",conditions); + try { + Pagetion pagetion = applyConsultationService.selectConsultationSpe(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 管理医院远程会诊 + */ + @RequestMapping("selectConByCategory") + public Map selectConByCategory(Integer pageNo, Integer pageSize, String patientName,String part, + String startTime, String endTime, String categoryHospitalId, Integer type, String docId,String ptCard,String hisId, + String specialistId, String diagnosisType,String conditions,String groupHospitalId,String esrdNumber) { + Map map = new HashMap<>(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("categoryHospitalId", categoryHospitalId); + map.put("type", type); + map.put("docId", docId); + map.put("specialistId", specialistId); + map.put("diagnosisType", diagnosisType); + map.put("ptCard", ptCard); + map.put("hisId", hisId); + map.put("part", part); + map.put("conditions", conditions); + map.put("groupHospitalId", groupHospitalId); + map.put("esrdNumber", esrdNumber); + try { + Pagetion pagetion = applyConsultationService.selectConByCategory(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + List acssList=new ArrayList(); + + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("con_id", pagetion.getList().get(i).getId()).ne("state","80"); + acssList=applyConsulationSpecialistService.selectList(wrapper); + if(!acssList.isEmpty()){ + pagetion.getList().get(i).setAcsList(acssList); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +/* + *//** + * 基层医院远程会诊 + *//* + @RequestMapping("selectConByPage") + public Map selectConByPage(Integer pageNo, Integer pageSize, String patientName, String startTime, + String endTime, Integer type, String diagnosisType, String categoryHospitalId, Long docId,String conditions,String groupHospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + + if (docId != null) { + wrapper.eq("doc_id", docId); + } + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + wrapper.between("group_date", startTime, endTime); + } + if (StringUtils.isNotEmpty(patientName)) { + wrapper.like("patient_name", patientName); + } + if (StringUtils.isNotEmpty(diagnosisType)) { + wrapper.eq("diagnosis_type", diagnosisType); + } + if (StringUtils.isNotEmpty(categoryHospitalId)) { + wrapper.eq("category_hospital_id", categoryHospitalId); + } + if (StringUtils.isNotEmpty(groupHospitalId)) { + wrapper.eq("group_hospital_id", groupHospitalId); + } + if (StringUtils.isNotEmpty(conditions)) { + wrapper.eq("conditions", conditions); + } + // 状态 1:待分配专家 2:已分配专家 3:已结束 + if (type != null && type == 1) { + wrapper.ne("status", "70"); + wrapper.orderBy("status,group_date", true); + } else if (type != null && type == 3) { + wrapper.eq("status", "70"); + wrapper.orderBy("group_date", false); + } + try { + Page list = applyConsultationService.selectPage(page.getPagePlusTwo(), wrapper); + if (list != null) { + CustomPage customPage = new CustomPage(list); + + List acssList=new ArrayList(); + for (int i = 0; i < customPage.getRows().size(); i++) { + EntityWrapper wrapper2=new EntityWrapper(); + //查看分配专家 + wrapper2.eq("con_id", customPage.getRows().get(i).getId()).ne("state","80"); + acssList=applyConsulationSpecialistService.selectList(wrapper2); + if(!acssList.isEmpty()){ + customPage.getRows().get(i).setAcsList(acssList); + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + }*/ + + //从写 + /** 9.7重写此方法 + * 基层医院远程会诊 + */ + @RequestMapping("selectConByPage") + public Map selectConByPage(Integer pageNo, Integer pageSize, String patientName, String startTime, + String endTime, Integer type, String diagnosisType, String categoryHospitalId, + Long docId, String conditions, String groupHospitalId) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName",patientName); + map.put("startTime",startTime); + map.put("endTime",endTime); + map.put("type",type); + map.put("diagnosisType",diagnosisType); + map.put("categoryHospitalId",categoryHospitalId); + map.put("docId",docId); + map.put("conditions",conditions); + map.put("groupHospitalId",groupHospitalId); + try { + CustomPage customPage = applyConsultationService.selectConByPage(map,pageNo,pageSize); + map.clear(); + if (customPage != null) { + for (int i = 0; i < customPage.getRows().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("con_id", customPage.getRows().get(i).getId()).ne("state","80"); + List acssList = applyConsulationSpecialistService.selectList(wrapper); + if(!acssList.isEmpty()){ + customPage.getRows().get(i).setAcsList(acssList); + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 会诊查看详情 + * + * @param + * @return + */ + @RequestMapping("selectConsultationById") + public Map selectConsultationById(Long id,Integer status,Long speId) { + Map map = new HashMap(); + List imgList=new ArrayList(); + String docPhone=""; + String contactPhone=""; + StringBuffer sctPhone=new StringBuffer(); + StringBuffer sctName=new StringBuffer(); + StringBuffer sctState=new StringBuffer(); + List apfList=new ArrayList(); + try { + ApplyConsultation applyConsultation = applyConsultationService.selectById(id); + if (applyConsultation != null) { + + User user=new User(); + if(applyConsultation.getDocId()!=null){ + user=userService.selectById(applyConsultation.getDocId()); + if(user!=null){ + docPhone=user.getPhone(); + contactPhone=user.getContactPhone(); + } + } + + //管理医院显示专家状态 + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.eq("con_id", applyConsultation.getId()).ne("state", "80"); + List accsList=applyConsulationSpecialistService.selectList(wrapper2); + for (int i = 0; i < accsList.size(); i++) { + user=userService.selectById(accsList.get(i).getSpeId()); + if(user!=null){ + //专家显示自己当前的状态 + if(speId!=null && accsList.get(i).getSpeId().equals(speId)){ + applyConsultation.setStatus(String.valueOf(accsList.get(i).getState())); + } + sctPhone=sctPhone.append(user.getPhone()+","); + sctName=sctName.append(user.getUserName()+","); + sctState=sctState.append(accsList.get(i).getState()+","); + } + } + //专家现在本人自己状态 + if(speId!=null){ + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.eq("con_id", applyConsultation.getId()).eq("spe_id", speId); + ApplyConsulationSpecialist accs=applyConsulationSpecialistService.selectOne(wrapper3); + if(accs!=null){ + applyConsultation.setStatus(String.valueOf(accs.getState())); + } + } + map.clear(); + map.put("con_id", id); + imgList = applyConsultationImgService.selectByMap(map); + apfList=applyPathologyFileService.selectByMap(map); + } + map.put("apfList", apfList); + map.put("applyConsultation", applyConsultation); + map.put("imgList", imgList); + map.put("docPhone", docPhone);//医生账号 + map.put("contactPhone", contactPhone);//医生联系电话 + map.put("sctPhone", sctPhone.length()>0?sctPhone.substring(0,sctPhone.length() - 1):"");//专家账号 + map.put("sctName", sctName.length()>0?sctName.substring(0,sctName.length() - 1):"");//专家姓名 + map.put("sctState",sctState.length()>0?sctState.substring(0,sctState.length() - 1):"");//专家姓名 + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 会诊图意见 + * @param + * @return + */ + @RequestMapping("updateConImgOpinion") + public Map updateConImgOpinion(ApplyConsultationImg applyConsultationImg) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + wrapper.eq("type", applyConsultationImg.getType()); + wrapper.eq("con_id", applyConsultationImg.getConId()); + boolean result = applyConsultationImgService.update(applyConsultationImg, wrapper); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改会诊信息 + * + * @param + * @return + */ + @RequestMapping("updateConsultation") + public Map updateConsultation(ApplyConsultation applyConsultation) { + Map map = new HashMap(); + try { + boolean result = applyConsultationService.updateById(applyConsultation); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @Transactional + @RequestMapping("insertConSpecialist") + public Map insertConSpecialist(@RequestBody List accList) { + Map map = new HashMap(); + List aspList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + Integer speNumber=1; + try { + if(!accList.isEmpty() && accList.get(0).getConId()!=null){ + if(accList.get(0).getSpeNumber()!=null){ + //获取分配专家的个数 + wrapper.eq("con_id", accList.get(0).getConId()).ne("state", "80"); + aspList=applyConsulationSpecialistService.selectList(wrapper); + if(aspList.size()>0){ + speNumber=2; + } + } + + boolean result = applyConsulationSpecialistService.insertBatch(accList); + if(result){ + + ApplyConsultation con=new ApplyConsultation(); + con.setGroupDate(accList.get(0).getConTime()); + con.setId(accList.get(0).getConId()); + + if(speNumber==2){ + map.put("con_id", accList.get(0).getConId()); + aspList=applyConsulationSpecialistService.selectByMap(map); + for (int i = 0; i < aspList.size(); i++) { + aspList.get(i).setSpeNumber(2); + applyConsulationSpecialistService.updateById(aspList.get(i)); + } + //修改总状态 + con.setStatus("30"); + applyConsultationService.updateById(con); + }else{ + //修改会诊时间 + applyConsultationService.updateById(con); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateConSpecialist") + public Map updateConSpecialist(ApplyConsulationSpecialist acss) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(acss!=null){ + acss.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", acss.getSpeId()).eq("con_id", acss.getConId()); + //.eq("spe_name",acss.getSpeName()).eq("contact_phone",acss.getContactPhone()); + boolean result = applyConsulationSpecialistService.update(acss, wrapper); + if(result == true){ + map.put("con_id", acss.getConId()); + List accList=applyConsulationSpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + int speNumber=accList.get(0).getSpeNumber(); + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyConsulationSpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(speNumber==1){ + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + }else if(speNumber==2){ + if(sum40!=0 && sum40==2){ + status="40"; + }else if(sum40<2 && sum30!=0){ + status="30"; + }else if(sum40<2 && sum30==0 && sum80!=0){ + status="20"; + } + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyConsultation ac=new ApplyConsultation(); + ac.setStatus(status); + ac.setId(acss.getConId()); + applyConsultationService.updateById(ac); + } + map.put("msg","1"); + } else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateConSpecialistInfo") + public Map updateConSpecialistInfo(ApplyConsulationSpecialist acss) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(acss!=null){ + acss.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("con_id", acss.getConId()); + boolean result = applyConsulationSpecialistService.update(acss, wrapper); + if(result == true){ + map.put("msg","1"); + } else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 删除 + */ + @Transactional//事务回滚 + @RequestMapping("deleteConsultation") + public Map deleteConsultation(Long id,String code) { + Map map = new HashMap(); + try { + ApplyConsultation con=applyConsultationService.selectById(id); + if(con!=null){ + code=con.getCode(); + boolean result = applyConsultationService.deleteById(id); + if(result == true){ + map.put("con_id", id); + applyConsultationImgService.deleteByMap(map); + applyConsulationSpecialistService.deleteByMap(map); + applyPathologyFileService.deleteByMap(map); + map.clear(); + map.put("code", code); + applyLisService.deleteByMap(map); + applyPathologyService.deleteByMap(map); + applyPathologyImgService.deleteByMap(map); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据身份证号码查看患者信息 + */ + @RequestMapping("selectConsultationByCard") + public Map selectConsultationByCard(String card) { + Map map = new HashMap(); + List acList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("pt_card", card).orderBy("group_date", false); + try { + acList=applyConsultationService.selectList(wrapper); + map.put("acList",acList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + +} + + + + + + + + + + + + + + diff --git a/backend/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java b/backend/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java new file mode 100644 index 0000000..144079f --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java @@ -0,0 +1,193 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.entity.User; +import com.imurs.service.ApplyDoctorPromoteService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 医生进修申请控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "promote") +public class ApplyDoctorPromoteController { + + @Autowired + ApplyDoctorPromoteService applyDoctorPromoteService; + + @Autowired + UserService userService; + /** + * 新增医生进修申请 + */ + @RequestMapping(value = "insertPromote") + public Map insertPromote(ApplyDoctorPromote applyDoctorPromote) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + + try { + if(applyDoctorPromote.getAccount()!=null){ + wrapper.eq("phone", applyDoctorPromote.getAccount()); + User user = userService.selectOne(wrapper); + if(user!=null){ + applyDoctorPromote.setDocId(user.getId()); + }else{ + map.put("msg", "6");//账号不存在account + return map; + } + } + boolean result = applyDoctorPromoteService.insert(applyDoctorPromote); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + map.remove("account"); + return map; + + } + + /** + * 修改医生进修申请 + */ + @RequestMapping(value = "updatePromote") + public Map updatePromote(ApplyDoctorPromote applyDoctorPromote) { + Map map = new HashMap(); + try { + boolean result = applyDoctorPromoteService.updateById(applyDoctorPromote); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 删除医生进修申请 + */ + @RequestMapping(value = "deletePromote") + public Map deletePromote(Long id) { + Map map = new HashMap(); + try { + boolean result = applyDoctorPromoteService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 查看医生进修申请详情 + */ + @RequestMapping(value = "selectPromoteById") + public Map selectPromoteById(Long id) { + Map map = new HashMap(); + try { + ApplyDoctorPromote promote = applyDoctorPromoteService.selectById(id); + map.put("promote", promote); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + + /** + * 医生进修列表分页 + */ + @RequestMapping(value = "selectPromotePage") + public Map selectPromotePage(String applyStartTime,String applyEndTime,String isSuper,String hospitalId , + String hospitalName,String docId,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?6:pageSize); + + if(StringUtils.isNotEmpty(applyStartTime)){ + wrapper.ge("apply_start_time", applyStartTime); + } + if(StringUtils.isNotEmpty(applyEndTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(applyEndTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("apply_start_time",dateFormat.format(cal.getTime())); + } + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(isSuper)){//上级医院/基层医院、基层医生看全部状态 + wrapper.ne("status", "A").ne("status", "J"); + } + wrapper.orderBy("status", true); + try { + Page pageList=applyDoctorPromoteService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理医院进修列表分页 + */ + @RequestMapping(value = "selectAdminPromote") + public Map selectAdminPromote(String applyStartTime,String applyEndTime,String isSuper,String hospitalId , + Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?12:pageSize; + map.put("applyStartTime", applyStartTime); + map.put("applyEndTime", applyEndTime); + map.put("isSuper", isSuper); + map.put("hospitalId", hospitalId); + try { + Pagetion pageList=applyDoctorPromoteService.selectAdminPromote(map,pageNo,pageSize); + map.put("customPage", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("applyStartTime"); + map.remove("applyEndTime"); + map.remove("isSuper"); + map.remove("hospitalId"); + } + return map; + + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyEcgController.java b/backend/src/main/java/com/imurs/controller/ApplyEcgController.java new file mode 100644 index 0000000..412bdd7 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyEcgController.java @@ -0,0 +1,420 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyEcg; +import com.imurs.entity.ApplyEcgSpecialist; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyEcgImgService; +import com.imurs.service.ApplyEcgService; +import com.imurs.service.ApplyEcgSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping("ecg") +public class ApplyEcgController { + + @Autowired + ApplyEcgService applyEcgService; + + @Autowired + ApplyEcgImgService applyEcgImgService; + + @Autowired + PatientService patientService; + + @Autowired + ApplyEcgSpecialistService applyEcgSpecialistService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + UserService userService; + + + /** + * 批量新增心电图片 + */ + @Transactional + @RequestMapping("insertEcgImg") + public Map insertEcgImg(@RequestBody List ecgImgList){ + Map map=new HashMap(); + boolean result=false; + try { + if(!ecgImgList.isEmpty() && ecgImgList.get(0)!=null){ + for (int i = 0; i < ecgImgList.size(); i++) { + result=applyEcgImgService.insert(ecgImgList.get(i)); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 新增 + */ + @Transactional + @RequestMapping("inserEcg") + public Map inserEcg(@RequestBody List ecgList) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!ecgList.isEmpty() && ecgList.get(0) != null) { + // 双向转诊数据 + boolean result = applyEcgService.insert(ecgList.get(0)); + if (result == true) { + map.put("msg", "1"); + + if(StringUtils.isNotEmpty(ecgList.get(0).getHisEsrdNumber())){ + wrapper.eq("his_esrd_number", ecgList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ecgList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", ecgList.get(0).getOutPatien()); + wrapper2.eq("out_patien", ecgList.get(0).getOutPatien()); + } + // 第一次新增时患者表新增 + wrapper.eq("hospital_id",ecgList.get(0).getCategoryHospitalId()); + Patient patient2 = patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id",ecgList.get(0).getGroupHospitalId()); + Patient patient3 = patientService.selectOne(wrapper); + + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if(StringUtils.isNotEmpty(ecgList.get(0).getSex())){ + patient.setSex(ecgList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getPatientName())){ + patient.setPatientName(ecgList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(ecgList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getOutPatien())){ + patient.setOutPatien(ecgList.get(0).getOutPatien()); + } + if (patient2 == null) { + patient.setHospitalId(ecgList.get(0).getCategoryHospitalId()); + result = patientService.insert(patient); + if (result == true) { + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 03:B超 04:心电 + ptEsrdNumber = "yd04" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(ecgList.get(0).getGroupHospitalId()); + result = patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber + : "yd04" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + + // 修改会诊数据 + Long id = ecgList.get(0).getId(); + ecgList.get(0).setEsrdNumber(ptEsrdNumber); + applyEcgService.updateById(ecgList.get(0)); + + if (!ecgList.get(0).getEcgImgList().isEmpty()) { + for (int i = 0; i < ecgList.get(0).getEcgImgList().size(); i++) { + ecgList.get(0).getEcgImgList().get(i).seteId(id); + } + applyEcgImgService.insertBatch(ecgList.get(0).getEcgImgList()); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改 + */ + @RequestMapping("updateEcg") + public Map updateEcg(ApplyEcg applyEcg){ + Map map=new HashMap(); + try { + boolean result=applyEcgService.updateById(applyEcg); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteEcgById") + public Map deleteEcgById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyEcgService.deleteById(id); + if(result==true){ + map.put("e_id", id); + applyEcgImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectEcgById") + public Map selectEcgById(Long id){ + Map map=new HashMap(); + ApplyEcg applyEcg=new ApplyEcg(); + String contactPhone=""; + List ecgImgList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + try { + applyEcg=applyEcgService.selectById(id); + if(applyEcg!=null){ + User user=userService.selectById(applyEcg.getDocId()); + if(user!=null){ + contactPhone=user.getContactPhone(); + } + //查看分配专家 + wrapper2.eq("e_id",id).ne("state","80"); + ApplyEcgSpecialist ecgSp=applyEcgSpecialistService.selectOne(wrapper2); + if(ecgSp!=null){ + applyEcg.setSpecialist(ecgSp.getSpeName()); + applyEcg.setSpecialistId(ecgSp.getSpeId()); + } + + //查看医院名字 + wrapper.eq("id", applyEcg.getCategoryHospitalId()).or().eq("id", applyEcg.getGroupHospitalId()); + List aifList=applyInformationService.selectList(wrapper); + if(!aifList.isEmpty()){ + for (int i = 0; i < aifList.size(); i++) { + if(aifList.get(i).getId().equals(applyEcg.getCategoryHospitalId())){ + applyEcg.setCategoryHospital(aifList.get(i).getHospitalName()); + } + if(aifList.get(i).getId().equals(applyEcg.getGroupHospitalId())){ + applyEcg.setGroupHospital(aifList.get(i).getHospitalName()); + } + } + } + map.put("e_id", id); + ecgImgList=applyEcgImgService.selectByMap(map); + } + map.put("applyEcg", applyEcg); + map.put("ecgImgList", ecgImgList); + map.put("contactPhone", contactPhone); + } catch (Exception e ) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @RequestMapping("insertEcgSpecialist") + public Map insertEcgSpecialist(ApplyEcgSpecialist ecgSp) { + Map map = new HashMap(); + try { + boolean result = applyEcgSpecialistService.insert(ecgSp); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateEcgSpecialist") + public Map updateEcgSpecialist(ApplyEcgSpecialist ecgSp) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(ecgSp!=null){ + ecgSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", ecgSp.getSpeId()).eq("e_id", ecgSp.geteId()); + boolean result = applyEcgSpecialistService.update(ecgSp, wrapper); + if(result == true){ + map.put("e_id", ecgSp.geteId()); + List accList=applyEcgSpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyEcgSpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyEcg ab=new ApplyEcg(); + ab.setStatus(status); + ab.setId(ecgSp.geteId()); + applyEcgService.updateById(ab); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理/申请专家医院心电列表 + */ + @RequestMapping("selectEcgPage") + public Map selectEcgPage(String categoryHospitalId,String groupHospitalId,String startTime, + String endTime,String patientName,Integer pageNo,Integer pageSize,Integer type,String part,Long docId){ + Map map=new HashMap(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = applyEcgService.selectEcgPage(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + ApplyEcgSpecialist ecgSp=new ApplyEcgSpecialist(); + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("e_id", pagetion.getList().get(i).getId()).ne("state","80"); + ecgSp=applyEcgSpecialistService.selectOne(wrapper); + if(ecgSp!=null){ + pagetion.getList().get(i).setSpecialist(ecgSp.getSpeName()); + pagetion.getList().get(i).setSpecialistId(ecgSp.getSpeId()); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + } + return map; + } + + /** + * 专家心电 + */ + @RequestMapping("selectEcgSpePage") + public Map selectEcgSpePage(Integer pageNo, Integer pageSize, String patientName, + String startTime, String endTime, String specialistId,Integer part,Integer type) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId",specialistId); + map.put("part",part); + map.put("type",type); + try { + Pagetion pagetion = applyEcgService.selectEcgSpePage(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("part"); + map.remove("type"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyInforMationController.java b/backend/src/main/java/com/imurs/controller/ApplyInforMationController.java new file mode 100644 index 0000000..1d31329 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyInforMationController.java @@ -0,0 +1,376 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.TotalInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationImgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.TotalInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +import javax.print.DocFlavor; + +/** + * 基层医院申请表 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "infor") +public class ApplyInforMationController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyInformationImgService applyInformationImgService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + UserService userService; + @Autowired + TotalInformationService totalInformationService; + + + + /** + * 查询指定角色的医院 + */ + /** + * 查询管理医院的名称 + */ + @RequestMapping(value = "selectInforByRid") + public Map selectInforByRid(String rid) { + Map map = new HashMap(); + try { + if(StringUtils.isNotEmpty(rid)){ + map.put("rid", rid); + map.put("state", "1"); + List inforList = applyInformationService.selectByMap(map); + map.put("inforList", inforList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 查询管理医院的名称 + */ + @RequestMapping(value = "selectInforName") + public Map selectInforName() { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.setSqlSelect("id as id,hospital_name as hospitalName").where("rid=1"); + try { + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper); + map.put("applyInformation",applyInformation); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 新增基层医院申请信息 + */ + @RequestMapping(value = "insertInfor") + public Map insertInfor(ApplyInformation applyInformation) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + try { + String uuid=MD5.GetMD5Code(dateFormat.format(date)); + // 医院id按照时间日期生成 + applyInformation.setId(uuid); + applyInformation.setAccount(applyInformation.getId()); + boolean result = applyInformationService.insert(applyInformation); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改基层医院申请信息/审核医院为通过 + */ + @RequestMapping(value = "updateInfor") + public Map updateInfor(ApplyInformation applyInformation) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper totalWrapper = new EntityWrapper(); + + try { + if(applyInformation!=null && StringUtils.isNotEmpty(applyInformation.getId())){ + wrapper.eq("id", applyInformation.getId()); + boolean result = applyInformationService.update(applyInformation, wrapper); + if(result == true && applyInformation.getState()!=null + && applyInformation.getState()==1){//修改医院状态为审核通过 + totalWrapper.eq("hospital_id", applyInformation.getId()); + TotalInformation totalIfo = totalInformationService.selectOne(totalWrapper); + if(totalIfo==null){ + TotalInformation totalInformation = new TotalInformation(); + totalInformation.setHospitalId(applyInformation.getId());//医院id + totalInformation.setType(applyInformation.getRid().intValue());//医院注册类型 + totalInformationService.insert(totalInformation); + } + } + map.put("msg", result == true ? "1" : "2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 批量修改医院数据 + */ + @RequestMapping(value = "updateInforBatch") + public Map updateUserBatch(@RequestBody List ApplyInformation) { + Map map = new HashMap<>(); + try { + boolean result = applyInformationService.updateBatchByIds(ApplyInformation); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改基层医院数据和图片信息 + */ + @Transactional + @RequestMapping(value="updateInforImg") + public Map updateInforImg(ApplyInformation applyInformation,String imgUrls,String imgType) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + if(applyInformation!=null && StringUtils.isNotEmpty(applyInformation.getId())){ + String id=applyInformation.getId(); + wrapper.eq("id", id); + boolean result = applyInformationService.update(applyInformation, wrapper); + //修改图片 + if(result==true){ + if(StringUtils.isNotEmpty(imgUrls) && StringUtils.isNotEmpty(imgType)){ + String[] strImg=imgUrls.split(","); + String[] strType=imgType.split(","); + map.put("hospital_id",id); + List imgList=applyInformationImgService.selectByMap(map); + if(!imgList.isEmpty()){ + applyInformationImgService.deleteByMap(map); + } + for (int i = 0; i < strType.length; i++) { + ApplyInformationImg apImg=new ApplyInformationImg(); + apImg.setHospitalId(id); + apImg.setImgUrl(strImg[i]); + apImg.setImgType(Integer.valueOf(strType[i])); + applyInformationImgService.insert(apImg); + } + } + map.remove("hospital_id"); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + + /** + * 删除基层医院申请信息 + */ + @Transactional + @RequestMapping(value = "deleteInfor") + public Map deleteInfor(String id) { + Map map = new HashMap(); + map.put("id", id); + try { + boolean result = applyInformationService.deleteByMap(map); + map.clear(); + if(result == true){ + map.put("hospital_id", id); + applyInformationImgService.deleteByMap(map); + map.put("msg","1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询单条基层医院申请信息 + */ + @RequestMapping(value = "findAifmById") + public Map findAifmById(String id,String rid) { + Map map = new HashMap(); + Map map1 = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + ApplyInformation applyInformation = applyInformationService.selectById(id); + if (applyInformation != null) { + // 医院图片 + wrapper.eq("hospital_id", id); + if(rid!=null){ + wrapper.ne("img_type","1").ne("img_type","2"); + } + List imgList = applyInformationImgService.selectList(wrapper); + map.put("imgList", imgList); + map.put("information", applyInformation); + //查出管理员信息 + if(applyInformation.getPrincipalId()!=null){ + User user=userService.selectById(applyInformation.getPrincipalId()); + map.put("user", user); + } + if(!StringUtils.isEmpty(rid)){ + map1.put("hospitalId", id); + List doctorArrangeList = doctorArrangeService.homeShowArrange(map1); + //List doctorArrangeList = doctorArrangeService.selectArrangeByRhId(id); + map.put("doctorArrangeList", doctorArrangeList); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医院信息分页显示(申请信息管理) + */ + @RequestMapping(value = "findAifmPage") + public Map findAifmPage(Integer pageSize, Integer pageNo, Integer state, Long hospitalId, + String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + if (StringUtils.isNotEmpty(hospitalName)) { + wrapper.like("hospital_name", hospitalName); + } + try { + wrapper.eq("state", state).eq("hospital_id", hospitalId).orderBy("create_time", false); + Page pageList = applyInformationService.selectPage(page.getPagePlusTwo(), wrapper); + if (pageList != null) { + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医院信息分页显示(合作医院信息) + */ + @RequestMapping(value = "findAifmAdminPage") + public Map findAifmAdminPage(Integer pageSize, Integer pageNo, Integer state, Long hospitalId, + String hospitalName) { + Map map = new HashMap(); + pageNo=pageNo == null ? 1 : pageNo; + pageSize=pageSize == null ? 10 : pageSize; + map.put("hospitalName", hospitalName); + try { + Pagetion pageList = applyInformationService.findAifmAdminPage(map, pageNo, pageSize); + map.put("pageList", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalName"); + } + return map; + } + + /** + * 分组查出所有医院名称 + */ + @RequestMapping(value = "findAifmGroup") + public Map findAifmGroup(Integer state, String rid,String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.setSqlSelect("hospital_name as hospitalName,id as id,rid as rid,allocate_doctor as allocateDoctor "); + if (state == null) { + wrapper.eq("state", "1"); + }else if(state==4){ + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid",rid); + }else{ + wrapper.ne("rid", "1").ne("rid","9"); + if(StringUtils.isNotEmpty(hospitalName)){ + wrapper.eq("hospital_name", hospitalName); + } + wrapper.orderBy("if(id='68729a2d87075bd616f7339940227f46',0,1),if(id='97561c8ecc660a36a3cdad29abd4ae3f',0,1)," + + "if(id='07cdf216c7a7eb0e1dd5d7fc568d9285',0,1),if(id='4f74e5c6659354e6eca2d4658bf57777',0,1)"); + } + } + try { + List list = applyInformationService.selectList(wrapper); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyParameterController.java b/backend/src/main/java/com/imurs/controller/ApplyParameterController.java new file mode 100644 index 0000000..8b87286 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyParameterController.java @@ -0,0 +1,628 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.entity.ApplyEcg; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyLis; +import com.imurs.entity.ApplyPathology; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.entity.ApplySpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.parameter.ApplyParameter; +import com.imurs.service.ApplyConsultationImgService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyEcgImgService; +import com.imurs.service.ApplyEcgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.ApplyLisService; +import com.imurs.service.ApplyPathologyFileService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.ApplySpecialistService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +import net.sf.json.JSONObject; + +@RestController +@RequestMapping("apply") +public class ApplyParameterController { + + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyConsultationImgService applyConsultationImgService; + @Autowired + ApplyLisService applyLisService; + @Autowired + ApplyPathologyService applyPathologyService; + @Autowired + ApplyPathologyImgService applyPathologyImgService; + @Autowired + ApplyEcgService applyEcgService; + @Autowired + ApplyEcgImgService applyEcgImgService; + @Autowired + PatientService patientService; + @Autowired + ApplySpecialistService applySpecialistService; + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + @Autowired + ApplyPathologyFileService applyPathologyFileService; + + /** + * 批量新增 + * + * @param apList + * @return + */ + @Transactional + @RequestMapping("insertApply") + public Map insertApply(@RequestBody List parameterList) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + String code=MD5.GetMD5Code(dateFormat.format(date)); + String ptEsrdNumber = ""; + boolean result = false; + Long id = null; + Patient patient2 = new Patient(); + Patient patient3 = new Patient(); + for(int i = 0; i ecgImgList = parameterList.get(0).getEcgList().get(0).getEcgImgList(); + if (ecgImgList != null) { + result =applyEcgImgService.insertBatch(ecgImgList); + } + } + map.put("msg", result == true ? "1" : "2"); + + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping("selectApply") + public Map selectApply() { + Map map = new HashMap(); + List aciList=new ArrayList(); + ApplyConsultationImg aci=new ApplyConsultationImg(); + aci.setConId(1L); + aci.setImgUrl("ur///////"); + aciList.add(aci); + List acList=new ArrayList(); + ApplyConsultation ac=new ApplyConsultation(); + ac.setAge(22); + ac.setAciList(aciList); + acList.add(ac); + + + + List ecgImgList=new ArrayList(); + ApplyEcgImg ecgImg=new ApplyEcgImg(); + ecgImg.seteId(1L); + ecgImg.setImgUrl("11111"); + ecgImgList.add(ecgImg); + + List ecgList=new ArrayList(); + ApplyEcg ae=new ApplyEcg(); + ae.setAge(22); + ae.setEcgImgList(ecgImgList); + ecgList.add(ae); + + List apImgList=new ArrayList(); + ApplyPathologyImg img=new ApplyPathologyImg(); + img.setId(32L); + apImgList.add(img); + + ApplyPathology ap=new ApplyPathology(); + ap.setAge(233); + ap.setAphImgList(apImgList); + List apList=new ArrayList(); + apList.add(ap); + + + ApplyParameter applyParameter=new ApplyParameter(acList, new ApplyLis(), apList, + ecgList, new Patient(),"1", "2", "3", "4"); + try { + JSONObject json = JSONObject.fromObject(applyParameter);//将java对象转换为json对象 + //String str = json.toString();//将json对象转换为字符串 + //map.put("apply",str); + map.put("applyParameter",applyParameter); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @Transactional + @RequestMapping("insertApplySpecialist") + public Map insertApplySpecialist(@RequestBody List asList) { + Map map = new HashMap(); + List aspList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + Integer speNumber=1; + EntityWrapper wrapper1=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + EntityWrapper wrapper3=new EntityWrapper(); + ApplyConsultation con=new ApplyConsultation(); + ApplyLis lis=new ApplyLis(); + ApplyEcg ecg=new ApplyEcg(); + ApplyPathology pathology=new ApplyPathology(); + List apList=new ArrayList(); + String code=""; + try { + if(!asList.isEmpty() && StringUtils.isNotEmpty(asList.get(0).getCode())){ + code=asList.get(0).getCode(); + if(asList.get(0).getSpeNumber()!=null){ + //获取分配专家的个数 + wrapper.eq("code",code).ne("state", "80"); + aspList=applySpecialistService.selectList(wrapper); + if(aspList.size()>0){ + speNumber=2; + } + } + boolean result = applySpecialistService.insertBatch(asList); + if(result == true){ + if(speNumber==2){ + map.put("code", code); + aspList=applySpecialistService.selectByMap(map); + for (int i = 0; i < aspList.size(); i++) { + aspList.get(i).setSpeNumber(2); + applySpecialistService.updateById(aspList.get(i)); + } + //修改总状态 + wrapper1.eq("code",code); + wrapper2.eq("code",code); + wrapper3.eq("code",code); + con.setStatus("30"); + lis.setStatus("30"); + ecg.setStatus("30"); + + applyConsultationService.update(con, wrapper1); + applyLisService.update(lis, wrapper2); + applyEcgService.update(ecg, wrapper3); + apList=applyPathologyService.selectByMap(map); + for (int i = 0; i < apList.size(); i++) { + pathology.setId(apList.get(i).getId()); + pathology.setStatus("30"); + applyPathologyService.updateById(pathology); + } + + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateSpecialist") + public Map updateSpecialist(ApplySpecialist as) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + EntityWrapper wrapper1=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + EntityWrapper wrapper3=new EntityWrapper(); + ApplyConsultation con=new ApplyConsultation(); + ApplyLis lis=new ApplyLis(); + ApplyEcg ecg=new ApplyEcg(); + ApplyPathology pathology=new ApplyPathology(); + List apList=new ArrayList(); + String code=""; + try { + if(as!=null && StringUtils.isNotEmpty(as.getCode())){ + code=as.getCode(); + as.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", as.getSpeId()).eq("code", code); + boolean result = applySpecialistService.update(as, wrapper); + if(result == true){ + map.put("code", code); + List accList=applySpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + int speNumber=accList.get(0).getSpeNumber(); + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplySpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(speNumber==1){ + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + }else if(speNumber==2){ + if(sum40!=0 && sum40==2){ + status="40"; + }else if(sum40<2 && sum30!=0){ + status="30"; + }else if(sum40<2 && sum30==0 && sum80!=0){ + status="20"; + } + } + } + if(StringUtils.isNotEmpty(status)){ + //修改总状态 + wrapper1.eq("code",code); + wrapper2.eq("code",code); + wrapper3.eq("code",code); + con.setStatus(status); + lis.setStatus(status); + ecg.setStatus(status); + pathology.setStatus(status); + applyConsultationService.update(con, wrapper1); + applyLisService.update(lis, wrapper2); + applyEcgService.update(ecg, wrapper3); + + apList=applyPathologyService.selectByMap(map); + for (int i = 0; i < apList.size(); i++) { + pathology.setId(apList.get(i).getId()); + pathology.setStatus(status); + applyPathologyService.updateById(pathology); + } + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 会诊查看详情 + */ + @RequestMapping("selectConsultationByCode") + public Map selectConsultationByCode(Long id,Integer status,Long speId) { + Map map = new HashMap(); + String docPhone=""; + String contactPhone=""; + StringBuffer sctPhone=new StringBuffer(); + StringBuffer sctName=new StringBuffer(); + StringBuffer sctState=new StringBuffer(); + ApplyInformation applyInformation=new ApplyInformation(); + try { + if(id!=null){ + ApplyConsultation applyConsultation = applyConsultationService.selectById(id); + if (applyConsultation != null) { + applyInformation = applyInformationService + .selectById(applyConsultation.getCategoryHospitalId());// 所属医院 + applyConsultation.setCategoryHospital(applyInformation.getHospitalName()); + applyInformation = applyInformationService + .selectById(applyConsultation.getGroupHospitalId());// 会诊医院 + applyConsultation.setGroupHospital(applyInformation.getHospitalName()); + + User user=new User(); + if(applyConsultation.getDocId()!=null){ + user=userService.selectById(applyConsultation.getDocId()); + if(user!=null){ + docPhone=user.getPhone(); + contactPhone=user.getContactPhone(); + } + } + + //管理医院显示专家状态 + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.eq("code", applyConsultation.getCode()).ne("state", "80"); + List accsList=applySpecialistService.selectList(wrapper2); + for (int i = 0; i < accsList.size(); i++) { + user=userService.selectById(accsList.get(i).getSpeId()); + if(user!=null){ + //专家显示自己当前的状态 + if(speId!=null && accsList.get(i).getSpeId().equals(speId)){ + applyConsultation.setStatus(String.valueOf(accsList.get(i).getState())); + } + sctPhone=sctPhone.append(user.getPhone()+","); + sctName=sctName.append(user.getUserName()+","); + sctState=sctState.append(accsList.get(i).getState()+","); + } + } + //专家现在本人自己状态 + if(speId!=null){ + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.eq("code", applyConsultation.getCode()).eq("spe_id", speId); + ApplySpecialist accs=applySpecialistService.selectOne(wrapper3); + if(accs!=null){ + applyConsultation.setStatus(String.valueOf(accs.getState())); + } + } + } + map.put("applyConsultation", applyConsultation); + map.put("docPhone", docPhone);//医生账号 + map.put("contactPhone", contactPhone);//医生联系电话 + map.put("sctPhone", sctPhone.length()>0?sctPhone.substring(0,sctPhone.length() - 1):"");//专家账号 + map.put("sctName", sctName.length()>0?sctName.substring(0,sctName.length() - 1):"");//专家姓名 + map.put("sctState",sctState.length()>0?sctState.substring(0,sctState.length() - 1):"");//专家姓名 + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 心电查看详情 + */ + @RequestMapping("selectEcgByCode") + public Map selectEcgByCode(String code) { + Map map = new HashMap(); + EntityWrapper ecgWrapper = new EntityWrapper(); + List imgList=new ArrayList(); + try { + if(StringUtils.isNotEmpty(code)){ + ecgWrapper.eq("code", code); + ApplyEcg applyEcg = applyEcgService.selectOne(ecgWrapper); + if (applyEcg != null) { + map.put("e_id", applyEcg.getId()); + imgList = applyEcgImgService.selectByMap(map); + } + map.put("imgList", imgList); + map.put("applyEcg", applyEcg); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * lis查看详情 + */ + @RequestMapping("selectLisByCode") + public Map selectLisByCode(String code) { + Map map = new HashMap(); + EntityWrapper lisWrapper = new EntityWrapper(); + try { + if(StringUtils.isNotEmpty(code)){ + lisWrapper.eq("code", code); + ApplyLis applyLis = applyLisService.selectOne(lisWrapper); + map.put("applyLis", applyLis); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 影像查看详情 + */ + @RequestMapping("selectPathologyByCode") + public Map selectPathologyByCode(String code) { + Map map = new HashMap(); + List apList = new ArrayList(); + List imgList=new ArrayList(); + //ApplyInformation applyInformation=new ApplyInformation(); + try { + if(StringUtils.isNotEmpty(code)){ + map.put("code", code); + apList = applyPathologyService.selectByMap(map); + if (!apList.isEmpty()) { + for (int i = 0; i < apList.size(); i++) { + map.clear(); + map.put("p_id", apList.get(i).getId()); + imgList = applyPathologyImgService.selectByMap(map); + apList.get(i).setAphImgList(imgList); + + } + + } + map.put("apList", apList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 上传影像文件 + */ + @Transactional + @RequestMapping("insertPathologyFile") + public Map insertPathologyFile(@RequestBody List apfList) { + Map map=new HashMap(); + boolean result=false; + try { + if(apfList.isEmpty()){ + map.put("msg", "3"); + }else{ + for (int i = 0; i < apfList.size(); i++) { + result=applyPathologyFileService.insert(apfList.get(i)); + } + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 删除影像文件 + */ + @Transactional + @RequestMapping("deletePathologyFile") + public Map deletePathologyFile(Long id) { + Map map=new HashMap(); + boolean result=false; + try { + if(id==null){ + map.put("msg", "3"); + }else{ + result=applyPathologyFileService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ApplyPathologyContrller.java b/backend/src/main/java/com/imurs/controller/ApplyPathologyContrller.java new file mode 100644 index 0000000..635da88 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ApplyPathologyContrller.java @@ -0,0 +1,419 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyPathology; +import com.imurs.entity.ApplyPathologySpecialist; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.entity.Patient; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.ApplyPathologySpecialistService; +import com.imurs.service.PatientService; +import com.imurs.util.page.Pagetion; + +/** + * 影像控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "icon") +public class ApplyPathologyContrller { + + @Autowired + ApplyPathologyService applyPathologyService; + + @Autowired + ApplyPathologyImgService applyPathologyImgService; + + @Autowired + ApplyPathologySpecialistService applyPathologySpecialistService; + + @Autowired + PatientService patientService; + + @Autowired + ApplyInformationService applyInformationService; + + + /** + * 批量新增影像图片 + */ + @Transactional + @RequestMapping("insertAphImg") + public Map insertAphImg(@RequestBody List apImgList){ + Map map=new HashMap(); + boolean result=false; + try { + if(!apImgList.isEmpty() && apImgList.get(0)!=null){ + for (int i = 0; i < apImgList.size(); i++) { + result=applyPathologyImgService.insert(apImgList.get(i)); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 批量新增影像 + */ + @Transactional + @RequestMapping("insertAph") + public Map insertAph(@RequestBody List aphList){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if(!aphList.isEmpty() && aphList.get(0)!=null){ + //双向转诊数据 + boolean result=applyPathologyService.insert(aphList.get(0)); + if(result==true){ + map.put("msg", "1"); + + //第一次新增时患者表新增 + if(StringUtils.isNotEmpty(aphList.get(0).getHisEsrdNumber())){ + wrapper.eq("his_esrd_number", aphList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", aphList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", aphList.get(0).getOutPatien()); + wrapper2.eq("out_patien", aphList.get(0).getOutPatien()); + } + + wrapper.eq("hospital_id", aphList.get(0).getCategoryHospitalId());; + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", aphList.get(0).getGroupHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(aphList.get(0).getPtCard())){ + patient.setCard(aphList.get(0).getPtCard()); + //patient.setBirthDate(aphList.get(0).getPtCard().substring(6, 14)); + } + if(StringUtils.isNotEmpty(aphList.get(0).getSex())){ + patient.setSex(aphList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getPatientName())){ + patient.setPatientName(aphList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(aphList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getOutPatien())){ + patient.setOutPatien(aphList.get(0).getOutPatien()); + } + if(patient2==null){ + patient.setHospitalId(aphList.get(0).getCategoryHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 03:B超/病理 04 心电 05影像 + ptEsrdNumber="yd05"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + + } + if(patient3==null){ + patient.setHospitalId(aphList.get(0).getGroupHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd05"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + Long id=aphList.get(0).getId(); + aphList.get(0).setEsrdNumber(ptEsrdNumber); + applyPathologyService.updateById(aphList.get(0)); + + if(!aphList.get(0).getAphImgList().isEmpty()){ + for (int i = 0; i < aphList.get(0).getAphImgList().size(); i++) { + aphList.get(0).getAphImgList().get(i).setpId(id); + } + applyPathologyImgService.insertBatch(aphList.get(0).getAphImgList()); + } + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改 + */ + @RequestMapping("updateAph") + public Map updateAph(ApplyPathology applyPathology){ + Map map=new HashMap(); + try { + boolean result=applyPathologyService.updateById(applyPathology); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteAphById") + public Map deleteAphById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyPathologyService.deleteById(id); + if(result==true){ + map.put("p_id", id); + applyPathologyImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectAphById") + public Map selectAphById(Long id){ + Map map=new HashMap(); + ApplyPathology applyPathology=new ApplyPathology(); + List aphImgList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + try { + applyPathology=applyPathologyService.selectById(id); + if(applyPathology!=null){ + //查看分配专家 + wrapper2.eq("p_id",id).ne("state","80"); + ApplyPathologySpecialist aphSp=applyPathologySpecialistService.selectOne(wrapper2); + if(aphSp!=null){ + applyPathology.setSpecialist(aphSp.getSpeName()); + applyPathology.setSpecialistId(aphSp.getSpeId()); + } + + //查看医院名字 + wrapper.eq("id", applyPathology.getCategoryHospitalId()).or().eq("id", applyPathology.getGroupHospitalId()); + List aifList=applyInformationService.selectList(wrapper); + if(!aifList.isEmpty()){ + for (int i = 0; i < aifList.size(); i++) { + if(aifList.get(i).getId().equals(applyPathology.getCategoryHospitalId())){ + applyPathology.setCategoryHospital(aifList.get(i).getHospitalName()); + } + if(aifList.get(i).getId().equals(applyPathology.getGroupHospitalId())){ + applyPathology.setGroupHospital(aifList.get(i).getHospitalName()); + } + } + } + map.put("p_id", id); + aphImgList=applyPathologyImgService.selectByMap(map); + } + map.put("applyPathology", applyPathology); + map.put("aphImgList", aphImgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理医院影像列表 + */ + @RequestMapping("selectAphPage") + public Map selectAphPage(String categoryHospitalId,String groupHospitalId,String startTime, + String endTime,String patientName,Integer pageNo,Integer pageSize,Integer type,String part,Long docId,Integer cureType,String diagnosisType){ + Map map=new HashMap(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = applyPathologyService.selectAphPage(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + ApplyPathologySpecialist aphSp=new ApplyPathologySpecialist(); + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("p_id", pagetion.getList().get(i).getId()).ne("state","80"); + aphSp=applyPathologySpecialistService.selectOne(wrapper); + if(aphSp!=null){ + pagetion.getList().get(i).setSpecialist(aphSp.getSpeName()); + pagetion.getList().get(i).setSpecialistId(aphSp.getSpeId()); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + } + return map; + } + + /** + * 分配专家 + */ + @RequestMapping("insertAphSpecialist") + public Map insertAphSpecialist(ApplyPathologySpecialist aphSp) { + Map map = new HashMap(); + try { + boolean result = applyPathologySpecialistService.insert(aphSp); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateAphSpecialist") + public Map updateAphSpecialist(ApplyPathologySpecialist aphSp) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(aphSp!=null){ + aphSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", aphSp.getSpeId()).eq("p_id", aphSp.getpId()); + boolean result = applyPathologySpecialistService.update(aphSp, wrapper); + if(result == true){ + map.put("p_id", aphSp.getpId()); + List accList=applyPathologySpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyPathologySpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyPathology ap=new ApplyPathology(); + ap.setStatus(status); + ap.setId(aphSp.getpId()); + applyPathologyService.updateById(ap); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家影像 + */ + @RequestMapping("selectAphSpePage") + public Map selectAphSpePage(Integer pageNo, Integer pageSize, String patientName, + String startTime, String endTime, String specialistId,Integer part,Integer type) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId",specialistId); + map.put("part",part); + map.put("type",type); + try { + Pagetion pagetion = applyPathologyService.selectAphSpePage(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("part"); + map.remove("type"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/BModeReportController.java b/backend/src/main/java/com/imurs/controller/BModeReportController.java new file mode 100644 index 0000000..136f8f0 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/BModeReportController.java @@ -0,0 +1,281 @@ +package com.imurs.controller; + +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.BModeHistory; +import com.imurs.entity.BModeReport; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.BModeHistoryService; +import com.imurs.service.BModeReportService; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author laier + * @date 2022-12-05 10:01 + */ +@RestController +@RequestMapping("report") +public class BModeReportController { + Logger logger = LoggerFactory.getLogger(BModeReportController.class); + + @Autowired + BModeReportService bModeReportService; + @Autowired + ApplyBModeImgService applyBModeImgService; + @Autowired + BModeHistoryService bModeHistoryService; + /** + * 基层批量新增超声报告,并修改病例状态为待审核报告 + * @param modeReports + * @return + */ + @PostMapping("insertModeReportList") + public Map insertModeReportList(@RequestBody List modeReports) { + Map resultMap = new HashMap<>(8); + try { + if (!CollectionUtils.isEmpty(modeReports)) { + // 同一个病例的报告,bId一致 + Long bId = modeReports.get(0).getbId(); + List resultReports = bModeReportService.insertModeReportList(bId,modeReports); + if (resultReports == null) { + resultMap.put("msg","2"); + } + resultMap.put("msg","1"); + resultMap.put("resultReports",resultReports); + } else { + resultMap.put("msg","2"); + } + } catch (Exception e) { + logger.error("基层批量新增超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + +// /** +// * 专家提交报告,省略审核流程,提交即为完成报告,修改状态,增加签名等 +// * @param modeReports 报告列表 +// * @return resultMap +// */ +// @RequestMapping("insertReportBySpecialist") +// public Map insertReportBySpecialist(@RequestBody List modeReports) { +// Map resultMap = new HashMap<>(8); +// if (!CollectionUtils.isEmpty(modeReports)) { +// try { +// // 同一个病例的报告,bId一致 +// Long bId = modeReports.get(0).getbId(); +// Long speId = modeReports.get(0).getSpeId(); +// // 新增报告 +// List resultReports = bModeReportService.insertModeReportList(bId,modeReports); +// // 修改报告状态、病例状态、新增专家签名 +// resultReports = bModeReportService.finishModeReport(bId,speId,resultReports); +// if (resultReports == null) { +// resultMap.put("msg","2"); +// } +// resultMap.put("msg","1"); +// resultMap.put("resultReports",resultReports); +// } catch (Exception e) { +// logger.error("专家批量新增超声报告异常:",e); +// resultMap.put("msg","4"); +// } +// } else { +// resultMap.put("msg","2"); +// } +// return resultMap; +// } + + /** + * 根据bId查询报告列表 + * @param bId 报告所属病例id + * @return + */ + @GetMapping("selectModeReportListByBId") + public Map selectModeReportList(Long bId) { + Map resultMap = new HashMap<>(8); + try { + List modeReportList = bModeReportService.selectModeReportListByBId(bId); + resultMap.put("msg","1"); + resultMap.put("modeReportList",modeReportList); + } catch (Exception e) { + logger.error("查询超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 根据报告id查询报告详情 + * @param reportId 报告id + * @return + */ + @GetMapping("selectModeReportByReportId") + public Map selectModeReportByReportId(Long reportId) { + Map resultMap = new HashMap<>(8); + List bModeImgList = new ArrayList<>(); + try { + BModeReport modeReport = bModeReportService.selectModeReportByReportId(reportId); + if (!StringUtils.isEmpty(modeReport.getImageIds())) { + String[] split = modeReport.getImageIds().split(","); + bModeImgList = applyBModeImgService.selectBatchIds(Arrays.asList(split)); + } + resultMap.put("msg","1"); + resultMap.put("modeReport",modeReport); + resultMap.put("bModeImgList",bModeImgList); + } catch (Exception e) { + logger.error("查询报告详情异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 根据id删除超声报告 + * @param reportId 报告id + * @return + */ + @RequestMapping("deleteReportById") + public Map deleteReportById(Long reportId) { + Map resultMap = new HashMap<>(8); + try { + bModeReportService.deleteById(reportId); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("删除超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 基层医生修改超声报告 + * @param modeReport + * @return + */ + @PostMapping("updateModeReportByReportId") + public Map updateModeReportByReportId(@RequestBody BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + // 图片id由list转string + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + bModeReportService.updateById(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("基层医生修改超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 专家审核报告,判断该病例所有病例是否审核完毕,是则改变病例状态,会诊状态以及专家表状态。 + * @param modeReport + * @return + */ + @PostMapping("checkReportBySpecialist") + public Map checkRepostBySpecialist(@RequestBody BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + bModeReportService.checkReportAndChangeModelState(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("专家审核报告异常",e); + resultMap.put("msg","4"); + } + return resultMap; + } + //主表存储当前最新记录。 + //历史表存储所有历史记录,每次更新都会生成一条新历史记录 + // + @RequestMapping(value="UpdateAndSaveHisBmodeReport") + // @PostMapping("UpdateAndSaveHisBmodeReport") + public Map UpdateAndSaveBmodeReport(BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + //第一步存历史记录 一个是病例id 一个是表主键ID ,那修改的时候,是应该按主键id的 病例ID 有可能是多张报告,不清楚是不是 + //多张一起修改的,所以我默认它是一张张修改保存的 + BModeReport oldBmodeRe=bModeReportService.selectModeReportByReportId(modeReport.getId()); + //查到这个数据以后 把这份数据存进去 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + BModeHistory bH =new BModeHistory(); + bH.setbId(oldBmodeRe.getbId()); + bH.setbHint(oldBmodeRe.getbHint()); + bH.setbSee(oldBmodeRe.getbSee()); + //bH.setCriticalValue(oldBmodeRe.getCriticalValue()); + bH.setUpdateTime(oldBmodeRe.getUpdateTime()); + bH.setReportId(oldBmodeRe.getId()); + bH.setExaminePart(oldBmodeRe.getExaminePart()); + bH.setSpeId(oldBmodeRe.getSpeId()); + bH.setNature(oldBmodeRe.getNature()); + //System.out.println("报告医生"+oldBmodeRe.getUpdateDoc()+modeReport.getId()); + bH.setUpdateDoc(oldBmodeRe.getUpdateDoc()); + bH.setUpdateTime(oldBmodeRe.getUpdateTime()); + //System.out.println("报告时间"+oldBmodeRe.getUpdateTime()+modeReport.getId()); + //System.out.println("参数"+updateDoc+"---"+oldBmodeRe.getUpdateTime()); + bH.setGroupDate(oldBmodeRe.getGroupDate()); + bH.setInitial(oldBmodeRe.getInitial()==null?"":oldBmodeRe.getInitial()); + bH.setOpinion(oldBmodeRe.getOpinion()==null?"":oldBmodeRe.getOpinion()); + + bH.setImageIds(oldBmodeRe.getImageIds()==null?"":oldBmodeRe.getImageIds()); + /* + * if (!CollectionUtils.isEmpty(oldBmodeRe.getImageIds())) { String[] split = + * modeReport.getImageIds().split(","); + * + * String imageIds = StringUtils.join(oldBmodeRe.getImageIdList(), ","); + * System.out.println("图片字符串"+imageIds); bH.setImageIds(imageIds); } + */ + + boolean issucess=bModeHistoryService.insert(bH); + if(!issucess) { + resultMap.put("msg","插入历史数据不成功"); + + } + // + //根据id 把修改的记录存到主表去, + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + modeReport.setUpdateTime(updateTime); + bModeReportService.updateById(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("更新报告异常",e); + resultMap.put("msg","4"); + } + return resultMap; + } + //根据报告id查询历史记录, + + @PostMapping("selectModeHisReportListByBId") + public Map selectModeHisReportListByBId(Long bId,Long reportId) { + Map resultMap = new HashMap<>(8); + Map map = new HashMap(); + // System.out.println(reportId+"查询所有"+bId); + map.put("bId",bId); + map.put("reportId",reportId); + try { + List modeReportList = bModeHistoryService.selectBmodeHis(map); + /* + * for(BModeHistory b:modeReportList) { System.out.println("查看列表数据"+b); } + */ + resultMap.put("msg","1"); + resultMap.put("modeReportList",modeReportList); + } catch (Exception e) { + logger.error("查询超声报告异常:",e); + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } +} diff --git a/backend/src/main/java/com/imurs/controller/BmodeSendMsgController.java b/backend/src/main/java/com/imurs/controller/BmodeSendMsgController.java new file mode 100644 index 0000000..800f080 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/BmodeSendMsgController.java @@ -0,0 +1,82 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + + +/** + * 预约超声短信提示 + * + * @author Server + * + */ +@RestController +@RequestMapping("/BmodeSendMsg") +public class BmodeSendMsgController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + @RequestMapping("/sendMsgYy") + public Map sendMsg(String hostName,String docName,Integer docId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + User user = userService.selectById(docId); + String contactPhone = user.getContactPhone(); + map.put("phone", contactPhone); + map.put("msg",hostName+docName+"医生,您好!你方预约的远程超声检查即将开始,请尽快登陆系统"); + //调用创蓝接口发送短信 + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + //Json格式化返回信息 + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + @RequestMapping("/sendMsg") + public Map sendMsg(String hostName,String docName,String patientName,Integer docId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + User user = userService.selectById(docId); + String contactPhone = user.getContactPhone(); + map.put("phone", contactPhone); + map.put("msg","尊敬的"+docName+"医生,"+hostName+patientName+"患者预约的远程超声已经上线,请您及时登陆。"); + //调用创蓝接口发送短信 + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + + //Json格式化返回信息 + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/BrightnessmodeController.java b/backend/src/main/java/com/imurs/controller/BrightnessmodeController.java new file mode 100644 index 0000000..5206e40 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/BrightnessmodeController.java @@ -0,0 +1,124 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import com.imurs.entity.*; +import com.imurs.service.*; +import org.apache.poi.hssf.record.OldFormulaRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.parameter.Bchao; +import com.imurs.parameter.Bchildren; +import com.imurs.parameter.Bmenu; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; + +@RestController +@RequestMapping(value = "Bscan") +public class BrightnessmodeController { + @Autowired + BmodelFrisService bmodelFrisService; + @Autowired + BmodelService bmodelService; + @Autowired + BmodelSecondService bmodelSecondService; + @Autowired + BdiagnosisService bDiagnosisService; + @Autowired + BdiagnosisNextService bDiagnosisNextService; + /** + * 查询所有B超模板数据 + */ + @RequestMapping(value = "selectInforByRid") + public Map selectInforByRid(String rid) { + Map map = new HashMap(); + try { + EntityWrapper wrapper=new EntityWrapper(); + //EntityWrapper wrapper1=new EntityWrapper(); + //EntityWrapper wrapper2=new EntityWrapper(); + List bmodel=bmodelService.selectList(wrapper.orderBy("first_id",true)); + // System.out.println("长度"+bmodel.size()+bmodel.toString()); + //三次单独的查询,将每级的菜单数据分别保存出来 + List tree = new ArrayList(); + // + for(Bmodel bm:bmodel){ + // m.put(bm.getId(), bm); + //根据这个循环 查出对应ID的二级目录 + // wrapper1.eq("bf_id", bm.getId()); + // System.out.println("一级子菜单的ID"+bm.getId()); + //List bmodelFris=bmodelFrisService.selectList(wrapper1); + List bmodelFris=bmodelFrisService.selectBmodelFris(bm.getId()); + Bchao bc =new Bchao(); + // System.out.println("查询到二级子菜单的内容"+bmodelFris.toString()); + List li= new ArrayList(); + bc.setName(bm.getFirstText()); + bc.setId(bm.getId()); + //二级菜单的数据保存 + for(BmodelFris bf:bmodelFris){ + Bchildren bd = new Bchildren(); + bd.setId(bf.getSecondId());//下一级的ID + bd.setThird_text(bf.getSecondText());//二级目录的文本 + li.add(bd); + + } + bc.setBchildren(li); + tree.add(bc); + } + //将三级菜单录进去 + + for(Bchao bc:tree){ + + List list =bc.getBchildren(); + //System.out.println("list的尺寸"+list.size()); + for(Bchildren b:list){ + //查询到第三级数据 + List chilList = bmodelSecondService.selectbmodelSecond(b.getId()); + b.setListbchildren(chilList); + } + + } + map.put("MENU", tree); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + @RequestMapping(value = "selectdiagnosisByRid") + public Map selectdiagnosisByRid(String rid) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + List Bdiagnosislist= bDiagnosisService.selectList(wrapper.orderBy("id",true)); + List tree = new ArrayList(); + + for(Bdiagnosis bd:Bdiagnosislist){ + List bdnlist =bDiagnosisNextService.selectDiagnosisList(bd.getId()); + Items bc =new Items(); + bc.setIcon(bd.getId()+""); + bc.setName(bd.getName()); + //System.out.println("打印出来的ID"+bd.getId()); + //System.out.println(bdnlist.toString()); + List li= new ArrayList(); + for(BdiagnosisNext bg:bdnlist){ + Children cd =new Children(); + cd.setName(bg.getName()); + cd.setPath(bg.getId()+""); + li.add(cd); + } + bc.setChildren(li); + tree.add(bc); + } + + map.put("tree", tree); + return map; + + } +} diff --git a/backend/src/main/java/com/imurs/controller/CaseTemplateController.java b/backend/src/main/java/com/imurs/controller/CaseTemplateController.java new file mode 100644 index 0000000..407d571 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/CaseTemplateController.java @@ -0,0 +1,179 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.CaseTemplate; +import com.imurs.service.CaseTemplateService; +import io.github.yedaxia.apidocs.ApiDoc; +import org.apache.ibatis.jdbc.Null; +import org.apache.ibatis.scripting.xmltags.ForEachSqlNode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping(value = "casetemp") +public class CaseTemplateController { + + @Autowired + CaseTemplateService caseTemplateService; + + /** + * @ + * @Author xfh + * @Date 2020/12/14 16:01 + * @Param + * @Return + * @Exception + * + */ + @RequestMapping(value = "selectCaseTemplateAll") + public Map SelectCaseTemplateAll(String name){ + HashMap map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("level","1"); + if(name!=null){ + wrapper.like("name", "%" + name + "%"); + } + List caseTemplates = caseTemplateService.selectList(wrapper); + if(!caseTemplates.isEmpty()){ + for (CaseTemplate caseTemplate : caseTemplates) { + EntityWrapper wrapper1 = new EntityWrapper<>(); + wrapper1.eq("parent_id",caseTemplate.getId()); + List caseTemplates1 = caseTemplateService.selectList(wrapper1); + caseTemplate.setCaseTemplateList(caseTemplates1); + if(!caseTemplates1.isEmpty()){ + for (CaseTemplate casetemplate:caseTemplates1) { + EntityWrapper wrapper2 = new EntityWrapper<>(); + wrapper2.eq("parent_id",casetemplate.getId()); + List caseTemplates2 = caseTemplateService.selectList(wrapper2); + casetemplate.setCaseTemplateList(caseTemplates2); + } + } + } + } + map.put("caseTemplates",caseTemplates); + return map; + } + + /** + * @ + * @Author xfh + * @Date 2020/12/14 16:02 + * @Param + * @Return + * @Exception + * + */ + @RequestMapping(value = "updateCaseTemplate") + public Map UpdateCaseTemplateAll(@RequestBody CaseTemplate caseTemplate){ + HashMap map = new HashMap<>(); + + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.updateById(caseTemplate); + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping(value = "saveCaseTemplate") + public Map saveCaseTemplate(@RequestBody CaseTemplate caseTemplate){ + + HashMap map = new HashMap<>(); + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.insert(caseTemplate); + map.put("id",caseTemplate.getId()); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "deleteCaseTemplateById") + public Map deleteCaseTemplateById(Long id){ + + HashMap map = new HashMap<>(); + try { + if(id!=null){ + boolean result = caseTemplateService.deleteById(id); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "deleteCaseTemplate") + public Map deleteCaseTemplate(@RequestBody CaseTemplate caseTemplate){ + + HashMap map = new HashMap<>(); + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.deleteById(caseTemplate); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "selectCaseTemplateByName") + public Map deleteCaseTemplate(@RequestParam String name){ + + HashMap map = new HashMap<>(); + try { + if(name!=null){ + EntityWrapper wrapper = new EntityWrapper<>(); + List caseTemplateList = caseTemplateService.selectList(wrapper.like("name", "%" + name + "%")); + map.put("caseTemplateList",caseTemplateList); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "MySelectCaseTemplateAll") + public Map MySelectCaseTemplateAll(){ + HashMap map = new HashMap<>(); + List caseTemplates1 = caseTemplateService.selectList(new EntityWrapper<>()); + List collect = caseTemplates1.stream() + .filter(item -> item.getParentId() == 0) + .map(item->{ + item.setCaseTemplateList(getChildrens(item,caseTemplates1)); + return item; + }).collect(Collectors.toList()); + map.put("collect",collect); + return map; + } + public List getChildrens(CaseTemplate caseTemplate,List caseTemplateList){ + + List childrens = caseTemplateList.stream().filter(item -> { + return item.getParentId() == caseTemplate.getId(); + }).map(menu -> { + menu.setCaseTemplateList(getChildrens(menu, caseTemplateList)); + return menu; + }).collect(Collectors.toList()); + return childrens; + } +} diff --git a/backend/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java b/backend/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java new file mode 100644 index 0000000..18030e0 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java @@ -0,0 +1,227 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.entity.TotalClinicalGuidelines; +import com.imurs.service.ClinicalGuidelinesService; +import com.imurs.service.TotalClinicalGuidelinesService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping(value="cgs") +public class ClinicalGuidelinesController { + + @Autowired + ClinicalGuidelinesService clinicalGuidelinesService; + + @Autowired + TotalClinicalGuidelinesService totalClinicalGuidelinesService; + + + /** + * 新增 + */ + @RequestMapping("insertCg") + public Map insertCg(ClinicalGuidelines clinicalGuidelines){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.insert(clinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改 + */ + @RequestMapping("updateCg") + public Map updateCg(ClinicalGuidelines clinicalGuidelines){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.updateById(clinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @RequestMapping("deleteCg") + public Map deleteCg(Long id){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 查看详情 + */ + @RequestMapping("selectCgById") + public Map selectCgById(Long id){ + Map map = new HashMap(); + try { + ClinicalGuidelines cg = clinicalGuidelinesService.selectById(id); + map.put("cg", cg); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示 + */ + @RequestMapping(value="selectGsPage") + public Map selectGsPage(String hospitalId,Integer pageNo,Integer pageSize,String startTime,String endTime,String cgName,String rid){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + + EntityWrapper wrapper2=new EntityWrapper(); + List totalList=new ArrayList(); + page.setRows(pageSize==null?10:pageSize); + page.setPage(pageNo==null?1:pageNo); + + wrapper2.isNotNull("hospital_id").isNotNull("clinical_id"); + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper2.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(startTime)){ + wrapper.ge("upload_date", startTime); + wrapper2.ge("create_time", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("upload_date",dateFormat.format(cal.getTime())); + wrapper2.lt("create_time",dateFormat.format(cal.getTime())); + } + + if(StringUtils.isNotEmpty(cgName)){ + wrapper.like("cg_name", cgName); + } + wrapper.orderBy("upload_date", false); + try { + Page pageList=clinicalGuidelinesService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + totalList=totalClinicalGuidelinesService.selectList(wrapper2); + if(totalList.isEmpty()){ + for (int i = 0; i < customPage.getRows().size(); i++) { + customPage.getRows().get(i).setPviews(0); + } + }else{ + Map result=totalList.stream().collect(Collectors.groupingBy(TotalClinicalGuidelines::getClinicalId,Collectors.counting())); + for (int i = 0; i < customPage.getRows().size(); i++) { + if(result!=null && result.get(customPage.getRows().get(i).getId())!=null){ + customPage.getRows().get(i).setPviews(result.get(customPage.getRows().get(i).getId()).intValue()); + }else{ + customPage.getRows().get(i).setPviews(0); + } + } + } + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看诊疗指南添加查看记录次数 + */ + @RequestMapping("insetTotCgByDocId") + public Map insetTotCgByDocId(TotalClinicalGuidelines totalClinicalGuidelines){ + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("clinical_id", totalClinicalGuidelines.getClinicalId()); + wrapper.eq("doc_id", totalClinicalGuidelines.getDocId()); + TotalClinicalGuidelines totCg = totalClinicalGuidelinesService.selectOne(wrapper); + if(totCg==null){ + Boolean result = totalClinicalGuidelinesService.insert(totalClinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } + map.put("msg", "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 诊疗指南分页显示列表 + @RequestMapping("selectGsPage") + public Map selectGsPage(String startTime,String endTime,String cgName,String docId, + Integer pageNo ,Integer pageSize){ + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + if(StringUtils.isNotEmpty(startTime)){ + map.put("startTime", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + map.put("endTime",endTime); + } + if(StringUtils.isNotEmpty(docId)){ + map.put("docId",docId); + } + + if(StringUtils.isNotEmpty(cgName)){ + map.put("cgName", cgName); + } + Pagetion totalCgList = clinicalGuidelinesService.selectCgsOrByDocIdPage(map, pageNo, pageSize); + map.put("totalCgList", totalCgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("startTime"); + map.remove("endTime"); + map.remove("docId"); + map.remove("cgName"); + } + return map; + }**/ +} diff --git a/backend/src/main/java/com/imurs/controller/CloudImageController.java b/backend/src/main/java/com/imurs/controller/CloudImageController.java new file mode 100644 index 0000000..0bebe35 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/CloudImageController.java @@ -0,0 +1,84 @@ +package com.imurs.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.imurs.sound.ConnUtil; +import com.imurs.util.MD5; +import org.json.JSONObject; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author wdh + */ +@RestController +@RequestMapping("cloud") +public class CloudImageController { + + /** + * 调用易联云影像的接口返回报告数据 + * @param hospitalName 医院名称 + * @param identificationNumber 病人身份证号码 + * @param beginDate 开始时间 + * @param endDate 结束时间 + * @return + */ + @RequestMapping("getreport") + public Map getReport(String hospitalName,String identificationNumber, + String beginDate,String endDate) { + Map map = new HashMap<>(); + String key = "test"; + String sign = MD5.GetMD5Code(MD5.GetMD5Code(hospitalName + identificationNumber + + beginDate + endDate) + key); + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("HospitalName",hospitalName); + jsonObject.put("IdentificationNumber",identificationNumber); + jsonObject.put("BeginDate",beginDate); + jsonObject.put("EndDate",endDate); + jsonObject.put("Key",key); + jsonObject.put("Sign",sign); + + //建立URL连接对象 + URL url = new URL("http://cloud.elincloud.cn:8013/YDService/GetReport"); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("POST"); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + conn.getOutputStream().write(jsonObject.toString().getBytes()); + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容. + String responseContent = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject response = JSON.parseObject(responseContent); + conn.disconnect(); + map.put("response",response); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + + } + + +} diff --git a/backend/src/main/java/com/imurs/controller/DataSummarizationController.java b/backend/src/main/java/com/imurs/controller/DataSummarizationController.java new file mode 100644 index 0000000..917a2cb --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/DataSummarizationController.java @@ -0,0 +1,323 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyCase; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyInformation; +import com.imurs.parameter.DataSummarization; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyInformationService; + +/** + * 数据汇总 + * @author D140 + * + */ +@RestController +@RequestMapping("data") +public class DataSummarizationController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyBModeService applyBModeService; + + + /** + * 基层医院远程会诊汇总表 + */ + @RequestMapping("/basicHospitalData") + public Map basicHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper<>(); + EntityWrapper caseAWrapper=new EntityWrapper(); + EntityWrapper caseBWrapper=new EntityWrapper(); + EntityWrapper conWrapper=new EntityWrapper(); + DataSummarization dataSum=new DataSummarization(); + try { + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + //医院 + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id").where("").eq("id", id); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + dataSum.setId(id); + dataSum.setHospitalName(infor.getHospitalName()); + dataSum.setSetupTime(infor.getSetupTime()); + + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 plan_time + if (StringUtils.isNotEmpty(startTime)) { + caseAWrapper.ge("plan_time",startTime); + caseBWrapper.ge("plan_time",startTime); + conWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + caseAWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + caseBWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + caseAWrapper.in("statu", "4,5,6,7").eq("hospital_id", id); + int typeA=applyCaseService.selectCount(caseAWrapper); + dataSum.setTypeA(typeA); + + caseBWrapper.in("statu", "4,5,6,7").eq("plan_hospital_id", id); + int typeB=applyCaseService.selectCount(caseBWrapper); + dataSum.setTypeB(typeB); + + //视频会诊 status:70 + //LX SP category_hospital_id + conWrapper.eq("status", "70").eq("category_hospital_id",id); + List conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + Map result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCountyLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCountySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + map.clear(); + map.put("dataSum", dataSum); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 白银市人民医院远程会诊汇总表 + */ + @RequestMapping("/cityHospitalData") + public Map cityHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper<>(); + EntityWrapper conWrapper=new EntityWrapper(); + EntityWrapper modeWrapper=new EntityWrapper(); + //EntityWrapper ecgWrapper=new EntityWrapper(); + //EntityWrapper pathologyWrapper=new EntityWrapper(); + DataSummarization dataSum=new DataSummarization(); + try { + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + //医院 + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id").where("").eq("id", id); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + dataSum.setId(id); + dataSum.setHospitalName(infor.getHospitalName()); + dataSum.setSetupTime(infor.getSetupTime()); + + //视频会诊 status:70 LX SP group_hospital_id + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 plan_time + if (StringUtils.isNotEmpty(startTime)) { + conWrapper.ge("group_date",startTime); + modeWrapper.ge("group_date", startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + modeWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + conWrapper.eq("status", "70").eq("group_hospital_id", id); + List conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + Map result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCityLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCitySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + + //远程b超 远程病理 state:1:b超 2:病理 状态70 已结束 group_hospital_id + modeWrapper.eq("status", "70").eq("group_hospital_id", id); + List bModeList=applyBModeService.selectList(modeWrapper); + if(!bModeList.isEmpty()){ + Map result=bModeList.stream().collect(Collectors.groupingBy(ApplyBMode::getState,Collectors.counting())); + dataSum.setBmode(result.get(1)!=null?result.get(1).intValue():0); + dataSum.setBl(result.get(2)!=null?result.get(2).intValue():0); + } + //远程心电 + //ecgWrapper.eq("status", "70").eq("group_hospital_id", id); + //dataSum.setEcg(applyEcgService.selectCount(ecgWrapper)); + + //远程影像 + //pathologyWrapper.eq("status", "70").eq("group_hospital_id", id); + //dataSum.setShadow(applyPathologyService.selectCount(pathologyWrapper)); + + map.clear(); + map.put("dataSum", dataSum); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 靖远县人民医院远程会诊汇总表 + */ + @RequestMapping("/adminHospitalData") + public Map adminHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + List conList=new ArrayList(); + List dataSumList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper<>(); + String acount; + Map result=null; + try { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id,rid").where(""); + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + wrapper.eq("id", id); + } + wrapper.orderBy("FIELD(rid,9,1),setupTime",false); + List inforList=applyInformationService.selectList(wrapper); + if(!inforList.isEmpty()){ + for (int i = 0; i < inforList.size(); i++) { + DataSummarization dataSum=new DataSummarization(); + acount=inforList.get(i).getId(); + dataSum.setHospitalName(inforList.get(i).getHospitalName()); + dataSum.setId(acount); + dataSum.setSetupTime(inforList.get(i).getSetupTime()); + + if(inforList.get(i).getRid().intValue()!=1 && inforList.get(i).getRid().intValue()!=9){ + EntityWrapper caseAWrapper=new EntityWrapper(); + EntityWrapper caseBWrapper=new EntityWrapper(); + EntityWrapper conWrapper=new EntityWrapper(); + + if (StringUtils.isNotEmpty(startTime)) { + caseAWrapper.ge("plan_time",startTime); + caseBWrapper.ge("plan_time",startTime); + conWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + caseAWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + caseBWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 + caseAWrapper.in("statu", "4,5,6,7").eq("hospital_id", acount); + dataSum.setTypeA(applyCaseService.selectCount(caseAWrapper)); + + caseBWrapper.in("statu", "4,5,6,7").eq("plan_hospital_id", acount); + dataSum.setTypeB(applyCaseService.selectCount(caseBWrapper)); + + //离线/视频会诊 基层到县医院(靖远县) + conWrapper.eq("status", "70").eq("category_hospital_id", acount); + conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCountyLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCountySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + dataSumList.add(dataSum); + + //市级医院 + }else if(inforList.get(i).getRid().intValue()==9){ +// EntityWrapper ecgWrapper=new EntityWrapper(); +// EntityWrapper pathologyWrapper=new EntityWrapper(); + EntityWrapper consWrapper=new EntityWrapper(); + EntityWrapper modeWrapper=new EntityWrapper(); + if (StringUtils.isNotEmpty(startTime)) { + modeWrapper.ge("group_date",startTime); + consWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + consWrapper.lt("group_date",dateFormat.format(cal.getTime())); + modeWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } +// //视频会诊 status:70 LX SP group_hospital_id + consWrapper.eq("status", "70").eq("group_hospital_id", acount); + conList=applyConsultationService.selectList(consWrapper); + if(!conList.isEmpty()){ + result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCityLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCitySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + + //远程b超 远程病理 state:1:b超 2:病理 状态70 已结束 group_hospital_id + modeWrapper.eq("status", "70").eq("group_hospital_id", acount); + List bModeList=applyBModeService.selectList(modeWrapper); + + if(!bModeList.isEmpty()){ + Map result2=bModeList.stream().collect(Collectors.groupingBy(ApplyBMode::getState,Collectors.counting())); + dataSum.setBmode(result2.get(1)!=null?result2.get(1).intValue():0); + dataSum.setBl(result2.get(2)!=null?result2.get(2).intValue():0); + } + dataSumList.add(dataSum); +// //远程心电 +// ecgWrapper.eq("status", "70").eq("group_hospital_id", acount); +// dataSum.setEcg(applyEcgService.selectCount(ecgWrapper)); +// +// //远程影像 +// pathologyWrapper.eq("status", "70").eq("group_hospital_id", acount); +// dataSum.setShadow(applyPathologyService.selectCount(pathologyWrapper)); +// + + //靖远医院数据汇总 + }else if(inforList.get(i).getRid().intValue()==1){ + dataSum.setTypeA(dataSumList.stream().mapToInt(DataSummarization::getTypeA).sum()); + dataSum.setTypeB(dataSumList.stream().mapToInt(DataSummarization::getTypeB).sum()); + dataSum.setCountyLX(dataSumList.stream().mapToInt(DataSummarization::getCountyLX).sum()); + dataSum.setCountySP(dataSumList.stream().mapToInt(DataSummarization::getCountySP).sum()); + dataSum.setCityLX(dataSumList.stream().mapToInt(DataSummarization::getCityLX).sum()); + dataSum.setCitySP(dataSumList.stream().mapToInt(DataSummarization::getCitySP).sum()); + dataSum.setBmode(dataSumList.stream().mapToInt(DataSummarization::getBmode).sum()); + dataSum.setBl(dataSumList.stream().mapToInt(DataSummarization::getBl).sum()); + //dataSum.setEcg(dataSumList.stream().mapToInt(DataSummarization::getEcg).sum()); + //dataSum.setShadow(dataSumList.stream().mapToInt(DataSummarization::getShadow).sum()); + dataSum.setEcg(0); + dataSum.setShadow(0); + dataSumList.add(dataSum); + } + } + //靖远医院数据汇总 + map.clear(); + map.put("dataSum", dataSumList); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/DoctorArrangeController.java b/backend/src/main/java/com/imurs/controller/DoctorArrangeController.java new file mode 100644 index 0000000..24b49c2 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/DoctorArrangeController.java @@ -0,0 +1,281 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.ImgArrange; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.ImgArrangeService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 医生下乡排班控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "arrange") +public class DoctorArrangeController { + + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + ImgArrangeService imgArrangeService; + + + + /** + * 新增医生下乡排班 + * + * @return + */ + @RequestMapping(value = "insertArrange") + public Map insertArrange(DoctorArrange doctorArrange) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.insert(doctorArrange); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改医生下乡排班 + * + * @return + */ + @Transactional + @RequestMapping(value = "updateArrangeById") + public Map updateArrangeById(@RequestBody List adList) { + Map map = new HashMap(); + try { + if (!adList.isEmpty()) { + boolean result = doctorArrangeService.updateById(adList.get(0)); + if (result == true && !adList.get(0).getIaList().isEmpty()) { + Long id = adList.get(0).getId(); + map.put("msg", "1"); + for (int i = 0; i < adList.get(0).getIaList().size(); i++) { + adList.get(0).getIaList().get(i).setArrangeId(id); + imgArrangeService.insert(adList.get(0).getIaList().get(i)); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改医生下乡排班 + * + * @return + */ + @RequestMapping(value = "updateArrange") + public Map updateArrange(DoctorArrange doctorArrange) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.updateById(doctorArrange); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除医生下乡排班 + * + * @return + */ + @Transactional + @RequestMapping(value = "deleteArrange") + public Map deleteArrange(Long id) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.deleteById(id); + if(result == true){ + map.put("arrange_id", id); + imgArrangeService.deleteByMap(map); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看医生排班详情(关联查询) + */ + @RequestMapping(value = "selectArrangeById") + public Map selectArrangeById(Long id) { + Map map = new HashMap(); + try { + DoctorArrange arange = doctorArrangeService.selectArrangeByUser(id); + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看医生排班详情及工作照(关联查询) + */ + @RequestMapping(value = "selectArrangeByImg") + public Map selectArrangeByImg(Long id) { + Map map = new HashMap(); + map.put("arrange_id", id); + map.put("type", "B"); + try { + DoctorArrange arange = doctorArrangeService.selectArrangeByUser(id); + if(arange!=null){ + List iaList=imgArrangeService.selectByMap(map); + map.put("iaList", iaList); + } + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("arrange_id"); + map.remove("type"); + } + return map; + } + + + /** + * 查看医生排班详情及工作照(非关联查询) + */ + @RequestMapping(value = "selectArrangeImg") + public Map selectArrangeImg(Long id) { + Map map = new HashMap(); + map.put("arrange_id", id); + map.put("type", "B"); + try { + DoctorArrange arange = doctorArrangeService.selectById(id); + if(arange!=null){ + List iaList=imgArrangeService.selectByMap(map); + map.put("iaList", iaList); + } + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("arrange_id"); + map.remove("type"); + } + return map; + } + + + /** + * 医生排班列表分页显示 + */ + @RequestMapping(value = "selectArrangePage") + public Map selectArrangePage(Integer pageNo, Integer pageSize, String startTime,String endTime, + String receiveHospitalId, String doctorName, String status) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + page.setRows(pageSize == null ? 6 : pageSize); + page.setPage(pageNo == null ? 1 : pageNo); + + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("status", status).eq("receive_hospital_id", receiveHospitalId); + if (StringUtils.isNotEmpty(doctorName)) { + wrapper.like("doctor_name", doctorName); + } + try { + if (StringUtils.isNotEmpty(startTime)) { + wrapper.ge("start_time",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("end_time",dateFormat.format(cal.getTime())); + } + wrapper.orderBy("start_time", false); + Page pageList = doctorArrangeService.selectPage(page.getPagePlusTwo(), wrapper); + if (pageList == null) { + map.put("msg", "3"); + } else { + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医生排班列表分页显示 关联查询 + */ + @RequestMapping(value = "selectArrangeByPage") + public Map selectArrangeByPage(Integer pageNo, Integer pageSize, String startTime,String endTime, + String receiveHospitalId, String status, Long docId) { + Map map = new HashMap(); + + pageSize = pageSize == null ? 10 : pageSize; + pageNo = pageNo == null ? 1 : pageNo; + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("status", status); + map.put("receiveHospitalId", receiveHospitalId); + if (docId != null) { + map.put("docId", docId); + } + try { + Pagetion pageList = doctorArrangeService.selectByArrangePage(map, pageNo, pageSize); + map.put("customPage", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("status"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("receiveHospitalId"); + map.remove("docId"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/DoctorGroupController.java b/backend/src/main/java/com/imurs/controller/DoctorGroupController.java new file mode 100644 index 0000000..e6c48aa --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/DoctorGroupController.java @@ -0,0 +1,228 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.DoctorGroup; +import com.imurs.entity.User; +import com.imurs.service.DoctorGroupService; +import com.imurs.service.UserService; +import com.imurs.util.LetterIncrementor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/doctorGroup") +public class DoctorGroupController { + @Autowired + DoctorGroupService doctorGroupService; + + @Autowired + UserService userService; + + //增加医生组 + @RequestMapping("/insertDoctorGroup") + public Map insertDoctorGroup(@RequestBody DoctorGroup doctorGroup) { + HashMap map = new HashMap<>(); + try { + //判断添加的组名是否已存在 + if (doctorGroup.getGroupName() != null && doctorGroup.getGroupAlias() != null) { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.eq("group_name", doctorGroup.getGroupName()); + DoctorGroup doctorGroupName = doctorGroupService.selectOne(doctorGroupEntityWrapper); + if (doctorGroupName != null) { + map.put("msg", "5"); + map.put("errorInfo", "组名已存在"); + return map; + } + EntityWrapper doctorGroupEntityWrapper1 = new EntityWrapper<>(); + doctorGroupEntityWrapper1.eq("group_alias", doctorGroup.getGroupAlias()); + DoctorGroup doctorGroupAlias = doctorGroupService.selectOne(doctorGroupEntityWrapper1); + if (doctorGroupAlias != null) { + map.put("msg", "5"); + map.put("errorInfo", "组别名已存在"); + return map; + } + } + //查询最新一条组消息的组别名 + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.orderBy( "create_time", false); + DoctorGroup doctorGroupBestNew = doctorGroupService.selectOne(doctorGroupEntityWrapper); + //如果查询结果为空 + String groupAliasBestNew = null; + if (doctorGroupBestNew != null) { + groupAliasBestNew = doctorGroupBestNew.getGroupAlias(); + } + System.out.println("groupAliasBestNew=" + groupAliasBestNew); + String next = LetterIncrementor.getNext(groupAliasBestNew, 10); + doctorGroup.setGroupAlias(next); + boolean insert = doctorGroupService.insert(doctorGroup); + map.put("msg", insert ? "1" : "2"); + map.put("result", doctorGroup.getId()); + + + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + + //模糊查询全部医生组 + @RequestMapping("/selectDoctorGroup") + //groupName可以为不传项 + public Map selectDoctorGroup(@RequestParam(required = false) String groupName) { + HashMap map = new HashMap<>(); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + + doctorGroupEntityWrapper.eq("status", "1"); + + if (groupName != null) { + doctorGroupEntityWrapper.like("group_name", groupName); + map.put("result", doctorGroupService.selectList(doctorGroupEntityWrapper)); + map.put("msg", "1"); + } else { + map.put("result", doctorGroupService.selectList(doctorGroupEntityWrapper)); + map.put("msg", "1"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + //分页查询全部医生组 + @RequestMapping("/selectDoctorGroupPage") + public Map selectDoctorGroupPage(@RequestParam String groupName, @RequestParam Integer pageNo, @RequestParam Integer pageSize) { + HashMap map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + + Page page = new Page<>(pageNo, pageSize); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + if (groupName != null) { + doctorGroupEntityWrapper.like("group_name", groupName); + map.put("result", doctorGroupService.selectPage(page,doctorGroupEntityWrapper)); + map.put("msg", "1"); + } else { + map.put("result", doctorGroupService.selectPage(page,doctorGroupEntityWrapper)); + map.put("msg", "1"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + + + //删除医生组并删除组内医生 + @Transactional + @RequestMapping("/deleteDoctorGroup/{id}") + public Map deleteDoctorGroup(@PathVariable Long id) { + HashMap map = new HashMap<>(); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.eq("id", id); + DoctorGroup doctorGroup = doctorGroupService.selectOne(doctorGroupEntityWrapper); + if (doctorGroup != null) { + EntityWrapper userEntityWrapper = new EntityWrapper<>(); + userEntityWrapper.eq("group_alias", doctorGroup.getGroupAlias()); + List users = userService.selectList(userEntityWrapper); + if (users != null && !users.isEmpty()) { + for (User user : users) { + //将用户组别名置空 + user.setGroupAlias(""); + } + userService.updateBatchById(users); + } + + boolean result = doctorGroupService.deleteById(id); + map.put("msg", result ? "1" : "2"); + map.put("result", result ? "删除成功" : "删除失败"); + } else { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + // 修改医生组 + @RequestMapping("/updateDoctorGroup") + public Map updateDoctorGroup(@RequestBody DoctorGroup doctorGroup) { + HashMap map = new HashMap<>(); + + try { + if (doctorGroup == null || doctorGroup.getId() == null) { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + return map; + } + + // 1. 先查询出原始的医生组信息 + DoctorGroup originalGroup = doctorGroupService.selectById(doctorGroup.getId()); + if (originalGroup == null) { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + return map; + } + + // 2. 检查组名是否重复(排除当前记录) + // 只有当组名真正发生变化时才检查重复 + if (!originalGroup.getGroupName().equals(doctorGroup.getGroupName())) { + EntityWrapper nameWrapper = new EntityWrapper<>(); + nameWrapper.eq("group_name", doctorGroup.getGroupName()) + .ne("id", doctorGroup.getId()); // 排除当前记录 + + DoctorGroup existByName = doctorGroupService.selectOne(nameWrapper); + if (existByName != null) { + map.put("msg", "5"); + map.put("errorInfo", "组名重复"); + return map; + } + } + + // 3. 检查组别名是否重复(排除当前记录) + // 只有当组别名真正发生变化时才检查重复 + if (!originalGroup.getGroupAlias().equals(doctorGroup.getGroupAlias())) { + EntityWrapper aliasWrapper = new EntityWrapper<>(); + aliasWrapper.eq("group_alias", doctorGroup.getGroupAlias()) + .ne("id", doctorGroup.getId()); // 排除当前记录 + + DoctorGroup existByAlias = doctorGroupService.selectOne(aliasWrapper); + if (existByAlias != null) { + map.put("msg", "5"); + map.put("errorInfo", "组别名重复"); + return map; + } + } + + // 4. 执行更新 + boolean update = doctorGroupService.updateById(doctorGroup); + map.put("msg", update ? "1" : "2"); + map.put("result", update ? "修改成功" : "修改失败"); + + } catch (Exception e) { + map.put("msg", "4"); + map.put("errorInfo", "系统错误: " + e.getMessage()); + // 或者记录日志 + // log.error("修改医生组失败", e); + } + + return map; + } + + + +} diff --git a/backend/src/main/java/com/imurs/controller/DualReferral_His.java b/backend/src/main/java/com/imurs/controller/DualReferral_His.java new file mode 100644 index 0000000..cdd5159 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/DualReferral_His.java @@ -0,0 +1,277 @@ +/*package com.imurs.controller; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.jdom.JDOMException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.entity.User; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.UserService; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +@Component +public class DualReferral_His { + @Autowired + private ApplyCaseService applyCaseService; + @Autowired + private UserService userService; + @Autowired + public static DualReferral_His dualReferral_His; + @PostConstruct + public void init(){ + dualReferral_His = this; + dualReferral_His.applyCaseService=this.applyCaseService; + dualReferral_His.userService=this.userService; + } + public static String translate(String FeeDate ) throws Exception { + //地址 + String urlString = "http://220.168.26.57:1001/Service.asmx"; + //方法 + String soapActionString = "http://cardtest.com/GetInterconnect"; + URL url = new URL(urlString); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + String soap = "\n" + + "\n" + + " \n" + + " \n" + + " "+ + ""+FeeDate+"]]> \n"+ + " \n" + + " \n" + + ""; + byte[] buf = soap.getBytes(); + System.out.println(soap); + //设置一些头参数 + httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length)); + httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); + httpConn.setRequestProperty("soapActionString", soapActionString); + httpConn.setRequestMethod("POST"); + //输入参数和输出结果 + + OutputStream out = null; + try{ + httpConn.setConnectTimeout(30000); + httpConn.setReadTimeout(30000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + httpConn.setDoOutput(true); + httpConn.setDoInput(true); + out = httpConn.getOutputStream(); + out.write(buf); + out.close(); + }catch (Exception e){ + DualReferral_His.sendErrorNotice("15602395710", FeeDate+"建立连接,不成功,数据未接受成功"); + } + //获取网站状态码200 + int responseCode = httpConn.getResponseCode(); + String responseMsg = httpConn.getResponseMessage(); + if(responseCode!=200){ + //说明网络异常需要重新请求 + //throw new Exception("msg"); + return "4004";//网络异常,再次请求发送 + } + byte[] datas = readInputStream(httpConn.getInputStream()); + String result = new String(datas); + // System.out.println("result:" + result); + String result2= strToHtml(result); + System.out.println("解析后的结果"+result2); + String IsUpdate= splitXml(result2,FeeDate); + return IsUpdate; + } + + *//** + * 从输入流中读取数据 + * + * @param inStream + * @return + * @throws Exception + *//* + public static byte[] readInputStream(InputStream inStream) throws Exception { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + byte[] data = outStream.toByteArray(); + outStream.close(); + inStream.close(); + return data; + } + public static String splitXml(String s,String date) throws Exception{ + String reg = "<\\?xml\\s+version=\"1.0\"\\s+encoding=\"(.*?)\"\\?>"; + String result = s.replaceAll(reg,""); + List> list = new ArrayList>(); + + String[] esg = parxml2(result); + //需要正则匹配去除字段才可以 + //按^切割得到每个患者身份 + if(!esg[0].equals("0")){ + //发送短信信息查询吧 + // return "返回结果代码失误"; + + sendErrorNotice("15602395710","日期"+date+":"+esg[1]); + // throw new Exception("返回结果代码错误"); + return "返回结果代码错误"; + } + if(esg[1].isEmpty()){ + //throw new Exception("没有返回参数,无更新状态"); + return "没有返回参数,无更新状态"; + } + String[] s2 = esg[1].split("\\^"); + for(int i =0;i map = new HashMap(); + //对其按|切割 + String[] s3=s2[i].split("\\|"); + map.put("pt_card", s3[0]);//身份证号 + map.put("inpatient", s3[1]);//住院号 + map.put("statu", s3[2]);//状态 + map.put("ID", s3[3]);//这个是患者ID值,为了区分患者在同家医院多次双向转诊的 + if(s3.length>4){ + map.put("plan_time", s3[4]);//返回就诊日期 + } + list.add(map); + + } + //System.out.println(list); + //对此数据模板进行发送 + //状态 1:已申请审批 2:已住院 3:已就诊 + // + Boolean Istrue =null; + for(int i =0;i map2 = new HashMap(); + map2.put("id", list.get(i).get("ID"));//唯一值 + //map2.put("status", list.get(i).get("statu")==null?0:list.get(i).get("statu"));//状态 为1的要进行更新吗 + map2.put("inpatient", list.get(i).get("inpatient"));//住院号 + map2.put("consultation_time", list.get(i).get("plan_time"));//实际日期,不是转诊日期 + map2.put("pt_card", list.get(i).get("pt_card"));//身份证号 + //user 表里查询基层医生手机号 + Long id= Long.parseLong(list.get(i).get("ID").toString());//(Long) list.get(i).get("ID"); + //System.out.println("id "+id);//申请医生IO + Map user = dualReferral_His.userService.selectByappuserID(id);//患者主健关联查询医生ID + String doctorname = user.get("user_name")==null?"":user.get("user_name").toString(); + String doctorphone = user.get("phone")==null?"":user.get("phone").toString();//pt_name + String patientname = user.get("pt_name")==null?"":user.get("pt_name").toString(); + if(list.get(i).get("statu").equals("1")){ + + } + if(list.get(i).get("statu")==null){ + map2.put("statu", "0");//处理null值 + } + if(list.get(i).get("statu")!=null&&list.get(i).get("statu").equals("2")){ + // System.out.println("身份证号为:"+list.get(i).get("pt_card")+"已住院"+list.get(i).get("statu")); + //对应着statu 6,查询基层医生手机号,根据它返回的主健值ID去查的 + map2.put("statu", "6"); + Istrue =dualReferral_His.applyCaseService.updateByHis(map2); + sendNotice(doctorphone,doctorname,patientname);//先不发短信 + } + if(list.get(i).get("statu")!=null&&list.get(i).get("statu").equals("3")){ + // System.out.println("身份证号为:"+list.get(i).get("pt_card")+"已就诊"+list.get(i).get("statu")); + //对应着statu 5 + map2.put("statu", "5"); + Istrue =dualReferral_His.applyCaseService.updateByHis(map2); + sendNotice(doctorphone,doctorname,patientname); + } + //保存患者得住院号和状态,数据库里。如果发送短信失败,还要保存数据吗? + //Istrue =dualReferral_His.applyCaseService.updateByHis(map2);//更新状态是否成功 + + } + return Istrue==true?"1":"0"; + } + public static String strToHtml(String s) + { + if (s==null||s.equals("")) return ""; + s = s.replaceAll("&","&"); + s = s.replaceAll("<","<"); + s = s.replaceAll(">",">"); + s = s.replaceAll(" "," "); + return s; + } + //解析XML格式 + public static String[] parxml2(String xml) throws JDOMException, IOException, DocumentException{ + + String[] paresu =new String[2]; + // 1.创建SAXReader的对象reader + SAXReader reader = new SAXReader(); + // 2.通过reader对象的read()方法加载books.xml文件,获取document对象 + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + // 3.通过document对象获取根节点bookstore + Element root = document.getRootElement(); + Element out = + document.getRootElement().element("Body").element("GetInterconnectResponse").element("GetInterconnectResult").element("Response"); + //取2个数据.element("ErrorMsg") + Element out2 = out.element("ErrorMsg"); + Element out3 = out.element("ResultCode"); + System.out.println("return 解析ErrorMsg:"+out2.getText()); + System.out.println("return 解析ResultCode:"+out3.getText()); + paresu[0]=out3.getText(); + paresu[1]=out2.getText(); + return paresu; + } + public static Map sendNotice(String phone,String applydoctor,String patientname){ + + Map resultMap=new HashMap(); + Map map=new HashMap(); + //不如将患者ID保存下来 + map.put("account","N9903806"); + map.put("password","9nr02dhiK"); + map.put("msg",applydoctor+"医生,您好!您转诊的"+patientname+"患者已经如期就诊,请尽快为患者办理医保结算手续。"); + // User userApplyPhone = userService.selectById(applyUserId); + map.put("phone",phone); + String res = ChuangLanSmsUtil.sendSmsByPost("http://smssh1.253.com/msg/send/json",JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if(!jsStr.getString("code").equals("0")){ + resultMap.put("msg", "发送失败"); + return resultMap; + } + resultMap.put("msg", "发送成功"); + return resultMap; + + } + public static Map sendErrorNotice(String phone,String errormsg){ + + Map resultMap=new HashMap(); + Map map=new HashMap(); + //不如将患者ID保存下来 + map.put("account","N9903806"); + map.put("password","9nr02dhiK"); + map.put("msg","开发者,您好!长沙市第一医院DualReferral_His接口报错,错误信息"+errormsg+"请及时处理"); + // User userApplyPhone = userService.selectById(applyUserId); + map.put("phone",phone); + String res = ChuangLanSmsUtil.sendSmsByPost("http://smssh1.253.com/msg/send/json",JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if(!jsStr.getString("code").equals("0")){ + resultMap.put("msg", "发送失败"); + return resultMap; + } + resultMap.put("msg", "发送成功"); + return resultMap; + +} + +} +*/ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/controller/DualReferraltime.java b/backend/src/main/java/com/imurs/controller/DualReferraltime.java new file mode 100644 index 0000000..5cb4009 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/DualReferraltime.java @@ -0,0 +1,77 @@ +/*package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@EnableAsync +public class DualReferraltime { + static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");// + static String date =df.format(new Date()); + static boolean IsRun =false; + @Async + @Scheduled(cron = "0 30 07 * * ?")//暂时不启动定时器 + public void autoDividend() throws Exception { + + 建立2个并发任务不会互相影响,即使一个报错,另外一个也会执行,并取30分钟间隔,用同一变量 + if(!responsecode.equals("4004")){ + //没有网络异常直接结束语句 + return ""; + } + // new DualReferral_His().translate("20181223"); + String s =""+ + ""+ + ""+ + ""+ + "0"+ + "430104196210101036|ZY010000705565|3|58|20190125"+ + ""; + try { + Calendar cal=Calendar.getInstance(); + cal.add(Calendar.DATE,-1); + Date time1=cal.getTime(); + String date= new SimpleDateFormat("yyyyMMdd").format(time1); + // System.out.println("=2==>"); + // String msg= DualReferral_His.translate(date); + IsRun=true; + System.out.println(); + } catch (Exception e) { + e.printStackTrace(); + + } + + + } + @Async + @Scheduled(cron = "0 45 07 * * ?") + public void autoDividend2() throws Exception { + //得到当天日期格式为yymmdd + // System.out.println("===========2=>"); + String date=null; + try { + Calendar cal=Calendar.getInstance(); + cal.add(Calendar.DATE,-1); + Date time1=cal.getTime(); + date= new SimpleDateFormat("yyyyMMdd").format(time1); + if(IsRun==false){ + System.out.println("=2==>"); + String msg= DualReferral_His.translate(date); + } + + } catch (Exception e) { + e.printStackTrace(); + //发送短信 报告异常, + DualReferral_His.sendErrorNotice("15602395710", date+"定时查询任务失败"); + } + finally{ + IsRun = false; + } + } +} +*/ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/controller/EsController.java b/backend/src/main/java/com/imurs/controller/EsController.java new file mode 100644 index 0000000..4297ca1 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/EsController.java @@ -0,0 +1,27 @@ +package com.imurs.controller; + +import com.imurs.entity.BMDReportInfo; +import com.imurs.util.EsUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Controller +@RestController +@RequestMapping("es") +@ConditionalOnProperty(name = "es.enabled", havingValue = "true") +public class EsController { + + @Autowired + EsUtils esUtils; + + @RequestMapping("findAll") + public List findAll(){ + return esUtils.findAll(); + } + +} diff --git a/backend/src/main/java/com/imurs/controller/GeneralpractController.java b/backend/src/main/java/com/imurs/controller/GeneralpractController.java new file mode 100644 index 0000000..79ebed3 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/GeneralpractController.java @@ -0,0 +1,577 @@ +package com.imurs.controller; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BinaryOperator; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.imurs.entity.InoneagentBlood; +import com.imurs.entity.InoneagentEcg; +import com.imurs.entity.InoneagentPersion; +import com.imurs.entity.InoneagentUrine; +import com.imurs.parameter.AllinoneApi; +import com.imurs.sound.ConnUtil; +import com.imurs.util.MD5; + +@RestController +@RequestMapping(value="AllinOne") +public class GeneralpractController { + +/* public static void main(String[] args) throws Exception { + // TODO Auto-generated method stub + //InoneagentBlood f =bp("3","120106197006083031"); + //System.out.println(f); + //基本信息获取 + //InoneagentPersion in =inoneBasic("3","120106197006083031"); + //System.out.println("设置"+in.toString()); + //InoneagentEcg ec= inoneEcg("120106197006083031"); + //System.out.println(ec.toString()); + //InoneagentBlood bloodpressure + //InoneagentUrine iu=inoneUrine("120106197006083031"); + //System.out.println(iu.toString()); + + }*/ + //基本信息id 1,基本信息,2,体温,3,身高 + @RequestMapping(value ="InoneInfo",method = RequestMethod.POST) + public InoneagentPersion InoneagentInfo(String card,String id) throws Exception { + InoneagentPersion in=inoneBasic(id,card); + if(in.getSex()!=null){ + String sex=in.getSex(); + switch (sex){ + case "0": + in.setSex("未知的性别"); + break; + case "1": + in.setSex("男"); + break; + case "2": + in.setSex("女"); + break; + default : + in.setSex("未说明的性别"); + } + + + + } + + return in; + + } + //id 1,血压 2,血氧,3,血糖 + @RequestMapping(value ="InoneageBloodInfo",method = RequestMethod.POST) + public InoneagentBlood InoneagentBloodInfo(String card,String id) throws Exception { + InoneagentBlood IB= bp(id,card); + if(IB.getExamtype()!=null){ + + String s= IB.getExamtype().equals("0")==true?"餐前":"餐后"; + IB.setExamtype(s); + + } + + + return IB; + + } + //心电InoneagentEcg ec= inoneEcg + @RequestMapping(value ="InoneageEcgInfo",method = RequestMethod.POST) + public Map InoneageEcgInfo(String card) throws Exception { + InoneagentEcg IB= inoneEcg(card); + Map map = new HashMap(); + List> list = null; + if(IB.getFilename()!=null&&!IB.getFilename().isEmpty()){ + //文件路径不为空 , + try{ + String urlpath="https://d.xzhealth.cn//"+IB.getFilename(); + String xml=drawEcg(urlpath); + list= parECGxml(xml); + }catch(Exception e){ + map.put("msg", "解析异常或无波形数据"); + } + } + map.put("list", list==null?"":list); + map.put("IB", IB); + return map; + + } + // + @RequestMapping(value ="InoneageEcgDate",method = RequestMethod.POST) + public Map InoneageEcgDate(String card) throws Exception { + //InoneagentEcg IB= inoneEcg(card); + Map map = new HashMap(); + //当心电路径不为空 时,解析心电数据 + List> list = null; + if(card!=null&&!card.isEmpty()){ + //true 表示路径存在值 + String urlpath="https://d.xzhealth.cn//"+card; + String xml=drawEcg(urlpath); + list= parECGxml(xml); + } + //map.put("Ecgbasic", IB); + map.put("list", list); + return map; + + } + //尿常规 + @RequestMapping(value ="InoneageUrineInfo",method = RequestMethod.POST) + public InoneagentUrine InoneageurineInfo(String card) throws Exception { + InoneagentUrine IB= inoneUrine(card); + return IB; + + } + //尿常规 + private InoneagentUrine inoneUrine(String IDcard) throws Exception{ + InoneagentUrine InU = new InoneagentUrine(); + String url = AllinoneApi.URINE_API; + JSONArray json=comon(url); + if(null==json){ + return InU ; + }else{ + InU= InonebasicUrine(json,IDcard); + return InU; + } + + + } + //尿常规 + private InoneagentUrine InonebasicUrine(JSONArray json, String iDcard) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + for(int i=0;i byHeight= Comparator.comparing(InoneagentUrine::getExamtime); + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + InoneagentUrine res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + //心电 + private InoneagentEcg inoneEcg(String IDcard) throws Exception{ + InoneagentEcg Ine = new InoneagentEcg(); + String url=AllinoneApi.ECG_API; + JSONArray json=comon(url); + if(null==json){ + return Ine ; + }else{ + //String IDcard ="440582199203026695"; + Ine= InonebasicEcg(json,IDcard); + // System.out.println(f); + return Ine; + } + + + + } + private InoneagentEcg InonebasicEcg(JSONArray json, String iDcard) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + for(int i=0;i byHeight= Comparator.comparing(InoneagentEcg::getExamtime); + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).filter(IB->!IB.getHr().equals("0")).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + // InoneagentEcg res= fbp.get(); + InoneagentEcg res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + // 居民健康信息,体温,身高体重 + private InoneagentPersion inoneBasic(String grade,String IDcard) throws Exception{ + //String grade="1"; + InoneagentPersion Inp = new InoneagentPersion(); + String url=null; + if(grade==null){ + throw new Exception("类型不匹配"); + } + switch(grade){ + case "1": + url=AllinoneApi.PERSON_API; + break; + case "2": + url=AllinoneApi.TEMPERATIURE_API; + break; + case "3": + url=AllinoneApi.HEIGHTWEI_API; + break; + default : + throw new Exception("类型不匹配"); + // return Inp; + } + JSONArray json=comon(url); + + if(null==json){ + return Inp ; + }else{ + //String IDcard ="440582199203026695"; + Inp= Inonebasicdate(json,IDcard,grade); + // System.out.println(f); + return Inp; + } + + } + private InoneagentPersion Inonebasicdate(JSONArray json, String iDcard, String grade) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight=null; + if("1".equals(grade)){ + byHeight = Comparator.comparing(InoneagentPersion::getArchivedate); + }else if("2".equals(grade)){ + //System.out.println("wwe"); + byHeight = Comparator.comparing(InoneagentPersion::getTepExamtime); + }else if("3".equals(grade)){ + byHeight = Comparator.comparing(InoneagentPersion::getHwExamtime); + }else{ + throw new Exception("grade 为非指定的类型"); + } + + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + // InoneagentPersion res= fbp.get(); + // Optional os= Optional.ofNullable(fbp.get()); + InoneagentPersion res=null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + + } + private InoneagentBlood bp(String grade,String IDcard) throws Exception{ + //String grade="1"; + InoneagentBlood f = new InoneagentBlood(); + String url=null; + if(grade==null){ + throw new Exception("未指定类型"); + } + switch(grade){ + case "1": + url=AllinoneApi.BLOODP_API; + break; + case "2": + url=AllinoneApi.BLOODOXY_API; + break; + case "3": + url=AllinoneApi.BLOODGLUC_API; + break; + default : + throw new Exception("类型不匹配"); + + } + JSONArray json=comon(url); + + if(null==json){ + return f ; + }else{ + //String IDcard ="440582199203026695"; + f= blood(json,IDcard,grade); + // System.out.println(f); + return f; + } + + } + + private JSONArray comon(String durl) throws Exception, Exception{ + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(durl);///inoneagent/bloodoxygen + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + String ap1 = "b9e34120-7c02-4d96-8825-37f5ae5bcc9c";//这个是机器设备密钥 + String key1 ="9410b975-9f33-44b3-8b19-00fe189191c5";//需要厂家提供 + // String URL ="https://d.xzhealth.cn"; + // String ap=MD5.GetMD5Code(ap1); + String key =MD5.GetMD5Code(key1); + JSONObject params = new JSONObject(); + params.put("ap", ap1); + params.put("sig", key); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + // System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + String sucess=jsonObject.get("success").toString(); + JSONArray json = null; + if(sucess.equals("0")){ + json = JSONArray.parseArray(jsonObject.get("datas").toString()); + } + + return json; + } + //处理数据过程 //血压 + /*public static InoneagentBlood bloodpressure(JSONArray json,String IDcard) throws Exception{ + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight = Comparator.comparing(InoneagentBlood::getPressureExamtime); + Optional fbp= BpStreamList.stream().filter(BP->BP.getIdnumber().equals(IDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + //下面的为根据检查部位不同 选择各自的最新日期 + Map> li2= BpStreamList.stream().filter(BP->BP.getIDNumber().equals("120106197006083031")).collect(Collectors.groupingBy(BP::getExamType, + Collectors.reducing(BinaryOperator.maxBy(byHeight)))); + Collection> cb= li2.values(); + Iterator> ib= cb.iterator(); + while(ib.hasNext()){ + Optional obp= ib.next(); + fresult.add(obp.get()); + } + InoneagentBlood res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + //InoneagentBlood res= fbp.get(); + return res; + }*/ + private InoneagentBlood blood(JSONArray json,String IDcard,String id) throws Exception{ + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight =null; + if(id.equals("1")){ + byHeight = Comparator.comparing(InoneagentBlood::getPressureExamtime); + } + else if(id.equals("2")){ + byHeight = Comparator.comparing(InoneagentBlood::getOxygExamtime); + } + else if(id.equals("3")){ + byHeight = Comparator.comparing(InoneagentBlood::getGlucoseExamtime); + }else{ + throw new Exception("id 值为非识别类型"); + } + + Optional fbp= BpStreamList.stream().filter(BP->BP.getIdnumber().equals(IDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + //InoneagentBlood res= fbp.get(); + InoneagentBlood res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + //下面为心电12导联数据 + private String drawEcg(String urlPath) throws GeneralSecurityException, Exception{ + //https 下载 + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(urlPath); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + //System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-Type", "application/octet-stream; charset=utf-8"); + conn.setDoOutput(true); + BufferedInputStream bin = new BufferedInputStream(conn.getInputStream()); + //解压成流 + ZipInputStream Zin=new ZipInputStream(bin);// + BufferedInputStream Bin=new BufferedInputStream(Zin); + ZipEntry entry; + ByteArrayOutputStream result=null; + //解压文件下的多个文件,按照对方提供的文档是只存在一个文件的 + while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ + result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = Bin.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + } + String finallyResult =result.toString("UTF-8"); + + return finallyResult; + + } + //解析解压后的字符串 + private List> parECGxml(String xml) throws DocumentException{ + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + //Element root = document.getRootElement(); + //System.out.println(root); + //Element out = + // document.getRootElement().element("Institution"); + //String s=out.getTextTrim(); + //System.out.println("??? "+s); + // + Element ecglist = document.getRootElement().element("EcgLeadList"); + //String sample=ecglist.element("Sample").getText(); + //System.out.println(sample); + Iterator it=ecglist.elementIterator(); + List> list = new LinkedList>(); + while(it.hasNext()){ + //Node node1 =it.next(); + Map hashEcg = new HashMap(); + Element el =it.next(); + + String leadtype =el.elementText("LeadType");//出现了null 值 + String leadDate =el.elementText("LeadData"); + //System.out.println(""+leadtype+" "); + if(leadtype!=null){ + hashEcg.put(leadtype, leadDate); + list.add(hashEcg); + } + + } + return list; + + } + + +} diff --git a/backend/src/main/java/com/imurs/controller/GsHisController.java b/backend/src/main/java/com/imurs/controller/GsHisController.java new file mode 100644 index 0000000..6d9be00 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/GsHisController.java @@ -0,0 +1,943 @@ +package com.imurs.controller; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.apache.commons.io.IOUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; +import org.jdom.JDOMException; +import org.jsoup.Jsoup; +import org.jsoup.select.Elements; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import com.imurs.parameter.LIS; +import com.imurs.parameter.PACS; + + +@RestController +@RequestMapping(value="JyHiS") +public class GsHisController { + /** + * HIS_PatientInfo接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="PatientInfo",method = RequestMethod.POST) + public Map PatientInfo(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + Map map = new HashMap(); + String s = new String();//GetPatientInfo + + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetPatientInfo"); + conn.setRequestMethod("POST"); + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//15S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + //定义输出流 + + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + Map resultmap =PatientInfofoxml(s1); + return resultmap; + } + /** + * HIS_LISRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="LisResult",method = RequestMethod.POST) + public Map LisResult(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map map = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetLisResult"); + conn.setRequestMethod("POST"); + //定义输出流 + + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println(s1); + map=parLis(s1); + return map; + + } + /** + * HIS_PACSRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="PacsResult",method = RequestMethod.POST) + public MapPacsResult(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map map = new HashMap(); + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetPacsResult"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + //OutputStream output = conn.getOutputStream(); + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + map=ParPacsResultfoxml(s1); + return map; + + } + /** + * HIS_PACSRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="MedicalRecord",method = RequestMethod.POST) + public MapMedicalRecord(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map maph = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetMedicalRecord"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + maph.put("ResultCode","3" ); + return maph; + } + //OutputStream output = conn.getOutputStream(); + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + + + //String s1=strToHtml(s); + ///和上面无关的,解析的字符串先不用做strToHtml(),下面这几句提取出HTML代码 + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(s.getBytes("UTF-8"))); + Element out = + document.getRootElement().element("Body").element("GetMedicalRecordResponse").element("GetMedicalRecordResult"); + org.jsoup.nodes.Document doc=null; + org.jsoup.nodes.Element table =null; + String s2=null; + Elements rowr=null; + try{ + doc = Jsoup.parse(out.getText(),"gb2312"); + table =doc.getElementById("table1"); + s2=table.select("td[cellid=B1]").select("span").text(); + rowr=doc.select("p[align=left]"); + }catch(Exception e){ + maph.put("ResultCode1", "2");//入院记录无此人信息 + return maph; + } + + + + Map map = new HashMap(); + + //姓名,性别,科室,住院号,床位 + //System.out.println("有记录吗"+rows2.text());//姓名 + //org.jsoup.nodes.Element table =doc.getElementById("table1"); + //String s1=table.select("td[cellid=A1]").select("span").text(); + //String s2=table.select("td[cellid=B1]").select("span").text(); + //System.out.println("获取的文本"+s+":"+s2); + //Elements rows = doc.select("p[align=left]").get(1).select("span"); + + //Elements rowr=doc.select("p[align=left]"); + + //利用:分割对应数据 + + map.put("pname", s2); + + String xl=rowr.get(2).text(); + String[] x2=xl.split(":"); + String p=rowr.get(3).text(); + String[] ph=p.split(":"); + if(x2.length>1){ + map.put("present", x2[1]); + + }else{ + map.put("present", ""); + } + if(ph.length>1){ + map.put("past", ph[1]); + + }else{ + map.put("past", ""); + } + return map; + + } + /** + * EcgInfo接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="EcgInfo",method = RequestMethod.POST) + public Map soapRequestEcgInfoConnection(String InpatientNo,String PatientType) throws Exception{ + String s = new String();//GetPatientInfo + Map maph = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:46235/WebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:46235"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetReportMessage"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + maph.put("ResultCode","3" ); + return maph; + } + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + // + Map map=ParseEcGRecordxml(s1); + return map; + +} + //解析心电记录 + public Map ParseEcGRecordxml(String xml) throws JDOMException, IOException, DocumentException{ + + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element out = + document.getRootElement().element("Body").element("GetReportMessageResponse").element("GetReportMessageResult"); + String result = out.getText(); + //System.out.println("return 解析ErrorMsg:"+result); + //String 转json + Map rowData = new HashMap(); + JSONObject jsonObject = JSON.parseObject(result); + Object jsonObject1 =null; + JSONObject json= JSON.parseObject(jsonObject.get("Response").toString()); + String re= json.get("ResultCode").toString(); + if(re.equals("-1")){ + rowData.put("ResultCode", "1");//错误 + } + if(re.equals("0")&&json.get("EcgInfo")==null){ + rowData.put("ResultCode", "2");//无信息 + } + // System.out.println("错误值"+re);//等于-1 中断处理 + if(re.equals("0")&&json.get("EcgInfo")!=null){ + /// System.out.println("有错误吗"+re); + // System.out.println("识别正常情况"); + jsonObject1 = json.get("EcgInfo"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + // System.out.println("这是什么"+jsonObject2.toString()); + //取出其中一个值 + //String s= jsonObject2.get("Address").toString(); + //System.out.println("..."+s); + rowData.put("patientName", jsonObject2.get("PatName")==null?"":jsonObject2.get("PatName").toString()); + rowData.put("sex", jsonObject2.get("PGender")==null?"":jsonObject2.get("PGender").toString()); + rowData.put("age", jsonObject2.get("PatientAge")==null?"":jsonObject2.get("PatientAge").toString()); + rowData.put("examineDocName", jsonObject2.get("ApplyDocName")==null?"":jsonObject2.get("ApplyDocName").toString()); + rowData.put("chamber", jsonObject2.get("ApplyDepartMent")==null?"":jsonObject2.get("ApplyDepartMent").toString()); + rowData.put("ptCard", jsonObject2.get("IDCard")==null?"":jsonObject2.get("IDCard").toString());//身份证号 + rowData.put("outPatien", jsonObject2.get("ClinicCode")==null?"":jsonObject2.get("ClinicCode").toString());//门诊号 + rowData.put("reportDocName", jsonObject2.get("Reporter")==null?"":jsonObject2.get("Reporter").toString());//报告医生 + rowData.put("auditDocName", jsonObject2.get("RepAudit")==null?"":jsonObject2.get("RepAudit").toString());//审核医生 + rowData.put("auditDate", jsonObject2.get("RepAuditTime")==null?"":jsonObject2.get("RepAuditTime").toString());//审核日期 + rowData.put("electricAxis", jsonObject2.get("QRSaxis")==null?"":jsonObject2.get("QRSaxis").toString());//电轴 + rowData.put("qrs", jsonObject2.get("QRS")==null?"":jsonObject2.get("QRS").toString());//QPS时限 + rowData.put("pr", jsonObject2.get("PR")==null?"":jsonObject2.get("PR").toString());//P-R间期 + rowData.put("qt", jsonObject2.get("QT")==null?"":jsonObject2.get("QT").toString());//P-R间期 + rowData.put("qtc", jsonObject2.get("QTC")==null?"":jsonObject2.get("QTC").toString());//P-R间期 + rowData.put("sv1", jsonObject2.get("SV1")==null?"":jsonObject2.get("SV1").toString());//P-R间期 + rowData.put("rv5", jsonObject2.get("RV5")==null?"":jsonObject2.get("RV5").toString());//P-R间期 + rowData.put("rs", jsonObject2.get("RSamp")==null?"":jsonObject2.get("RSamp").toString());//R+S + rowData.put("hr", jsonObject2.get("HR")==null?"":jsonObject2.get("HR").toString());//P-R间期 + rowData.put("diagnos", jsonObject2.get("ClincDiagnose")==null?"":jsonObject2.get("ClincDiagnose").toString());//诊断 + rowData.put("clinicDiagnos", jsonObject2.get("RepDiagnose")==null?"":jsonObject2.get("RepDiagnose").toString());//临床诊断 + rowData.put("complain", jsonObject2.get("RepDescription")==null?"":jsonObject2.get("RepDescription").toString());//描述 + rowData.put("url", jsonObject2.get("URL")==null?"":jsonObject2.get("URL").toString()); + rowData.put("reportDate", jsonObject2.get("RepCreateDate")==null?"":jsonObject2.get("RepCreateDate").toString()); + rowData.put("hisEsrdNumber", jsonObject2.get("HospCode")==null?"":jsonObject2.get("HospCode").toString()); + } + return rowData; + } + + //解析PatientInfoXML格式 + public Map PatientInfofoxml(String xml) throws JDOMException, IOException, DocumentException{ + + Map map = new HashMap(); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element out = + document.getRootElement().element("Body").element("GetPatientInfoResponse").element("GetPatientInfoResult").element("Response"); + Map mapf = new HashMap(); + Map mapr = new HashMap(); + + String text =document.getRootElement().element("Body").element("GetPatientInfoResponse").element("GetPatientInfoResult").getText(); + Map mape=new HashMap(); + String ResultCode=""; + try{ + ResultCode= out.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//无信息就写2 + return map; + } + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息 + return map; + } + map.put("ResultCode", ResultCode); + + Iterator patientout =out.element("PatInfo").elementIterator(); + while(patientout.hasNext()){ + Node node1 =patientout.next(); + + mapf.put(node1.getName(), node1.getText()); + } + mapr.put("patientName", mapf.get("NAME")==null?"":mapf.get("NAME")); + mapr.put("sex", mapf.get("SEX")==null?"":mapf.get("SEX")); + mapr.put("age", mapf.get("AGE")==null?"":mapf.get("AGE")); + mapr.put("ptPhone", mapf.get("TELEPHONE")==null?"":mapf.get("TELEPHONE")); + mapr.put("marry", mapf.get("MARRY")==null?"":mapf.get("MARRY")); + mapr.put("ptCity", mapf.get("ADDRESS")==null?"":mapf.get("ADDRESS")); + mapr.put("outPatien", mapf.get("PATIENTNO")==null?"":mapf.get("PATIENTNO"));//病人编号 + mapr.put("hisEsrdNumber", mapf.get("INPATIENTNO")==null?"":mapf.get("INPATIENTNO"));//住院号 + mapr.put("ptCard", mapf.get("IDCARD")==null?"":mapf.get("IDCARD")); + mapr.put("doctor", mapf.get("DOCTOR")==null?"":mapf.get("DOCTOR")); + mapr.put("changeDeptid", mapf.get("CHANGE_DEPTID")==null?"":mapf.get("CHANGE_DEPTID"));//转科科别 + mapr.put("bedid", mapf.get("BEDID")==null?"":mapf.get("BEDID")); + mapr.put("initial", mapf.get("CLINICDIAGNOSE")==null?"":mapf.get("CLINICDIAGNOSE"));//初步诊断 + mapr.put("fDiagnose", mapf.get("F_DIAGNOSE")==null?"":mapf.get("F_DIAGNOSE"));//病理诊断 + mapr.put("allergy", mapf.get("ALLERGIC")==null?"":mapf.get("ALLERGIC"));//过敏药品 + mapr.put("nuhTime", mapf.get("IN_DATE")==null?"":mapf.get("IN_DATE"));//入院时间 + mapr.put("nuhSection", mapf.get("INDEPTID")==null?"":mapf.get("INDEPTID"));//入院科别 + mapr.put("examine", mapf.get("EXAM_ITEM")==null?"":mapf.get("EXAM_ITEM"));//检查 + //System.out.println(mapr.toString()); + + return mapr; + } + + public Map parLis(String xml) throws JDOMException, IOException, DocumentException{ + Map map = new HashMap(); + List> hisList = new ArrayList>(); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element root = document.getRootElement().element("Body").element("GetLisResultResponse").element("GetLisResultResult").element("Response"); + String text=document.getRootElement().element("Body").element("GetLisResultResponse").element("GetLisResultResult").getText(); + + // Map mape=new HashMap(); + String ResultCode=""; + try{ + ResultCode= root.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + //String recode=root.element("ResultCode").getText(); + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息 + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//ResultCode不是0,1 其他说明异常 + return map; + } + map.put("ResultCode", ResultCode); + Iterator out = + root.elementIterator(); + //取2个数据.element("ErrorMsg") + int i=0; + while(out.hasNext()){ + i++; + Node node = out.next(); + + + Element element1 = (Element)node; + Iterator out1 = element1.elementIterator(); + Map mapt=new HashMap(); + while(out1.hasNext()){ + Node node1 = out1.next(); + + //if(!node1.getName().equals("SUNDRY_FEE_NAME")) + mapt.put(node1.getName(), node1.getText()); + // + + // + } + + hisList.add(mapt); + } + for(int j=0;j> o= hisList.stream().filter(map1->!map1.isEmpty()).distinct().collect(Collectors.toList()); + /* for(int k=0;k hisStreamList = new ArrayList(); + + for(int j=0;j=1){ + LIS re= hisStreamList.get(0); + map.put("name", re.getName()); + map.put("gender", re.getGender()); + map.put("age", re.getAge()); + map.put("hisEsrdNumber", re.getHisEsrdNumber());//改成HIS_esrd + map.put("printOrder", re.getPrintOrder()); + map.put("sampleNo", re.getSampleNo()); + map.put("sampleType", re.getSampleType()); + map.put("resultDateTime", re.getResultDateTime()); + map.put("updateDate", re.getUpdateDate()); + } + /* for(int i1=0;i1> result = new ArrayList>(); + + + //按项目分组 + /* Map> partiem= hisStreamList.stream().collect(Collectors.groupingBy(LIS::getSundryFeeName)); + Set>> s2=partiem.entrySet(); + int p=0; + for(Entry> s:s2){ + Map> ll= new HashMap>(); + //System.out.println(s.getKey()+"项目指: "+s.getValue()); + ll.put(""+p++, s.getValue()); + result.add(ll); + + }*/ + //按项目,日期分组 + Map>> collect= hisStreamList.stream().collect(Collectors.groupingBy(LIS::getSundryFeeName,Collectors.groupingBy(LIS::getUpdateDate))); + + Set>>> set= collect.entrySet(); + List>> palis = new ArrayList>>(); + for (Entry>> en : set) { + // System.out.println("按键="+en.getKey()+"值="+en.getValue()); + //对每个键的值,进行排序 + Map> map1 =en.getValue(); + palis.add(map1); + + } + //打印出来这个分组后的数据。 + for(int i2=0;i2> mk =palis.get(i2); + //建立排序MAP + TreeMap> tm=new TreeMap>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.compareTo(o1); + } + }); + for(String k:mk.keySet()){ + //System.out.println(i2+"日期值"+k+"ffff"+mk.get(k)); + //比较K值,选择最大K值进行输出 + tm.put(k, mk.get(k)); + } + //在这次循环中,取出最大值 + //System.out.println(i2+"排序后的值"+"ffff"+tm.get(tm.firstKey())); + result.add(tm.get(tm.firstKey())); + } + Map amp =new HashMap(); + amp.put("basic", map); + amp.put("list", result); + // System.out.println(amp.toString()); + return amp; + } + //解析PACSRESULT格式 + public Map ParPacsResultfoxml(String xml) throws JDOMException, IOException, DocumentException{ + + List> hisList = new ArrayList>(); + //soapUI自动生成的request xml路径,写入传入参数 + Map map = new HashMap(); + //String s= strToHtml(soapHeader); + // 1.创建SAXReader的对象reader + SAXReader reader = new SAXReader(); + // 2.通过reader对象的read()方法加载books.xml文件,获取document对象 + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + + // 3.通过document对象获取根节点bookstore + // Element root = document.getRootElement(); + //System.out.println(root); + Element out = + document.getRootElement().element("Body").element("GetPacsResultResponse").element("GetPacsResultResult").element("Response"); + //Element ErrorMsg = out.element("ErrorMsg"); + // Element ResultCode = out.element("ResultCode"); + String text=document.getRootElement().element("Body").element("GetPacsResultResponse").element("GetPacsResultResult").getText(); + //System.out.println("文本内容"+text); + String ResultCode=""; + try{ + ResultCode= out.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//错误代码 + return map; + } + //String ResultCode = out.element("ResultCode").getText()==null?"1":out.element("ResultCode").getText(); + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息就写2 + return map; + } + + map.put("ResultCode", ResultCode); + Iterator out1 = + out.elementIterator(); + int i=0; + while(out1.hasNext()){ + i++; + Node node = out1.next(); + + + Element element1 = (Element)node; + Iterator out2 = element1.elementIterator(); + Map mapt=new HashMap(); + while(out2.hasNext()){ + Node node1 = out2.next(); + // System.out.println("---"+node1.getName()+":"+node1.getText()); + mapt.put(node1.getName(), node1.getText()); + } + hisList.add(mapt); + } + for(int j=0;j> o= hisList.stream().filter(map1->!map1.isEmpty()).distinct().collect(Collectors.toList()); + /*for(int k=0;k pacsStreamList = new ArrayList(); + + for(int j=0;j=1){ + PACS re= pacsStreamList.get(0); + map.put("name", re.getPatientName()); + map.put("sex", re.getSex()); + map.put("age", re.getAge()); + //map.put("esrdNumber", re.getEsrdNumber()); + + } + List>> result = new ArrayList>>(); + List> fresult = new ArrayList>(); + //按项目,日期进行分组 + Map>> collect= pacsStreamList.stream().collect(Collectors.groupingBy(PACS::getExamineName,Collectors.groupingBy(PACS::getReportDate))); + Set>>> set= collect.entrySet(); + for (Entry>> en : set) { + // System.out.println("按键="+en.getKey()+"值="+en.getValue()); + //对每个键的值,进行排序 + Map> map1 =en.getValue(); + result.add(map1); + + } + //打印出来这个分组后的数据。 + for(int i2=0;i2> mk =result.get(i2); + //建立排序MAP + TreeMap> tm=new TreeMap>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.compareTo(o1); + } + }); + for(String k:mk.keySet()){ + //System.out.println(i2+"日期值"+k+"ffff"+mk.get(k)); + //比较K值,选择最大K值进行输出 + tm.put(k, mk.get(k)); + } + //在这次循环中,取出最大值 + // System.out.println(i2+"排序后的值"+"ffff"+tm.get(tm.firstKey())); + fresult.add(tm.get(tm.firstKey())); + } + //上面是按项目日期进行分组 + /* //按项目分组 + Map> partiem= pacsStreamList.stream().collect(Collectors.groupingBy(PACS::getExamineName)); + Set>> s2=partiem.entrySet(); + int p=0; + for(Entry> s:s2){ + Map> ll= new HashMap>(); + //System.out.println(s.getKey()+"项目指: "+s.getValue()); + ll.put(""+p++, s.getValue()); + result.add(ll); + + }*/ + /* //再次按日期划分 + for(int l=0;l> lk =result.get(l).values(); + //取出0,1,2,3的数据 做列表,然后对日期进行排序。//https://cloud.tencent.com/developer/ask/179473 + Iterator> pa= lk.iterator(); + int o1=0; + while(pa.hasNext()){ + List ls= pa.next(); + Iterator pac= ls.iterator(); + List reresult =new ArrayList(); + while(pac.hasNext()){ + //System.out.println("分开"+pac.next()); + PACS P1= pac.next(); + reresult.add(P1); + } + // List S= reresult.stream().collect(Collectors.maxBy(Comparator.comparing(PACS::getReport_date)), Optional::get); + Optional S= reresult.stream().sorted(Comparator.comparing(PACS::getReportDate).reversed()).findFirst(); + //System.out.println(o1+"分开"+reresult.toString()); + // System.out.println("不好"+S.get()); + fresult.add(S.get()); + o1++; + } + //System.out.println(o1+"看下P2指"+lk.size()); + }*/ + //上面是按日期处理 + Map amp =new HashMap(); + amp.put("basic", map); + amp.put("list", fresult); + // System.out.println(amp.toString()); + return amp; + } + public static String strToHtml(String s) + { + if (s==null||s.equals("")) return ""; + s = s.replaceAll("&","&"); + s = s.replaceAll("<","<"); + s = s.replaceAll(">",">"); + s = s.replaceAll(" "," "); + s = s.replaceAll(" ", " "); + return s; + } +} diff --git a/backend/src/main/java/com/imurs/controller/HomePageHtmlController.java b/backend/src/main/java/com/imurs/controller/HomePageHtmlController.java new file mode 100644 index 0000000..d1222cb --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/HomePageHtmlController.java @@ -0,0 +1,107 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.HomePageShow; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.HomePageShowService; + +/** + * 首页Html + * @author Server + * + */ +@RestController +@RequestMapping(value="html") +public class HomePageHtmlController { + + @Autowired + HomePageShowService homePageShowService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + ApplyInformationService applyInformationService; + + + /** + * 首页显示 + * @return + * type:类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 D医联体合作单位) + */ + @RequestMapping(value="homePage") + public Map homePage(){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper inforWrapper=new EntityWrapper(); + wrapper.isNotNull("type").orderBy("create_time", false); + + inforWrapper.eq("state", "1"); + //map.put("state", "1"); + //map.put("credit_type", "1"); + + List hmList=new ArrayList(); + List daList=new ArrayList(); + List aiList=new ArrayList(); + try { + //医联体合作单位 + inforWrapper.orderBy("if(id='68729a2d87075bd616f7339940227f46',0,1),if(id='97561c8ecc660a36a3cdad29abd4ae3f',0,1)," + + "if(id='07cdf216c7a7eb0e1dd5d7fc568d9285',0,1),if(id='4f74e5c6659354e6eca2d4658bf57777',0,1)"); + aiList=applyInformationService.selectList(inforWrapper); + map.put("aiList", aiList); + + hmList=homePageShowService.selectList(wrapper); + if(hmList.isEmpty()){ + map.put("hmListA", hmList); + map.put("hmListB", hmList); + map.put("hmListC", hmList); + }else{ + //分组显示 + Map> collect = hmList.stream().collect(Collectors.groupingBy(HomePageShow::getType)); + map.put("hmListA", collect.get("A"));//国家/市区政策 + map.put("hmListB", collect.get("B"));//消息通知 + map.put("hmListC", collect.get("C"));//长沙市第一医院风采 + } + //下派专家一览 + daList=doctorArrangeService.selectHonmeShowArrange(); + map.put("daList", daList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("apply_statu"); + //map.remove("credit_type"); + } + return map; + } + + /** + * 首页排班列表分类显示 + * @return + */ + @RequestMapping(value="homePageArrange") + public Map homePageArrange(@RequestParam Map jsonMap){ + Map map=new HashMap(); + List daList=new ArrayList(); + try { + daList=doctorArrangeService.homeShowArrange(jsonMap); + map.put("daList", daList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/HomePageShowController.java b/backend/src/main/java/com/imurs/controller/HomePageShowController.java new file mode 100644 index 0000000..9c07322 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/HomePageShowController.java @@ -0,0 +1,158 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.HomePageShow; +import com.imurs.service.HomePageShowService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 医院首页控制器 + * @author Server + * + */ +@RestController +@RequestMapping(value="home") +public class HomePageShowController { + + @Autowired + HomePageShowService homePageShowService; + + /** + * 新增医院首页信息 + */ + @RequestMapping(value="insertHome") + public Map insertHome(HomePageShow homePageShow){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.insert(homePageShow); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 修改医院首页信息 + */ + @RequestMapping(value="updateHome") + public Map updateHome(HomePageShow homePageShow){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.updateById(homePageShow); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 查询医院首页信息 + */ + @RequestMapping(value="findHomeList") + public Map findHomeList(){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.isNotNull("type").orderBy("create_time", false); + List hmList=homePageShowService.selectList(wrapper); + if(hmList.isEmpty()){ + map.put("msg", "3"); + }else{ + //分组显示 + Map> collect = hmList.stream().collect(Collectors.groupingBy(HomePageShow::getType)); + map.put("hmListA", collect.get("A")); + map.put("hmListB", collect.get("B")); + map.put("hmListC", collect.get("C")); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 删除医院首页信息 + */ + @RequestMapping(value="deleteHome") + public Map deleteHome(Long id){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 首页信息分页显示 + * type:类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 ) + * + */ + @RequestMapping(value="findHomeListPage") + public Map findHomeListPage(String type,Integer pageSize,Integer pageNo){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setRows(pageSize == null ? 6 : pageSize); + page.setPage(pageNo == null ? 1 : pageNo); + try { + wrapper.eq("type", StringUtils.isEmpty(type)?"A":type).isNotNull("type").orderBy("create_time", false); + Page pageList = homePageShowService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList==null){ + map.put("msg", "3"); + }else{ + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 查询首页信息详情 + */ + @RequestMapping(value="findHomeListById") + public Map findHomeListById(Long id){ + Map map=new HashMap(); + try { + HomePageShow hm=homePageShowService.selectById(id); + map.put("hm", hm); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/ImageProcess.java b/backend/src/main/java/com/imurs/controller/ImageProcess.java new file mode 100644 index 0000000..5e19f34 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/ImageProcess.java @@ -0,0 +1,234 @@ +/*package com.imurs.controller; + + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.Base64; +import java.util.Iterator; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; + +import org.apache.commons.io.IOUtils; +import org.opencv.core.Core; +import org.opencv.core.CvType; +import org.opencv.core.Mat; +import org.opencv.core.MatOfByte; +import org.opencv.core.MatOfInt; +import org.opencv.core.Size; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; +import org.opencv.photo.Photo; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + + +import com.imurs.ocr.AuthService; +import com.imurs.ocr.FileUtil; +import com.imurs.ocr.HttpUtil; +import com.imurs.ocr.PicUtils; +import com.imurs.util.Opencvload; + +import net.sf.json.JSONObject; +import sun.misc.BASE64Decoder; + + + + +@RestController +@RequestMapping(value="ImageProcess") +public class ImageProcess { + @RequestMapping(value = "/contrastimg") + public String saveImage(MultipartFile filelSavePath,String id) throws Exception { + InputStream is =filelSavePath.getInputStream(); + //限制在4M内 + String url = null; + //Map json =ocrdemo.OcrRecognition(is); + *//* byte[] imgData = FileUtil.readInputStreamByBytes(is); + //文件路径 + String imgStr = base64Encode(imgData); + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + + String param = "image=" + imgParam; + AuthService as = new AuthService();//每个应用的密钥是不一样的,所以需要重新 + String accessToken = as.getAuth("2"); + String result = HttpUtil.post(url, accessToken, param); + // JSONObject IMG = new JSONObject(); + JSONObject json=JSONObject.fromObject(result); + String base64r= json.getString("image"); + System.out.println("结果是什么"+json.getString("image")); + BASE64Decoder decoder = new BASE64Decoder(); + try { + FileOutputStream write = new FileOutputStream(new File("D://qr.png")); + byte[] decodeBytes = decoder.decodeBuffer(base64r); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + + // return result; + String base64r=null; + if("1".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/contrast_enhance"; + base64r= commonImageInputStream(is,url); + }else if("2".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_quality_enhance"; + base64r= commonImageInputStream(is,url); + }else if("3".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/dehaze"; + base64r= commonImageInputStream(is,url); + }else{ + throw new Exception("不匹配"); + } + + return base64r; + + + } +//图像去噪功能,中值滤波5*5,需要使用的opencv + @RequestMapping(value = "/denoise") + public String denoiseImage(MultipartFile filelSavePath,String id) throws Exception { + //Opencvload o= new Opencvload(); + // System.load("I://opencv3.4.4//opencv//build//java//x64//opencv_java344.dll");//win + System.load("/usr/local/cvdemo/libopencv_java344.so");//centos7 64 + InputStream input =filelSavePath.getInputStream(); + //System.out.println("13434"); + // System.out.println("sds"+input.available()); + //因为截图的格式是JPG,所以只对jpg 做了处理。,也会有BMP + + // System.load("/usr/local/cvdemo/libopencv_java344.so");//centos7 + // System.out.println("s2ds"+input.available()); + BufferedImage img =(BufferedImage)ImageIO.read(input); + + Mat source =bufferedImageToMat(img); + Mat destination = new Mat(); + MatOfByte destination1 = new MatOfByte(); + switch(id) + { + case "1": + //System.out.println("1"); + //Photo.fastNlMeansDenoisingColored(source,destination, 10, 10, 7, 21);//非局部平均去噪,使用彩色图像 + Imgproc.medianBlur(source,destination,5);//中值滤波 高斯噪声 + break; + case "2": + //System.out.println("2"); + Imgproc.medianBlur(source,destination,3);//中值滤波 椒盐噪声 + break; + *//* case "3": + System.out.println("3"); + Size s =new Size(3,3); + Imgproc.GaussianBlur(source, destination, s, 0);//高斯滤波 + break;*//* + default : + return "参数不对"; + + } + + // ,默认是压缩的95,修改成百分百不压缩 + int quilatly= Imgcodecs.CV_IMWRITE_JPEG_QUALITY; + int num =100; + MatOfInt parm = new MatOfInt(quilatly,num); + // + *//* + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + IOUtils.copy(input, outputStream ); + //转换成字节数组 + byte[] byteArray = outputStream .toByteArray(); + ByteArrayInputStream inputStreamClone = new ByteArrayInputStream(byteArray); + ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStreamClone);//JPEG ,bmp + // 获取ImageReader对象的迭代器 + //默认只有一张 + String formatNameList=null; + Iterator iterator = ImageIO.getImageReaders(imageInputStream); + while(iterator.hasNext()){ + formatNameList=iterator.next().getFormatName(); + }*//* + + //if("JPEG".equals(formatNameList)){ + Imgcodecs.imencode(".jpg", destination, destination1,parm);//mat 转成matofbyte + *//* }else if("bmp".equals(formatNameList)){ + Imgcodecs.imencode(".bmp", destination, destination1);//mat 转成matofbyte + }*//* + //Imgcodecs.imencode(regx, destination, destination1,parm);//mat 转成matofbyte + byte[] d= destination1.toArray(); + //字节数组转成BASE64流,给前端返回这个流 + String img1= base64Encode(d); + //base64流,写成图片 + *//* BASE64Decoder decoder = new BASE64Decoder(); + try { + FileOutputStream write = new FileOutputStream(new File("I://TEST//2.jpg")); + byte[] decodeBytes = decoder.decodeBuffer(img1); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + + return img1; + } + //基本工具 + public static Mat bufferedImageToMat(BufferedImage bi) { + Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3); + byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData(); + mat.put(0, 0, data); + return mat; + } + private String commonImageInputStream(InputStream is,String url) throws Exception{ + + byte[] imgData1 = FileUtil.readInputStreamByBytes(is); + byte[] imgData = PicUtils.compressPicForScale(imgData1, 4000, "x1"); + //文件路径 + String imgStr = base64Encode(imgData); + + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + + String param = "image=" + imgParam; + AuthService as = new AuthService();//每个应用的密钥是不一样的,所以需要重新 + String accessToken = as.getAuth("2"); + String result=null; + try{ + result = HttpUtil.post(url, accessToken, param); + }catch (Exception e){ + e.printStackTrace(); + } + // JSONObject IMG = new JSONObject(); + JSONObject json=JSONObject.fromObject(result); + String base64r= json.getString("image"); + *//* System.out.println("结果是什么"+json.getString("image")); + BASE64Decoder decoder = new BASE64Decoder(); + try { + Random ra =new Random(); + String file ="D://"+ra.nextInt(10)+".png"; + FileOutputStream write = new FileOutputStream(new File(file)); + byte[] decodeBytes = decoder.decodeBuffer(base64r); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + return base64r; + + } + private static String base64Encode(byte[] content) { + + Base64.Encoder encoder = Base64.getEncoder(); // JDK 1.8 推荐方法 + String str = encoder.encodeToString(content); + + + // char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库 + // String str = new String(chars); + + return str; + } +}*/ +//工具类读流成字节 diff --git a/backend/src/main/java/com/imurs/controller/InstallModelController.java b/backend/src/main/java/com/imurs/controller/InstallModelController.java new file mode 100644 index 0000000..17439e4 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/InstallModelController.java @@ -0,0 +1,139 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.InstallModel; +import com.imurs.service.InstallModelService; +import com.imurs.service.impl.InstallModelServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("install") +public class InstallModelController { + + @Autowired + InstallModelServiceImpl installModelService; + + + /** + * 增加医院设备的型号数据 + * @param installModel + */ + + @RequestMapping("addInstallModel") + public Map addInstallModel(InstallModel installModel) { + Map resultMap = new HashMap<>(4); + try { + boolean result = installModelService.insert(installModel); + if (result) { + resultMap.put("msg","1"); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } + + + /** + * 更新医院的设备型号 + * @param installModel + */ + + @RequestMapping("updateInstallModel") + public Map updateInstallModel(InstallModel installModel) { + Map resultMap = new HashMap<>(2); + try { + boolean result = installModelService.updateById(installModel); + if (result) { + resultMap.put("msg",1); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 删除医院的设备型号 + * @param id + */ + + @RequestMapping("deleteInstallModel") + public Map deleteInstallModel(Integer id) { + Map resultMap = new HashMap<>(2); + try { + boolean result = installModelService.deleteById(id); + if (result) { + resultMap.put("msg",1); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 根据id查询设备型号 + * @param id + */ + + @RequestMapping("findInstallModelById") + public Map findInstallModel(Integer id) { + Map resultMap = new HashMap<>(2); + try { + InstallModel installModel = installModelService.selectById(id); + if (installModel != null) { + resultMap.put("installModel",installModel); + resultMap.put("msg","1"); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 通过医院id与会诊类型查找设备型号 + * @param hospitalId 医院id + * @param type 会诊类型 超声视频:BMODEL 远程会诊视频:CON + * @return + */ + + @RequestMapping("findInstallMode") + public Map findInstallMode(String hospitalId,String type) { + Map resultMap = new HashMap<>(2); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("hospital_id",hospitalId); + if(type!=null) { + wrapper.eq("type",type); + } + try { + List installModels = installModelService.selectList(wrapper); + + resultMap.put("installModels",installModels); + resultMap.put("msg",1); + + + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } + + + +} diff --git a/backend/src/main/java/com/imurs/controller/LiveController.java b/backend/src/main/java/com/imurs/controller/LiveController.java new file mode 100644 index 0000000..68054d5 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/LiveController.java @@ -0,0 +1,190 @@ +package com.imurs.controller; + +import com.imurs.dao.LiveMapper; +import com.imurs.entity.Live; +import com.imurs.service.LiveService; +import com.imurs.service.impl.LiveServiceImpl; +import com.imurs.util.page.Pagetion; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping(value="live") +public class LiveController { + + @Autowired + private LiveService liveService; + + + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("updateLive") + public Map updateLive(Live live){ + Map map=new HashMap(); + boolean result = false; + try { + if(live != null) { + result=liveService.updateById(live); + liveService.updateById(live); + } + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 插入直播地址 + */ + @Transactional + @RequestMapping("insertLive") + public Map insertLive(Live live){ + Map map=new HashMap(); + boolean result = false; + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + try { + if(live != null) { + result=liveService.insert(live); + liveService.updateById(live); + } + live.setApplicationTime(dateFormat.parse(dateFormat.format(date))); + map.put("id",live.getId()); + map.put("applicationTime",live.getApplicationTime()); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("deleteLive") + public Map deleteLive(Live live){ + Map map=new HashMap(); + boolean result = false; + try { + if(live != null) { + result=liveService.deleteById(live); + } + map.put("msg", result ?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("selectLiveById") + public Map selectLive(Long id){ + Map map=new HashMap(); + try { + Live live = liveService.selectById(id); + map.put("live",live); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 管理医院B超列表 + */ + @RequestMapping("selectLivePage") + public Map selectBmodePage(String state, + Integer pageNo,Integer pageSize){ + Map map=new HashMap(); + map.put("state",state); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = liveService.selectLivePage(map, pageNo, pageSize); + map.clear(); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + } + return map; + } +// /*********************************** +// * 批量删除直播地址 +// */ +// @Transactional +// @RequestMapping("deleteBatchLive") +// public Map deleteBatchLive(@RequestBody List aList){ +// Live live = aList.get(0); +// Map map=new HashMap(); +// boolean result = false; +// try { +// if(live != null) { +// result=liveService.deleteBatchIds(aList); +// } +// map.put("msg", result==true?"1":"2"); +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } +// /** +// * 批量新增直播地址 +// */ +// @Transactional +// @PostMapping("insertBatchLive") +// public Map insertLive(@RequestBody List aList){ +// Map map=new HashMap(); +// try { +// if(!aList.isEmpty()){ +// boolean result = liveService.insertBatch(aList); +// map.put("msg", result==true?"1":"2"); +// }else{ +// map.put("msg", "3"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } +// /** +// * 批量修改直播地址 +// */ +// @Transactional +// @RequestMapping("updateBatchLive") +// public Map updateLive(List aList){ +// Live live = aList.get(0); +// Map map=new HashMap(); +// boolean result = false; +// try { +// if(live != null) { +// result=liveService.updateBatchById(aList); +// } +// map.put("msg", result==true?"1":"2"); +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } + +} diff --git a/backend/src/main/java/com/imurs/controller/LoginController.java b/backend/src/main/java/com/imurs/controller/LoginController.java new file mode 100644 index 0000000..f643e31 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/LoginController.java @@ -0,0 +1,171 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import com.imurs.shiro.ShiroUtils; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +/** + * 登录 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "login") +public class LoginController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + private static String privateKey = MsgCode.privateKeyString; + + + /** + * 医生修改密码(没有使用) + */ + @RequestMapping(value = "updateUserPassword") + public Map updateUserPassword(String phone, String oidPassword, String newPassword) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(oidPassword) + && StringUtils.isNotEmpty(newPassword)) { + wrapper.eq("phone", phone); + // 查询这个用户是否存在 + User user = userService.selectOne(wrapper); + if (user != null) { + if (user.getPassword().equals(MD5.GetMD5Code(oidPassword))) { + user.setPassword(MD5.GetMD5Code(newPassword)); + Boolean b = userService.update(user, wrapper); + map.put("msg", b == true ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 管理员重置医生密码(没有使用) + */ + @RequestMapping(value = "resetUserPassword") + public Map resetUserPassword(String phone, String password) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(password)) { + // 查询这个用户是否存在 + User user = userService.selectOne(new EntityWrapper().eq("phone", phone)); + if (user != null) { + user.setPassword(MD5.GetMD5Code(password)); + Boolean b = userService.updateById(user); + map.put("msg", b == true ? "1" : "2"); + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 医院修改密码 + */ + @RequestMapping(value = "informationUpdatePassword") + public Map informationUpdatePassword(String hospitalId, String oldPassword, String newPassword) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(hospitalId) && StringUtils.isNotEmpty(oldPassword) + && StringUtils.isNotEmpty(newPassword)) { + // 查询这个用户是否存在 + + oldPassword = RSAUtil.decrypt(oldPassword,privateKey); + newPassword = RSAUtil.decrypt(newPassword,privateKey); + + ApplyInformation applyInformation = applyInformationService + .selectOne(new EntityWrapper().eq("id", hospitalId)); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (passwordEncoder.matches(oldPassword,applyInformation.getPassword())) { + applyInformation.setPassword(passwordEncoder.encode(newPassword)); + Boolean b = applyInformationService.updateById(applyInformation); + map.put("msg", b ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 管理员重置医院密码 + */ + @RequestMapping(value = "resetInformationPassword") + public Map resetInformationPassword(String hospitalId, String password) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(hospitalId) && StringUtils.isNotEmpty(password)) { + // 查询这个用户是否存在 + ApplyInformation applyInformation = applyInformationService + .selectOne(new EntityWrapper().eq("id", hospitalId)); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + applyInformation.setPassword(passwordEncoder.encode(password)); + Boolean b = applyInformationService.updateById(applyInformation); + map.put("msg", b ? "1" : "2"); + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } +} diff --git a/backend/src/main/java/com/imurs/controller/LoginRecordController.java b/backend/src/main/java/com/imurs/controller/LoginRecordController.java new file mode 100644 index 0000000..83b1543 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/LoginRecordController.java @@ -0,0 +1,112 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.LoginRecord; +import com.imurs.service.LoginRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 登录记录 + * @author Server + * + */ +@RestController +@RequestMapping(value="loginRecord") +public class LoginRecordController { + + @Autowired + LoginRecordService loginRecordService; + + /** + * 新增登录记录 + * @param loginRecord + * @return + */ + @RequestMapping(value="addLoginRecord") + public Map addLoginRecord(LoginRecord loginRecord,HttpServletRequest request) throws Exception { + Map map=new HashMap(); + + try { + /** + * 获取访问用户的客户端IP(适用于公网与局域网). + */ + if (request == null) { + throw (new Exception("getIpAddr method HttpServletRequest Object is null")); + } + String ipString = request.getHeader("x-forwarded-for"); + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getRemoteAddr(); + } + + // 多个路由时,取第一个非unknown的ip + final String[] arr = ipString.split(","); + for (final String str : arr) { + if (!"unknown".equalsIgnoreCase(str)) { + ipString = str; + break; + } + } + + loginRecord.setIp(ipString);//获取登录ip + boolean result=loginRecordService.insert(loginRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示登录记录信息 + */ + @RequestMapping(value="selectLoginRecordPage") + public Map selectLoginRecordPage(Integer pageNo,Integer pageSize,String loginId,String loginName){ + Map map=new HashMap(); + FrontPage page=new FrontPage(); + EntityWrapper wrapper=new EntityWrapper(); + + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?12:pageSize); + + if(StringUtils.isNotEmpty(loginId)){ + wrapper.eq("login_id", loginId); + }if(StringUtils.isNotEmpty(loginName)){ + wrapper.like("login_name", loginName); + } + wrapper.orderBy("create_time",false); + try { + Page loginRecord=loginRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(loginRecord!=null){ + CustomPage customPage=new CustomPage(loginRecord); + map.put("customPage", customPage); + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/OcrDemoController.java b/backend/src/main/java/com/imurs/controller/OcrDemoController.java new file mode 100644 index 0000000..ddcb948 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/OcrDemoController.java @@ -0,0 +1,109 @@ +package com.imurs.controller; +import java.io.BufferedInputStream; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.metadata.Sheet; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.imurs.ocr.ocrdemo; +@RestController +@RequestMapping(value = "/Ocrcontroller") +public class OcrDemoController { + @RequestMapping(value = "/saveimg") + public Map saveImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + Map json =ocrdemo.OcrRecognition(is); + + + return json; + } + @RequestMapping(value = "/aliExcel") + public JSONObject aliExcel(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + InputStream inputStream = new BufferedInputStream(is); + List data = EasyExcelFactory.read(inputStream, new Sheet(1, 0)); + inputStream.close(); + Map m= print2(data); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(m)); + // Object o = JSONObject.toJSON(m); + return JSONObj; + + + } + public Map print2(List datas){ + + Map m = new HashMap(); + /* for(int i=4;i insertPatient(Patient patient) { + Map map = new HashMap(); + try { + boolean result = patientService.insert(patient); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改患者信息 + */ + @RequestMapping(value = "updatePatient") + public Map updatePatient(Patient patient) { + Map map = new HashMap(); + try { + boolean result = patientService.updateById(patient); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除患者信息 + */ + @Transactional + @RequestMapping(value = "deletePatientByCard") + public Map deletePatientByCard(String card) { + Map map = new HashMap(); + try { + if(StringUtils.isEmpty(card)){ + map.put("msg", "3"); + }else{ + map.put("card", card); + boolean result = patientService.deleteByMap(map); + map.put("msg", result == true ? "1" : "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除患者信息 + */ + @RequestMapping(value = "deletePatientById") + public Map deletePatientById(Long id) { + Map map = new HashMap(); + try { + boolean result = patientService.deleteById(id); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据患者病例号码查询 + */ + @RequestMapping(value = "seletePatientByCard") + public Map seletePatientById(String esrdNumber,String hospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(StringUtils.isEmpty(esrdNumber)){ + map.put("msg", "3"); + }else{ + wrapper.eq("esrd_number", esrdNumber).eq("hospital_id", hospitalId);; + Patient patient = patientService.selectOne(wrapper); + map.put("patient", patient); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示患者信息 + */ + @RequestMapping(value = "seletePatientPage") + public Map seletePatientPage(Integer pageNo, Integer pageSize,String card,String ptName,Integer type,String hospitalId,String esrdNumber) { + Map map = new HashMap(); + map.put("hospitalId", hospitalId); + map.put("card", card); + map.put("esrdNumber", esrdNumber); + map.put("ptName", ptName); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + if(type!=null && type==1){ + Pagetion acList=applyCaseService.selectCasePatient(map, pageNo, pageSize); + map.put("acList", acList); + }else if(type!=null && type==2){ + Pagetion conList=applyConsultationService.selectConPatient(map, pageNo, pageSize); + map.put("acList", conList); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalId"); + map.remove("card"); + map.remove("ptName"); + map.remove("esrdNumber"); + } + return map; + } + + /** + * 患者列表 + */ + @RequestMapping(value = "seletePatientByPage") + public Map seletePatientPage(Integer pageNo, Integer pageSize,String card,String patientName,String hospitalId,String esrdNumber) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + + if(StringUtils.isNotEmpty(esrdNumber)){ + wrapper.eq("esrd_number", esrdNumber); + } + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(card)){ + wrapper.eq("card", card); + } + if(StringUtils.isNotEmpty(patientName)){ + wrapper.like("patient_name", patientName); + } + wrapper.orderBy("create_time", false); + try { + Page ptList = patientService.selectPage(page.getPagePlusTwo(), wrapper); + if(ptList!=null){ + CustomPage customPage=new CustomPage(ptList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/PdfReaderController.java b/backend/src/main/java/com/imurs/controller/PdfReaderController.java new file mode 100644 index 0000000..3bfa16f --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/PdfReaderController.java @@ -0,0 +1,269 @@ +package com.imurs.controller; + + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.apache.pdfbox.pdfparser.PDFParser; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.util.PDFTextStripper; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +@RestController +@RequestMapping(value = "/pdfcontroller") +public class PdfReaderController { + + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + @RequestMapping(value = "/recpdf") + public Map saveImage(MultipartFile filelSavePath,String id) throws Exception { + InputStream is =filelSavePath.getInputStream(); + //Map json =ocrdemo.OcrRecognition(is); + + String s =getTextFromPdf (is,0,1 ) ;//0,1 没有用 + boolean IsAdmissionNote = s.contains("入院记录"); + boolean isBingChen = s.contains("病程记录"); + boolean isFirstBC =s.contains("首次病程"); + JSONObject json=null; + if(IsAdmissionNote&&"1".equals(id)){ + json=parseriuan(s);//入院记录 1 + } + else if(isBingChen&&isFirstBC&&"2".equals(id)){ + json=parsefirst(s);//第一次检查2 + } + else if(isBingChen&&!isFirstBC){ + json=parsebingchen(s);//日常检查3 + }else{ + return JSONObject.parseObject("not match"); + } + return json; + } + public String getTextFromPdf (InputStream filePath,int pageStartValue,int pageEndValue ) { + String result = null; + InputStream is = null; + PDDocument document = null; + try { + is = filePath; + PDFParser parser = new PDFParser(is); + parser.parse(); + document = parser.getPDDocument(); + PDFTextStripper stripper = new PDFTextStripper(); + /* stripper.setStartPage(0); + stripper.setEndPage(1);//设置解读页数 + */ + + result = stripper.getText(document); + } catch (IOException e1) { + e1.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (document != null) { + try { + document.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public JSONObject parseriuan(String s){ + Map map = new HashMap(); + int i=s.indexOf("姓名:"); + int j=s.indexOf("性别:"); + String name=s.substring(i+3, j); + int s1=s.indexOf("科室:"); + String sex=s.substring(j+3, s1); + int depn =s.indexOf("住院号:"); + int cw= s.indexOf("床位:"); + String dept =s.substring(s1+3, depn); + String deptNo =s.substring(depn+4, cw);//住院号 + //System.out.println(deptNo); + //籍贯 + int jg =s.indexOf("籍 贯:"); + int jg1 = s.indexOf("性 别:",j); + //String Birthplace=s.substring(jg+3, jg1); + //System.out.println(s); + String Birthplace=s.substring(jg+10,jg1);//籍 贯 + + int c1 = s.indexOf("住 址:"); + int c2 =s.indexOf("民 族: "); + String ptCity =s.substring(c1+10,c2); + int hd=s.indexOf("入院日期:"); + int age =s.indexOf("年 龄:"); + String mj = s.substring(c2+10,hd);//民 族 + String nuh_time=s.substring(hd+6,age);//入院日期 + + int hd1=s.indexOf("记录日期:"); + int mj1=s.indexOf("职 业:"); + String agen = s.substring(age+10, hd1); + String date=s.substring(hd1+6, mj1);//记录日期 + int bs=s.indexOf("病史陈述者:"); + String major= s.substring(mj1+10,bs);//职 业 + int mar=s.indexOf("婚 否:"); + String ismarry =s.substring(bs+7, mar);// + + int ke =s.indexOf("可靠程度:"); + String ismar =s.substring(mar+10, ke); + int com =s.indexOf("主诉:"); + String c=s.substring(ke+5, com);//可靠程度 + + int pre=s.indexOf("现病史:"); + String complain=s.substring(com+4, pre);//主诉 + int pas =s.indexOf("既往史:"); + String present =s.substring(pre+4, pas);//现病史 + int gh=s.indexOf("个人史:"); + int yh=s.indexOf("月经史:"); + String past =s.substring(pas+4, gh); + String perhis =s.substring(gh+4, yh);//个人史 + int med=s.indexOf("婚育史:"); + int fah=s.indexOf("家族史:"); + String yueh=s.substring(yh+4, med);//月经史 + String medhis= s.substring(med+4, fah);//家族史 + + int geche =s.indexOf("体 格 检 查 "); + int zkq = s.indexOf("专科情况:"); + String fh=s.substring(fah+4, geche); + int jy= s.indexOf("靖远县", geche); + int cw2=s.indexOf("床位:",geche); + int fzjc = s.indexOf("辅助检查:"); + String specialistCase =s.substring(zkq+5, jy-6)+s.substring(cw2+5, fzjc).trim();//专科情况 + String gecheck =s.substring(geche+7, zkq); + int cyzd=s.indexOf("出院诊断:"); + String fzck =s.substring(fzjc+5, cyzd);//辅助检查 + int chubuzd =s.indexOf("初步诊断:"); + int dn =s.indexOf("医生签名:"); + int rz =s.indexOf("补充诊断:"); + int xz =s.indexOf("修正诊断:"); + String chzd=s.substring(cyzd+5, chubuzd);//出院诊断 + String initial =s.substring(chubuzd+5, dn);//初步诊断: + String docname=s.substring(dn+5, rz);//医生签名 + String buchzd=s.substring(rz+5,xz);//补充诊断 + String xiuzzd=s.substring(xz+5);//修正诊断: + map.put("ptName", name);//姓名 + map.put("ptSex", sex); + map.put("nuhSection", dept);//科室 + map.put("inpatient", deptNo);//住院号 + map.put("birthplace", Birthplace);//籍贯 + map.put("ptCity", ptCity);//住址 + map.put("nation", mj);//民族 + map.put("nuhTime", nuh_time);//入院日期 + map.put("age", agen);//年龄 + map.put("recordDate", date);//记录日期 + map.put("profession", major);//职业 + map.put("statement", ismarry);//病史陈述者 + map.put("marriage", ismar);//婚 否 + map.put("confidence", c);//可靠程度 + map.put("complain", complain);//主诉 + map.put("present", present);//现病史 + map.put("past", past);//既往史 + map.put("personalHistory", perhis);//个人史 + map.put("fh", fh);//家族史 + map.put("pmp", yueh);//月经史 + map.put("obstetricalHistory", medhis);//婚育史 + map.put("physicalExamination", gecheck);//体 格 检 查assistant examination + map.put("assistantExamination", fzck);//辅助检查 + map.put("finalDiagnosis", chzd);//出院诊断 initial + map.put("initial", initial);//初步诊断 + map.put("addDiagnosis", buchzd);//补充诊断 + map.put("correctingDiagnosis", xiuzzd);//修正诊断 + map.put("docName", docname);//医生签名 + map.put("specialistCase", specialistCase); + //System.out.println(map.toString()); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + return JSONObj; + } + public JSONObject parsebingchen(String s){//日常病程 + Map map = new HashMap(); + + //日常记录 + int n1=s.indexOf("姓名:"); + int n2=s.indexOf("性别:"); + int k1=s.indexOf("科室:"); + int k2 =s.indexOf("住院号:"); + int cw =s.indexOf("床位:"); + String name =s.substring(n1+3, n2); + String sex =s.substring(n2+3, k1); + String dept =s.substring(k1+3,k2); + String inpatient=s.substring(k2+4, cw); + //病程记录了啊 + int bc=s.indexOf("病 程 记 录",cw); + int dn1 =s.indexOf("医师签名:"); + //第一次病程记录 + String fbin=s.substring(bc+7, dn1); + //System.out.println("第一次"+fbin); + map.put("0", fbin); + int index=dn1; + int prindex=dn1; + int i=0; + String dari=null; + while((index=s.indexOf("医师签名:",index+1))!=-1){// + dari=s.substring(prindex, index);//上次的 + prindex=index;//上次的 + index = index + 5; + //System.out.println("888"+i++); + map.put(i+"", dari); + } + map.put("name", name); + map.put("sex", sex); + map.put("chamber", dept); + map.put("inpatient", inpatient); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + return JSONObj; + + } + //首次记录 + public JSONObject parsefirst(String s){ + //首次记录 + Map map = new HashMap(); + int n1=s.indexOf("姓名:"); + int n2=s.indexOf("性别:"); + int k1=s.indexOf("科室:"); + int k2 =s.indexOf("住院号:"); + int cw =s.indexOf("床位:"); + String name =s.substring(n1+3, n2); + String sex =s.substring(n2+3, k1); + String dept =s.substring(k1+3,k2); + String inpatient=s.substring(k2+4, cw); + // + int f= s.indexOf("首次病程"); + int bl =s.indexOf("病例特点"); + int cb =s.indexOf("初步诊断:"); + int zd= s.indexOf("诊断依据:"); + int jq= s.indexOf("鉴别诊断:"); + int pl= s.indexOf("诊疗计划:"); + int qm= s.indexOf("签名:"); + String fis=s.substring(f+4, bl); + map.put("fis", fis);// 首次病程 + map.put("name", name); + map.put("sex", sex); + map.put("nuhSection", dept); + map.put("inpatient", inpatient); + map.put("characteristic", s.substring(bl+5, cb));//病例特点 + map.put("initial", s.substring(cb+5, zd));//初步诊断 + map.put("dsm", s.substring(zd+5, jq));//诊断依据 + map.put("antidiastole", s.substring(jq+5, pl));//鉴别诊断 + map.put("assessandplan", s.substring(pl+5, qm));//诊疗计划 + //int + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + //System.out.println(map.toString()); + return JSONObj; + + } + +} diff --git a/backend/src/main/java/com/imurs/controller/RegisterController.java b/backend/src/main/java/com/imurs/controller/RegisterController.java new file mode 100644 index 0000000..7efea62 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/RegisterController.java @@ -0,0 +1,237 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.shiro.ShiroUtils; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.entity.Role; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationImgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.RoleService; +import com.imurs.service.TotalInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +import static com.imurs.shiro.ShiroUtils.generateSalt; + +/** + * 注册 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "register") +public class RegisterController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyInformationImgService applyInformationImgService; + @Autowired + UserService userService; + @Autowired + TotalInformationService totalInformationService; + @Autowired + RoleService roleService; + + private static String password = MsgCode.Password; + + private static String privateKey = MsgCode.privateKeyString; + + /** + * 新增基层医院申请信息 + */ + @RateLimiterAspect + @Transactional + @RequestMapping(value = "registerInfor") + public Map registerInfor(ApplyInformation applyInformation, String imgUrl2, String imgType) { + Map map = new HashMap(); + List imgList = new ArrayList(); + Role role = new Role(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + try { + String uuid=MD5.GetMD5Code(dateFormat.format(date)); + if (applyInformation != null) { + // 判断医院名字是否已经注册,如果已经注册就不能再注册 + Wrapper wrapper = new EntityWrapper() + .eq("hospital_name",applyInformation.getHospitalName()); + List informationList = applyInformationService.selectList(wrapper); + if (!informationList.isEmpty()) { + map.put("msg","5"); + return map; + } + role = roleService.selectById(applyInformation.getRid()); + if (role != null) { + applyInformation.setRpId(role.getRpId()); + } + // 医院id按照时间日期生成 + applyInformation.setId(uuid); + applyInformation.setAccount(uuid); + //9.16新增默认密码 前台默认不传 + /*if(!applyInformation.getPassword().isEmpty()&&applyInformation.getPassword()!=null){ + }*/ + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + applyInformation.setPassword(passwordEncoder.encode(password)); + //applyInformation.setPassword(MD5.GetMD5Code(applyInformation.getPassword())); + boolean result = applyInformationService.insert(applyInformation); + if (result == true) { + if (StringUtils.isNotEmpty(imgUrl2) && StringUtils.isNotEmpty(imgType)) { + String str[] = imgUrl2.split(","); + String str2[] = imgType.split(","); + for (int i = 0; i < str2.length; i++) { + ApplyInformationImg img = new ApplyInformationImg(); + img.setImgUrl(str[i]); + img.setImgType(Integer.valueOf(str2[i])); + img.setHospitalId(uuid); + imgList.add(img); + } + applyInformationImgService.insertBatch(imgList); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医生注册 + * + * @param user + * @return + */ + @RateLimiterAspect + @RequestMapping(value = "registerUser") + public Map insertUser(User user) { + Map map = new HashMap(); + Role role = new Role(); + try { + if (user != null && user.getRid() != null) { + // 如果该账号存在直接返回,不能继续注册 + Map existMap = selectPhone(user.getPhone()); + if (existMap.get("msg").equals("5")) { + map.put("msg","5"); + return map; + } + role = roleService.selectById(user.getRid()); + if (role != null) { + user.setRpId(role.getRpId()); + } + user.setContactPhone(user.getPhone()); + //9.16修改 + String password = RSAUtil.decrypt(user.getPassword(), privateKey); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + user.setPassword(passwordEncoder.encode(password)); + boolean result = userService.insert(user); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectPhone") + public Map selectPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + int count = userService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 判断当前联系手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectContactPhone") + public Map selectContactPhone(String contactPhone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("contact_phone", contactPhone); + try { + int count = userService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 获得手机号码的角色 + */ + @RequestMapping(value = "selectPhoneRid") + public Map selectPhoneRid(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + User user = userService.selectOne(wrapper); + map.put("msg", user == null ? "1003" :user.getRid()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 判断医联体负责人手机号码 + */ + @RequestMapping(value = "selectHospitalPhone") + public Map selectHospitalPhone(String deanPhone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("dean_phone", deanPhone); + try { + int count = applyInformationService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/SaveRecord.java b/backend/src/main/java/com/imurs/controller/SaveRecord.java new file mode 100644 index 0000000..e285af5 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SaveRecord.java @@ -0,0 +1,82 @@ +/*package com.imurs.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.exceptions.ServerException; +import com.aliyuncs.profile.DefaultProfile; +//import com.google.gson.Gson; +import com.aliyuncs.live.model.v20161101.RealTimeRecordCommandRequest; +import com.aliyuncs.live.model.v20161101.RealTimeRecordCommandResponse; +import com.imurs.parameter.Bcall; +import com.imurs.parameter.Socket; +@RestController +@RequestMapping(value="SaveRecord") +public class SaveRecord { + + @Autowired + private Socket socket; + + @RequestMapping(value="/call") + @ResponseBody + public Map userMenu(@RequestBody Bcall user){ + //录制视频时 我需要前端传我患者信息 方便保存 + Map map=new HashMap(); + // String app = request.getParameter("app"); + System.out.println("回调成功了吗"+user.getApp()+user.getUri()+"录制事件是否成功"+user.getEvent()+"录制 时长"+user.getDuration()); + try { + socket.sendMessage(user.getEvent()+":"+user.getUri()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //System.out.println("保存地址"+dualr.getUri()); + //System.out.println("保存时间"+dualr.getDuration()); + return map; + } + *//** + * 录音 + * @return + *//* + @RequestMapping(value="/video") + public Map video(String rpId){ + Map map=new HashMap(); + //String[] str=null; + DefaultProfile profile = DefaultProfile.getProfile("cn-shenzhen", "LTAIvXeYf3fuMvDZ", "GGRbUL2hNdZBPWnGh0xkkwtQgqN7Yq"); + IAcsClient client = new DefaultAcsClient(profile); + + RealTimeRecordCommandRequest request = new RealTimeRecordCommandRequest(); + request.setRegionId("cn-shenzhen"); + request.setDomainName("yiduliveplay.jysmyy.com"); + request.setAppName("AppName"); + request.setStreamName("StreamName"); + request.setCommand(rpId);//start + // System.out.println("自动录制"); + //调用AddLiveAppRecordConfig接口配置录制规则。设置ondemand=7,表示推流后不自动录制。 + //推流 + //调用RealTimeRecordCommand接口启动录制。 + //(如果需要)调用RealTimeRecordCommand接口停止录制 + try { + RealTimeRecordCommandResponse response = client.getAcsResponse(request); + //System.out.println(new Gson().toJson(response)); + } catch (ServerException e) { + e.printStackTrace(); + } catch (ClientException e) { + //System.out.println("ErrCode:" + e.getErrCode()); + //System.out.println("ErrMsg:" + e.getErrMsg()); + //System.out.println("RequestId:" + e.getRequestId()); + map.put("ErrMsg:", e.getErrMsg()); + } + + return map; + } +} +*/ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/controller/SectionController.java b/backend/src/main/java/com/imurs/controller/SectionController.java new file mode 100644 index 0000000..dd76690 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SectionController.java @@ -0,0 +1,160 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.Section; +import com.imurs.service.SectionService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 科室管理 + * @author Server + * + */ +@RestController +@RequestMapping(value="section") +public class SectionController { + + @Autowired + SectionService sectionService; + + + /** + * 新增科室 + * @param section + * @return + */ + @RequestMapping(value="insertSection") + public Map insertSection(Section section){ + Map map=new HashMap(); + try { + boolean result=sectionService.insert(section); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改科室 + * @param section + * @return + */ + @RequestMapping(value="updateSection") + public Map updateSection(Section section){ + Map map=new HashMap(); + try { + boolean result=sectionService.updateById(section); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除科室 + * @param section + * @return + */ + @RequestMapping(value="deleteSection") + public Map updateSection(Long id){ + Map map=new HashMap(); + try { + boolean result=sectionService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前科室是否存在 + */ + @RequestMapping(value="selectSectionByName") + public Map updateSection(String seName,String hospitalId){ + Map map=new HashMap(); + EntityWrapper
wrapper=new EntityWrapper
(); + wrapper.eq("se_name", seName).eq("hospital_id", hospitalId); + try { + int count=sectionService.selectCount(wrapper); + map.put("msg",count); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询当前医院下面的所有科室名称 + */ + @RequestMapping(value="selectSectionById") + public Map selectSectionById(String hospitalId){ + Map map=new HashMap(); + EntityWrapper
wrapper=new EntityWrapper
(); + wrapper.setSqlSelect("se_name as seName").eq("hospital_id", hospitalId); + wrapper.orderBy("if(se_name='超声科',0,1),if(se_name='信息科',0,1)," + + "if(se_name='外科',0,1),if(se_name='内科',0,1)"); + try { + List
stList=sectionService.selectList(wrapper); + map.put("stList",stList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("hospital_id"); + } + return map; + } + + + + + /** + * 科室列表分页 + */ + @RequestMapping(value="selectSectionPage") + public Map selectSectionPage(String hospitalId,Integer pageNo,Integer pageSize,String seName){ + Map map=new HashMap(); + EntityWrapper
wrapper=new EntityWrapper
(); + wrapper.eq("hospital_id", hospitalId); + if(StringUtils.isNotEmpty(seName)){ + wrapper.like("se_name", seName); + } + wrapper.orderBy("create_time,id",false); + FrontPage
page=new FrontPage
(); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?6:pageSize); + try { + Page
pageList=sectionService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage
customPage=new CustomPage
(pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/SendMsgController.java b/backend/src/main/java/com/imurs/controller/SendMsgController.java new file mode 100644 index 0000000..344d8e8 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SendMsgController.java @@ -0,0 +1,113 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; +import net.sf.json.JSONObject; + +/** + * 短信发送 + * + * @author dgg + * + */ +@RestController +@RequestMapping(value = "send") +public class SendMsgController { + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + UserService userService; + + /** + * 忘记密码、修改密码 + */ + @RateLimiterAspect + @RequestMapping("/forgetPwd") + public Map forgetPwd(String phone, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + // 根据ip来限制访问次数,防止恶意攻击 + String ipAddress = "forgetPwd" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ipAddress,10)) { + map.put("msg", "您好,您正在修改密码,本次验证码为:"+flag+",验证码1分钟内有效,过时需要重新获取。如非本人操作,请勿理会。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "2"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(60); + resultMap.put("msg", "1"); + } else { + resultMap.put("msg","13"); + } + return resultMap; + } + + + /** + * 登录验证码 + */ + @RequestMapping("/loginCode") + public Map loginCode(String phone, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + map.put("msg", "您的短信验证码为"+flag+",请本人及时输入,切勿向他人泄漏。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "2"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(1 * 60); + resultMap.put("msg", "1"); + return resultMap; + } + + + + @RequestMapping("/checkmsg") + public Boolean checksms(String code, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Boolean flag = code.equals(session.getAttribute("xllmsg").toString()); + return flag; + + } +} diff --git a/backend/src/main/java/com/imurs/controller/SendNoteController.java b/backend/src/main/java/com/imurs/controller/SendNoteController.java new file mode 100644 index 0000000..fcb7098 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SendNoteController.java @@ -0,0 +1,139 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 短信验证码控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "note") +public class SendNoteController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + /** + * 获取短信验证码 + * @param phone + * @param request + * @return + * @throws Exception + */ + @RateLimiterAspect + @RequestMapping("/sendmsg") + public Map sendsms(HttpServletRequest request, String phone) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = 0; + flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + String ipAddress = "sendmsg" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ipAddress,10)) { + map.put("msg", "欢迎注册"+MsgCode.hospitalName+"分级诊疗平台,验证码是:"+ flag +", 1分钟内有效,过时需要重新获取。无需回复"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(1*60);//设置过期时间为1分钟 + resultMap.put("msg", "1"); + } else { + resultMap.put("msg","13"); + } + return resultMap; + } + + + /** + * 判断当前医生是否已经注册 + */ + @RequestMapping("selectUserPhone") + public Map selectUserPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + User user = userService.selectOne(wrapper); + map.put("msg", user == null ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前医院是否已经注册 + */ + @RequestMapping("selectHospitalName") + public Map selectHospitalName(String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("hospital_name", hospitalName); + try { + ApplyInformation infor = applyInformationService.selectOne(wrapper); + map.put("msg", infor == null ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断验证码是否正确 + * + * @param code + * @param request + * @return + * @throws Exception + */ + @RequestMapping("/checkmsg") + public Map checksms(String code, HttpServletRequest request) throws Exception { + Map map=new HashMap(); + HttpSession session = request.getSession(); + Boolean flag = code.equals(session.getAttribute("xllmsg").toString()); + if(flag){ + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/SendNoteJyController.java b/backend/src/main/java/com/imurs/controller/SendNoteJyController.java new file mode 100644 index 0000000..4bcc7a2 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SendNoteJyController.java @@ -0,0 +1,300 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.service.impl.UserServiceImpl; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 远程会诊 + * @author D140 + * + */ +@RestController +//@RequestMapping("jyNote") +public class SendNoteJyController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + + + /** + *远程病理通知/铱度 + */ + @RequestMapping("/sendPathologyYd") + public Map sendPathologyYd(String patientName,String docName, String chamber,String userName, + String phone, String hotName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",userName+"老师,您好!"+hotName+"的"+chamber+"科室"+docName+"专家为"+patientName+"患者发起远程病理的申请,请及时完成病理切割工作,谢谢。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 远程会诊分配成功/分配专家 + * 由基层上转给管理医院/分配专家/远程B超/远程心电/远程影像 + */ + @RequestMapping("/jyNote/sendSpeGenre") + public Map sendSpeGenre(String patientName,String docName,String phone, String hotName, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,医务科分配贵科负责首诊,请您尽快登录远程会诊平台进行会诊,谢谢!"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * + * @param docName 要发送的专家名字 + * @param seName 申请科室 + * @param applyDoc 申请医生 + * @param phone 要发送的手机号 + * @param applyDocPhone 申请医生电话 + * @return + */ + @RequestMapping("/jyNote/sendConsultationUrgent") + public Map sendConsultationUrgent(String docName,String seName,String applyDoc,String phone, + String applyDocPhone) { + Map resultMap = new HashMap<>(); + Map map = new HashMap<>(); + + map.put("account",MsgCode.ydAccount); + map.put("password", MsgCode.ydPassword); + map.put("phone", phone); + map.put("msg",docName + "医生,您好!" + seName + "的" + applyDoc + + "医生向您发起了紧急会诊视频申请,请尽快登录系统参与,谢谢!" + applyDoc + "医生联系电话:" + applyDocPhone); + + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.ydUrl,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 远程会诊分配成功/基层医生 + * 由基层上转给管理医院/基层医生/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendDocGenre") + public Map sendDocGenre(String patientName,String docName,String phone,String time, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"医生您好!您为"+patientName+"患者发起的"+genre+"会诊申请已经得到上级医院专家会诊同意,请在"+time+"时间准时登录远程会诊平台参加会诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 远程会诊分配成功/患者 + * 由基层上转给管理医院/患者/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendPtGenre") + public Map sendPtGenre(String patientName,String docName,String phone,String time, + String genre,String hotName,String applyDoc,String hname,String chamber,String appHotName, + String appDocName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",patientName+",您好!"+hotName+"的"+applyDoc+"医生为您发起的"+genre+"会诊申请已经通过审核," + + "接诊医生是"+hname+""+chamber+"的"+docName+"医生,请在"+time+"时间准时到"+appHotName+"的"+appDocName+"医生办公室参加会诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 会诊完成/基层医生 + * 由基层上转给管理医院/基层医生/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendDocGenreDone") + public Map sendDocGenreDone(String patientName,String docName,String phone, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"医生您好!您为"+patientName+"患者发起的"+genre+"会诊申请已经得到上级医院专家的回复,请您登录平台查看参考意见!"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 基层兵团医院申请远程超声时发送的短信 + * @param patientName 患者姓名 + * @param hotName 兵团医院名称 + * @param genre 会诊的名称 + * @return + * @throws Exception + */ + @RequestMapping("/jyNote/sendAdminGenre") + public Map sendAdminGenre(String patientName,String hotName,String genre, + String doctorName,String docPhone) throws Exception { + Map resultMap = new HashMap<>(); + + Map noteMap = new HashMap<>(); + noteMap.put("account",MsgCode.account); + noteMap.put("password", MsgCode.password); + + noteMap.put("msg",doctorName+"医生您好!"+hotName+"为患者"+patientName+"发起一例"+genre+"会诊申请,请协助安排专家上线会诊,谢谢!"); + noteMap.put("phone", docPhone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(noteMap)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!"0".equals(jsStr.getString("code"))) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + /** + * 远程会诊申请/管理医院(管理员) + * 由基层上转给管理医院/管理医院(管理员)/远程B超/远程心电/远程影像 + */ + @RequestMapping("/jyNote/sendConsultation") + public Map sendConsultation(String fid,String hotName,String patientName,String genre,String groupChamber){ + Map resultMap = new HashMap(); + if (fid != null) { + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation applyInformation=applyInformationService.selectOne(wrapper); + EntityWrapper wrapper1=new EntityWrapper(); + wrapper1.eq("hospital_id", fid).eq("se_name", groupChamber).eq("rid", 2); + User user = userService.selectOne(wrapper1); + if (user != null) { + Map map = new HashMap(); + String contactPhone = user.getContactPhone(); + String userName = user.getUserName(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + map.put("msg", userName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,请尽快安排专家进行会诊,谢谢!"); + map.put("phone",user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else { + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + map.put("msg", applyInformation.getChamberName()+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,请尽快安排专家进行会诊,谢谢!"); + map.put("phone",applyInformation.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + } + }else{ + resultMap.put("msg", "9"); + } + + return resultMap; + } + + /** + * 基层医院撤销远程会诊超声时发送的短信 + * @param patientName 患者姓名 + * @param hotName 医院名称 + * @param genre 会诊的名称 + * @param doctorName 医生姓名 + * @param docPhone 发送短信者号码 + * @return + * @throws Exception + */ + @RequestMapping("/GsNote/sendUndoGenre") + public Map sendUndoGenre(String patientName,String hotName,String genre, + String doctorName,String docPhone) throws Exception { + Map resultMap = new HashMap<>(); + + Map noteMap = new HashMap<>(); + noteMap.put("account",MsgCode.account); + noteMap.put("password", MsgCode.password); + + noteMap.put("msg",doctorName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,已撤销,谢谢! "); + noteMap.put("phone", docPhone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(noteMap)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!"0".equals(jsStr.getString("code"))) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } +} diff --git a/backend/src/main/java/com/imurs/controller/SendNoteMsgController.java b/backend/src/main/java/com/imurs/controller/SendNoteMsgController.java new file mode 100644 index 0000000..0bb6a35 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SendNoteMsgController.java @@ -0,0 +1,265 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 双向转诊 + * @author D140 + * + */ +@RestController +@RequestMapping("jyNoteTest") +public class SendNoteMsgController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + + + /** + * 由下转上/提交转诊/管理员 + */ + @RequestMapping("/sendAdminCase") + public Map sendAdminCase(String patientName, String hotName,String applyDoc, + String ptPhone,Long fid) throws Exception { + Map resultMap = new HashMap(); + if(fid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + if(infor!=null){ + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",infor.getChamberName()+"老师,您好!"+hotName+"的"+applyDoc+"医生,向您发起了一例转诊申请,患者姓名:"+patientName+";患者联系电话:"+ptPhone+",请及时处理。"); + map.put("phone", infor.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + + /** + * 由下转上/转诊成功/基层医生 + */ + @RequestMapping("/sendDocCase") + public Map sendDocCase(String patientName,String docName,String hotName,String applyDoc, + String chamber,String time,Long applyUserId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + if(applyUserId!=null){ + User user=userService.selectById(applyUserId); + if(user!=null){ + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",applyDoc+"医生,您好!您为"+patientName+"患者发起的转诊申请已经接收。接诊科室:"+chamber+";接诊医师:"+docName+",接诊时间:" + +time+",请通知患者携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由下转上/转诊成功/患者 + * docName:患者 + */ + @RequestMapping("/sendPtCase") + public Map sendPtCase(String ptName,String phone, String hotName,String applyDoc, + String chamber,String time,String hospitalName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",ptName+",您好!"+hospitalName+"的"+applyDoc+"医生为您发起的转诊申请已经通过审核,接诊科室:"+chamber+";接诊时间:" + +time+",请携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 由下转上/转诊成功/专家 + */ + @RequestMapping("/sendSpeCase") + public Map sendSpeCase(String docName,String phone, String hotName, + String patientName,Long fid) throws Exception { + String applyDoc=""; + String applyDocPhone=""; + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + if(fid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation infro=applyInformationService.selectOne(wrapper); + if(infro!=null){ + applyDoc=infro.getChamberName(); + applyDocPhone=infro.getChamberPhone(); + } + } + map.put("msg",docName+"医生,您好!"+hotName+"通过医务科转诊"+patientName+"患者,请贵科室接待首诊,谢谢!医务科"+applyDoc+",联系电话:"+applyDocPhone); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 由上到下/转诊申请/基层医院 + * fid:管理医院id + * jid:基层医院id + */ + @RequestMapping("/sendHotNameCaseBelow") + public Map sendHotNameCaseBelow(String applyDoc,String hotName, + String chamber,String patientName,Long fid,Long jid) throws Exception { + Map resultMap = new HashMap(); + String adminDoc=""; + String adminDocPhone=""; + if(fid!=null && jid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", jid); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + if(infor!=null){ + + EntityWrapper wrapper2=new EntityWrapper(); + wrapper2.eq("id", fid); + ApplyInformation infor2=applyInformationService.selectOne(wrapper2); + if(infor2!=null){ + adminDoc=infor2.getChamberName(); + adminDocPhone=infor2.getChamberPhone(); + } + + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",infor.getChamberName()+"医生,您好!"+hotName+""+chamber+"的"+applyDoc+"医生为"+patientName+"患者发起转诊,请您登录远程会诊平台接收!医务科"+adminDoc+",联系电话:"+adminDocPhone); + map.put("phone", infor.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + } + + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由上到下/转诊成功/临床医生 + */ + @RequestMapping("/sendDocCaseBelow") + public Map sendDocCaseBelow(String hotName,String patientName,Long applyUserId) throws Exception { + Map resultMap = new HashMap(); + if(applyUserId!=null){ + User user=userService.selectById(applyUserId); + if(user!=null){ + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",user.getUserName()+"医生,您好!您为"+patientName+"患者发起的转诊,"+hotName+"已经接收,请提醒病人尽快去基层医院就诊,同时为病人开出院医嘱。谢谢!"); + map.put("phone", user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由上到下/转诊成功/患者 + */ + @RequestMapping("/sendPtCaseBelow") + public Map sendPtCaseBelow(String docName,String phone,String hotName,String applyDoc, + String chamber,String patientName,String appHotName,String time) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",patientName+",您好!"+appHotName+""+chamber+"的"+applyDoc+"医生为您发起的转诊申请已经通过审核," + + "接收医院:"+hotName+";接诊医师:"+docName+",接诊时间:"+time+",请携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/SvsController.java b/backend/src/main/java/com/imurs/controller/SvsController.java new file mode 100644 index 0000000..f3c4fdf --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SvsController.java @@ -0,0 +1,79 @@ +package com.imurs.controller; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping(value="SVS") +public class SvsController { + private static String isSucess = null; + @RequestMapping(value ="splitsvs") + public String splitsvs(String imgurl) throws InterruptedException { + Map map = new HashMap(); + + + //Get the result produced by executing the above commands + excuteAsync(imgurl); + return "ok"; + } + @Async + public String excuteAsync(String imgurl){ + // do something; + // final String isSucess=""; + Timer timer = new Timer();// 实例化Timer类 + timer.schedule(new TimerTask() { + public void run() { + //System.out.println("退出"); + try { + isSucess=parseSvs(imgurl); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.cancel(); + } + }, 1000);// 这里百毫秒 + return isSucess; + + } + public String parseSvs(String imgurl) throws InterruptedException{ + //String t = imgurl; + //System.out.println("dizi..."+imgurl); + String[] args1=new String[]{"python","/usr/svs/3.py",imgurl}; + //Create a Process instance and execute commands + Process pr; + try { + pr = Runtime.getRuntime().exec(args1); + BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); + String line = null; + String result = ""; + while ((line = in.readLine()) != null) + { + result += line + "\r\n"; + } + // System.out.println("什么结果"+result); + + in.close(); + int endFlag = pr.waitFor(); + if (endFlag == 0) + { + //System.out.println("The process is ended normally."); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ""; + + } +} diff --git a/backend/src/main/java/com/imurs/controller/SysMenuController.java b/backend/src/main/java/com/imurs/controller/SysMenuController.java new file mode 100644 index 0000000..0c4c358 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/SysMenuController.java @@ -0,0 +1,149 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.SysMenu; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; +import com.imurs.service.SysMenuService; + +@RestController +@RequestMapping(value="menu") +public class SysMenuController { + + @Autowired + SysMenuService sysMenuService; + + + /** + * 查询当前登录的用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/userMenu") + public Map userMenu(String rpId,Long rid){ + Map map=new HashMap(); + String[] str=null; + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + try { + if(StringUtils.isNotEmpty(rpId)){ + str=rpId.split(","); + for (int i = 0; i < str.length; i++) { + if(str.length-i==1){ + wrapper.eq("id", str[i]).eq("rid", rid); + }else{ + wrapper.eq("id", str[i]).eq("rid", rid).or(); + } + } + smList=sysMenuService.selectList(wrapper); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).collect(Collectors.toList()); + Set set=new HashSet(tableNames); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : set) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + }else{ + map.put("msg", "3"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "2"); + } + return map; + } + /** + * 查询rid用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/ridMenu") + public Map ridMenu(Long rid){ + Map map=new HashMap(); + + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + wrapper.eq("rid", rid).eq("menu_state",1); + + + + smList=sysMenuService.selectList(wrapper); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).collect(Collectors.toList()); + Set set=new HashSet(tableNames); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : set) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setId(s.getId()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + } + + + return map; + } + /** + * 修改用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/updateMenu") + public Map updateMenu(Long rid,Integer menuState){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", rid); + SysMenu s= new SysMenu(); + s.setMenuState(menuState); + Boolean result=sysMenuService.update(s, wrapper); + map.put("msg", result ? "1" : "2"); + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/Tessocr.java b/backend/src/main/java/com/imurs/controller/Tessocr.java new file mode 100644 index 0000000..cd1969c --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/Tessocr.java @@ -0,0 +1,120 @@ +package com.imurs.controller; + +import java.awt.image.BufferedImage; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +import javax.imageio.ImageIO; + +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.imurs.ocr.AuthService; +import com.imurs.ocr.Base64Util; +import com.imurs.ocr.HttpUtil; + + +@RestController +@RequestMapping(value="tess") +public class Tessocr { + @RequestMapping(value ="splitocr") + public Map splitsvs(MultipartFile filelSavePath) throws InterruptedException, IOException { + InputStream is =filelSavePath.getInputStream(); + BufferedImage image=(BufferedImage)ImageIO.read(is); + BufferedImage newImg= image.getSubimage(0, 300, 97, 28);//大图坐标15, 600, 222, 50//小图坐标3, 279, 97, 47 + //转成字节流 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + try { + ImageIO.write(newImg, "jpg", out); + } catch (IOException e) { + //log.error(e.getMessage()); + } + byte[] simgdata= out.toByteArray(); + Map map= generalBasic(simgdata); + return map; + //Map map = new HashMap(); + //图片放大2倍后处理 + + +} + public static Map generalBasic(byte[] simgdata) { + // 请求url + Map map = new HashMap(); + // String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"; + String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting"; + try { + byte[] imgData = simgdata;//FileUtil.readFileByBytes(filePath); + String imgStr = Base64Util.encode(imgData); + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + // + String param = "image=" + imgParam+"&language_type=ENG"; + AuthService as = new AuthService();//V93fFRRnuNU1Ymr8Q0Fg3g8G Dvx22p8j3xAL95waXKfWOseLtpIu1EvZ + String accessToken = as.getAuth("SGzN5e2ZbGRMEaIhNe40sVxU","h4DsOUieXpKfvyXf6vWvRNx4qqWSX1Pl"); + String result = HttpUtil.post(url, accessToken, param); + //System.out.println(result); + //result json数组取出c/a + JSONObject jsonObject = JSON.parseObject(result); + //System.out.println("2"+jsonObject.toString()); + if(jsonObject.get("error_code") != null){ + return (Map) map.put("errorCode", "0"); + } + JSONArray jsonArray = jsonObject.getJSONArray("words_result"); + //System.out.println("识别结果"+jsonArray);//错误识别 + int size = jsonArray.size(); + String jsonObject3 = null; + /* for(int i=0;i selectTotalInformationAll(TotalInformation totalInformation,ApplyInformation apyInformation) { + Map map = new HashMap(); + Map map1 = new HashMap(); + Map map2 = new HashMap(); + Map map3 = new HashMap(); + Map map4 = new HashMap(); + + + DoctorArrange doctorArrangeTotaNumDay =new DoctorArrange(); + TotalInformation totInformation=new TotalInformation(); + TotalTraining totalTraining=new TotalTraining(); + TotalInformation informationTotal=new TotalInformation(); + List doctorArrangeList =new ArrayList(); + List doctorArrangeListNumber=new ArrayList(); + List totalInformationList=new ArrayList(); + + Set numbers = new HashSet<>(); + + int inspect = 0; + int newprojectNum = 0; + int adp=0; + int totalTopicNum=0; + int conNumber = 0; + boolean flag; + String workType; + String[] str; + try { + /** + * 查找所有通过审核的医院 + */ + map1.put("state","1"); + map1.put("rid",totalInformation.getType()); + List applyInformationlList = applyInformationService.selectByMap(map1); + map1.clear(); + + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + map1.put("status", "Y"); + map1.put("receive_hospital_id",applyInformation.getId()); + //wrapperB.eq("type", totalInformation.getType()); + doctorArrangeList = doctorArrangeService.selectByMap(map1); + map1.clear(); + + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + workType = doctorArrange.getDevelopWork(); + str = workType.split("、"); + flag= Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + workType = doctorArrange.getArrangeChamber(); + str = workType.split("、"); + for(int i = 0;i wrapperC = new EntityWrapper(); + wrapperC.eq("hospital_id", applyInformation.getId()); + adp = applyDoctorPromoteService.selectCount(wrapperC); //进修人数 + + //map1.put("type", totalInformation.getType()); + map1.put("basicsHospitalId", applyInformation.getId()); + doctorArrangeTotaNumDay = doctorArrangeService.selectTotanumberDay(map1);//总人数 总服务天数 + map1.clear(); + + + map2.put("hospitalId", applyInformation.getId()); + totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + map2.clear(); + //if(!StringUtils.isEmpty(applyInformation.getId())){ + // wrapperA.eq("id", apyInformation.getId()); + //} + //ApplyInformation applyInformationl1 = applyInformationService.selectOne(wrapperA);//根据Id查找医院 + + EntityWrapper wrappeOne = new EntityWrapper(); + wrappeOne.eq("hospital_id", applyInformation.getId()); + totInformation = totalInformationService.selectOne(wrappeOne);//查询本条数据 + if(inspect>0){ + totInformation.setMedicalNumber(Long.valueOf(inspect));//医疗质量控制检查 + }else{ + totInformation.setMedicalNumber(0l);//医疗质量控制检查 + } + + numbers = new HashSet<>(listChamber); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + //合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null){ + if(2==applyInformation.getCoOp()){ + totInformation.setCoLoose(1);//合作模式 1:相对松散型 + totInformation.setCoTension(0); + }else if(1==applyInformation.getCoOp()){ + totInformation.setCoTension(1);//合作模式 1:相对紧密型 + totInformation.setCoLoose(0); + } + } + //帮扶协议 1:是 2:否 + if(applyInformation.getHelpProtocol()!=null){ + if(2==applyInformation.getHelpProtocol()){ + totInformation.setHelpProtocol(0);//totInformation表 帮扶协议 1:是0:否 + totInformation.setCoTension(0); + }else if(1==applyInformation.getHelpProtocol()){ + totInformation.setHelpProtocol(1);//totInformation表 帮扶协议 1:是0:否 + } + } + totInformation.setUpArrangeNumber(adp==0?0:Long.valueOf(adp));//进修培训安排人数 + totInformation.setCooperationTime(applyInformation.getSetupTime());//签约时间 + if(doctorArrangeTotaNumDay!=null){ + if(doctorArrangeTotaNumDay.getDocId()!=null){ + totInformation.setBelowArrangeNumber(doctorArrangeTotaNumDay.getDocId());//排班下派总人数 + }else{ + totInformation.setBelowArrangeNumber(0L); + } + if(doctorArrangeTotaNumDay.getDay()!=null){ + totInformation.setServeDay(Long.valueOf(doctorArrangeTotaNumDay.getDay()));//总服务天数 + }else{ + totInformation.setServeDay(0L); + } + } + if(totalTraining!=null){ + totInformation.setSubjectNumber(totalTraining.getTrainingId()); + if(totalTraining.getNumber()!=null){ + totInformation.setTrainingNumber(Long.valueOf(totalTraining.getNumber()));//培训人次 + }else{ + totInformation.setTrainingNumber(0L); + } + + } + + +// EntityWrapper wrapperApplyCaseA = new EntityWrapper(); +// EntityWrapper wrapperApplyCaseB = new EntityWrapper(); +// wrapperApplyCaseA.eq("hospital_id", applyInformation.getId()); +// wrapperApplyCaseA.in("statu", "4,5,6"); +// +// wrapperApplyCaseB.eq("plan_hospital_id", applyInformation.getId()); +// wrapperApplyCaseB.in("statu", "4,5,6"); +// wrapperApplyCaseB.eq("type", "B"); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + + EntityWrapper applyConsultation = new EntityWrapper(); + applyConsultation.eq("category_hospital_id", applyInformation.getId()); + applyConsultation.eq("status", "3"); + conNumber = applyConsultationService.selectCount(applyConsultation); + + totInformation.setConsulNumber(Long.valueOf(conNumber));//开展远程诊疗人次 + totInformation.setHospitalName(applyInformation.getHospitalName()); + totInformation.setType(applyInformation.getRid().intValue()); + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + workType = applyInformation.getCoOpExplain(); + str = workType.split(","); + for(int i = 0;i wrapperHospitalId = new EntityWrapper(); +// wrapperHospitalId.eq("hospital_id", applyInformation.getId()); + totalInformationService.update(totInformation, wrappeOne); + } + + + + map3.put("type", totalInformation.getType()); + doctorArrangeListNumber = doctorArrangeService.selectTotaDay(map3); + map.put("doctorNumber",doctorArrangeListNumber.size());//派驻医疗人员 + + totalTopicNum = trainingService.selectCount(null); + map.put("totalTopicNum", totalTopicNum);//总课题数 + + map1.put("type", totalInformation.getType());//所有医院 + totalInformationList = totalInformationService.selectByMap(map1); + map1.clear(); + map.put("totalInformationList", totalInformationList); + + + map4.put("type", totalInformation.getType()); + if(totalInformation.getType()!=null){ + informationTotal = totalInformationService.totaTotalInformation(map4); + map.put("informationTotal", informationTotal); + } + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 基层医院 合作类型汇总表 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "selectBasicTotalInformation") + public Map selectBasicTotalInformation(TotalInformation totalInformation) { + Map map = new HashMap(); + Map map1 = new HashMap(); + + EntityWrapper wrapperC = new EntityWrapper(); + EntityWrapper wrapper1 = new EntityWrapper(); + EntityWrapper wrapper = new EntityWrapper(); + + List listChamber = new ArrayList(); + + boolean flag; + String workType; + String[] str; + try { + wrapper1.eq("id", totalInformation.getHospitalId()); + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper1); + + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + map1.put("status", "Y"); + map1.put("receive_hospital_id", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectByMap(map1); + map1.clear(); + + int inspect = 0; + int newprojectNum = 0; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + workType = doctorArrange.getDevelopWork(); + str= workType.split("、"); + flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + workType = doctorArrange.getArrangeChamber(); + str = workType.split("、"); + for(int i = 0;i0){ + totInformation.setMedicalNumber(Long.valueOf(inspect));//医疗质量控制检查 + } + Set numbers = new HashSet<>(listChamber); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + //合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null){ + if(2==applyInformation.getCoOp()){ + totInformation.setCoLoose(1);//合作模式 1:相对松散型 + totInformation.setCoTension(0); + }else if(1==applyInformation.getCoOp()){ + totInformation.setCoTension(1);//合作模式 1:相对紧密型 + totInformation.setCoLoose(0); + } + } + totInformation.setHelpProtocol(applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + totInformation.setUpArrangeNumber(Long.valueOf(adp));//进修培训安排人数 + totInformation.setCooperationTime(applyInformation.getSetupTime());//签约时间 + if(doctorArrangeTotaNumDay!=null){ + if(doctorArrangeTotaNumDay.getDocId()!=null){ + totInformation.setBelowArrangeNumber(doctorArrangeTotaNumDay.getDocId());//排班下派总人数 + }else{ + totInformation.setBelowArrangeNumber(0L); + } + if(doctorArrangeTotaNumDay.getDay()!=null){ + totInformation.setServeDay(Long.valueOf(doctorArrangeTotaNumDay.getDay()));//总服务天数 + }else{ + totInformation.setServeDay(0L); + } + } + if(totalTraining!=null){ + totInformation.setSubjectNumber(totalTraining.getTrainingId()); + if(totalTraining.getNumber()!=null){ + totInformation.setTrainingNumber(Long.valueOf(totalTraining.getNumber()));//培训人次 + }else{ + totInformation.setTrainingNumber(0L); + } + + } + int csUp = 0,csDo = 0,conNumber = 0; + EntityWrapper wrapperApplyCaseA = new EntityWrapper(); + EntityWrapper wrapperApplyCaseB = new EntityWrapper(); + wrapperApplyCaseA.eq("hospital_id", applyInformation.getId()); + wrapperApplyCaseA.in("statu", "4,5,6"); + wrapperApplyCaseB.eq("plan_hospital_id", applyInformation.getId()); + wrapperApplyCaseB.in("statu", "4,5,6"); + wrapperApplyCaseB.eq("type", "B"); + csUp = applyCaseService.selectCount(wrapperApplyCaseA); + csDo = applyCaseService.selectCount(wrapperApplyCaseB); + if(csDo>0){ + totInformation.setCaseDownNumber(Long.valueOf(csDo));//双向转诊向上人次 + } + if(csUp>0){ + totInformation.setCaseUpwardNumber(Long.valueOf(csUp));//双向转诊向下人次 + } + + + EntityWrapper applyConsultation = new EntityWrapper(); + applyConsultation.eq("category_hospital_id", applyInformation.getId()); + applyConsultation.eq("status", "3"); + conNumber = applyConsultationService.selectCount(applyConsultation); + totInformation.setConsulNumber(Long.valueOf(conNumber));//开展远程诊疗人次 + + totInformation.setHospitalName(applyInformation.getHospitalName()); + totInformation.setType(applyInformation.getRid().intValue()); + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + workType = applyInformation.getCoOpExplain(); + str = workType.split(","); + for(int i = 0;i wrapperHospitalId = new EntityWrapper(); + wrapperHospitalId.eq("hospital_id", applyInformation.getId());*/ + totalInformationService.updateById(totInformation); + + + /*Map map3 = new HashMap(); + map3.put("type", totalInformation.getType()); + List doctorArrangeListNumber = doctorArrangeService.selectTotaDay(map); + map.put("doctorNumber",doctorArrangeListNumber.size());//派驻医疗人员 + + int totalTopicNum = trainingService.selectCount(null); + map.put("totalTopicNum", totalTopicNum);//总课题数 + + wrapper.eq("type", totalInformation.getType());//所有医院 + List totalInformationList = totalInformationService.selectList(wrapper); + map.put("totalInformationList", totalInformationList); +*/ + //TotalInformation informationTotal = totalInformationService.selectOne(wrapper); + map.put("informationTotal", totInformation); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 查询市直医院医联体建设情况汇总表 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "selectSumMedicalAssociation", method = RequestMethod.POST) + @ResponseBody public Map selectSumMedicalAssociation(@RequestParam Map params)throws Exception { + Map map = new HashMap(); + + /** + * + */ + + String startTime =params.get("startTime"); + String endTime =params.get("endTime"); + String hospitalName =params.get("hospitalName"); + String rid = params.get("type"); + Map doctorArrangmap = new HashMap(); + //doctorArrangmap.put("type", '3');//医连体类型 + doctorArrangmap.put("start_time", startTime); + doctorArrangmap.put("end_time", endTime); + int totalDoctorNumber = doctorArrangeService.selectdoctorTotaDay(doctorArrangmap);//派驻医疗人员总数// + //TrainingWrapper.eq("create_time", applyInformation.getId()); + Map totalTopicNumMap = new HashMap(); + totalTopicNumMap.put("start_time", startTime); + totalTopicNumMap.put("end_time", endTime); + //int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);// + int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);//直接从Total_train 查train id + //map.put("totalTopicNum", totalTopicNum);//总课题数 + //通过医院名字找到医院ID + Map InfromationMap = new HashMap(); + InfromationMap.put("rid", rid); + //InfromationMap.put("start", 1);//分页 + //InfromationMap.put("end", 5); + if(StringUtils.isNotEmpty(hospitalName)){ + //applyInformatioWrapper.eq("hospital_name", hospitalName); + InfromationMap.put("hospital_name", hospitalName); + } + + List applyInformationlList = applyInformationService.selectInfromationList(InfromationMap); + List> list2=new ArrayList>(); + + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + List listTechnique = new ArrayList(); + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + //时间判断, + Map doctorArrang = new HashMap(); + doctorArrang.put("start_time", startTime); + doctorArrang.put("end_time", endTime); + doctorArrang.put("hosptialId", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectDoctorArrangeList(doctorArrang); + int inspect = 0; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + String workType = doctorArrange.getDevelopWork(); + String str[] = workType.split("、"); + boolean flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + String arrnge = doctorArrange.getArrangeChamber(); + String str3[] = arrnge.split("、"); + for(int i = 0;i refresherNumerMap = new HashMap(); + refresherNumerMap.put("start_time", startTime); + refresherNumerMap.put("end_time", endTime); + refresherNumerMap.put("hosptialId", applyInformation.getId()); + //refresherNumerMap.put("type", applyInformation.);进修学习类型 + int adp = applyDoctorPromoteService.selectrefresherCount(refresherNumerMap); //进修人数 + Map map1 = new HashMap(); + //map1.put("type", totalInformation.getType()); + map1.put("receive_hospital_id", applyInformation.getId()); + map1.put("start_time", startTime); + map1.put("end_time", endTime); + //单家派驻医疗人数数 服务天数 ?? 真是奇怪?非得将医院ID + Map doctorArrangemap = doctorArrangeService.selectAccreditedMedicalNumber(map1); + //测试 + //System.out.println("查询到的数据"+maptest); + //System.out.println("单家派驻医疗人数"+doctorArrangeTotaNumDay.toString()); + //专题讲座人/次 课题数 + Map map2 = new HashMap(); + map2.put("hospital_id", applyInformation.getId()); + map2.put("start_time", startTime); + map2.put("end_time", endTime); + //TotalTraining totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + Map totalTraining = totalTrainingService.selectLectureTrainingAndNember(map2); + //双向转诊上转人次,下转人次 + Map UpWayReferralMap = new HashMap(); + UpWayReferralMap.put("hospital_id", applyInformation.getId()); + UpWayReferralMap.put("start_time", startTime);// + UpWayReferralMap.put("end_time", endTime); + int UpWayReferral = applyCaseService.selectUpWayReferralNumer(UpWayReferralMap); + Map DownWayReferralMap = new HashMap(); + DownWayReferralMap.put("plan_hospital_id", applyInformation.getId()); + DownWayReferralMap.put("start_time", startTime);//向下转诊 + DownWayReferralMap.put("end_time", endTime); + int DownWayReferral = applyCaseService.selectDownWayReferralNumer(DownWayReferralMap); + //开展远程诊疗 + Map ConsultationMap = new HashMap(); + ConsultationMap.put("category_hospital_id", applyInformation.getId()); + ConsultationMap.put("start_time", startTime);//远程会诊 + ConsultationMap.put("end_time", endTime); + int ConsultationSingleMap = applyConsultationService.selectConsultationNumer(ConsultationMap); + Map resultmap = new HashMap(); + //TotalInformation totInformation = new TotalInformation(); + resultmap.put("hospitalName", applyInformation.getHospitalName());//医院名字 + resultmap.put("medicalNumber", inspect);//医疗质量控制检查 + //totInformation.setMedicalNumber(Long.valueOf(inspect)); + Set numbers = new HashSet<>(listChamber);// + resultmap.put("juniorNumber", numbers.size());////支持专科建设 + //totInformation.setJuniorNumber(Long.valueOf(numbers.size())); + Set Techniquenumbers = new HashSet<>(listTechnique);// + resultmap.put("techniqueNumber", Techniquenumbers.size());//新技术新项目推广应用修改为不重复 + //totInformation.setTechniqueNumber(Long.valueOf(newprojectNum)); + //resultmap.put("coOp", applyInformation.getCoOp()==null?0:applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + + //totInformation.setCoOp(applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(2)){ + resultmap.put("coLoose", "1"); + } + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(1)){ + resultmap.put("coTension", "1"); + } + + resultmap.put("helpProtocol", applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + //totInformation.setHelpProtocol(applyInformation.getHelpProtocol());// + resultmap.put("upArrangeNumber", adp);//进修培训安排人数 + //totInformation.setUpArrangeNumber(Long.valueOf(adp));// + Date data= applyInformation.getSetupTime(); + String SetupTime=new SimpleDateFormat("yyyy-MM-dd").format(data); + resultmap.put("cooperationTime", SetupTime);//签约时间 + + + //totInformation.setCooperationTime(); + //Object talId = doctorArrangemap.get("talId"); + //Object tatolDay= doctorArrangemap.get("tatolDay"); + //Long id =Long.parseLong(talId); + resultmap.put("belowArrangeNumber", doctorArrangemap.get("talId")==null?0:doctorArrangemap.get("talId"));//单家排班下派总人数 talId + resultmap.put("serveDay", doctorArrangemap.get("tatolDay")==null?0:((doctorArrangemap.get("tatolDay"))));//单家医院总服务天数 tatolDay + //totInformation.setBelowArrangeNumber(Long.valueOf(String.valueOf(talId)));// + //totInformation.setServeDay(Long.valueOf(String.valueOf(((Double)tatolDay).intValue())));//单家医院总服务天数 tatolDay + //totalTraining.get("number");// + resultmap.put("subjectNumber", totalTraining.get("training_id")==null?0:totalTraining.get("training_id"));////课题数 + //totInformation.setSubjectNumber(Long.valueOf(String.valueOf(totalTraining.get("number"))));// + //totInformation.setTrainingNumber(Long.valueOf(totalTraining.get("number")));//。。。 + resultmap.put("trainingNumber",totalTraining.get("number")==null?0:totalTraining.get("number") );//专题讲座培训人/次 + resultmap.put("coCounty", "0"); + resultmap.put("coUniorCoalition", "0");//专科联盟默认为 非jiacaseUpwardNumber + resultmap.put("coTeleMedicine", "0");//远程医疗协作 + resultmap.put("caseUpwardNumber", UpWayReferral);//向上转诊人数 + resultmap.put("caseDownNumber", DownWayReferral);//向下转诊人数 + resultmap.put("consulNumber", ConsultationSingleMap);//远程诊疗人数 + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + String arrnge = applyInformation.getCoOpExplain(); + String str3[] = arrnge.split(","); + for(int i = 0;i totalInformationList + list2.add(resultmap); + }//for 循环结束 + //汇总所有参数 + Map totalmap = new HashMap(); + int coTension=0; + int coLoose=0; + int coCounty=0; + int coUniorCoalition=0; + int coTeleMedicine=0; + int helpProtocol=0; + //int belowArrangeNumber =0;//派驻医疗人员人数从总的获取 + int serveDay = 0;//派驻服务天数 + int upArrangeNumber =0; + //int totalSubjectNumber =0;//课题数从总的获取 + int trainingNumber=0; + int medicalNumber =0; + int juniorNumber=0; + int techniqueNumber=0;//caseDownNumber + int caseDownNumber=0; + int consulNumber=0; + int caseUpwardNumber=0; + for(int i =0;i tmap= list2.get(i); + + coTension+=Integer.parseInt(tmap.get("coTension")==null?"0":(String) tmap.get("coTension")); + coLoose+=Integer.parseInt(tmap.get("coLoose")==null?"0":(String) tmap.get("coLoose") ); + coCounty+=Integer.parseInt( tmap.get("coCounty")==null?"0":(String) tmap.get("coCounty")); + coUniorCoalition+=Integer.parseInt((String) tmap.get("coUniorCoalition")==null?"0":(String) tmap.get("coUniorCoalition")); + coTeleMedicine+=Integer.parseInt((String) tmap.get("coTeleMedicine")==null?"0":(String) tmap.get("coTeleMedicine")); + helpProtocol+= tmap.get("helpProtocol")==null?0:(int)tmap.get("helpProtocol");// + serveDay+=Integer.parseInt(tmap.get("serveDay").toString()); + upArrangeNumber+=(int)tmap.get("upArrangeNumber"); + trainingNumber+= Integer.parseInt(tmap.get("trainingNumber").toString());//((Long)tmap.get("TrainingNumber")).intValue(); + medicalNumber+= (int)tmap.get("medicalNumber"); + juniorNumber+=(int) tmap.get("juniorNumber"); + techniqueNumber+= (int)tmap.get("techniqueNumber"); + caseUpwardNumber+=(int)tmap.get("caseUpwardNumber"); + caseDownNumber+=(int)tmap.get("caseDownNumber"); + consulNumber+=(int)tmap.get("consulNumber"); + } + totalmap.put("coTension", coTension);//紧密型 + totalmap.put("coLoose", coLoose);//松散 + totalmap.put("coCounty", coCounty);//县域医共体 + totalmap.put("coUniorCoalition", coUniorCoalition);//专科联盟 + totalmap.put("coTeleMedicine", coTeleMedicine);//远程医疗协作 + totalmap.put("helpProtocol", helpProtocol);//帮扶协议 + totalmap.put("belowArrangeNumber", totalDoctorNumber);//派驻医疗人员人数 + totalmap.put("serveDay",serveDay);//派驻服务天数 + totalmap.put("upArrangeNumber",upArrangeNumber);//进修安排人数 + totalmap.put("subjectNumber",totalTopicNum);//课题数 + totalmap.put("trainingNumber",trainingNumber);//培训人/次 + totalmap.put("medicalNumber",medicalNumber);//医疗质量控制检查(次数) + totalmap.put("juniorNumber",juniorNumber);//支持专科建设(个数) + totalmap.put("techniqueNumber",techniqueNumber);//新技术新项目推广应用(项数) + totalmap.put("caseUpwardNumber",caseUpwardNumber);//向上转诊) + totalmap.put("caseDownNumber",caseDownNumber);//向下转诊) + totalmap.put("consulNumber",consulNumber);//远程会诊 + map.put("data", list2); + map.put("totalMap", totalmap); + // System.out.println("map"+map); + //System.out.println("totalMap"+totalmap); + return map; + } + /** + * 市直医院医联体建设情况汇总表导出 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "downSumMedicalAssociation", method = RequestMethod.GET) + @ResponseBody public Map dowmSumMedicalAssociation(@RequestParam Map params,HttpServletResponse response)throws Exception { + Map map = new HashMap(); + + /** + * + */ + + String startTime =params.get("startTime"); + String endTime =params.get("endTime"); + String hospitalName =params.get("hospitalName"); + String rid = params.get("type"); + Map doctorArrangmap = new HashMap(); + //doctorArrangmap.put("type", '3');//医连体类型 + doctorArrangmap.put("start_time", startTime); + doctorArrangmap.put("end_time", endTime); + int totalDoctorNumber = doctorArrangeService.selectdoctorTotaDay(doctorArrangmap);//派驻医疗人员总数// + //TrainingWrapper.eq("create_time", applyInformation.getId()); + Map totalTopicNumMap = new HashMap(); + totalTopicNumMap.put("start_time", startTime); + totalTopicNumMap.put("end_time", endTime); + //int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);// + int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);//直接从Total_train 查train id + //map.put("totalTopicNum", totalTopicNum);//总课题数 + //通过医院名字找到医院ID + Map InfromationMap = new HashMap(); + InfromationMap.put("rid", rid); + //InfromationMap.put("start", 1);//分页 + //InfromationMap.put("end", 5); + if(StringUtils.isNotEmpty(hospitalName)){ + //applyInformatioWrapper.eq("hospital_name", hospitalName); + InfromationMap.put("hospital_name", hospitalName); + } + + List applyInformationlList = applyInformationService.selectInfromationList(InfromationMap); + List> list2=new ArrayList>(); + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + List listTechnique = new ArrayList(); + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + //时间判断, + Map doctorArrang = new HashMap(); + doctorArrang.put("start_time", startTime); + doctorArrang.put("end_time", endTime); + doctorArrang.put("hosptialId", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectDoctorArrangeList(doctorArrang); + int inspect = 0; + String newtechnoly[]=null; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + String workType = doctorArrange.getDevelopWork(); + String str[] = workType.split("、"); + boolean flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + String arrnge = doctorArrange.getArrangeChamber(); + String str3[] = arrnge.split("、"); + for(int i = 0;i refresherNumerMap = new HashMap(); + refresherNumerMap.put("start_time", startTime); + refresherNumerMap.put("end_time", endTime); + refresherNumerMap.put("hosptialId", applyInformation.getId()); + //refresherNumerMap.put("type", applyInformation.);进修学习类型 + int adp = applyDoctorPromoteService.selectrefresherCount(refresherNumerMap); //进修人数 + Map map1 = new HashMap(); + //map1.put("type", totalInformation.getType()); + map1.put("receive_hospital_id", applyInformation.getId()); + map1.put("start_time", startTime); + map1.put("end_time", endTime); + //单家派驻医疗人数数 服务天数 ?? 真是奇怪?非得将医院ID + Map doctorArrangemap = doctorArrangeService.selectAccreditedMedicalNumber(map1); + //测试 + //System.out.println("查询到的数据"+maptest); + //System.out.println("单家派驻医疗人数"+doctorArrangeTotaNumDay.toString()); + //专题讲座培训人/次 课题数 + Map map2 = new HashMap(); + map2.put("hospital_id", applyInformation.getId()); + map2.put("start_time", startTime); + map2.put("end_time", endTime); + //TotalTraining totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + Map totalTraining = totalTrainingService.selectLectureTrainingAndNember(map2); + //双向转诊上转人次,下转人次 + Map UpWayReferralMap = new HashMap(); + UpWayReferralMap.put("hospital_id", applyInformation.getId()); + UpWayReferralMap.put("start_time", startTime);// + UpWayReferralMap.put("end_time", endTime); + int UpWayReferral = applyCaseService.selectUpWayReferralNumer(UpWayReferralMap); + Map DownWayReferralMap = new HashMap(); + DownWayReferralMap.put("plan_hospital_id", applyInformation.getId()); + DownWayReferralMap.put("start_time", startTime);//向下转诊 + DownWayReferralMap.put("end_time", endTime); + int DownWayReferral = applyCaseService.selectDownWayReferralNumer(DownWayReferralMap); + //开展远程诊疗 + Map ConsultationMap = new HashMap(); + ConsultationMap.put("category_hospital_id", applyInformation.getId()); + ConsultationMap.put("start_time", startTime);//远程会诊 + ConsultationMap.put("end_time", endTime); + int ConsultationSingleMap = applyConsultationService.selectConsultationNumer(ConsultationMap); + Map resultmap = new HashMap(); + //TotalInformation totInformation = new TotalInformation(); + resultmap.put("hospitalName", applyInformation.getHospitalName());//医院名字 + resultmap.put("medicalNumber", inspect);//医疗质量控制检查 + //totInformation.setMedicalNumber(Long.valueOf(inspect)); + Set numbers = new HashSet<>(listChamber);// + resultmap.put("juniorNumber", numbers.size());////支持专科建设 + //totInformation.setJuniorNumber(Long.valueOf(numbers.size())); + Set listTechniquenum = new HashSet<>(listTechnique);// + resultmap.put("techniqueNumber", listTechniquenum);//新技术新项目推广应用,改成中文数组 + resultmap.put("newtechniqueNumber", listTechniquenum.size());//新技术新项目推广应用,原始数字不变 + //totInformation.setTechniqueNumber(Long.valueOf(newprojectNum)); + //resultmap.put("coOp", applyInformation.getCoOp()==null?0:applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + + //totInformation.setCoOp(applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(2)){ + resultmap.put("coLoose", "1"); + } + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(1)){ + resultmap.put("coTension", "1"); + } + + resultmap.put("helpProtocol", applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + //totInformation.setHelpProtocol(applyInformation.getHelpProtocol());// + resultmap.put("upArrangeNumber", adp);//进修培训安排人数 + //totInformation.setUpArrangeNumber(Long.valueOf(adp));// + Date data= applyInformation.getSetupTime(); + String SetupTime=new SimpleDateFormat("yyyy-MM-dd").format(data); + resultmap.put("cooperationTime", SetupTime);//签约时间 + + + //totInformation.setCooperationTime(); + //Object talId = doctorArrangemap.get("talId"); + //Object tatolDay= doctorArrangemap.get("tatolDay"); + //Long id =Long.parseLong(talId); + resultmap.put("belowArrangeNumber", doctorArrangemap.get("talId")==null?0:doctorArrangemap.get("talId"));//单家排班下派总人数 talId + resultmap.put("serveDay", doctorArrangemap.get("tatolDay")==null?0:((doctorArrangemap.get("tatolDay"))));//单家医院总服务天数 tatolDay + //totInformation.setBelowArrangeNumber(Long.valueOf(String.valueOf(talId)));// + //totInformation.setServeDay(Long.valueOf(String.valueOf(((Double)tatolDay).intValue())));//单家医院总服务天数 tatolDay + //totalTraining.get("number");// + resultmap.put("subjectNumber", totalTraining.get("training_id")==null?0:totalTraining.get("training_id"));////课题数 + //totInformation.setSubjectNumber(Long.valueOf(String.valueOf(totalTraining.get("number"))));// + //totInformation.setTrainingNumber(Long.valueOf(totalTraining.get("number")));//。。。 + resultmap.put("trainingNumber",totalTraining.get("number")==null?0:totalTraining.get("number") );//专题讲座培训人/次 + resultmap.put("coCounty", "0"); + resultmap.put("coUniorCoalition", "0");//专科联盟默认为 非jiacaseUpwardNumber + resultmap.put("coTeleMedicine", "0");//远程医疗协作 + resultmap.put("caseUpwardNumber", UpWayReferral);//向上转诊人数 + resultmap.put("caseDownNumber", DownWayReferral);//向下转诊人数 + resultmap.put("consulNumber", ConsultationSingleMap);//远程诊疗人数 + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + String arrnge = applyInformation.getCoOpExplain(); + String str3[] = arrnge.split(","); + for(int i = 0;i totalInformationList + list2.add(resultmap); + }//for 循环结束 + //汇总所有参数 + Map totalmap = new HashMap(); + int coTension=0; + int coLoose=0; + int coCounty=0; + int coUniorCoalition=0; + int coTeleMedicine=0; + int helpProtocol=0; + //int belowArrangeNumber =0;//派驻医疗人员人数从总的获取 + int serveDay = 0;//派驻服务天数 + int upArrangeNumber =0; + //int totalSubjectNumber =0;//课题数从总的获取 + int trainingNumber=0; + int medicalNumber =0; + int juniorNumber=0; + int caseDownNumber=0; + int consulNumber=0; + int caseUpwardNumber=0; + int newtechniqueNumber=0; + for(int i =0;i tmap= list2.get(i); + + coTension+=Integer.parseInt(tmap.get("coTension")==null?"0":(String) tmap.get("coTension")); + coLoose+=Integer.parseInt(tmap.get("coLoose")==null?"0":(String) tmap.get("coLoose") ); + coCounty+=Integer.parseInt( tmap.get("coCounty")==null?"0":(String) tmap.get("coCounty")); + coUniorCoalition+=Integer.parseInt((String) tmap.get("coUniorCoalition")==null?"0":(String) tmap.get("coUniorCoalition")); + coTeleMedicine+=Integer.parseInt((String) tmap.get("coTeleMedicine")==null?"0":(String) tmap.get("coTeleMedicine")); + helpProtocol+= tmap.get("helpProtocol")==null?0:(int)tmap.get("helpProtocol");// + serveDay+=Integer.parseInt(tmap.get("serveDay").toString()); + upArrangeNumber+=(int)tmap.get("upArrangeNumber"); + trainingNumber+= Integer.parseInt(tmap.get("trainingNumber").toString());//((Long)tmap.get("TrainingNumber")).intValue(); + medicalNumber+= (int)tmap.get("medicalNumber"); + juniorNumber+=(int) tmap.get("juniorNumber"); + //techniqueNumber.append(tmap.get("techniqueNumber")==null?"":tmap.get("techniqueNumber")); + newtechniqueNumber+=(int)tmap.get("newtechniqueNumber");//新技术新项目的数字显示 + //listTechnique.add(e); + // Set numbers = new HashSet<>(listTechnique);// + /*if(!tmap.get("techniqueNumber").toString().isEmpty()){ + int ch = tmap.get("techniqueNumber").toString().lastIndexOf("]"); + TotalTechnique.add(tmap.get("techniqueNumber").toString().substring(1, ch)); + }*/ + caseUpwardNumber+=(int)tmap.get("caseUpwardNumber"); + caseDownNumber+=(int)tmap.get("caseDownNumber"); + consulNumber+=(int)tmap.get("consulNumber"); + } + totalmap.put("coTension", coTension);//紧密型 + totalmap.put("coLoose", coLoose);//松散 + totalmap.put("coCounty", coCounty);//县域医共体 + totalmap.put("coUniorCoalition", coUniorCoalition);//专科联盟 + totalmap.put("coTeleMedicine", coTeleMedicine);//远程医疗协作 + totalmap.put("helpProtocol", helpProtocol);//帮扶协议 + totalmap.put("belowArrangeNumber", totalDoctorNumber);//派驻医疗人员人数 + totalmap.put("serveDay",serveDay);//派驻服务天数 + totalmap.put("upArrangeNumber",upArrangeNumber);//进修安排人数 + totalmap.put("subjectNumber",totalTopicNum);//课题数 + totalmap.put("trainingNumber",trainingNumber);//培训人/次 + totalmap.put("medicalNumber",medicalNumber);//医疗质量控制检查(次数) + totalmap.put("juniorNumber",juniorNumber);//支持专科建设(个数) + // totalmap.put("techniqueNumber",newtechniqueNumber);//新技术新项目推广应用(项数) + totalmap.put("caseUpwardNumber",caseUpwardNumber);//向上转诊) + totalmap.put("caseDownNumber",caseDownNumber);//向下转诊) + totalmap.put("consulNumber",consulNumber);//远程会诊 + map.put("data", list2); + map.put("totalMap", totalmap); + // System.out.println("map"+map); + //System.out.println("totalMap"+totalmap); + //System.out.println("查询map"+map); + //System.out.println("查询totalMap"+totalmap); + //导出查询列表 + String fileName = "数据汇总表"+System.currentTimeMillis()+".xls"; + String sheetName = "数据汇总表"; + String[][] content = new String[list2.size()+1][20]; + //列表的数据遍历出来保存到EXCEL 里去 + for(int i=0;i1){ + content[lastl][1]=coTension+""; + content[lastl][2]=coLoose+""; + content[lastl][3]=coCounty+""; + content[lastl][4]=coUniorCoalition+""; + content[lastl][5]=coTeleMedicine+""; + + content[lastl][7]=helpProtocol+""; + content[lastl][8]=totalDoctorNumber+""; + content[lastl][9]=serveDay+""; + content[lastl][10]=upArrangeNumber+""; + content[lastl][11]=totalTopicNum+""; + content[lastl][12]=trainingNumber+""; + content[lastl][13]=caseUpwardNumber+""; + content[lastl][14]=caseDownNumber+""; + content[lastl][15]=consulNumber+""; + content[lastl][16]=medicalNumber+""; + content[lastl][17]=juniorNumber+""; + /* for(int i=0;i list1 =new ArrayList(); + for(int i=0;i totalnewlist = new HashSet<>(list1);//汇总后的数据去重 + content[lastl][19]=totalnewlist.toString().substring(1,totalnewlist.toString().lastIndexOf("]"));*/ + content[lastl][18]=newtechniqueNumber+""; + } + HSSFWorkbook wb = com.imurs.excelderive.ExcelDown2.getHSSFWorkbook1(sheetName, content, null, list2.size(),params.get("hospitalName"),startTime,endTime); + try { + this.setResponseHeader(response, fileName); + // response.reset();// + OutputStream os = response.getOutputStream(); + wb.write(os); + os.flush(); + os.close(); + wb.close();//临时加的关闭表格 + } catch(Exception e){ + e.printStackTrace(); + } + return map; + } + //发送响应流方法 + public void setResponseHeader(HttpServletResponse response, String fileName) { + try { + try { + fileName = new String(fileName.getBytes(),"ISO8859-1"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + response.setContentType("application/octet-stream;charset=ISO8859-1"); + response.setHeader("Content-Disposition", "attachment;filename="+ fileName); + response.addHeader("Pargam", "no-cache"); + response.addHeader("Cache-Control", "no-cache"); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/backend/src/main/java/com/imurs/controller/TotalTrainingController.java b/backend/src/main/java/com/imurs/controller/TotalTrainingController.java new file mode 100644 index 0000000..838eced --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/TotalTrainingController.java @@ -0,0 +1,197 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.TotalTraining; +import com.imurs.entity.Training; +import com.imurs.entity.TrainingFlower; +import com.imurs.entity.User; +import com.imurs.service.TotalTrainingService; +import com.imurs.service.TrainingFlowerService; +import com.imurs.service.TrainingService; +import com.imurs.service.UserService; + + +/** + * 远程培训视频(列表统计) + * @author Server + * totaltraining 统计 + */ +@RestController +@RequestMapping(value="totalTraining") +public class TotalTrainingController { + + @Autowired + TotalTrainingService totalTrainingService; + + @Autowired + TrainingService trainingService; + @Autowired + UserService userService; + + @Autowired + TrainingFlowerService trainingFlowerService; + + /** + * 视频课件播放次数增加 + * @param section + * @return + */ + @RequestMapping(value="insertTotalTraining") + public Map insertSection(TotalTraining totalTraining){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("doc_id", totalTraining.getDocId()); + wrapper.eq("training_id", totalTraining.getTrainingId()); + TotalTraining totalTrainingOne = totalTrainingService.selectOne(wrapper); + if(totalTrainingOne==null){ + boolean result=totalTrainingService.insert(totalTraining); + if(result==true){ + map.put("msg","1"); + Training training = trainingService.selectById(totalTraining.getTrainingId()); + training.setNumber(training.getNumber()+totalTraining.getNumber()); + trainingService.updateById(training); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "5"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件点赞与取消点赞 + * @param section + * @return + *//* + @RequestMapping(value="updateTotisPraise") + public Map updateTotIsPraise(TotalTraining totalTraining,Integer isPraise){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("doc_id", totalTraining.getDocId()); + wrapper.eq("training_id", totalTraining.getTrainingId()); + Boolean result = totalTrainingService.update(totalTraining, wrapper); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + *//** + * 视频课件点赞总数 + * @param section + * @return + *//* + @RequestMapping(value="totalTrainingTotalPraise") + public Map totalTrainingTotalPraise(TotalTraining totalTraining){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapperA=new EntityWrapper(); + try { + wrapper.eq("training_id", totalTraining.getTrainingId()); + wrapper.setSqlSelect("sum(flower) as flower"); + TotalTraining totTraining = totalTrainingService.selectOne(wrapper); + wrapperA.eq("training_id", totalTraining.getTrainingId()); + int count = totalTrainingService.selectCount(wrapperA); + map.put("isPraiseNum", totTraining.getFlower()/count); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + }*/ + + /** + * 新增送花朵数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlower") + public Map trainingFlower(TrainingFlower trainingFlower){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingFlower.getTrainingId()); + wrapper.eq("give_id", trainingFlower.getGiveId()); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower==null){ + Boolean result = trainingFlowerService.insert(trainingFlower); + map.put("msg", result == true?1:2); + }else{ + map.put("msg", "5");//已经送过花朵 + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看自己的送花朵数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlowerBytId") + public Map trainingFlowerBytId(TrainingFlower trainingFlower){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingFlower.getTrainingId()); + wrapper.eq("give_id", trainingFlower.getGiveId()); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower!=null){ + map.put("myFlower", tgFlower.getFlowerNum()==null?0:tgFlower.getFlowerNum()); + }else{ + map.put("myFlower", "0"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 送花总数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlowerTotal") + public Map trainingFlowerTotal(Long trainingId){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingId); + wrapper.setSqlSelect("sum(flower_num) as flowerNum"); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower!=null){ + map.put("sumFlower", tgFlower.getFlowerNum()==null?0:tgFlower.getFlowerNum()); + }else{ + map.put("sumFlower", "0"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/TrainingController.java b/backend/src/main/java/com/imurs/controller/TrainingController.java new file mode 100644 index 0000000..c11212a --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/TrainingController.java @@ -0,0 +1,291 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TotalTraining; +import com.imurs.entity.Training; +import com.imurs.entity.TrainingOpinion; +import com.imurs.entity.User; +import com.imurs.service.TotalTrainingService; +import com.imurs.service.TrainingOpinionService; +import com.imurs.service.TrainingService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 远程培训视频(列表统计) + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "training") +public class TrainingController { + + @Autowired + TrainingService trainingService; + + @Autowired + TotalTrainingService totalTrainingService; + + @Autowired + UserService userService; + + @Autowired + TrainingOpinionService trainingOpinionService; + + /** + * 新增上传视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "insertTraining") + public Map insertSection(Training training) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + wrapper.eq("phone", training.getPhone());//phone 为user表账号 通过账号查找手机号码 手机号码可以修改的 + User user = userService.selectOne(wrapper); + training.setPhone(user.getContactPhone()); + boolean result = trainingService.insert(training); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "updateTraining") + public Map updateSection(Training training) { + Map map = new HashMap(); + try { + boolean result = trainingService.updateById(training); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据id查找视频课件 + * @param section + * @return + */ + @RequestMapping(value = "selectTrainingById") + public Map selectTrainingById(Long id) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + Training training = trainingService.selectById(id); + User user = userService.selectById(training.getDocId()); + wrapper.eq("training_id", id); + map.put("user", user); + map.put("training", training); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "deleteTraining") + public Map updateSection(Long id) { + Map map = new HashMap(); + try { + boolean result = trainingService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件列表分页 + */ + @RequestMapping(value = "selectTrainingPage") + public Map selectSectionPage(Map map) { + Map mapList = new HashMap(); + try { + List listTraining = trainingService.selectTraining(map); + if (listTraining != null) { + mapList.put("listTraining", listTraining); + } else { + mapList.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + mapList.put("msg", "4"); + } + return mapList; + } + + /** + * 视频课件列表分页列表显示 + */ + @RequestMapping(value = "selectTrainingPageByType") + public Map selectSectionPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker,String hospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(title)) { + wrapper.like("title", title); + } + if (StringUtils.isNotEmpty(speaker)) { + wrapper.like("speaker", speaker); + } + if (type != null) { + wrapper.eq("type", type); + } + wrapper.orderBy("create_time", false); + try { + Page tiList = trainingService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + if(StringUtils.isNotEmpty(hospitalId)){ + map.put("hospital_id", hospitalId); + List totalList=totalTrainingService.selectByMap(map); + map.remove("hospital_id"); + if(!totalList.isEmpty()){ + Map result=totalList.stream().collect(Collectors.groupingBy(TotalTraining::getTrainingId,Collectors.counting())); + for (int i = 0; i < customPage.getRows().size(); i++) { + if(result!=null && result.get(customPage.getRows().get(i).getId())!=null){ + customPage.getRows().get(i).setNumber(result.get(customPage.getRows().get(i).getId()).intValue()); + }else{ + customPage.getRows().get(i).setNumber(0); + } + } + }else{ + for (int i = 0; i < customPage.getRows().size(); i++) { + customPage.getRows().get(i).setNumber(0); + } + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 视频课件列表基层医院分页列表显示 + */ + @RequestMapping(value = "selectBasicSectionPage") + public Map selectBasicSectionPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker,String hospitalId) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + map.put("hospitalId", hospitalId); + map.put("speaker", speaker); + map.put("type", type); + map.put("title", title); + try{ + Pagetion tiList=trainingService.selectBasePage(map,pageNo,pageSize); + if (tiList != null) { + map.put("customPage", tiList); + } else { + map.put("msg", "3"); + } + }catch(Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalId"); + map.remove("speaker"); + map.remove("type"); + map.remove("title"); + } + return map; + } + + /** + * 新增评论回复 + * @param section + * @return + */ + @RequestMapping(value = "addTrainingOpinion") + public Map addTrainingOpinion(TrainingOpinion trainingOpinion) { + Map map = new HashMap(); + try { + boolean result = trainingOpinionService.insert(trainingOpinion); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 评论列表分页 + */ + @RequestMapping(value = "selectTrainingOpinionPage") + public Map selectTrainingOpinionPage(Integer pageNo, Integer pageSize, String trainingId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(trainingId)) { + wrapper.eq("training_id", trainingId); + } + //wrapper.groupBy("reply_id"); + wrapper.orderBy("create_time", false); + try { + Page tiList = trainingOpinionService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + map.put("customPage", customPage); + /*List trainingOpinionList = trainingOpinionService.selectList(wrapper); + map.put("msg",trainingOpinionList);//视频评论及回复列表数据 +*/ } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/TrainingPlanController.java b/backend/src/main/java/com/imurs/controller/TrainingPlanController.java new file mode 100644 index 0000000..376e9c3 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/TrainingPlanController.java @@ -0,0 +1,130 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TrainingPlan; +import com.imurs.service.TrainingOpinionService; +import com.imurs.service.TrainingPlanService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping("trainingPlan") +public class TrainingPlanController { + + @Autowired + TrainingPlanService trainingPlanService; + + @Autowired + TrainingOpinionService trainingOpinionService; + /** + * 新增培训计划 + */ + @RequestMapping("insertTrainingPlan") + public Map insertTrainingPlan(TrainingPlan trainingPlan){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.insert(trainingPlan); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改培训计划 + */ + @RequestMapping("updateTrainingPlan") + public Map updateTrainingPlan(TrainingPlan trainingPlan){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.updateById(trainingPlan); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看计划详情 + */ + @RequestMapping("selectTrainingPlan") + public Map selectTrainingPlan(Long id,Long docId){ + Map map=new HashMap(); + try { + TrainingPlan trainingPlan=trainingPlanService.selectById(id); + map.put("trainingPlan",trainingPlan); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @RequestMapping("deleteTrainingPlan") + public Map deleteTrainingPlan(Long id){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件列表分页列表显示 + */ + @RequestMapping(value = "selectTrainingPlayPage") + public Map selectTrainingPlayPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(title)) { + wrapper.like("title", title); + } + if (StringUtils.isNotEmpty(speaker)) { + wrapper.like("speaker", speaker); + } + if (type != null) { + wrapper.eq("type", type); + } + + wrapper.orderBy("lecture_time", false); + try { + Page tiList = trainingPlanService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/TrainingRecordController.java b/backend/src/main/java/com/imurs/controller/TrainingRecordController.java new file mode 100644 index 0000000..91df6d0 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/TrainingRecordController.java @@ -0,0 +1,173 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TrainingRecord; +import com.imurs.service.TrainingRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * + * @author Server + * + */ +@RestController +@RequestMapping(value="trainingRecord") +public class TrainingRecordController { + + @Autowired + TrainingRecordService trainingRecordService; + + /** + * 新增培训记录表 + * @param loginRecord + * @return + */ + @RequestMapping(value="addTrainingRecord") + public Map addTrainingRecord(TrainingRecord trainingRecord) throws Exception { + Map map=new HashMap(); + + try { + boolean result=trainingRecordService.insert(trainingRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 修改培训记录 + * @param section + * @return + */ + @RequestMapping(value="updateTrainingRecord") + public Map updateTrainingRecord(TrainingRecord training){ + Map map=new HashMap(); + try { + boolean result=trainingRecordService.updateById(training); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 管理医院关联查询医院名称 + */ + @RequestMapping(value="selectTrainingRecordById") + public Map selectTrainingRecordById(Long trainingId){ + Map map=new HashMap(); + try { + TrainingRecord training = trainingRecordService.selectTrainingRecordById(trainingId); + map.put("training",training); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 删除视频课件 + * @param section + * @return + */ + @RequestMapping(value="deleteTrainingRecord") + public Map deleteTrainingRecord(Long id){ + Map map=new HashMap(); + try { + boolean result=trainingRecordService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示登录记录信息 + */ + @RequestMapping(value="selectTrainingRecordPage") + public Map selectTrainingRecordPage(Integer pageNo,Integer pageSize,String title,String hospitalId,String startTime,String endTime){ + Map map=new HashMap(); + FrontPage page=new FrontPage(); + EntityWrapper wrapper=new EntityWrapper(); + + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?10:pageSize); + + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(title)){ + wrapper.like("title", title); + } + if(StringUtils.isNotEmpty(startTime)){ + wrapper.ge("training_time", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("training_time",dateFormat.format(cal.getTime())); + + } + wrapper.orderBy("training_time",false); + try { + Page trainingRecord=trainingRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(trainingRecord!=null){ + CustomPage customPage=new CustomPage(trainingRecord); + map.put("customPage", customPage); + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 管理医院显示培训记录 + */ + @RequestMapping(value="selectAdminRecordPage") + public Map selectAdminRecordPage(Integer pageNo,Integer pageSize,String hospitalId,String startTime,String endTime){ + Map map=new HashMap(); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + try { + Pagetion list=trainingRecordService.selectAdminRecord(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/UserController.java b/backend/src/main/java/com/imurs/controller/UserController.java new file mode 100644 index 0000000..9c5e19f --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/UserController.java @@ -0,0 +1,644 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import com.imurs.entity.*; +import com.imurs.service.*; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.helpers.SubstituteLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.parameter.SysMenusParameter; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + + +/** + * 医生登录表 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "user") +public class UserController { + + @Autowired + UserService userService; + @Autowired + SysMenuService sysMenuService; + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + TrainingService trainingService; + @Autowired + TotalTrainingService totalTrainingService; + @Autowired + ApplyConsulationSpecialistService applyConsulationSpecialistService; + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + @Autowired + ApplyPathologySpecialistService applyPathologySpecialistService; + @Autowired + ApplyEcgSpecialistService applyEcgSpecialistService; + @Autowired + RoleService roleService; + @Autowired + ApplyBModeService applyBModeService; + + private final Logger logger = LoggerFactory.getLogger(UserController.class); + + private static String privateKey = MsgCode.privateKeyString; + private static String password = MsgCode.Password; + /** + * 新增医生信息 + * + * @param user + * @return + */ + @RequestMapping(value = "insertUser") + public Map insertUser(User user) { + Map map = new HashMap(); + try { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (user.getPassword() != null) { + user.setPassword(RSAUtil.decrypt(user.getPassword(),privateKey)); + } else { + user.setPassword(password); + } + user.setPassword(passwordEncoder.encode(user.getPassword())); + boolean result = userService.insert(user); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改密码 + */ + @RequestMapping(value = "updateUserPassword") + public Map updateUserPassword(Long id, String oldPassword, String newPassword) { + Map map = new HashMap(); + try { + if (id != null && StringUtils.isNotEmpty(oldPassword) && StringUtils.isNotEmpty(newPassword)) { + // 判断旧密码是否相同 + oldPassword = RSAUtil.decrypt(oldPassword,privateKey); + newPassword = RSAUtil.decrypt(newPassword,privateKey); + User user = userService.selectById(id); + if (user != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (passwordEncoder.matches(oldPassword,user.getPassword())) { + user.setPassword(passwordEncoder.encode(newPassword)); + boolean result = userService.updateById(user); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * @param phone 电话号码 + * @param password 密码 + * @return 通过一个固定账号查出该医院所有医生账号 + */ + @RequestMapping("getAllDocByCategoryHospital") + public Map getAllDocByCategoryHospital(String phone, String password) { + Map map = new HashMap<>(8); + try { + User user = userService.selectOne(new EntityWrapper() + .eq("phone", phone)); + if (user == null) { + map.put("msg","6"); + return map; + } + String decryptPassword = RSAUtil.decrypt(password,privateKey); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (!passwordEncoder.matches(decryptPassword,user.getPassword())) { + map.put("msg","2"); + return map; + } + List users = userService.selectList(new EntityWrapper() + .eq("hospital_id", user.getHospitalId()) + .notIn("phone", phone)); + map.put("users",users); + map.put("msg","1"); + } catch (Exception e) { + logger.error("查询基层医院所有医生出现异常",e); + map.put("msg","4"); + } + return map; + } + + /** + * 修改医生信息 + * + * @param user + * @return + */ + @RequestMapping(value = "updateUser") + public Map updateUser(User user) { + Map map = new HashMap(); + try { + boolean result = userService.updateById(user); + String username = user.getUserName(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("doc_id",user.getId()); + List applyBModeList = applyBModeService.selectList(wrapper); + if (!CollectionUtils.isEmpty(applyBModeList)) { + for (ApplyBMode applybmode: applyBModeList) { + applybmode.setDoctorName(username); + } + applyBModeService.updateBatchById(applyBModeList); + } + +// applyBModeService.updateByMyId(id,username); + + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 多医生批量修改 + * + * @param users + * @return + */ + + @RequestMapping(value = "updateUserBatch") + public Map updateUserBatch(@RequestBody List users) { + Map map = new HashMap<>(); + try { + boolean result = userService.updateBatchByIds(users); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据groupAlias字段查询医生 + * @param groupAlias + * @return + */ + @RequestMapping(value = "selectUserByGroupAlias") + public Map selectUserByGroupAlias(@RequestParam String groupAlias) { + Map map = new HashMap<>(); + try { + List users = userService.selectList(new EntityWrapper() + .eq("group_alias", groupAlias) + .eq("state", 1) + .eq("rid", 6) + ); + map.put("doctorList", users); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生groupAlias字段为空的医生 + * @param + * @return + */ + @RequestMapping(value = "selectUserByGroupAliasIsNull") + public Map selectUserByGroupAliasIsNull() { + Map map = new HashMap<>(); + try { + List users = userService.selectList(new EntityWrapper() + .andNew("(group_alias IS NULL OR group_alias = '')") + .eq("state", 1) + .eq("rid", 6)); // 空字符串; + map.put("doctorList", users); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 根据手机号码查询医生 + */ + @RequestMapping(value = "selectUserByPhone") + public Map selectUserByPhone(String phone, String rid) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("phone", phone); + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid", rid); + } + try { + User user = userService.selectOne(wrapper); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生详情 + */ + @RequestMapping(value = "selectUserById") + public Map selectUserById(Long id) { + Map map = new HashMap(); + try { + User user = userService.selectById(id); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生所有权限 + */ + @RequestMapping(value = "selectUserAllRpId") + public Map selectUserAllRpId(String rid) { + // 查询角色所有权限使用 + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List list = new ArrayList(); + // 查询该角色拥有的所有权限 + wrapper.eq("rid", rid).eq("menu_state", "1"); + List selectList = sysMenuService.selectList(wrapper); + Map> collect1 = selectList.stream().collect( + Collectors.groupingBy(SysMenu::getMenuStair, Collectors.mapping(SysMenu::getId, Collectors.toList()))); + Set>> entrySet = collect1.entrySet(); + for (Entry> entry : entrySet) { + SysMenusParameter st = new SysMenusParameter(); + st.setMenuStair(entry.getKey()); + st.setMenuId(entry.getValue().toString().replace("[", "").replace("]", "")); + // buffer1="{name:"+"\""+entry.getKey()+"\""+","+"content:"+"\""+entry.getValue()+"\""+"}"; + list.add(st); + } + map.put("AllPermissions", list); + return map; + } + + /** + * 查询医生所有权限(dxy) + */ + @RequestMapping(value = "selectUserSysMenue") + public Map selectUserSysMenue(String rid) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List smList = new ArrayList(); + List sysList = new ArrayList(); + Set keySet; + try { + wrapper.eq("rid", rid).eq("menu_state", "1").ne("menu_vfp", "管理员列表"); + smList = sysMenuService.selectList(wrapper); + Map> collect = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair, + Collectors.mapping(SysMenu::getId, Collectors.toList()))); + keySet = collect.keySet(); + for (String menuStair : keySet) { + SysMenusParameter st = new SysMenusParameter(); + st.setMenuStair(menuStair); + st.setMenuId(collect.get(menuStair).toString().replace("[", "").replace("]", "")); + sysList.add(st); + } + map.put("sysList", sysList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生详情及权限 + */ + @RequestMapping(value = "selectUserRpId") + public Map selectUserRpId(Long id) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List smList = new ArrayList(); + try { + User user = userService.selectById(id); + if (user != null) { + String[] str = user.getRpId().split(","); + for (int i = 0; i < str.length; i++) { + if (str.length - i == 1) { + wrapper.eq("id", str[i]).eq("rid", "1,2").eq("menu_state", "1"); + } else { + wrapper.eq("id", str[i]).eq("rid", "1,2").eq("menu_state", "1").or(); + } + } + smList = sysMenuService.selectList(wrapper); + if (smList.isEmpty()) { + map.put("rpId", null); + } else { + // 分组求出所有名称 + // 分组显示 + Map> collect = smList.stream().collect(Collectors.groupingBy( + SysMenu::getMenuStair, Collectors.mapping(SysMenu::getId, Collectors.toList()))); + map.put("limits", collect.keySet().toArray()); + } + } + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示医生信息 + */ + @RequestMapping(value = "selectUserPage") + public Map selectUserPage(Integer pageNo, Integer pageSize, String contactPhone, String userName, + String startTime, String endTime, String isSucceed, String phone, String seName, Integer state, + String hospitalId, String rid, String isFamily) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + EntityWrapper wrapper = new EntityWrapper(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(contactPhone)) { + wrapper.eq("contact_phone", contactPhone); + } + if (StringUtils.isNotEmpty(seName)) { + wrapper.eq("se_name", seName); + } + if (StringUtils.isNotEmpty(phone)) { + wrapper.eq("phone", phone); + } + if (StringUtils.isNotEmpty(userName)) { + wrapper.like("user_name", userName); + } + if (state != null) { + wrapper.eq("state", state); + } + if (hospitalId != null) { + wrapper.eq("hospital_id", hospitalId); + } + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid", rid); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE, 1);// 增加一天 + endTime = dateFormat.format(cal.getTime()); + } + if (StringUtils.isNotEmpty(isFamily)) { + wrapper.eq("is_family", isFamily); + } + if (StringUtils.isNotEmpty(isSucceed)) { + wrapper.eq("is_succeed", isSucceed); + } + wrapper.orderBy("job_level", false); + + try { + Page userList = userService.selectPage(page.getPagePlusTwo(), wrapper); + if (userList != null) { + CustomPage customPage = new CustomPage(userList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 关联医院表分页显示医生信息 + */ + @RequestMapping(value = "selectUserPageByDoc") + public Map selectUserPageByDoc(Integer pageNo, Integer pageSize, String phone, String userName, + Integer state, String hospitalId, String rid) { + Map map = new HashMap(); + map.put("phone", phone); + map.put("userName", userName); + map.put("state", state); + map.put("hospitalId", hospitalId); + map.put("rid", rid); + + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 12 : pageSize; + + try { + Pagetion pagetion = userService.selectUserPageByDoc(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("phone"); + map.remove("userName"); + map.remove("state"); + map.remove("hospitalId"); + map.remove("rid"); + } + return map; + } + + /** + * 删除医生 + */ + @RequestMapping(value = "deleteUser") + public Map deleteUser(Long id) { + Map map = new HashMap(); + try { + boolean result = userService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 关联医院表查出医院名称 + */ + @RequestMapping("selectUserByUid") + public Map selectUserByUid(Long uid) { + Map map = new HashMap(); + try { + User user = userService.selectUserByUid(uid); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据科室查询医生 ty:1 + */ + @RequestMapping("selectUserBySeName") + public Map selectUserBySeName(String hospitalId, String seName, String rid, Integer status, + Long conId, Long bId, Long pId, Long eId) { + Map map = new HashMap(); + + if (StringUtils.isNotEmpty(seName)) { + map.put("se_name", seName); + } + if (StringUtils.isNotEmpty(hospitalId)) { + map.put("hospital_id", hospitalId); + map.put("rid", rid); + map.put("state", "1"); + } else { + map.put("msg", "9"); + return map; + } + try { + List userList = userService.selectByMap(map); + if (!userList.isEmpty() && status != null) { + if (conId != null) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.setSqlSelect("spe_id as speId").where("").eq("con_id", conId); + // 查询当前专家是否已经分配过 + List accsList = applyConsulationSpecialistService.selectList(wrapper); + map.put("accsList", accsList); + } else if (bId != null) { + EntityWrapper wrapper1 = new EntityWrapper(); + wrapper1.setSqlSelect("spe_id as speId").where("").eq("b_id", bId); + // 查询当前专家是否已经分配过 + List accsList = applyBModeSpecialistService.selectList(wrapper1); + map.put("accsList", accsList); + } else if (pId != null) { + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.setSqlSelect("spe_id as speId").where("").eq("p_id", pId); + // 查询当前专家是否已经分配过 + List accsList = applyPathologySpecialistService.selectList(wrapper2); + map.put("accsList", accsList); + } else if (eId != null) { + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.setSqlSelect("spe_id as speId").where("").eq("e_id", eId); + // 查询当前专家是否已经分配过 + List accsList = applyEcgSpecialistService.selectList(wrapper3); + map.put("accsList", accsList); + } + } + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询所有管理员子账号 + */ + @RequestMapping("selectUserByAdmin") + public Map selectUserByAdmin(Long rid) { + Map map = new HashMap(); + map.put("rid", rid); + try { + List userList = userService.selectByMap(map); + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 靖远医院专家一览表 + */ + @RequestMapping("selectUserJy") + public Map selectUserJy(String seName, String userName) { + Map map = new HashMap(); + List userList = new ArrayList(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("rid", "6").eq("state", "1"); + if (StringUtils.isNotEmpty(seName)) { + wrapper.eq("se_name", seName); + } + if (StringUtils.isNotEmpty(userName)) { + wrapper.like("user_name", userName); + } + wrapper.orderBy("create_time", false); + try { + userList = userService.selectList(wrapper); + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("rid"); + map.remove("state"); + } + return map; + } + + /** + * 查询权限 + */ + @RequestMapping("selectSysMenuByRid") + public Map selectRoleByRid(Long rid) { + Map map = new HashMap(); + try { + Role sys = roleService.selectById(rid); + map.put("rpId", sys.getRpId()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/VideoRecordController.java b/backend/src/main/java/com/imurs/controller/VideoRecordController.java new file mode 100644 index 0000000..c3d1cc5 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/VideoRecordController.java @@ -0,0 +1,87 @@ +package com.imurs.controller; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.VideoRecord; +import com.imurs.service.VideoRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping(value="video") +public class VideoRecordController { + + @Autowired + VideoRecordService videoRecordService; + + + /** + * 新增视频记录 + * @return + */ + @RequestMapping(value="/startVideo") + public Map startVideo(VideoRecord videoRecord){ + Map map=new HashMap(); + try { + boolean result = videoRecordService.insert(videoRecord); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 新增视频记录 + * @return + */ + @RequestMapping(value="/deleteVideo") + public Map deleteVideo(Long id){ + Map map=new HashMap(); + try { + boolean result = videoRecordService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示医生信息 + */ + @RequestMapping(value = "selectVideoRecordPage") + public Map selectVideoRecordPage(Integer pageNo, Integer pageSize, String phone, String userName, + Integer state, String hospitalId) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + EntityWrapper wrapper = new EntityWrapper(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + wrapper.orderBy("create_time", false); + try { + Page videoRecord = videoRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if (videoRecord != null) { + CustomPage customPage = new CustomPage(videoRecord); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/backend/src/main/java/com/imurs/controller/VoiceTransform.java b/backend/src/main/java/com/imurs/controller/VoiceTransform.java new file mode 100644 index 0000000..e0b88a3 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/VoiceTransform.java @@ -0,0 +1,68 @@ +package com.imurs.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; +import javax.sound.sampled.UnsupportedAudioFileException; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.multipart.MultipartFile; + +import com.imurs.sound.AsrMain; + +import net.sf.json.JSONObject; +@Controller +@RequestMapping(value = "/sound") +public class VoiceTransform { + /** + * 获取二进制数据 + * + * @param model + * @param params + * @param response + * @return + */ + + + //百度通用语音识别 + @RequestMapping(value = "/bRecogniteSound") + public void baidusoundsound(MultipartFile audioData,HttpServletResponse response) throws UnsupportedAudioFileException, IOException, Exception { + + // long startTime=System.currentTimeMillis(); //获取开始时间 + InputStream in=audioData.getInputStream(); + + //获取结束时间 + //long startTime2=System.currentTimeMillis(); + // System.out.println(startTime2-startTime+"获取数据的时间"); + + + AsrMain demo = new AsrMain(in); + //String path = "D:\\16k.pcm"; + //AsrMain demo = new AsrMain(path); + // demo.runJsonPostMethodIns(token) + String result = demo.runins(); + // String result =demo.run(); + // long endTime=System.currentTimeMillis(); + // System.out.println(endTime-startTime2+"上传服务器时间"); + // long processtime =(endTime-startTime2); + Map map =new HashMap(); + map.put("result", result); + // map.put("time", processtime+" ms"); + //System.out.println(result); + String json=JSONObject.fromObject(map).toString(); + response.getWriter().write(json); + // System.out.println("json格式:"+json); + //if(result != null) { + //System.out.println("识别结果:\n" + result); + //System.out.println(processtime); + + //} + } + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/controller/maternity/PatientUserController.java b/backend/src/main/java/com/imurs/controller/maternity/PatientUserController.java new file mode 100644 index 0000000..1f70e2c --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/maternity/PatientUserController.java @@ -0,0 +1,151 @@ +package com.imurs.controller.maternity; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.PatientUser; +import com.imurs.service.PatientUserService; +import com.imurs.util.MD5; + + +@RestController +@RequestMapping("ptUser") +public class PatientUserController { + + @Autowired + PatientUserService patientUserService; + + + /** + * 患者注册 + */ + @RequestMapping(value = "registerPtUser") + public Map registerPtUser(PatientUser ptUser) { + Map map = new HashMap(); + try { + if (ptUser != null) { + ptUser.setAccount(ptUser.getPhone()); + ptUser.setPhone(ptUser.getPhone()); + ptUser.setPassword(MD5.GetMD5Code(ptUser.getPassword())); + ptUser.setPtIccid(UUID.randomUUID().toString()); + boolean result = patientUserService.insert(ptUser); + map.put("msg", result == true ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectPtPhone") + public Map selectPtPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("account", phone); + try { + int count = patientUserService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改密码 + */ + @RequestMapping(value = "updatePtUserPassword") + public Map updatePtUserPassword(PatientUser patientUser) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(patientUser!=null && (StringUtils.isNotEmpty(patientUser.getAccount()) && StringUtils.isNotEmpty(patientUser.getPassword()))){ + wrapper.eq("account", patientUser.getAccount()); + //判断旧密码是否相同 + patientUser.setPassword(MD5.GetMD5Code(patientUser.getPassword())); + boolean result = patientUserService.update(patientUser, wrapper); + map.put("msg", result == true ? "1" : "2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 个人信息 + */ + @RequestMapping(value = "selectPtUser") + public Map selectPtUser(String account,String ptCard) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + if(StringUtils.isNotEmpty(account)){ + wrapper.eq("account", account); + }else if(StringUtils.isNotEmpty(ptCard)){ + wrapper.eq("card", ptCard); + } + + try { + if (StringUtils.isNotEmpty(account) || StringUtils.isNotEmpty(ptCard)) { + PatientUser patientUser=patientUserService.selectOne(wrapper); + map.put("patientUser", patientUser); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "updatePtUser") + public Map updatePtUser(PatientUser ptUser) { + Map map = new HashMap(); + try { + if (ptUser != null) { + if(StringUtils.isNotEmpty(ptUser.getPtName())){ + ptUser.setPtName(ptUser.getPtName()); + } + if(StringUtils.isNotEmpty(ptUser.getCard())){ + ptUser.setCard(ptUser.getCard()); + } + if(StringUtils.isNotEmpty(ptUser.getPhone())){ + ptUser.setPhone(ptUser.getPhone()); + } + + boolean result = patientUserService.updateById(ptUser); + map.put("msg", result == true ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java b/backend/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java new file mode 100644 index 0000000..e83bd27 --- /dev/null +++ b/backend/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java @@ -0,0 +1,191 @@ +package com.imurs.controller.maternity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.PatientUser; +import com.imurs.entity.PatientUserRecord; +import com.imurs.entity.PatientUserRecordImg; +import com.imurs.service.PatientUserRecordImgService; +import com.imurs.service.PatientUserRecordService; +import com.imurs.service.PatientUserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping("record") +public class PatientUserRecordController { + + @Autowired + PatientUserRecordService patientUserRecordService; + @Autowired + PatientUserRecordImgService patientUserRecordImgService; + @Autowired + PatientUserService patientUserService; + + + /** + *资料上传 + */ + @Transactional + @RequestMapping("inserRecord") + public Map inserRecord(@RequestBody List rdList) { + Map map = new HashMap(); + boolean result=false; + try { + if (!rdList.isEmpty() && rdList.get(0) != null) { + result = patientUserRecordService.insert(rdList.get(0)); + if (result == true) { + Integer id=rdList.get(0).getId(); + for (int i = 0; i < rdList.get(0).getImgList().size(); i++) { + rdList.get(0).getImgList().get(i).setRdId(id); + patientUserRecordImgService.insert(rdList.get(0).getImgList().get(i)); + } + } + map.put("msg", result == true?"1":"2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping(value = "selectRecordPage") + public Map selectRecordPage(Integer uid,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?10:pageSize); + + if(uid!=null){ + wrapper.eq("pt_uid", uid); + } + wrapper.orderBy("id",false); + try { + Page pageList=patientUserRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "selectRecordPtUserPage") + public Map selectRecordPtUserPage(String startTime,String endTime,String ptName,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("ptName", ptName); + + try { + Pagetion pageList=patientUserRecordService.selectRecordPtUserPage(map,pageNo, pageSize); + map.put("pageList", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("ptName"); + map.remove("endTime"); + map.remove("startTime"); + } + return map; + } + + + /** + * 数据统计 + */ + @RequestMapping(value = "selectRecordCount") + public Map selectRecordCount(Integer ptUid) { + Map map = new HashMap(); + List rdList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(ptUid!=null){ + wrapper.eq("pt_uid", ptUid).orderBy("id", false); + rdList=patientUserRecordService.selectList(wrapper); + if(!rdList.isEmpty()){ + map.put("rdList", rdList); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + + return map; + } + + + @RequestMapping(value = "selectRecordImg") + public Map selectRecordImg(Integer rdId) { + Map map = new HashMap(); + List imgList=new ArrayList(); + try { + if(rdId!=null){ + map.put("rd_id", rdId); + imgList=patientUserRecordImgService.selectByMap(map); + map.remove("rd_id"); + map.put("imgList", imgList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "selectRecordById") + public Map selectRecordById(Integer id) { + Map map = new HashMap(); + PatientUserRecord patientUserRecord=new PatientUserRecord(); + PatientUser patientUser=new PatientUser(); + List imgList=new ArrayList(); + map.put("rd_id", id); + try { + if(id!=null){ + patientUserRecord=patientUserRecordService.selectById(id); + patientUser=patientUserService.selectById(patientUserRecord.getPtUid()); + imgList=patientUserRecordImgService.selectByMap(map); + map.put("patientUser", patientUser); + map.put("imgList", imgList); + map.put("patientUserRecord", patientUserRecord); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + }finally { + map.remove("rd_id"); + } + return map; + } + +} diff --git a/backend/src/main/java/com/imurs/dao/AgoraRecordMapper.java b/backend/src/main/java/com/imurs/dao/AgoraRecordMapper.java new file mode 100644 index 0000000..4a73144 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/AgoraRecordMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.AgoraRecord; + +public interface AgoraRecordMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java b/backend/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java new file mode 100644 index 0000000..3e00aa1 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.AiQcVocabulary; + +public interface AiQcVocabularyMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/imurs/dao/ApiUrlMapper.java b/backend/src/main/java/com/imurs/dao/ApiUrlMapper.java new file mode 100644 index 0000000..a9531bc --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApiUrlMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApiUrl; + +public interface ApiUrlMapper extends BaseMapper{ + +} diff --git a/backend/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java new file mode 100644 index 0000000..36c57f0 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBModeImg; + +public interface ApplyBModeImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyBModeMapper.java b/backend/src/main/java/com/imurs/dao/ApplyBModeMapper.java new file mode 100644 index 0000000..8db139d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyBModeMapper.java @@ -0,0 +1,23 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.utils.Excelvo; + +public interface ApplyBModeMapper extends BaseMapper{ + + public List selectBmodePage(Map map); + + public List> selectBmodeSpePage(Map map); + + public List> diagnosisTypeNumber(); + + public List> hospitalApplyNumber(); + List selectWorkTotalByTime(@Param("startTime")String startTime, @Param("endTime")String endTime, @Param("conditions")String conditions,@Param("consultationMode")String consultationMode, @Param("categoryHospitalId")String categoryHospitalId ); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java b/backend/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java new file mode 100644 index 0000000..8c09456 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBModeSpecialist; + +public interface ApplyBModeSpecialistMapper extends BaseMapper{ + + List> selectbySpe(@Param("startTime")String startTime, @Param("endTime")String endTime); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java new file mode 100644 index 0000000..1f44329 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyCaseImg; + + +public interface ApplyCaseImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyCaseMapper.java b/backend/src/main/java/com/imurs/dao/ApplyCaseMapper.java new file mode 100644 index 0000000..fb3b6fa --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyCaseMapper.java @@ -0,0 +1,35 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyCase; + +public interface ApplyCaseMapper extends BaseMapper{ + + public List export(Map map); + + public List getExport(Map map); + + public List arrangeOutExport(Map map); + + public List arrangeGetExport(Map map); + + public List selectCasePage(Map map); + + public ApplyCase selectCaseById(Long id); + + public List selectAdminCasePage(Map map); + + public int selectUpWayReferralNumer(Map upWayReferralMap); + + public int selectDownWayReferralNumer(Map upWayReferralMap); + + public List selectCasePatient(Map map); + + public Boolean updateByHis(Map map2); + + public Map selectPatientById(Map map); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java b/backend/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java new file mode 100644 index 0000000..f8c9c3a --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsulationSpecialist; + +public interface ApplyConsulationSpecialistMapper extends BaseMapper{ + +} diff --git a/backend/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java new file mode 100644 index 0000000..0092b47 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsultationImg; + +public interface ApplyConsultationImgMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyConsultationMapper.java b/backend/src/main/java/com/imurs/dao/ApplyConsultationMapper.java new file mode 100644 index 0000000..402eb51 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyConsultationMapper.java @@ -0,0 +1,21 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsultation; + + +public interface ApplyConsultationMapper extends BaseMapper{ + + public List selectConByCategory(Map map); + + public List selectConPatient(Map map); + + public int selectConsultationNumer(Map downWayReferralMap); + + public List selectConsultationSpe(Map map); + + public List selectConByPage(Map map); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java b/backend/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java new file mode 100644 index 0000000..ff2b97a --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java @@ -0,0 +1,22 @@ +package com.imurs.dao; + + +import java.util.Map; + + +import java.util.List; + + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyDoctorPromote; + + +public interface ApplyDoctorPromoteMapper extends BaseMapper{ + + + int selectrefresherCount(Map refresherNumerMap); + + public List selectAdminPromote(Map map); + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java new file mode 100644 index 0000000..d95c076 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcgImg; + +public interface ApplyEcgImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyEcgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyEcgMapper.java new file mode 100644 index 0000000..170c942 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyEcgMapper.java @@ -0,0 +1,16 @@ +package com.imurs.dao; + + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcg; + +public interface ApplyEcgMapper extends BaseMapper{ + + public List selectEcgPage(Map map); + + public List selectEcgSpePage(Map map); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java b/backend/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java new file mode 100644 index 0000000..c750235 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcgSpecialist; + +public interface ApplyEcgSpecialistMapper extends BaseMapper{ + +} diff --git a/backend/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java new file mode 100644 index 0000000..078c3ed --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyInformationImg; + + +public interface ApplyInformationImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyInformationMapper.java b/backend/src/main/java/com/imurs/dao/ApplyInformationMapper.java new file mode 100644 index 0000000..852a742 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyInformationMapper.java @@ -0,0 +1,22 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyInformation; + + +public interface ApplyInformationMapper extends BaseMapper{ + + List selectHospitalList(String hospitalName); + + List selectInfromationList(Map infromationMap); + + + List findAifmAdminPage(Map map); + + + boolean updateByIds(List applyInformation); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyLisMapper.java b/backend/src/main/java/com/imurs/dao/ApplyLisMapper.java new file mode 100644 index 0000000..08eb295 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyLisMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyLis; + +public interface ApplyLisMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java b/backend/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java new file mode 100644 index 0000000..8a9ad7d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologyFile; + +public interface ApplyPathologyFileMapper extends BaseMapper{ + +} + diff --git a/backend/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java b/backend/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java new file mode 100644 index 0000000..c1dda8a --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologyImg; + +public interface ApplyPathologyImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyPathologyMapper.java b/backend/src/main/java/com/imurs/dao/ApplyPathologyMapper.java new file mode 100644 index 0000000..4dc24a2 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyPathologyMapper.java @@ -0,0 +1,17 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathology; + + +public interface ApplyPathologyMapper extends BaseMapper{ + + public List selectAphPage(Map map); + + public List selectAphSpePage(Map map); + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java b/backend/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java new file mode 100644 index 0000000..44efc9d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologySpecialist; + + +public interface ApplyPathologySpecialistMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ApplySpecialistMapper.java b/backend/src/main/java/com/imurs/dao/ApplySpecialistMapper.java new file mode 100644 index 0000000..6afd558 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ApplySpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplySpecialist; + +public interface ApplySpecialistMapper extends BaseMapper{ + +} diff --git a/backend/src/main/java/com/imurs/dao/BModeReportMapper.java b/backend/src/main/java/com/imurs/dao/BModeReportMapper.java new file mode 100644 index 0000000..8942dcc --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BModeReportMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BModeReport; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BModeReportMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/imurs/dao/BdiagnosisMapper.java b/backend/src/main/java/com/imurs/dao/BdiagnosisMapper.java new file mode 100644 index 0000000..344c0ea --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BdiagnosisMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Bdiagnosis; + +public interface BdiagnosisMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java b/backend/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java new file mode 100644 index 0000000..38cdcb6 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java @@ -0,0 +1,12 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BdiagnosisNext; + +public interface BdiagnosisNextMapper extends BaseMapper { + + List selectDiagnosisList(Integer id); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java b/backend/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java new file mode 100644 index 0000000..7b998c8 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodeMachineModel; + +public interface BmodeMachineModelMapper extends BaseMapper{ + +} diff --git a/backend/src/main/java/com/imurs/dao/BmodelFrisMapper.java b/backend/src/main/java/com/imurs/dao/BmodelFrisMapper.java new file mode 100644 index 0000000..0734393 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BmodelFrisMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodelFris; + +public interface BmodelFrisMapper extends BaseMapper { + Integer insert(BmodelFris record); + + int insertSelective(BmodelFris record); + + List selectBmodelFris(int id); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/BmodelHisotryMapper.java b/backend/src/main/java/com/imurs/dao/BmodelHisotryMapper.java new file mode 100644 index 0000000..48cb39a --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BmodelHisotryMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BModeHistory; + + + +public interface BmodelHisotryMapper extends BaseMapper { + + + public List selectBmodeHis(Map map); +} diff --git a/backend/src/main/java/com/imurs/dao/BmodelMapper.java b/backend/src/main/java/com/imurs/dao/BmodelMapper.java new file mode 100644 index 0000000..e5a6600 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BmodelMapper.java @@ -0,0 +1,19 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; + +import com.imurs.entity.Bmodel; + +public interface BmodelMapper extends BaseMapper { + int deleteByPrimaryKey(Integer id); + + Integer insert(Bmodel record); + + int insertSelective(Bmodel record); + + Bmodel selectByPrimaryKey(Integer id); + + int updateByPrimaryKeySelective(Bmodel record); + + int updateByPrimaryKey(Bmodel record); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/BmodelSecondMapper.java b/backend/src/main/java/com/imurs/dao/BmodelSecondMapper.java new file mode 100644 index 0000000..26235cc --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/BmodelSecondMapper.java @@ -0,0 +1,26 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodelSecond; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; + +public interface BmodelSecondMapper extends BaseMapper { + int deleteByPrimaryKey(Integer thirdId); + + Integer insert(BmodelSecondWithBLOBs record); + + int insertSelective(BmodelSecondWithBLOBs record); + + BmodelSecondWithBLOBs selectByPrimaryKey(Integer thirdId); + + int updateByPrimaryKeySelective(BmodelSecondWithBLOBs record); + + int updateByPrimaryKeyWithBLOBs(BmodelSecondWithBLOBs record); + + int updateByPrimaryKey(BmodelSecond record); + + List selectbmodelSecond(int id); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/CaseTemplateMapper.java b/backend/src/main/java/com/imurs/dao/CaseTemplateMapper.java new file mode 100644 index 0000000..063541f --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/CaseTemplateMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.CaseTemplate; + +public interface CaseTemplateMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java b/backend/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java new file mode 100644 index 0000000..07a9d4d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java @@ -0,0 +1,11 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ClinicalGuidelines; + +public interface ClinicalGuidelinesMapper extends BaseMapper{ + public List selectCgsOrByDocIdPage(Map map); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/DoctorArrangeMapper.java b/backend/src/main/java/com/imurs/dao/DoctorArrangeMapper.java new file mode 100644 index 0000000..8041ba5 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/DoctorArrangeMapper.java @@ -0,0 +1,33 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.DoctorArrange; + +public interface DoctorArrangeMapper extends BaseMapper{ + + public List selectHonmeShowArrange(); + + public List homeShowArrange(Map map); + + public DoctorArrange selectTotanumberDay(Map map); + + public List selectTotaDay(Map map); + + + public List selectByArrangePage(Map map); + + + public DoctorArrange selectArrangeByUser(Long id); + + int selectdoctorTotaDay(Map map); + List selectDoctorArrangeList(Map map); + + Map selectAccreditedMedicalNumber(Map map1); + + + public List selectArrangeByRhId(String receiveHospitalId); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/DoctorGroupMapper.java b/backend/src/main/java/com/imurs/dao/DoctorGroupMapper.java new file mode 100644 index 0000000..9b7ecd4 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/DoctorGroupMapper.java @@ -0,0 +1,19 @@ +package com.imurs.dao; + + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.DoctorGroup; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Mapper +* @createDate 2025-11-13 12:08:54 +* @Entity generator.entity.DoctorGroup +*/ +public interface DoctorGroupMapper extends BaseMapper { + +} + + + + diff --git a/backend/src/main/java/com/imurs/dao/EsRepository.java b/backend/src/main/java/com/imurs/dao/EsRepository.java new file mode 100644 index 0000000..6c11922 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/EsRepository.java @@ -0,0 +1,13 @@ +package com.imurs.dao; + + + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +import com.imurs.entity.BMDReportInfo; + +public interface EsRepository extends ElasticsearchRepository { + + + +} diff --git a/backend/src/main/java/com/imurs/dao/HomePageShowMapper.java b/backend/src/main/java/com/imurs/dao/HomePageShowMapper.java new file mode 100644 index 0000000..9d9ae6d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/HomePageShowMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.HomePageShow; + +public interface HomePageShowMapper extends BaseMapper{ + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/ImgArrangeMapper.java b/backend/src/main/java/com/imurs/dao/ImgArrangeMapper.java new file mode 100644 index 0000000..428805a --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/ImgArrangeMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ImgArrange; + + +public interface ImgArrangeMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/InoneagentBloodMapper.java b/backend/src/main/java/com/imurs/dao/InoneagentBloodMapper.java new file mode 100644 index 0000000..68edc66 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/InoneagentBloodMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentBlood; + + +public interface InoneagentBloodMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/InoneagentEcgMapper.java b/backend/src/main/java/com/imurs/dao/InoneagentEcgMapper.java new file mode 100644 index 0000000..b476d42 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/InoneagentEcgMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentEcg; + + + +public interface InoneagentEcgMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/InoneagentPersionMapper.java b/backend/src/main/java/com/imurs/dao/InoneagentPersionMapper.java new file mode 100644 index 0000000..499fa3d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/InoneagentPersionMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentPersion; + + + +public interface InoneagentPersionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/InoneagentUrineMapper.java b/backend/src/main/java/com/imurs/dao/InoneagentUrineMapper.java new file mode 100644 index 0000000..6bfbfa0 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/InoneagentUrineMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentUrine; + + + +public interface InoneagentUrineMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/InstallModelMapper.java b/backend/src/main/java/com/imurs/dao/InstallModelMapper.java new file mode 100644 index 0000000..40cc59b --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/InstallModelMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Repository; + +@Repository +public interface InstallModelMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/imurs/dao/LiveMapper.java b/backend/src/main/java/com/imurs/dao/LiveMapper.java new file mode 100644 index 0000000..1cf5413 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/LiveMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Live; +import org.springframework.stereotype.Repository; + +@Repository +public interface LiveMapper extends BaseMapper { + + public List selectLivePage(Map map); +} diff --git a/backend/src/main/java/com/imurs/dao/LoginRecordMapper.java b/backend/src/main/java/com/imurs/dao/LoginRecordMapper.java new file mode 100644 index 0000000..93fe976 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/LoginRecordMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.LoginRecord; + + +public interface LoginRecordMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/PatientMapper.java b/backend/src/main/java/com/imurs/dao/PatientMapper.java new file mode 100644 index 0000000..5aa8270 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/PatientMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Patient; + + +public interface PatientMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/PatientUserMapper.java b/backend/src/main/java/com/imurs/dao/PatientUserMapper.java new file mode 100644 index 0000000..c4cb4d4 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/PatientUserMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUser; + +public interface PatientUserMapper extends BaseMapper{ +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java b/backend/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java new file mode 100644 index 0000000..c53a1b6 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUserRecordImg; + +public interface PatientUserRecordImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/PatientUserRecordMapper.java b/backend/src/main/java/com/imurs/dao/PatientUserRecordMapper.java new file mode 100644 index 0000000..e75fa2c --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/PatientUserRecordMapper.java @@ -0,0 +1,12 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUserRecord; + +public interface PatientUserRecordMapper extends BaseMapper{ + + public List selectRecordPtUserPage(Map map); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/RoleMapper.java b/backend/src/main/java/com/imurs/dao/RoleMapper.java new file mode 100644 index 0000000..d9df22c --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/RoleMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Role; + + +public interface RoleMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/SectionMapper.java b/backend/src/main/java/com/imurs/dao/SectionMapper.java new file mode 100644 index 0000000..1a579f9 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/SectionMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Section; + + +public interface SectionMapper extends BaseMapper
{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/SysMenuMapper.java b/backend/src/main/java/com/imurs/dao/SysMenuMapper.java new file mode 100644 index 0000000..360d076 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/SysMenuMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.SysMenu; + +public interface SysMenuMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java b/backend/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java new file mode 100644 index 0000000..38bfad9 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalClinicalGuidelines; +public interface TotalClinicalGuidelinesMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TotalInformationMapper.java b/backend/src/main/java/com/imurs/dao/TotalInformationMapper.java new file mode 100644 index 0000000..f046e4d --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TotalInformationMapper.java @@ -0,0 +1,13 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalInformation; + +public interface TotalInformationMapper extends BaseMapper { + + public List selectTotalInformationAll(Map map); + public TotalInformation totaTotalInformation(Map map); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TotalTrainingMapper.java b/backend/src/main/java/com/imurs/dao/TotalTrainingMapper.java new file mode 100644 index 0000000..0958734 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TotalTrainingMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + + +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalTraining; + +public interface TotalTrainingMapper extends BaseMapper { + + public TotalTraining selectTotanNumberTraining (Map map); + + public Map selectLectureTrainingAndNember(Map map2); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TrainingFlowerMapper.java b/backend/src/main/java/com/imurs/dao/TrainingFlowerMapper.java new file mode 100644 index 0000000..67c5606 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TrainingFlowerMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingFlower; + +public interface TrainingFlowerMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TrainingMapper.java b/backend/src/main/java/com/imurs/dao/TrainingMapper.java new file mode 100644 index 0000000..7659102 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TrainingMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Training; + +public interface TrainingMapper extends BaseMapper { + public List selectTraining(Map map); + + int selectTotalTopicNumber(Map map); + + public List selectBasePage(Map map); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TrainingOpinionMapper.java b/backend/src/main/java/com/imurs/dao/TrainingOpinionMapper.java new file mode 100644 index 0000000..505a8ec --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TrainingOpinionMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingOpinion; + +public interface TrainingOpinionMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TrainingPlanMapper.java b/backend/src/main/java/com/imurs/dao/TrainingPlanMapper.java new file mode 100644 index 0000000..49b5c98 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TrainingPlanMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingPlan; + +public interface TrainingPlanMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/TrainingRecordMapper.java b/backend/src/main/java/com/imurs/dao/TrainingRecordMapper.java new file mode 100644 index 0000000..94fd5e7 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/TrainingRecordMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingRecord; + +public interface TrainingRecordMapper extends BaseMapper{ + + public List selectAdminRecord(Map map); + + public TrainingRecord selectTrainingRecordById(Long id); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/UserMapper.java b/backend/src/main/java/com/imurs/dao/UserMapper.java new file mode 100644 index 0000000..d468c39 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/UserMapper.java @@ -0,0 +1,21 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.User; + + +public interface UserMapper extends BaseMapper{ + + public List selectUserPageByDoc(Map map); + + public User selectUserByUid(Long uid); + + public Map selectByappuserID(Long id); + + public User selectUserByPhone(String phone); + + boolean updateByIds(List users); +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/VideoRecordMapper.java b/backend/src/main/java/com/imurs/dao/VideoRecordMapper.java new file mode 100644 index 0000000..19d4495 --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/VideoRecordMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.VideoRecord; + +public interface VideoRecordMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/dao/WebLogMapper.java b/backend/src/main/java/com/imurs/dao/WebLogMapper.java new file mode 100644 index 0000000..7bac12b --- /dev/null +++ b/backend/src/main/java/com/imurs/dao/WebLogMapper.java @@ -0,0 +1,20 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.WebLog; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.Date; + +@Mapper +@Repository +public interface WebLogMapper extends BaseMapper { + + /** + * 根据时间差删除表中的数据 + * @param date 当前时间 + * @return + */ + int deleteWebLog(Date date); +} diff --git a/backend/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java b/backend/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java new file mode 100644 index 0000000..1201e76 --- /dev/null +++ b/backend/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java @@ -0,0 +1,45 @@ +package com.imurs.dto; + +/** + * @author wang + * @date 2021年05月19日 12:07 + * 监控平台登录用户 + */ +public class AgoraLoginUserDTO { + String username; + String password; + String rid; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + @Override + public String toString() { + return "AgoraLoginUser{" + + "username='" + username + '\'' + + ", password='" + password + '\'' + + ", rid='" + rid + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/dto/SpecialistSubmitDto.java b/backend/src/main/java/com/imurs/dto/SpecialistSubmitDto.java new file mode 100644 index 0000000..b6f262f --- /dev/null +++ b/backend/src/main/java/com/imurs/dto/SpecialistSubmitDto.java @@ -0,0 +1,72 @@ +package com.imurs.dto; + +import java.io.Serializable; + +/** + * 接口bmode/updateSpecialistBySubmit所用的dto类 + */ +public class SpecialistSubmitDto implements Serializable { + + /** + * 联系人id + */ + private Long contactsId; + + /** + * 超声id + */ + private Long bId; + + /** + * 提交报告人id + */ + private Long userId; + + /** + * 提交报告人名字 + */ + private String userName; + + + public Long getContactsId() { + return contactsId; + } + + public void setContactsId(Long contactsId) { + this.contactsId = contactsId; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "SpecialistSubmitDto{" + + "contactsId=" + contactsId + + ", bId=" + bId + + ", userId=" + userId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/entity/AgoraRecord.java b/backend/src/main/java/com/imurs/entity/AgoraRecord.java new file mode 100644 index 0000000..5a016f9 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/AgoraRecord.java @@ -0,0 +1,65 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +@TableName("agora_record") +public class AgoraRecord implements Serializable { + @TableId(value = "id", type = IdType.AUTO) + private Long id;; + @TableField("esrd_number") + private String esrdNumber; + @TableField("create_time") + private Date createTime; + @TableField("reg_dir") + private String regDir; + + private static final long serialVersionUID = 1L; + + public AgoraRecord(Long id, String esrdNumber, Date createTime, String regDir) { + this.id = id; + this.esrdNumber = esrdNumber; + this.createTime = createTime; + this.regDir = regDir; + } + + public AgoraRecord() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getRegDir() { + return regDir; + } + + public void setRegDir(String regDir) { + this.regDir = regDir == null ? null : regDir.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/AiQcVocabulary.java b/backend/src/main/java/com/imurs/entity/AiQcVocabulary.java new file mode 100644 index 0000000..643edac --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/AiQcVocabulary.java @@ -0,0 +1,108 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import java.io.Serializable; +import java.util.Date; + +/** + * AI 质控词库实体类 + */ +@TableName("ai_qc_vocabulary") +public class AiQcVocabulary implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String rawText; // 原始文本/错词 + private String correctText; // 正确词 + private String vocabType; // L1/L2/L3/Pinyin + private String status; // draft/approved + private String creatorId; // 提交人ID + private String creatorName; // 提交人姓名 + private Integer frequency; // 出现频次 + private String examineType; // US/CT/MRI + private Date createTime; // 创建时间 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getRawText() { + return rawText; + } + + public void setRawText(String rawText) { + this.rawText = rawText; + } + + public String getCorrectText() { + return correctText; + } + + public void setCorrectText(String correctText) { + this.correctText = correctText; + } + + public String getVocabType() { + return vocabType; + } + + public void setVocabType(String vocabType) { + this.vocabType = vocabType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatorId() { + return creatorId; + } + + public void setCreatorId(String creatorId) { + this.creatorId = creatorId; + } + + public String getCreatorName() { + return creatorName; + } + + public void setCreatorName(String creatorName) { + this.creatorName = creatorName; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public String getExamineType() { + return examineType; + } + + public void setExamineType(String examineType) { + this.examineType = examineType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} diff --git a/backend/src/main/java/com/imurs/entity/ApiUrl.java b/backend/src/main/java/com/imurs/entity/ApiUrl.java new file mode 100644 index 0000000..118de40 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApiUrl.java @@ -0,0 +1,82 @@ +package com.imurs.entity; + +import java.io.Serializable; + + +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("api_url") +public class ApiUrl implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + private String url; + + private String uname; + + private String state; + + private String usable; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getUsable() { + return usable; + } + + public void setUsable(String usable) { + this.usable = usable; + } + + public ApiUrl(Integer id, String url, String uname, String state, String usable) { + super(); + this.id = id; + this.url = url; + this.uname = uname; + this.state = state; + this.usable = usable; + } + + public ApiUrl() { + super(); + } +} diff --git a/backend/src/main/java/com/imurs/entity/ApplyBMode.java b/backend/src/main/java/com/imurs/entity/ApplyBMode.java new file mode 100644 index 0000000..854bb0b --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyBMode.java @@ -0,0 +1,926 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * b超 + * + * @author D140 + * + */ +@TableName("apply_b_mode") +public class ApplyBMode implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("group_alias") + private String groupAlias; + + @TableField("report_status") + private Long reportStatus; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + private String past; + + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String opinion; + + @TableField("b_see") + private String bSee; + + @TableField("b_hint") + private String bHint; + + private String status; + + private String sex; + + private Integer age; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private List abmSp; + + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + private String conditions; + + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_part_type") + private String examinePartType; + + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("examine_doc_name") + private String examineDocName; + + private Integer state; + + @TableField("enter_date") + private Date enterDate; + + @TableField("enter_chamber") + private String enterChamber; + + @TableField("diagnosis_type") + private String diagnosisType; + + @TableField("out_patien") + private String outPatien; + + @TableField("category_hospital") + private String categoryHospital; + + @TableField("group_hospital") + private String groupHospital; + + @TableField(exist = false) + private List abmList; + + private String btype; + + @TableField("nuh_section") + private String nuhSection; + + @TableField("nuh_time") + private Date nuhTime; + + private String allergy; + + private String present; + + private String examine; + + @TableField("patient_type") + private String patientType; + + @TableField("initial_diagnoses") + private String initialDiagnoses; + + private String section; + + @TableField("dismiss_reason") + private String dismissReason; + + @TableField("consultation_way") + private String consultationWay; + + + @TableField("overall_opinion") + private String overallOpinion; + + @TableField("report_doctor") + private String reportDoctor; + + private Integer active; + + private String modifier; + + @TableField("update_time") + private Date updateTime; + + @TableField("report_time") + private Date reportTime; + + @TableField("login_doc") + private String loginDoc; + + @TableField("nature") + private Integer nature; + + @TableField("examine_part_num") + private Integer examinePartNum; + + /** + * 专家签名的图片地址 + */ + @TableField("specialist_signature") + private String specialistSignature; + + /** + * 基层医生的签名图片地址 + */ + @TableField("doctor_signature") + private String doctorSignature; + + + + + public String getLoginDoc() { + return loginDoc; + } + + public void setLoginDoc(String loginDoc) { + this.loginDoc = loginDoc; + } + + /** + * 超声类型 本地:0 远程:1 + */ + @TableField("is_remote") + private String isRemote; + + /** + * 婚育史 + */ + @TableField("hys") + private String hys; + /** + * 分娩方式栏位: 剖宫产/ 顺产 两项选择 0:剖宫产 1:顺产 + */ + @TableField("fmfs") + private String fmfs; + + /** + * 末次月经时间 + */ + @TableField("lmp") + private Date lmp; + public String getHys() { + return hys; + } + + public void setHys(String hys) { + this.hys = hys; + } + + public String getFmfs() { + return fmfs; + } + + public void setFmfs(String fmfs) { + this.fmfs = fmfs; + } + + public Date getLmp() { + return lmp; + } + + public void setLmp(Date lmp) { + this.lmp = lmp; + } + + public Integer getExaminePartNum() { + return examinePartNum; + } + + public void setExaminePartNum(Integer examinePartNum) { + this.examinePartNum = examinePartNum; + } + + private static final long serialVersionUID = 1L; + + public ApplyBMode() { + } + + public ApplyBMode(Long id, Long docId, Date applyDate, String doctorName, String patientName, String complain, String past, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, String groupType, String initial, String opinion, String bSee, String bHint, String status, String sex, Integer age, String specialist, Long specialistId, List abmSp, String operator, String ptPhone, String ptCard, String ptCity, String esrdNumber, String conditions, Date examineDate, String examinePart, String examinePartType, String hisEsrdNumber, String examineDocName, Integer state, Date enterDate, String enterChamber, String diagnosisType, String outPatien, String categoryHospital, String groupHospital, List abmList, String btype, String nuhSection, Date nuhTime, String allergy, String present, String examine, String patientType, String initialDiagnoses, String section, String dismissReason, String consultationWay, String overallOpinion, String reportDoctor, Integer active, String modifier, Date updateTime, Date reportTime, Integer nature, String specialistSignature, String doctorSignature, String isRemote,Long reportStatus,String groupAlias){ + this.id = id; + this.reportStatus = reportStatus; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.past = past; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.opinion = opinion; + this.bSee = bSee; + this.bHint = bHint; + this.status = status; + this.sex = sex; + this.age = age; + this.specialist = specialist; + this.specialistId = specialistId; + this.abmSp = abmSp; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.conditions = conditions; + this.examineDate = examineDate; + this.examinePart = examinePart; + this.examinePartType = examinePartType; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDocName = examineDocName; + this.state = state; + this.enterDate = enterDate; + this.enterChamber = enterChamber; + this.diagnosisType = diagnosisType; + this.outPatien = outPatien; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.abmList = abmList; + this.btype = btype; + this.nuhSection = nuhSection; + this.nuhTime = nuhTime; + this.allergy = allergy; + this.present = present; + this.examine = examine; + this.patientType = patientType; + this.initialDiagnoses = initialDiagnoses; + this.section = section; + this.dismissReason = dismissReason; + this.consultationWay = consultationWay; + this.overallOpinion = overallOpinion; + this.reportDoctor = reportDoctor; + this.active = active; + this.modifier = modifier; + this.updateTime = updateTime; + this.reportTime = reportTime; + this.nature = nature; + this.specialistSignature = specialistSignature; + this.doctorSignature = doctorSignature; + this.isRemote = isRemote; + this.groupAlias = groupAlias; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public Long getReportStatus() { + return reportStatus; + } + + public void setReportStatus(Long reportStatus) { + this.reportStatus = reportStatus; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public List getAbmSp() { + return abmSp; + } + + public void setAbmSp(List abmSp) { + this.abmSp = abmSp; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getConditions() { + return conditions; + } + + public void setConditions(String conditions) { + this.conditions = conditions; + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getExaminePartType() { + return examinePartType; + } + + public void setExaminePartType(String examinePartType) { + this.examinePartType = examinePartType; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getExamineDocName() { + return examineDocName; + } + + public void setExamineDocName(String examineDocName) { + this.examineDocName = examineDocName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getEnterDate() { + return enterDate; + } + + public void setEnterDate(Date enterDate) { + this.enterDate = enterDate; + } + + public String getEnterChamber() { + return enterChamber; + } + + public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getAbmList() { + return abmList; + } + + public void setAbmList(List abmList) { + this.abmList = abmList; + } + + public String getBtype() { + return btype; + } + + public void setBtype(String btype) { + this.btype = btype; + } + + public String getNuhSection() { + return nuhSection; + } + + public void setNuhSection(String nuhSection) { + this.nuhSection = nuhSection; + } + + public Date getNuhTime() { + return nuhTime; + } + + public void setNuhTime(Date nuhTime) { + this.nuhTime = nuhTime; + } + + public String getAllergy() { + return allergy; + } + + public void setAllergy(String allergy) { + this.allergy = allergy; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getExamine() { + return examine; + } + + public void setExamine(String examine) { + this.examine = examine; + } + + public String getPatientType() { + return patientType; + } + + public void setPatientType(String patientType) { + this.patientType = patientType; + } + + public String getInitialDiagnoses() { + return initialDiagnoses; + } + + public void setInitialDiagnoses(String initialDiagnoses) { + this.initialDiagnoses = initialDiagnoses; + } + + public String getSection() { + return section; + } + + public void setSection(String section) { + this.section = section; + } + + public String getDismissReason() { + return dismissReason; + } + + public void setDismissReason(String dismissReason) { + this.dismissReason = dismissReason; + } + + public String getConsultationWay() { + return consultationWay; + } + + public void setConsultationWay(String consultationWay) { + this.consultationWay = consultationWay; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public String getReportDoctor() { + return reportDoctor; + } + + public void setReportDoctor(String reportDoctor) { + this.reportDoctor = reportDoctor; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public String getModifier() { + return modifier; + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getSpecialistSignature() { + return specialistSignature; + } + + public void setSpecialistSignature(String specialistSignature) { + this.specialistSignature = specialistSignature; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getDoctorSignature() { + return doctorSignature; + } + + public void setDoctorSignature(String doctorSignature) { + this.doctorSignature = doctorSignature; + } + + public String getIsRemote() { + return isRemote; + } + + public void setIsRemote(String isRemote) { + this.isRemote = isRemote; + } + + @Override + public String toString() { + return "ApplyBMode{" + + "id=" + id + + ", docId=" + docId + + ", applyDate=" + applyDate + + ", doctorName='" + doctorName + '\'' + + ", patientName='" + patientName + '\'' + + ", complain='" + complain + '\'' + + ", past='" + past + '\'' + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", chamber='" + chamber + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", groupType='" + groupType + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", status='" + status + '\'' + + ", sex='" + sex + '\'' + + ", age=" + age + + ", specialist='" + specialist + '\'' + + ", specialistId=" + specialistId + + ", abmSp=" + abmSp + + ", operator='" + operator + '\'' + + ", ptPhone='" + ptPhone + '\'' + + ", ptCard='" + ptCard + '\'' + + ", ptCity='" + ptCity + '\'' + + ", esrdNumber='" + esrdNumber + '\'' + + ", conditions='" + conditions + '\'' + + ", examineDate=" + examineDate + + ", examinePart='" + examinePart + '\'' + + ", examinePartType='" + examinePartType + '\'' + + ", hisEsrdNumber='" + hisEsrdNumber + '\'' + + ", examineDocName='" + examineDocName + '\'' + + ", state=" + state + + ", enterDate=" + enterDate + + ", enterChamber='" + enterChamber + '\'' + + ", diagnosisType='" + diagnosisType + '\'' + + ", outPatien='" + outPatien + '\'' + + ", categoryHospital='" + categoryHospital + '\'' + + ", groupHospital='" + groupHospital + '\'' + + ", abmList=" + abmList + + ", btype='" + btype + '\'' + + ", nuhSection='" + nuhSection + '\'' + + ", nuhTime=" + nuhTime + + ", allergy='" + allergy + '\'' + + ", present='" + present + '\'' + + ", examine='" + examine + '\'' + + ", patientType='" + patientType + '\'' + + ", initialDiagnoses='" + initialDiagnoses + '\'' + + ", section='" + section + '\'' + + ", dismissReason='" + dismissReason + '\'' + + ", consultationWay='" + consultationWay + '\'' + + ", overallOpinion='" + overallOpinion + '\'' + + ", reportDoctor='" + reportDoctor + '\'' + + ", active=" + active + + ", modifier='" + modifier + '\'' + + ", updateTime=" + updateTime + + ", reportTime=" + reportTime + + ", nature=" + nature + + ", specialistSignature='" + specialistSignature + '\'' + + ", doctorSignature='" + doctorSignature + '\'' + + ", isRemote='" + isRemote + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyBModeImg.java b/backend/src/main/java/com/imurs/entity/ApplyBModeImg.java new file mode 100644 index 0000000..04db013 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyBModeImg.java @@ -0,0 +1,172 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +/*** + * b超图片表 + * @author D140 + * + */ +@TableName("apply_b_mode_img") +public class ApplyBModeImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("b_id") + private Long bId; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("new_imgurl") + private String newImgurl; + + @TableField("img_width") + private String imgWidth; + + @TableField("img_length") + private String imgLength; + + @TableField("file_name") + private String fileName; + + @TableField("img_id") + private Long imgId; + + @TableField("father_id") + private Long fatherId; + + private String status; + + private static final long serialVersionUID = 1L; + + public ApplyBModeImg() { + } + + public ApplyBModeImg(Long id, Long bId, Integer type, String imgUrl, Date createTime, String newImgurl, String imgWidth, String imgLength, String fileName, Long imgId, Long fatherId, String status) { + this.id = id; + this.bId = bId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.newImgurl = newImgurl; + this.imgWidth = imgWidth; + this.imgLength = imgLength; + this.fileName = fileName; + this.imgId = imgId; + this.fatherId = fatherId; + this.status = status; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getNewImgurl() { + return newImgurl; + } + + public void setNewImgurl(String newImgurl) { + this.newImgurl = newImgurl; + } + + public String getImgWidth() { + return imgWidth; + } + + public void setImgWidth(String imgWidth) { + this.imgWidth = imgWidth; + } + + public String getImgLength() { + return imgLength; + } + + public void setImgLength(String imgLength) { + this.imgLength = imgLength; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Long getImgId() { + return imgId; + } + + public void setImgId(Long imgId) { + this.imgId = imgId; + } + + public Long getFatherId() { + return fatherId; + } + + public void setFatherId(Long fatherId) { + this.fatherId = fatherId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java b/backend/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java new file mode 100644 index 0000000..1f8bbee --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java @@ -0,0 +1,165 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_b_mode_specialist") +public class ApplyBModeSpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("b_id") + private Long bId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("diagnosis_type") + private String diagnosisType; + + @TableField("group_date") + private Date groupDate; + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + /** + * 专家号码 + */ + @TableField("contact_phone") + private String contactPhone; + + @TableField(exist = false) + private String dismissReason; + + private static final long serialVersionUID = 1L; + + public String getDismissReason() { + return dismissReason; + } + + public void setDismissReason(String dismissReason) { + this.dismissReason = dismissReason; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public ApplyBModeSpecialist(Long id, Long speId, String speName, Integer state, Long bId, Date createTime, + Date updateTime, String diagnosisType, String dismissReason, String contactPhone, + Date groupDate) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.bId = bId; + this.createTime = createTime; + this.updateTime = updateTime; + this.diagnosisType = diagnosisType; + this.dismissReason = dismissReason; + this.contactPhone = contactPhone; + this.groupDate = groupDate; + } + + public ApplyBModeSpecialist() { + super(); + // TODO Auto-generated constructor stub + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyCase.java b/backend/src/main/java/com/imurs/entity/ApplyCase.java new file mode 100644 index 0000000..785fbaa --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyCase.java @@ -0,0 +1,853 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊表 + * + * @author Server + * + */ +@TableName("apply_case") +public class ApplyCase implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 患者Id + */ + @TableField("patient_id") + private Long patientId; + + /** + * 2:复诊/1:出诊 + */ + private Integer diagnose; + + /** + * 1:急病/2:慢病 + */ + private Integer illness; + + /** + * 主述 + */ + private String complain; + + /** + * 现病史 + */ + private String present; + + /** + * 既往史 + */ + private String past; + + /** + * 初步诊断 + */ + private String initial; + + /** + * 初步治疗计划 + */ + @TableField("cure_plan") + private String curePlan; + + /** + * 患者Id + */ + private String programme; + + /** + * 申请时间 + */ + @TableField("apply_date") + private Date applyDate; + + /** + * 申请医生姓名 + */ + @TableField("apply_name") + private String applyName; + + /** + * 申请医生科室 + */ + private String chamber; + + /** + * 申请医生职称 + */ + @TableField("apply_job") + private String applyJob; + + /** + * 申请医院编号 + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 申请医生id + */ + @TableField("apply_user_id") + private Long applyUserId; + + /** + * 申请医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 转诊理由 + */ + @TableField("change_reason") + private String changeReason; + + /** + * 拟转诊医院 + */ + @TableField("plan_hospital") + private String planHospital; + + /** + * 拟转诊时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("plan_time") + private Date planTime; + + /** + * 拟转诊科室 + */ + @TableField("plan_chamber") + private String planChamber; + + /** + * 拟转诊医院id + */ + @TableField("plan_hospital_id") + private String planHospitalId; + + /** + * 状态 + */ + private String statu; + + /** + * 分配专家编号 + */ + @TableField("specialist_id") + private Long specialistId; + + /** + * 经办人意见 + */ + private String opinion; + + /** + * 受理医生职称 + */ + @TableField("doc_job") + private String docJob; + + /** + * 受理医生意见 + */ + @TableField("doc_explaination") + private String docExplaination; + + /** + * 受理医生的科室 + */ + @TableField("doc_section") + private String docSection; + + /** + * 受理医生id + */ + @TableField("doc_user_id") + private Long docUserId; + + /** + * 受理医生姓名 + */ + @TableField("doc_user_name") + private String docUserName; + + /** + * 最终确认时间 + */ + @TableField("final_date") + private Date finalDate; + + /** + * 下转意见 + */ + private String pronation; + + /** + * 向上转诊还是向下转诊(A、上 B、下) + */ + private String type; + + /** + * 操作人 + */ + private String operator; + + /** + * 基层医院id + */ + @TableField("base_id") + private String baseId; + + /** + * 基层医院暂存字段 + */ + @TableField("plan_base_id") + private String planBaseId; + + /** + * 住院号 + */ + private String inpatient; + + /** + * 医保类型 1:省医保 2:市职工医保 3:市居民医保 4:新农合 5:自费 6:异地医保 7:其他 + */ + @TableField("protect_type") + private Integer protectType; + + /** + * 第一诊断 + */ + @TableField("one_initial") + private String oneInitial; + + /** + * 第二诊断 + */ + @TableField("two_initial") + private String twoInitial; + + /** + * 出院诊断 + */ + @TableField("out_diagnosis") + private String outDiagnosis; + + /** + * 是否双向转诊(Y/N)是否 + */ + @TableField("is_double") + private String isDouble; + + /** + * 患者姓名 + */ + @TableField("pt_name") + private String ptName; + + @TableField("pt_age") + private Integer ptAge; + + @TableField("pt_sex") + private String ptSex; + + /** + * 患者表身份证 + */ + @TableField("pt_card") + private String ptCard; + + /** + * 患者表手机号码 + */ + @TableField("pt_phone") + private String ptPhone; + + /** + * 患者家庭住址 + */ + @TableField("pt_city") + private String ptCity; + + /** + * 病情摘要 + */ + private String digest; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + @TableField(exist = false) + private String planHospitalName; + + @TableField(exist = false) + private String hospitalNames; + + @TableField(exist = false) + private List aciList; + + private static final long serialVersionUID = 1L; + + public ApplyCase() { + super(); + } + + public ApplyCase(Long id, Long patientId, Integer diagnose, Integer illness, String complain, String present, + String past, String initial, String curePlan, String programme, Date applyDate, String applyName, + String chamber, String applyJob, String hospitalId, Long applyUserId, String hospitalName, + String changeReason, String planHospital, Date planTime, String planChamber, String planHospitalId, + String statu, Long specialistId, String opinion, String docJob, String docExplaination, String docSection, + Long docUserId, String docUserName, Date finalDate, String pronation, String type, String operator, + String baseId, String planBaseId, String inpatient, Integer protectType, String oneInitial, + String twoInitial, String outDiagnosis, String isDouble, String ptName, Integer ptAge, String ptSex, + String ptCard, String ptPhone, String ptCity, String digest, String esrdNumber, String hisEsrdNumber, + String outPatien, String planHospitalName, String hospitalNames, List aciList) { + super(); + this.id = id; + this.patientId = patientId; + this.diagnose = diagnose; + this.illness = illness; + this.complain = complain; + this.present = present; + this.past = past; + this.initial = initial; + this.curePlan = curePlan; + this.programme = programme; + this.applyDate = applyDate; + this.applyName = applyName; + this.chamber = chamber; + this.applyJob = applyJob; + this.hospitalId = hospitalId; + this.applyUserId = applyUserId; + this.hospitalName = hospitalName; + this.changeReason = changeReason; + this.planHospital = planHospital; + this.planTime = planTime; + this.planChamber = planChamber; + this.planHospitalId = planHospitalId; + this.statu = statu; + this.specialistId = specialistId; + this.opinion = opinion; + this.docJob = docJob; + this.docExplaination = docExplaination; + this.docSection = docSection; + this.docUserId = docUserId; + this.docUserName = docUserName; + this.finalDate = finalDate; + this.pronation = pronation; + this.type = type; + this.operator = operator; + this.baseId = baseId; + this.planBaseId = planBaseId; + this.inpatient = inpatient; + this.protectType = protectType; + this.oneInitial = oneInitial; + this.twoInitial = twoInitial; + this.outDiagnosis = outDiagnosis; + this.isDouble = isDouble; + this.ptName = ptName; + this.ptAge = ptAge; + this.ptSex = ptSex; + this.ptCard = ptCard; + this.ptPhone = ptPhone; + this.ptCity = ptCity; + this.digest = digest; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.planHospitalName = planHospitalName; + this.hospitalNames = hospitalNames; + this.aciList = aciList; + } + + + public String getOutPatien() { + return outPatien; + } + + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHospitalNames() { + return hospitalNames; + } + + public void setHospitalNames(String hospitalNames) { + this.hospitalNames = hospitalNames; + } + + public String getDocUserName() { + return docUserName; + } + + public void setDocUserName(String docUserName) { + this.docUserName = docUserName; + } + + public String getPlanHospitalName() { + return planHospitalName; + } + + public void setPlanHospitalName(String planHospitalName) { + this.planHospitalName = planHospitalName; + } + + public void setPlanHospitalId(String planHospitalId) { + this.planHospitalId = planHospitalId; + } + + public String getDigest() { + return digest; + } + + public void setDigest(String digest) { + this.digest = digest; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPatientId() { + return patientId; + } + + public void setPatientId(Long patientId) { + this.patientId = patientId; + } + + public Integer getDiagnose() { + return diagnose; + } + + public void setDiagnose(Integer diagnose) { + this.diagnose = diagnose; + } + + public Integer getIllness() { + return illness; + } + + public void setIllness(Integer illness) { + this.illness = illness; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getCurePlan() { + return curePlan; + } + + public void setCurePlan(String curePlan) { + this.curePlan = curePlan; + } + + public String getProgramme() { + return programme; + } + + public void setProgramme(String programme) { + this.programme = programme; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getApplyName() { + return applyName; + } + + public void setApplyName(String applyName) { + this.applyName = applyName; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getApplyJob() { + return applyJob; + } + + public void setApplyJob(String applyJob) { + this.applyJob = applyJob; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Long getApplyUserId() { + return applyUserId; + } + + public void setApplyUserId(Long applyUserId) { + this.applyUserId = applyUserId; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getChangeReason() { + return changeReason; + } + + public void setChangeReason(String changeReason) { + this.changeReason = changeReason; + } + + public String getPlanHospital() { + return planHospital; + } + + public void setPlanHospital(String planHospital) { + this.planHospital = planHospital; + } + + public Date getPlanTime() { + return planTime; + } + + public void setPlanTime(Date planTime) { + this.planTime = planTime; + } + + public String getPlanChamber() { + return planChamber; + } + + public void setPlanChamber(String planChamber) { + this.planChamber = planChamber; + } + + public String getPlanHospitalId() { + return planHospitalId; + } + + public void setPlayHospitalId(String planHospitalId) { + this.planHospitalId = planHospitalId; + } + + public String getStatu() { + return statu; + } + + public void setStatu(String statu) { + this.statu = statu; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getDocJob() { + return docJob; + } + + public void setDocJob(String docJob) { + this.docJob = docJob; + } + + public String getDocExplaination() { + return docExplaination; + } + + public void setDocExplaination(String docExplaination) { + this.docExplaination = docExplaination; + } + + public String getDocSection() { + return docSection; + } + + public void setDocSection(String docSection) { + this.docSection = docSection; + } + + public Long getDocUserId() { + return docUserId; + } + + public void setDocUserId(Long docUserId) { + this.docUserId = docUserId; + } + + public Date getFinalDate() { + return finalDate; + } + + public void setFinalDate(Date finalDate) { + this.finalDate = finalDate; + } + + public String getPronation() { + return pronation; + } + + public void setPronation(String pronation) { + this.pronation = pronation; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getBaseId() { + return baseId; + } + + public void setBaseId(String baseId) { + this.baseId = baseId; + } + + public String getPlanBaseId() { + return planBaseId; + } + + public void setPlanBaseId(String planBaseId) { + this.planBaseId = planBaseId; + } + + public String getInpatient() { + return inpatient; + } + + public void setInpatient(String inpatient) { + this.inpatient = inpatient; + } + + public Integer getProtectType() { + return protectType; + } + + public void setProtectType(Integer protectType) { + this.protectType = protectType; + } + + public String getOneInitial() { + return oneInitial; + } + + public void setOneInitial(String oneInitial) { + this.oneInitial = oneInitial; + } + + public String getTwoInitial() { + return twoInitial; + } + + public void setTwoInitial(String twoInitial) { + this.twoInitial = twoInitial; + } + + public String getOutDiagnosis() { + return outDiagnosis; + } + + public void setOutDiagnosis(String outDiagnosis) { + this.outDiagnosis = outDiagnosis; + } + + public String getIsDouble() { + return isDouble; + } + + public void setIsDouble(String isDouble) { + this.isDouble = isDouble; + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName; + } + + public Integer getPtAge() { + return ptAge; + } + + public void setPtAge(Integer ptAge) { + this.ptAge = ptAge; + } + + public String getPtSex() { + return ptSex; + } + + public void setPtSex(String ptSex) { + this.ptSex = ptSex; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public List getAciList() { + return aciList; + } + + public void setAciList(List aciList) { + this.aciList = aciList; + } + + @Override + public String toString() { + return "ApplyCase [id=" + id + ", patientId=" + patientId + ", diagnose=" + diagnose + ", illness=" + illness + + ", complain=" + complain + ", present=" + present + ", past=" + past + ", initial=" + initial + + ", curePlan=" + curePlan + ", programme=" + programme + ", applyDate=" + applyDate + ", applyName=" + + applyName + ", chamber=" + chamber + ", applyJob=" + applyJob + ", hospitalId=" + hospitalId + + ", applyUserId=" + applyUserId + ", hospitalName=" + hospitalName + ", changeReason=" + changeReason + + ", planHospital=" + planHospital + ", planTime=" + planTime + ", planChamber=" + planChamber + + ", planHospitalId=" + planHospitalId + ", statu=" + statu + ", specialistId=" + specialistId + + ", opinion=" + opinion + ", docJob=" + docJob + ", docExplaination=" + docExplaination + + ", docSection=" + docSection + ", docUserId=" + docUserId + ", docUserName=" + docUserName + + ", finalDate=" + finalDate + ", pronation=" + pronation + ", type=" + type + ", operator=" + operator + + ", baseId=" + baseId + ", planBaseId=" + planBaseId + ", inpatient=" + inpatient + ", protectType=" + + protectType + ", oneInitial=" + oneInitial + ", twoInitial=" + twoInitial + ", outDiagnosis=" + + outDiagnosis + ", isDouble=" + isDouble + ", ptName=" + ptName + ", ptAge=" + ptAge + ", ptSex=" + + ptSex + ", ptCard=" + ptCard + ", ptPhone=" + ptPhone + ", ptCity=" + ptCity + ", digest=" + digest + + ", planHospitalName=" + planHospitalName + ", hospitalNames=" + hospitalNames + ", aciList=" + aciList + + "]"; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyCaseImg.java b/backend/src/main/java/com/imurs/entity/ApplyCaseImg.java new file mode 100644 index 0000000..f4edbf9 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyCaseImg.java @@ -0,0 +1,130 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊图片表 + * @author Server + * + */ +@TableName("apply_case_img") +public class ApplyCaseImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 医生id + */ +// @TableField("doc_id") +// private Long docId; + + /** + * 患者id + */ +// @TableField("patient_id") +// private Long patientId; + + /** + * 就诊表id + */ + @TableField("case_id") + private Long caseId; + + /** + * 类型 1:病历资料 2:检查资料 3:B超资料 4:病理资料 5:DR资料 6:CT/MR资料 + */ + private Integer type; + + /** + * 图片地址 + */ + @TableField("img_url") + private String imgUrl; + + + @TableField("create_time") + private Date createTime; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public ApplyCaseImg(Long id, Long caseId, Integer type, String imgUrl, Date createTime, String fileName) { + super(); + this.id = id; + this.caseId = caseId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.fileName = fileName; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public void setType(Integer type) { + this.type = type; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public ApplyCaseImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCaseId() { + return caseId; + } + + public void setCaseId(Long caseId) { + this.caseId = caseId; + } + + public Integer getType() { + return type; + } + + public void setiType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setiImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java b/backend/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java new file mode 100644 index 0000000..c6a783d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java @@ -0,0 +1,221 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 远程会诊专家表 + * + * @author Server + * + */ +@TableName("apply_consulation_specialist") +public class ApplyConsulationSpecialist implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 视频意见 + */ + @TableField("video_idea") + private String videoIdea; + + /** + * 综合意见 + */ + @TableField("opinion_all") + private String opinionAll; + + /** + * 专家姓名 + */ + @TableField("spe_name") + private String speName; + + /** + * 状态 + */ + private Integer state; + + /** + * 远程会诊id + */ + @TableField("con_id") + private Long conId; + + /** + * 创建日期 + */ + @TableField("create_time") + private Date createTime; + + /** + * 修改日期 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 专家id + */ + @TableField("spe_id") + private Long speId; + + /** + * 可分配专家个数 + */ + @TableField("spe_number") + private Integer speNumber; + + /** + * 会诊时间 + */ + @TableField(exist = false) + private Date conTime; + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + /** + * 专家号码 + */ + @TableField("contact_phone") + private String contactPhone; + + + public Integer getSpeNumber() { + return speNumber; + } + + public void setSpeNumber(Integer speNumber) { + this.speNumber = speNumber; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getVideoIdea() { + return videoIdea; + } + + public void setVideoIdea(String videoIdea) { + this.videoIdea = videoIdea; + } + + public String getOpinionAll() { + return opinionAll; + } + + public void setOpinionAll(String opinionAll) { + this.opinionAll = opinionAll; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getConTime() { + return conTime; + } + + public void setConTime(Date conTime) { + this.conTime = conTime; + } + + public ApplyConsulationSpecialist() { + super(); + } + + public ApplyConsulationSpecialist(Long id, String videoIdea, String opinionAll, String speName, Integer state, + Long conId, Date createTime, Date updateTime, Long speId, Integer speNumber, Date conTime ,String contactPhone) { + super(); + this.id = id; + this.videoIdea = videoIdea; + this.opinionAll = opinionAll; + this.speName = speName; + this.state = state; + this.conId = conId; + this.createTime = createTime; + this.updateTime = updateTime; + this.speId = speId; + this.speNumber = speNumber; + this.conTime = conTime; + this.contactPhone = contactPhone; + + } + + @Override + public String toString() { + return "ApplyConsulationSpecialist [id=" + id + ", videoIdea=" + videoIdea + ", opinionAll=" + opinionAll + + ", speName=" + speName + ", state=" + state + ", conId=" + conId + ", createTime=" + createTime + + ", updateTime=" + updateTime + ", speId=" + speId + ", speNumber=" + speNumber + ", conTime=" + + conTime + "]"; + } + + +} diff --git a/backend/src/main/java/com/imurs/entity/ApplyConsultation.java b/backend/src/main/java/com/imurs/entity/ApplyConsultation.java new file mode 100644 index 0000000..6849443 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyConsultation.java @@ -0,0 +1,826 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 会诊申请id + * + * @author Server + * + */ +@TableName("apply_consultation") +public class ApplyConsultation implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 医生编号 + */ + @TableField("doc_id") + private Long docId; + + /** + * 申请日期 + */ + @TableField("apply_date") + private Date applyDate; + + /** + * 医生姓名 + */ + @TableField("doctor_name") + private String doctorName; + + /** + * 患者姓名 + */ + @TableField("patient_name") + private String patientName; + + /** + * 主述 + */ + private String complain; + + /** + * 过敏史 + */ + private String allergy; + + /** + * 既往史 + */ + private String past; + + /** + * 鉴别诊断 + */ + private String identify; + + /** + * + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + /** + * 所属医院 + */ + @TableField("category_hospital") + private String categoryHospital; + + /** + * 所属医院id + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + + /** + * 申请专科 + */ + private String chamber; +// /** +// * 会诊科室 +// * / + @TableField("group_chamber") + private String groupChamber; + /** + * 会诊医院 + */ + @TableField("group_hospital") + private String groupHospital; + + /** + * 会诊医院id + */ + @TableField("group_hospital_id") + private String groupHospitalId; + + /** + * 会诊类型 + */ + @TableField("group_type") + private String groupType; + + /** + * 初步诊断 + */ + private String initial; + + /** + * 现病史 + */ + private String present; + + /** + * 治疗计划 + */ + @TableField("cure_plan") + private String curePlan; + + /** + * 意见 + */ + private String opinion; + + /** + * 检查 + */ + private String examine; + + /** + * 状态 + */ + private String status; + + private String sex; + + private Integer age; + + /** + * 分配专家 + */ + private String specialist; + + /** + * 专家编号 + */ + @TableField("specialist_id") + private Long specialistId; + + /** + * 视频意见 + */ + @TableField("video_idea") + private String videoIdea; + + /** + * 椅旁意见 + */ + @TableField("cerec_idea") + private String cerecIdea; + + /** + * 申请诊疗类型(YP为椅旁会诊 SP为视频会诊 LX 为远程阅片) + */ + @TableField("diagnosis_type") + private String diagnosisType; + + /** + * 综合意见 + */ + @TableField("opinion_all") + private String opinionAll; + + /** + * 操作人 + */ + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + /** + * 家庭住址 + */ + @TableField("pt_city") + private String ptCity; + + /** + * 病情摘要 + */ + private String digest; + + @TableField("nuh_time") + private Date nuhTime; + + @TableField("nuh_section") + private String nuhSection; + + /** + * type:向上转诊还是向下转诊(A、上 B、下) + */ + private String conditions; + + /** + * 患者病案号 + */ + @TableField("esrd_number") + private String esrdNumber; + + /** + * 患者病案号 + */ + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + private String code; + + @TableField("ecg_opinion") + private String ecgOpinion; + + @TableField("lis_opinion") + private String lisOpinion; + + @TableField("pathology_opinion") + private String pathologyOpinion; + + @TableField("patient_type") + private Integer patientType; + + @TableField("report_doctor") + private String reportDoctor; + + @TableField(exist = false) + private String state; + + @TableField("case_analysis") + private String caseAnalysis; + + @TableField("primary_diagnosis") + private String primaryDiagnosis; + + @TableField("diagnosis_plan") + private String diagnosisPlan; + + @TableField("diagnosis_idea") + private String diagnosisIdea; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_see") + private String examineSee; + + @TableField("examine_hint") + private String examineHint; + + @TableField(exist = false) + private List aciList; + + @TableField(exist = false) + private List acsList; + + private static final long serialVersionUID = 1L; + + public String getExamineSee() { + return examineSee; + } + + public void setExamineSee(String examineSee) { + this.examineSee = examineSee; + } + public String getExamineHint() { + return examineHint; + } + + public void setExamineHint(String examineHint) { + this.examineHint = examineHint; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getPathologyOpinion() { + return pathologyOpinion; + } + + public void setPathologyOpinion(String pathologyOpinion) { + this.pathologyOpinion = pathologyOpinion; + } + + public String getLisOpinion() { + return lisOpinion; + } + + public void setLisOpinion(String lisOpinion) { + this.lisOpinion = lisOpinion; + } + + public String getEcgOpinion() { + return ecgOpinion; + } + + public void setEcgOpinion(String ecgOpinion) { + this.ecgOpinion = ecgOpinion; + } + + public ApplyConsultation() { + super(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getConditions() { + return conditions; + } + + public void setConditions(String conditions) { + this.conditions = conditions; + } + + public List getAcsList() { + return acsList; + } + + public void setAcsList(List acsList) { + this.acsList = acsList; + } + + public Date getNuhTime() { + return nuhTime; + } + + public void setNuhTime(Date nuhTime) { + this.nuhTime = nuhTime; + } + + public String getNuhSection() { + return nuhSection; + } + + public void setNuhSection(String nuhSection) { + this.nuhSection = nuhSection; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getAllergy() { + return allergy; + } + + public void setAllergy(String allergy) { + this.allergy = allergy; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public String getIdentify() { + return identify; + } + + public void setIdentify(String identify) { + this.identify = identify; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getCurePlan() { + return curePlan; + } + + public void setCurePlan(String curePlan) { + this.curePlan = curePlan; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getExamine() { + return examine; + } + + public void setExamine(String examine) { + this.examine = examine; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getVideoIdea() { + return videoIdea; + } + + public void setVideoIdea(String videoIdea) { + this.videoIdea = videoIdea; + } + + public String getCerecIdea() { + return cerecIdea; + } + + public void setCerecIdea(String cerecIdea) { + this.cerecIdea = cerecIdea; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public String getOpinionAll() { + return opinionAll; + } + + public void setOpinionAll(String opinionAll) { + this.opinionAll = opinionAll; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public String getDigest() { + return digest; + } + + public void setDigest(String digest) { + this.digest = digest; + } + + public List getAciList() { + return aciList; + } + + public void setAciList(List aciList) { + this.aciList = aciList; + } + + public Integer getPatientType() { + return patientType; + } + + public void setPatientType(Integer patientType) { + this.patientType = patientType; + } + + public String getReportDoctor() { + return reportDoctor; + } + + public void setReportDoctor(String reportDoctor) { + this.reportDoctor = reportDoctor; + } + + public String getCaseAnalysis() { + return caseAnalysis; + } + + public void setCaseAnalysis(String caseAnalysis) { + this.caseAnalysis = caseAnalysis; + } + + public String getPrimaryDiagnosis() { + return primaryDiagnosis; + } + + public void setPrimaryDiagnosis(String primaryDiagnosis) { + this.primaryDiagnosis = primaryDiagnosis; + } + + public String getDiagnosisPlan() { + return diagnosisPlan; + } + + public void setDiagnosisPlan(String diagnosisPlan) { + this.diagnosisPlan = diagnosisPlan; + } + + public String getDiagnosisIdea() { + return diagnosisIdea; + } + + public void setDiagnosisIdea(String diagnosisIdea) { + this.diagnosisIdea = diagnosisIdea; + } + + public String getGroupChamber() { + return groupChamber; + } + + public void setGroupChamber(String groupChamber) { + this.groupChamber = groupChamber; + } + + public ApplyConsultation(Long id, Long docId, Date applyDate, String doctorName, String patientName, + String complain, String allergy, String past, String identify, Date groupDate, String categoryHospital, + String categoryHospitalId, String chamber, String groupHospital, String groupHospitalId, String groupType, + String initial, String present, String curePlan, String opinion, String examine, String status, String sex, + Integer age, String specialist, Long specialistId, String videoIdea, String cerecIdea, String diagnosisType, + String opinionAll, String operator, String ptPhone, String ptCard, String ptCity, String digest, + Date nuhTime, String nuhSection, String conditions, String esrdNumber, String hisEsrdNumber, + String outPatien, String code, String ecgOpinion, String lisOpinion, String pathologyOpinion, + Integer patientType, String reportDoctor, String state, String caseAnalysis, String primaryDiagnosis, + String diagnosisPlan, String diagnosisIdea,String examinePart,String examineSee,String examineHint, List aciList, + List acsList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.allergy = allergy; + this.past = past; + this.identify = identify; + this.groupDate = groupDate; + this.categoryHospital = categoryHospital; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospital = groupHospital; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.present = present; + this.curePlan = curePlan; + this.opinion = opinion; + this.examine = examine; + this.status = status; + this.sex = sex; + this.age = age; + this.specialist = specialist; + this.specialistId = specialistId; + this.videoIdea = videoIdea; + this.cerecIdea = cerecIdea; + this.diagnosisType = diagnosisType; + this.opinionAll = opinionAll; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.digest = digest; + this.nuhTime = nuhTime; + this.nuhSection = nuhSection; + this.conditions = conditions; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.code = code; + this.ecgOpinion = ecgOpinion; + this.lisOpinion = lisOpinion; + this.pathologyOpinion = pathologyOpinion; + this.patientType = patientType; + this.reportDoctor = reportDoctor; + this.state = state; + this.caseAnalysis = caseAnalysis; + this.primaryDiagnosis = primaryDiagnosis; + this.diagnosisPlan = diagnosisPlan; + this.diagnosisIdea = diagnosisIdea; + this.examinePart = examinePart; + this.examineSee=examineSee; + this.examineHint=examineHint; + this.aciList = aciList; + this.acsList = acsList; + } + + @Override + public String toString() { + return "ApplyConsultation [groupChamber=" + groupChamber + "]"; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyConsultationImg.java b/backend/src/main/java/com/imurs/entity/ApplyConsultationImg.java new file mode 100644 index 0000000..ebbf506 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyConsultationImg.java @@ -0,0 +1,158 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊图片表 + * + * @author Server + * + */ +@TableName("apply_consultation_img") +public class ApplyConsultationImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 患者id + */ + @TableField("patient_id") + private Long patientId; + + /** + * 就诊表id + */ + @TableField("con_id") + private Long conId; + + /** + * 类型 1:病历资料 2:检查资料 3:B超资料 4:病理资料 5:DR资料 6:CT/MR资料 + */ + private Integer type; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 图片类型诊断意见 + */ + private String opinion; + + /** + * 创建时间 + */ + @TableField("create_time") + private String createTime; + + @TableField("file_name") + private String fileName; + + + private static final long serialVersionUID = 1L; + + public ApplyConsultationImg() { + super(); + } + + public ApplyConsultationImg(Long id, Long docId, Long patientId, Long conId, Integer type, String imgUrl, + String opinion, String createTime, String fileName) { + super(); + this.id = id; + this.docId = docId; + this.patientId = patientId; + this.conId = conId; + this.type = type; + this.imgUrl = imgUrl; + this.opinion = opinion; + this.createTime = createTime; + this.fileName = fileName; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getPatientId() { + return patientId; + } + + public void setPatientId(Long patientId) { + this.patientId = patientId; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyDoctorPromote.java b/backend/src/main/java/com/imurs/entity/ApplyDoctorPromote.java new file mode 100644 index 0000000..b638a97 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyDoctorPromote.java @@ -0,0 +1,661 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医生进修申请表 + * + * @author Server + * + */ +@TableName("apply_doctor_promote") +public class ApplyDoctorPromote implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 医生账号(用于基层添加进修申请)医生登陆后可以查看到记录 + */ + private Long account; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 医生姓名 + */ + @TableField("doctor_name") + private String doctorName; + + private String sex; + + private Integer age; + + /** + * 籍贯 + */ + private String nationality; + + /** + * 名族 + */ + private String nation; + + /** + * 省 + */ + private String province; + + /** + * 市/区 + */ + private String city; + + /** + * 政治面貌 + */ + @TableField("political_outlook") + private String politicalOutlook; + + /** + * 文化程度 + */ + @TableField("cultural_level") + private String culturalLevel; + + /** + * 健康状况 + */ + private String health; + + /** + * 职称、职务 + */ + private String job; + + /** + * 工作单位 + */ + @TableField("work_company") + private String workCompany; + + /** + * 邮政编码 + */ + private String code; + + /** + * 电话号码 + */ + @TableField("phone_number") + private String phoneNumber; + + /** + * 手机号码 + */ + private String phone; + + /** + * 执业情况 + */ + private String practice; + + /** + * 申请进修专业 + */ + @TableField("apply_major") + private String applyMajor; + + /** + * 进修开始时间 + */ + @TableField("apply_start_time") + private Date applyStartTime; + + /** + * 进修结束时间 + */ + @TableField("apply_end_time") + private Date applyEndTime; + + /** + * 进修天数(月份) + */ + @TableField("apply_day") + private String applyDay; + + /** + * 拟联系进修科室 + */ + @TableField("apply_chamber") + private String applyChamber; + + /** + * 入校开始时间 和毕业时间 + */ + @TableField("school_start_end_time") + private String schoolStartEndTime; + + /** + * 学校名称 + */ + @TableField("school_name") + private String schoolName; + + /** + * 学校备注 + */ + @TableField("school_remark") + private String schoolRemark; + + /** + * 工作开始时间以及结束时间 + */ + @TableField("work_start_end_time") + private String workStartEndTime; + + /** + * 工作职称 + */ + @TableField("work_chamber") + private String workChamber; + + /** + * 工作单位名称 + */ + @TableField("work_chamber_name") + private String workChamberName; + + /** + * 本人表现及工作能力 + */ + @TableField("work_remark") + private String workRemark; + + /** + * 进修专业要求 + */ + @TableField("apply_rule") + private String applyRule; + + /** + * 本人外语水平 + */ + private String language; + + /** + * 推荐(选送)单位意见 + */ + private String opinion; + + /** + * 填写意见时间 + */ + @TableField("opinion_time") + private Date opinionTime; + + /** + * 进修单位意见 + */ + @TableField("apply_opinion") + private String applyOpinion; + + /** + * 进修单位意见填写时间 + */ + @TableField("apply_opinion_time") + private Date applyOpinionTime; + + /** + * 医生头像 + */ + @TableField("doctor_img") + private String doctorImg; + + /** + * + * 待医院处理D 、待进修医院处理DS、医院撤销N、进修医院撤销NS、进修医院同意Y + * D DS N NS Y + */ + private String status; + + /** + * 进修申请单位Id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 进修申请单位名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 进修申请单位科室名称 + */ + @TableField("hospital_section") + private String hospitalSection; + + /** + * 医院类型(医联体、对口资源、远程协助、名医工作室)3/4/5/8 + */ + private Integer type; + + + private static final long serialVersionUID = 1L; + + public ApplyDoctorPromote() { + super(); + } + + public ApplyDoctorPromote(Long id, Long account, Long docId, String doctorName, String sex, Integer age, + String nationality, String nation, String province, String city, String politicalOutlook, + String culturalLevel, String health, String job, String workCompany, String code, String phoneNumber, + String phone, String practice, String applyMajor, Date applyStartTime, Date applyEndTime, String applyDay, + String applyChamber, String schoolStartEndTime, String schoolName, String schoolRemark, + String workStartEndTime, String workChamber, String workChamberName, String workRemark, String applyRule, + String language, String opinion, Date opinionTime, String applyOpinion, Date applyOpinionTime, + String doctorImg, String status, String hospitalId, String hospitalName, String hospitalSection, + Integer type) { + super(); + this.id = id; + this.account = account; + this.docId = docId; + this.doctorName = doctorName; + this.sex = sex; + this.age = age; + this.nationality = nationality; + this.nation = nation; + this.province = province; + this.city = city; + this.politicalOutlook = politicalOutlook; + this.culturalLevel = culturalLevel; + this.health = health; + this.job = job; + this.workCompany = workCompany; + this.code = code; + this.phoneNumber = phoneNumber; + this.phone = phone; + this.practice = practice; + this.applyMajor = applyMajor; + this.applyStartTime = applyStartTime; + this.applyEndTime = applyEndTime; + this.applyDay = applyDay; + this.applyChamber = applyChamber; + this.schoolStartEndTime = schoolStartEndTime; + this.schoolName = schoolName; + this.schoolRemark = schoolRemark; + this.workStartEndTime = workStartEndTime; + this.workChamber = workChamber; + this.workChamberName = workChamberName; + this.workRemark = workRemark; + this.applyRule = applyRule; + this.language = language; + this.opinion = opinion; + this.opinionTime = opinionTime; + this.applyOpinion = applyOpinion; + this.applyOpinionTime = applyOpinionTime; + this.doctorImg = doctorImg; + this.status = status; + this.hospitalId = hospitalId; + this.hospitalName = hospitalName; + this.hospitalSection = hospitalSection; + this.type = type; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAccount() { + return account; + } + + public void setAccount(Long account) { + this.account = account; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getNationality() { + return nationality; + } + + public void setNationality(String nationality) { + this.nationality = nationality; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getPoliticalOutlook() { + return politicalOutlook; + } + + public void setPoliticalOutlook(String politicalOutlook) { + this.politicalOutlook = politicalOutlook; + } + + public String getCulturalLevel() { + return culturalLevel; + } + + public void setCulturalLevel(String culturalLevel) { + this.culturalLevel = culturalLevel; + } + + public String getHealth() { + return health; + } + + public void setHealth(String health) { + this.health = health; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getWorkCompany() { + return workCompany; + } + + public void setWorkCompany(String workCompany) { + this.workCompany = workCompany; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPractice() { + return practice; + } + + public void setPractice(String practice) { + this.practice = practice; + } + + public String getApplyMajor() { + return applyMajor; + } + + public void setApplyMajor(String applyMajor) { + this.applyMajor = applyMajor; + } + + public Date getApplyStartTime() { + return applyStartTime; + } + + public void setApplyStartTime(Date applyStartTime) { + this.applyStartTime = applyStartTime; + } + + public Date getApplyEndTime() { + return applyEndTime; + } + + public void setApplyEndTime(Date applyEndTime) { + this.applyEndTime = applyEndTime; + } + + public String getApplyDay() { + return applyDay; + } + + public void setApplyDay(String applyDay) { + this.applyDay = applyDay; + } + + public String getApplyChamber() { + return applyChamber; + } + + public void setApplyChamber(String applyChamber) { + this.applyChamber = applyChamber; + } + + public String getSchoolStartEndTime() { + return schoolStartEndTime; + } + + public void setSchoolStartEndTime(String schoolStartEndTime) { + this.schoolStartEndTime = schoolStartEndTime; + } + + public String getSchoolName() { + return schoolName; + } + + public void setSchoolName(String schoolName) { + this.schoolName = schoolName; + } + + public String getSchoolRemark() { + return schoolRemark; + } + + public void setSchoolRemark(String schoolRemark) { + this.schoolRemark = schoolRemark; + } + + public String getWorkStartEndTime() { + return workStartEndTime; + } + + public void setWorkStartEndTime(String workStartEndTime) { + this.workStartEndTime = workStartEndTime; + } + + public String getWorkChamber() { + return workChamber; + } + + public void setWorkChamber(String workChamber) { + this.workChamber = workChamber; + } + + public String getWorkChamberName() { + return workChamberName; + } + + public void setWorkChamberName(String workChamberName) { + this.workChamberName = workChamberName; + } + + public String getWorkRemark() { + return workRemark; + } + + public void setWorkRemark(String workRemark) { + this.workRemark = workRemark; + } + + public String getApplyRule() { + return applyRule; + } + + public void setApplyRule(String applyRule) { + this.applyRule = applyRule; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getApplyOpinion() { + return applyOpinion; + } + + public void setApplyOpinion(String applyOpinion) { + this.applyOpinion = applyOpinion; + } + + public Date getApplyOpinionTime() { + return applyOpinionTime; + } + + public void setApplyOpinionTime(Date applyOpinionTime) { + this.applyOpinionTime = applyOpinionTime; + } + + public String getDoctorImg() { + return doctorImg; + } + + public void setDoctorImg(String doctorImg) { + this.doctorImg = doctorImg; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalSection() { + return hospitalSection; + } + + public void setHospitalSection(String hospitalSection) { + this.hospitalSection = hospitalSection; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyEcg.java b/backend/src/main/java/com/imurs/entity/ApplyEcg.java new file mode 100644 index 0000000..134fbe4 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyEcg.java @@ -0,0 +1,586 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg") +public class ApplyEcg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("apply_chamber") + private String applyChamber; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String status; + + private String sex; + + private Integer age; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_doc_name") + private String examineDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("report_date") + private Date reportDate; + + @TableField("report_doc_name") + private String reportDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("audit_date") + private Date auditDate; + + @TableField("audit_doc_name") + private String auditDocName; + + @TableField("out_patient") + private String outPatient; + + @TableField("clinic_diagnos") + private String clinicDiagnos; + + private String diagnos; + + @TableField("electric_axis") + private String electricAxis; + + private String qrs; + + private String pr; + + private String qt; + + private String qtc; + + private String sv1; + + private String rv5; + + private String rs; + + private String hr; + + @TableField("out_patien") + private String outPatien; + + private String code; + + @TableField("pdf_url") + private String pdfUrl; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + @TableField(exist = false) + private List ecgImgList; + + private static final long serialVersionUID = 1L; + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getEcgImgList() { + return ecgImgList; + } + + public void setEcgImgList(List ecgImgList) { + this.ecgImgList = ecgImgList; + } + + public ApplyEcg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getApplyChamber() { + return applyChamber; + } + + public void setApplyChamber(String applyChamber) { + this.applyChamber = applyChamber == null ? null : applyChamber.trim(); + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain == null ? null : complain.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial == null ? null : initial.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone == null ? null : ptPhone.trim(); + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity == null ? null : ptCity.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExamineDocName() { + return examineDocName; + } + + public void setExamineDocName(String examineDocName) { + this.examineDocName = examineDocName == null ? null : examineDocName.trim(); + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + + public String getReportDocName() { + return reportDocName; + } + + public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName == null ? null : reportDocName.trim(); + } + + public Date getAuditDate() { + return auditDate; + } + + public void setAuditDate(Date auditDate) { + this.auditDate = auditDate; + } + + public String getAuditDocName() { + return auditDocName; + } + + public void setAuditDocName(String auditDocName) { + this.auditDocName = auditDocName == null ? null : auditDocName.trim(); + } + + public String getOutPatient() { + return outPatient; + } + + public void setOutPatient(String outPatient) { + this.outPatient = outPatient == null ? null : outPatient.trim(); + } + + public String getClinicDiagnos() { + return clinicDiagnos; + } + + public void setClinicDiagnos(String clinicDiagnos) { + this.clinicDiagnos = clinicDiagnos == null ? null : clinicDiagnos.trim(); + } + + public String getDiagnos() { + return diagnos; + } + + public void setDiagnos(String diagnos) { + this.diagnos = diagnos == null ? null : diagnos.trim(); + } + + public String getElectricAxis() { + return electricAxis; + } + + public void setElectricAxis(String electricAxis) { + this.electricAxis = electricAxis == null ? null : electricAxis.trim(); + } + + public String getQrs() { + return qrs; + } + + public void setQrs(String qrs) { + this.qrs = qrs == null ? null : qrs.trim(); + } + + public String getPr() { + return pr; + } + + public void setPr(String pr) { + this.pr = pr == null ? null : pr.trim(); + } + + public String getQt() { + return qt; + } + + public void setQt(String qt) { + this.qt = qt == null ? null : qt.trim(); + } + + public String getQtc() { + return qtc; + } + + public void setQtc(String qtc) { + this.qtc = qtc == null ? null : qtc.trim(); + } + + public String getSv1() { + return sv1; + } + + public void setSv1(String sv1) { + this.sv1 = sv1 == null ? null : sv1.trim(); + } + + public String getRv5() { + return rv5; + } + + public void setRv5(String rv5) { + this.rv5 = rv5 == null ? null : rv5.trim(); + } + + public String getRs() { + return rs; + } + + public void setRs(String rs) { + this.rs = rs == null ? null : rs.trim(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPdfUrl() { + return pdfUrl; + } + + public void setPdfUrl(String pdfUrl) { + this.pdfUrl = pdfUrl; + } + + public ApplyEcg(Long id, Long docId, Date applyDate, String applyChamber, String doctorName, String patientName, + String complain, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String initial, String status, String sex, Integer age, String ptPhone, String ptCard, + String ptCity, String esrdNumber, String hisEsrdNumber, Date examineDate, String examineDocName, + Date reportDate, String reportDocName, Date auditDate, String auditDocName, String outPatient, + String clinicDiagnos, String diagnos, String electricAxis, String qrs, String pr, String qt, String qtc, + String sv1, String rv5, String rs, String hr, String outPatien, String code, String pdfUrl, + String specialist, Long specialistId, String categoryHospital, String groupHospital, + List ecgImgList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.applyChamber = applyChamber; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.status = status; + this.sex = sex; + this.age = age; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDate = examineDate; + this.examineDocName = examineDocName; + this.reportDate = reportDate; + this.reportDocName = reportDocName; + this.auditDate = auditDate; + this.auditDocName = auditDocName; + this.outPatient = outPatient; + this.clinicDiagnos = clinicDiagnos; + this.diagnos = diagnos; + this.electricAxis = electricAxis; + this.qrs = qrs; + this.pr = pr; + this.qt = qt; + this.qtc = qtc; + this.sv1 = sv1; + this.rv5 = rv5; + this.rs = rs; + this.hr = hr; + this.outPatien = outPatien; + this.code = code; + this.pdfUrl = pdfUrl; + this.specialist = specialist; + this.specialistId = specialistId; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.ecgImgList = ecgImgList; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyEcgImg.java b/backend/src/main/java/com/imurs/entity/ApplyEcgImg.java new file mode 100644 index 0000000..a922bf0 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyEcgImg.java @@ -0,0 +1,97 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg_img") +public class ApplyEcgImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("e_id") + private Long eId; + + @TableField("file_name") + private String fileName; + + + private static final long serialVersionUID = 1L; + + + public ApplyEcgImg(Long id, Integer type, String imgUrl, Date createTime, Long eId, String fileName) { + super(); + this.id = id; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.eId = eId; + this.fileName = fileName; + } + + public ApplyEcgImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long geteId() { + return eId; + } + + public void seteId(Long eId) { + this.eId = eId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java b/backend/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java new file mode 100644 index 0000000..c7c0d54 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java @@ -0,0 +1,107 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg_specialist") +public class ApplyEcgSpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("e_id") + private Long eId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private static final long serialVersionUID = 1L; + + public ApplyEcgSpecialist() { + super(); + } + + public ApplyEcgSpecialist(Long id, Long speId, String speName, Integer state, Long eId, Date createTime, + Date updateTime) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.eId = eId; + this.createTime = createTime; + this.updateTime = updateTime; + } + + public Long geteId() { + return eId; + } + + public void seteId(Long eId) { + this.eId = eId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName == null ? null : speName.trim(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyInformation.java b/backend/src/main/java/com/imurs/entity/ApplyInformation.java new file mode 100644 index 0000000..dbcac4e --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyInformation.java @@ -0,0 +1,900 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 基层医院申请表 + * + * @author Server + * + */ +/** + * @author dgg + * + */ +@TableName("apply_information") +public class ApplyInformation implements Serializable { + + private String id; + + /** + * 手机号码/账号 + */ + private String account; + + private String password; + private String layout; + + private Long rid; + + /** + * 医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + /** + * 医生组别名 + */ + @TableField("group_alias") + private String groupAlias; + + /** + * 医院地址 + */ + @TableField("hospital_site") + private String hospitalSite; + + /** + * 上级 + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 成立时间 + */ + @TableField("setup_time") + private Date setupTime; + + /** + * 主要科室 + */ + private String chamber; + + /** + * 在职人数 + */ + @TableField("be_jobs") + private Integer beJobs; + + /** + * 高级职称人数 + */ + @TableField("advanced_job") + private Integer advancedJob; + + /** + * 中级职称人数 + */ + @TableField("middle_job") + private Integer middleJob; + + /** + * 院长姓名 + */ + @TableField("dean_name") + private String deanName; + + /** + * 院长学历 + */ + @TableField("dean_education") + private String deanEducation; + + /** + * 院长专业 + */ + @TableField("dean_major") + private String deanMajor; + + /** + * 院长职称 + */ + @TableField("dean_job") + private String deanJob; + + /** + * 院长电话 + */ + @TableField("dean_phone") + private String deanPhone; + + /** + * 科室负责人 + */ + @TableField("chamber_name") + private String chamberName; + + /** + * 科室负责人学历 + */ + @TableField("chamber_education") + private String chamberEducation; + + /** + * 科室负责人专业 + */ + @TableField("chamber_major") + private String chamberMajor; + + /** + * 科室负责人职称 + */ + @TableField("chamber_job") + private String chamberJob; + + /** + * 科室负责人电话 + */ + @TableField("chamber_phone") + private String chamberPhone; + + /** + * 财务负责人 + */ + @TableField("finance_name") + private String financeName; + + /** + * 财务负责人学历 + */ + @TableField("finance_education") + private String financeEducation; + + /** + * 财务负责人专业 + */ + @TableField("finance_major") + private String financeMajor; + + /** + * 财务负责人职称 + */ + @TableField("finance_job") + private String financeJob; + + /** + * 财务负责人电话 + */ + @TableField("finance_phone") + private String financePhone; + + /** + * 开户银行 + */ + @TableField("acc_bank") + private String accBank; + + /** + * 开户账号 + */ + @TableField("accn_nmber") + private String accnNmber; + + /** + * 开户名称 + */ + @TableField("acc_name") + private String accName; + + /** + * 性质 1:公办 2:民办 3:公办兼民办 + */ + private Integer nature; + + /** + * 等级 1:一级 2:二级 3:三级 + */ + private Integer grade; + + /** + * 特色专科 + */ + private String feature; + + /** + * 医院电话 + */ + private String phone; + + /** + * 合作模式 1:相对紧密型 2:相对松散型 + */ + @TableField("co_op") + private Integer coOp; + + /** + * 合作模式说明 1:县域医共体 2:专科联盟 3:远程医疗协作 + */ + @TableField("co_op_explain") + private String coOpExplain; + + /** + * 帮扶协议 1:是 2:否 + */ + @TableField("help_protocol") + private Integer helpProtocol; + + /** + * 医院形式: 1:综合 2:专科 3:健康管理 4:医养结合 + */ + @TableField("synthe_size") + private Integer syntheSize; + + /** + * 1:激活 2:冻结 3撤销 + */ + private Integer state; + + /** + * 账户类型 + */ + @TableField("credit_type") + private String creditType; + + /** + * 封面图片 + */ + private String img; + + /** + * 权限菜单id + */ + @TableField("rp_id") + private String rpId; + + /** + * 印章名称 + */ + @TableField("seal_name") + private String sealName; + + /** + * 科室简介 + */ + @TableField("se_name_intro") + private String seNameIntro; + + /** + * 医院简介 + */ + @TableField("hospital_intro") + private String hospitalIntro; + + /** + * 责任人id(上级医院安排负责人) + */ + @TableField("principal_id") + private Long principalId; + + @TableField("create_time") + private Date createTime; + + /** + * 分配的专家 + */ + @TableField("allocate_doctor") + private String allocateDoctor; + + + public String getAllocateDoctor() { + return allocateDoctor; + } + + public void setAllocateDoctor(String allocateDoctor) { + this.allocateDoctor = allocateDoctor; + } + + /** + * 撤销原因 + */ + private String reason; + + @TableField(exist = false) + private String userName; + + + @TableField("bmode_name") + private String bmodeName; + + @TableField("bmode_phone") + private String bmodePhone; + + private static final long serialVersionUID = 1L; + + public ApplyInformation() { + super(); + } + /** + * 夜班开始时间 + */ + + @TableField("night_start_time") + private String nightStartTime; + + /** + * 夜班结束时间 + */ + + @TableField("night_stop_time") + private String nightStopTime; + + + + + public String getNightStartTime() { + return nightStartTime; + } + + public void setNightStartTime(String nightStartTime) { + this.nightStartTime = nightStartTime; + } + + public String getNightStopTime() { + return nightStopTime; + } + + public void setNightStopTime(String nightStopTime) { + this.nightStopTime = nightStopTime; + } + + public ApplyInformation(String id, String account, String password, Long rid, String hospitalName, + String hospitalSite, String hospitalId, Date setupTime, String chamber, Integer beJobs, Integer advancedJob, + Integer middleJob, String deanName, String deanEducation, String deanMajor, String deanJob, + String deanPhone, String chamberName, String chamberEducation, String chamberMajor, String chamberJob, + String chamberPhone, String financeName, String financeEducation, String financeMajor, String financeJob, + String financePhone, String accBank, String accnNmber, String accName, Integer nature, Integer grade, + String feature, String phone, Integer coOp, String coOpExplain, Integer helpProtocol, Integer syntheSize, + Integer state, String creditType, String img, String rpId, String sealName, String seNameIntro, + String hospitalIntro, Long principalId, Date createTime, String reason, String userName,String salt, + String bmodeName, String bmodePhone,String groupAlias) { + super(); + this.id = id; + this.account = account; + this.password = password; + this.rid = rid; + this.hospitalName = hospitalName; + this.hospitalSite = hospitalSite; + this.hospitalId = hospitalId; + this.setupTime = setupTime; + this.chamber = chamber; + this.beJobs = beJobs; + this.advancedJob = advancedJob; + this.middleJob = middleJob; + this.deanName = deanName; + this.deanEducation = deanEducation; + this.deanMajor = deanMajor; + this.deanJob = deanJob; + this.deanPhone = deanPhone; + this.chamberName = chamberName; + this.chamberEducation = chamberEducation; + this.chamberMajor = chamberMajor; + this.chamberJob = chamberJob; + this.chamberPhone = chamberPhone; + this.financeName = financeName; + this.financeEducation = financeEducation; + this.financeMajor = financeMajor; + this.financeJob = financeJob; + this.financePhone = financePhone; + this.accBank = accBank; + this.accnNmber = accnNmber; + this.accName = accName; + this.nature = nature; + this.grade = grade; + this.feature = feature; + this.phone = phone; + this.coOp = coOp; + this.coOpExplain = coOpExplain; + this.helpProtocol = helpProtocol; + this.syntheSize = syntheSize; + this.state = state; + this.creditType = creditType; + this.img = img; + this.rpId = rpId; + this.sealName = sealName; + this.seNameIntro = seNameIntro; + this.hospitalIntro = hospitalIntro; + this.principalId = principalId; + this.createTime = createTime; + this.reason = reason; + this.userName = userName; + this.bmodeName = bmodeName; + this.bmodePhone = bmodePhone; + this.groupAlias = groupAlias; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getRid() { + return rid; + } + + public void setRid(Long rid) { + this.rid = rid; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalSite() { + return hospitalSite; + } + + public void setHospitalSite(String hospitalSite) { + this.hospitalSite = hospitalSite; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Date getSetupTime() { + return setupTime; + } + + public void setSetupTime(Date setupTime) { + this.setupTime = setupTime; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public Integer getBeJobs() { + return beJobs; + } + + public void setBeJobs(Integer beJobs) { + this.beJobs = beJobs; + } + + public Integer getAdvancedJob() { + return advancedJob; + } + + public void setAdvancedJob(Integer advancedJob) { + this.advancedJob = advancedJob; + } + + public Integer getMiddleJob() { + return middleJob; + } + + public void setMiddleJob(Integer middleJob) { + this.middleJob = middleJob; + } + + public String getDeanName() { + return deanName; + } + + public void setDeanName(String deanName) { + this.deanName = deanName; + } + + public String getDeanEducation() { + return deanEducation; + } + + public void setDeanEducation(String deanEducation) { + this.deanEducation = deanEducation; + } + + public String getDeanMajor() { + return deanMajor; + } + + public void setDeanMajor(String deanMajor) { + this.deanMajor = deanMajor; + } + + public String getDeanJob() { + return deanJob; + } + + public void setDeanJob(String deanJob) { + this.deanJob = deanJob; + } + + public String getDeanPhone() { + return deanPhone; + } + + public void setDeanPhone(String deanPhone) { + this.deanPhone = deanPhone; + } + + public String getChamberName() { + return chamberName; + } + + public void setChamberName(String chamberName) { + this.chamberName = chamberName; + } + + public String getChamberEducation() { + return chamberEducation; + } + + public void setChamberEducation(String chamberEducation) { + this.chamberEducation = chamberEducation; + } + + public String getChamberMajor() { + return chamberMajor; + } + + public void setChamberMajor(String chamberMajor) { + this.chamberMajor = chamberMajor; + } + + public String getChamberJob() { + return chamberJob; + } + + public void setChamberJob(String chamberJob) { + this.chamberJob = chamberJob; + } + + public String getChamberPhone() { + return chamberPhone; + } + + public void setChamberPhone(String chamberPhone) { + this.chamberPhone = chamberPhone; + } + + public String getFinanceName() { + return financeName; + } + + public void setFinanceName(String financeName) { + this.financeName = financeName; + } + + public String getFinanceEducation() { + return financeEducation; + } + + public void setFinanceEducation(String financeEducation) { + this.financeEducation = financeEducation; + } + + public String getFinanceMajor() { + return financeMajor; + } + + public void setFinanceMajor(String financeMajor) { + this.financeMajor = financeMajor; + } + + public String getFinanceJob() { + return financeJob; + } + + public void setFinanceJob(String financeJob) { + this.financeJob = financeJob; + } + + public String getFinancePhone() { + return financePhone; + } + + public void setFinancePhone(String financePhone) { + this.financePhone = financePhone; + } + + public String getAccBank() { + return accBank; + } + + public void setAccBank(String accBank) { + this.accBank = accBank; + } + + public String getAccnNmber() { + return accnNmber; + } + + public void setAccnNmber(String accnNmber) { + this.accnNmber = accnNmber; + } + + public String getAccName() { + return accName; + } + + public void setAccName(String accName) { + this.accName = accName; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public String getFeature() { + return feature; + } + + public void setFeature(String feature) { + this.feature = feature; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getCoOp() { + return coOp; + } + + public void setCoOp(Integer coOp) { + this.coOp = coOp; + } + + public String getCoOpExplain() { + return coOpExplain; + } + + public void setCoOpExplain(String coOpExplain) { + this.coOpExplain = coOpExplain; + } + + public Integer getHelpProtocol() { + return helpProtocol; + } + + public void setHelpProtocol(Integer helpProtocol) { + this.helpProtocol = helpProtocol; + } + + public Integer getSyntheSize() { + return syntheSize; + } + + public void setSyntheSize(Integer syntheSize) { + this.syntheSize = syntheSize; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCreditType() { + return creditType; + } + + public void setCreditType(String creditType) { + this.creditType = creditType; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getSealName() { + return sealName; + } + + public void setSealName(String sealName) { + this.sealName = sealName; + } + + public String getSeNameIntro() { + return seNameIntro; + } + + public void setSeNameIntro(String seNameIntro) { + this.seNameIntro = seNameIntro; + } + + public String getHospitalIntro() { + return hospitalIntro; + } + + public void setHospitalIntro(String hospitalIntro) { + this.hospitalIntro = hospitalIntro; + } + + public Long getPrincipalId() { + return principalId; + } + + public void setPrincipalId(Long principalId) { + this.principalId = principalId; + } + + public String getBmodeName() { + return bmodeName; + } + + public void setBmodeName(String bmodeName) { + this.bmodeName = bmodeName; + } + + public String getBmodePhone() { + return bmodePhone; + } + + public void setBmodePhone(String bmodePhone) { + this.bmodePhone = bmodePhone; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + @Override + public String toString() { + return "ApplyInformation{" + + "id='" + id + '\'' + + ", account='" + account + '\'' + + ", password='" + password + '\'' + + ", rid=" + rid + + ", hospitalName='" + hospitalName + '\'' + + ", hospitalSite='" + hospitalSite + '\'' + + ", hospitalId='" + hospitalId + '\'' + + ", setupTime=" + setupTime + + ", chamber='" + chamber + '\'' + + ", beJobs=" + beJobs + + ", advancedJob=" + advancedJob + + ", middleJob=" + middleJob + + ", deanName='" + deanName + '\'' + + ", deanEducation='" + deanEducation + '\'' + + ", deanMajor='" + deanMajor + '\'' + + ", deanJob='" + deanJob + '\'' + + ", deanPhone='" + deanPhone + '\'' + + ", chamberName='" + chamberName + '\'' + + ", chamberEducation='" + chamberEducation + '\'' + + ", chamberMajor='" + chamberMajor + '\'' + + ", chamberJob='" + chamberJob + '\'' + + ", chamberPhone='" + chamberPhone + '\'' + + ", financeName='" + financeName + '\'' + + ", financeEducation='" + financeEducation + '\'' + + ", financeMajor='" + financeMajor + '\'' + + ", financeJob='" + financeJob + '\'' + + ", financePhone='" + financePhone + '\'' + + ", accBank='" + accBank + '\'' + + ", accnNmber='" + accnNmber + '\'' + + ", accName='" + accName + '\'' + + ", nature=" + nature + + ", grade=" + grade + + ", feature='" + feature + '\'' + + ", phone='" + phone + '\'' + + ", coOp=" + coOp + + ", coOpExplain='" + coOpExplain + '\'' + + ", helpProtocol=" + helpProtocol + + ", syntheSize=" + syntheSize + + ", state=" + state + + ", creditType='" + creditType + '\'' + + ", img='" + img + '\'' + + ", rpId='" + rpId + '\'' + + ", sealName='" + sealName + '\'' + + ", seNameIntro='" + seNameIntro + '\'' + + ", hospitalIntro='" + hospitalIntro + '\'' + + ", principalId=" + principalId + + ", createTime=" + createTime + + ", reason='" + reason + '\'' + + ", userName='" + userName + '\'' + + '}'; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyInformationImg.java b/backend/src/main/java/com/imurs/entity/ApplyInformationImg.java new file mode 100644 index 0000000..0fde6a4 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyInformationImg.java @@ -0,0 +1,99 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 基层医院申请表图片 + * @author Server + * + */ +@TableName("apply_information_img") +public class ApplyInformationImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 基层医院申请表Id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + *图片地址 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 基层医院申请表Id + */ + @TableField("create_time") + private Date createTime; + + /** + * 图片类型 1:医疗机构执业许可证 2:开户许可证 3:其它 + */ + @TableField("img_type") + private Integer imgType; + + private static final long serialVersionUID = 1L; + + public ApplyInformationImg(Long id, String hospitalId, String imgUrl, Date createTime, Integer imgType) { + this.id = id; + this.hospitalId = hospitalId; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.imgType = imgType; + } + + public ApplyInformationImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId == null ? null : hospitalId.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyLis.java b/backend/src/main/java/com/imurs/entity/ApplyLis.java new file mode 100644 index 0000000..17b0d6c --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyLis.java @@ -0,0 +1,360 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_lis") +public class ApplyLis implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String name; + + private String gender; + + private Integer age; + + private String residentid; + + @TableField("sample_no") + private String sampleNo; + + @TableField("sample_type") + private String sampleType; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("sample_type") + private Date resultDateTime; + + @TableField("result_doc") + private String resultDoc; + + private String status; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("out_patien") + private String outPatien; + + @TableField("clinic_diagnose") + private String clinicDiagnose; + + private String handlers; + + private String auditor; + + @TableField("result_data") + private String resultData; + + private String code; + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + private static final long serialVersionUID = 1L; + + public ApplyLis(Long id, String name, String gender, Integer age, String residentid, String sampleNo, + String sampleType, Date resultDateTime, String resultDoc, String status, Long docId, Date applyDate, + String doctorName, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String hisEsrdNumber, String esrdNumber, String outPatien, String clinicDiagnose, + String handlers, String auditor, String resultData, String code, String categoryHospital, + String groupHospital) { + super(); + this.id = id; + this.name = name; + this.gender = gender; + this.age = age; + this.residentid = residentid; + this.sampleNo = sampleNo; + this.sampleType = sampleType; + this.resultDateTime = resultDateTime; + this.resultDoc = resultDoc; + this.status = status; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.hisEsrdNumber = hisEsrdNumber; + this.esrdNumber = esrdNumber; + this.outPatien = outPatien; + this.clinicDiagnose = clinicDiagnose; + this.handlers = handlers; + this.auditor = auditor; + this.resultData = resultData; + this.code = code; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ApplyLis() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender == null ? null : gender.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getResidentid() { + return residentid; + } + + public void setResidentid(String residentid) { + this.residentid = residentid == null ? null : residentid.trim(); + } + + public String getSampleNo() { + return sampleNo; + } + + public void setSampleNo(String sampleNo) { + this.sampleNo = sampleNo == null ? null : sampleNo.trim(); + } + + public String getSampleType() { + return sampleType; + } + + public void setSampleType(String sampleType) { + this.sampleType = sampleType == null ? null : sampleType.trim(); + } + + public Date getResultDateTime() { + return resultDateTime; + } + + public void setResultDateTime(Date resultDateTime) { + this.resultDateTime = resultDateTime; + } + + public String getResultDoc() { + return resultDoc; + } + + public void setResultDoc(String resultDoc) { + this.resultDoc = resultDoc == null ? null : resultDoc.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien == null ? null : outPatien.trim(); + } + + public String getClinicDiagnose() { + return clinicDiagnose; + } + + public void setClinicDiagnose(String clinicDiagnose) { + this.clinicDiagnose = clinicDiagnose == null ? null : clinicDiagnose.trim(); + } + + public String getHandlers() { + return handlers; + } + + public void setHandlers(String handlers) { + this.handlers = handlers == null ? null : handlers.trim(); + } + + public String getAuditor() { + return auditor; + } + + public void setAuditor(String auditor) { + this.auditor = auditor == null ? null : auditor.trim(); + } + + public String getResultData() { + return resultData; + } + + public void setResultData(String resultData) { + this.resultData = resultData == null ? null : resultData.trim(); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyPathology.java b/backend/src/main/java/com/imurs/entity/ApplyPathology.java new file mode 100644 index 0000000..4e816ff --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyPathology.java @@ -0,0 +1,521 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology") +public class ApplyPathology implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("doc_id") + private Long docId; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + private String past; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String opinion; + + @TableField("b_hint") + private String bHint; + + private String status; + + private String sex; + + private Integer age; + + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_name") + private String examineName; + + @TableField("report_doc_name") + private String reportDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("report_date") + private Date reportDate; + + @TableField("enter_chamber") + private String enterChamber; + + @TableField("check_doc_name") + private String checkDocName; + + @TableField("examine_type") + private String examineType; + + @TableField("b_see") + private String bSee; + + @TableField("out_patien") + private String outPatien; + + @TableField("img_type") + private Integer imgType; + + private String code; + + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private List aphImgList; + + private static final long serialVersionUID = 1L; + + public ApplyPathology(Long id, Long docId, Date applyDate, String doctorName, String patientName, String complain, + String past, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String initial, String opinion, String bHint, String status, String sex, Integer age, + String operator, String ptPhone, String ptCard, String ptCity, String esrdNumber, String hisEsrdNumber, + Date examineDate, String examinePart, String examineName, String reportDocName, Date reportDate, + String enterChamber, String checkDocName, String examineType, String bSee, String outPatien, + Integer imgType, String code, String categoryHospital, String groupHospital, + String specialist, Long specialistId, List aphImgList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.past = past; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.opinion = opinion; + this.bHint = bHint; + this.status = status; + this.sex = sex; + this.age = age; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDate = examineDate; + this.examinePart = examinePart; + this.examineName = examineName; + this.reportDocName = reportDocName; + this.reportDate = reportDate; + this.enterChamber = enterChamber; + this.checkDocName = checkDocName; + this.examineType = examineType; + this.bSee = bSee; + this.outPatien = outPatien; + this.imgType = imgType; + this.code = code; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.specialist = specialist; + this.specialistId = specialistId; + this.aphImgList = aphImgList; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getAphImgList() { + return aphImgList; + } + + public void setAphImgList(List aphImgList) { + this.aphImgList = aphImgList; + } + + public ApplyPathology() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain == null ? null : complain.trim(); + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past == null ? null : past.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial == null ? null : initial.trim(); + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion == null ? null : opinion.trim(); + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint == null ? null : bHint.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator == null ? null : operator.trim(); + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone == null ? null : ptPhone.trim(); + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity == null ? null : ptCity.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart == null ? null : examinePart.trim(); + } + + public String getExamineName() { + return examineName; + } + + public void setExamineName(String examineName) { + this.examineName = examineName == null ? null : examineName.trim(); + } + + public String getReportDocName() { + return reportDocName; + } + + public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName == null ? null : reportDocName.trim(); + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + + public String getEnterChamber() { + return enterChamber; + } + + public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber == null ? null : enterChamber.trim(); + } + + public String getCheckDocName() { + return checkDocName; + } + + public void setCheckDocName(String checkDocName) { + this.checkDocName = checkDocName == null ? null : checkDocName.trim(); + } + + public String getExamineType() { + return examineType; + } + + public void setExamineType(String examineType) { + this.examineType = examineType; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee == null ? null : bSee.trim(); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyPathologyFile.java b/backend/src/main/java/com/imurs/entity/ApplyPathologyFile.java new file mode 100644 index 0000000..535fa8b --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyPathologyFile.java @@ -0,0 +1,84 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_file") +public class ApplyPathologyFile implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("file_url") + private String fileUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("con_id") + private Long conId; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public ApplyPathologyFile() { + super(); + } + + public ApplyPathologyFile(Long id, String fileUrl, Date createTime, Long conId, String fileName) { + super(); + this.id = id; + this.fileUrl = fileUrl; + this.createTime = createTime; + this.conId = conId; + this.fileName = fileName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyPathologyImg.java b/backend/src/main/java/com/imurs/entity/ApplyPathologyImg.java new file mode 100644 index 0000000..e17ba7d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyPathologyImg.java @@ -0,0 +1,94 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_img") +public class ApplyPathologyImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("p_id") + private Long pId; + + private String code; + + private static final long serialVersionUID = 1L; + + public ApplyPathologyImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getpId() { + return pId; + } + + public void setpId(Long pId) { + this.pId = pId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ApplyPathologyImg(Long id, Integer type, String imgUrl, Date createTime, Long pId, String code) { + super(); + this.id = id; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.pId = pId; + this.code = code; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java b/backend/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java new file mode 100644 index 0000000..9865cbf --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java @@ -0,0 +1,105 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_specialist") +public class ApplyPathologySpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("p_id") + private Long pId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private static final long serialVersionUID = 1L; + + public ApplyPathologySpecialist(Long id, Long speId, String speName, Integer state, Long pId, Date createTime, Date updateTime) { + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.pId = pId; + this.createTime = createTime; + this.updateTime = updateTime; + } + + public ApplyPathologySpecialist() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName == null ? null : speName.trim(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getpId() { + return pId; + } + + public void setpId(Long pId) { + this.pId = pId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ApplySpecialist.java b/backend/src/main/java/com/imurs/entity/ApplySpecialist.java new file mode 100644 index 0000000..689bcbe --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ApplySpecialist.java @@ -0,0 +1,119 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_specialist") +public class ApplySpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + private String code; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("spe_number") + private Integer speNumber; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getSpeNumber() { + return speNumber; + } + + public void setSpeNumber(Integer speNumber) { + this.speNumber = speNumber; + } + + public ApplySpecialist(Long id, Long speId, String speName, Integer state, String code, Date createTime, + Date updateTime, Integer speNumber) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.code = code; + this.createTime = createTime; + this.updateTime = updateTime; + this.speNumber = speNumber; + } + + public ApplySpecialist() { + super(); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BMDReportInfo.java b/backend/src/main/java/com/imurs/entity/BMDReportInfo.java new file mode 100644 index 0000000..80b6617 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BMDReportInfo.java @@ -0,0 +1,339 @@ +package com.imurs.entity; + +import java.util.Date; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + + + + + +/* + * @author laier + * @date 2022-12-13 15:44 + */ +@Data +@Document(indexName = "es_lunqin", shards = 5, replicas = 1) +public class BMDReportInfo { + + @Id + private Long id; + /* + + * 检查部位 + */ +@Field(type = FieldType.Keyword) + private String examinePart; + + /** + * 临床诊断 + */ + @Field(type = FieldType.Keyword) + private String initial; + + /** + * 医生意见 + */ + @Field(type = FieldType.Keyword) + private String opinion; + + /** + * 超声所见 + */ + @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") + private String bSee; + + /** + * 超声提示 + */ + @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") + private String bHint; + + /** + * 诊断结果阴阳性 + 0:阴 + 1:阳 + */ + @Field(type = FieldType.Integer) + private Integer nature; + + /** + * 专家综合诊断意见 + */ + @Field(type = FieldType.Keyword) + private String overallOpinion; + + /** + * 超声病例id + */ + @Field(type = FieldType.Keyword) + private Long bId; + + /** + * 超声图片(id集合) + */ + @Field(type = FieldType.Keyword) + private String imageIds; + + /** + * 会诊类型 + SP:视频会诊 + LX:离线会诊 + */ + @Field(type = FieldType.Keyword) + private String diagnosisType; + + /** + * 会诊医生 + */ + @Field(type = FieldType.Keyword) + private Long docId; + + /** + * 会诊专家 + */ + @Field(type = FieldType.Keyword) + private Long speId; + + /** + * 会诊时间 + */ + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date groupDate; + + /** + * 申请医院 + */ + @Field(type = FieldType.Keyword) + private String categoryHospitalId; + + /** + * 会诊医院 + */ + @Field(type = FieldType.Keyword) + private String groupHospitalId; + + /** + * 报告状态 + 2:待审核 + 0:已审核 + */ + @Field(type = FieldType.Integer) + private Integer active; + + /** + * 修改时间 + */ + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + + private static final long serialVersionUID = 1L; + + + public BMDReportInfo() { + } + + public BMDReportInfo(Long id, String examinePart, String initial, String opinion, String bSee, String bHint, Integer nature, String overallOpinion, Long bId, String imageIds, String diagnosisType, Long docId, Long speId, Date groupDate, String categoryHospitalId, String groupHospitalId, Integer active, Date updateTime) { + this.id = id; + this.examinePart = examinePart; + this.initial = initial; + this.opinion = opinion; + this.bSee = bSee; + this.bHint = bHint; + this.nature = nature; + this.overallOpinion = overallOpinion; + this.bId = bId; + this.imageIds = imageIds; + this.diagnosisType = diagnosisType; + this.docId = docId; + this.speId = speId; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.groupHospitalId = groupHospitalId; + this.active = active; + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BMDReportInfo{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active=" + active + + ", updateTime=" + updateTime + + '}'; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BModeHistory.java b/backend/src/main/java/com/imurs/entity/BModeHistory.java new file mode 100644 index 0000000..ee204c9 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BModeHistory.java @@ -0,0 +1,352 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author wang + * @date 2024年11月21日 15:21 + */ +@TableName("b_model_history") +public class BModeHistory implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 报告id + */ + @TableField("report_id") + private Long reportId; + + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + /** + * 更新医生名字 + */ + @TableField("update_doc") + private String updateDoc; + public String getUpdateDoc() { + return updateDoc; + } + + public void setUpdateDoc(String updateDoc) { + this.updateDoc = updateDoc; + } + + /** + * 检查部位 + */ + @TableField("examine_part") + private String examinePart; + /** + * 临床诊断 + */ + @TableField("initial") + private String initial; + /** + * 医生意见 + */ + @TableField("opinion") + private String opinion; + /** + * 超声所见 + */ + @TableField("b_see") + private String bSee; + /** + * 超声提示 + */ + @TableField("b_hint") + private String bHint; + /** + * 诊断结果 1:阳性 0:阴性 + */ + @TableField("nature") + private Integer nature; + /** + * 专家诊断综合意见 + */ + @TableField("overall_opinion") + private String overallOpinion; + /** + * 超声id + */ + @TableField("b_id") + private Long bId; + /** + * 超声图片(id集合) + */ + @TableField("image_ids") + private String imageIds; + /** + * 前端提交的id集合 + */ + @TableField(exist = false) + private List imageIdList; + /** + * 会诊类型 SP:视频会诊 LX:离线会诊 + */ + @TableField("diagnosis_Type") + private String diagnosisType; + /** + * 申请医生 + */ + @TableField("doc_id") + private Long docId; + /** + * 会诊专家 + */ + @TableField("spe_id") + private Long speId; + /** + * 会诊时间 + */ + @TableField("group_date") + private Date groupDate; + /** + * 申请医院 + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + /** + * 会诊医院 + */ + @TableField("group_hospital_id") + private String groupHospitalId; + /** + * 报告状态 2:待审核 0:已审核 + */ + @TableField("active") + private Integer active; + /** + * 修改时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 报告时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("report_time") + private Date reportTime; + + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 危急值 + * + */ + @TableField("critical_value") + private String criticalValue; + + public String getCriticalValue() { + return criticalValue; + } + + public void setCriticalValue(String criticalValue) { + this.criticalValue = criticalValue; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public List getImageIdList() { + return imageIdList; + } + + public void setImageIdList(List imageIdList) { + this.imageIdList = imageIdList; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BModeHistory{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", imageIdList=" + imageIdList + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active=" + active + + ", updateTime=" + updateTime + + ", criticalValue='" + criticalValue + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/entity/BModeReport.java b/backend/src/main/java/com/imurs/entity/BModeReport.java new file mode 100644 index 0000000..8657867 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BModeReport.java @@ -0,0 +1,365 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; +import java.util.List; + +/** + * @author Laier + * @date 2022-11-23 13:57 + */ +@TableName("b_mode_report") +public class BModeReport implements Serializable { + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 检查部位 + */ + @TableField("examine_part") + private String examinePart; + /** + * 临床诊断 + */ + @TableField("initial") + private String initial; + /** + * 医生意见 + */ + @TableField("opinion") + private String opinion; + /** + * 超声所见 + */ + @TableField("b_see") + private String bSee; + /** + * 超声提示 + */ + @TableField("b_hint") + private String bHint; + /** + * 诊断结果 1:阳性 0:阴性 + */ + @TableField("nature") + private Integer nature; + /** + * 专家诊断综合意见 + */ + @TableField("overall_opinion") + private String overallOpinion; + /** + * 超声id + */ + @TableField("b_id") + private Long bId; + /** + * 超声图片(id集合) + */ + @TableField("image_ids") + private String imageIds; + /** + * 前端提交的id集合 + */ + @TableField(exist = false) + private List imageIdList; + /** + * 会诊类型 SP:视频会诊 LX:离线会诊 + */ + @TableField("diagnosis_Type") + private String diagnosisType; + /** + * 申请医生 + */ + @TableField("doc_id") + private Long docId; + /** + * 会诊专家 + */ + @TableField("spe_id") + private Long speId; + /** + * 会诊时间 + */ + @TableField("group_date") + private Date groupDate; + /** + * 申请医院 + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + /** + * 会诊医院 + */ + @TableField("group_hospital_id") + private String groupHospitalId; + /** + * 报告状态 2:待审核 0:已审核 + */ + @TableField("active") + private Integer active; + /** + * 修改时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("update_time") + private Date updateTime; + + + /** + * 间隔时间 + */ + @TableField("interval_time") + private String intervalTime; + + /** + * 修改医生 + */ + @TableField("update_doc") + private String updateDoc; + + /** + * 报告时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("report_time") + private Date reportTime; + + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 审核医生 + */ + @TableField("audit_doc") + private String auditDoc; + /** + * 审核时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("audit_time") + private Date auditTime; + + public String getAuditDoc() { + return auditDoc; + } + + public void setAuditDoc(String auditDoc) { + this.auditDoc = auditDoc; + } + + + + public Date getAuditTime() { + return auditTime; + } + + public void setAuditTime(Date auditTime) { + this.auditTime = auditTime; + } + + public String getUpdateDoc() { + return updateDoc; + } + + public void setUpdateDoc(String updateDoc) { + this.updateDoc = updateDoc; + } + + public String getIntervalTime() { + return intervalTime; + } + + public void setIntervalTime(String intervalTime) { + this.intervalTime = intervalTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public List getImageIdList() { + return imageIdList; + } + + public void setImageIdList(List imageIdList) { + this.imageIdList = imageIdList; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BModeReport{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", imageIdList=" + imageIdList + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active='" + active + '\'' + + ", updateTime='" + updateTime + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/entity/Bdiagnosis.java b/backend/src/main/java/com/imurs/entity/Bdiagnosis.java new file mode 100644 index 0000000..fced5cd --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Bdiagnosis.java @@ -0,0 +1,45 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_diagnosis") +public class Bdiagnosis implements Serializable { + @Override + public String toString() { + return "Bdiagnosis [id=" + id + ", name=" + name + "]"; + } + + private Integer id; + + private String name; + + private static final long serialVersionUID = 1L; + + public Bdiagnosis(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Bdiagnosis() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BdiagnosisNext.java b/backend/src/main/java/com/imurs/entity/BdiagnosisNext.java new file mode 100644 index 0000000..6dcf7e4 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BdiagnosisNext.java @@ -0,0 +1,55 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_diagnosis_next") +public class BdiagnosisNext implements Serializable { + @Override + public String toString() { + return "BdiagnosisNext [id=" + id + ", firstId=" + firstId + ", name=" + name + "]"; + } + + private Integer id; + @TableField("first_id") + private Integer firstId; + + private String name; + + private static final long serialVersionUID = 1L; + + public BdiagnosisNext(Integer id, Integer firstId, String name) { + this.id = id; + this.firstId = firstId; + this.name = name; + } + + public BdiagnosisNext() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getFirstId() { + return firstId; + } + + public void setFirstId(Integer firstId) { + this.firstId = firstId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BmodeMachineModel.java b/backend/src/main/java/com/imurs/entity/BmodeMachineModel.java new file mode 100644 index 0000000..8e3250d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BmodeMachineModel.java @@ -0,0 +1,69 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; + + +@TableName("b_mode_machine_model") +public class BmodeMachineModel implements Serializable { + + /** + * @author: WDY + * @date: 2020/5/12 + * @description: 超声机设备实体类 + */ + private static final long serialVersionUID = 1L; + @TableField("third_id") + private int id; //设备id + @TableField("hospital_id") + private String hospitalId;//医院id + @TableField("machine_model") + private String machineModel;//设备型号 + @TableField("machine_resolution") + private String machineResolution;//设备分辨率 + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getHospitalId() { + return hospitalId; + } + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + public String getMachineModel() { + return machineModel; + } + public void setMachineModel(String machineModel) { + this.machineModel = machineModel; + } + public String getMachineResolution() { + return machineResolution; + } + public void setMachineResolution(String machineResolution) { + this.machineResolution = machineResolution; + } + @Override + public String toString() { + return "BmodeMachineModel [id=" + id + ", hospitalId=" + hospitalId + ", machineModel=" + machineModel + + ", machineResolution=" + machineResolution + "]"; + } + public BmodeMachineModel(int id, String hospitalId, String machineModel, String machineResolution) { + super(); + this.id = id; + this.hospitalId = hospitalId; + this.machineModel = machineModel; + this.machineResolution = machineResolution; + } + public BmodeMachineModel() { + super(); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/backend/src/main/java/com/imurs/entity/Bmodel.java b/backend/src/main/java/com/imurs/entity/Bmodel.java new file mode 100644 index 0000000..9bf1d1d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Bmodel.java @@ -0,0 +1,55 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model") +public class Bmodel implements Serializable { + private Integer id; + @TableField("first_id") + private Integer firstId; + @Override + public String toString() { + return "Bmodel [id=" + id + ", firstId=" + firstId + ", firstText=" + firstText + "]"; + } + + @TableField("first_text") + private String firstText; + + private static final long serialVersionUID = 1L; + + public Bmodel(Integer id, Integer firstId, String firstText) { + this.id = id; + this.firstId = firstId; + this.firstText = firstText; + } + + public Bmodel() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getFirstId() { + return firstId; + } + + public void setFirstId(Integer firstId) { + this.firstId = firstId; + } + + public String getFirstText() { + return firstText; + } + + public void setFirstText(String firstText) { + this.firstText = firstText == null ? null : firstText.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BmodelFris.java b/backend/src/main/java/com/imurs/entity/BmodelFris.java new file mode 100644 index 0000000..0ee6fb4 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BmodelFris.java @@ -0,0 +1,56 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_fris") +public class BmodelFris implements Serializable { + @Override + public String toString() { + return "BmodelFris [bfId=" + bfId + ", secondId=" + secondId + ", secondText=" + secondText + "]"; + } + + @TableField("bf_id") + private Integer bfId; + @TableField("second_id") + private Integer secondId; + @TableField("second_text") + private String secondText; + + private static final long serialVersionUID = 1L; + + public BmodelFris(Integer bfId, Integer secondId, String secondText) { + this.bfId = bfId; + this.secondId = secondId; + this.secondText = secondText; + } + + public BmodelFris() { + super(); + } + + public Integer getBfId() { + return bfId; + } + + public void setBfId(Integer bfId) { + this.bfId = bfId; + } + + public Integer getSecondId() { + return secondId; + } + + public void setSecondId(Integer secondId) { + this.secondId = secondId; + } + + public String getSecondText() { + return secondText; + } + + public void setSecondText(String secondText) { + this.secondText = secondText == null ? null : secondText.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BmodelSecond.java b/backend/src/main/java/com/imurs/entity/BmodelSecond.java new file mode 100644 index 0000000..2dbad92 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BmodelSecond.java @@ -0,0 +1,68 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_second") +public class BmodelSecond implements Serializable { + @TableField("third_id") + private Integer thirdId; + @Override + public String toString() { + return "BmodelSecond [thirdId=" + thirdId + ", bsecondId=" + bsecondId + ", thirdText=" + thirdText + + ", fouthId=" + fouthId + "]"; + } + + @TableField("bsecond_id") + private Integer bsecondId; + @TableField("third_text") + private String thirdText; + @TableField("fouth_id") + private Integer fouthId; + + private static final long serialVersionUID = 1L; + + public BmodelSecond(Integer thirdId, Integer bsecondId, String thirdText, Integer fouthId) { + this.thirdId = thirdId; + this.bsecondId = bsecondId; + this.thirdText = thirdText; + this.fouthId = fouthId; + } + + public BmodelSecond() { + super(); + } + + public Integer getThirdId() { + return thirdId; + } + + public void setThirdId(Integer thirdId) { + this.thirdId = thirdId; + } + + public Integer getBsecondId() { + return bsecondId; + } + + public void setBsecondId(Integer bsecondId) { + this.bsecondId = bsecondId; + } + + public String getThirdText() { + return thirdText; + } + + public void setThirdText(String thirdText) { + this.thirdText = thirdText == null ? null : thirdText.trim(); + } + + public Integer getFouthId() { + return fouthId; + } + + public void setFouthId(Integer fouthId) { + this.fouthId = fouthId; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java b/backend/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java new file mode 100644 index 0000000..38831c9 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java @@ -0,0 +1,46 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_second") +public class BmodelSecondWithBLOBs extends BmodelSecond implements Serializable { + @TableField("ultrasound_find") + private String ultrasoundFind; + @TableField("ultrasound_hint") + private String ultrasoundHint; + + private static final long serialVersionUID = 1L; + + public BmodelSecondWithBLOBs(Integer thirdId, Integer bsecondId, String thirdText, Integer fouthId, String ultrasoundFind, String ultrasoundHint) { + super(thirdId, bsecondId, thirdText, fouthId); + this.ultrasoundFind = ultrasoundFind; + this.ultrasoundHint = ultrasoundHint; + } + + public BmodelSecondWithBLOBs() { + super(); + } + + public String getUltrasoundFind() { + return ultrasoundFind; + } + + @Override + public String toString() { + return "BmodelSecondWithBLOBs [ultrasoundFind=" + ultrasoundFind + ", ultrasoundHint=" + ultrasoundHint + "]"; + } + + public void setUltrasoundFind(String ultrasoundFind) { + this.ultrasoundFind = ultrasoundFind == null ? null : ultrasoundFind.trim(); + } + + public String getUltrasoundHint() { + return ultrasoundHint; + } + + public void setUltrasoundHint(String ultrasoundHint) { + this.ultrasoundHint = ultrasoundHint == null ? null : ultrasoundHint.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/CaseTemplate.java b/backend/src/main/java/com/imurs/entity/CaseTemplate.java new file mode 100644 index 0000000..fdac3bc --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/CaseTemplate.java @@ -0,0 +1,129 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@TableName("case_template") +public class CaseTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 分类名字 + */ + @TableField("name") + private String name; + /** + * 父级分类id + */ + @TableField("parent_id") + private Long parentId; + /** + * 分类级别 + */ + @TableField("level") + private Long level; + /** + * ultrasound_find + */ + @TableField("ultrasound_find") + private String ultrasoundFind; + /** + * ultrasound_hint + */ + @TableField("ultrasound_hint") + private String ultrasoundHint; + + public List getCaseTemplateList() { + return caseTemplateList; + } + + public void setCaseTemplateList(List caseTemplateList) { + this.caseTemplateList = caseTemplateList; + } + + @TableField(exist = false) + private List caseTemplateList; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Long getLevel() { + return level; + } + + public void setLevel(Long level) { + this.level = level; + } + + public String getUltrasoundFind() { + return ultrasoundFind; + } + + public void setUltrasoundFind(String ultrasoundFind) { + this.ultrasoundFind = ultrasoundFind; + } + + public String getUltrasoundHint() { + return ultrasoundHint; + } + + public void setUltrasoundHint(String ultrasoundHint) { + this.ultrasoundHint = ultrasoundHint; + } + + + public CaseTemplate(Long id, String name, Long parentId, Long level, String ultrasoundFind, String ultrasoundHint) { + this.id = id; + this.name = name; + this.parentId = parentId; + this.level = level; + this.ultrasoundFind = ultrasoundFind; + this.ultrasoundHint = ultrasoundHint; + } + + public CaseTemplate() { + } + + @Override + public String toString() { + return "CaseTemplate{" + + "id=" + id + + ", name='" + name + '\'' + + ", parentId=" + parentId + + ", level=" + level + + ", ultrasoundFind='" + ultrasoundFind + '\'' + + ", ultrasoundHint='" + ultrasoundHint + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/entity/ClinicalGuidelines.java b/backend/src/main/java/com/imurs/entity/ClinicalGuidelines.java new file mode 100644 index 0000000..6771b90 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ClinicalGuidelines.java @@ -0,0 +1,187 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 诊疗指南 + * + * @author Server + * + */ +@TableName("clinical_guidelines") +public class ClinicalGuidelines implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("cg_name") + private String cgName; + + @TableField("create_time") + private Date createTime; + + @TableField("doc_id") + private Long docId; + + @TableField("doc_name") + private String docName; + + private Integer pviews; + + @TableField("file_url") + private String fileUrl; + + @TableField("hospital_id") + private String hospitalId; + + @DateTimeFormat(pattern="yyyy-MM-dd") + @TableField("upload_date") + private Date uploadDate; + + private Integer state; + + @TableField(exist=false) + private Integer number; + + private static final long serialVersionUID = 1L; + + + public ClinicalGuidelines() { + super(); + } + + public ClinicalGuidelines(Long id, String cgName, Date createTime, Long docId, String docName, Integer pviews, + String fileUrl, String hospitalId, Date uploadDate, Integer state, Integer number) { + super(); + this.id = id; + this.cgName = cgName; + this.createTime = createTime; + this.docId = docId; + this.docName = docName; + this.pviews = pviews; + this.fileUrl = fileUrl; + this.hospitalId = hospitalId; + this.uploadDate = uploadDate; + this.state = state; + this.number = number; + } + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public String getCgName() { + return cgName; + } + + + public void setCgName(String cgName) { + this.cgName = cgName; + } + + + public Date getCreateTime() { + return createTime; + } + + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + + public Long getDocId() { + return docId; + } + + + public void setDocId(Long docId) { + this.docId = docId; + } + + + public String getDocName() { + return docName; + } + + + public void setDocName(String docName) { + this.docName = docName; + } + + + public Integer getPviews() { + return pviews; + } + + + public void setPviews(Integer pviews) { + this.pviews = pviews; + } + + + public String getFileUrl() { + return fileUrl; + } + + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + + public String getHospitalId() { + return hospitalId; + } + + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + + public Date getUploadDate() { + return uploadDate; + } + + + public void setUploadDate(Date uploadDate) { + this.uploadDate = uploadDate; + } + + + public Integer getState() { + return state; + } + + + public void setState(Integer state) { + this.state = state; + } + + + public Integer getNumber() { + return number; + } + + + public void setNumber(Integer number) { + this.number = number; + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/DoctorArrange.java b/backend/src/main/java/com/imurs/entity/DoctorArrange.java new file mode 100644 index 0000000..dd20eba --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/DoctorArrange.java @@ -0,0 +1,575 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医生下乡排班表 + * + * @author Server + * + */ +@TableName("doctor_arrange") +public class DoctorArrange implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 手机号码唯一标识 + */ + private String phone; + + /** + * 医生名字 + */ + @TableField("doctor_name") + private String doctorName; + + private String job; + + /** + * 天数 + */ + private Integer day; + + /** + * 排班单位(受援单位) + */ + @TableField("receive_hospital_name") + private String receiveHospitalName; + + /** + * 排班单位Id + */ + @TableField("receive_hospital_id") + private String receiveHospitalId; + + /** + * 安排科室 + */ + private String chamber; + + /** + * 上传纸质帮扶反馈表(图片) + */ + @TableField("feedback_img") + private String feedbackImg; + + /** + * 开展工作(工作类型) + */ + @TableField("work_type") + private String workType; + + /** + * 开展工作 + */ + @TableField("develop_work") + private String developWork; + + /** + * 医生简介 + */ + @TableField("doctor_tntroduce") + private String doctorTntroduce; + + /** + * 开始日期 + */ + @TableField("start_time") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束日期 + */ + @TableField("end_time") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 结束日期 + */ + @TableField("create_time") + private Date createTime; + + /** + * 下乡反馈时间 + */ + @TableField("feedback_time") + private Date feedbackTime; + + /** + * 医生是否到达医院(D、H 、Y、Z、 (D等待帮扶 Y帮扶完成 H帮扶中 Z 拒绝帮扶) + */ + private String status; + + /** + * 下级医院安排科室 + */ + @TableField("arrange_chamber") + private String arrangeChamber; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 评价 A:优秀 B:良好 C:不及格 + */ + private String evaluate; + + /** + * 新技术,开发新项目 + */ + @TableField("new_project") + private String newProject; + + /** + * 帮扶计划 + */ + @TableField("help_plan") + private String helpPlan; + + /** + * 劳动纪律得分 + */ + @TableField("labour_grade") + private String labourGrade; + + /** + * 工作态度得分 + */ + @TableField("manner_grade") + private String mannerGrade; + + /** + * 协助医院得分 + */ + @TableField("assist_grade") + private String assistGrade; + + /** + * 工作作风得分 + */ + @TableField("woke_grade") + private String wokeGrade; + + /** + * 帮扶效果得分 + */ + @TableField("bangfu_grade") + private String bangfuGrade; + + /** + * 考核总分 + */ + @TableField("total_grade") + private String totalGrade; + + /** + * 帮扶绩效 + */ + @TableField("perfor_mance") + private String perforMance; + + /** + * 每天补助 + */ + @TableField("day_money") + private String dayMoney; + + /** + * 总金额 + */ + @TableField("total_money") + private String totalMoney; + + /** + * 交通补助 + */ + @TableField("traffic_money") + private String trafficMoney; + + /** + * 是否自驾(0/否 1/是) + */ + @TableField("is_drive") + private String isDrive; + + /** + * 排班医院类型(医联体、对口支援、名医工作室、远程协作)3/4/5/8 + */ + private String type; + + /** + * 头像 + */ + private String photo; + + @TableField(exist = false) + private String sealName; + + @TableField(exist = false) + private List iaList; + + private static final long serialVersionUID = 1L; + + public DoctorArrange() { + super(); + } + + public DoctorArrange(Long id, String phone, String doctorName, String job, Integer day, String receiveHospitalName, + String receiveHospitalId, String chamber, String feedbackImg, String workType, String developWork, + String doctorTntroduce, Date startTime, Date endTime, Date createTime, Date feedbackTime, String status, + String arrangeChamber, Long docId, String evaluate, String newProject, String helpPlan, String labourGrade, + String mannerGrade, String assistGrade, String wokeGrade, String bangfuGrade, String totalGrade, + String perforMance, String dayMoney, String totalMoney, String trafficMoney, String isDrive, String type, + String photo, String sealName, List iaList) { + super(); + this.id = id; + this.phone = phone; + this.doctorName = doctorName; + this.job = job; + this.day = day; + this.receiveHospitalName = receiveHospitalName; + this.receiveHospitalId = receiveHospitalId; + this.chamber = chamber; + this.feedbackImg = feedbackImg; + this.workType = workType; + this.developWork = developWork; + this.doctorTntroduce = doctorTntroduce; + this.startTime = startTime; + this.endTime = endTime; + this.createTime = createTime; + this.feedbackTime = feedbackTime; + this.status = status; + this.arrangeChamber = arrangeChamber; + this.docId = docId; + this.evaluate = evaluate; + this.newProject = newProject; + this.helpPlan = helpPlan; + this.labourGrade = labourGrade; + this.mannerGrade = mannerGrade; + this.assistGrade = assistGrade; + this.wokeGrade = wokeGrade; + this.bangfuGrade = bangfuGrade; + this.totalGrade = totalGrade; + this.perforMance = perforMance; + this.dayMoney = dayMoney; + this.totalMoney = totalMoney; + this.trafficMoney = trafficMoney; + this.isDrive = isDrive; + this.type = type; + this.photo = photo; + this.sealName = sealName; + this.iaList = iaList; + } + + public String getSealName() { + return sealName; + } + + public void setSealName(String sealName) { + this.sealName = sealName; + } + + public List getIaList() { + return iaList; + } + + public void setIaList(List iaList) { + this.iaList = iaList; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getDay() { + return day; + } + + public void setDay(Integer day) { + this.day = day; + } + + public String getReceiveHospitalName() { + return receiveHospitalName; + } + + public void setReceiveHospitalName(String receiveHospitalName) { + this.receiveHospitalName = receiveHospitalName; + } + + public String getReceiveHospitalId() { + return receiveHospitalId; + } + + public void setReceiveHospitalId(String receiveHospitalId) { + this.receiveHospitalId = receiveHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getFeedbackImg() { + return feedbackImg; + } + + public void setFeedbackImg(String feedbackImg) { + this.feedbackImg = feedbackImg; + } + + public String getWorkType() { + return workType; + } + + public void setWorkType(String workType) { + this.workType = workType; + } + + public String getDevelopWork() { + return developWork; + } + + public void setDevelopWork(String developWork) { + this.developWork = developWork; + } + + public String getDoctorTntroduce() { + return doctorTntroduce; + } + + public void setDoctorTntroduce(String doctorTntroduce) { + this.doctorTntroduce = doctorTntroduce; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getFeedbackTime() { + return feedbackTime; + } + + public void setFeedbackTime(Date feedbackTime) { + this.feedbackTime = feedbackTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getArrangeChamber() { + return arrangeChamber; + } + + public void setArrangeChamber(String arrangeChamber) { + this.arrangeChamber = arrangeChamber; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getEvaluate() { + return evaluate; + } + + public void setEvaluate(String evaluate) { + this.evaluate = evaluate; + } + + public String getNewProject() { + return newProject; + } + + public void setNewProject(String newProject) { + this.newProject = newProject; + } + + public String getHelpPlan() { + return helpPlan; + } + + public void setHelpPlan(String helpPlan) { + this.helpPlan = helpPlan; + } + + public String getLabourGrade() { + return labourGrade; + } + + public void setLabourGrade(String labourGrade) { + this.labourGrade = labourGrade; + } + + public String getMannerGrade() { + return mannerGrade; + } + + public void setMannerGrade(String mannerGrade) { + this.mannerGrade = mannerGrade; + } + + public String getAssistGrade() { + return assistGrade; + } + + public void setAssistGrade(String assistGrade) { + this.assistGrade = assistGrade; + } + + public String getWokeGrade() { + return wokeGrade; + } + + public void setWokeGrade(String wokeGrade) { + this.wokeGrade = wokeGrade; + } + + public String getBangfuGrade() { + return bangfuGrade; + } + + public void setBangfuGrade(String bangfuGrade) { + this.bangfuGrade = bangfuGrade; + } + + public String getTotalGrade() { + return totalGrade; + } + + public void setTotalGrade(String totalGrade) { + this.totalGrade = totalGrade; + } + + public String getPerforMance() { + return perforMance; + } + + public void setPerforMance(String perforMance) { + this.perforMance = perforMance; + } + + public String getDayMoney() { + return dayMoney; + } + + public void setDayMoney(String dayMoney) { + this.dayMoney = dayMoney; + } + + public String getTotalMoney() { + return totalMoney; + } + + public void setTotalMoney(String totalMoney) { + this.totalMoney = totalMoney; + } + + public String getTrafficMoney() { + return trafficMoney; + } + + public void setTrafficMoney(String trafficMoney) { + this.trafficMoney = trafficMoney; + } + + public String getIsDrive() { + return isDrive; + } + + public void setIsDrive(String isDrive) { + this.isDrive = isDrive; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/DoctorGroup.java b/backend/src/main/java/com/imurs/entity/DoctorGroup.java new file mode 100644 index 0000000..e3fdee5 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/DoctorGroup.java @@ -0,0 +1,248 @@ +package com.imurs.entity; + + + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.util.Date; + +/** + * + * @TableName doctor_group + */ +@TableName(value ="doctor_group") +public class DoctorGroup { + /** + * + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 分组名称 + */ + @TableField(value = "group_name") + private String groupName; + + /** + * 是否可转诊 + */ + @TableField(value = "referrable") + private Integer referrable; + + /** + * 分组别名 + */ + @TableField(value = "group_alias") + private String groupAlias; + + /** + * 分组描述 + */ + + @TableField(value = "description") + private String description; + + /** + * 组长医生ID + */ + @TableField(value = "leader_doctor_id") + private Long leaderDoctorId; + + /** + * 状态 1-启用 0-停用 + */ + @TableField(value = "status") + private Integer status; + + /** + * + */ + @TableField(value = "create_time") + private Date createTime; + + /** + * + */ + @TableField(value = "update_time") + private Date updateTime; + + /** + * + */ + public Long getId() { + return id; + } + + /** + * + */ + public void setId(Long id) { + this.id = id; + } + + public Integer getReferrable() { + return referrable; + } + + public void setReferrable(Integer referrable) { + this.referrable = referrable; + } + + /** + * 分组名称 + */ + public String getGroupName() { + return groupName; + } + + /** + * 分组名称 + */ + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + /** + * 分组别名 + */ + public String getGroupAlias() { + return groupAlias; + } + + /** + * 分组别名 + */ + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + /** + * 分组描述 + */ + public String getDescription() { + return description; + } + + /** + * 分组描述 + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 组长医生ID + */ + public Long getLeaderDoctorId() { + return leaderDoctorId; + } + + /** + * 组长医生ID + */ + public void setLeaderDoctorId(Long leaderDoctorId) { + this.leaderDoctorId = leaderDoctorId; + } + + /** + * 状态 1-启用 0-停用 + */ + public Integer getStatus() { + return status; + } + + /** + * 状态 1-启用 0-停用 + */ + public void setStatus(Integer status) { + this.status = status; + } + + /** + * + */ + public Date getCreateTime() { + return createTime; + } + + /** + * + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + DoctorGroup other = (DoctorGroup) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getGroupName() == null ? other.getGroupName() == null : this.getGroupName().equals(other.getGroupName())) + && (this.getGroupAlias() == null ? other.getGroupAlias() == null : this.getGroupAlias().equals(other.getGroupAlias())) + && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription())) + && (this.getLeaderDoctorId() == null ? other.getLeaderDoctorId() == null : this.getLeaderDoctorId().equals(other.getLeaderDoctorId())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) && (this.getReferrable() == null ? other.getReferrable() == null : this.getReferrable().equals(other.getReferrable())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getGroupName() == null) ? 0 : getGroupName().hashCode()); + result = prime * result + ((getGroupAlias() == null) ? 0 : getGroupAlias().hashCode()); + result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode()); + result = prime * result + ((getLeaderDoctorId() == null) ? 0 : getLeaderDoctorId().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getReferrable() == null) ? 0 : getReferrable().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", groupName=" + groupName + + ", groupAlias=" + groupAlias + + ", description=" + description + + ", leaderDoctorId=" + leaderDoctorId + + ", status=" + status + + ", referrable=" + referrable + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/HomePageShow.java b/backend/src/main/java/com/imurs/entity/HomePageShow.java new file mode 100644 index 0000000..172c402 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/HomePageShow.java @@ -0,0 +1,129 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 首页信息表 + * + * @author Server + * + */ +@TableName("home_page_show") +public class HomePageShow implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 标题/医院名称 + */ + private String title; + + /** + * 特殊简介(医院特色描述)/科室简介 + */ + private String special; + + /** + * 内容/医院简介 + */ + private String content; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 D医联体合作单位) + */ + private String type; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + + public HomePageShow(Long id, String title, String special, String content, String imgUrl, String type, + Date createTime) { + super(); + this.id = id; + this.title = title; + this.special = special; + this.content = content; + this.imgUrl = imgUrl; + this.type = type; + this.createTime = createTime; + } + + public HomePageShow() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public String getSpecial() { + return special; + } + + public void setSpecial(String special) { + this.special = special == null ? null : special.trim(); + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content == null ? null : content.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/ImgArrange.java b/backend/src/main/java/com/imurs/entity/ImgArrange.java new file mode 100644 index 0000000..ec35cd9 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/ImgArrange.java @@ -0,0 +1,92 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * (医生排班表图片) + * @author Server + * + */ +@TableName("img_arrange") +public class ImgArrange implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + @TableField("arrange_id") + private Long arrangeId; + + /** + * 图片类型A、医生照片 B、工作照片 + */ + private String type; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public ImgArrange(Long id, Long arrangeId, String type, String imgUrl, Date createTime) { + this.id = id; + this.arrangeId = arrangeId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + } + + public ImgArrange() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getArrangeId() { + return arrangeId; + } + + public void setArrangeId(Long arrangeId) { + this.arrangeId = arrangeId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/InoneagentBlood.java b/backend/src/main/java/com/imurs/entity/InoneagentBlood.java new file mode 100644 index 0000000..4f24c4d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/InoneagentBlood.java @@ -0,0 +1,173 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_blood") +public class InoneagentBlood implements Serializable { + @Override + public String toString() { + return "InoneagentBlood [id=" + id + ", idnumber=" + idnumber + ", oxygen=" + oxygen + ", pulserate=" + + pulserate + ", examtype=" + examtype + ", glucose=" + glucose + ", machineno=" + machineno + + ", oxygExamtime=" + oxygExamtime + ", glucoseExamtime=" + glucoseExamtime + ", pressureExamtime=" + + pressureExamtime + ", pressureExamtype=" + pressureExamtype + ", systolic=" + systolic + + ", diastolic=" + diastolic + "]"; + } + + private Integer id; + //身份证号 + private String idnumber; + //血氧饱和度 + private String oxygen; + //脉率 + private String pulserate; + // + private String examtype; +//血糖值 + private String glucose; +//设备编号 + private String machineno; + //血氧 检查时间 + @TableField("oxyg_examtime") + private String oxygExamtime; + //血糖 检查时间 + @TableField("glucose_examtime") + private String glucoseExamtime; + //血压 检查时间 + @TableField("pressure_examtime") + private String pressureExamtime; + //血压检查类型 1:左 2:右 检查类型 + @TableField("pressure_examtype") + private String pressureExamtype; + //收缩压 + private String systolic; +//舒张压 + private String diastolic; + + private static final long serialVersionUID = 1L; + + public InoneagentBlood(Integer id, String idnumber, String oxygen, String pulserate, String examtype, String glucose, String machineno, String oxygExamtime, String glucoseExamtime, String pressureExamtime, String pressureExamtype, String systolic, String diastolic) { + this.id = id; + this.idnumber = idnumber; + this.oxygen = oxygen; + this.pulserate = pulserate; + this.examtype = examtype; + this.glucose = glucose; + this.machineno = machineno; + this.oxygExamtime = oxygExamtime; + this.glucoseExamtime = glucoseExamtime; + this.pressureExamtime = pressureExamtime; + this.pressureExamtype = pressureExamtype; + this.systolic = systolic; + this.diastolic = diastolic; + } + + public InoneagentBlood() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getOxygen() { + return oxygen; + } + + public void setOxygen(String oxygen) { + this.oxygen = oxygen == null ? null : oxygen.trim(); + } + + public String getPulserate() { + return pulserate; + } + + public void setPulserate(String pulserate) { + this.pulserate = pulserate == null ? null : pulserate.trim(); + } + + public String getExamtype() { + return examtype; + } + + public void setExamtype(String examtype) { + this.examtype = examtype == null ? null : examtype.trim(); + } + + public String getGlucose() { + return glucose; + } + + public void setGlucose(String glucose) { + this.glucose = glucose == null ? null : glucose.trim(); + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getOxygExamtime() { + return oxygExamtime; + } + + public void setOxygExamtime(String oxygExamtime) { + this.oxygExamtime = oxygExamtime == null ? null : oxygExamtime.trim(); + } + + public String getGlucoseExamtime() { + return glucoseExamtime; + } + + public void setGlucoseExamtime(String glucoseExamtime) { + this.glucoseExamtime = glucoseExamtime == null ? null : glucoseExamtime.trim(); + } + + public String getPressureExamtime() { + return pressureExamtime; + } + + public void setPressureExamtime(String pressureExamtime) { + this.pressureExamtime = pressureExamtime == null ? null : pressureExamtime.trim(); + } + + public String getPressureExamtype() { + return pressureExamtype; + } + + public void setPressureExamtype(String pressureExamtype) { + this.pressureExamtype = pressureExamtype == null ? null : pressureExamtype.trim(); + } + + public String getSystolic() { + return systolic; + } + + public void setSystolic(String systolic) { + this.systolic = systolic == null ? null : systolic.trim(); + } + + public String getDiastolic() { + return diastolic; + } + + public void setDiastolic(String diastolic) { + this.diastolic = diastolic == null ? null : diastolic.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/InoneagentEcg.java b/backend/src/main/java/com/imurs/entity/InoneagentEcg.java new file mode 100644 index 0000000..cb44677 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/InoneagentEcg.java @@ -0,0 +1,211 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_ecg") +public class InoneagentEcg implements Serializable { + private Integer id; + + private String machineno; + + private String idnumber; + //心率 + private String hr; +//P轴 + private String paxis; + //T轴 + private String taxis; +//QRS轴 + private String qrsaxis; + + @Override + public String toString() { + return "InoneagentEcg [id=" + id + ", machineno=" + machineno + ", idnumber=" + idnumber + ", hr=" + hr + + ", paxis=" + paxis + ", taxis=" + taxis + ", qrsaxis=" + qrsaxis + ", pr=" + pr + ", qt=" + qt + + ", qtc=" + qtc + ", qrs=" + qrs + ", rv5=" + rv5 + ", sv1=" + sv1 + ", diagnosis=" + diagnosis + + ", filename=" + filename + ", examtime=" + examtime + ", createtime=" + createtime + "]"; + } + //PR间期 + private String pr; +//QT间期 + private String qt; +//QTc间期 + private String qtc; +//QRS时限 + private String qrs; +//RV5值 + private String rv5; +//SV1值 + private String sv1; +//诊断结果 + private String diagnosis; +//心电文件路径 + private String filename; +//检查日期 + private String examtime; +//创建时间 + private String createtime; + + private static final long serialVersionUID = 1L; + + public InoneagentEcg(Integer id, String machineno, String idnumber, String hr, String paxis, String taxis, String qrsaxis, String pr, String qt, String qtc, String qrs, String rv5, String sv1, String diagnosis, String filename, String examtime, String createtime) { + this.id = id; + this.machineno = machineno; + this.idnumber = idnumber; + this.hr = hr; + this.paxis = paxis; + this.taxis = taxis; + this.qrsaxis = qrsaxis; + this.pr = pr; + this.qt = qt; + this.qtc = qtc; + this.qrs = qrs; + this.rv5 = rv5; + this.sv1 = sv1; + this.diagnosis = diagnosis; + this.filename = filename; + this.examtime = examtime; + this.createtime = createtime; + } + + public InoneagentEcg() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr == null ? null : hr.trim(); + } + + public String getPaxis() { + return paxis; + } + + public void setPaxis(String paxis) { + this.paxis = paxis == null ? null : paxis.trim(); + } + + public String getTaxis() { + return taxis; + } + + public void setTaxis(String taxis) { + this.taxis = taxis == null ? null : taxis.trim(); + } + + public String getQrsaxis() { + return qrsaxis; + } + + public void setQrsaxis(String qrsaxis) { + this.qrsaxis = qrsaxis == null ? null : qrsaxis.trim(); + } + + public String getPr() { + return pr; + } + + public void setPr(String pr) { + this.pr = pr == null ? null : pr.trim(); + } + + public String getQt() { + return qt; + } + + public void setQt(String qt) { + this.qt = qt == null ? null : qt.trim(); + } + + public String getQtc() { + return qtc; + } + + public void setQtc(String qtc) { + this.qtc = qtc == null ? null : qtc.trim(); + } + + public String getQrs() { + return qrs; + } + + public void setQrs(String qrs) { + this.qrs = qrs == null ? null : qrs.trim(); + } + + public String getRv5() { + return rv5; + } + + public void setRv5(String rv5) { + this.rv5 = rv5 == null ? null : rv5.trim(); + } + + public String getSv1() { + return sv1; + } + + public void setSv1(String sv1) { + this.sv1 = sv1 == null ? null : sv1.trim(); + } + + public String getDiagnosis() { + return diagnosis; + } + + public void setDiagnosis(String diagnosis) { + this.diagnosis = diagnosis == null ? null : diagnosis.trim(); + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename == null ? null : filename.trim(); + } + + public String getExamtime() { + return examtime; + } + + public void setExamtime(String examtime) { + this.examtime = examtime == null ? null : examtime.trim(); + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime == null ? null : createtime.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/InoneagentPersion.java b/backend/src/main/java/com/imurs/entity/InoneagentPersion.java new file mode 100644 index 0000000..c6f64b3 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/InoneagentPersion.java @@ -0,0 +1,194 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_persion") +public class InoneagentPersion implements Serializable { + private Integer id; + //姓名 + private String personname; +//身份证号 + private String idnumber; +//出生日期 + private String birthday; +//性别 + private String sex; +//民族 + private String nation; +//电话 + private String tel; +//户籍地 + private String domicile; +//住址 + private String address; +//建档日期 + private String archivedate; + + private String createtime; +//体温 + private String temperature; +//身高 + private String height; + // + private String machineno; + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno; + } +//体重 + private String weight; + //体温检查时间 + @TableField("tep_examtime")// + private String tepExamtime; + //身高体重时间 + @TableField("hw_examtime") + private String hwExamtime; + + private static final long serialVersionUID = 1L; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getPersonname() { + return personname; + } + + public void setPersonname(String personname) { + this.personname = personname; + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getDomicile() { + return domicile; + } + + public void setDomicile(String domicile) { + this.domicile = domicile; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getArchivedate() { + return archivedate; + } + + public void setArchivedate(String archivedate) { + this.archivedate = archivedate; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getTepExamtime() { + return tepExamtime; + } + + public void setTepExamtime(String tepExamtime) { + this.tepExamtime = tepExamtime; + } + + public String getHwExamtime() { + return hwExamtime; + } + + public void setHwExamtime(String hwExamtime) { + this.hwExamtime = hwExamtime; + } + + @Override + public String toString() { + return "InoneagentPersion [id=" + id + ", personname=" + personname + ", idnumber=" + idnumber + ", birthday=" + + birthday + ", sex=" + sex + ", nation=" + nation + ", tel=" + tel + ", domicile=" + domicile + + ", address=" + address + ", archivedate=" + archivedate + ", createtime=" + createtime + + ", temperature=" + temperature + ", height=" + height + ", machineno=" + machineno + ", weight=" + + weight + ", tepExamtime=" + tepExamtime + ", hwExamtime=" + hwExamtime + "]"; + } + + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/InoneagentUrine.java b/backend/src/main/java/com/imurs/entity/InoneagentUrine.java new file mode 100644 index 0000000..117da6f --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/InoneagentUrine.java @@ -0,0 +1,200 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_urine") +public class InoneagentUrine implements Serializable { + @Override + public String toString() { + return "InoneagentUrine [id=" + id + ", machineno=" + machineno + ", idnumber=" + idnumber + ", uro=" + uro + + ", bld=" + bld + ", bil=" + bil + ", ket=" + ket + ", glu=" + glu + ", pro=" + pro + ", ph=" + ph + + ", nit=" + nit + ", wbc=" + wbc + ", sg=" + sg + ", vc=" + vc + ", examtime=" + examtime + + ", createtime=" + createtime + "]"; + } + + private Integer id; + + private String machineno; + + private String idnumber; + //尿胆原 + private String uro; + //潜血 + private String bld; + //胆红素 + private String bil; + //酮体 + private String ket; + //葡萄糖 + private String glu; + //蛋白质 + private String pro; + //PH + private String ph; + //亚硝酸盐 + private String nit; + //白细胞 + private String wbc; + //比重 + private String sg; + //维生素C + private String vc; + //检查日期 + private String examtime; + //尿胆原 + private String createtime; + + private static final long serialVersionUID = 1L; + + public InoneagentUrine(Integer id, String machineno, String idnumber, String uro, String bld, String bil, String ket, String glu, String pro, String ph, String nit, String wbc, String sg, String vc, String examtime, String createtime) { + this.id = id; + this.machineno = machineno; + this.idnumber = idnumber; + this.uro = uro; + this.bld = bld; + this.bil = bil; + this.ket = ket; + this.glu = glu; + this.pro = pro; + this.ph = ph; + this.nit = nit; + this.wbc = wbc; + this.sg = sg; + this.vc = vc; + this.examtime = examtime; + this.createtime = createtime; + } + + public InoneagentUrine() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getUro() { + return uro; + } + + public void setUro(String uro) { + this.uro = uro == null ? null : uro.trim(); + } + + public String getBld() { + return bld; + } + + public void setBld(String bld) { + this.bld = bld == null ? null : bld.trim(); + } + + public String getBil() { + return bil; + } + + public void setBil(String bil) { + this.bil = bil == null ? null : bil.trim(); + } + + public String getKet() { + return ket; + } + + public void setKet(String ket) { + this.ket = ket == null ? null : ket.trim(); + } + + public String getGlu() { + return glu; + } + + public void setGlu(String glu) { + this.glu = glu == null ? null : glu.trim(); + } + + public String getPro() { + return pro; + } + + public void setPro(String pro) { + this.pro = pro == null ? null : pro.trim(); + } + + public String getPh() { + return ph; + } + + public void setPh(String ph) { + this.ph = ph == null ? null : ph.trim(); + } + + public String getNit() { + return nit; + } + + public void setNit(String nit) { + this.nit = nit == null ? null : nit.trim(); + } + + public String getWbc() { + return wbc; + } + + public void setWbc(String wbc) { + this.wbc = wbc == null ? null : wbc.trim(); + } + + public String getSg() { + return sg; + } + + public void setSg(String sg) { + this.sg = sg == null ? null : sg.trim(); + } + + public String getVc() { + return vc; + } + + public void setVc(String vc) { + this.vc = vc == null ? null : vc.trim(); + } + + public String getExamtime() { + return examtime; + } + + public void setExamtime(String examtime) { + this.examtime = examtime == null ? null : examtime.trim(); + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime == null ? null : createtime.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/InstallModel.java b/backend/src/main/java/com/imurs/entity/InstallModel.java new file mode 100644 index 0000000..4c07c6d --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/InstallModel.java @@ -0,0 +1,134 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; + +@TableName("install_model") +public class InstallModel implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id",type = IdType.AUTO) + private Integer id; + + /** + * 麦克风型号 + */ + @TableField("micro") + private String micro; + + /** + * 扬声器型号 + */ + @TableField("speaker") + private String speaker; + + /** + * 摄像头型号 + */ + @TableField("camera") + private String camera; + + /** + * 分辨率 + */ + @TableField("resolution") + private String resolution; + + /** + * 视频类别 + * 超声视频:BMODEL + * 远程会诊视频:CON + */ + @TableField("type") + private String type; + + /** + * 所属医院id + */ + @TableField("hospital_id") + private String hospitalId; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMicro() { + return micro; + } + + public void setMicro(String micro) { + this.micro = micro; + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker; + } + + public String getCamera() { + return camera; + } + + public void setCamera(String camera) { + this.camera = camera; + } + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + public InstallModel() {} + + public InstallModel(Integer id, String micro, String speaker, String camera, String resolution, + String type, String hospitalId) { + this.id = id; + this.micro = micro; + this.speaker = speaker; + this.camera = camera; + this.resolution = resolution; + this.type = type; + this.hospitalId = hospitalId; + } + + @Override + public String toString() { + return "InstallModel [id=" + id + ", micro=" + micro + ", speaker=" + speaker + ", camera=" + camera + + ", resolution=" + resolution + ", type=" + type + ", hospitalId=" + hospitalId + "]"; + } + +} diff --git a/backend/src/main/java/com/imurs/entity/LayoutConfig.java b/backend/src/main/java/com/imurs/entity/LayoutConfig.java new file mode 100644 index 0000000..b87e82a --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/LayoutConfig.java @@ -0,0 +1,253 @@ +package com.imurs.entity; + +import java.io.Serializable; +/** + * @ + * @Author xfh + * @Date 2020/10/28 16:07 + * @Param + * @Return + * @Exception + * //当 mixedVideoLayout 设为 3 时,可以通过该参数自定义合流布局 + */ +public class LayoutConfig implements Serializable { + + //(选填)String 类型 + private String uid; + + //(必填)Float 类型。屏幕里该画面左上角的横坐标的相对值 + private Float x_axis; + + //(必填)Float 类型。屏幕里该画面左上角的纵坐标的相对值 + private Float y_axis; + + //(必填)Float 类型。该画面宽度的相对值 + private Float width; + + //(必填)Float 类型。该画面高度的相对值 + private Float height; + + //(选填)Float 类型。图像的透明度 + private Float alpha; + + //(选填)Number 类型。画面显示模式(0:(默认)裁剪模式 1:缩放模式) + private Float render_mode; + + private String url; + + private String appid; + private Integer streamTypes; + private String cname; + private Integer channelType; + private String rdirectory; + private String sdirectory; + private Integer twidth; + private Integer theight; + private Integer fps; + private Integer bitrate; + private Integer mixedVideoLayout; + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public Float getX_axis() { + return x_axis; + } + + public void setX_axis(Float x_axis) { + this.x_axis = x_axis; + } + + public Float getY_axis() { + return y_axis; + } + + public void setY_axis(Float y_axis) { + this.y_axis = y_axis; + } + + public Float getWidth() { + return width; + } + + public void setWidth(Float width) { + this.width = width; + } + + public Float getHeight() { + return height; + } + + public void setHeight(Float height) { + this.height = height; + } + + public Float getAlpha() { + return alpha; + } + + public void setAlpha(Float alpha) { + this.alpha = alpha; + } + + public Float getRender_mode() { + return render_mode; + } + + public void setRender_mode(Float render_mode) { + this.render_mode = render_mode; + } + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public Integer getStreamTypes() { + return streamTypes; + } + + public void setStreamTypes(Integer streamTypes) { + this.streamTypes = streamTypes; + } + + public String getCname() { + return cname; + } + + public void setCname(String cname) { + this.cname = cname; + } + + public Integer getChannelType() { + return channelType; + } + + public void setChannelType(Integer channelType) { + this.channelType = channelType; + } + + public String getRdirectory() { + return rdirectory; + } + + public void setRdirectory(String rdirectory) { + this.rdirectory = rdirectory; + } + + public String getSdirectory() { + return sdirectory; + } + + public void setSdirectory(String sdirectory) { + this.sdirectory = sdirectory; + } + + public Integer getTwidth() { + return twidth; + } + + public void setTwidth(Integer twidth) { + this.twidth = twidth; + } + + public Integer getTheight() { + return theight; + } + + public void setTheight(Integer theight) { + this.theight = theight; + } + + public Integer getFps() { + return fps; + } + + public void setFps(Integer fps) { + this.fps = fps; + } + + public Integer getBitrate() { + return bitrate; + } + + public void setBitrate(Integer bitrate) { + this.bitrate = bitrate; + } + + public Integer getMixedVideoLayout() { + return mixedVideoLayout; + } + + public void setMixedVideoLayout(Integer mixedVideoLayout) { + this.mixedVideoLayout = mixedVideoLayout; + } + + public LayoutConfig() { + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public LayoutConfig(String uid, Float x_axis, Float y_axis, Float width, Float height, Float alpha, Float render_mode, String appid, + Integer streamTypes, String cname, Integer channelType, String rdirectory, String sdirectory, Integer twidth, + Integer theight, Integer fps, Integer bitrate, Integer mixedVideoLayout,String url) { + this.uid = uid; + this.x_axis = x_axis; + this.y_axis = y_axis; + this.width = width; + this.height = height; + this.alpha = alpha; + this.render_mode = render_mode; + this.appid = appid; + this.streamTypes = streamTypes; + this.cname = cname; + this.channelType = channelType; + this.rdirectory = rdirectory; + this.sdirectory = sdirectory; + this.twidth = twidth; + this.theight = theight; + this.fps = fps; + this.bitrate = bitrate; + this.mixedVideoLayout = mixedVideoLayout; + this.url = url; + } + + @Override + public String toString() { + return "LayoutConfig{" + + "uid='" + uid + '\'' + + ", x_axis=" + x_axis + + ", y_axis=" + y_axis + + ", width=" + width + + ", height=" + height + + ", alpha=" + alpha + + ", render_mode=" + render_mode + + ", url='" + url + '\'' + + ", appid='" + appid + '\'' + + ", streamTypes=" + streamTypes + + ", cname='" + cname + '\'' + + ", channelType=" + channelType + + ", rdirectory='" + rdirectory + '\'' + + ", sdirectory='" + sdirectory + '\'' + + ", twidth=" + twidth + + ", theight=" + theight + + ", fps=" + fps + + ", bitrate=" + bitrate + + ", mixedVideoLayout=" + mixedVideoLayout + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/entity/Live.java b/backend/src/main/java/com/imurs/entity/Live.java new file mode 100644 index 0000000..38fe985 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Live.java @@ -0,0 +1,148 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +public class Live implements Serializable { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("r_id") + private Long rId; + + private Integer state; + + @TableField("live_url") + private String liveUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("end_time") + private Date endTime; + + @TableField("all_time") + private Integer allTime; + + private String title ; + + private String doctor; + + private String departments; + + @TableField("application_time") + private Date applicationTime; + + public String getDoctor() { + return doctor; + } + + public void setDoctor(String doctor) { + this.doctor = doctor; + } + + public String getDepartments() { + return departments; + } + + public void setDepartments(String departments) { + this.departments = departments; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getrId() { + return rId; + } + + public void setrId(Long rId) { + this.rId = rId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getLiveUrl() { + return liveUrl; + } + + public void setLiveUrl(String liveUrl) { + this.liveUrl = liveUrl; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAllTime() { + return allTime; + } + + public void setAllTime(Integer allTime) { + this.allTime = allTime; + } + + public Live() { + } + + public Live(Long id, Long rId, Integer state, String liveUrl, Date createTime, Date endTime, Integer allTime, String title, String doctor, + String departments, Date applicationTime) { + this.id = id; + this.rId = rId; + this.state = state; + this.liveUrl = liveUrl; + this.createTime = createTime; + this.endTime = endTime; + this.allTime = allTime; + this.title = title; + this.doctor = doctor; + this.departments = departments; + this.applicationTime = applicationTime; + } +} diff --git a/backend/src/main/java/com/imurs/entity/LoginRecord.java b/backend/src/main/java/com/imurs/entity/LoginRecord.java new file mode 100644 index 0000000..e8d9069 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/LoginRecord.java @@ -0,0 +1,115 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 用户登录记录表 + * + * @author dgg + * + */ +@TableName("login_record") +public class LoginRecord implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 登录id + */ + @TableField("login_id") + private String loginId; + + /** + * 登录名称 + */ + @TableField("login_name") + private String loginName; + + /** + * 登录ip + */ + private String ip; + + /** + * 登录角色 + */ + private String rid; + + /** + * 登录时间 + */ + @TableField("create_time") + private Date createTime; + + public LoginRecord() { + super(); + } + + public LoginRecord(Integer id, String loginId, String loginName, String ip, String rid, Date createTime) { + super(); + this.id = id; + this.loginId = loginId; + this.loginName = loginName; + this.ip = ip; + this.rid = rid; + this.createTime = createTime; + } + + private static final long serialVersionUID = 1L; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getLoginName() { + return loginName; + } + + public void setLoginName(String loginName) { + this.loginName = loginName; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/Patient.java b/backend/src/main/java/com/imurs/entity/Patient.java new file mode 100644 index 0000000..de12e4c --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Patient.java @@ -0,0 +1,313 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient") +public class Patient implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 患者姓名 + */ + @TableField("patient_name") + private String patientName; + + private Integer age; + + private String sex; + + /** + * 出生日期 + */ + @TableField("birth_date") + private String birthDate; + + /** + * 婚姻状况 + */ + private String marriage; + + /** + * 出生日期 + */ + @TableField("patient_job") + private String patientJob; + + /** + * 家庭住址 + */ + private String family; + + /** + * 家庭电话 + */ + @TableField("family_phone") + private String familyPhone; + + /** + * 紧急联系人 + */ + private String urgency; + + /** + * 紧急联系人关系 + */ + private String relation; + + /** + * 紧急联系人电话 + */ + @TableField("urgency_phone") + private String urgencyPhone; + + /** + * 身份证号码 + */ + private String card; + + /** + * 医生id/第一次输入的医生id + */ + @TableField("doc_id") + private Long docId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private String phone; + + @TableField("hospital_id") + private String hospitalId; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + private static final long serialVersionUID = 1L; + + public Patient(Long id, String patientName, Integer age, String sex, String birthDate, String marriage, + String patientJob, String family, String familyPhone, String urgency, String relation, String urgencyPhone, + String card, Long docId, Date createTime, Date updateTime, String phone, String hospitalId, + String esrdNumber, String hisEsrdNumber, String outPatien) { + super(); + this.id = id; + this.patientName = patientName; + this.age = age; + this.sex = sex; + this.birthDate = birthDate; + this.marriage = marriage; + this.patientJob = patientJob; + this.family = family; + this.familyPhone = familyPhone; + this.urgency = urgency; + this.relation = relation; + this.urgencyPhone = urgencyPhone; + this.card = card; + this.docId = docId; + this.createTime = createTime; + this.updateTime = updateTime; + this.phone = phone; + this.hospitalId = hospitalId; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public Patient() { + super(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String string) { + this.birthDate = string; + } + + public String getMarriage() { + return marriage; + } + + public void setMarriage(String marriage) { + this.marriage = marriage == null ? null : marriage.trim(); + } + + public String getPatientJob() { + return patientJob; + } + + public void setPatientJob(String patientJob) { + this.patientJob = patientJob == null ? null : patientJob.trim(); + } + + public String getFamily() { + return family; + } + + public void setFamily(String family) { + this.family = family == null ? null : family.trim(); + } + + public String getFamilyPhone() { + return familyPhone; + } + + public void setFamilyPhone(String familyPhone) { + this.familyPhone = familyPhone == null ? null : familyPhone.trim(); + } + + public String getUrgency() { + return urgency; + } + + public void setUrgency(String urgency) { + this.urgency = urgency == null ? null : urgency.trim(); + } + + public String getRelation() { + return relation; + } + + public void setRelation(String relation) { + this.relation = relation == null ? null : relation.trim(); + } + + public String getUrgencyPhone() { + return urgencyPhone; + } + + public void setUrgencyPhone(String urgencyPhone) { + this.urgencyPhone = urgencyPhone == null ? null : urgencyPhone.trim(); + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card == null ? null : card.trim(); + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "Patient [id=" + id + ", patientName=" + patientName + ", age=" + age + ", sex=" + sex + ", birthDate=" + + birthDate + ", marriage=" + marriage + ", patientJob=" + patientJob + ", family=" + family + + ", familyPhone=" + familyPhone + ", urgency=" + urgency + ", relation=" + relation + ", urgencyPhone=" + + urgencyPhone + ", card=" + card + ", docId=" + docId + ", createTime=" + createTime + ", updateTime=" + + updateTime + ", phone=" + phone + ", hospitalId=" + hospitalId + ", esrdNumber=" + esrdNumber + "]"; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/PatientUser.java b/backend/src/main/java/com/imurs/entity/PatientUser.java new file mode 100644 index 0000000..9c11138 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/PatientUser.java @@ -0,0 +1,224 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user") +public class PatientUser implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String account; + + @TableField("pt_name") + private String ptName; + + private Integer age; + + private String phone; + + private String password; + + @TableField("pt_img") + private String ptImg; + + private Integer parity; + + private Integer ectroma; + + private String card; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("pt_iccid") + private String ptIccid; + + private Integer rid; + + @TableField("rp_id") + private String rpId; + + private Integer state; + + private String salt; + + + + public PatientUser(Integer id, String account, String ptName, Integer age, String phone, String password, + String ptImg, Integer parity, Integer ectroma, String card, Date createTime, Date updateTime, + String ptIccid, Integer rid, String rpId, Integer state,String salt) { + super(); + this.id = id; + this.account = account; + this.ptName = ptName; + this.age = age; + this.phone = phone; + this.password = password; + this.ptImg = ptImg; + this.parity = parity; + this.ectroma = ectroma; + this.card = card; + this.createTime = createTime; + this.updateTime = updateTime; + this.ptIccid = ptIccid; + this.rid = rid; + this.rpId = rpId; + this.state = state; + this.salt = salt; + } + + public PatientUser() { + super(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account == null ? null : account.trim(); + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName == null ? null : ptName.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone == null ? null : phone.trim(); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password == null ? null : password.trim(); + } + + public String getPtImg() { + return ptImg; + } + + public void setPtImg(String ptImg) { + this.ptImg = ptImg == null ? null : ptImg.trim(); + } + + public Integer getParity() { + return parity; + } + + public void setParity(Integer parity) { + this.parity = parity; + } + + public Integer getEctroma() { + return ectroma; + } + + public void setEctroma(Integer ectroma) { + this.ectroma = ectroma; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card == null ? null : card.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getPtIccid() { + return ptIccid; + } + + public void setPtIccid(String ptIccid) { + this.ptIccid = ptIccid == null ? null : ptIccid.trim(); + } + + public Integer getRid() { + return rid; + } + + public void setRid(Integer rid) { + this.rid = rid; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/PatientUserRecord.java b/backend/src/main/java/com/imurs/entity/PatientUserRecord.java new file mode 100644 index 0000000..a7106f2 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/PatientUserRecord.java @@ -0,0 +1,427 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user_record") +public class PatientUserRecord implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + @TableField("pt_uid") + private Integer ptUid; + + @TableField("pt_card") + private String ptCard; + + private String hbp; + + private String idh; + + private String glu; + + private String bgs; + + private String temp; + + private String hrrest; + + private String weight; + + private String ua; + + private String tcho; + + private String trig; + + private String fhr; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("pt_name") + private String ptName; + + private Integer uro; + + @TableField("glu_two") + private Integer gluTwo; + + private Integer ket; + + private Integer bil; + + private Integer pro; + + private Integer nit; + + private Integer ph; + + private Integer bld; + + private Integer sg; + + private Integer leu; + + private Integer vc; + + private Integer cr; + + private Integer ca; + + private Integer ma; + + @TableField(exist=false) + private List imgList; + + @TableField(exist=false) + private String account; + + @TableField(exist=false) + private Integer age; + + @TableField(exist=false) + private String parity; + + private static final long serialVersionUID = 1L; + + + public PatientUserRecord(Integer id, Integer ptUid, String ptCard, String hbp, String idh, String glu, String bgs, + String temp, String hrrest, String weight, String ua, String tcho, String trig, String fhr, Date createTime, + Date updateTime, String ptName, Integer uro, Integer gluTwo, Integer ket, Integer bil, Integer pro, + Integer nit, Integer ph, Integer bld, Integer sg, Integer leu, Integer vc, Integer cr, Integer ca, + Integer ma, List imgList, String account, Integer age, String parity) { + super(); + this.id = id; + this.ptUid = ptUid; + this.ptCard = ptCard; + this.hbp = hbp; + this.idh = idh; + this.glu = glu; + this.bgs = bgs; + this.temp = temp; + this.hrrest = hrrest; + this.weight = weight; + this.ua = ua; + this.tcho = tcho; + this.trig = trig; + this.fhr = fhr; + this.createTime = createTime; + this.updateTime = updateTime; + this.ptName = ptName; + this.uro = uro; + this.gluTwo = gluTwo; + this.ket = ket; + this.bil = bil; + this.pro = pro; + this.nit = nit; + this.ph = ph; + this.bld = bld; + this.sg = sg; + this.leu = leu; + this.vc = vc; + this.cr = cr; + this.ca = ca; + this.ma = ma; + this.imgList = imgList; + this.account = account; + this.age = age; + this.parity = parity; + } + + public PatientUserRecord() { + super(); + } + + public Integer getUro() { + return uro; + } + + public void setUro(Integer uro) { + this.uro = uro; + } + + public Integer getGluTwo() { + return gluTwo; + } + + public void setGluTwo(Integer gluTwo) { + this.gluTwo = gluTwo; + } + + public Integer getKet() { + return ket; + } + + public void setKet(Integer ket) { + this.ket = ket; + } + + public Integer getBil() { + return bil; + } + + public void setBil(Integer bil) { + this.bil = bil; + } + + public Integer getPro() { + return pro; + } + + public void setPro(Integer pro) { + this.pro = pro; + } + + public Integer getNit() { + return nit; + } + + public void setNit(Integer nit) { + this.nit = nit; + } + + public Integer getPh() { + return ph; + } + + public void setPh(Integer ph) { + this.ph = ph; + } + + public Integer getBld() { + return bld; + } + + public void setBld(Integer bld) { + this.bld = bld; + } + + public Integer getSg() { + return sg; + } + + public void setSg(Integer sg) { + this.sg = sg; + } + + public Integer getLeu() { + return leu; + } + + public void setLeu(Integer leu) { + this.leu = leu; + } + + public Integer getVc() { + return vc; + } + + public void setVc(Integer vc) { + this.vc = vc; + } + + public Integer getCr() { + return cr; + } + + public void setCr(Integer cr) { + this.cr = cr; + } + + public Integer getCa() { + return ca; + } + + public void setCa(Integer ca) { + this.ca = ca; + } + + public Integer getMa() { + return ma; + } + + public void setMa(Integer ma) { + this.ma = ma; + } + + public List getImgList() { + return imgList; + } + + public void setImgList(List imgList) { + this.imgList = imgList; + } + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getParity() { + return parity; + } + + public void setParity(String parity) { + this.parity = parity; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getPtUid() { + return ptUid; + } + + public void setPtUid(Integer ptUid) { + this.ptUid = ptUid; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getHbp() { + return hbp; + } + + public void setHbp(String hbp) { + this.hbp = hbp == null ? null : hbp.trim(); + } + + public String getIdh() { + return idh; + } + + public void setIdh(String idh) { + this.idh = idh == null ? null : idh.trim(); + } + + public String getGlu() { + return glu; + } + + public void setGlu(String glu) { + this.glu = glu == null ? null : glu.trim(); + } + + public String getBgs() { + return bgs; + } + + public void setBgs(String bgs) { + this.bgs = bgs == null ? null : bgs.trim(); + } + + public String getTemp() { + return temp; + } + + public void setTemp(String temp) { + this.temp = temp == null ? null : temp.trim(); + } + + public String getHrrest() { + return hrrest; + } + + public void setHrrest(String hrrest) { + this.hrrest = hrrest == null ? null : hrrest.trim(); + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight == null ? null : weight.trim(); + } + + public String getUa() { + return ua; + } + + public void setUa(String ua) { + this.ua = ua == null ? null : ua.trim(); + } + + public String getTcho() { + return tcho; + } + + public void setTcho(String tcho) { + this.tcho = tcho == null ? null : tcho.trim(); + } + + public String getTrig() { + return trig; + } + + public void setTrig(String trig) { + this.trig = trig == null ? null : trig.trim(); + } + + public String getFhr() { + return fhr; + } + + public void setFhr(String fhr) { + this.fhr = fhr == null ? null : fhr.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/PatientUserRecordImg.java b/backend/src/main/java/com/imurs/entity/PatientUserRecordImg.java new file mode 100644 index 0000000..333dd98 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/PatientUserRecordImg.java @@ -0,0 +1,105 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user_record_img") +public class PatientUserRecordImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + @TableField("rd_id") + private Integer rdId; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public PatientUserRecordImg(Integer id, Integer rdId, Integer type, String imgUrl, Date createTime, Date updateTime, String fileName) { + this.id = id; + this.rdId = rdId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.updateTime = updateTime; + this.fileName = fileName; + } + + public PatientUserRecordImg() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRdId() { + return rdId; + } + + public void setRdId(Integer rdId) { + this.rdId = rdId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName == null ? null : fileName.trim(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/Role.java b/backend/src/main/java/com/imurs/entity/Role.java new file mode 100644 index 0000000..8f53e6e --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Role.java @@ -0,0 +1,81 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("role") +public class Role implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String rname; + + private Integer rstate; + + @TableField("rp_id") + private String rpId; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public Role(Long id, String rname, Integer rstate, String rpId, Date createTime) { + super(); + this.id = id; + this.rname = rname; + this.rstate = rstate; + this.rpId = rpId; + this.createTime = createTime; + } + + public Role() { + super(); + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRname() { + return rname; + } + + public void setRname(String rname) { + this.rname = rname == null ? null : rname.trim(); + } + + public Integer getRstate() { + return rstate; + } + + public void setRstate(Integer rstate) { + this.rstate = rstate; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/Section.java b/backend/src/main/java/com/imurs/entity/Section.java new file mode 100644 index 0000000..827d9ae --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Section.java @@ -0,0 +1,76 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 科室表 + * @author Server + * + */ +@TableName("section") +public class Section implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + @TableField("se_name") + private String seName; + + @TableField("hospital_id") + private String hospitalId; + + @TableField("create_time") + private Date createTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSeName() { + return seName; + } + + public void setSeName(String seName) { + this.seName = seName == null ? null : seName.trim(); + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Section(Long id, String seName, String hospitalId, Date createTime) { + super(); + this.id = id; + this.seName = seName; + this.hospitalId = hospitalId; + this.createTime = createTime; + } + + public Section() { + super(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/SysMenu.java b/backend/src/main/java/com/imurs/entity/SysMenu.java new file mode 100644 index 0000000..402e989 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/SysMenu.java @@ -0,0 +1,144 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("sys_menu") +public class SysMenu implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 菜单栏一级名称 + */ + @TableField("menu_stair") + private String menuStair; + + /** + * 菜单栏二级名称 + */ + @TableField("menu_vfp") + private String menuVfp; + + /** + * 菜单栏图片 + */ + @TableField("menu_image") + private String menuImage; + + /** + * 菜单栏地址 + */ + @TableField("menu_url") + private String menuUrl; + + /** + * 菜单栏状态 1:激活 2:冻结 + */ + @TableField("menu_state") + private Integer menuState; + + /** + * 角色id + */ + private String rid; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public SysMenu(Long id, String menuStair, String menuVfp, String menuImage, String menuUrl, Integer menuState, + String rid, Date createTime) { + super(); + this.id = id; + this.menuStair = menuStair; + this.menuVfp = menuVfp; + this.menuImage = menuImage; + this.menuUrl = menuUrl; + this.menuState = menuState; + this.rid = rid; + this.createTime = createTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public SysMenu() { + super(); + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMenuStair() { + return menuStair; + } + + public void setMenuStair(String menuStair) { + this.menuStair = menuStair == null ? null : menuStair.trim(); + } + + public String getMenuVfp() { + return menuVfp; + } + + public void setMenuVfp(String menuVfp) { + this.menuVfp = menuVfp == null ? null : menuVfp.trim(); + } + + public String getMenuImage() { + return menuImage; + } + + public void setMenuImage(String menuImage) { + this.menuImage = menuImage == null ? null : menuImage.trim(); + } + + public String getMenuUrl() { + return menuUrl; + } + + public void setMenuUrl(String menuUrl) { + this.menuUrl = menuUrl == null ? null : menuUrl.trim(); + } + + public Integer getMenuState() { + return menuState; + } + + public void setMenuState(Integer menuState) { + this.menuState = menuState; + } + + @Override + public String toString() { + return "SysMenu [id=" + id + ", menuStair=" + menuStair + ", menuVfp=" + menuVfp + ", menuImage=" + menuImage + + ", menuUrl=" + menuUrl + ", menuState=" + menuState + ", rid=" + rid + "]"; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java b/backend/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java new file mode 100644 index 0000000..8391db2 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java @@ -0,0 +1,98 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 诊疗指南汇总表查看次数 + * + * @author dgg + * + */ +@TableName("total_clinical_guidelines") +public class TotalClinicalGuidelines implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 诊疗指南id + */ + @TableField(value = "clinical_id") + private Long clinicalId; + + /** + * 专家查看id + */ + @TableField(value = "doc_id") + private Long docId; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + @TableField(value = "hospital_id") + private Long hospitalId; + + private static final long serialVersionUID = 1L; + + public TotalClinicalGuidelines(Integer id, Long clinicalId, Long docId, Date createTime, Long hospitalId) { + super(); + this.id = id; + this.clinicalId = clinicalId; + this.docId = docId; + this.createTime = createTime; + this.hospitalId = hospitalId; + } + + public TotalClinicalGuidelines() { + super(); + } + + public Long getHospitalId() { + return hospitalId; + } + + public void setHospitalId(Long hospitalId) { + this.hospitalId = hospitalId; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Long getClinicalId() { + return clinicalId; + } + + public void setClinicalId(Long clinicalId) { + this.clinicalId = clinicalId; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TotalInformation.java b/backend/src/main/java/com/imurs/entity/TotalInformation.java new file mode 100644 index 0000000..befc763 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TotalInformation.java @@ -0,0 +1,358 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医联体等汇总表 + * @author dgg + * + */ +@TableName("total_information") +public class TotalInformation implements Serializable { + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + /** + * 医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 合作模式 1:相对松散型 0否 + */ + @TableField("co_loose") + private Integer coLoose; + /** + * 合作模式 1:相对紧密型 0否 + */ + @TableField("co_tension") + private Integer coTension; + /** + * 县域医共体 + */ + @TableField("co_county") + private Integer coCounty; + + /** + * 专科联盟 + */ + @TableField("co_unior_coalition") + private Integer coUniorCoalition; + + /** + * 远程医疗协作 + */ + @TableField("co_tele_medicine") + private Integer coTeleMedicine; + + /** + * 帮扶协议 1:是 0:否 + */ + @TableField("help_protocol") + private Integer helpProtocol; + + /** + * 排班安排人数 + */ + @TableField("below_arrange_number") + private Long belowArrangeNumber; + + /** + * 服务天数 + */ + @TableField("serve_day") + private Long serveDay; + + /** + * 进修培训安排人数 + */ + @TableField("up_arrange_number") + private Long upArrangeNumber; + + /** + * 课题数 + */ + @TableField("subject_number") + private Long subjectNumber; + + /** + * 培训人次 + */ + @TableField("training_number") + private Long trainingNumber; + + /** + * 双向转诊 向上转诊 + */ + @TableField("case_upward_number") + private Long caseUpwardNumber; + + /** + * 开展远程诊疗人次 + */ + @TableField("consul_number") + private Long consulNumber; + + /** + * 双向转诊 向下转诊 + */ + @TableField("case_down_number") + private Long caseDownNumber; + + /** + * 医疗质量检查(次数) + */ + @TableField("medical_number") + private Long medicalNumber; + + /** + * 支持专科建设(个数) + */ + @TableField("junior_number") + private Long juniorNumber; + + /** + * 新技术项目推广应用 + */ + @TableField("technique_number") + private Long techniqueNumber; + + /** + * 合作时间(同市级医院合作) + */ + @TableField("cooperation_time") + private Date cooperationTime; + + /** + * 医院类型(医联体、对口资源、远程协助、名医工作室)3/4/5/8 + */ + private Integer type; + + private static final long serialVersionUID = 1L; + + public TotalInformation() { + super(); + } + + public TotalInformation(Integer id, String hospitalName, String hospitalId, Integer coLoose, Integer coTension, + Integer coCounty, Integer coUniorCoalition, Integer coTeleMedicine, Integer helpProtocol, + Long belowArrangeNumber, Long serveDay, Long upArrangeNumber, Long subjectNumber, Long trainingNumber, + Long caseUpwardNumber, Long consulNumber, Long caseDownNumber, Long medicalNumber, Long juniorNumber, + Long techniqueNumber, Date cooperationTime, Integer type) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.hospitalId = hospitalId; + this.coLoose = coLoose; + this.coTension = coTension; + this.coCounty = coCounty; + this.coUniorCoalition = coUniorCoalition; + this.coTeleMedicine = coTeleMedicine; + this.helpProtocol = helpProtocol; + this.belowArrangeNumber = belowArrangeNumber; + this.serveDay = serveDay; + this.upArrangeNumber = upArrangeNumber; + this.subjectNumber = subjectNumber; + this.trainingNumber = trainingNumber; + this.caseUpwardNumber = caseUpwardNumber; + this.consulNumber = consulNumber; + this.caseDownNumber = caseDownNumber; + this.medicalNumber = medicalNumber; + this.juniorNumber = juniorNumber; + this.techniqueNumber = techniqueNumber; + this.cooperationTime = cooperationTime; + this.type = type; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Integer getCoLoose() { + return coLoose; + } + + public void setCoLoose(Integer coLoose) { + this.coLoose = coLoose; + } + + public Integer getCoTension() { + return coTension; + } + + public void setCoTension(Integer coTension) { + this.coTension = coTension; + } + + public Integer getCoCounty() { + return coCounty; + } + + public void setCoCounty(Integer coCounty) { + this.coCounty = coCounty; + } + + public Integer getCoUniorCoalition() { + return coUniorCoalition; + } + + public void setCoUniorCoalition(Integer coUniorCoalition) { + this.coUniorCoalition = coUniorCoalition; + } + + public Integer getCoTeleMedicine() { + return coTeleMedicine; + } + + public void setCoTeleMedicine(Integer coTeleMedicine) { + this.coTeleMedicine = coTeleMedicine; + } + + public Integer getHelpProtocol() { + return helpProtocol; + } + + public void setHelpProtocol(Integer helpProtocol) { + this.helpProtocol = helpProtocol; + } + + public Long getBelowArrangeNumber() { + return belowArrangeNumber; + } + + public void setBelowArrangeNumber(Long belowArrangeNumber) { + this.belowArrangeNumber = belowArrangeNumber; + } + + public Long getServeDay() { + return serveDay; + } + + public void setServeDay(Long serveDay) { + this.serveDay = serveDay; + } + + public Long getUpArrangeNumber() { + return upArrangeNumber; + } + + public void setUpArrangeNumber(Long upArrangeNumber) { + this.upArrangeNumber = upArrangeNumber; + } + + public Long getSubjectNumber() { + return subjectNumber; + } + + public void setSubjectNumber(Long subjectNumber) { + this.subjectNumber = subjectNumber; + } + + public Long getTrainingNumber() { + return trainingNumber; + } + + public void setTrainingNumber(Long trainingNumber) { + this.trainingNumber = trainingNumber; + } + + public Long getCaseUpwardNumber() { + return caseUpwardNumber; + } + + public void setCaseUpwardNumber(Long caseUpwardNumber) { + this.caseUpwardNumber = caseUpwardNumber; + } + + public Long getConsulNumber() { + return consulNumber; + } + + public void setConsulNumber(Long consulNumber) { + this.consulNumber = consulNumber; + } + + public Long getCaseDownNumber() { + return caseDownNumber; + } + + public void setCaseDownNumber(Long caseDownNumber) { + this.caseDownNumber = caseDownNumber; + } + + public Long getMedicalNumber() { + return medicalNumber; + } + + public void setMedicalNumber(Long medicalNumber) { + this.medicalNumber = medicalNumber; + } + + public Long getJuniorNumber() { + return juniorNumber; + } + + public void setJuniorNumber(Long juniorNumber) { + this.juniorNumber = juniorNumber; + } + + public Long getTechniqueNumber() { + return techniqueNumber; + } + + public void setTechniqueNumber(Long techniqueNumber) { + this.techniqueNumber = techniqueNumber; + } + + public Date getCooperationTime() { + return cooperationTime; + } + + public void setCooperationTime(Date cooperationTime) { + this.cooperationTime = cooperationTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TotalTraining.java b/backend/src/main/java/com/imurs/entity/TotalTraining.java new file mode 100644 index 0000000..e9eb28b --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TotalTraining.java @@ -0,0 +1,117 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医院课程培训统计表 + * + * @author dgg + * + */ +@TableName("total_training") +public class TotalTraining implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 培训课程id + */ + @TableField("training_id") + private Long trainingId; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 查看医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 参加人次(查看次数) + */ + private Integer number; + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TotalTraining() { + super(); + } + + public TotalTraining(Long id, Long trainingId, String hospitalId, Long docId, Integer number, Date createTime) { + super(); + this.id = id; + this.trainingId = trainingId; + this.hospitalId = hospitalId; + this.docId = docId; + this.number = number; + this.createTime = createTime; + } + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getTrainingId() { + return trainingId; + } + + public void setTrainingId(Long trainingId) { + this.trainingId = trainingId; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/Training.java b/backend/src/main/java/com/imurs/entity/Training.java new file mode 100644 index 0000000..698061e --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/Training.java @@ -0,0 +1,252 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 上传视频表 + * + * @author Server + * + */ +@TableName("training") +public class Training implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 科室 + */ + private String chamber; + /** + * 主讲人 演讲人 上传者姓名 + */ + private String speaker; + /** + * 标题 + */ + private String title; + /** + * 职位 + */ + private String job; + /** + * 医院 + */ + private String hospital; + /** + * 时长 + */ + private String duration; + /** + * 视频路径 + */ + private String url; + /** + * 开播日期(创建时间) + */ + @TableField("create_time") + private Date createTime; + /** + * 视频类型(课题类型) + */ + private Integer type; + /** + * 上传者头像 + */ + @TableField("img_url") + private String imgUrl; + /** + * 介绍(简介) + */ + private String introduce; + /** + * 上传者姓名 + */ + @TableField("doc_id") + private Long docId; + /** + * 电话号码 + */ + private String phone; + + /** + * 培训人数 + */ + private Integer number; + + /** + * 查看总人数(实体类特有) + */ + @TableField(exist = false) + private String totalNumber; + + private static final long serialVersionUID = 1L; + + public Training() { + super(); + } + + public Training(Long id, String chamber, String speaker, String title, String job, String hospital, String duration, + String url, Date createTime, Integer type, String imgUrl, String introduce, Long docId, String phone, + Integer number, String totalNumber) { + super(); + this.id = id; + this.chamber = chamber; + this.speaker = speaker; + this.title = title; + this.job = job; + this.hospital = hospital; + this.duration = duration; + this.url = url; + this.createTime = createTime; + this.type = type; + this.imgUrl = imgUrl; + this.introduce = introduce; + this.docId = docId; + this.phone = phone; + this.number = number; + this.totalNumber = totalNumber; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getHospital() { + return hospital; + } + + public void setHospital(String hospital) { + this.hospital = hospital; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getIntroduce() { + return introduce; + } + + public void setIntroduce(String introduce) { + this.introduce = introduce; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getTotalNumber() { + return totalNumber; + } + + public void setTotalNumber(String totalNumber) { + this.totalNumber = totalNumber; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TrainingFlower.java b/backend/src/main/java/com/imurs/entity/TrainingFlower.java new file mode 100644 index 0000000..59820b7 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TrainingFlower.java @@ -0,0 +1,102 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 视频送花表 + * @author dgg + * + */ +@TableName("training_flower") +public class TrainingFlower implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 视频课件id + */ + @TableField("training_id") + private Integer trainingId; + + /** + * 送花人id + */ + @TableField("give_id") + private String giveId; + + @TableField("flower_num") + private Integer flowerNum; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + + public TrainingFlower() { + super(); + } + + public TrainingFlower(Integer id, Integer trainingId, String giveId, Integer flowerNum, Date createTime) { + super(); + this.id = id; + this.trainingId = trainingId; + this.giveId = giveId; + this.flowerNum = flowerNum; + this.createTime = createTime; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTrainingId() { + return trainingId; + } + + public void setTrainingId(Integer trainingId) { + this.trainingId = trainingId; + } + + public String getGiveId() { + return giveId; + } + + public void setGiveId(String giveId) { + this.giveId = giveId; + } + + public Integer getFlowerNum() { + return flowerNum; + } + + public void setFlowerNum(Integer flowerNum) { + this.flowerNum = flowerNum; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TrainingOpinion.java b/backend/src/main/java/com/imurs/entity/TrainingOpinion.java new file mode 100644 index 0000000..b642497 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TrainingOpinion.java @@ -0,0 +1,163 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 回复表 + * @author Server + * + */ +@TableName("training_opinion") +public class TrainingOpinion implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 回复内容 + */ + private String content; + + /** + * 回复id + */ + @TableField("reply_id") + private String replyId; + + /** + * 回复人 + */ + @TableField("reply_name") + private String replyName; + + /** + * 视频id + */ + @TableField("training_id") + private Long trainingId; + + /** + * 谁评论誰 誰回复誰 + */ + @TableField("huifu_or_pinglun") + private String huifuOrPinglun; + + /** + * 发布人所属人 + */ + @TableField("training_belong") + private String trainingBelong; + + /** + * 头像照片 + */ + @TableField("photo") + private String photo; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + + public TrainingOpinion() { + super(); + } + + public TrainingOpinion(Long id, String content, String replyId, String replyName, Long trainingId, + String huifuOrPinglun, String trainingBelong, String photo, Date createTime) { + super(); + this.id = id; + this.content = content; + this.replyId = replyId; + this.replyName = replyName; + this.trainingId = trainingId; + this.huifuOrPinglun = huifuOrPinglun; + this.trainingBelong = trainingBelong; + this.photo = photo; + this.createTime = createTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyId() { + return replyId; + } + + public void setReplyId(String replyId) { + this.replyId = replyId; + } + + public String getReplyName() { + return replyName; + } + + public void setReplyName(String replyName) { + this.replyName = replyName; + } + + public Long getTrainingId() { + return trainingId; + } + + public void setTrainingId(Long trainingId) { + this.trainingId = trainingId; + } + + public String getHuifuOrPinglun() { + return huifuOrPinglun; + } + + public void setHuifuOrPinglun(String huifuOrPinglun) { + this.huifuOrPinglun = huifuOrPinglun; + } + + public String getTrainingBelong() { + return trainingBelong; + } + + public void setTrainingBelong(String trainingBelong) { + this.trainingBelong = trainingBelong; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TrainingPlan.java b/backend/src/main/java/com/imurs/entity/TrainingPlan.java new file mode 100644 index 0000000..1502336 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TrainingPlan.java @@ -0,0 +1,172 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * trainingplan(培训计划课题表) + * @author Server + * + */ +@TableName("training_plan") +public class TrainingPlan implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 科室 + */ + private String chamber; + + /** + * 主讲人 + */ + private String speaker; + + /** + * 职称 + */ + private String job; + + /** + * 课程类别、PX教学培训、JZ健康讲座 + */ + @TableField("train_type") + private Integer trainType; + + /** + * 责任人 + */ + private String principal; + + /** + *创建人 + */ + @TableField("create_name") + private String createName; + + /** + * 课题 + */ + private String title; + + /** + * 讲课时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("lecture_time") + private Date lectureTime; + + /** + * 讲课时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TrainingPlan(Long id, String chamber, String speaker, String job, Integer trainType, String principal, String createName, String title, Date lectureTime, Date createTime) { + this.id = id; + this.chamber = chamber; + this.speaker = speaker; + this.job = job; + this.trainType = trainType; + this.principal = principal; + this.createName = createName; + this.title = title; + this.lectureTime = lectureTime; + this.createTime = createTime; + } + + public TrainingPlan() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker == null ? null : speaker.trim(); + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job == null ? null : job.trim(); + } + + public Integer getTrainType() { + return trainType; + } + + public void setTrainType(Integer trainType) { + this.trainType=trainType; + } + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal == null ? null : principal.trim(); + } + + public String getCreateName() { + return createName; + } + + public void setCreateName(String createName) { + this.createName = createName == null ? null : createName.trim(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public Date getLectureTime() { + return lectureTime; + } + + public void setLectureTime(Date lectureTime) { + this.lectureTime = lectureTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/TrainingRecord.java b/backend/src/main/java/com/imurs/entity/TrainingRecord.java new file mode 100644 index 0000000..f718d55 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/TrainingRecord.java @@ -0,0 +1,163 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 培训记录表 + * + * @author dgg + * + */ +@TableName("training_record") +public class TrainingRecord implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 单位名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 课题名称 + */ + private String title; + + /** + * 培训时间 + */ + @DateTimeFormat(pattern="yyyy-MM-dd") + @TableField("training_time") + private Date trainingTime; + + /** + * 培训人数 + */ + @TableField("training_number") + private Integer trainingNumber; + + /** + * 培训照片 + */ + @TableField("training_img") + private String trainingImg; + + /** + * 培训照片 + */ + @TableField("training_two_img") + private String trainingTwoImg; + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TrainingRecord(Long id, String hospitalName, String hospitalId, String title, Date trainingTime, + Integer trainingNumber, String trainingImg, String trainingTwoImg, Date createTime) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.hospitalId = hospitalId; + this.title = title; + this.trainingTime = trainingTime; + this.trainingNumber = trainingNumber; + this.trainingImg = trainingImg; + this.trainingTwoImg = trainingTwoImg; + this.createTime = createTime; + } + + public TrainingRecord() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName == null ? null : hospitalName.trim(); + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId == null ? null : hospitalId.trim(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public Date getTrainingTime() { + return trainingTime; + } + + public void setTrainingTime(Date trainingTime) { + this.trainingTime = trainingTime; + } + + public Integer getTrainingNumber() { + return trainingNumber; + } + + public void setTrainingNumber(Integer trainingNumber) { + this.trainingNumber = trainingNumber; + } + + public String getTrainingImg() { + return trainingImg; + } + + public void setTrainingImg(String trainingImg) { + this.trainingImg = trainingImg == null ? null : trainingImg.trim(); + } + + public String getTrainingTwoImg() { + return trainingTwoImg; + } + + public void setTrainingTwoImg(String trainingTwoImg) { + this.trainingTwoImg = trainingTwoImg; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/User.java b/backend/src/main/java/com/imurs/entity/User.java new file mode 100644 index 0000000..dc4c4b0 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/User.java @@ -0,0 +1,634 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +//import com.fasterxml.jackson.annotation.JsonView; +//import com.xiaoleilu.hutool.system.UserInfo; + +/** + * 用户表 + * + * @author Server + * + */ +@TableName("user") +public class User implements Serializable { + + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户姓名 + */ + @TableField("user_name") + private String userName; + + /** + * 医生分组别名 + */ + @TableField("group_alias") + private String groupAlias; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 科室id + */ + @TableField("se_name") + private String seName; + + /** + * 角色表id + */ + private Long rid; + + /** + * 出生日期 + */ + private Date birthdate; + + private String job; + + private String sex; + + private String phone; + + private String email; + + private String wechat; + + /** + * 微信密钥 + */ + @TableField("wechat_key") + private String wechatKey; + + /** + * 状态 1:激活 2:冻结 3:撤销 + */ + private Integer state; + + private String photo; + + /** + * 身份证号码 + */ + private String card; + + //@JsonView(UserInfo.class) + private String password; + + /** + * 身份证正面照片 + */ + @TableField("card_front_img") + private String cardFrontImg; + + /** + * 身份证反面照片 + */ + @TableField("card_verso_img") + private String cardVersoImg; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 具体家庭地址 + */ + private String site; + + /** + * 医师执证 + */ + @TableField("licensed_img") + private String licensedImg; + + /** + * 医师资格证 + */ + @TableField("cgfns_img") + private String cgfnsImg; + + /** + * 技术资格证 + */ + @TableField("skill_img") + private String skillImg; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 修改时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 管理员id + */ + @TableField("admin_id") + private Long adminId; + + @TableField("rp_id") + private String rpId; + + @TableField("contact_phone") + private String contactPhone; + + /** + * 登录次数 + */ + @TableField("login_number") + private Integer loginNumber; + + /** + * 最后登录时间 + */ + @TableField("last_time") + private String lastTime; + + /** + * 医生简介 + */ + private String intro; + + /** + * 主攻方向 + */ + @TableField("main_attack") + private String mainAttack; + + /** + * 医院名称 + */ + @TableField(exist = false) + private String hospitalName; + + + /** + * 是否家庭医生: 1 是 : 0 否 + */ + @TableField("is_family") + private Integer isFamily; + + /** + * 是否家庭医生: 1 是 : 0 否 + */ + @TableField("is_succeed") + private Integer isSucceed; + + @TableField("job_level") + private Integer jobLevel; + + private Integer head; + + /** + * 专家签名的图片地址 + */ + @TableField("specialist_signature") + private String specialistSignature; + + + private static final long serialVersionUID = 1L; + + public User() { + super(); + } + + public User(Long id, String userName, String hospitalId, String seName, Long rid, Date birthdate, String job, + String sex, String phone, String email, String wechat, String wechatKey, Integer state, String photo, + String card, String password, String cardFrontImg, String cardVersoImg, String province, String city, + String site, String licensedImg, String cgfnsImg, String skillImg, Date createTime, Date updateTime, + Long adminId, String rpId, String contactPhone, Integer loginNumber, String lastTime, String intro, + String mainAttack, String hospitalName, Integer isFamily, Integer isSucceed ,String salt,Integer head, + Integer jobLevel,String specialistSignature, String groupAlias) { + super(); + this.id = id; + this.userName = userName; + this.hospitalId = hospitalId; + this.seName = seName; + this.rid = rid; + this.birthdate = birthdate; + this.job = job; + this.sex = sex; + this.phone = phone; + this.email = email; + this.wechat = wechat; + this.wechatKey = wechatKey; + this.state = state; + this.photo = photo; + this.card = card; + this.password = password; + this.cardFrontImg = cardFrontImg; + this.cardVersoImg = cardVersoImg; + this.province = province; + this.city = city; + this.site = site; + this.licensedImg = licensedImg; + this.cgfnsImg = cgfnsImg; + this.skillImg = skillImg; + this.createTime = createTime; + this.updateTime = updateTime; + this.adminId = adminId; + this.rpId = rpId; + this.contactPhone = contactPhone; + this.loginNumber = loginNumber; + this.lastTime = lastTime; + this.intro = intro; + this.mainAttack = mainAttack; + this.hospitalName = hospitalName; + this.isFamily = isFamily; + this.isSucceed = isSucceed; + this.jobLevel = jobLevel; + this.head = head; + this.specialistSignature = specialistSignature; + this.groupAlias = groupAlias; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getSeName() { + return seName; + } + + public void setSeName(String seName) { + this.seName = seName; + } + + public Long getRid() { + return rid; + } + + public void setRid(Long rid) { + this.rid = rid; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getWechat() { + return wechat; + } + + public void setWechat(String wechat) { + this.wechat = wechat; + } + + public String getWechatKey() { + return wechatKey; + } + + public void setWechatKey(String wechatKey) { + this.wechatKey = wechatKey; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCardFrontImg() { + return cardFrontImg; + } + + public void setCardFrontImg(String cardFrontImg) { + this.cardFrontImg = cardFrontImg; + } + + public String getCardVersoImg() { + return cardVersoImg; + } + + public void setCardVersoImg(String cardVersoImg) { + this.cardVersoImg = cardVersoImg; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getSite() { + return site; + } + + public void setSite(String site) { + this.site = site; + } + + public String getLicensedImg() { + return licensedImg; + } + + public void setLicensedImg(String licensedImg) { + this.licensedImg = licensedImg; + } + + public String getCgfnsImg() { + return cgfnsImg; + } + + public void setCgfnsImg(String cgfnsImg) { + this.cgfnsImg = cgfnsImg; + } + + public String getSkillImg() { + return skillImg; + } + + public void setSkillImg(String skillImg) { + this.skillImg = skillImg; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getAdminId() { + return adminId; + } + + public void setAdminId(Long adminId) { + this.adminId = adminId; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Integer getLoginNumber() { + return loginNumber; + } + + public void setLoginNumber(Integer loginNumber) { + this.loginNumber = loginNumber; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getMainAttack() { + return mainAttack; + } + + public void setMainAttack(String mainAttack) { + this.mainAttack = mainAttack; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public Integer getIsFamily() { + return isFamily; + } + + public void setIsFamily(Integer isFamily) { + this.isFamily = isFamily; + } + + public Integer getIsSucceed() { + return isSucceed; + } + + public void setIsSucceed(Integer isSucceed) { + this.isSucceed = isSucceed; + } + + public Integer getJobLevel() { + return jobLevel; + } + + public void setJobLevel(Integer jobLevel) { + this.jobLevel = jobLevel; + } + + public Integer getHead() { + return head; + } + + public void setHead(Integer head) { + this.head = head; + } + + public String getSpecialistSignature() { + return specialistSignature; + } + + public void setSpecialistSignature(String specialistSignature) { + this.specialistSignature = specialistSignature; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", userName='" + userName + '\'' + + ", hospitalId='" + hospitalId + '\'' + + ", seName='" + seName + '\'' + + ", rid=" + rid + + ", birthdate=" + birthdate + + ", job='" + job + '\'' + + ", sex='" + sex + '\'' + + ", phone='" + phone + '\'' + + ", email='" + email + '\'' + + ", wechat='" + wechat + '\'' + + ", wechatKey='" + wechatKey + '\'' + + ", state=" + state + + ", photo='" + photo + '\'' + + ", card='" + card + '\'' + + ", password='" + password + '\'' + + ", cardFrontImg='" + cardFrontImg + '\'' + + ", cardVersoImg='" + cardVersoImg + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", site='" + site + '\'' + + ", licensedImg='" + licensedImg + '\'' + + ", cgfnsImg='" + cgfnsImg + '\'' + + ", skillImg='" + skillImg + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", adminId=" + adminId + + ", rpId='" + rpId + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", loginNumber=" + loginNumber + + ", lastTime='" + lastTime + '\'' + + ", intro='" + intro + '\'' + + ", mainAttack='" + mainAttack + '\'' + + ", hospitalName='" + hospitalName + '\'' + + ", isFamily=" + isFamily + + ", isSucceed=" + isSucceed + + ", specialistSignature='" + specialistSignature + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/VideoRecord.java b/backend/src/main/java/com/imurs/entity/VideoRecord.java new file mode 100644 index 0000000..5b7da40 --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/VideoRecord.java @@ -0,0 +1,131 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +/** + * 视频记录表 + * @author dgg + * + */ +@TableName("video_record") +public class VideoRecord implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 发起方id + */ + @TableField("initiator_id") + private String initiatorId; + + /** + * 接收方id + */ + @TableField("acceptor_id") + private String acceptorId; + + /** + * 会诊id + */ + @TableField("conultation_id") + private String conultationId; + + + /** + * 1/2/3 同意、拒绝 + */ + private String state; + + + /** + * 类型(A/B)视频会诊、椅旁会诊 + */ + private String type; + + + @TableField("createTime") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public VideoRecord(Integer id, String initiatorId, String acceptorId, String conultationId, String state, + String type, Date createTime) { + super(); + this.id = id; + this.initiatorId = initiatorId; + this.acceptorId = acceptorId; + this.conultationId = conultationId; + this.state = state; + this.type = type; + this.createTime = createTime; + } + + public VideoRecord() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getInitiatorId() { + return initiatorId; + } + + public void setInitiatorId(String initiatorId) { + this.initiatorId = initiatorId; + } + + public String getAcceptorId() { + return acceptorId; + } + + public void setAcceptorId(String acceptorId) { + this.acceptorId = acceptorId; + } + + public String getConultationId() { + return conultationId; + } + + public void setConultationId(String conultationId) { + this.conultationId = conultationId; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/entity/WebLog.java b/backend/src/main/java/com/imurs/entity/WebLog.java new file mode 100644 index 0000000..463ef8c --- /dev/null +++ b/backend/src/main/java/com/imurs/entity/WebLog.java @@ -0,0 +1,166 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +/** + * 日志表 + * @author wdh + */ +@TableName("web_log") +public class WebLog implements Serializable { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 操作用户 + */ + private String username; + + /** + * 操作时间 + */ + @TableField("start_time") + private Date startTime; + + /** + * 消耗时间(毫秒) + */ + @TableField("spend_time") + private Long spendTime; + + /** + * URL + */ + private String url; + + /** + * 请求类型 + */ + @TableField("http_method") + private String httpMethod; + + /** + * 请求的类路径 + */ + @TableField("class_method") + private String classMethod; + + /** + * IP地址 + */ + private String ip; + + /** + * 请求参数 + */ + private String parameter; + + /** + * 请求是否成功 + * 1:成功 2:失败 + */ + private Integer success; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Long getSpendTime() { + return spendTime; + } + + public void setSpendTime(Long spendTime) { + this.spendTime = spendTime; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(String httpMethod) { + this.httpMethod = httpMethod; + } + + public String getClassMethod() { + return classMethod; + } + + public void setClassMethod(String classMethod) { + this.classMethod = classMethod; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getParameter() { + return parameter; + } + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + public Integer getSuccess() { + return success; + } + + public void setSuccess(Integer success) { + this.success = success; + } + + @Override + public String toString() { + return "WebLog{" + + "id=" + id + + ", username='" + username + '\'' + + ", startTime=" + startTime + + ", spendTime=" + spendTime + + ", url='" + url + '\'' + + ", httpMethod='" + httpMethod + '\'' + + ", classMethod='" + classMethod + '\'' + + ", ip='" + ip + '\'' + + ", parameter='" + parameter + '\'' + + ", success=" + success + + '}'; + } +} diff --git a/backend/src/main/java/com/imurs/excelderive/Easyexcel.java b/backend/src/main/java/com/imurs/excelderive/Easyexcel.java new file mode 100644 index 0000000..4a61840 --- /dev/null +++ b/backend/src/main/java/com/imurs/excelderive/Easyexcel.java @@ -0,0 +1,127 @@ +package com.imurs.excelderive; + + + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; + + +import com.imurs.service.ApplyBModeService; +import com.imurs.utils.Dateutil; +import com.imurs.utils.PositiveResult; +import com.imurs.utils.positiveCount; + +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.filters.SetCharacterEncodingFilter; +import org.springframework.core.io.ClassPathResource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping(value = "/excelExport") +@Slf4j +public class Easyexcel { + @Resource + private ApplyBModeService applyBModeService; + + + @GetMapping(value = "easyexcel") + public void easyexcel(HttpServletResponse response, String startTime, String endTime,String conditions,String consultationMode,String categoryHospitalId) { + + List> result = null; + + response.reset(); + // System.out.println("时间"+startTime+";;;"+endTime); + + try { + + setResponseHeader(response, "工作量数据报告.xlsx"); + + result = applyBModeService.selectWorkTotalByTime(startTime, endTime,conditions, consultationMode,categoryHospitalId); + + PositiveResult positiveResult = positiveCount.countPositive(result); + + + //templates/ + ClassPathResource templateResource = new ClassPathResource("export-template.xlsx"); + + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) + .withTemplate(templateResource.getInputStream()) + .build(); + + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); + + excelWriter.fill(result, fillConfig, writeSheet); + + Map map = new HashMap(); + + String sTime = Dateutil.exchangeDate(startTime); + String eTime = Dateutil.exchangeDate(endTime); + + map.put("date",sTime + "至" + eTime); + map.put("positive",positiveResult.getPositive()); + map.put("yangCount",positiveResult.getYangCount()); + map.put("totalCount",positiveResult.getTotalCount()); + excelWriter.fill(map, writeSheet); + + + + List> totalListList = new ArrayList>(); + List totalList = new ArrayList(); + totalListList.add(totalList); + // 添加空单元格,用于对齐 + for (int i = 0; i < 8; i++) { + totalList.add(null); + } + totalList.add(positiveResult.getYangCount()); + totalList.add(positiveResult.getTotalCount()); + // 第四列 + totalList.add(positiveResult.getPositive()); + // 这里是write 别和fill 搞错了 + excelWriter.write(totalListList, writeSheet); + + excelWriter.finish(); + + + } catch (Exception e) { + log.error("导出excel失败"); + throw new RuntimeException("导出excel失败", e); + } + + + } + + private void setResponseHeader(HttpServletResponse response, String fileName) { + try { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + response.setCharacterEncoding("utf-8"); + + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName); + } catch (UnsupportedEncodingException e) { + log.error("设置响应头失败", e); + } + } + + + +} diff --git a/backend/src/main/java/com/imurs/excelderive/ExcelDerive.java b/backend/src/main/java/com/imurs/excelderive/ExcelDerive.java new file mode 100644 index 0000000..54ed303 --- /dev/null +++ b/backend/src/main/java/com/imurs/excelderive/ExcelDerive.java @@ -0,0 +1,1534 @@ +package com.imurs.excelderive; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.entity.*; +import com.imurs.service.*; +//import com.sun.xml.internal.xsom.impl.scd.Iterators; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRichTextString; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; + + +@RestController +@RequestMapping(value = "/exce") +public class ExcelDerive { + + @Autowired + ApplyCaseService applyCaseService; + + @Autowired + DoctorArrangeService doctorArrangeService; + + @Autowired + UserService userService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + private ApplyBModeService applyBModeService; + + @Autowired + private ApplyBModeSpecialistService applyBModeSpecialistService; + + + + /** + * 管理医院B超列表 + */ + @RequestMapping("Excel") + public Map selectBmodePage(HttpServletRequest request, HttpServletResponse response,String callback,@RequestParam Map params)throws IOException{ + Map map=new HashMap(); + //新增Excel + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院远程超声列表"); + List> listMap = new ArrayList>(); + Map map1 = null; + String state = ""; + try { + String fileName = System.currentTimeMillis() + ".xls"; + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + String[] headers = { "序号", "申请日期", "申请医院", "申请医生", "患者姓名", "会诊时间", "会诊医院", "会诊医生", "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院远程超声列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,4560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,3560); + sheet.setColumnWidth(5,4560); + sheet.setColumnWidth(6,7560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,3560); + //sheet.setColumnWidth(9,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + //在表中存放查询到的数据放入对应的列 + List applyBModeList = applyBModeService.selectBmodePage(params); + + int xulie = 1; + for (ApplyBMode applyBMode:applyBModeList) { + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(1).setCellValue(sdf.format(applyBMode.getApplyDate())); + row1.createCell(2).setCellValue(applyBMode.getCategoryHospital()); + row1.createCell(3).setCellValue(applyBMode.getDoctorName()); + row1.createCell(4).setCellValue(applyBMode.getPatientName()); + SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm"); + row1.createCell(5).setCellValue(format.format(applyBMode.getGroupDate())); + row1.createCell(6).setCellValue(applyBMode.getGroupHospital()); + //查询医生分配 + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("b_id", applyBMode.getId()).ne("state","80"); + List applyBModeSpecialists = applyBModeSpecialistService.selectList(wrapper); + if(!applyBModeSpecialists.isEmpty()){ + for (int i=0;i export(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map map = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("基层医院转出列表"); + try { + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊科室", "转诊人", "转诊时间", "接诊单位", "是否享受双向转诊优惠政策", "初步诊断", + "状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("基层医院转出列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,2560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + int xulie = 1; + /* + if(params){ + + }*/ + List applyCaseList = applyCaseService.export(params); + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getChamber()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + //row1.createCell(6).setCellValue(applyCase.getPlanTime()); + row1.createCell(7).setCellValue(applyCase.getHospitalName()); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + + + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + + /** + * 基层转入转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "getExport") + public Map getExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map map = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("基层医院转入列表"); + try { + + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊单位", "转诊科室","转诊人", "转诊时间", "是否享受双向转诊优惠政策", "第一诊断", + "状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("基层医院转入列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,7560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.getExport(params); + //Pagetion list=applyCaseService.selectCasePage(params, 0, 0); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getHospitalName()); + row1.createCell(5).setCellValue(applyCase.getChamber()); + row1.createCell(6).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(7).setCellValue(sdf.format(applyCase.getPlanTime())); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getOneInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + + /** + * 管理医院转出转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "arrangeOutExport") + public Map arrangeOutExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map jsonMap = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院转出列表"); + + List> listMap = new ArrayList>(); + Map map = null; + + try{ + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊科室", "转诊医生", "转出时间", "接诊医院", "是否享受双向转诊优惠政策", "第一诊断", + "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院转出列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,2560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.arrangeOutExport(params); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getChamber()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + row1.createCell(7).setCellValue(applyCase.getPlanHospitalName()); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getOneInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + /** + * 管理医院转入转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "arrangeGetExport") + public Map arrangeGetExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map jsonMap = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院转入列表"); + List> listMap = new ArrayList>(); + Map map = null; + + try { + + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "住院号", "病人姓名","身份证号码","转诊单位","转诊人", "入院时间", "接诊科室", "联系人", "是否享受双向转诊优惠政策", "初步诊断", + "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,11)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院转入列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,7560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,3560); + sheet.setColumnWidth(9,2560); + sheet.setColumnWidth(10,6560); + sheet.setColumnWidth(11,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.arrangeGetExport(params); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getInpatient()); + row1.createCell(2).setCellValue(applyCase.getPtName()); + row1.createCell(3).setCellValue(applyCase.getPtCard()); + row1.createCell(4).setCellValue(applyCase.getHospitalName()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + row1.createCell(7).setCellValue(applyCase.getPlanChamber()); + if(!StringUtils.isEmpty(applyCase.getOperator())){ + User user = userService.selectById(applyCase.getOperator()); + if(user!=null){ + row1.createCell(8).setCellValue(user.getUserName()); + }else{ + ApplyInformation applyInformation = applyInformationService.selectById(applyCase.getOperator()); + row1.createCell(8).setCellValue(applyInformation.getHospitalName()); + } + }else{ + row1.createCell(8).setCellValue(applyCase.getOperator()); + } + + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(9).setCellValue("是"); + }else{ + row1.createCell(9).setCellValue("否"); + } + row1.createCell(10).setCellValue(applyCase.getInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + + } + + /** + * 管理医院帮扶专家导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "assistOutExport") + public Map assistOutExport(HttpServletRequest request, HttpServletResponse response, + String callback, @RequestParam Map params) throws IOException { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("长沙市第一医院下乡帮扶专家绩效考核汇总表"); + Map map = new HashMap<>(); + try { + String fileName = System.currentTimeMillis() + ".xls"; + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "专家姓名", "职称","科室","受援单位","帮扶日期", "帮扶类别", "帮扶天数", "每天补助", "交通补助", "考核得分", + "帮扶绩效" ,"合计 (元)"}; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + //设置背景 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(IndexedColors.AQUA.index); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font = workbook.createFont(); + font.setFontName("微软雅黑"); + //font.setBold(true);//粗体显示 + font.setFontHeightInPoints((short) 14); + //font.setColor(IndexedColors.RED.index);//设置字体颜色 + style.setFont(font); + + HSSFCellStyle style1 = workbook.createCellStyle(); + //设置背景色 + style1.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style1.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + style1.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style1.setVerticalAlignment(VerticalAlignment.CENTER); + style1.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font1 = workbook.createFont(); + font1.setFontName("微软雅黑"); + font1.setBold(true);//粗体显示 + font1.setFontHeightInPoints((short) 10.5); + style1.setFont(font1); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + //HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,12)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeightInPoints(65); + cell1= row0.createCell(0); + cell1.setCellValue("长沙市第一医院下乡帮扶专家绩效考核汇总表"); + cell1.setCellStyle(style); + + + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,5560); + sheet.setColumnWidth(4,10060); + sheet.setColumnWidth(5,8060); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,3560); + sheet.setColumnWidth(9,2560); + sheet.setColumnWidth(10,2560); + sheet.setColumnWidth(11,2560); + sheet.setColumnWidth(12,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + row.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style1); + } + + HSSFCellStyle style2 = workbook.createCellStyle(); + style2.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style2.setVerticalAlignment(VerticalAlignment.CENTER); + //设置背景色 + //style2.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //style2.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + //style2.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font2 = workbook.createFont(); + font2.setFontName("微软雅黑"); + //font2.setBold(true);//粗体显示 + font2.setFontHeightInPoints((short) 11); + style2.setFont(font2); + // 在表中存放查询到的数据放入对应的列 + int xulie = 1; + EntityWrapper wrapper=new EntityWrapper(); + if(!StringUtils.isEmpty(params.get("receiveHospitalId"))){ + wrapper.eq("receive_hospital_id", params.get("receiveHospitalId")); + } + if(!StringUtils.isEmpty(params.get("status"))){ + wrapper.eq("status", params.get("status")); + } + if(!StringUtils.isEmpty(params.get("type"))){ + wrapper.eq("type", params.get("type")); + } + + if(!StringUtils.isEmpty(params.get("startTime"))){ + wrapper.ge("start_time", params.get("startTime")); + } + if(!StringUtils.isEmpty(params.get("endTime"))){ + DateFormat df = new SimpleDateFormat("yyyy-MM-dd");/*** 加一天*/ + try { + Date dd = df.parse(params.get("endTime")); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(dd); + calendar.add(Calendar.DAY_OF_MONTH, 1);//加一天 + wrapper.lt("start_time", df.format(calendar.getTime())); + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + } + List doctorArrangeList = doctorArrangeService.selectList(wrapper); + for(DoctorArrange doctorArrange :doctorArrangeList){ + //HSSFCell cell; + HSSFRow row1 = sheet.createRow(rowNum); + //row1.setRowStyle(style2); + + row1.setHeightInPoints(25); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(doctorArrange.getDoctorName()); + row1.createCell(2).setCellValue(doctorArrange.getJob()); + row1.createCell(3).setCellValue(doctorArrange.getChamber()); + ApplyInformation applyInformation= applyInformationService.selectById(doctorArrange.getReceiveHospitalId());//查出医院名称 + row1.createCell(4).setCellValue(applyInformation.getHospitalName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(5).setCellValue(sdf.format(doctorArrange.getStartTime())+"——"+sdf.format(doctorArrange.getEndTime())); + /*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(sdf.parse(rs.getString("a.planTime"))));*/ + if(doctorArrange.getType().equals("3")){ + row1.createCell(6).setCellValue("医联体"); + }else if(doctorArrange.getType().equals("8")){ + row1.createCell(6).setCellValue("名医工作室"); + }else if(doctorArrange.getType().equals("4")){ + row1.createCell(6).setCellValue("对口支援"); + }else if(doctorArrange.getType().equals("5")){ + row1.createCell(6).setCellValue("远程协助"); + } + row1.createCell(7).setCellValue(doctorArrange.getDay()); + row1.createCell(8).setCellValue(doctorArrange.getDayMoney()); + if(doctorArrange.getTrafficMoney().equals("0")){ + row1.createCell(9).setCellValue("/"); + }else{ + row1.createCell(9).setCellValue(doctorArrange.getTrafficMoney()); + } + row1.createCell(10).setCellValue(doctorArrange.getTotalGrade()); + row1.createCell(11).setCellValue(doctorArrange.getPerforMance()+"%"); + row1.createCell(12).setCellValue(doctorArrange.getTotalMoney()); + row1.getCell(0).setCellStyle(style2); + row1.getCell(1).setCellStyle(style2); + row1.getCell(2).setCellStyle(style2); + row1.getCell(3).setCellStyle(style2); + row1.getCell(4).setCellStyle(style2); + row1.getCell(5).setCellStyle(style2); + row1.getCell(6).setCellStyle(style2); + row1.getCell(7).setCellStyle(style2); + row1.getCell(8).setCellStyle(style2); + row1.getCell(9).setCellStyle(style2); + row1.getCell(10).setCellStyle(style2); + row1.getCell(11).setCellStyle(style2); + row1.getCell(12).setCellStyle(style2); + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + /** + * 基层医院的超声统计导出excel表 + * @param response + * @param id 医院id + * @param startTime + * @param endTime + * @return + */ + @RequestMapping("getExcelForBmodelold") + public Map getExcelForCategoryHospital(HttpServletResponse response, + String id, String startTime, String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.创建一个工作表 + HSSFSheet sheet = workbook.createSheet("远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,6560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //3.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //4.创建表头 + String[] headers = {"序号","医院医生","离线会诊","实时会诊"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //5.填入表格的全部内容数据 + try { + // 在表中存放查询到的数据放入对应的列 + Map bModeMap = applyBModeService.categoryHospitalStatistics(id,startTime,endTime); + //定义序号 + int serialNumber = 1; + //定义表格内容的初始行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + List> docList = (List>) bModeMap.get("doctorCount"); + for (Map docMap : docList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) docMap.get("name")); + row.createCell(2).setCellValue((Long)docMap.get("lxCount")); + row.createCell(3).setCellValue((Long)docMap.get("spCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)bModeMap.get("totalLxCount")); + lastRow.createCell(3).setCellValue((Long)bModeMap.get("totalSpCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + String fileName = System.currentTimeMillis() + ".xls"; + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + /** + * 基层医院的超声统计导出excel表有部位的 + * @param response + * @param id 医院id + * @param startTime + * @param endTime + * @return + */ + @RequestMapping("getExcelForBmodel") + public Map getNExcelForCategoryHospital(HttpServletResponse response, + String id, String startTime, String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.创建一个工作表 + HSSFSheet sheet = workbook.createSheet("远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,6560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //3.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //4.创建表头 + String[] headers = {"序号","医院医生","超声会诊病例数","超声会诊部位数"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //5.填入表格的全部内容数据 + try { + // 在表中存放查询到的数据放入对应的列 + Map bModeMap = applyBModeService.categoryHospitalStatistics(id,startTime,endTime); + //定义序号 + int serialNumber = 1; + //定义表格内容的初始行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + List> docList = (List>) bModeMap.get("doctorCount"); + for (Map docMap : docList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) docMap.get("name")); + row.createCell(2).setCellValue((Long)docMap.get("lxCount")); + row.createCell(3).setCellValue((Long)docMap.get("partCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)bModeMap.get("totalLxCount")); + lastRow.createCell(3).setCellValue((Long)bModeMap.get("totalPartCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + String pdate=""; + if((startTime!=null&&!startTime.isEmpty())&&(endTime!=null&&!endTime.isEmpty())){ + //System.out.println("开始时间"+startTime+"..."+endTime); + + pdate = startTime + ":" + endTime; + }else { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + pdate = sdf.format(new Date()); + } + String fileName = pdate + ".xls"; + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + + + /** + * 管理医院超声统计表导出 + * @param response + * @return + */ + @RequestMapping("getBmodeManageHospitalsold") + public Map getBmodeManageHospitals(HttpServletResponse response, + String startTime,String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.1创建第一个工作表 + HSSFSheet sheet = workbook.createSheet("基层医院远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,7560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //2.2.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("基层医院远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //2.3.创建表头 + String[] headers = {"序号","基层医院","离线会诊","实时会诊"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //3.1创建第二个工作表 + HSSFSheet sheet2 = workbook.createSheet("管理医院远程超声统计表"); + //设置表的列宽 + sheet2.setColumnWidth(0,4560); + sheet2.setColumnWidth(1,6560); + sheet2.setColumnWidth(2,4560); + sheet2.setColumnWidth(3,4560); + + //3.2.创建标题的名字并设置样式 + sheet2.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow hosRow0 = sheet2.createRow(0); + hosRow0.setHeight((short) 1204); + HSSFCell hosCell00 = hosRow0.createCell(0); + hosCell00.setCellValue("管理医院远程超声统计表"); + hosCell00.setCellStyle(titleStyle); + + //3.3.创建表头 + String[] hosHeaders = {"序号","本医院专家","离线会诊","实时会诊"}; + //将表头写入excel表格的第二行 + HSSFRow hosRow1 = sheet2.createRow(1); + for (int i = 0; i < hosHeaders.length; i++) { + HSSFCell cell = hosRow1.createCell(i); + hosRow1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(hosHeaders[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //4.填充数据入表格 + try { + //5.填充基层医院的数据表 + Map dataStatistics = applyBModeService.dataStatisticsForHospital(startTime,endTime); + //获取基层医院的超声统计 + List> infomationList = (List>) dataStatistics.get("infomationList"); + //定义序列号 + int serialNumber = 1; + //定义表格的行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + for (Map hospitalMap : infomationList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) hospitalMap.get("hospitalName")); + row.createCell(2).setCellValue((Long)hospitalMap.get("lxCount")); + row.createCell(3).setCellValue((Long)hospitalMap.get("spCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)dataStatistics.get("lxCategoryCount")); + lastRow.createCell(3).setCellValue((Long)dataStatistics.get("spCategoryCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //6.填充管理医院的数据表 + List> specialists = (List>) dataStatistics.get("specialists"); + List> countLists = (List>) dataStatistics.get("countList"); + //定义序列号 + int serialNumber2 = 1; + //定义表格的行数 + int rowNum2 = 2; + for (Map specialist : specialists) { + HSSFRow row = sheet2.createRow(rowNum2); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber2); + row.createCell(1).setCellValue((String)specialist.get("userName")); + row.createCell(2).setCellValue((Long)specialist.get("lxCount")); + row.createCell(3).setCellValue((Long)specialist.get("spCount")); + + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber2++; + rowNum2++; + } + Map countMap = countLists.get(0); + //设置最后一行的总计 + HSSFRow lastRow2 = sheet2.createRow(rowNum2); + lastRow2.createCell(0).setCellValue("合计"); + lastRow2.createCell(1).setCellValue("-"); + lastRow2.createCell(2).setCellValue((Long)countMap.get("totalLxCount")); + lastRow2.createCell(3).setCellValue((Long)countMap.get("totalSpCount")); + + //设置每个单元格的样式 + lastRow2.getCell(0).setCellStyle(textStyle); + lastRow2.getCell(1).setCellStyle(textStyle); + lastRow2.getCell(2).setCellStyle(textStyle); + lastRow2.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + String fileName = new String(new String("管理医院超声统计表" + sdf.format(new Date()) + ".xls").getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + map.put("msg",1); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + /** + * 管理医院超声统计表按部位导出 没有离线实时区分 + * @param response + * @return + */ + @RequestMapping("getBmodeManageHospitals") + public void getBmodeManageHospitalsBypart(HttpServletResponse response, + String startTime,String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.1创建第一个工作表 + HSSFSheet sheet = workbook.createSheet("基层医院远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,7560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //2.2.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("基层医院远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //2.3.创建表头 + String[] headers = {"序号","基层医院","超声会诊病例数","超声会诊部位数"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //3.1创建第二个工作表 + HSSFSheet sheet2 = workbook.createSheet("管理医院远程超声统计表"); + //设置表的列宽 + sheet2.setColumnWidth(0,4560); + sheet2.setColumnWidth(1,6560); + sheet2.setColumnWidth(2,4560); + sheet2.setColumnWidth(3,4560); + + //3.2.创建标题的名字并设置样式 + sheet2.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow hosRow0 = sheet2.createRow(0); + hosRow0.setHeight((short) 1204); + HSSFCell hosCell00 = hosRow0.createCell(0); + hosCell00.setCellValue("管理医院远程超声统计表"); + hosCell00.setCellStyle(titleStyle); + + //3.3.创建表头"序号","本医院专家","离线会诊","实时会诊" + String[] hosHeaders = {"序号","本医院专家","超声会诊病例数","超声会诊部位数"}; + //将表头写入excel表格的第二行 + HSSFRow hosRow1 = sheet2.createRow(1); + for (int i = 0; i < hosHeaders.length; i++) { + HSSFCell cell = hosRow1.createCell(i); + hosRow1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(hosHeaders[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //4.填充数据入表格 + try { + //5.填充基层医院的数据表 + Map dataStatistics = applyBModeService.dataStatisticsForHospital(startTime,endTime); + //获取基层医院的超声统计 + List> infomationList = (List>) dataStatistics.get("infomationList"); + //定义序列号 + int serialNumber = 1; + //定义表格的行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + for (Map hospitalMap : infomationList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) hospitalMap.get("hospitalName")); + row.createCell(2).setCellValue((Long)hospitalMap.get("lxCount"));//病例数 + row.createCell(3).setCellValue((Long)hospitalMap.get("partCount"));//部位数 + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)dataStatistics.get("lxCategoryCount")); + lastRow.createCell(3).setCellValue((Long)dataStatistics.get("partCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //6.填充管理医院的数据表 + List> specialists = (List>) dataStatistics.get("specialists"); + List> countLists = (List>) dataStatistics.get("countList"); + //定义序列号 + int serialNumber2 = 1; + //定义表格的行数 + int rowNum2 = 2; + for (Map specialist : specialists) { + HSSFRow row = sheet2.createRow(rowNum2); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber2); + row.createCell(1).setCellValue((String)specialist.get("userName")); + row.createCell(2).setCellValue((Long)specialist.get("lxCount")); + row.createCell(3).setCellValue((Long)specialist.get("partCount")); + + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber2++; + rowNum2++; + } + Map countMap = countLists.get(0); + //设置最后一行的总计 + HSSFRow lastRow2 = sheet2.createRow(rowNum2); + lastRow2.createCell(0).setCellValue("合计"); + lastRow2.createCell(1).setCellValue("-"); + lastRow2.createCell(2).setCellValue((Long)countMap.get("totalLxCount")); + lastRow2.createCell(3).setCellValue((Long)countMap.get("totalpartCount")); + + //设置每个单元格的样式 + lastRow2.getCell(0).setCellStyle(textStyle); + lastRow2.getCell(1).setCellStyle(textStyle); + lastRow2.getCell(2).setCellStyle(textStyle); + lastRow2.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + + //startTime,String endTime + String pdate=""; + if((startTime!=null&&!startTime.isEmpty())&&(endTime!=null&&!endTime.isEmpty())){ + //System.out.println("开始时间"+startTime+"..."+endTime); + + pdate = startTime + ":" + endTime; + }else { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + pdate = sdf.format(new Date()); + } + String fileName = new String(new String("管理医院超声统计表" + pdate + ".xls").getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + //map.put("msg",1); + } catch (Exception e) { + e.printStackTrace(); + //map.put("msg",4); + } + //return map; + } + /** + * 设置表格表头的样式 + * @param workbook + * @return + */ + private HSSFCellStyle getHeadStyle(HSSFWorkbook workbook) { + //设置表头的格式样式 + HSSFCellStyle headStyle = workbook.createCellStyle(); + //设置背景色 + headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + // 创建一个居中格式 + headStyle.setAlignment(HorizontalAlignment.CENTER); + headStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //自动换行 + headStyle.setWrapText(true); + HSSFFont font1 = workbook.createFont(); + font1.setFontName("微软雅黑"); + //粗体显示 + font1.setBold(true); + //设置字体大小 + font1.setFontHeightInPoints((short) 10.5); + headStyle.setFont(font1); + return headStyle; + } + + /** + * 设置表格标题的样式 + * @param workbook + * @return + */ + private HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) { + HSSFCellStyle titleStyle = workbook.createCellStyle(); + // 创建一个居中格式 + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //自动换行 + titleStyle.setWrapText(true); + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + titleStyle.setFont(font); + return titleStyle; + } + + /** + * 设置表格内容的格式 + * @param workbook + * @return + */ + private HSSFCellStyle getTextStyle(HSSFWorkbook workbook) { + HSSFCellStyle style = workbook.createCellStyle(); + // 创建一个居中格式 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + //设置背景色 + HSSFFont font = workbook.createFont(); + font.setFontName("微软雅黑"); + font.setFontHeightInPoints((short) 11); + style.setFont(font); + return style; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/excelderive/ExcelDown2.java b/backend/src/main/java/com/imurs/excelderive/ExcelDown2.java new file mode 100644 index 0000000..8947ecd --- /dev/null +++ b/backend/src/main/java/com/imurs/excelderive/ExcelDown2.java @@ -0,0 +1,453 @@ +package com.imurs.excelderive; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; + +public class ExcelDown2 { + + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + public static HSSFWorkbook getHSSFWorkbook1(String sheetName,String [][]values, HSSFWorkbook wb,int k,String hospitalname,String oiddate,String newdate){ + + // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 + if(wb == null){ + wb = new HSSFWorkbook(); + } + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + HSSFSheet sheet = wb.createSheet(sheetName); + HSSFRow row = sheet.createRow(0); + HSSFRow row1 = sheet.createRow(1); + HSSFRow row2 = sheet.createRow(2); + HSSFCell cell = null; + // 第四步,创建单元格,并设置值表头 设置表头居中 + HSSFCellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //字体黑色 + HSSFFont font = wb.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + // font.setColor(IndexedColors.RED.index);//设置字体颜色 + //设置背景 + // style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // style.setFillForegroundColor(IndexedColors.YELLOW.index); + /// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(true);//粗体显示 + style.setFont(font); + //上面为样式 + // 合并单元格 + /* sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("市直医院"); + cell.setCellStyle(style);*/ + //样式 + + sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("医疗机构名称"); + cell.setCellStyle(style); + row.setHeightInPoints(30);//设置行的高度 + sheet.setColumnWidth(0, 30 * 256);//设置列的宽度 + sheet.setColumnWidth(6, 12 * 256);//建立时间列的宽度 + sheet.setColumnWidth(10, 15 * 256);//建立时间列的宽度 + sheet.setColumnWidth(13, 15 * 256);// + sheet.setColumnWidth(14, 15 * 256);// + sheet.setColumnWidth(15, 15 * 256);// + sheet.addMergedRegion(new CellRangeAddress(0,0,1,5)); + cell=row.createCell(1); + cell.setCellValue("建立形式"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,1,2)); + cell= row1.createCell(1); + cell.setCellValue("城市医疗联合体"); + cell.setCellStyle(style); + cell= row2.createCell(1); + cell.setCellValue("相对紧密性"); + cell.setCellStyle(style); + cell= row2.createCell(2); + cell.setCellValue("相对松散性"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,3,3)); + cell= row1.createCell(3); + cell.setCellValue("县域医共体"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,4,4)); + cell= row1.createCell(4); + cell.setCellValue("专科联盟"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,5,5)); + cell= row1.createCell(5); + cell.setCellValue("远程医疗协作"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,6,6)); + cell= row.createCell(6); + cell.setCellValue("建立时间"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,7,7)); + cell= row.createCell(7); + cell.setCellValue("是否签订帮扶协议"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,0,8,15)); + cell= row.createCell(8); + cell.setCellValue("已采取具体帮扶措施"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,8,9)); + cell= row1.createCell(8); + cell.setCellValue("派驻医疗人员"); + cell.setCellStyle(style); + cell= row2.createCell(8); + cell.setCellValue("人数"); + cell.setCellStyle(style); + cell= row2.createCell(9); + cell.setCellValue("服务天数"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,10,10)); + cell= row1.createCell(10); + cell.setCellValue("进修培训安排(人数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,11,12)); + cell= row1.createCell(11); + cell.setCellValue("专题讲座"); + cell.setCellStyle(style); + cell= row2.createCell(11); + cell.setCellValue("课题数"); + cell.setCellStyle(style); + cell= row2.createCell(12); + cell.setCellValue("培训人/次"); + cell.setCellStyle(style); + //下面我 是双向转诊以及远程诊疗人数 + sheet.addMergedRegion(new CellRangeAddress(1,1,13,14)); + cell= row1.createCell(13); + cell.setCellValue("开展双向转诊"); + cell.setCellStyle(style); + cell= row2.createCell(13); + cell.setCellValue("上转人次"); + cell.setCellStyle(style); + cell= row2.createCell(14); + cell.setCellValue("下转人次"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,15,15)); + cell= row1.createCell(15); + cell.setCellValue("开展远程诊疗(人次)"); + cell.setCellStyle(style); + //上面是新加的 + sheet.addMergedRegion(new CellRangeAddress(1,2,16,16)); + cell= row1.createCell(16); + cell.setCellValue("医疗质量控制检查(次数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,17,17)); + cell= row1.createCell(17); + cell.setCellValue("支持专科建设(个数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,18,18)); + cell= row1.createCell(18); + cell.setCellValue("新技术新项目推广应用(项数)"); + cell.setCellStyle(style); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + // HSSFRow row = sheet.createRow(0); + + + //设置第一行样式。 + // row.setRowStyle(style); + // row1.setRowStyle(style); + //row2.setRowStyle(style); + //声明列对象 + // HSSFCell cell = null; + // 设置列宽 + + //创建标题 +// for(int i=0;i1){ + row.createCell(0).setCellValue("合计"); + } + return wb; + } + public static HSSFWorkbook getHSSFWorkbook2(String sheetName,String [][]values, HSSFWorkbook wb,int k,String hospitalname,String oiddate,String newdate){ + + // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 + if(wb == null){ + wb = new HSSFWorkbook(); + } + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + HSSFSheet sheet = wb.createSheet(sheetName); + HSSFRow row = sheet.createRow(0); + HSSFRow row1 = sheet.createRow(1); + HSSFRow row2 = sheet.createRow(2); + HSSFCell cell = null; + // 第四步,创建单元格,并设置值表头 设置表头居中 + HSSFCellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //字体黑色 + HSSFFont font = wb.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + // font.setColor(IndexedColors.RED.index);//设置字体颜色 + //设置背景 + // style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // style.setFillForegroundColor(IndexedColors.YELLOW.index); + /// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(true);//粗体显示 + style.setFont(font); + //上面为样式 + // 合并单元格 + /* sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("市直医院"); + cell.setCellStyle(style);*/ + //样式 + + sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("医疗机构名称"); + cell.setCellStyle(style); + row.setHeightInPoints(30);//设置行的高度 + sheet.setColumnWidth(0, 30 * 256);//设置列的宽度 + sheet.setColumnWidth(6, 12 * 256);//建立时间列的宽度 + sheet.setColumnWidth(10, 15 * 256);//建立时间列的宽度 + sheet.setColumnWidth(13, 15 * 256);// + sheet.setColumnWidth(14, 15 * 256);// + sheet.setColumnWidth(15, 15 * 256);// + sheet.addMergedRegion(new CellRangeAddress(0,0,1,5)); + cell=row.createCell(1); + cell.setCellValue("建立形式"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,1,2)); + cell= row1.createCell(1); + cell.setCellValue("城市医疗联合体"); + cell.setCellStyle(style); + cell= row2.createCell(1); + cell.setCellValue("相对紧密性"); + cell.setCellStyle(style); + cell= row2.createCell(2); + cell.setCellValue("相对松散性"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,3,3)); + cell= row1.createCell(3); + cell.setCellValue("县域医共体"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,4,4)); + cell= row1.createCell(4); + cell.setCellValue("专科联盟"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,5,5)); + cell= row1.createCell(5); + cell.setCellValue("远程医疗协作"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,6,6)); + cell= row.createCell(6); + cell.setCellValue("建立时间"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,7,7)); + cell= row.createCell(7); + cell.setCellValue("是否签订帮扶协议"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,0,8,18)); + cell= row.createCell(8); + cell.setCellValue("已采取具体帮扶措施"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,8,9)); + cell= row1.createCell(8); + cell.setCellValue("派驻医疗人员"); + cell.setCellStyle(style); + cell= row2.createCell(8); + cell.setCellValue("人数"); + cell.setCellStyle(style); + cell= row2.createCell(9); + cell.setCellValue("服务天数"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,10,10)); + cell= row1.createCell(10); + cell.setCellValue("进修培训安排(人数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,11,12)); + cell= row1.createCell(11); + cell.setCellValue("专题讲座"); + cell.setCellStyle(style); + cell= row2.createCell(11); + cell.setCellValue("课题数"); + cell.setCellStyle(style); + cell= row2.createCell(12); + cell.setCellValue("培训人/次"); + cell.setCellStyle(style); + //开展双向转诊 + sheet.addMergedRegion(new CellRangeAddress(1,1,13,14)); + cell= row1.createCell(13); + cell.setCellValue("开展双向转诊"); + cell.setCellStyle(style); + cell= row2.createCell(13); + cell.setCellValue("上转人次"); + cell.setCellStyle(style); + cell= row2.createCell(14); + cell.setCellValue("下转人次"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,15,15)); + cell= row1.createCell(15); + cell.setCellValue("开展远程诊疗(人次)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,16,16));//修改了样式 + cell= row1.createCell(16); + cell.setCellValue("医疗质量控制检查(次数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,17,17)); + cell= row1.createCell(17); + cell.setCellValue("支持专科建设(个数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,18,18)); + cell= row1.createCell(18); + cell.setCellValue("新技术新项目推广应用(项数)"); + cell.setCellStyle(style); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + // HSSFRow row = sheet.createRow(0); + + + //设置第一行样式。 + // row.setRowStyle(style); + // row1.setRowStyle(style); + //row2.setRowStyle(style); + //声明列对象 + // HSSFCell cell = null; + // 设置列宽 + + //创建标题 +// for(int i=0;i1){ + row.createCell(0).setCellValue("合计"); + } + return wb; + } + +} diff --git a/backend/src/main/java/com/imurs/ocr/AuthService.java b/backend/src/main/java/com/imurs/ocr/AuthService.java new file mode 100644 index 0000000..01ffd16 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/AuthService.java @@ -0,0 +1,100 @@ +package com.imurs.ocr; + + + + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + + +/** + * 获取token类 + */ +public class AuthService { + + /** + * 获取权限token + * @return 返回示例: + * { + * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", + * "expires_in": 2592000 + * } + */ + public static String getAuth(String type) { + // 官网获取的 API Key 更新为你注册的 + String ocrclientId = "h7yikrDhd3zmEBIpUp11N7e8";//ocr 的密钥 + // 官网获取的 Secret Key 更新为你注册的 + String ocrclientSecret = "h7yikrDhd3zmEBIpUp11N7e8";//ocr 的密钥 + + + // 官网获取的 Secret Key 更新为你注册的 图像的已经没有使用了 + String imgproclientId="h7yikrDhd3zmEBIpUp11N7e8"; + String imgclientSecret = "h7yikrDhd3zmEBIpUp11N7e8"; + String clientId = null; + String clientSecret =null; + if(type.equals("2")){ + clientId=imgproclientId; + clientSecret=imgclientSecret; + }else if(type.equals("1")){ + clientId=ocrclientId; + clientSecret=ocrclientSecret; + } + return getAuth(clientId, clientSecret); + } + + /** + * 获取API访问token + * 该token有一定的有效期,需要自行管理,当失效时需重新获取. + * @param ak - 百度云官网获取的 API Key + * @param sk - 百度云官网获取的 Securet Key + * @return assess_token 示例: + * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" + */ + public static String getAuth(String ak, String sk) { + // 获取token地址 + String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; + String getAccessTokenUrl = authHost + // 1. grant_type为固定参数 + + "grant_type=client_credentials" + // 2. 官网获取的 API Key + + "&client_id=" + ak + // 3. 官网获取的 Secret Key + + "&client_secret=" + sk; + try { + URL realUrl = new URL(getAccessTokenUrl); + // 打开和URL之间的连接 + HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + // 获取所有响应头字段 + /* Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : map.keySet()) { + System.err.println(key + "--->" + map.get(key)); + }*/ + // 定义 BufferedReader输入流来读取URL的响应 + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String result = ""; + String line; + while ((line = in.readLine()) != null) { + result += line; + } + /** + * 返回结果示例 + */ + // System.err.println("result:" + result); + JSONObject jsonObject = new JSONObject(result); + String access_token = jsonObject.getString("access_token"); + return access_token; + } catch (Exception e) { + // System.err.printf("获取token失败!"); + e.printStackTrace(System.err); + } + return null; + } + +} diff --git a/backend/src/main/java/com/imurs/ocr/Baiduoauth2.java b/backend/src/main/java/com/imurs/ocr/Baiduoauth2.java new file mode 100644 index 0000000..34f694e --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/Baiduoauth2.java @@ -0,0 +1,59 @@ +package com.imurs.ocr; + +import okhttp3.*; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.*; + + +/** + * 需要添加依赖 + * + * + * com.squareup.okhttp3 + * okhttp + * 4.12.0 + * + */ + +class Baiduoauth2 { + + static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); + + public static void main(String []args) throws IOException, JSONException{ + /* + * MediaType mediaType = MediaType.parse("application/json"); RequestBody body = + * RequestBody.create(mediaType, ""); Request request = new Request.Builder() + * .url( + * "https://aip.baidubce.com/oauth/2.0/token?client_id=h7yikrDhd3zmEBIpUp11N7e8&client_secret=DfJYn2AANSEURPvmk4j12lpfmBi9QCcT&grant_type=client_credentials") + * .method("POST", body) .addHeader("Content-Type", "application/json") + * .addHeader("Accept", "application/json") .build(); Response response = + * HTTP_CLIENT.newCall(request).execute(); + * + * JSONObject jsonObject = new JSONObject(response.body().string()); String + * access_token = jsonObject.getString("access_token"); + * System.out.println(access_token); + */ + + } + public static String getAuth() throws IOException, JSONException { + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, ""); + Request request = new Request.Builder() + .url("https://aip.baidubce.com/oauth/2.0/token?client_id=h7yikrDhd3zmEBIpUp11N7e8&client_secret=DfJYn2AANSEURPvmk4j12lpfmBi9QCcT&grant_type=client_credentials") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + Response response = HTTP_CLIENT.newCall(request).execute(); + + JSONObject jsonObject = new JSONObject(response.body().string()); + String access_token = jsonObject.getString("access_token"); + return access_token; + + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/ocr/Base64Util.java b/backend/src/main/java/com/imurs/ocr/Base64Util.java new file mode 100644 index 0000000..44bc9ff --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/Base64Util.java @@ -0,0 +1,92 @@ +package com.imurs.ocr; + + +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ public class Base64Util +/* */ { +/* 16 */ private static final char last2byte = (char)Integer.parseInt("00000011", 2); +/* */ +/* 18 */ private static final char last4byte = (char)Integer.parseInt("00001111", 2); +/* */ +/* 20 */ private static final char last6byte = (char)Integer.parseInt("00111111", 2); +/* */ +/* 22 */ private static final char lead6byte = (char)Integer.parseInt("11111100", 2); +/* */ +/* 24 */ private static final char lead4byte = (char)Integer.parseInt("11110000", 2); +/* */ +/* 26 */ private static final char lead2byte = (char)Integer.parseInt("11000000", 2); +/* */ +/* 28 */ private static final char[] encodeTable = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ public static String encode(byte[] from) +/* */ { +/* 43 */ StringBuilder to = new StringBuilder((int)(from.length * 1.34D) + 3); +/* 44 */ int num = 0; +/* 45 */ char currentByte = '\000'; +/* 46 */ for (int i = 0; i < from.length; i++) { +/* 47 */ num %= 8; +/* 48 */ while (num < 8) { +/* 49 */ switch (num) { +/* */ case 0: +/* 51 */ currentByte = (char)(from[i] & lead6byte); +/* 52 */ currentByte = (char)(currentByte >>> '\002'); +/* 53 */ break; +/* */ case 2: +/* 55 */ currentByte = (char)(from[i] & last6byte); +/* 56 */ break; +/* */ case 4: +/* 58 */ currentByte = (char)(from[i] & last4byte); +/* 59 */ currentByte = (char)(currentByte << '\002'); +/* 60 */ if (i + 1 < from.length) { +/* 61 */ currentByte = (char)(currentByte | (from[(i + 1)] & lead2byte) >>> 6); +/* */ } +/* */ break; +/* */ case 6: +/* 65 */ currentByte = (char)(from[i] & last2byte); +/* 66 */ currentByte = (char)(currentByte << '\004'); +/* 67 */ if (i + 1 < from.length) { +/* 68 */ currentByte = (char)(currentByte | (from[(i + 1)] & lead4byte) >>> 4); +/* */ } +/* */ +/* */ break; +/* */ } +/* */ +/* 74 */ to.append(encodeTable[currentByte]); +/* 75 */ num += 6; +/* */ } +/* */ } +/* 78 */ if (to.length() % 4 != 0) { +/* 79 */ for (int i = 4 - to.length() % 4; i > 0; i--) { +/* 80 */ to.append("="); +/* */ } +/* */ } +/* 83 */ return to.toString(); +/* */ } +/* */ } + +/* Location: D:\workspace\imurs_java\WebContent\WEB-INF\lib\aip-java-sdk-4.1.1.jar + * Qualified Name: com.baidu.aip.util.Base64Util + * Java Class Version: 5 (49.0) + * JD-Core Version: 0.7.1 + */ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/ocr/CustomNumberComparator.java b/backend/src/main/java/com/imurs/ocr/CustomNumberComparator.java new file mode 100644 index 0000000..4d407e4 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/CustomNumberComparator.java @@ -0,0 +1,23 @@ +package com.imurs.ocr; +import java.util.Comparator; +public class CustomNumberComparator implements Comparator { + @Override + public int compare(String a1, String b1) { + int firstDigitA=Integer.valueOf(a1.charAt(0)); + int firstDigitB =Integer.valueOf(b1.charAt(0)); + + // 首先比较两个数字的第一位(十位数) + + int comparison = Integer.compare(firstDigitA, firstDigitB); + if (comparison != 0) { + return comparison; // 如果第一位不同,返回比较结果 + } + + // 如果第一位相同,则比较除第一位之外的其他数字 + // 不要第一位直接比大小就可以,百度的icor 中表格按键值不会为空,所以可以这样。 + + int remainingDigitsA = Integer.valueOf(a1.substring(1)); + int remainingDigitsB = Integer.valueOf(b1.substring(1)); + return Integer.compare(remainingDigitsA, remainingDigitsB); + } +} diff --git a/backend/src/main/java/com/imurs/ocr/FileUtil.java b/backend/src/main/java/com/imurs/ocr/FileUtil.java new file mode 100644 index 0000000..e7bb482 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/FileUtil.java @@ -0,0 +1,108 @@ +package com.imurs.ocr; + +import java.io.*; + +/** + * 文件读取工具类 + */ +public class FileUtil { + + /** + * 读取文件内容,作为字符串返回 + */ + public static String readFileAsString(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } + + if (file.length() > 1024 * 1024 * 1024) { + throw new IOException("File is too large"); + } + + StringBuilder sb = new StringBuilder((int) (file.length())); + // 创建字节输入流 + FileInputStream fis = new FileInputStream(filePath); + // 创建一个长度为10240的Buffer + byte[] bbuf = new byte[10240]; + // 用于保存实际读取的字节数 + int hasRead = 0; + while ( (hasRead = fis.read(bbuf)) > 0 ) { + sb.append(new String(bbuf, 0, hasRead)); + } + fis.close(); + return sb.toString(); + } + + /** + * 根据文件路径读取byte[] 数组 + */ + public static byte[] readFileByBytes(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } else { + ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); + BufferedInputStream in = null; + + try { + in = new BufferedInputStream(new FileInputStream(file)); + short bufSize = 1024; + byte[] buffer = new byte[bufSize]; + int len1; + while (-1 != (len1 = in.read(buffer, 0, bufSize))) { + bos.write(buffer, 0, len1); + } + + byte[] var7 = bos.toByteArray(); + return var7; + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + bos.close(); + } + } + } + /** + * 根据输入流读取byte[] 数组 + * @throws Exception + */ + public static byte[] readInputStreamByBytes(InputStream ins) throws Exception { + //File file = new File(filePath); + if (ins.available()<0) { + throw new Exception("流不存在"); + } else { + ByteArrayOutputStream bos = new ByteArrayOutputStream(ins.available()); + BufferedInputStream in = null; + + try { + in = new BufferedInputStream(ins); + short bufSize = 1024; + byte[] buffer = new byte[bufSize]; + int len1; + while (-1 != (len1 = in.read(buffer, 0, bufSize))) { + bos.write(buffer, 0, len1); + } + + byte[] var7 = bos.toByteArray(); + return var7; + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + bos.close(); + } + } + } +} diff --git a/backend/src/main/java/com/imurs/ocr/HttpUtil.java b/backend/src/main/java/com/imurs/ocr/HttpUtil.java new file mode 100644 index 0000000..e2f39af --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/HttpUtil.java @@ -0,0 +1,76 @@ +package com.imurs.ocr; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + + +/** + * http 工具类 + */ +public class HttpUtil { + + public static String post(String requestUrl, String accessToken, String params) + throws Exception { + String contentType = "application/x-www-form-urlencoded"; + return HttpUtil.post(requestUrl, accessToken, contentType, params); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params) + throws Exception { + String encoding = "UTF-8"; + if (requestUrl.contains("nlp")) { + encoding = "GBK"; + } + return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) + throws Exception { + String url = requestUrl + "?access_token=" + accessToken; + return HttpUtil.postGeneralUrl(url, contentType, params, encoding); + } + + public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) + throws Exception { + URL url = new URL(generalUrl); + // 打开和URL之间的连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + // 设置通用的请求属性 + connection.setRequestProperty("Content-Type", contentType); + connection.setRequestProperty("Connection", "Keep-Alive"); + connection.setUseCaches(false); + connection.setDoOutput(true); + connection.setDoInput(true); + + // 得到请求的输出流对象 + DataOutputStream out = new DataOutputStream(connection.getOutputStream()); + out.write(params.getBytes(encoding)); + out.flush(); + out.close(); + + // 建立实际的连接 + connection.connect(); + // 获取所有响应头字段 + /* Map> headers = connection.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : headers.keySet()) { + System.err.println(key + "--->" + headers.get(key)); + }*/ + // 定义 BufferedReader输入流来读取URL的响应 + BufferedReader in = null; + in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), encoding)); + String result = ""; + String getLine; + while ((getLine = in.readLine()) != null) { + result += getLine; + } + in.close(); + // System.err.println("result:" + result); + return result; + } +} diff --git a/backend/src/main/java/com/imurs/ocr/PicUtils.java b/backend/src/main/java/com/imurs/ocr/PicUtils.java new file mode 100644 index 0000000..1377b41 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/PicUtils.java @@ -0,0 +1,77 @@ +package com.imurs.ocr; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.slf4j.LoggerFactory; + +import net.coobird.thumbnailator.Thumbnails; + +public class PicUtils { + + /*public static void main(String[] args) throws IOException { + // TODO Auto-generated method stub + + byte[] bytes = FileUtils.readFileToByteArray(new File("D:\\zp\\检验单图片数据集\\3.jpg")); + InputStream is = new ByteArrayInputStream(bytes); + String s =getPicType(is); + System.out.println(s+"它的格式是什么啊"); + long l = System.currentTimeMillis(); + byte[] bytes1 = PicUtils.compressPicForScale(bytes, 700, "x");// 图片小于300kb + InputStream is1 = new ByteArrayInputStream(bytes1); + String s1 =getPicType(is1); + System.out.println(s1+"22它的格式是什么啊"); + System.out.println(System.currentTimeMillis() - l); + FileUtils.writeByteArrayToFile(new File("D:\\dd3.jpg"), bytes1); + + }*/ + private static org.slf4j.Logger logger = LoggerFactory.getLogger(PicUtils.class); + + /** + * 根据指定大小压缩图片 + * + * @param imageBytes 源图片字节数组 + * @param desFileSize 指定图片大小,单位kb + * @param imageId 影像编号 + * @return 压缩质量后的图片字节数组 + */ + public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) { + if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) { + return imageBytes; + } + long srcSize = imageBytes.length; + double accuracy = getAccuracy(srcSize / 1024); + try { + while (imageBytes.length > desFileSize * 1024) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); + Thumbnails.of(inputStream).scale(accuracy).outputQuality(accuracy).outputFormat("jpg").toOutputStream(outputStream); + imageBytes = outputStream.toByteArray(); + } + logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", + imageId, srcSize / 1024, imageBytes.length / 1024); + } catch (Exception e) { + logger.error("【图片压缩】msg=图片压缩失败!", e); + } + return imageBytes; + } + /** + * 自动调节精度(经验数值) + * + * @param size 源图片大小 + * @return 图片压缩质量比 + */ + private static double getAccuracy(long size) { + double accuracy; + if (size < 900) { + accuracy = 0.85; + } else if (size < 2047) { + accuracy = 0.6; + } else if (size < 3275) { + accuracy = 0.44; + } else { + accuracy = 0.4; + } + return accuracy; + } +} diff --git a/backend/src/main/java/com/imurs/ocr/RecognizeAllText.java b/backend/src/main/java/com/imurs/ocr/RecognizeAllText.java new file mode 100644 index 0000000..10daf43 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/RecognizeAllText.java @@ -0,0 +1,92 @@ +// This file is auto-generated, don't edit it. Thanks. +package com.imurs.ocr; + +import com.aliyun.auth.credentials.Credential; +import com.aliyun.auth.credentials.provider.StaticCredentialProvider; +import com.aliyun.core.http.HttpClient; +import com.aliyun.core.http.HttpMethod; +import com.aliyun.core.http.ProxyOptions; +import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder; +import com.aliyun.sdk.service.ocr_api20210707.models.*; +import com.aliyun.sdk.service.ocr_api20210707.*; +import com.google.gson.Gson; +import darabonba.core.RequestConfiguration; +import darabonba.core.client.ClientOverrideConfiguration; +import darabonba.core.utils.CommonUtil; +import darabonba.core.TeaPair; + +//import javax.net.ssl.KeyManager; +//import javax.net.ssl.X509TrustManager; +import java.net.InetSocketAddress; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.io.*; + +public class RecognizeAllText { + public static void main(String[] args) throws Exception { + + // HttpClient Configuration + /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder() + .connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds + .responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds + .maxConnections(128) // Set the connection pool size + .maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds + // Configure the proxy + .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("", 9001)) + .setCredentials("", "")) + // If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true)) + .x509TrustManagers(new X509TrustManager[]{}) + .keyManagers(new KeyManager[]{}) + .ignoreSSL(false) + .build();*/ + + // Configure Credentials authentication information, including ak, secret, token + StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() + .accessKeyId("LTAI5tKHbUfLRA3QVMqJo5Ym")// LTAI5tKHbUfLRA3QVMqJo5Ym + .accessKeySecret("qP4jz3flazjp4CGmvjUdDLWpa022uU")//qP4jz3flazjp4CGmvjUdDLWpa022uU + //.securityToken(System.getenv("SECURITY_TOKEN")) // use STS token + .build()); + + // Configure the Client + AsyncClient client = AsyncClient.builder() + .region("cn-hangzhou") // Region ID + //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient) + .credentialsProvider(provider) + //.serviceConfiguration(Configuration.create()) // Service-level configuration + // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc. + .overrideConfiguration( + ClientOverrideConfiguration.create() + // Endpoint 请参考 https://api.aliyun.com/product/ocr-api + .setEndpointOverride("ocr-api.cn-hangzhou.aliyuncs.com") + //.setConnectTimeout(Duration.ofSeconds(30)) + ) + .build(); + + // Parameter settings for API request + InputStream bodyStream = new FileInputStream(new File("K://2.jpg")); + RecognizeAllTextRequest recognizeAllTextRequest = RecognizeAllTextRequest.builder() + .body(bodyStream) + .type("General") + // Request-level configuration rewrite, can set Http request parameters, etc. + // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) + .build(); + + // Asynchronously get the return value of the API request + CompletableFuture response = client.recognizeAllText(recognizeAllTextRequest); + // Synchronously get the return value of the API request + RecognizeAllTextResponse resp = response.get(); + System.out.println(new Gson().toJson(resp)); + // Asynchronous processing of return values + /*response.thenAccept(resp -> { + System.out.println(new Gson().toJson(resp)); + }).exceptionally(throwable -> { // Handling exceptions + System.out.println(throwable.getMessage()); + return null; + });*/ + + // Finally, close the client + client.close(); + } + +} diff --git a/backend/src/main/java/com/imurs/ocr/Sample.java b/backend/src/main/java/com/imurs/ocr/Sample.java new file mode 100644 index 0000000..e0bf2a3 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/Sample.java @@ -0,0 +1,258 @@ +// This file is auto-generated, don't edit it. Thanks. +package com.imurs.ocr; + +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody; +import com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody.RecognizeAllTextResponseBodyData; +import com.aliyun.tea.*; +import com.imurs.parameter.OcrResult; + +public class Sample { + + /** + * 使用AK&SK初始化账号Client + * @param accessKeyId + * @param accessKeySecret + * @return Client + * @throws Exception + */ + // 阿里云OCR统一识别 + public static com.aliyun.ocr_api20210707.Client createClient() throws Exception { + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。 + com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。 + .setAccessKeyId("LTAI5tKHbUfLRA3QVMqJo5Ym") + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + .setAccessKeySecret("qP4jz3flazjp4CGmvjUdDLWpa022uU"); + // Endpoint 请参考 https://api.aliyun.com/product/ocr-api + config.endpoint = "ocr-api.cn-hangzhou.aliyuncs.com"; + return new com.aliyun.ocr_api20210707.Client(config); + } + + public static void main(String[] args_) throws Exception { + + Map m=BaiduOcrRecognition("2"); + + for (Map.Entry entry : m.entrySet()) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + + + } + + } + public static String aliocr(InputStream body) throws Exception { + com.aliyun.ocr_api20210707.Client client = Sample.createClient(); + // 需要安装额外的依赖库,直接点击下载完整工程即可看到所有依赖。 + java.io.InputStream bodyStream = body; + //java.io.InputStream bodyStream = com.aliyun.darabonba.stream.Client.readFromFilePath("K://2.jpg"); + com.aliyun.ocr_api20210707.models.RecognizeAllTextRequest recognizeAllTextRequest = new com.aliyun.ocr_api20210707.models.RecognizeAllTextRequest() + .setType("General") + .setBody(bodyStream); + String con=""; + com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); + try { + com.aliyun.ocr_api20210707.models.RecognizeAllTextResponse resp = client.recognizeAllTextWithOptions(recognizeAllTextRequest, runtime); + //com.aliyun.teautil.Common.toJSONString(resp); + com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody s=resp.getBody(); + RecognizeAllTextResponseBodyData data=s.getData(); + con=data.getContent();//Content识别出图片的文字块汇总 + Integer stauscode=resp.getStatusCode(); + System.out.println(stauscode); + if(stauscode==200) { + //System.out.println(con); + return con; + } + //com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp)); + } catch (TeaException error) { + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + System.out.println(error.getMessage()); + // 诊断地址 + System.out.println(error.getData().get("Recommend")); + + com.aliyun.teautil.Common.assertAsString(error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + System.out.println(error.getMessage()); + // 诊断地址 + System.out.println(error.getData().get("Recommend")); + com.aliyun.teautil.Common.assertAsString(error.message); + } + return con; + + } + public static Map BaiduOcrRecognition(String id) throws Exception{//InputStream is + String otherHost = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"; + //String jsonString = null;//C:\Users\ZP\Desktop\化验单扫描 + + + //上面是自定义按键值排序 + String filePath = "C://Users//ZP//Desktop//OCR//o1.jpg"; + Map umap = new HashMap(); + Map map =new HashMap(); + //只针对表格数据,所以wk开头的才用TreeMap + Map sortmap = new TreeMap(new CustomNumberComparator()); + byte[] imgData = FileUtil.readFileByBytes(filePath);// + //byte[] imgData = FileUtil.readInputStreamByBytes(is); + //byte[] bytes1 = PicUtils.compressPicForScale(imgData, 700, "x");//截图没有4M 不用压缩 + String imgStr = Base64Util.encode(imgData);// + String template=null;// + //8b4101cdc9dfcdd8719b63cfd15311da 鸿吉医院实验 + //万康医院 d7848a0f2cbe04ce5c60f520fff85899 + + switch(id) { + case "1"://鸿吉医院 + System.out.println("1"); + template="8b4101cdc9dfcdd8719b63cfd15311da"; + break; + case "2"://万康医院d7848a0f2cbe04ce5c60f520fff85899 + template="d7848a0f2cbe04ce5c60f520fff85899"; + break; + default: + umap.put("errcode","id未传"); + return umap; + + } + String params = "templateSign="+template+"&image="+URLEncoder.encode(imgStr, "UTF-8"); + // 请求分类器参数未加,多类别可以用 + + String accessToken = Baiduoauth2.getAuth(); + + String result = HttpUtil.post(otherHost, accessToken, params); + + // System.out.println("识别出的结果"+result); + + JSONObject jsonObject = JSON.parseObject(result); + //System.out.println("识别出的结果223"+jsonObject); + Object jsonObject1 =null; + //ArrayList list = new ArrayList<>(); + JSONArray jsonArray = null; + Map rowData = new HashMap(); + if(!jsonObject.get("error_code").equals(0)){ + // System.out.println("识别出的结果"+jsonObject.get("error_msg")); + return (Map) rowData.put("errorMsg", jsonObject.get("error_msg")); + } + + jsonObject1 = jsonObject.get("data"); + + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + + int size =jsonArray.size(); + String key = null; + String value = null; + for(int i=0;i entry : umap.entrySet()) { + // System.out.println(entry.getKey() + " = " + entry.getValue()); + + + // } + //表格处理 如果表格存在数据则进行下面处理这里变成万康医院的处理逻辑。 + /* + * for (Map.Entry entry : sortmap.entrySet()) { + * //System.out.println(entry.getKey() + " = " + entry.getValue()); //存到列表里去得去了 + * 反正key 值没有对应的键值 list.add(entry.getValue()); } //直接把表格排序好的给前端就行 前端怕少字分开三行给 + * //表格有三行,那我三个字段 排序存,每次第一个值为key 后面为数值 int msize= list.size(); String[] strings + * = {"VP", "Vm", "Vd", "PI","SD","RI","容积","深度","功率","频率","方向","心率","增益"}; + * //JSONArray jsonArray1 = new JSONArray(); //JSONArray jsonArray2 = new + * JSONArray(); //JSONArray jsonArray3 = new JSONArray(); Map + * rmap1 = new HashMap(); Map rmap2 = new + * HashMap(); Map rmap3 = new HashMap(); int row =msize/3; for(int i=1;i entry + * : umap.entrySet()) { System.out.println(entry.getKey() + " = " + + * entry.getValue()); + * + * + * } + */ +} + + + public static Map wankang(Map sortmap, Map umap) { + //表格处理 如果表格存在数据则进行下面处理这里变成万康医院的处理逻辑。 + ArrayList list = new ArrayList<>(); + for (Map.Entry entry : sortmap.entrySet()) { + // System.out.println(entry.getKey() + " = " + entry.getValue()); + //存到列表里去得去了 反正key 值没有对应的键值 + list.add(entry.getValue()); + // System.out.println("ssssff"); + } + //直接把表格排序好的给前端就行 前端怕少字分开三行给 + //表格有三行,那我三个字段 排序存,每次第一个值为key 后面为数值 + int msize= list.size(); + String[] strings = {"VP", "Vm", "Vd", "PI","SD","RI","RJ","DP","GL","PL","FX","XL","ZY"};//RJ容积","深度","功率","频率","方向","心率","增益 + + Map rmap1 = new HashMap(); + Map rmap2 = new HashMap(); + Map rmap3 = new HashMap(); + int row =msize/3; + for(int i=1;i map1 = new HashMap(); + Map map2 = new HashMap(); + Map map3 = new HashMap(); + //需要一个Tree map 把1# 2# 每行组合一起 + String s = "wk#2#10"; + String[] strArray = new String[] {"wk#1#1", "wk#1#10", "wk#2#10","wk#2#8","wk#3#8"}; + for (int i = 0; i < strArray.length; i++) { + // + String extractedNumber = extractNumberBetweenHashes(strArray[i]); + String temp= extractedNumber; + //如果相同则把他们放到一个map中 + // if() + System.out.println(extractedNumber); + } + //String s2=s.replaceAll("wk|#", ""); + //System.out.println(s2); + + } + public static String extractNumberBetweenHashes(String input) { + // 正则表达式匹配#开头,然后跟着一个或多个数字,再跟着一个# + Pattern pattern = Pattern.compile("#(\\d+)#"); + Matcher matcher = pattern.matcher(input); + + if (matcher.find()) { + // 如果找到匹配项,返回匹配的内容 + return matcher.group(1); + } else { + // 如果没有找到匹配项,返回null或空字符串 + return null; + // 或者 return ""; + } + } + public static void sort() { + Map map = new HashMap(); + map.put("19","12"); + map.put("28","1"); + map.put("17","13"); + map.put("29","1"); + map.put("210","1"); + map.put("18","1"); + map.put("110","1");//希望的排序是17 18 19 110 + + /* + * Map sortedMap = new TreeMap<>(new Comparator() { + * + * @Override public int compare(String o1, String o2) { return + * Integer.valueOf(o1) - Integer.valueOf(o2); } }); + */ + + Map sortedMap = new TreeMap<>(new CustomNumberComparator()); + sortedMap.putAll(map); + for (Map.Entry entry : sortedMap.entrySet()) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + } + } + + + +} + + diff --git a/backend/src/main/java/com/imurs/ocr/ocrdemo.java b/backend/src/main/java/com/imurs/ocr/ocrdemo.java new file mode 100644 index 0000000..2f4b696 --- /dev/null +++ b/backend/src/main/java/com/imurs/ocr/ocrdemo.java @@ -0,0 +1,218 @@ +package com.imurs.ocr; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.imurs.parameter.OcrResult; + + + +//化验单的识别 + +public class ocrdemo { + + /*public static void main(String[] args) throws Exception { + // TODO Auto-generated method stub + //generalOcrRecognition(); + OcrRecognition(); + }*/ + public static Map OcrRecognition(InputStream is) throws Exception{//InputStream is + String otherHost = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"; + String jsonString = null;//C:\Users\ZP\Desktop\化验单扫描 + // String filePath = "C:\\Users\\ZP\\Desktop\\化验单扫描\\LIS-9.jpg";//D:\\zp\\1\\133.jpg D:\\dd3.jpg \\D:\\zp\\检验单图片数据集\\3.jpg + Map map = new HashMap(); + // byte[] imgData = FileUtil.readFileByBytes(filePath);//化验单238838bd04be88e19529f90ff1044f29 + byte[] imgData = FileUtil.readInputStreamByBytes(is); + byte[] bytes1 = PicUtils.compressPicForScale(imgData, 700, "x"); + String imgStr = Base64Util.encode(bytes1);//乙肝模板36ec1da79ed260ddd86410a269616e91 + String template="28f793e26d5338ff37dc4af04ff62236";// + + String params = "templateSign="+template+"&image="+URLEncoder.encode(imgStr, "UTF-8"); + // Long start =System.currentTimeMillis()/1000; + AuthService as = new AuthService(); + String accessToken = as.getAuth("1"); + // Long end = System.currentTimeMillis()/1000; + // System.out.println("第一次时间"+(end-start)/60); + // Long start1 =System.currentTimeMillis()/1000; + String result = HttpUtil.post(otherHost, accessToken, params); + // Long end1 = System.currentTimeMillis()/1000; + // System.out.println("第二次时间"+(end1-start1)/60); + // System.out.println(result); + // if() + JSONObject jsonObject = JSON.parseObject(result); + Object jsonObject1 =null; + + JSONArray jsonArray = null; + Map rowData = new HashMap(); + if(!jsonObject.get("error_code").equals(0)){ + return (Map) rowData.put("errorCode", "0"); + } + // System.out.println("识别正常情况"); + jsonObject1 = jsonObject.get("data"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + // System.out.println("原始数据"+jsonArray); + //将得到的数组提取出word_name值 + int size =jsonArray.size(); + String jsonObject3 = null; + Object jsonObject4 = null; + List LisList = new ArrayList(); + + OcrResult lis =null; + int num=0; + for(int i=0;i rowData = new HashMap(); + if(jsonObject.get("error_code").equals(0)){ + // System.out.println("识别正常情况"); + jsonObject1 = jsonObject.get("data"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + // System.out.println(jsonArray); + //将得到的数组提取出word_name值 + int size =jsonArray.size(); + String jsonObject3 = null; + Object jsonObject4 = null; + + for(int i=0;i applyConsultation; + + private ApplyLis applyLis; + + private List apList; + + private List ecgList; + + private Patient patient; + + private String hisEsrdNumber; + + private String outPatien; + + private String groupHospitalId; + + private String categoryHospitalId; + + public List getApplyConsultation() { + return applyConsultation; + } + + public void setApplyConsultation(List applyConsultation) { + this.applyConsultation = applyConsultation; + } + + public ApplyLis getApplyLis() { + return applyLis; + } + + public void setApplyLis(ApplyLis applyLis) { + this.applyLis = applyLis; + } + + public Patient getPatient() { + return patient; + } + + public void setPatient(Patient patient) { + this.patient = patient; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public List getApList() { + return apList; + } + + public void setApList(List apList) { + this.apList = apList; + } + + public List getEcgList() { + return ecgList; + } + + public void setEcgList(List ecgList) { + this.ecgList = ecgList; + } + + public ApplyParameter(List applyConsultation, ApplyLis applyLis, List apList, + List ecgList, Patient patient, String hisEsrdNumber, String outPatien, String groupHospitalId, + String categoryHospitalId) { + super(); + this.applyConsultation = applyConsultation; + this.applyLis = applyLis; + this.apList = apList; + this.ecgList = ecgList; + this.patient = patient; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.groupHospitalId = groupHospitalId; + this.categoryHospitalId = categoryHospitalId; + } + + public ApplyParameter() { + super(); + } + + @Override + public String toString() { + return "ApplyParameter [applyConsultation=" + applyConsultation + ", applyLis=" + applyLis + ", apList=" + + apList + ", ecgList=" + ecgList + ", patient=" + patient + ", hisEsrdNumber=" + hisEsrdNumber + + ", outPatien=" + outPatien + ", groupHospitalId=" + groupHospitalId + ", categoryHospitalId=" + + categoryHospitalId + "]"; + } + +} diff --git a/backend/src/main/java/com/imurs/parameter/Bcall.java b/backend/src/main/java/com/imurs/parameter/Bcall.java new file mode 100644 index 0000000..db60f21 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Bcall.java @@ -0,0 +1,67 @@ +package com.imurs.parameter; + +public class Bcall { + private String domain; + private String app; + private String stream; + private String uri; + private String duration; + private String start_time; + private String stop_time; + private String event; + public String getEvent() { + return event; + } + public void setEvent(String event) { + this.event = event; + } + @Override + public String toString() { + return "Bcall [domain=" + domain + ", app=" + app + ", stream=" + stream + ", uri=" + uri + ", duration=" + + duration + ", start_time=" + start_time + ", stop_time=" + stop_time + "]"; + } + public String getDomain() { + return domain; + } + public void setDomain(String domain) { + this.domain = domain; + } + public String getApp() { + return app; + } + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + public void setStream(String stream) { + this.stream = stream; + } + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + public String getDuration() { + return duration; + } + public void setDuration(String duration) { + this.duration = duration; + } + public String getStart_time() { + return start_time; + } + public void setStart_time(String start_time) { + this.start_time = start_time; + } + public String getStop_time() { + return stop_time; + } + public void setStop_time(String stop_time) { + this.stop_time = stop_time; + } + +} diff --git a/backend/src/main/java/com/imurs/parameter/Bchao.java b/backend/src/main/java/com/imurs/parameter/Bchao.java new file mode 100644 index 0000000..34f7915 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Bchao.java @@ -0,0 +1,39 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bchao { + + @Override + public String toString() { + return "Bchao [name=" + name + ", id=" + id + ", bchildren=" + bchildren + "]"; + } + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + private String name; + private Integer id; + private List bchildren; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public List getBchildren() { + return bchildren; + } + public void setBchildren(List bchildren) { + this.bchildren = bchildren; + } + +} diff --git a/backend/src/main/java/com/imurs/parameter/Bchildren.java b/backend/src/main/java/com/imurs/parameter/Bchildren.java new file mode 100644 index 0000000..cc7a403 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Bchildren.java @@ -0,0 +1,48 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bchildren { + @Override + public String toString() { + return "Bchildren [ultrasound_hint=" + ultrasound_hint + ", id=" + id + ", third_text=" + third_text + + ", ultrasound_find=" + ultrasound_find + ", listbchildren=" + listbchildren + "]"; + } + public String getUltrasound_hint() { + return ultrasound_hint; + } + public void setUltrasound_hint(String ultrasound_hint) { + this.ultrasound_hint = ultrasound_hint; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getThird_text() { + return third_text; + } + public void setThird_text(String third_text) { + this.third_text = third_text; + } + public String getUltrasound_find() { + return ultrasound_find; + } + public void setUltrasound_find(String ultrasound_find) { + this.ultrasound_find = ultrasound_find; + } + private String ultrasound_hint; + private Integer id; + private String third_text; + private String ultrasound_find; + private List listbchildren; + + public List getListbchildren() { + return listbchildren; + } + public void setListbchildren(List listbchildren) { + this.listbchildren = listbchildren; + } +} diff --git a/backend/src/main/java/com/imurs/parameter/Bmenu.java b/backend/src/main/java/com/imurs/parameter/Bmenu.java new file mode 100644 index 0000000..33bb472 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Bmenu.java @@ -0,0 +1,48 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bmenu { + + public String getUltrasound_hint() { + return ultrasound_hint; + } + public void setUltrasound_hint(String ultrasound_hint) { + this.ultrasound_hint = ultrasound_hint; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getThird_text() { + return third_text; + } + public void setThird_text(String third_text) { + this.third_text = third_text; + } + public String getUltrasound_find() { + return ultrasound_find; + } + @Override + public String toString() { + return "Bmenu [ultrasound_hint=" + ultrasound_hint + ", id=" + id + ", third_text=" + third_text + + ", ultrasound_find=" + ultrasound_find + ", childMenus=" + childMenus + "]"; + } + public void setUltrasound_find(String ultrasound_find) { + this.ultrasound_find = ultrasound_find; + } + private String ultrasound_hint; + private Integer id; + private String third_text; + private String ultrasound_find; + private List childMenus; + public List getChildMenus() { + return childMenus; + } + public void setChildMenus(List childMenus) { + this.childMenus = childMenus; + } +} diff --git a/backend/src/main/java/com/imurs/parameter/Children.java b/backend/src/main/java/com/imurs/parameter/Children.java new file mode 100644 index 0000000..cb0807f --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Children.java @@ -0,0 +1,61 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +/** + * 菜单栏返回参数 + * @author Server + * + */ +public class Children implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String path; + + private String name; + private Long id; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Children(String path, String name) { + super(); + this.path = path; + this.name = name; + } + + public Children() { + super(); + } + + @Override + public String toString() { + return "Children [path=" + path + ", name=" + name + "]"; + } + + +} diff --git a/backend/src/main/java/com/imurs/parameter/DataSummarization.java b/backend/src/main/java/com/imurs/parameter/DataSummarization.java new file mode 100644 index 0000000..3275cc3 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/DataSummarization.java @@ -0,0 +1,194 @@ +package com.imurs.parameter; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 数据汇总 + * + * @author D140 + * + */ +public class DataSummarization implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String id; + + private String hospitalName; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy/MM/dd") + private Date setupTime; + + private Integer typeA = 0; + + private Integer typeB = 0; + + /** + * 基层到县医院 + */ + private Integer countyLX = 0; + + private Integer countySP = 0; + + /** + * 基层到市医院 + */ + private Integer cityLX = 0; + + private Integer citySP = 0; + + /** + * B超 + */ + private Integer bmode = 0; + + /** + * 心电 + */ + private Integer ecg = 0; + + /** + * 影像 + */ + private Integer shadow = 0; + + /** + * 病理 + */ + private Integer bl = 0; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public Date getSetupTime() { + return setupTime; + } + + public void setSetupTime(Date setupTime) { + this.setupTime = setupTime; + } + + public Integer getTypeA() { + return typeA; + } + + public void setTypeA(Integer typeA) { + this.typeA = typeA; + } + + public Integer getTypeB() { + return typeB; + } + + public void setTypeB(Integer typeB) { + this.typeB = typeB; + } + + public Integer getCountyLX() { + return countyLX; + } + + public void setCountyLX(Integer countyLX) { + this.countyLX = countyLX; + } + + public Integer getCountySP() { + return countySP; + } + + public void setCountySP(Integer countySP) { + this.countySP = countySP; + } + + public Integer getCityLX() { + return cityLX; + } + + public void setCityLX(Integer cityLX) { + this.cityLX = cityLX; + } + + public Integer getCitySP() { + return citySP; + } + + public void setCitySP(Integer citySP) { + this.citySP = citySP; + } + + public Integer getBmode() { + return bmode; + } + + public void setBmode(Integer bmode) { + this.bmode = bmode; + } + + public Integer getEcg() { + return ecg; + } + + public void setEcg(Integer ecg) { + this.ecg = ecg; + } + + public Integer getShadow() { + return shadow; + } + + public void setShadow(Integer shadow) { + this.shadow = shadow; + } + + + public Integer getBl() { + return bl; + } + + public void setBl(Integer bl) { + this.bl = bl; + } + + public DataSummarization(String id, String hospitalName, Date setupTime, Integer typeA, Integer typeB, + Integer countyLX, Integer countySP, Integer cityLX, Integer citySP, Integer bmode, Integer ecg, + Integer shadow, Integer bl) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.setupTime = setupTime; + this.typeA = typeA; + this.typeB = typeB; + this.countyLX = countyLX; + this.countySP = countySP; + this.cityLX = cityLX; + this.citySP = citySP; + this.bmode = bmode; + this.ecg = ecg; + this.shadow = shadow; + this.bl = bl; + } + + public DataSummarization() { + super(); + } + +} diff --git a/backend/src/main/java/com/imurs/parameter/Items.java b/backend/src/main/java/com/imurs/parameter/Items.java new file mode 100644 index 0000000..37306af --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/Items.java @@ -0,0 +1,60 @@ +package com.imurs.parameter; + +import java.io.Serializable; +import java.util.List; + +/** + * 菜单栏返回参数 + * + * @author Server + * + */ +public class Items implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String icon; + + private String name; + + private List children; + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public Items(String icon, String name, List children) { + super(); + this.icon = icon; + this.name = name; + this.children = children; + } + + public Items() { + super(); + } + +} diff --git a/backend/src/main/java/com/imurs/parameter/LIS.java b/backend/src/main/java/com/imurs/parameter/LIS.java new file mode 100644 index 0000000..57a2e82 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/LIS.java @@ -0,0 +1,142 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +public class LIS implements Serializable { + +/** + * + */ + private static final long serialVersionUID = 1L; + private String name;//姓名 + private String gender;//性别 + private String age;//年龄 + private String hisEsrdNumber;//住院号 + private String printOrder;//序号 + private String reportItemName;//中文名称 + private String result;//结果 + private String sampleNo;//样本标号 + private String sampleType;//样本类型 + private String paritemName;//收费项目 + private String units ;//单位 + private String printContext;//参考值 + private String resultDateTime;//送检日期 + private String updateDate ;//报告日期 + private String sundryFeeName ;//杂项费用项目 + private String abnormalIndicator;//状态 +public String getName() { + return name; +} +public void setName(String name) { + this.name = name; +} +public String getGender() { + return gender; +} +public void setGender(String gender) { + this.gender = gender; +} +public String getAge() { + return age; +} +public void setAge(String age) { + this.age = age; +} + +public String getHisEsrdNumber() { + return hisEsrdNumber; +} +public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; +} +public String getPrintOrder() { + return printOrder; +} +public void setPrintOrder(String printOrder) { + this.printOrder = printOrder; +} +public String getReportItemName() { + return reportItemName; +} +public void setReportItemName(String reportItemName) { + this.reportItemName = reportItemName; +} +public String getResult() { + return result; +} +public void setResult(String result) { + this.result = result; +} +public String getSampleNo() { + return sampleNo; +} +public void setSampleNo(String sampleNo) { + this.sampleNo = sampleNo; +} +public String getSampleType() { + return sampleType; +} +public void setSampleType(String sampleType) { + this.sampleType = sampleType; +} +public String getParitemName() { + return paritemName; +} +public void setParitemName(String paritemName) { + this.paritemName = paritemName; +} +public String getUnits() { + return units; +} +public void setUnits(String units) { + this.units = units; +} +public String getPrintContext() { + return printContext; +} +public void setPrintContext(String printContext) { + this.printContext = printContext; +} +public String getResultDateTime() { + return resultDateTime; +} +public void setResultDateTime(String resultDateTime) { + this.resultDateTime = resultDateTime; +} +public String getUpdateDate() { + return updateDate; +} +public void setUpdateDate(String updateDate) { + this.updateDate = updateDate; +} + +public String getSundryFeeName() { + return sundryFeeName; +} +public void setSundryFeeName(String sundryFeeName) { + this.sundryFeeName = sundryFeeName; +} +public String getAbnormalIndicator() { + return abnormalIndicator; +} +public void setAbnormalIndicator(String abnormalIndicator) { + this.abnormalIndicator = abnormalIndicator; +} +public static long getSerialversionuid() { + return serialVersionUID; +} +@Override +public String toString() { + return "[name=" + name + ", gender=" + gender + ", age=" + age + ", hisEsrdNumber=" + hisEsrdNumber + ", printOrder=" + + printOrder + ", reportItemName=" + reportItemName + ", result=" + result + ", sampleNo=" + sampleNo + + ", sampleType=" + sampleType + ", paritemName=" + paritemName + ", units=" + units + ", printContext=" + + printContext + ", resultDateTime=" + resultDateTime + ", updateDate=" + updateDate + ", sundryFeeName=" + + sundryFeeName + ", abnormalIndicator=" + abnormalIndicator + "]"; +} + + + + + + +} diff --git a/backend/src/main/java/com/imurs/parameter/MyX509TrustManager.java b/backend/src/main/java/com/imurs/parameter/MyX509TrustManager.java new file mode 100644 index 0000000..dee374d --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/MyX509TrustManager.java @@ -0,0 +1,29 @@ +package com.imurs.parameter; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.X509TrustManager; + +public class MyX509TrustManager implements X509TrustManager{ + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // TODO Auto-generated method stub + + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // TODO Auto-generated method stub + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } + +} + diff --git a/backend/src/main/java/com/imurs/parameter/OcrResult.java b/backend/src/main/java/com/imurs/parameter/OcrResult.java new file mode 100644 index 0000000..be74461 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/OcrResult.java @@ -0,0 +1,81 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +public class OcrResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + private String paritemName;//收费项目 + private String result;//结果 + private String units ;//单位 + private String printContext;//参考值 + private String name;//姓名 + private String resultDateTime;//送检日期 + private String updateDate ;//报告日期 + private String auditor;//审核者 + private String handlers;//操作者 + public String getParitemName() { + return paritemName; + } + public void setParitemName(String paritemName) { + this.paritemName = paritemName; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getResultDateTime() { + return resultDateTime; + } + public void setResultDateTime(String resultDateTime) { + this.resultDateTime = resultDateTime; + } + public String getUpdateDate() { + return updateDate; + } + public void setUpdateDate(String updateDate) { + this.updateDate = updateDate; + } + public String getAuditor() { + return auditor; + } + public void setAuditor(String auditor) { + this.auditor = auditor; + } + public String getHandlers() { + return handlers; + } + public void setHandlers(String handlers) { + this.handlers = handlers; + } + public String getUnits() { + return units; + } + public void setUnits(String units) { + this.units = units; + } + public String getPrintContext() { + return printContext; + } + public void setPrintContext(String printContext) { + this.printContext = printContext; + } + public String getResult() { + return result; + } + public void setResult(String result) { + this.result = result; + } + @Override + public String toString() { + return "OcrResult [paritemName=" + paritemName + ", result=" + result + ", units=" + units + ", printContext=" + + printContext + ", name=" + name + ", resultDateTime=" + resultDateTime + ", updateDate=" + updateDate + + ", auditor=" + auditor + ", handlers=" + handlers + "]"; + } + + +} diff --git a/backend/src/main/java/com/imurs/parameter/PACS.java b/backend/src/main/java/com/imurs/parameter/PACS.java new file mode 100644 index 0000000..02ae2db --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/PACS.java @@ -0,0 +1,162 @@ +package com.imurs.parameter; + +import java.io.Serializable; + + + +public class PACS implements Serializable { + +/** + * + */ + private static final long serialVersionUID = 1L; +private String patientName; +private String age; +private String sex; + +private String enterChamber;//科室 +private String hisEsrdNumber;//病案号 +private String examineType;//检查类型 +private String examineDate;//检查日期 +private String examinePart;//检查部位 +private String examineName;//检查名称 +private String reportDate;//报告日期 +private String reportDocName;//报告医生 +private String checkDocName;//审核医生 +private String bSee;//检查所见 +private String bHint;//影像结论 +private String reportUrl;//影像url地址 +public String getPatientName() { + return patientName; +} +public void setPatientName(String patientName) { + this.patientName = patientName; +} +public String getAge() { + return age; +} +public void setAge(String age) { + this.age = age; +} +public String getSex() { + return sex; +} +public void setSex(String sex) { + this.sex = sex; +} +public String getEnterChamber() { + return enterChamber; +} +public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber; +} + +public String getHisEsrdNumber() { + return hisEsrdNumber; +} +public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; +} +public static long getSerialversionuid() { + return serialVersionUID; +} +public String getExamineType() { + return examineType; +} +public void setExamineType(String examineType) { + this.examineType = examineType; +} +public String getExamineDate() { + return examineDate; +} +public void setExamineDate(String examineDate) { + this.examineDate = examineDate; +} +public String getExaminePart() { + return examinePart; +} +public void setExaminePart(String examinePart) { + this.examinePart = examinePart; +} +public String getExamineName() { + return examineName; +} +public void setExamineName(String examineName) { + this.examineName = examineName; +} +public String getReportDate() { + return reportDate; +} +public void setReportDate(String reportDate) { + this.reportDate = reportDate; +} +public String getReportDocName() { + return reportDocName; +} +public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName; +} +public String getCheckDocName() { + return checkDocName; +} +public void setCheckDocName(String checkDocName) { + this.checkDocName = checkDocName; +} +public String getbSee() { + return bSee; +} +public void setbSee(String bSee) { + this.bSee = bSee; +} +public String getbHint() { + return bHint; +} +public void setbHint(String bHint) { + this.bHint = bHint; +} +public String getReportUrl() { + return reportUrl; +} +public void setReportUrl(String reportUrl) { + this.reportUrl = reportUrl; +} +@Override +public String toString() { + return "[patientName=" + patientName + ", age=" + age + ", sex=" + sex + ", enterChamber=" + enterChamber + + ", hisEsrdNumber=" + hisEsrdNumber + ", examineType=" + examineType + ", examineDate=" + examineDate + + ", examinePart=" + examinePart + ", examineName=" + examineName + ", reportDate=" + reportDate + + ", reportDocName=" + reportDocName + ", checkDocName=" + checkDocName + ", bSee=" + bSee + ", bHint=" + + bHint + ", reportUrl=" + reportUrl + "]"; +} +@Override +public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((reportDate == null) ? 0 : reportDate.hashCode()); + return result; +} +@Override +public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PACS other = (PACS) obj; + if (reportDate == null) { + if (other.reportDate != null) + return false; + } else if (!reportDate.equals(other.reportDate)) + return false; + return true; +} + + +public int compareTo(PACS ob) { + return ob.getReportDate().compareTo(reportDate); +} + + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/parameter/RsaSecurityParameter.java b/backend/src/main/java/com/imurs/parameter/RsaSecurityParameter.java new file mode 100644 index 0000000..1ea2418 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/RsaSecurityParameter.java @@ -0,0 +1,30 @@ +/*package com.imurs.parameter; + +import java.lang.annotation.*; + +import org.springframework.web.bind.annotation.Mapping; + + +*//** + * @author monkey + * @desc 请求数据解密 + * @date 2018/10/29 20:17 + *//* +@Target({ElementType.METHOD,ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Mapping +@Documented +public @interface RsaSecurityParameter { + + *//** + * 入参是否解密,默认解密 + *//* + boolean inDecode() default true; + + *//** + * 出参是否加密,默认加密 + *//* + boolean outEncode() default true; + +} +*/ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/parameter/SysMenusParameter.java b/backend/src/main/java/com/imurs/parameter/SysMenusParameter.java new file mode 100644 index 0000000..011bc90 --- /dev/null +++ b/backend/src/main/java/com/imurs/parameter/SysMenusParameter.java @@ -0,0 +1,37 @@ +package com.imurs.parameter; + + +public class SysMenusParameter { + + private String menuId; + + private String menuStair; + + + public String getMenuId() { + return menuId; + } + + public String getMenuStair() { + return menuStair; + } + + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + public void setMenuStair(String menuStair) { + this.menuStair = menuStair; + } + + public SysMenusParameter(String menuId, String menuStair) { + super(); + this.menuId = menuId; + this.menuStair = menuStair; + } + + public SysMenusParameter() { + super(); + } + +} diff --git a/backend/src/main/java/com/imurs/service/AgoraRecordService.java b/backend/src/main/java/com/imurs/service/AgoraRecordService.java new file mode 100644 index 0000000..a7bebd0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/AgoraRecordService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.AgoraRecord; + + +public interface AgoraRecordService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/AiQcVocabularyService.java b/backend/src/main/java/com/imurs/service/AiQcVocabularyService.java new file mode 100644 index 0000000..ac376cf --- /dev/null +++ b/backend/src/main/java/com/imurs/service/AiQcVocabularyService.java @@ -0,0 +1,7 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.AiQcVocabulary; + +public interface AiQcVocabularyService extends IService { +} diff --git a/backend/src/main/java/com/imurs/service/ApiUrlService.java b/backend/src/main/java/com/imurs/service/ApiUrlService.java new file mode 100644 index 0000000..d24a06d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApiUrlService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApiUrl; + +public interface ApiUrlService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyBModeImgService.java b/backend/src/main/java/com/imurs/service/ApplyBModeImgService.java new file mode 100644 index 0000000..2dfef21 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyBModeImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBModeImg; + +public interface ApplyBModeImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyBModeService.java b/backend/src/main/java/com/imurs/service/ApplyBModeService.java new file mode 100644 index 0000000..44ce9de --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyBModeService.java @@ -0,0 +1,39 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBMode; +import com.imurs.util.page.Pagetion; + +public interface ApplyBModeService extends IService{ + + public List selectBmodePage(Map map); + + public Pagetion selectBmodePage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion> selectBmodeSpePage(Map map,Integer pageNo,Integer pageSize); + + public Map DataStatistics(); + + /** + * 基层医院超声统计 + * @param id + * @param startTime + * @param endTime + * @return + */ + Map categoryHospitalStatistics(String id,String startTime,String endTime); + + Map dataStatisticsForHospital(String startTime,String endTime); + + /** + * 根据id修改病例搜索 + * @param applyBMode 超声病例 + * @return + */ + boolean updateBmodeById(ApplyBMode applyBMode); + List> selectWorkTotalByTime(String startTime, String endTime, String conditions,String consultationMode, String categoryHospitalId); + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java b/backend/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java new file mode 100644 index 0000000..d33b9c7 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBModeSpecialist; + +public interface ApplyBModeSpecialistService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyCaseImgService.java b/backend/src/main/java/com/imurs/service/ApplyCaseImgService.java new file mode 100644 index 0000000..aa23029 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyCaseImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyCaseImg; + +public interface ApplyCaseImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyCaseService.java b/backend/src/main/java/com/imurs/service/ApplyCaseService.java new file mode 100644 index 0000000..b274a23 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyCaseService.java @@ -0,0 +1,26 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyCase; +import com.imurs.util.page.Pagetion; + +public interface ApplyCaseService extends IService{ + public List export(Map map); + public List getExport(Map map); + public List arrangeOutExport(Map map); + public List arrangeGetExport(Map map); + + public Pagetion selectCasePage(Map map,Integer pageNo,Integer pageSize); + public Pagetion selectAdminCasePage(Map map,Integer pageNo,Integer pageSize); + + public ApplyCase selectCaseById(Long id); + public int selectUpWayReferralNumer(Map upWayReferralMap); + public int selectDownWayReferralNumer(Map upWayReferralMap); + + public Pagetion selectCasePatient(Map map,Integer pageNo,Integer pageSize); + public Boolean updateByHis(Map map2); + public Map selectPatientById(Map map); +} diff --git a/backend/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java b/backend/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java new file mode 100644 index 0000000..47c87fd --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsulationSpecialist; + +public interface ApplyConsulationSpecialistService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyConsultationImgService.java b/backend/src/main/java/com/imurs/service/ApplyConsultationImgService.java new file mode 100644 index 0000000..e8d594d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyConsultationImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsultationImg; + +public interface ApplyConsultationImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyConsultationService.java b/backend/src/main/java/com/imurs/service/ApplyConsultationService.java new file mode 100644 index 0000000..53db73a --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyConsultationService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsultation; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.Pagetion; + +public interface ApplyConsultationService extends IService{ + + public Pagetion selectConByCategory(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectConPatient(Map map,Integer pageNo,Integer pageSize); + + public int selectConsultationNumer(Map downWayReferralMap); + + public Pagetion selectConsultationSpe(Map map,Integer pageNo, Integer pageSize); + + public CustomPage selectConByPage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/backend/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java b/backend/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java new file mode 100644 index 0000000..bd663ae --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.util.page.Pagetion; + +public interface ApplyDoctorPromoteService extends IService{ + + public Pagetion selectAdminPromote(Map map,Integer pageNo,Integer pageSize); + + int selectrefresherCount(Map refresherNumerMap); + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyEcgImgService.java b/backend/src/main/java/com/imurs/service/ApplyEcgImgService.java new file mode 100644 index 0000000..f8d9907 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyEcgImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcgImg; + +public interface ApplyEcgImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyEcgService.java b/backend/src/main/java/com/imurs/service/ApplyEcgService.java new file mode 100644 index 0000000..61dd39b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyEcgService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcg; +import com.imurs.util.page.Pagetion; + +public interface ApplyEcgService extends IService{ + + public Pagetion selectEcgPage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectEcgSpePage(Map map,Integer pageNo,Integer pageSize); + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java b/backend/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java new file mode 100644 index 0000000..ebbc63e --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcgSpecialist; + +public interface ApplyEcgSpecialistService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyInformationImgService.java b/backend/src/main/java/com/imurs/service/ApplyInformationImgService.java new file mode 100644 index 0000000..b72346b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyInformationImgService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyInformationImg; + +public interface ApplyInformationImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyInformationService.java b/backend/src/main/java/com/imurs/service/ApplyInformationService.java new file mode 100644 index 0000000..132bd06 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyInformationService.java @@ -0,0 +1,19 @@ +package com.imurs.service; + + +import java.util.List; +import java.util.Map; +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyInformation; +import com.imurs.util.page.Pagetion; + +public interface ApplyInformationService extends IService{ + + Pagetion findAifmAdminPage(Map map,Integer pageNo,Integer pageSize); + + List selectHospitalList(String hospitalName); + + List selectInfromationList(Map infromationMap); + + boolean updateBatchByIds(List applyInformation); +} diff --git a/backend/src/main/java/com/imurs/service/ApplyLisService.java b/backend/src/main/java/com/imurs/service/ApplyLisService.java new file mode 100644 index 0000000..2c9ca98 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyLisService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyLis; + +public interface ApplyLisService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyPathologyFileService.java b/backend/src/main/java/com/imurs/service/ApplyPathologyFileService.java new file mode 100644 index 0000000..d5c0224 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyPathologyFileService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologyFile; + +public interface ApplyPathologyFileService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyPathologyImgService.java b/backend/src/main/java/com/imurs/service/ApplyPathologyImgService.java new file mode 100644 index 0000000..3a2416d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyPathologyImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologyImg; + +public interface ApplyPathologyImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplyPathologyService.java b/backend/src/main/java/com/imurs/service/ApplyPathologyService.java new file mode 100644 index 0000000..76ddc6b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyPathologyService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathology; +import com.imurs.util.page.Pagetion; + +public interface ApplyPathologyService extends IService{ + + public Pagetion selectAphPage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectAphSpePage(Map map,Integer pageNo,Integer pageSize); +} diff --git a/backend/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java b/backend/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java new file mode 100644 index 0000000..523d2c1 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologySpecialist; + +public interface ApplyPathologySpecialistService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ApplySpecialistService.java b/backend/src/main/java/com/imurs/service/ApplySpecialistService.java new file mode 100644 index 0000000..37f5ccf --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ApplySpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplySpecialist; + +public interface ApplySpecialistService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/BModeHistoryService.java b/backend/src/main/java/com/imurs/service/BModeHistoryService.java new file mode 100644 index 0000000..5a4b345 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BModeHistoryService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BModeHistory; + + + +import java.util.List; +import java.util.Map; + +public interface BModeHistoryService extends IService { + + + + + List selectBmodeHis(Map map); //Long bId, Long reportId + + + + +} diff --git a/backend/src/main/java/com/imurs/service/BModeReportService.java b/backend/src/main/java/com/imurs/service/BModeReportService.java new file mode 100644 index 0000000..27986e0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BModeReportService.java @@ -0,0 +1,23 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BModeReport; + +import java.text.ParseException; +import java.util.List; + +/** + * @author Laier + * @date 2022-11-23 14:14 + */ +public interface BModeReportService extends IService { + List insertModeReportList(Long bId, List modeReports) throws ParseException, Exception; + + List selectModeReportListByBId(Long bId); + + BModeReport selectModeReportByReportId(Long reportId); + + void checkReportAndChangeModelState(BModeReport modeReport) throws ParseException; + + List finishModeReport(Long bId,Long speId, List resultReports) throws ParseException; +} diff --git a/backend/src/main/java/com/imurs/service/BdiagnosisNextService.java b/backend/src/main/java/com/imurs/service/BdiagnosisNextService.java new file mode 100644 index 0000000..92d256b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BdiagnosisNextService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BdiagnosisNext; + +public interface BdiagnosisNextService extends IService { + + List selectDiagnosisList(Integer id); + +} diff --git a/backend/src/main/java/com/imurs/service/BdiagnosisService.java b/backend/src/main/java/com/imurs/service/BdiagnosisService.java new file mode 100644 index 0000000..88e797f --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BdiagnosisService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Bdiagnosis; + +public interface BdiagnosisService extends IService { + +} diff --git a/backend/src/main/java/com/imurs/service/BmodeMachineModelService.java b/backend/src/main/java/com/imurs/service/BmodeMachineModelService.java new file mode 100644 index 0000000..4719619 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BmodeMachineModelService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodeMachineModel; + +public interface BmodeMachineModelService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/BmodelFrisService.java b/backend/src/main/java/com/imurs/service/BmodelFrisService.java new file mode 100644 index 0000000..89c3e83 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BmodelFrisService.java @@ -0,0 +1,13 @@ +package com.imurs.service; + + + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodelFris; + + +public interface BmodelFrisService extends IService{ + public List selectBmodelFris(int id); +} diff --git a/backend/src/main/java/com/imurs/service/BmodelSecondService.java b/backend/src/main/java/com/imurs/service/BmodelSecondService.java new file mode 100644 index 0000000..8282a57 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BmodelSecondService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + + + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; + + +public interface BmodelSecondService extends IService{ + public List selectbmodelSecond(int id); +} diff --git a/backend/src/main/java/com/imurs/service/BmodelService.java b/backend/src/main/java/com/imurs/service/BmodelService.java new file mode 100644 index 0000000..0554f08 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/BmodelService.java @@ -0,0 +1,11 @@ +package com.imurs.service; + + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Bmodel; + + +public interface BmodelService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/CaseTemplateService.java b/backend/src/main/java/com/imurs/service/CaseTemplateService.java new file mode 100644 index 0000000..4f87dbe --- /dev/null +++ b/backend/src/main/java/com/imurs/service/CaseTemplateService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.CaseTemplate; + +import java.util.List; + +public interface CaseTemplateService extends IService { + + List listWithTree(); +} diff --git a/backend/src/main/java/com/imurs/service/ClinicalGuidelinesService.java b/backend/src/main/java/com/imurs/service/ClinicalGuidelinesService.java new file mode 100644 index 0000000..e3b9186 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ClinicalGuidelinesService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.util.page.Pagetion; + +public interface ClinicalGuidelinesService extends IService{ + public Pagetion selectCgsOrByDocIdPage(Map map, Integer pageNo, Integer pageSize); + +} diff --git a/backend/src/main/java/com/imurs/service/DoctorArrangeService.java b/backend/src/main/java/com/imurs/service/DoctorArrangeService.java new file mode 100644 index 0000000..a8968af --- /dev/null +++ b/backend/src/main/java/com/imurs/service/DoctorArrangeService.java @@ -0,0 +1,31 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.DoctorArrange; +import com.imurs.util.page.Pagetion; + +public interface DoctorArrangeService extends IService{ + + public List selectHonmeShowArrange(); + + public List homeShowArrange(Map map); + + public DoctorArrange selectTotanumberDay(Map map); + + public Pagetion selectByArrangePage(Map map,Integer pageNo, Integer pageSize); + + public List selectTotaDay(Map map); + + public DoctorArrange selectArrangeByUser(Long id); + int selectdoctorTotaDay(Map map); + + List selectDoctorArrangeList(Map doctorArrang); + + Map selectAccreditedMedicalNumber(Map map1); + + public List selectArrangeByRhId(String receiveHospitalId); + +} diff --git a/backend/src/main/java/com/imurs/service/DoctorGroupService.java b/backend/src/main/java/com/imurs/service/DoctorGroupService.java new file mode 100644 index 0000000..ea20a9b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/DoctorGroupService.java @@ -0,0 +1,16 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.DoctorGroup; + +import java.util.List; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Service +* @createDate 2025-11-13 12:08:54 +*/ +public interface DoctorGroupService extends IService { + +} diff --git a/backend/src/main/java/com/imurs/service/HomePageShowService.java b/backend/src/main/java/com/imurs/service/HomePageShowService.java new file mode 100644 index 0000000..0196c56 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/HomePageShowService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.HomePageShow; + +public interface HomePageShowService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/ImgArrangeService.java b/backend/src/main/java/com/imurs/service/ImgArrangeService.java new file mode 100644 index 0000000..fecc4a1 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/ImgArrangeService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ImgArrange; + +public interface ImgArrangeService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/InstallModelService.java b/backend/src/main/java/com/imurs/service/InstallModelService.java new file mode 100644 index 0000000..5dd7ba1 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/InstallModelService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Service; + +@Service +public interface InstallModelService extends IService { +} diff --git a/backend/src/main/java/com/imurs/service/LiveService.java b/backend/src/main/java/com/imurs/service/LiveService.java new file mode 100644 index 0000000..5f4a1f1 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/LiveService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Live; +import com.imurs.util.page.Pagetion; + +import java.util.Map; + +public interface LiveService extends IService { + + public Pagetion selectLivePage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/backend/src/main/java/com/imurs/service/LoginRecordService.java b/backend/src/main/java/com/imurs/service/LoginRecordService.java new file mode 100644 index 0000000..67c1396 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/LoginRecordService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.LoginRecord; + +public interface LoginRecordService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/PatientService.java b/backend/src/main/java/com/imurs/service/PatientService.java new file mode 100644 index 0000000..eb621a3 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/PatientService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Patient; + +public interface PatientService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/PatientUserRecordImgService.java b/backend/src/main/java/com/imurs/service/PatientUserRecordImgService.java new file mode 100644 index 0000000..f46a937 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/PatientUserRecordImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUserRecordImg; + +public interface PatientUserRecordImgService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/PatientUserRecordService.java b/backend/src/main/java/com/imurs/service/PatientUserRecordService.java new file mode 100644 index 0000000..47c2920 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/PatientUserRecordService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUserRecord; +import com.imurs.util.page.Pagetion; + +public interface PatientUserRecordService extends IService{ + + + public Pagetion selectRecordPtUserPage(Map map,Integer pageNo,Integer pageSize); + +} diff --git a/backend/src/main/java/com/imurs/service/PatientUserService.java b/backend/src/main/java/com/imurs/service/PatientUserService.java new file mode 100644 index 0000000..9572a7e --- /dev/null +++ b/backend/src/main/java/com/imurs/service/PatientUserService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUser; + +public interface PatientUserService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/RoleService.java b/backend/src/main/java/com/imurs/service/RoleService.java new file mode 100644 index 0000000..507e8b4 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/RoleService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Role; + +public interface RoleService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/SectionService.java b/backend/src/main/java/com/imurs/service/SectionService.java new file mode 100644 index 0000000..6bf83f0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/SectionService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Section; + +public interface SectionService extends IService
{ + +} diff --git a/backend/src/main/java/com/imurs/service/SysMenuService.java b/backend/src/main/java/com/imurs/service/SysMenuService.java new file mode 100644 index 0000000..d511052 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/SysMenuService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.SysMenu; + +public interface SysMenuService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java b/backend/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java new file mode 100644 index 0000000..b7249ec --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalClinicalGuidelines; + +public interface TotalClinicalGuidelinesService extends IService{ + + +} diff --git a/backend/src/main/java/com/imurs/service/TotalInformationService.java b/backend/src/main/java/com/imurs/service/TotalInformationService.java new file mode 100644 index 0000000..234b04d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TotalInformationService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalInformation; + +public interface TotalInformationService extends IService{ + + public List selectTotalInformationAll(Map map); + public TotalInformation totaTotalInformation(Map map); +} diff --git a/backend/src/main/java/com/imurs/service/TotalTrainingService.java b/backend/src/main/java/com/imurs/service/TotalTrainingService.java new file mode 100644 index 0000000..8547c76 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TotalTrainingService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalTraining; + +public interface TotalTrainingService extends IService{ + + public TotalTraining selectTotanNumberTraining (Map map); + + public Map selectLectureTrainingAndNember(Map map2); + +} diff --git a/backend/src/main/java/com/imurs/service/TrainingFlowerService.java b/backend/src/main/java/com/imurs/service/TrainingFlowerService.java new file mode 100644 index 0000000..d3b1b04 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TrainingFlowerService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingFlower; + +public interface TrainingFlowerService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/TrainingOpinionService.java b/backend/src/main/java/com/imurs/service/TrainingOpinionService.java new file mode 100644 index 0000000..5ca9331 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TrainingOpinionService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingOpinion; + +public interface TrainingOpinionService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/TrainingPlanService.java b/backend/src/main/java/com/imurs/service/TrainingPlanService.java new file mode 100644 index 0000000..67964b6 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TrainingPlanService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingPlan; + +public interface TrainingPlanService extends IService{ + +} diff --git a/backend/src/main/java/com/imurs/service/TrainingRecordService.java b/backend/src/main/java/com/imurs/service/TrainingRecordService.java new file mode 100644 index 0000000..db477b0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TrainingRecordService.java @@ -0,0 +1,17 @@ +package com.imurs.service; + + + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingRecord; +import com.imurs.util.page.Pagetion; + +public interface TrainingRecordService extends IService{ + + public Pagetion selectAdminRecord(Map map,Integer pageNo,Integer pageSize); + + public TrainingRecord selectTrainingRecordById(Long id); + +} diff --git a/backend/src/main/java/com/imurs/service/TrainingService.java b/backend/src/main/java/com/imurs/service/TrainingService.java new file mode 100644 index 0000000..0756815 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/TrainingService.java @@ -0,0 +1,17 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Training; +import com.imurs.util.page.Pagetion; + +public interface TrainingService extends IService{ + + public List selectTraining(Map map); + + int selectTotalTopicNumber(Map totalTopicNumMap); + + public Pagetion selectBasePage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/backend/src/main/java/com/imurs/service/UserService.java b/backend/src/main/java/com/imurs/service/UserService.java new file mode 100644 index 0000000..3989019 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/UserService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.User; +import com.imurs.util.page.Pagetion; + +public interface UserService extends IService{ + + public Pagetion selectUserPageByDoc(Map map,Integer pageNo,Integer pageSize); + + public User selectUserByUid(Long uid); + + public Map selectByappuserID(Long id); + + public User selectUserByPhone(String phone); + + boolean updateBatchByIds(List users); +} diff --git a/backend/src/main/java/com/imurs/service/VideoRecordService.java b/backend/src/main/java/com/imurs/service/VideoRecordService.java new file mode 100644 index 0000000..ef4258b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/VideoRecordService.java @@ -0,0 +1,11 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.VideoRecord; + +public interface VideoRecordService extends IService{ + + + +} diff --git a/backend/src/main/java/com/imurs/service/WebLogService.java b/backend/src/main/java/com/imurs/service/WebLogService.java new file mode 100644 index 0000000..3fcb4fd --- /dev/null +++ b/backend/src/main/java/com/imurs/service/WebLogService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.WebLog; +import org.springframework.stereotype.Service; + +@Service +public interface WebLogService extends IService { +} diff --git a/backend/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java new file mode 100644 index 0000000..371df7d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.AgoraRecordMapper; +import com.imurs.entity.AgoraRecord; +import com.imurs.service.AgoraRecordService; +@Service +public class AgoraRecordServiceImpl extends ServiceImpl implements AgoraRecordService { + +} diff --git a/backend/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java new file mode 100644 index 0000000..d4670bc --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.AiQcVocabularyMapper; +import com.imurs.entity.AiQcVocabulary; +import com.imurs.service.AiQcVocabularyService; +import org.springframework.stereotype.Service; + +@Service +public class AiQcVocabularyServiceImpl extends ServiceImpl + implements AiQcVocabularyService { +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java new file mode 100644 index 0000000..bffad4c --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApiUrlMapper; +import com.imurs.entity.ApiUrl; +import com.imurs.service.ApiUrlService; + +@Service +public class ApiUrlServiceImpl extends ServiceImpl implements ApiUrlService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java new file mode 100644 index 0000000..b8f3b8d --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeImgMapper; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.service.ApplyBModeImgService; + +@Service +public class ApplyBModeImgServiceImpl extends ServiceImpl implements ApplyBModeImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java new file mode 100644 index 0000000..f897d38 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java @@ -0,0 +1,663 @@ +package com.imurs.service.impl; + + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.ApplyInformationMapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.BModeReport; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeMapper; +import com.imurs.dao.ApplyBModeSpecialistMapper; +import com.imurs.dao.UserMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeService; +import com.imurs.util.page.Pagetion; +import com.imurs.utils.BodyPartCounter; +import com.imurs.utils.Excelvo; +import com.imurs.utils.handleDuplicate; + +@Service +public class ApplyBModeServiceImpl extends ServiceImpl implements ApplyBModeService{ + + @Autowired + ApplyBModeMapper applyBModeMapper; + @Autowired + ApplyBModeSpecialistMapper applyBModeSpecialistMapper; + @Autowired + UserMapper userMapper; + @Autowired + private ApplyInformationMapper applyInformationMapper; + + +// @Override +// public void updateByMyId(Long id,String username) { +// applyBModeMapper.updateByMyId(id,username); +// } + + @Override + public List selectBmodePage(Map map) { + return applyBModeMapper.selectBmodePage(map); + } + + @Override + public Pagetion selectBmodePage(Map map,Integer pageNo, Integer pageSize) { + int count=applyBModeMapper.selectBmodePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyBModeMapper.selectBmodePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion> selectBmodeSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyBModeMapper.selectBmodeSpePage(map).size(); + Pagetion> pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List> list= applyBModeMapper.selectBmodeSpePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Map DataStatistics() { + Map map = new HashMap(); + List> diagnosisTypeNumber = applyBModeMapper.diagnosisTypeNumber(); + List> hospitalApplyNumber = applyBModeMapper.hospitalApplyNumber(); + map.put("diagnosisTypeNumber", diagnosisTypeNumber); + map.put("hospitalApplyNumber", hospitalApplyNumber); + + Map map1 = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("state", 40).or().eq("state", 70); + List selectList = applyBModeSpecialistMapper.selectList(wrapper); + EntityWrapper wrapper1=new EntityWrapper(); + wrapper1.eq("hospital_id", 10001).eq("rid", 6); + List selectList2 = userMapper.selectList(wrapper1); + for (User user : selectList2) { + int i = 0; + for (ApplyBModeSpecialist applyBModeSpecialist : selectList) { + if (user.getUserName().equals(applyBModeSpecialist.getSpeName())) { + i++; + } + } + map1.put(user.getUserName(), i); + } + List> specialistUserNumber = new ArrayList>(); + specialistUserNumber.add(map1); + map.put("specialistUserNumber", specialistUserNumber); + + return map; + } + + //基层医院超声统计 以前的代码没有部位 + + public Map categoryHospitalStatistics2(String id, String startTime, String endTime) { + Map map = new HashMap<>(); + EntityWrapper wrapper1 = new EntityWrapper<>(); + EntityWrapper wrapper2 = new EntityWrapper<>(); + try { + wrapper1.eq("category_hospital_id",id); + wrapper1.eq("status","70"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper1.ge("group_date",startTime).le("group_date",endTime); + } + List abList = applyBModeMapper.selectList(wrapper1); + //医院实时超声会诊的总数 + long totalSpCount = abList.stream() + .filter(applyBMode -> "SP".equals(applyBMode.getDiagnosisType())) + .count(); + //医院离线超声会诊总数 + long totalLxCount = abList.stream() + .filter(applyBMode -> "LX".equals(applyBMode.getDiagnosisType())) + .count(); + //统计医生的超声总数 + Map spDoctorCount = abList.stream() + .filter(applyBMode -> "SP".equals(applyBMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + Map lxDoctorCount = abList.stream() + .filter(applyBMode -> "LX".equals(applyBMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + + wrapper2.eq("hospital_id",id); + List users = userMapper.selectList(wrapper2); + List> docList = new ArrayList<>(); + //遍历医生,如果该医生有实时会诊或者离线会诊则记录下来,如果没有则赋值为0 + for (User user : users) { + Map docMap = new HashMap<>(); + docMap.put("name",user.getUserName()); + docMap.put("spCount",spDoctorCount.get(user.getId()) == null + ? 0 : spDoctorCount.get(user.getId())); + docMap.put("lxCount",lxDoctorCount.get(user.getId()) == null + ? 0 : lxDoctorCount.get(user.getId())); + docList.add(docMap); + } + //放入map返回给前端 + map.put("totalSpCount",totalSpCount); + map.put("totalLxCount",totalLxCount); + map.put("doctorCount",docList); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg","4"); + } + return map; + } + //基层医院超声统计 改成病例数和实际部位数 + @Override + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = new HashMap<>(); + EntityWrapper wrapper1 = new EntityWrapper<>(); + EntityWrapper wrapper2 = new EntityWrapper<>(); + try { + wrapper1.eq("category_hospital_id",id); + wrapper1.eq("status","70"); + wrapper1.notLike("patient_name","%测试%"); + wrapper1.isNotNull("examine_part_num"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper1.ge("group_date",startTime).le("group_date",endTime); + } + List abList = applyBModeMapper.selectList(wrapper1); + //医院实时超声会诊的总数 + long totalLxCount = abList.size(); + //医院部位会诊总数 + long totalPartCount = abList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .mapToInt(bMode -> bMode.getExaminePartNum()).sum(); + //统计医生的超声总数,以前没有填部位数的不统计了 + Map spDoctorCount = abList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + Map lxDoctorCount = abList.stream() + // .filter(bMode -> bMode.getExaminePartNum() != null) // 过滤掉examine_part_num为null的记录 + .collect(Collectors.groupingBy( + ApplyBMode::getDocId, // 按医院分类 + Collectors.summingLong(ApplyBMode::getExaminePartNum) // 统计每个医院的检查部位总数 + )); + + + wrapper2.eq("hospital_id",id); + wrapper1.notLike("user_name","%测试%"); + List users = userMapper.selectList(wrapper2); + List> docList = new ArrayList<>(); + //遍历医生,如果该医生有实时会诊或者离线会诊则记录下来,如果没有则赋值为0 + for (User user : users) { + Map docMap = new HashMap<>(); + docMap.put("name",user.getUserName()); + docMap.put("lxCount",spDoctorCount.get(user.getId()) == null + ? 0 : spDoctorCount.get(user.getId())); + docMap.put("partCount",lxDoctorCount.get(user.getId()) == null + ? 0 : lxDoctorCount.get(user.getId())); + docList.add(docMap); + } + //放入map返回给前端 + map.put("totalLxCount",totalLxCount); + map.put("totalPartCount",totalPartCount); + map.put("doctorCount",docList); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg","4"); + } + return map; + } + + //管理医院超声统计 + //这是以前的代码 + public Map dataStatisticsForHospital2(String startTime,String endTime) { + Map map = new HashMap<>(); + + EntityWrapper bModeWrapper = new EntityWrapper<>(); + EntityWrapper informationWrapper = new EntityWrapper<>(); + + bModeWrapper.eq("group_hospital_id","10001"); + bModeWrapper.eq("status","70"); + bModeWrapper.ne("category_hospital_id","10001"); + bModeWrapper.notLike("patient_name","%测试%"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + bModeWrapper.ge("group_date",startTime).le("group_date",endTime); + } + + informationWrapper.eq("hospital_id","10001"); + informationWrapper.ne("account","10001"); + informationWrapper.notLike("hospital_name","%测试%"); + try { + //查询出管理医院下的基层医院所有的超声列表 + List bModeList = applyBModeMapper.selectList(bModeWrapper); + //基层医院实时会诊总数 + long totalCategorySpCount = bModeList.stream() + .filter(bMode -> "SP".equals(bMode.getDiagnosisType())).count(); + //基层医院离线会诊总数 + long totalCategoryLxCount = bModeList.stream() + .filter(bMode -> "LX".equals(bMode.getDiagnosisType())).count(); + //l基层医院的阳性病例总数 + long totalCategoryNatureCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()).count(); + + //统计基层医院的超声总数 + Map spCategoryCount = bModeList.stream() + .filter(bMode -> "SP".equals(bMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + Map lxCategoryCount = bModeList.stream() + .filter(bMode -> "LX".equals(bMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + //统计基层医院的阳性病例总数 + Map natureCategoryCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //查询所有的基层医院 + List informations = applyInformationMapper.selectList(informationWrapper); + + //查询每个医院的实时会诊次数与离线会诊次数 + List> infomationList = new ArrayList<>(); + for (ApplyInformation information : informations) { + Map inforMap = new HashMap<>(); + inforMap.put("hospitalName",information.getHospitalName()); + inforMap.put("spCount",spCategoryCount.get(information.getAccount()) + == null ? 0 : spCategoryCount.get(information.getAccount())); + inforMap.put("lxCount",lxCategoryCount.get(information.getAccount()) + == null ? 0 : lxCategoryCount.get(information.getAccount())); + inforMap.put("natureCount",natureCategoryCount.get(information.getAccount()) + == null ? 0 : natureCategoryCount.get(information.getAccount())); + infomationList.add(inforMap); + } + //统计阳性病例的百分比 + long total = totalCategorySpCount + totalCategoryLxCount; + String naturePercent = accuracy(totalCategoryNatureCount,total); + + map.put("spCategoryCount",totalCategorySpCount); + map.put("lxCategoryCount",totalCategoryLxCount); + map.put("natureCount",totalCategoryNatureCount); + map.put("naturePercent",naturePercent); + map.put("infomationList",infomationList); + + //统计专家的会诊列表 + List> specialists = querySpecialistStatistics(startTime,endTime).get("specialist"); + List> countList = querySpecialistStatistics(startTime,endTime).get("countList"); + map.put("specialists",specialists); + map.put("countList",countList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + //管理医院超声统计 按部位数统计 + @Override + public Map dataStatisticsForHospital(String startTime,String endTime) { + Map map = new HashMap<>(); + + EntityWrapper bModeWrapper = new EntityWrapper<>(); + EntityWrapper informationWrapper = new EntityWrapper<>(); + + bModeWrapper.eq("group_hospital_id","10001"); + bModeWrapper.eq("status","70"); + bModeWrapper.ne("category_hospital_id","10001"); + bModeWrapper.notLike("patient_name","%测试%"); + bModeWrapper.isNotNull("examine_part_num"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + bModeWrapper.ge("group_date",startTime).le("group_date",endTime); + } + + informationWrapper.eq("hospital_id","10001"); + informationWrapper.ne("account","10001"); + informationWrapper.notLike("hospital_name","%测试%"); + try { + //查询出管理医院下的基层医院所有的超声列表 + List bModeList = applyBModeMapper.selectList(bModeWrapper); + //基层医院实时会诊总数 + + // .filter(bMode -> "A".equals(bMode.getConditions())) 普通超声 B多普勒 + long totalCategoryPartCount = bModeList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .mapToInt(bMode -> bMode.getExaminePartNum()).sum(); + + //l基层医院的阳性病例总数 + //l基层医院的阳性病例总数 + long totalCategoryNatureCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()).count(); + //long totalCategoryNatureCount = bModeList.stream() + // .filter(bMode -> 1 == bMode.getNature()).count(); + //不要阳性病例总数,改成病例总数 字段的名字前端要求的没有改totalCategoryLxCount + long totalCategoryLxCount = bModeList.size(); + + //统计基层医院的超声总数 + /* + * Map spCategoryCount = bModeList.stream() .filter(bMode -> + * "SP".equals(bMode.getDiagnosisType())) + * .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors. + * counting())); Map lxCategoryCount = bModeList.stream() + * .filter(bMode -> "LX".equals(bMode.getDiagnosisType())) + * .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors. + * counting())); + */ + //Map spCategoryCount = bModeList.stream() + //.collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + Map spCategoryCount = bModeList.stream() + // .filter(bMode -> bMode.getExaminePartNum() != null) // 过滤掉examine_part_num为null的记录 + .collect(Collectors.groupingBy( + ApplyBMode::getCategoryHospitalId, // 按医院分类 + Collectors.summingLong(ApplyBMode::getExaminePartNum) // 统计每个医院的检查部位总数 + )); + + //统计基层医院的阳性病例总数 + + Map natureCategoryCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //改成病例总数不统计阳性病例 + Map applyCategoryCount = bModeList.stream() + + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //查询所有的基层医院 + List informations = applyInformationMapper.selectList(informationWrapper); + + //查询每个医院的实时会诊次数与离线会诊次数 + List> infomationList = new ArrayList<>(); + for (ApplyInformation information : informations) { + Map inforMap = new HashMap<>(); + inforMap.put("hospitalName",information.getHospitalName()); + inforMap.put("partCount",spCategoryCount.get(information.getAccount()) + == null ? 0 : spCategoryCount.get(information.getAccount())); + inforMap.put("natureCount",natureCategoryCount.get(information.getAccount()) + == null ? 0 : natureCategoryCount.get(information.getAccount())); + //System.out.println(information.getHospitalName()+" :"+spCategoryCount.get(information.getAccount())); + inforMap.put("lxCount",applyCategoryCount.get(information.getAccount()) + == null ? 0 : applyCategoryCount.get(information.getAccount())); + infomationList.add(inforMap); + } + // + long total = totalCategoryLxCount ; + String naturePercent = accuracy(totalCategoryNatureCount,total); + + //map.put("spCategoryCount",totalCategorySpCount); + map.put("lxCategoryCount",totalCategoryLxCount); + map.put("partCount",totalCategoryPartCount); + map.put("natureCount",totalCategoryNatureCount); + map.put("naturePercent",naturePercent); + map.put("infomationList",infomationList); + + //统计专家的会诊列表 + List> specialists = querySpecialistStatisticsnew(startTime,endTime).get("specialist"); + List> countList = querySpecialistStatisticsnew(startTime,endTime).get("countList"); + map.put("specialists",specialists); + map.put("countList",countList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + + /** + * 根据id修改病例信息 + * @param applyBMode 超声病例 + * @return + */ + @Override + public boolean updateBmodeById(ApplyBMode applyBMode) { + //判断原本病例的 active状态 + ApplyBMode activeModel = applyBModeMapper.selectById(applyBMode.getId()); + int active = activeModel.getActive(); + int changeActive = applyBMode.getActive() == null ? 1 : applyBMode.getActive(); + //0表示已结束,则该状态不能改变 + if (active == ModelActiveConstant.ACTIVE_FINISH) { + applyBMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + } + //2表示待审核,只能由专家提交报告改变为已结束,不能作其它改变 + if (active == ModelActiveConstant.ACTIVE_CHECKING && changeActive != ModelActiveConstant.ACTIVE_FINISH) { + applyBMode.setActive(ModelActiveConstant.ACTIVE_CHECKING); + } + Integer update = applyBModeMapper.updateById(applyBMode); + return update > 0; + } + + /** + * 统计管理医院专家的会诊次数 + * @return + */ + private Map>> querySpecialistStatistics(String startTime,String endTime) { + Map>> map = new HashMap<>(); + List> specialist = new ArrayList<>(); + List> countList = new ArrayList<>(); + + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("state","70"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper.ge("create_time",startTime).le("create_time",endTime); + } + + EntityWrapper userWrapper = new EntityWrapper<>(); + userWrapper.eq("hospital_id","10001").eq("rid","6") + .notLike("user_name","%测试%").eq("se_name","超声科"); + //wrapper.notLike("applybmode.pa_name", "%测试%"); + + try { + //查询专家超声会诊的列表 + List specialists = applyBModeSpecialistMapper.selectList(wrapper); + + //统计专家实时超声会诊的列表 + Map spSpecialistCount = specialists.stream() + .filter(applyBModeSpecialist -> "SP".equals(applyBModeSpecialist.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + //统计专家离线会诊的列表 + Map lxSpecialistCount = specialists.stream() + .filter(applyBModeSpecialist -> "LX".equals(applyBModeSpecialist.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + + //统计每个专家的会诊次数 + List userList = userMapper.selectList(userWrapper); + Map totalMap = new HashMap<>(); + Long totalSpCount = 0L; + Long totalLxCount = 0L; + for (User user : userList) { + Map userMap = new HashMap<>(); + Long spCount = spSpecialistCount.get(user.getId()) == null + ? 0L : spSpecialistCount.get(user.getId()); + Long lxCount = lxSpecialistCount.get(user.getId()) == null + ? 0L : lxSpecialistCount.get(user.getId()); + userMap.put("userName",user.getUserName()); + userMap.put("spCount",spCount); + userMap.put("lxCount",lxCount); + specialist.add(userMap); + totalSpCount = totalSpCount + spCount; + totalLxCount = totalLxCount + lxCount; + } + //统计专家会诊次数的总数 + totalMap.put("totalSpCount",totalSpCount); + totalMap.put("totalLxCount",totalLxCount); + countList.add(totalMap); + map.put("specialist",specialist); + map.put("countList", countList); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + // + private Map>> querySpecialistStatisticsnew(String startTime,String endTime) + { + //String s = "select *from apply_b_mode_specialist a LEFT JOIN apply_b_mode b ON a.b_id = a.id where a.state = '70' and b.patient_name NOT LIKE '%测试%' "; + //List specialists = applyBModeSpecialistMapper.selectList(new EntityWrapper()); + //先前查询的时候把患者带测试病人加上去了现在改一下 + List> specialist = new ArrayList<>(); + List> countList = new ArrayList<>(); + Map>> map = new HashMap<>(); + EntityWrapper userWrapper = new EntityWrapper<>(); + userWrapper.eq("hospital_id","10001").eq("rid","6") + .notLike("user_name","%测试%").eq("se_name","超声科"); + try { + + //查询专家超声会诊的列表 这里要继续改 把会诊的 + List> specialists =applyBModeSpecialistMapper.selectbySpe( startTime,endTime); + + //统计专家实时超声会诊的列表 + //Map spSpecialistCount = specialists.stream() + + // .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + Map spSpecialistCount = specialists.stream() + .filter(entry -> entry.containsKey("speId")) // 确保每个 Map 都有 "speId" 键 + .map(entry -> (Long) entry.get("speId")) // 提取 speId + .filter(Objects::nonNull) // 过滤掉 null 值 + .collect(Collectors.groupingBy(speId -> speId, Collectors.counting())); + //检查部位会诊数量统计 + Map spSpecialistExaminePartSum = specialists.stream() + .filter(entry -> entry.containsKey("speId") && entry.containsKey("examinePartNum")) // 确保每个 Map 都有 "speId" 和 "examine_part_num" 键 + .filter(entry -> entry.get("speId") != null && entry.get("examinePartNum") != null) // 过滤掉 null 值 + .collect(Collectors.groupingBy( + entry -> (Long) entry.get("speId"), // 按 speId 分组 + Collectors.summingInt(entry -> (Integer) entry.get("examinePartNum")) // 累加每个 speId 对应的 examine_part_num + )); + //统计每个专家的会诊次数 + List userList = userMapper.selectList(userWrapper); + Map totalMap = new HashMap<>(); + Long totalSpCount = 0L; + Long totalpartCount = 0L; + //System.out.println("spSpecialistCount: " + spSpecialistCount); + //System.out.println("spSpecialistExaminePartSum: " + spSpecialistExaminePartSum); + for (User user : userList) { + Map userMap = new HashMap<>(); + Long spCount = spSpecialistCount.get(user.getId()) == null + ? 0L : spSpecialistCount.get(user.getId()); + //System.out.println("2Value from map: " + spSpecialistCount.get(user.getId())); + //System.out.println("Value from map: " + spSpecialistExaminePartSum.get(user.getId())); + Long partCount = spSpecialistExaminePartSum.get(user.getId()) == null + ? 0L : ((long)spSpecialistExaminePartSum.get(user.getId())); + userMap.put("userName",user.getUserName()); + userMap.put("lxCount",spCount); + userMap.put("partCount",partCount);//部位数 + //System.out.println(user.getUserName()+":"+spCount+"部位数:"+natureCount); + specialist.add(userMap); + totalSpCount = totalSpCount + spCount; + totalpartCount = totalpartCount + partCount; + } + //统计专家会诊次数的总数 + totalMap.put("totalLxCount",totalSpCount); + totalMap.put("totalpartCount",totalpartCount); + countList.add(totalMap); + map.put("specialist",specialist); + map.put("countList", countList); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + + } + + + private String accuracy(long num, long total) { + DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(); + //可以设置精确几位小数 + df.setMaximumFractionDigits(1); + //模式 例如四舍五入 + df.setRoundingMode(RoundingMode.HALF_UP); + double accuracyNum = 0.00; + if (total != 0) { + accuracyNum = (double) num / (double) total * 100; + } + return df.format(accuracyNum)+"%"; + } + @Override + public List> selectWorkTotalByTime(String startTime, String endTime,String conditions,String consultationMode,String categoryHospitalId) { + + + List results = applyBModeMapper.selectWorkTotalByTime(startTime + " 00:00:00",endTime + " 23:59:59",conditions,consultationMode,categoryHospitalId); + //特殊字段处理, + List excelvoList = results.stream().peek(result -> { + result.setNegativeAndPositive(convertGender(Long.valueOf(result.getNegativeAndPositive()))); + result.setConsultationMode(convertConsultationMode(result.getConsultationMode())); + result.setConditions(convertChaoshaoMode(result.getConditions())); + + }) + .collect(Collectors.toList()); + //log.info("所有数据"+excelvoList); + //处理重复数据 + List excelvos = handleDuplicate.handleDuplicateRecords(excelvoList); + + List> resultlist = excelvos.stream().map(a -> { + HashMap map = new HashMap<>(); + map.put("hospitalName", a.getHospitalName()); + map.put("consultationTime", a.getConsultationTime()); + map.put("consultationMode", a.getConsultationMode()); + map.put("imagingMethod", a.getImagingMethod()); + map.put("patientName", a.getPatientName()); + map.put("age", a.getAge()+"岁"); + map.put("gender", a.getGender()); + map.put("reportingTime", a.getReportingTime()); + map.put("reviewTime", a.getReviewTime()); + map.put("examinationSite", a.getExaminationSite()); + map.put("siteNumber", a.getSiteNumber()); + map.put("uploadDoctor", a.getUploadDoctor()); + map.put("reportingDoctor", a.getReportingDoctor()); + map.put("negativeAndPositive", a.getNegativeAndPositive()); + String timeStr = a.getDurationOfConsultation(); + double time = (double) Long.parseLong(timeStr) /60000; + String formatTime = String.format("%.2f", time); + String timeResult = formatHoursToHHMM(Double.parseDouble(formatTime)); + map.put("reportContent", a.getReportContent()); + map.put("durationOfConsultation", timeResult); + map.put("reviewedDoctorBegin","向爱清"); + map.put("reportingDoctorBegin","向爱清"); + map.put("esrdNumber", a.getEsrdNumber()); + map.put("conditions",a.getConditions()); + map.put("diagnosisConclusion", " "); + //如果数据库没有的话 + Integer siteNumber = a.getExaminePartNum() != null ? + a.getExaminePartNum() : + BodyPartCounter.countBodyPartCategories(a.getExaminationSite()); + map.put("siteNumber", siteNumber); + + return map; + }).collect(Collectors.toList()); + + + return resultlist; + } + private String convertGender(Long negative) { + return negative == 1 ? "阳" : (negative == 0 ? "阴" : "未知"); + } + + private String convertConsultationMode(String consultationMode) { + return consultationMode.equals("LX") ? "异步会诊" : (consultationMode.equals("YP") ? "椅旁会诊" : "视频会诊"); + } + private String convertChaoshaoMode(String consultationMode) { + return consultationMode.equals("A") ? "B超" : (consultationMode.equals("B") ? "经颅多普勒" : "骨密度"); + } + + public static String formatHoursToHHMM(double hours) { + int hourPart = (int) hours; + int minutes = (int) Math.round((hours - hourPart) * 60); + return hourPart + " 分钟 " + minutes + " 秒"; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java new file mode 100644 index 0000000..a1d27be --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeSpecialistMapper; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.service.ApplyBModeSpecialistService; + +@Service +public class ApplyBModeSpecialistServiceImpl extends ServiceImpl implements ApplyBModeSpecialistService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java new file mode 100644 index 0000000..bbc8f5a --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyCaseImgMapper; +import com.imurs.entity.ApplyCaseImg; +import com.imurs.service.ApplyCaseImgService; + +@Service +public class ApplyCaseImgServiceImpl extends ServiceImpl implements ApplyCaseImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java new file mode 100644 index 0000000..12df9ea --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java @@ -0,0 +1,97 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyCaseMapper; +import com.imurs.entity.ApplyCase; +import com.imurs.service.ApplyCaseService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyCaseServiceImpl extends ServiceImpl implements ApplyCaseService{ + + @Autowired + ApplyCaseMapper applyCaseMapper; + @Override + public List export(Map map) { + return applyCaseMapper.export(map); + } + @Override + public List getExport(Map map) { + return applyCaseMapper.getExport(map); + } + @Override + public List arrangeOutExport(Map map) { + return applyCaseMapper.arrangeOutExport(map); + } + @Override + public List arrangeGetExport(Map map) { + return applyCaseMapper.arrangeGetExport(map); + } + + @Override + public Pagetion selectCasePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectCasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectCasePage(map); + pagetion.setList(list); + return pagetion; + } + @Override + public ApplyCase selectCaseById(Long id) { + return applyCaseMapper.selectCaseById(id); + } + @Override + public Pagetion selectAdminCasePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectAdminCasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectAdminCasePage(map); + pagetion.setList(list); + return pagetion; + } + @Override + public int selectUpWayReferralNumer(Map upWayReferralMap) { + return applyCaseMapper.selectUpWayReferralNumer(upWayReferralMap); + } + @Override + public int selectDownWayReferralNumer(Map upWayReferralMap) { + return applyCaseMapper.selectDownWayReferralNumer(upWayReferralMap); + } + + @Override + public Pagetion selectCasePatient(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectCasePatient(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectCasePatient(map); + pagetion.setList(list); + return pagetion; + } + @Override + public Boolean updateByHis(Map map2) { + // TODO Auto-generated method stub + return applyCaseMapper.updateByHis(map2); + } + @Override + public Map selectPatientById(Map map) { + // 根据ID 查询患者信息 + return applyCaseMapper.selectPatientById(map); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java new file mode 100644 index 0000000..31cb752 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsulationSpecialistMapper; +import com.imurs.entity.ApplyConsulationSpecialist; +import com.imurs.service.ApplyConsulationSpecialistService; + +@Service +public class ApplyConsulationSpecialistServiceImpl extends ServiceImpl implements ApplyConsulationSpecialistService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java new file mode 100644 index 0000000..22b589a --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsultationImgMapper; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.service.ApplyConsultationImgService; + +@Service +public class ApplyConsultationImgServiceImpl extends ServiceImpl implements ApplyConsultationImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java new file mode 100644 index 0000000..2edd7bb --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java @@ -0,0 +1,77 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import com.imurs.util.page.CustomPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsultationMapper; +import com.imurs.entity.ApplyConsultation; +import com.imurs.service.ApplyConsultationService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyConsultationServiceImpl extends ServiceImpl implements ApplyConsultationService{ + + @Autowired + ApplyConsultationMapper applyConsultationMapper; + + @Override + public Pagetion selectConByCategory(Map map, Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConByCategory(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConByCategory(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public int selectConsultationNumer(Map downWayReferralMap) { + // TODO Auto-generated method stub + return applyConsultationMapper.selectConsultationNumer(downWayReferralMap); + } + + @Override + public Pagetion selectConPatient(Map map, Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConPatient(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConPatient(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectConsultationSpe(Map map,Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConsultationSpe(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConsultationSpe(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public CustomPage selectConByPage(Map map, Integer pageNo, Integer pageSize){ + + int count = applyConsultationMapper.selectConByPage(map).size(); + Pagetion pagetion = new Pagetion<>(pageNo, pageSize, count); + CustomPage customPage = new CustomPage<>(pageNo, pageSize, count); + map.put("start",pagetion.getStartIndex()); + map.put("end",pageSize); + List list = applyConsultationMapper.selectConByPage(map); + customPage.setRows(list); + return customPage; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java new file mode 100644 index 0000000..71f127b --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java @@ -0,0 +1,39 @@ +package com.imurs.service.impl; + + +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyDoctorPromoteMapper; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.service.ApplyDoctorPromoteService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyDoctorPromoteServiceImpl extends ServiceImpl implements ApplyDoctorPromoteService{ + @Autowired + ApplyDoctorPromoteMapper applyDoctorPromoteMapper; + @Override + public int selectrefresherCount(Map refresherNumerMap) { + // TODO Auto-generated method stub + return applyDoctorPromoteMapper.selectrefresherCount(refresherNumerMap); + } + + + + @Override + public Pagetion selectAdminPromote(Map map, Integer pageNo, Integer pageSize) { + int count=applyDoctorPromoteMapper.selectAdminPromote(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyDoctorPromoteMapper.selectAdminPromote(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java new file mode 100644 index 0000000..14a786a --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgImgMapper; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.service.ApplyEcgImgService; + +@Service +public class ApplyEcgImgServiceImpl extends ServiceImpl implements ApplyEcgImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java new file mode 100644 index 0000000..e9b2ca6 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java @@ -0,0 +1,45 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgMapper; +import com.imurs.entity.ApplyEcg; +import com.imurs.service.ApplyEcgService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyEcgServiceImpl extends ServiceImpl implements ApplyEcgService{ + + @Autowired + ApplyEcgMapper applyEcgMapper; + + @Override + public Pagetion selectEcgPage(Map map, Integer pageNo, Integer pageSize) { + int count=applyEcgMapper.selectEcgPage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyEcgMapper.selectEcgPage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectEcgSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyEcgMapper.selectEcgSpePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyEcgMapper.selectEcgSpePage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java new file mode 100644 index 0000000..e06a797 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgSpecialistMapper; +import com.imurs.entity.ApplyEcgSpecialist; +import com.imurs.service.ApplyEcgSpecialistService; + +@Service +public class ApplyEcgSpecialistServiceImpl extends ServiceImpl implements ApplyEcgSpecialistService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java new file mode 100644 index 0000000..bb9f9f0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyInformationImgMapper; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.service.ApplyInformationImgService; + +@Service +public class ApplyInformationImgServiceImpl extends ServiceImpl implements ApplyInformationImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java new file mode 100644 index 0000000..3ab64a0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java @@ -0,0 +1,52 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import com.imurs.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyInformationMapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.service.ApplyInformationService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyInformationServiceImpl extends ServiceImpl implements ApplyInformationService { + + @Autowired + ApplyInformationMapper applyInformationMapper; + + @Override + public List selectHospitalList(String hospitalName) { + // TODO Auto-generated method stub + return applyInformationMapper.selectHospitalList(hospitalName); + } + + @Override + public List selectInfromationList(Map infromationMap) { + // TODO Auto-generated method stub + return applyInformationMapper.selectInfromationList(infromationMap); + } + + @Override + public boolean updateBatchByIds(List applyInformation) { + return applyInformationMapper.updateByIds(applyInformation); + } + + + @Override + public Pagetion findAifmAdminPage(Map map, Integer pageNo, Integer pageSize) { + int resultCount = applyInformationMapper.findAifmAdminPage(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, resultCount); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list = applyInformationMapper.findAifmAdminPage(map); + pagetion.setList(list); + return pagetion; + } + + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java new file mode 100644 index 0000000..0c8bf52 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyLisMapper; +import com.imurs.entity.ApplyLis; +import com.imurs.service.ApplyLisService; + +@Service +public class ApplyLisServiceImpl extends ServiceImpl implements ApplyLisService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java new file mode 100644 index 0000000..2d11714 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyFileMapper; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.service.ApplyPathologyFileService; + +@Service +public class ApplyPathologyFileServiceImpl extends ServiceImpl implements ApplyPathologyFileService{ + +} + diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java new file mode 100644 index 0000000..e9e2050 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyImgMapper; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.service.ApplyPathologyImgService; + +@Service +public class ApplyPathologyImgServiceImpl extends ServiceImpl implements ApplyPathologyImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java new file mode 100644 index 0000000..f0476c7 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java @@ -0,0 +1,45 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyMapper; +import com.imurs.entity.ApplyPathology; +import com.imurs.service.ApplyPathologyService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyPathologyServiceImpl extends ServiceImpl implements ApplyPathologyService{ + + @Autowired + ApplyPathologyMapper applyPathologyMapper; + + @Override + public Pagetion selectAphPage(Map map, Integer pageNo, Integer pageSize) { + int count=applyPathologyMapper.selectAphPage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyPathologyMapper.selectAphPage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectAphSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyPathologyMapper.selectAphSpePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyPathologyMapper.selectAphSpePage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java new file mode 100644 index 0000000..65682e9 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologySpecialistMapper; +import com.imurs.entity.ApplyPathologySpecialist; +import com.imurs.service.ApplyPathologySpecialistService; + +@Service +public class ApplyPathologySpecialistServiceImpl extends ServiceImpl implements ApplyPathologySpecialistService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java new file mode 100644 index 0000000..eef7001 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplySpecialistMapper; +import com.imurs.entity.ApplySpecialist; +import com.imurs.service.ApplySpecialistService; + +@Service +public class ApplySpecialistServiceImpl extends ServiceImpl implements ApplySpecialistService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java new file mode 100644 index 0000000..6567e68 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java @@ -0,0 +1,46 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.BModeReportMapper; +import com.imurs.dao.BmodelHisotryMapper; +import com.imurs.dao.BmodelSecondMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.BModeHistory; +import com.imurs.entity.BModeReport; +import com.imurs.entity.User; +import com.imurs.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author wang + * @date 2022年02月23日 15:46 + */ +@Service +public class BModeHistoryServiceImpl extends ServiceImpl implements BModeHistoryService { + @Autowired + BModeHistoryService bModeHistoryService; + @Autowired + BmodelHisotryMapper bmodelHisotryMapper; + @Override + public List selectBmodeHis(Map map) { + // TODO Auto-generated method stub + return bmodelHisotryMapper.selectBmodeHis( map); + } + + + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java new file mode 100644 index 0000000..18e94e2 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java @@ -0,0 +1,227 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.BModeReportMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.BModeReport; +import com.imurs.entity.User; +import com.imurs.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.sql.Time; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author Laier + * @date 2022-11-23 14:14 + */ +@Service +public class BModeReportServiceImpl extends ServiceImpl implements BModeReportService { + @Autowired + ApplyBModeService applyBModeService; + @Autowired + ApplyBModeImgService applyBModeImgService; + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + @Autowired + BModeReportService bModeReportService; + @Autowired + UserService userService; + + /** + * 批量新增超声报告,并修改超声病例状态为待审核报告 + * @param bId 报告所属的病例id + * @param modeReports 报告信息列表 + * @return 返回新增后的报告列表 瞎JB 写,对方成功不成功也不知道,返回已经前端传过来 + * 可能有多份报告,而且每次报告是修改三个表,那只要其中一个表失败,直接此次失败吧。 + * @throws Exception + */ + @Override + @Transactional(rollbackFor = Exception.class) + public List insertModeReportList(Long bId, List modeReports) throws Exception { + ApplyBMode applyBMode = applyBModeService.selectById(bId); + List specialists = applyBModeSpecialistService.selectList(new EntityWrapper() + .eq("b_id", bId)); + if (applyBMode == null) { + return null; + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + // 1.把病例的信息填入报告中,并新增 + for (BModeReport modeReport : modeReports) { + List imageIdList = modeReport.getImageIdList(); + if (!CollectionUtils.isEmpty(imageIdList)) { + String imageIds = StringUtils.join(imageIdList,","); + modeReport.setImageIds(imageIds); + } + if (modeReport.getNature()==1 ){ + ApplyBMode updateNature = new ApplyBMode(); + updateNature.setId(bId); + updateNature.setNature(1); + applyBModeService.updateById(updateNature); + } + Long differenceInMillis=updateTime.getTime() - applyBMode.getApplyDate().getTime(); + // long hours = TimeUnit.MILLISECONDS.toHours(differenceInMillis); + // long minutes = TimeUnit.MILLISECONDS.toMinutes(differenceInMillis) % 60; + //System.out.println("时间"+differenceInMillis); + modeReport.setIntervalTime(differenceInMillis+""); + modeReport.setDiagnosisType(applyBMode.getDiagnosisType()); + modeReport.setDocId(applyBMode.getDocId()); + modeReport.setGroupDate(applyBMode.getGroupDate()); + modeReport.setCategoryHospitalId(applyBMode.getCategoryHospitalId()); + modeReport.setGroupHospitalId(applyBMode.getGroupHospitalId()); + // 状态改为结束报告 + modeReport.setActive(ModelActiveConstant.ACTIVE_CHECKING); + modeReport.setSpeId(specialists.get(0).getSpeId()); + modeReport.setUpdateTime(updateTime); + } + Boolean isBmoReport= bModeReportService.insertBatch(modeReports); + if(!isBmoReport) { + throw new Exception("报告插入失败"); + } + // 2.修改超声病例的会诊状态为结束 + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(bId); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_CHECKING); + Boolean isapplyb= applyBModeService.updateById(updateMode); + if(!isapplyb) { + throw new Exception("超声报告病例修改失败"); + } + // 更新专家表状态为已完成 + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + Boolean isapplybs= applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",modeReports.get(0).getSpeId()) + .eq("b_id",bId)); + if(!isapplybs) { + throw new Exception("更新专家表状态失败"); + } + return modeReports; + } + + /** + * 根据bId查询报告列表 + * @param bId 报告所属病例id + * @return + */ + @Override + public List selectModeReportListByBId(Long bId) { + return bModeReportService.selectList(new EntityWrapper() + .eq("b_id", bId)); + } + + /** + * 根据报告id查询报告详情 + * @param reportId + * @return + */ + @Override + public BModeReport selectModeReportByReportId(Long reportId) { + return bModeReportService.selectOne(new EntityWrapper() + .setSqlSelect("id," + + "examine_part as examinePart," + + "initial," + + "opinion," + + "b_see as bSee," + + "b_hint as bHint," + + "nature," + + "audit_doc as auditDoc," + + "audit_time as auditTime," + + "overall_opinion as overallOpinion," + + "image_ids as imageIds," + + "b_id as bId," + + "spe_id as speId," + + "update_doc as updateDoc," + + "interval_time as intervalTime," + + "update_time as updateTime ") + .eq("id",reportId)); + } + + /** + * 专家审核报告,并修改病例状态 + * @param modeReport + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void checkReportAndChangeModelState(BModeReport modeReport) throws ParseException { + // 如果修改图片则转换下格式list转string + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + // 1.专家审核报告,并修改报告状态为已审核 + modeReport.setActive(ModelActiveConstant.ACTIVE_FINISH); + modeReport.setUpdateTime(updateTime); + bModeReportService.updateById(modeReport); + // 2.查询同一病例的所有报告,是否全部审核完成 + List reports = bModeReportService.selectList(new EntityWrapper() + .setSqlSelect("active") + .eq("b_id", modeReport.getbId())); + // 把同一病例的所有报告的会诊状态值存入一个数组 + List collect = reports.stream().map(BModeReport::getActive).collect(Collectors.toList()); + // 如果collect里不存在2,则说明报告全部审核完成 + if (!collect.contains(ModelActiveConstant.ACTIVE_CHECKING)) { + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(modeReport.getbId()); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + // 审核完成后新增专家签名 + User user = userService.selectById(modeReport.getSpeId()); + if (user != null) { + updateMode.setSpecialistSignature(user.getSpecialistSignature()); + } + applyBModeService.updateById(updateMode); + applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",modeReport.getSpeId()) + .eq("b_id",modeReport.getbId())); + } + } + + // 专家提交报告流程:直接审核完成 + @Override + public List finishModeReport(Long bId,Long speId,List resultReports) throws ParseException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + for (BModeReport report : resultReports) { + report.setActive(ModelActiveConstant.ACTIVE_FINISH); + report.setUpdateTime(updateTime); + } + // 更新每个报告的状态为已完成 + bModeReportService.updateBatchById(resultReports); + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(bId); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + // 新增专家签名 + User user = userService.selectById(speId); + if (user != null) { + updateMode.setSpecialistSignature(user.getSpecialistSignature()); + } + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + // 更新病例状态为已完成,专家签名 + applyBModeService.updateById(updateMode); + // 更新专家表状态为已完成 + applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",speId) + .eq("b_id",bId)); + return resultReports; + } +} diff --git a/backend/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java new file mode 100644 index 0000000..b3201e8 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java @@ -0,0 +1,23 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisNextMapper; +import com.imurs.entity.BdiagnosisNext; +import com.imurs.service.BdiagnosisNextService; + +@Service +public class BdiagnosisNextServiceImpl extends ServiceImpl implements BdiagnosisNextService { + @Autowired + BdiagnosisNextMapper bdiagnosisNextMapper; + @Override + public List selectDiagnosisList(Integer id) { + // TODO Auto-generated method stub + return bdiagnosisNextMapper.selectDiagnosisList(id); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java new file mode 100644 index 0000000..62f5900 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisMapper; +import com.imurs.entity.Bdiagnosis; +import com.imurs.service.BdiagnosisService; +@Service +public class BdiagnosisServiceImpl extends ServiceImpl implements BdiagnosisService { + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java new file mode 100644 index 0000000..af3eec4 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java @@ -0,0 +1,36 @@ +package com.imurs.service.impl; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisMapper; +import com.imurs.dao.BmodeMachineModelMapper; +import com.imurs.entity.Bdiagnosis; +import com.imurs.entity.BmodeMachineModel; +import com.imurs.service.BmodeMachineModelService; + +@Service +public class BmodeMachineModelServiceImpl extends ServiceImpl implements BmodeMachineModelService { + + @Autowired + private BmodeMachineModelMapper BmodeMachineModelMapper; + + public Map selectMachineModel(){ + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List selectList = BmodeMachineModelMapper.selectList(wrapper); + map.put("MachineModellist", selectList); + return map; + } + + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java new file mode 100644 index 0000000..c6732f3 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java @@ -0,0 +1,25 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelFrisMapper; +import com.imurs.entity.BmodelFris; +import com.imurs.service.BmodelFrisService; + + + +@Service +public class BmodelFrisServiceImpl extends ServiceImpl implements BmodelFrisService { + @Autowired + BmodelFrisMapper bmodelFrisMapper; + @Override + public List selectBmodelFris(int id) { + // TODO Auto-generated method stub + return bmodelFrisMapper.selectBmodelFris(id); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java new file mode 100644 index 0000000..d170436 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java @@ -0,0 +1,25 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelSecondMapper; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; +import com.imurs.service.BmodelSecondService; + + + +@Service +public class BmodelSecondServiceImpl extends ServiceImpl implements BmodelSecondService { + @Autowired + BmodelSecondMapper bmodelSecondMapper; + @Override + public List selectbmodelSecond(int id) { + // TODO Auto-generated method stub + return bmodelSecondMapper.selectbmodelSecond(id); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java new file mode 100644 index 0000000..c3fde17 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelMapper; +import com.imurs.entity.Bmodel; +import com.imurs.service.BmodelService; + + +@Service +public class BmodelServiceImpl extends ServiceImpl implements BmodelService { + +} diff --git a/backend/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java new file mode 100644 index 0000000..27b0598 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java @@ -0,0 +1,20 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.CaseTemplateMapper; +import com.imurs.entity.CaseTemplate; +import com.imurs.service.CaseTemplateService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CaseTemplateServiceImpl extends ServiceImpl implements CaseTemplateService{ + @Override + public List listWithTree() { + + List caseTemplates = baseMapper.selectList(null); + + return caseTemplates; + } +} diff --git a/backend/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java new file mode 100644 index 0000000..4608077 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java @@ -0,0 +1,34 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ClinicalGuidelinesMapper; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.service.ClinicalGuidelinesService; +import com.imurs.util.page.Pagetion; + +@Service +public class ClinicalGuidelinesServiceImpl extends ServiceImpl implements ClinicalGuidelinesService{ + @Autowired + ClinicalGuidelinesMapper clinicalGuidelinesMapper; + + + @Override + public Pagetion selectCgsOrByDocIdPage(Map map, Integer pageNo, Integer pageSize) { + int count=clinicalGuidelinesMapper.selectCgsOrByDocIdPage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=clinicalGuidelinesMapper.selectCgsOrByDocIdPage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java new file mode 100644 index 0000000..13b8ea0 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java @@ -0,0 +1,90 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.DoctorArrangeMapper; +import com.imurs.entity.DoctorArrange; +import com.imurs.service.DoctorArrangeService; +import com.imurs.util.page.Pagetion; + +@Service +public class DoctorArrangeServiceImpl extends ServiceImpl + implements DoctorArrangeService { + + @Autowired + DoctorArrangeMapper doctorArrangeMapper; + + @Override + public List selectHonmeShowArrange() { + return doctorArrangeMapper.selectHonmeShowArrange(); + + } + + @Override + public List homeShowArrange(Map map) { + return doctorArrangeMapper.homeShowArrange(map); + } + + @Override + public DoctorArrange selectTotanumberDay(Map map) { + return doctorArrangeMapper.selectTotanumberDay(map); + } + + @Override + public List selectTotaDay(Map map) { + return doctorArrangeMapper.selectTotaDay(map); + } + + @Override + public Pagetion selectByArrangePage(Map map, Integer pageNo, Integer pageSize) { + int count = doctorArrangeMapper.selectByArrangePage(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list = doctorArrangeMapper.selectByArrangePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public DoctorArrange selectArrangeByUser(Long id) { + return doctorArrangeMapper.selectArrangeByUser(id); + } + + + + @Override + public int selectdoctorTotaDay(Map map) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectdoctorTotaDay(map); + } + + + @Override + public List selectDoctorArrangeList(Map doctorArrang) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectDoctorArrangeList(doctorArrang); + } + + + @Override + public Map selectAccreditedMedicalNumber(Map map1) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectAccreditedMedicalNumber(map1); + } + + + @Override + public List selectArrangeByRhId(String receiveHospitalId) { + return doctorArrangeMapper.selectArrangeByRhId(receiveHospitalId); + } + + +} diff --git a/backend/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java new file mode 100644 index 0000000..e44adff --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java @@ -0,0 +1,26 @@ +package com.imurs.service.impl; + + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.DoctorGroupMapper; +import com.imurs.entity.DoctorGroup; +import com.imurs.service.DoctorGroupService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Service实现 +* @createDate 2025-11-13 12:08:54 +*/ +@Service +public class DoctorGroupServiceImpl extends ServiceImpl + implements DoctorGroupService { + + +} + + + + diff --git a/backend/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java new file mode 100644 index 0000000..0a1e82a --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.HomePageShowMapper; +import com.imurs.entity.HomePageShow; +import com.imurs.service.HomePageShowService; + +@Service +public class HomePageShowServiceImpl extends ServiceImpl implements HomePageShowService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java new file mode 100644 index 0000000..2183113 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ImgArrangeMapper; +import com.imurs.entity.ImgArrange; +import com.imurs.service.ImgArrangeService; + +@Service +public class ImgArrangeServiceImpl extends ServiceImpl implements ImgArrangeService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java new file mode 100644 index 0000000..b395879 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java @@ -0,0 +1,10 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.InstallModelMapper; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Service; + +@Service +public class InstallModelServiceImpl extends ServiceImpl { +} diff --git a/backend/src/main/java/com/imurs/service/impl/LiveServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/LiveServiceImpl.java new file mode 100644 index 0000000..7b6b06e --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/LiveServiceImpl.java @@ -0,0 +1,31 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.LiveMapper; +import com.imurs.entity.Live; +import com.imurs.service.LiveService; +import com.imurs.util.page.Pagetion; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class LiveServiceImpl extends ServiceImpl implements LiveService { + + @Autowired + LiveMapper liveMapper; + + public Pagetion selectLivePage(Map map, Integer pageNo, Integer pageSize){ + + int count=liveMapper.selectLivePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=liveMapper.selectLivePage(map); + pagetion.setList(list); + return pagetion; + } +} diff --git a/backend/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java new file mode 100644 index 0000000..52467cb --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.LoginRecordMapper; +import com.imurs.entity.LoginRecord; +import com.imurs.service.LoginRecordService; + +@Service +public class LoginRecordServiceImpl extends ServiceImpl implements LoginRecordService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/PatientServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/PatientServiceImpl.java new file mode 100644 index 0000000..79fd1a7 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/PatientServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientMapper; +import com.imurs.entity.Patient; +import com.imurs.service.PatientService; + +@Service +public class PatientServiceImpl extends ServiceImpl implements PatientService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java new file mode 100644 index 0000000..94c1206 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import com.imurs.dao.PatientUserRecordImgMapper; +import com.imurs.entity.PatientUserRecordImg; +import com.imurs.service.PatientUserRecordImgService; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +@Service +public class PatientUserRecordImgServiceImpl extends ServiceImpl implements PatientUserRecordImgService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java new file mode 100644 index 0000000..b212076 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java @@ -0,0 +1,35 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientUserRecordMapper; +import com.imurs.entity.PatientUserRecord; +import com.imurs.service.PatientUserRecordService; +import com.imurs.util.page.Pagetion; + +@Service +public class PatientUserRecordServiceImpl extends ServiceImpl implements PatientUserRecordService{ + + @Autowired + PatientUserRecordMapper patientUserRecordMapper; + + + @Override + public Pagetion selectRecordPtUserPage(Map map,Integer pageNo,Integer pageSize) { + int count=patientUserRecordMapper.selectRecordPtUserPage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=patientUserRecordMapper.selectRecordPtUserPage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java new file mode 100644 index 0000000..e067350 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientUserMapper; +import com.imurs.entity.PatientUser; +import com.imurs.service.PatientUserService; + +@Service +public class PatientUserServiceImpl extends ServiceImpl implements PatientUserService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/RoleServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..6618949 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/RoleServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.RoleMapper; +import com.imurs.entity.Role; +import com.imurs.service.RoleService; + +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/SectionServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/SectionServiceImpl.java new file mode 100644 index 0000000..e4e9b9c --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/SectionServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.SectionMapper; +import com.imurs.entity.Section; +import com.imurs.service.SectionService; + +@Service +public class SectionServiceImpl extends ServiceImpl implements SectionService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..3386f13 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.SysMenuMapper; +import com.imurs.entity.SysMenu; +import com.imurs.service.SysMenuService; + +@Service +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java new file mode 100644 index 0000000..03d95b5 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalClinicalGuidelinesMapper; +import com.imurs.entity.TotalClinicalGuidelines; +import com.imurs.service.TotalClinicalGuidelinesService; + +@Service +public class TotalClinicalGuidelinesServiceImpl extends ServiceImpl implements TotalClinicalGuidelinesService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java new file mode 100644 index 0000000..aa2db3c --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java @@ -0,0 +1,31 @@ +package com.imurs.service.impl; + + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalInformationMapper; +import com.imurs.entity.TotalInformation; +import com.imurs.service.TotalInformationService; + +@Service +public class TotalInformationServiceImpl extends ServiceImpl implements TotalInformationService{ + + @Autowired + TotalInformationMapper totalInformationMapper; + @Override + public List selectTotalInformationAll(Map map) { + return totalInformationMapper.selectTotalInformationAll(map); + } + + @Override + public TotalInformation totaTotalInformation(Map map) { + return totalInformationMapper.totaTotalInformation(map); + } + + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java new file mode 100644 index 0000000..c2c4aea --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java @@ -0,0 +1,32 @@ +package com.imurs.service.impl; + + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalTrainingMapper; +import com.imurs.entity.TotalTraining; +import com.imurs.service.TotalTrainingService; + +@Service +public class TotalTrainingServiceImpl extends ServiceImpl implements TotalTrainingService{ + @Autowired + TotalTrainingMapper totalTrainingMapper; + + + @Override + public TotalTraining selectTotanNumberTraining(Map map) { + return totalTrainingMapper.selectTotanNumberTraining(map); + } + + + @Override + public Map selectLectureTrainingAndNember(Map map2) { + // TODO Auto-generated method stub + return totalTrainingMapper.selectLectureTrainingAndNember(map2); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java new file mode 100644 index 0000000..0b1618c --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingOpinionMapper; +import com.imurs.entity.TrainingOpinion; +import com.imurs.service.TrainingOpinionService; + +@Service +public class TrainingOpinionServiceImpl extends ServiceImpl implements TrainingOpinionService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java new file mode 100644 index 0000000..85ce5a9 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingPlanMapper; +import com.imurs.entity.TrainingPlan; +import com.imurs.service.TrainingPlanService; + +@Service +public class TrainingPlanServiceImpl extends ServiceImpl implements TrainingPlanService{ + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java new file mode 100644 index 0000000..9973847 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java @@ -0,0 +1,38 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingRecordMapper; +import com.imurs.entity.TrainingRecord; +import com.imurs.service.TrainingRecordService; +import com.imurs.util.page.Pagetion; + +@Service +public class TrainingRecordServiceImpl extends ServiceImpl implements TrainingRecordService{ + + @Autowired + TrainingRecordMapper trainingRecord; + + @Override + public Pagetion selectAdminRecord(Map map, Integer pageNo, Integer pageSize) { + int resultCount=trainingRecord.selectAdminRecord(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, resultCount); + + map.put("pageNo", pagetion.getStartIndex()); + map.put("pageSize",pageSize); + List list=trainingRecord.selectAdminRecord(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public TrainingRecord selectTrainingRecordById(Long id) { + return trainingRecord.selectTrainingRecordById(id); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java new file mode 100644 index 0000000..a7b65c1 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java @@ -0,0 +1,47 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingMapper; +import com.imurs.entity.Training; +import com.imurs.service.TrainingService; +import com.imurs.util.page.Pagetion; + +@Service +public class TrainingServiceImpl extends ServiceImpl implements TrainingService{ + @Autowired + private TrainingMapper trainingMapper; + + + @Override + public List selectTraining(Map map) { + return trainingMapper.selectTraining(map); + } + + + @Override + public int selectTotalTopicNumber(Map map) { + return trainingMapper.selectTotalTopicNumber(map); + } + + + @Override + public Pagetion selectBasePage(Map map, Integer pageNo, Integer pageSize) { + int count=trainingMapper.selectBasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=trainingMapper.selectBasePage(map); + pagetion.setList(list); + return pagetion; + + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/UserServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..e1c4cb2 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/UserServiceImpl.java @@ -0,0 +1,54 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.UserMapper; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import com.imurs.util.page.Pagetion; + +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + UserMapper userMapper; + + @Override + public Pagetion selectUserPageByDoc(Map map, Integer pageNo, Integer pageSize) { + int count = userMapper.selectUserPageByDoc(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("pageNo", pagetion.getStartIndex()); + map.put("pageSize", pageSize); + List list = userMapper.selectUserPageByDoc(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public User selectUserByUid(Long uid) { + return userMapper.selectUserByUid(uid); + } + + @Override + public Map selectByappuserID(Long id) { + return userMapper.selectByappuserID(id); + } + + @Override + public User selectUserByPhone(String phone) { + return userMapper.selectUserByPhone(phone); + } + + @Override + public boolean updateBatchByIds(List users) { + return userMapper.updateByIds(users); + } + +} diff --git a/backend/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java new file mode 100644 index 0000000..ad33477 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.VideoRecordMapper; +import com.imurs.entity.VideoRecord; +import com.imurs.service.VideoRecordService; + +@Service +public class VideoRecordServiceImpl extends ServiceImpl implements VideoRecordService { + +} diff --git a/backend/src/main/java/com/imurs/service/impl/WebLogImpl.java b/backend/src/main/java/com/imurs/service/impl/WebLogImpl.java new file mode 100644 index 0000000..c298ab6 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/WebLogImpl.java @@ -0,0 +1,11 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.WebLogMapper; +import com.imurs.entity.WebLog; +import com.imurs.service.WebLogService; +import org.springframework.stereotype.Service; + +@Service +public class WebLogImpl extends ServiceImpl implements WebLogService { +} diff --git a/backend/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java b/backend/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java new file mode 100644 index 0000000..d410d90 --- /dev/null +++ b/backend/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingFlowerMapper; +import com.imurs.entity.TrainingFlower; +import com.imurs.service.TrainingFlowerService; + +@Service +public class trainingFlowerServiceImpl extends ServiceImpl implements TrainingFlowerService{ + +} diff --git a/backend/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java b/backend/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java new file mode 100644 index 0000000..681341c --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java @@ -0,0 +1,64 @@ +package com.imurs.shiro; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; + +import com.alibaba.fastjson.JSON; + +/** + * @author dxy + * 自定义拦截未登录请求返回1002 + */ +public class CORSAuthenticationFilter extends FormAuthenticationFilter { + + + public CORSAuthenticationFilter() { + super(); + } + + @Override + public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + //Always return true if the request's method is OPTIONS + if (request instanceof HttpServletRequest) { + if ("GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod()) || + "POST".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) { + return true; + } + } + return super.isAccessAllowed(request, response, mappedValue); + // 部署到线上用下面的语句 +// return request instanceof HttpServletRequest && ((HttpServletRequest)request).getMethod().toUpperCase().equals("OPTIONS") ? true : super.isAccessAllowed(request, response, mappedValue); + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + HttpServletResponse res = (HttpServletResponse)response; + //跨域的header设置 +// response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin")); +// response.setHeader("Access-Control-Allow-Methods", request.getMethod()); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", +// request.getHeader("Access-Control-Request-Headers")); +// //防止乱码,适用于传输JSON数据 +// response.setHeader("Content-Type","application/json;charset=UTF-8"); +// response.setStatus(HttpStatus.OK.value()); + res.setHeader("Access-Control-Allow-Origin",((HttpServletRequest) request).getHeader("Origin") ); + res.setHeader("Access-Control-Allow-Methods", ((HttpServletRequest) request).getMethod()); + res.setStatus(HttpServletResponse.SC_OK); + res.setCharacterEncoding("UTF-8"); + PrintWriter writer = res.getWriter(); + Map map= new HashMap<>(); + map.put("msg", "1002"); + writer.write(JSON.toJSONString(map)); + writer.close(); + return false; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/shiro/JedisClientSingle.java b/backend/src/main/java/com/imurs/shiro/JedisClientSingle.java new file mode 100644 index 0000000..78a1124 --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/JedisClientSingle.java @@ -0,0 +1,178 @@ +/* package com.imurs.shiro; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import redis.clients.jedis.Client; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.util.Slowlog; + +@Component +public class JedisClientSingle { + + @Autowired + JedisPool jedisPool; + + // 获取redis 服务器信息 + public String getRedisInfo() { + Jedis jedis = null; + try { + // 连接本地的 Redis 服务 + jedis = jedisPool.getResource(); // 调用资源 + Client client = jedis.getClient(); + client.info(); + String info = client.getBulkReply(); + return info; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取日志列表 + public List getLogs(long entries) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + List logList = jedis.slowlogGet(entries); + return logList; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取日志条数 + public Long getLogsLen() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + long logLen = jedis.slowlogLen(); + return logLen; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 清空日志 + public String logEmpty() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.slowlogReset(); + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取占用内存大小 + public Long dbSize() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + // TODO 配置redis服务信息 + Client client = jedis.getClient(); + client.dbSize(); + return client.getIntegerReply(); + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 删除redis缓存 + public boolean delete(String key) { + Jedis jedis = null; + try { + // 连接本地的 Redis 服务 + jedis = jedisPool.getResource(); // 调用资源 + if (jedis.exists(key)) { + if (jedis.del(key) == 1) { + System.out.println("删除数据成功"); + return true; + } else { + System.out.println("删除数据失败"); + return false; + } + } else { + System.out.println(key + "不存在"); + return false; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + jedis.close(); + } + return false; + } + + // 设置超时时间 + public Long expire(String key, int seconds) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.expire(key, seconds); + jedis.close(); + return result; + } + + // 设置缓存 + public String set(String key, String value) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.set(key, value); + jedis.close(); + return result; + } + + // 获取缓存 + public String get(String key) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.get(key); + jedis.close(); + return result; + } + + // 判断是否存在缓存 + public Boolean exists(String key) { + Jedis jedis = jedisPool.getResource(); + Boolean result = jedis.exists(key); + jedis.close(); + return result; + } + + // 设置hash field为指定值,如果key不存在,则先创建 + public Long hset(String key, String field, String value) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.hset(key, field, value); + jedis.close(); + return result; + } + + // 获取指定的hash field + public String hget(String key, String field) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.hget(key, field); + jedis.close(); + return result; + } + + // 删除指定hash的field + public Long hdel(String key, String... field) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.hdel(key, field); + jedis.close(); + return result; + } + + // 测试指定field在hash中是否存在 + public Boolean hexists(String key, String field) { + Jedis jedis = jedisPool.getResource(); + Boolean result = jedis.hexists(key, field); + jedis.close(); + return result; + } +} +*/ \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java b/backend/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java new file mode 100644 index 0000000..01e65ee --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java @@ -0,0 +1,149 @@ +package com.imurs.shiro; + + +import java.io.Serializable; +import java.util.Deque; +import java.util.LinkedList; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + + +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; + +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; + +/** + * @author: WangSaiChao + * @date: 2018/5/23 + * @description: shiro 自定义filter 实现 并发登录控制 + */ +public class KickoutSessionControlFilter extends AccessControlFilter { + + /** 踢出后到的地址 */ + private String kickoutUrl; + + /** 踢出之前登录的/之后登录的用户 默认踢出之前登录的用户 */ + private boolean kickoutAfter = false; + + /** 同一个帐号最大会话数 默认1 */ + private int maxSession = 1; + private SessionManager sessionManager; + private Cache> cache; + + public void setKickoutUrl(String kickoutUrl) { + this.kickoutUrl = kickoutUrl; + } + + public void setKickoutAfter(boolean kickoutAfter) { + this.kickoutAfter = kickoutAfter; + } + + public void setMaxSession(int maxSession) { + this.maxSession = maxSession; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + public void setCacheManager(CacheManager cacheManager) { + this.cache = cacheManager.getCache("shiro-activeSessionCache"); + } + + /** + * 是否允许访问,返回true表示允许 + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) + throws Exception { + return false; + } + + /** + * 表示访问拒绝时是否自己处理,如果返回true表示自己不处理且继续拦截器链执行,返回false表示自己已经处理了(比如重定向到另一个页面)。 + */ + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + + System.out.println("================并发登录控制=================="); + Subject subject = getSubject(request, response); + if (!subject.isAuthenticated() && !subject.isRemembered()) { + // 如果没有登录,直接进行之后的流程 + return true; + } + + Session session = subject.getSession(); + // 这里获取的User是实体 因为我在 自定义ShiroRealm中的doGetAuthenticationInfo方法中 + // new SimpleAuthenticationInfo(user, password, getName()); 传的是 User实体 + // 所以这里拿到的也是实体,如果传的是userName 这里拿到的就是userName + String username=""; + if (subject.getPrincipal() != null) { + if (subject.getPrincipal().getClass().getName().equals("com.imurs.entity.ApplyInformation")) { + username=((ApplyInformation) subject.getPrincipal()).getAccount(); + }else{ + username=((User) subject.getPrincipal()).getPhone(); + } + } + Serializable sessionId = session.getId(); + + //ifDiffSystem不为空表示为超声系统登录,重新给username赋值用来区分两套系统以免互踢 + String ifDiffSystem = (String)session.getAttribute("ifDiffSystem"); + String token = ifDiffSystem == null ? username : (username + ifDiffSystem); + System.out.println("token===================>" + token); + // 初始化用户的队列放到缓存里 + Deque deque = cache.get(token); + if (deque == null) { + deque = new LinkedList(); + } + + // 如果队列里没有此sessionId,且用户没有被踢出;放入队列 + if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) { + deque.push(sessionId); + cache.put(token, deque); + } + + // 如果队列里的sessionId数超出最大会话数,开始踢人 + while (deque.size() > maxSession) { + Serializable kickoutSessionId = null; + if (kickoutAfter) { // 如果踢出后者 + kickoutSessionId = deque.removeFirst(); + System.out.println("------->踢出后者"); + } else { // 否则踢出前者 + kickoutSessionId = deque.removeLast(); + System.out.println("------->踢出前者"); + } + //踢出后更新缓存 + cache.put(token,deque); + try { + Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); + if (kickoutSession != null) { + // 设置会话的kickout属性表示踢出了 + kickoutSession.setAttribute("kickout", true); + } + } catch (Exception e) {// ignore exception + e.printStackTrace(); + } + } + if ( session.getAttribute("kickout") != null + && (Boolean) session.getAttribute("kickout") ) { + // 会话被踢出了 + try { + subject.logout(); + } catch (Exception e) { + e.printStackTrace(); + } + saveRequest(request); + WebUtils.issueRedirect(request, response, kickoutUrl); + return false; + } + return true; + } +} diff --git a/backend/src/main/java/com/imurs/shiro/LoginShiroController.java b/backend/src/main/java/com/imurs/shiro/LoginShiroController.java new file mode 100644 index 0000000..ec03a79 --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/LoginShiroController.java @@ -0,0 +1,424 @@ +package com.imurs.shiro; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.crypto.BadPaddingException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.LoginRecord; +import com.imurs.entity.PatientUser; +import com.imurs.entity.SysMenu; +import com.imurs.entity.User; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.LoginRecordService; +import com.imurs.service.SysMenuService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +@RestController +@RequestMapping("shiro") +public class LoginShiroController { + + @Autowired + SysMenuService sysMenuService; + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + @Autowired + LoginRecordService loginRecordService; + @Autowired + ApplyBModeService applyBModeService; + private static String privateKey = MsgCode.privateKeyString; + + @RequestMapping("/login") + public String login() { + return "login"; + } + + + @RequestMapping({"/loginUser"}) + @RateLimiterAspect + public Map loginUser(String phone, String password, String rid, HttpSession session, HttpServletRequest request, String ifDiffSystem,String sign) throws AuthenticationException { + Map map = new HashMap<>(); + try { + String ip = "loginUser" + HttpContextUtil.getIpAddress(); + + if (IpCacheManager.countIp(ip, 50)) { + String newpassword = RSAUtil.decrypt(password, privateKey); + + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(phone, newpassword, rid); + Subject subject = SecurityUtils.getSubject(); + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + subject.login((AuthenticationToken)usernamePasswordToken); + User user = (User)subject.getPrincipal(); + user.setLastTime(format.format(new Date())); + user.setLoginNumber(Integer.valueOf(user.getLoginNumber().intValue() + 1)); + String name = user.getUserName(); + if (name != null) + session.setAttribute("name", name); + if (ifDiffSystem != null) + session.setAttribute("ifDiffSystem", ifDiffSystem); + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(user.getId())); + loginRecord.setLoginName(user.getUserName()); + loginRecord.setRid(String.valueOf(user.getRid())); + addLoginRecord(loginRecord, request); + + this.userService.updateById(user); + map.put("user", user); + map.put("msg", "1"); + map.put("items", userMenu(user.getRpId()).get("items")); + } else { + map.put("msg", "13"); + } + } catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + System.out.println("e = " + e.getMessage()); + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (BadPaddingException e) { + map.put("msg", "密码错误"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RateLimiterAspect + @RequestMapping({"/loginHospital"}) + public Map loginHospital(String hospitalName, String password, String rid, HttpSession session, HttpServletRequest request, String ifDiffSystem) throws Exception { + Map map = new HashMap<>(); + String decrypt = RSAUtil.decrypt(password, privateKey); + System.out.println("hospitalName = " + hospitalName); + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(hospitalName, decrypt, rid); + Subject subject = SecurityUtils.getSubject(); + try { + String ip = "loginHospital" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ip, 50)) { + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + subject.login((AuthenticationToken)usernamePasswordToken); + ApplyInformation infor = (ApplyInformation)subject.getPrincipal(); + String className2 = subject.getPrincipal().getClass().getName(); + String name = infor.getHospitalName(); + if (name != null) + session.setAttribute("name", name); + if (ifDiffSystem != null) + session.setAttribute("ifDiffSystem", ifDiffSystem); + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(infor.getId())); + loginRecord.setLoginName(infor.getHospitalName()); + loginRecord.setRid(String.valueOf(infor.getRid())); + addLoginRecord(loginRecord, request); + session.setAttribute("infor", infor.getAccount()); + map.put("msg", "1"); + map.put("infor", infor); + map.put("items", userMenu(infor.getRpId()).get("items")); + } else { + map.put("msg", "13"); + } + } catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 患者登录 + * @param + * @param password + * @param + * @param session + * @param request + * @return + * @throws AuthenticationException + */ + @RequestMapping("/loginPtUser") + public Map loginPtUser(String account, String password,HttpSession session, + HttpServletRequest request) throws AuthenticationException { + Map map = new HashMap(); + try { + + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, password,"20"); + Subject subject = SecurityUtils.getSubject(); + + // timeout:-1000ms 永不超时 + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + Session session2 = SecurityUtils.getSubject().getSession(); + + subject.login(usernamePasswordToken); // 完成登录 + PatientUser ptUser = (PatientUser) subject.getPrincipal(); + + //把登录用户的名称放入session + String name = ptUser.getPtName(); + if (name != null) { + session.setAttribute("name",name); + } + + //获取登录ip登录者姓名id 角色 + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(ptUser.getId())); + loginRecord.setLoginName(ptUser.getPtName()); + loginRecord.setRid("20"); + addLoginRecord(loginRecord, request); + + map.put("ptUser", ptUser); + map.put("msg", "1"); + }catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 医生忘记密码 + */ + @RequestMapping("updateUserPassword") + public Map updateUserPassword(User user){ + Map map = new HashMap<>(); + EntityWrapper wrapper= new EntityWrapper<>(); + wrapper.eq("phone", user.getPhone()); + try { + //9.16修改 + String password = RSAUtil.decrypt(user.getPassword(), privateKey); + User user1 = userService.selectOne(wrapper); + if (user1 != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + user.setPassword(passwordEncoder.encode(password)); + boolean result=userService.update(user, wrapper); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg","3"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + /** + * 医院忘记密码 + */ + @RequestMapping("updateHospitalPassword") + public Map updateHospitalPassword(ApplyInformation infor){ + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("dean_phone", infor.getDeanPhone()); + try { + //9.16修改 + String password = RSAUtil.decrypt(infor.getPassword(), privateKey); + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + infor.setPassword(passwordEncoder.encode(password)); + boolean result = applyInformationService.update(infor, wrapper); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg","3"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping("/logout") + public Map logout(HttpSession session) { + Map map = new HashMap(); + Subject subject = SecurityUtils.getSubject(); + String name=(String) session.getAttribute("name"); + System.out.println("退出的user"+name); + + + ApplyBMode applyBMode2 = new ApplyBMode(); + applyBMode2.setActive(5);; + EntityWrapper wrapper4 = new EntityWrapper(); + wrapper4.eq("login_doc", name).eq("status", "40"); + applyBModeService.update(applyBMode2, wrapper4); + subject.logout(); + map.put("msg", "1"); + //session.removeAttribute("user"); + return map; + } + + @RequestMapping(value = "/unauth") + public Map unauth() { + Map map = new HashMap(); + map.put("msg", "10"); + return map; + } + + @RequestMapping(value = "/error") + public Map error() { + Map map = new HashMap(); + map.put("msg", "10001"); + return map; + } + + + + /** + * 查询当前登录的用户所拥有的菜单权限 + * @return + */ + public Map userMenu(String rpId){ + Map map=new HashMap(); + String[] str=null; + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + try { + if(StringUtils.isNotEmpty(rpId)){ + str=rpId.split(","); + for (int i = 0; i < str.length; i++) { + if(str.length-i==1){ + wrapper.eq("id", str[i]).eq("menu_state", "1"); + }else{ + wrapper.eq("id", str[i]).eq("menu_state", "1").or(); + } + } + smList=sysMenuService.selectList(wrapper.orderBy("id")); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).distinct().collect(Collectors.toList()); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : tableNames) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + }else{ + map.put("items", "3"); + } + }else{ + map.put("items", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("items", "2"); + } + return map; + } + + /** + * 新增登录记录 + * @param loginRecord + * @return + */ + //@RequestMapping(value="addLoginRecord") + public Map addLoginRecord(LoginRecord loginRecord,HttpServletRequest request) throws Exception { + Map map=new HashMap(); + + try { + /** + * 获取访问用户的客户端IP(适用于公网与局域网). + */ + if (request == null) { + throw (new Exception("getIpAddr method HttpServletRequest Object is null")); + } + String ipString = request.getHeader("x-forwarded-for"); + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getRemoteAddr(); + } + + // 多个路由时,取第一个非unknown的ip + final String[] arr = ipString.split(","); + for (final String str : arr) { + if (!"unknown".equalsIgnoreCase(str)) { + ipString = str; + break; + } + } + //获取登录ip + loginRecord.setIp(ipString); + boolean result=loginRecordService.insert(loginRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java b/backend/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java new file mode 100644 index 0000000..3a11d0d --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java @@ -0,0 +1,28 @@ +package com.imurs.shiro; + +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.credential.SimpleCredentialsMatcher; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @author wang + * @date 2021年08月05日 10:27 + * 自定义shiro的密码验证,使用spring的加密,原理是md5加盐 + */ +public class MyCredentialsMatcher extends SimpleCredentialsMatcher { + + @Override + public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { + // 要验证的原密码 + char[] check = (char[])getCredentials(token); + String tokenCredentials = String.valueOf(check); + // 数据库的加密密码 + String accountCredentials = (String)getCredentials(info); + // 使用spring的加盐密码来验证 + BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); + // BCryptPasswordEncoder会比对原密码和加盐加密后的密码 + return bCryptPasswordEncoder.matches(tokenCredentials, accountCredentials); + } + +} diff --git a/backend/src/main/java/com/imurs/shiro/MyExceptionHandler.java b/backend/src/main/java/com/imurs/shiro/MyExceptionHandler.java new file mode 100644 index 0000000..2801092 --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/MyExceptionHandler.java @@ -0,0 +1,39 @@ +//package com.imurs.shiro; +// +// +//import com.alibaba.fastjson.support.spring.FastJsonJsonView; +//import org.apache.shiro.authz.UnauthenticatedException; +//import org.apache.shiro.authz.UnauthorizedException; +//import org.springframework.web.servlet.HandlerExceptionResolver; +//import org.springframework.web.servlet.ModelAndView; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * Created by Administrator on 2017/12/11. +// * 全局异常处理 +// */ +//public class MyExceptionHandler implements HandlerExceptionResolver { +// +// public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) { +// ModelAndView mv = new ModelAndView(); +// FastJsonJsonView view = new FastJsonJsonView(); +// Map attributes = new HashMap(); +// if (ex instanceof UnauthenticatedException) { +// attributes.put("code", "1000001"); +// attributes.put("msg", "token错误"); +// } else if (ex instanceof UnauthorizedException) { +// attributes.put("code", "1000002"); +// attributes.put("msg", "用户无权限"); +// } else { +// attributes.put("code", "1000003"); +// attributes.put("msg", ex.getMessage()); +// } +// +// view.setAttributesMap(attributes); +// mv.setView(view); +// return mv; +// } +//} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/shiro/MySessionManager.java b/backend/src/main/java/com/imurs/shiro/MySessionManager.java new file mode 100644 index 0000000..db85ef8 --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/MySessionManager.java @@ -0,0 +1,39 @@ +package com.imurs.shiro; + +import org.apache.shiro.web.servlet.ShiroHttpServletRequest; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.apache.shiro.web.util.WebUtils; +import org.springframework.util.StringUtils; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.Serializable; + +/** + * Created by Administrator on 2017/12/11. + * 自定义sessionId获取 + */ +public class MySessionManager extends DefaultWebSessionManager { + + private static final String AUTHORIZATION = "Authorization"; + + private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; + + public MySessionManager() { + super(); + } + + @Override + protected Serializable getSessionId(ServletRequest request, ServletResponse response) { + String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION); + //如果请求头中有 Authorization 则其值为sessionId + if (!StringUtils.isEmpty(id)) { + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE); + return id; + } else { + //否则按默认规则从cookie取sessionId + return super.getSessionId(request, response); + } + } +} diff --git a/backend/src/main/java/com/imurs/shiro/MyShiroRealm.java b/backend/src/main/java/com/imurs/shiro/MyShiroRealm.java new file mode 100644 index 0000000..eb064de --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/MyShiroRealm.java @@ -0,0 +1,102 @@ +package com.imurs.shiro; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.PatientUser; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientUserService; +import com.imurs.service.UserService; +import com.imurs.shiro.MyShiroRealm; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Resource; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.util.ByteSource; +import org.springframework.beans.factory.annotation.Autowired; + +public class MyShiroRealm extends AuthorizingRealm { + @Resource + UserService userService; + + @Resource + ApplyInformationService applyInformationService; + + @Autowired + PatientUserService patientUserService; + + protected final Map sessionMap = new HashMap<>(); + + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + UsernamePasswordToken utoken = (UsernamePasswordToken) token; + if (StringUtils.isNotEmpty(utoken.getHost()) + && java.util.Arrays.asList("1", "2", "3", "6", "7").contains(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("contact_phone", utoken.getUsername()); + User user = (User) this.userService.selectOne((Wrapper) wrapper); + if (user != null) { + if (user.getState().intValue() == 2) + throw new LockedAccountException(); + ApplyInformation infor = (ApplyInformation) this.applyInformationService.selectById(user.getHospitalId()); + if (infor != null) + user.setHospitalName(infor.getHospitalName()); + return (AuthenticationInfo) new SimpleAuthenticationInfo(user, user + .getPassword(), + + getClass().getName()); + } + } else if (StringUtils.isNotEmpty(utoken.getHost()) && "0".equals(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("hospital_name", utoken.getUsername()); + ApplyInformation infor = (ApplyInformation) this.applyInformationService.selectOne((Wrapper) wrapper); + if (infor != null) { + if (infor.getState().intValue() == 2) + throw new LockedAccountException(); + if (infor.getRid().longValue() == 9L && !utoken.getHost().equals(String.valueOf(infor.getRid()))) + throw new UnknownAccountException(); + if ((infor.getRid().longValue() != 1L && utoken.getHost().equals("1")) + || (infor.getRid().longValue() != 9L && utoken.getHost().equals("9"))) { + System.out.println("================================================================"); + System.out.println(" infor.rid= " + infor.getRid() + "token.rid=" + utoken.getHost()); + throw new UnknownAccountException(); + } + return (AuthenticationInfo) new SimpleAuthenticationInfo(infor, infor + .getPassword(), + + getClass().getName()); + } + } else if (StringUtils.isNotEmpty(utoken.getHost()) && "20".equals(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("account", utoken.getUsername()); + PatientUser ptUser = (PatientUser) this.patientUserService.selectOne((Wrapper) wrapper); + if (ptUser != null) { + if (ptUser.getState().intValue() == 2) + throw new LockedAccountException(); + return (AuthenticationInfo) new SimpleAuthenticationInfo(ptUser, ptUser + .getPassword(), + + getClass().getName()); + } + } + return null; + } + + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { + User user = (User) principal.fromRealm(getClass().getName()).iterator().next(); + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addStringPermission(user.getRpId()); + return (AuthorizationInfo) info; + } +} diff --git a/backend/src/main/java/com/imurs/shiro/ShiroConfig.java b/backend/src/main/java/com/imurs/shiro/ShiroConfig.java new file mode 100644 index 0000000..d582c9f --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/ShiroConfig.java @@ -0,0 +1,234 @@ +package com.imurs.shiro; + +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.io.ResourceUtils; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + + +import net.sf.ehcache.CacheManager; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created by Administrator on 2017/12/11. + */ +@Configuration +public class ShiroConfig { + + + + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + System.out.println("shiro启动成功!!"); + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + + //自定义拦截器限制并发人数 + LinkedHashMap filtersMap = new LinkedHashMap<>(); + //限制同一帐号同时在线的个数 + filtersMap.put("kickout", kickoutSessionControlFilter()); + shiroFilterFactoryBean.setFilters(filtersMap); + + LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); + + //注意过滤器配置顺序 不能颠倒 + //配置不会被拦截的链接 顺序判断 + //filterChainDefinitionMap.put("/shiro/loginUser", "kickout,anon"); + //filterChainDefinitionMap.put("/shiro/loginHospital", "kickout,anon"); + filterChainDefinitionMap.put("/shiro/loginUser", "anon"); + filterChainDefinitionMap.put("/shiro/loginHospital", "anon"); + + filterChainDefinitionMap.put("/shiro/*", "anon"); + filterChainDefinitionMap.put("/api/*", "anon"); + filterChainDefinitionMap.put("/register/*", "anon"); + filterChainDefinitionMap.put("/html/*", "anon"); + filterChainDefinitionMap.put("/note/*", "anon"); + filterChainDefinitionMap.put("/send/sendmsg", "anon"); + filterChainDefinitionMap.put("/send/forgetPwd", "anon"); + filterChainDefinitionMap.put("/note/*", "anon"); + filterChainDefinitionMap.put("/sendNote/*", "anon"); + filterChainDefinitionMap.put("/infor/findAifmGroup", "anon"); + filterChainDefinitionMap.put("/infor/findAifmById", "anon"); + filterChainDefinitionMap.put("/user/selectUserById", "anon"); + filterChainDefinitionMap.put("/user/selectUserJy", "anon"); + filterChainDefinitionMap.put("/user/getAllDocByCategoryHospital", "anon"); + filterChainDefinitionMap.put("/home/findHomeListById", "anon"); + filterChainDefinitionMap.put("/home/findHomeListPage", "anon"); + filterChainDefinitionMap.put("/section/selectSectionById", "anon"); + //filterChainDefinitionMap.put("/Ocrcontroller/*", "anon"); + filterChainDefinitionMap.put("/ptUser/registerPtUser", "anon"); + filterChainDefinitionMap.put("/ptUser/selectPtPhone", "anon"); + filterChainDefinitionMap.put("/ptUser/updatePtUserPassword*", "anon"); + filterChainDefinitionMap.put("/record/*", "anon"); + filterChainDefinitionMap.put("/agoraApi/*", "anon"); + filterChainDefinitionMap.put("/ws/asset/*","anon"); + filterChainDefinitionMap.put("/report/*","anon"); + filterChainDefinitionMap.put("/bmode/updateBmode", "anon"); + filterChainDefinitionMap.put("/shiro/logout", "logout"); + + //filterChainDefinitionMap.put("/*/*", "anon"); + + //未登录拦截 + filterChainDefinitionMap.put("/agora/*", "authc"); + filterChainDefinitionMap.put("/bmode/*", "authc"); + filterChainDefinitionMap.put("/case/*", "authc"); + filterChainDefinitionMap.put("/con/*", "authc"); + filterChainDefinitionMap.put("/promote/*", "authc"); + filterChainDefinitionMap.put("/ecg/*", "authc"); + filterChainDefinitionMap.put("/infor/*", "authc"); + filterChainDefinitionMap.put("/apply/*", "authc"); + filterChainDefinitionMap.put("/icon/*", "authc"); + filterChainDefinitionMap.put("/BmodeSendMsg/*", "authc"); + filterChainDefinitionMap.put("/Bscan/*", "authc"); + filterChainDefinitionMap.put("/cgs/*", "authc"); + filterChainDefinitionMap.put("/data/*", "authc"); + filterChainDefinitionMap.put("/JyHiS/*", "authc"); + filterChainDefinitionMap.put("/AllinOne/*", "authc"); + filterChainDefinitionMap.put("/arrange/*", "authc"); + filterChainDefinitionMap.put("/docfa/*", "authc"); + filterChainDefinitionMap.put("/home/*", "authc"); + filterChainDefinitionMap.put("/login/*", "authc"); + filterChainDefinitionMap.put("/loginRecord/*", "authc"); + filterChainDefinitionMap.put("/Ocrcontroller/*", "authc"); + filterChainDefinitionMap.put("/patient/*", "authc"); + filterChainDefinitionMap.put("/section/*", "authc"); + filterChainDefinitionMap.put("/jyNote/*", "authc"); + filterChainDefinitionMap.put("/jyNoteTest/*", "authc"); + filterChainDefinitionMap.put("/SVS/*", "authc"); + filterChainDefinitionMap.put("/menu/*", "authc"); + filterChainDefinitionMap.put("/totalInformation/*", "authc"); + filterChainDefinitionMap.put("/training/*", "authc"); + filterChainDefinitionMap.put("/trainingPlan/*", "authc"); + filterChainDefinitionMap.put("/trainingRecord/*", "authc"); + filterChainDefinitionMap.put("/user/*", "authc"); + filterChainDefinitionMap.put("/video/*", "authc"); + filterChainDefinitionMap.put("/sound/*", "authc"); + filterChainDefinitionMap.put("/exce/*", "authc"); + filterChainDefinitionMap.put("/wechat/*", "authc"); + filterChainDefinitionMap.put("/record/*", "authc"); + filterChainDefinitionMap.put("/**", "kickout,authc"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + + //自定义过滤器 + Map filterMap = shiroFilterFactoryBean.getFilters(); + filterMap.put("authc", new CORSAuthenticationFilter()); + shiroFilterFactoryBean.setFilters(filterMap); + return shiroFilterFactoryBean; + } + + + /** + * 注入自定义的凭证匹配器MyCredentialsMatcher进行密码验证 + * 我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 + * @return myShiroRealm + */ + @Bean + public MyShiroRealm myShiroRealm() { + MyShiroRealm myShiroRealm = new MyShiroRealm(); + myShiroRealm.setCredentialsMatcher(new MyCredentialsMatcher()); + return myShiroRealm; + } + + + + /** + * 自定义sessionManager + * @return + */ + @Bean + public SessionManager sessionManager(){ + MySessionManager shiroSessionManager = new MySessionManager(); + //这里可以不设置。Shiro有默认的session管理。如果缓存为Redis则需改用Redis的管理 + shiroSessionManager.setSessionDAO(new EnterpriseCacheSessionDAO()); + return shiroSessionManager; + } + + /** + * 配置管理层。即安全控制层 + * @return + */ + @Bean(name="securityManager") + public SecurityManager securityManager(EhCacheManager ehCacheManager){ + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(myShiroRealm()); + //自定义session管理 + securityManager.setSessionManager(sessionManager()); + //自定义缓存实现 + securityManager.setCacheManager(ehCacheManager); + return securityManager; + } + + /** + * 缓存管理器 + * 可能已经存在CacheManager,在ehcache-core 2.5版本之后再次创建CacheManager会失败 + * @return + */ + @Bean + public EhCacheManager ehCacheManager() { + CacheManager cacheManager = CacheManager.getCacheManager("es"); + //cacheManager不存在才创建,否则不创建 + if(cacheManager == null){ + try { + cacheManager = CacheManager.create(ResourceUtils.getInputStreamForPath("classpath:ehcache-shiro.xml")); + } catch (IOException e) { + throw new RuntimeException("initialize cacheManager failed"); + } + } + EhCacheManager ehCacheManager = new EhCacheManager(); + ehCacheManager.setCacheManager(cacheManager); + return ehCacheManager; + } + + /** + * 开启shiro aop注解支持. + * 使用代理方式;所以需要开启代码支持; + * + * @param securityManager + * @return + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + /** + * 注册全局异常处理 + * @return + */ +// @Bean(name = "exceptionHandler") +// public HandlerExceptionResolver handlerExceptionResolver() { +// return new MyExceptionHandler(); +// } +// + /** + * 并发登录控制 + * @return + */ + @Bean + public KickoutSessionControlFilter kickoutSessionControlFilter(){ + KickoutSessionControlFilter kickoutSessionControlFilter = new KickoutSessionControlFilter(); + //用于根据会话ID,获取会话进行踢出操作的; + kickoutSessionControlFilter.setSessionManager(sessionManager()); + //使用cacheManager获取相应的cache来缓存用户登录的会话;用于保存用户—会话之间的关系的; + kickoutSessionControlFilter.setCacheManager(ehCacheManager()); + //是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户; + kickoutSessionControlFilter.setKickoutAfter(false); + //同一个用户最大的会话数,默认1;比如2的意思是同一个用户允许最多同时两个人登录; + kickoutSessionControlFilter.setMaxSession(1); + //被踢出后重定向到的地址 + kickoutSessionControlFilter.setKickoutUrl("https://lunqincs.jysmyy.com/#/login"); + return kickoutSessionControlFilter; + } +} diff --git a/backend/src/main/java/com/imurs/shiro/ShiroUtils.java b/backend/src/main/java/com/imurs/shiro/ShiroUtils.java new file mode 100644 index 0000000..f97d0ec --- /dev/null +++ b/backend/src/main/java/com/imurs/shiro/ShiroUtils.java @@ -0,0 +1,60 @@ +package com.imurs.shiro; + +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.SimpleHash; + +public class ShiroUtils { + /** + * 随机生成 salt 需要指定 它的字符串的长度 + * + * @param len 字符串的长度 + * @return salt + */ + public static String generateSalt(int len) { + //一个Byte占两个字节 + int byteLen = len >> 1; + SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator(); + return secureRandom.nextBytes(byteLen).toHex(); + } + + /** + * 获取加密后的密码,使用默认hash迭代的次数 1 次 + * + * @param hashAlgorithm hash算法名称 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 + * @param password 需要加密的密码 + * @param salt 盐 + * @return 加密后的密码 + */ + public static String encryptPassword(String hashAlgorithm, String password, String salt) { + return encryptPassword(hashAlgorithm, password, salt, 1); + } + + /** + * 获取加密后的密码,需要指定 hash迭代的次数 + * + * @param hashAlgorithm hash算法名称 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 + * @param password 需要加密的密码 + * @param salt 盐 + * @param hashIterations hash迭代的次数 + * @return 加密后的密码 + */ + public static String encryptPassword(String hashAlgorithm, String password, String salt, int hashIterations) { + SimpleHash hash = new SimpleHash(hashAlgorithm, password, salt, hashIterations); + return hash.toString(); + } +/* + public void save(User user) { + //user.setCreateDate(new Date()); + // 密码加密 方式很多,任选 + *//* String salt = RandomStringUtils.randomAlphanumeric(20); + sysUser.setPassword(new Sha256Hash(sysUser.getPassword(), salt).toHex());*//* + + String salt = generateSalt(20); + user.setPassword(encryptPassword("MD5", user.getPassword(), salt)); + user.setSalt(salt); + sysUser.setUsername(sysUser.getEmail()); + sysUser.setStatus(SysConstant.SysUserStatus.ACTIVE); + sysUser.setType(SysConstant.SysUserType.USER); + sysUserDao.save(sysUser); + }*/ +} diff --git a/backend/src/main/java/com/imurs/sound/AsrMain.java b/backend/src/main/java/com/imurs/sound/AsrMain.java new file mode 100644 index 0000000..e3c1d52 --- /dev/null +++ b/backend/src/main/java/com/imurs/sound/AsrMain.java @@ -0,0 +1,203 @@ +package com.imurs.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Base64; + +import org.json.JSONException; +import org.json.JSONObject; + +public class AsrMain { + + public AsrMain(String path){ + this.filename=path; + } + public AsrMain(InputStream is){ + this.input=is; + } + + // 填写网页上申请的appkey 如 $apiKey="g8eBUMSokVB1BHGmgxxxxxx" + private final String appKey = "XOApTttzAapb3YsomfKlvDRh"; + + // 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx" + private final String secretKey = "CsXyWpN5RtwtiLwURb0Afb8GZnu5Klig"; + + // 需要识别的文件 + private String filename = null;// D:\\16k.pcm E:\\voicesource\\tr5.pcm + //需要传的流----自定义 + private InputStream input =null; + + + // 文件格式 + private final String format = "pcm"; + + // 1537 表示识别普通话,使用输入法模型。1536表示识别普通话,使用搜索模型。 其它语种参见文档 + private final int dev_pid = 1537; + + private String cuid = "1234567JAVA"; + + // 采样率固定值 + private final int rate = 16000; + + public boolean methodRaw = false; // 默认以json方式上传音频文件 + + private final String url = "https://vop.baidu.com/server_api"; // 可以改为https + + public String run() throws IOException, DemoException, JSONException { + TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.TTS_SCOPE); + holder.resfresh(); + String token = holder.getToken(); + String result = null; + if (methodRaw) { + result = runRawPostMethod(token); + } else { + + result = runJsonPostMethod(token); + } + return result; + } + + private String runRawPostMethod(String token) throws IOException, DemoException { + String url2 = url + "?cuid=" + ConnUtil.urlEncode(cuid) + "&dev_pid=" + dev_pid + "&token=" + token; + // System.out.println(url2); + byte[] content = getFileContent(filename); + HttpURLConnection conn = (HttpURLConnection) new URL(url2).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestProperty("Content-Type", "audio/" + format + "; rate=" + rate); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.getOutputStream().write(content); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + return result; + } + + public String runJsonPostMethod(String token) throws DemoException, IOException, JSONException { + //测试进入json 查看路径 + //System.out.println(filename+"百度语音路径数据"); + byte[] content = getFileContent(filename); + String speech = base64Encode(content); + + JSONObject params = new JSONObject(); + params.put("dev-pid", dev_pid); + params.put("format", format); + params.put("rate", rate); + params.put("token", token); + params.put("cuid", cuid); + params.put("channel", "1"); + params.put("len", content.length); + params.put("speech", speech); + + // System.out.println(params.toString()); + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + return result; + } + + private byte[] getFileContent(String filename) throws DemoException, IOException { + File file = new File(filename); + if (!file.canRead()) { + // System.err.println("文件不存在或者不可读: " + file.getAbsolutePath()); + throw new DemoException("file cannot read: " + file.getAbsolutePath()); + } + FileInputStream is = null; + try { + is = new FileInputStream(file); + return ConnUtil.getInputStreamContent(is); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + private String base64Encode(byte[] content) { + + Base64.Encoder encoder = Base64.getEncoder(); // JDK 1.8 推荐方法 + String str = encoder.encodeToString(content); + + +// char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库 +// String str = new String(chars); + + return str; + } + //将输入流转换为二进制数据 + private byte[] getByteContent(InputStream ins) throws IOException{ + return ConnUtil.getInputStreamContent(ins); + + } + //将byte[]上传语音到百度服务器上 + public String runJsonPostMethodIns(String token) throws DemoException, IOException, JSONException { + //测试进入json 查看路径 + // System.out.println("百度流的方法"); + byte[] content = getByteContent(input); + String speech = base64Encode(content); + + JSONObject params = new JSONObject(); + params.put("dev-pid", dev_pid); + params.put("format", format); + params.put("rate", rate); + params.put("token", token); + params.put("cuid", cuid); + params.put("channel", "1"); + params.put("len", content.length); + params.put("speech", speech); + + // System.out.println(params.toString()); + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + /* conn.setRequestProperty("Content-type", "text/html"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8");*/ + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + // result=new String(result.getBytes("GBK"),"UTF-8"); + // System.out.println(System.getProperty("file.encoding")+"file解码"); + + //获取系统默认的字符编 + // System.out.println(Charset.defaultCharset()); + + + //获取系统默认语言 + + // System.out.println(System.getProperty("user.language")); + + //获取系统属性列表 + + // System.getProperties().list(System.out); + + // System.out.println("runJsonPostMethonIns"+result); + return result; + } + //将byte[]上传语音到百度服务器上 + public String runins() throws IOException, DemoException, JSONException { + TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.TTS_SCOPE); + holder.resfresh(); + String token = holder.getToken(); + String result = runJsonPostMethodIns(token); +// String retest= ConnUtil.urlEncode(result); +// System.out.println(retest+"解码后的格式"); + // System.out.println("字节流"+result); + return result; + } +} diff --git a/backend/src/main/java/com/imurs/sound/ConnUtil.java b/backend/src/main/java/com/imurs/sound/ConnUtil.java new file mode 100644 index 0000000..8c11836 --- /dev/null +++ b/backend/src/main/java/com/imurs/sound/ConnUtil.java @@ -0,0 +1,100 @@ +package com.imurs.sound; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * 与连接相关的Util类 + */ +public class ConnUtil { + + /** + * UrlEncode, UTF-8 编码 + * + * @param str 原始字符串 + * @return + */ + public static String urlEncode(String str) { + String result = null; + try { + result = URLEncoder.encode(str, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 从HttpURLConnection 获取返回的字符串 + * + * @param conn + * @return + * @throws IOException + * @throws DemoException + */ + public static String getResponseString(HttpURLConnection conn) throws IOException, DemoException { + return new String(getResponseBytes(conn)); + } + + /** + * 从HttpURLConnection 获取返回的bytes + * 注意 HttpURLConnection自身问题, 400类错误,会直接抛出异常。不能获取conn.getInputStream(); + * + * @param conn + * @return + * @throws IOException http请求错误 + * @throws DemoException http 的状态码不是 200 + */ + public static byte[] getResponseBytes(HttpURLConnection conn) throws IOException, DemoException { + int responseCode = conn.getResponseCode(); + InputStream errorStream = null; + + if (responseCode != 200) { + // System.err.println("http 请求返回的状态码错误,期望200, 当前是 " + responseCode); + /* if (responseCode == 401) { + System.err.println("可能是appkey appSecret 填错"); + }*/ + String errorDetail = null; + errorStream=conn.getErrorStream(); + if (errorStream != null) { + // 读取错误响应体内容 + errorDetail = new String(getInputStreamContent(errorStream), StandardCharsets.UTF_8); + System.out.println("错误原因"+" "+errorDetail); + } + throw new DemoException("http response code is" + responseCode); + } + + InputStream inputStream = conn.getInputStream(); + byte[] result = getInputStreamContent(inputStream); + return result; + } + + /** + * 将InputStream内的内容全部读取,作为bytes返回 + * + * @param is + * @return + * @throws IOException @see InputStream.read() + */ + public static byte[] getInputStreamContent(InputStream is) throws IOException { + byte[] b = new byte[1024]; + // 定义一个输出流存储接收到的数据 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // 开始接收数据 + int len = 0; + while (true) { + len = is.read(b); + if (len == -1) { + // 数据读完 + break; + } + byteArrayOutputStream.write(b, 0, len); + } + return byteArrayOutputStream.toByteArray(); + } +} diff --git a/backend/src/main/java/com/imurs/sound/DemoException.java b/backend/src/main/java/com/imurs/sound/DemoException.java new file mode 100644 index 0000000..f8ce8aa --- /dev/null +++ b/backend/src/main/java/com/imurs/sound/DemoException.java @@ -0,0 +1,12 @@ +package com.imurs.sound; + +public class DemoException extends Exception { + /** + * + */ + private static final long serialVersionUID = 1L; + + public DemoException(String message) { + super(message); + } +} diff --git a/backend/src/main/java/com/imurs/sound/TokenHolder.java b/backend/src/main/java/com/imurs/sound/TokenHolder.java new file mode 100644 index 0000000..b3da365 --- /dev/null +++ b/backend/src/main/java/com/imurs/sound/TokenHolder.java @@ -0,0 +1,128 @@ +package com.imurs.sound; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * token的获取类 + * 将apiKey和secretKey换取token,注意有效期保存在expiresAt + */ +public class TokenHolder { + + + public static final String ASR_SCOPE = "audio_voice_assistant_get"; + + public static final String TTS_SCOPE = "audio_tts_post"; + + /** + * url , Token的url,http可以改为https + */ + private static final String url = "http://openapi.baidu.com/oauth/2.0/token"; + + /** + * asr的权限 scope 是 "audio_voice_assistant_get" + * tts 的权限 scope 是 "audio_tts_post" + */ + private String scope; + + /** + * 网页上申请语音识别应用获取的apiKey + */ + private String apiKey="XOApTttzAapb3YsomfKlvDRh"; + + /** + * 网页上申请语音识别应用获取的secretKey + */ + private String secretKey="CsXyWpN5RtwtiLwURb0Afb8GZnu5Klig"; + + /** + * 保存访问接口获取的token + */ + private String token; + + /** + * 当前的时间戳,毫秒 + */ + private long expiresAt; + + /** + * @param apiKey 网页上申请语音识别应用获取的apiKey + * @param secretKey 网页上申请语音识别应用获取的secretKey + */ + public TokenHolder(String apiKey, String secretKey, String scope) { + this.apiKey = apiKey; + this.secretKey = secretKey; + this.scope = scope; + } + + + /** + * 获取token,refresh 方法后调用有效 + * + * @return + */ + public String getToken() { + return token; + } + + /** + * 获取过期时间,refresh 方法后调用有效 + * + * @return + */ + public long getExpiresAt() { + return expiresAt; + } + + + + + /** + * 获取token + * + * @return + * @throws IOException http请求错误 + * @throws DemoException http接口返回不是 200, access_token未获取 + * @throws JSONException + */ + public void resfresh() throws IOException, DemoException, JSONException { + String getTokenURL = url + "?grant_type=client_credentials" + + "&client_id=" + ConnUtil.urlEncode(apiKey) + "&client_secret=" + ConnUtil.urlEncode(secretKey); + + // 打印的url出来放到浏览器内可以复现 + // System.out.println("token url:" + getTokenURL); + + URL url = new URL(getTokenURL); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + String result = ConnUtil.getResponseString(conn); + // System.out.println("Token result json:" + result); + parseJson(result); + } + + /** + * @param result token接口获得的result + * @throws DemoException + * @throws JSONException + */ + private void parseJson(String result) throws DemoException, JSONException { + JSONObject json = new JSONObject(result); + if (!json.has("access_token")) { + // 返回没有access_token字段 + throw new DemoException("access_token not obtained, " + result); + } + if (!json.has("scope")) { + // 返回没有scope字段 + throw new DemoException("scopenot obtained, " + result); + } + if (!json.getString("scope").contains(scope)) { + throw new DemoException("scope not exist, " + scope + "," + result); + } + token = json.getString("access_token"); + expiresAt = System.currentTimeMillis() + json.getLong("expires_in") * 1000; + } +} diff --git a/backend/src/main/java/com/imurs/util/Agora.java b/backend/src/main/java/com/imurs/util/Agora.java new file mode 100644 index 0000000..e2fd8cc --- /dev/null +++ b/backend/src/main/java/com/imurs/util/Agora.java @@ -0,0 +1,250 @@ +package com.imurs.util; + + + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import io.agora.media.RtcTokenBuilder2; +import io.agora.media.RtcTokenBuilder2.Role; +import io.agora.rest.AgoraException; +import io.agora.rest.AgoraService; +import io.agora.rest.core.AgoraProperty; +import io.agora.rest.core.BasicAuthCredential; +import io.agora.rest.core.Credential; +import io.agora.rest.core.RegionArea; +import io.agora.rest.services.cloudrecording.api.req.StartResourceReq; +import io.agora.rest.services.cloudrecording.api.res.AcquireResourceRes; +import io.agora.rest.services.cloudrecording.api.res.StartResourceRes; +import io.agora.rest.services.cloudrecording.api.res.StopResourceRes; +import io.agora.rest.services.cloudrecording.scenario.mix.req.AcquireMixRecordingResourceClientReq; +import io.agora.rest.services.cloudrecording.scenario.mix.req.StartMixRecordingResourceClientReq; +import io.agora.rest.services.cloudrecording.scenario.mix.res.QueryMixHLSAndMP4RecordingResourceRes; + +public class Agora { + + // 定义关键参数 + private static String appId = ""; + private static String username = "3d97647625104cf884b023d41e576344"; + private static String password = "31cdaa5e869442ec84aff0b45354a950"; + private static String token = ""; + + private static String cname = "testchannel"; + private static String uid = "123"; + + // 配置云存储 + private static String accessKey = "LTAImVN6wtEJLfH1"; + private static String secretKey = "lO7FsV3pxSaP6lcd8KP9SsfBIeFhPw"; + private static Integer region = 1; + private static String bucket = "ydlqcs"; + private static Integer vendor = 2; + + public static void main(String[] args) throws Exception { + + Credential basicAuthCredential = new BasicAuthCredential(username, password); + + // 初始化 AgoraService + AgoraService agoraService = new AgoraService( + AgoraProperty.builder() + .appId(appId) + .credential(basicAuthCredential) + // Specify the region where the server is located. + // Optional values are CN, NA, EU, AP, and the client will automatically + // switch to use the best domain name according to the configured region + .regionArea(RegionArea.CNRegionArea) + .build() + ); + + + AcquireResourceRes acquireResourceRes; + + // 申请录制服务器资源 + try { + acquireResourceRes = agoraService.cloudRecording() + .mixScenario() + .acquire(cname, uid, AcquireMixRecordingResourceClientReq.builder() + .build()) + .block(); + } catch (AgoraException e) { + System.out.printf("agora error:%s", e.getMessage()); + return; + } catch (Exception e) { + System.out.printf("unknown error:%s", e.getMessage()); + return; + } + + // Check if the response is null + if (acquireResourceRes == null || acquireResourceRes.getResourceId() == null) { + System.out.println("failed to get resource"); + return; + } + + + System.out.printf("resourceId:%s", acquireResourceRes.getResourceId()); + + System.out.println("acquire resource success"); + + // 配置云存储 + StartResourceReq.StorageConfig storageConfig = StartResourceReq.StorageConfig.builder() + .accessKey(accessKey) + .secretKey(secretKey) + .bucket(bucket) + .vendor(vendor) + .region(region) + // 设置录制生成文件的存储路径 + //.fileNamePrefix("") + .build(); + + // 定义录制选项 + StartMixRecordingResourceClientReq startResourceReq = StartMixRecordingResourceClientReq.builder() + .token(token) + .recordingConfig(StartResourceReq.RecordingConfig.builder() + .channelType(1) + .build()) + .recordingFileConfig(StartResourceReq.RecordingFileConfig.builder() + .avFileType(Arrays.asList("hls", "mp4")) + .build()) + .storageConfig(storageConfig) + .build(); + + + StartResourceRes startResourceRes; + + // 开始录制 + try { + startResourceRes = agoraService.cloudRecording() + .mixScenario() + .start(cname, uid, + acquireResourceRes.getResourceId(), + startResourceReq) + .block(); + + } catch (AgoraException e) { + System.out.printf("agora error:%s", e.getMessage()); + return; + } catch (Exception e) { + System.out.printf("unknown error:%s", e.getMessage()); + return; + } + + // Check if the response is null + if (startResourceRes == null || startResourceRes.getSid() == null) { + System.out.println("failed to start resource"); + return; + } + + System.out.printf("sid:%s", startResourceRes.getSid()); + + System.out.println("start resource success"); + + Thread.sleep(10000); + + QueryMixHLSAndMP4RecordingResourceRes queryResourceRes; + + // 查询录制状态 + try { + queryResourceRes = agoraService.cloudRecording() + .mixScenario() + .queryHLSAndMP4(startResourceRes.getResourceId(), startResourceRes.getSid()) + .block(); + + } catch (AgoraException e) { + System.out.printf("agora error:%s", e.getMessage()); + return; + } catch (Exception e) { + System.out.printf("unknown error:%s", e.getMessage()); + return; + } + + if (queryResourceRes == null || queryResourceRes.getServerResponse() == null) { + System.out.println("failed to query resource"); + return; + } + + System.out.println("query resource success"); + + Thread.sleep(3000); + + StopResourceRes stopResourceRes; + + // 停止录制 + try { + stopResourceRes = agoraService.cloudRecording() + .mixScenario() + .stop(cname, uid, startResourceRes.getResourceId(), startResourceRes.getSid(), + true) + .block(); + } catch (AgoraException e) { + System.out.printf("agora error:%s", e.getMessage()); + return; + } catch (Exception e) { + System.out.printf("unknown error:%s", e.getMessage()); + return; + } + + // Check if the response is null + if (stopResourceRes == null || stopResourceRes.getSid() == null) { + System.out.println("failed to stop resource"); + } else { + System.out.println("stop resource success"); + } + + } + public Map StartRecord(){ + + return null; + + } + public String reasourceid() { + Credential basicAuthCredential = new BasicAuthCredential(username, password); + + // 初始化 AgoraService + AgoraService agoraService = new AgoraService( + AgoraProperty.builder() + .appId(appId) + .credential(basicAuthCredential) + // Specify the region where the server is located. + // Optional values are CN, NA, EU, AP, and the client will automatically + // switch to use the best domain name according to the configured region + .regionArea(RegionArea.CNRegionArea) + .build() + ); + + + AcquireResourceRes acquireResourceRes; + + // 申请录制服务器资源 + try { + acquireResourceRes = agoraService.cloudRecording() + .mixScenario() + .acquire(cname, uid, AcquireMixRecordingResourceClientReq.builder() + .build()) + .block(); + } catch (AgoraException e) { + System.out.printf("agora error:%s", e.getMessage()); + return e.getMessage(); + } catch (Exception e) { + System.out.printf("unknown error:%s", e.getMessage()); + return e.getMessage(); + } + + // Check if the response is null + if (acquireResourceRes == null || acquireResourceRes.getResourceId() == null) { + System.out.println("failed to get resource"); + return "failed to get resource"; + } + return acquireResourceRes.getResourceId(); + } + //获取tokenid + private String Toeknid(String cname,String appid,String uid) throws Exception, Exception{ + String appCertificate ="c2809b8ba09e431e84097d60b4406e0a"; + int tokenExpirationInSeconds = 3600; + int privilegeExpirationInSeconds = 3600; + RtcTokenBuilder2 token = new RtcTokenBuilder2(); + String result = token.buildTokenWithUserAccount(appid, appCertificate, cname, uid, Role.ROLE_PUBLISHER, tokenExpirationInSeconds, privilegeExpirationInSeconds); + System.out.printf("Token with uid: %s\n", result); + return uid; + + } +} diff --git a/backend/src/main/java/com/imurs/util/DateUtils.java b/backend/src/main/java/com/imurs/util/DateUtils.java new file mode 100644 index 0000000..8088f3f --- /dev/null +++ b/backend/src/main/java/com/imurs/util/DateUtils.java @@ -0,0 +1,922 @@ +package com.imurs.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 创作者链接:https://blog.csdn.net/sunnyzyq/article/details/125377621 + * @author zyq + * @since 2022/6/17 + */ +public class DateUtils { + + /** 一星期的天数 */ + public static final int WEEK_DAYS = 7; + /** 一年的月份数 */ + public static final int YEAR_MONTHS = 12; + /** 一天的小时数 */ + public static final int DAY_HOURS = 24; + /** 一小时分钟数 */ + public static final int HOUR_MINUTES = 60; + /** 一天分钟数 (24 * 60) */ + public static final int DAY_MINUTES = 1440; + /** 一分钟的秒数 */ + public static final int MINUTE_SECONDS = 60; + /** 一个小时的秒数 (60 * 60) */ + public static final int HOUR_SECONDS = 3600; + /** 一天的秒数 (24 * 60 * 60) */ + public static final int DAY_SECONDS = 86400; + /** 一秒的毫秒数 */ + public static final long SECOND_MILLISECONDS = 1000L; + /** 一分钟的毫秒数(60 * 1000) */ + public static final long MINUTE_MILLISECONDS = 60000L; + /** 一小时的毫秒数(60 * 60 * 1000) */ + public static final long HOUR_MILLISECONDS = 3600000L; + /** 一天的毫秒数(24 * 60* 60* 1000) */ + public static final long DAY_MILLISECONDS = 86400000L; + /** 星期一 */ + public static final int WEEK_1_MONDAY = 1; + /** 星期二 */ + public static final int WEEK_2_TUESDAY = 2; + /** 星期三 */ + public static final int WEEK_3_WEDNESDAY = 3; + /** 星期四 */ + public static final int WEEK_4_THURSDAY = 4; + /** 星期五 */ + public static final int WEEK_5_FRIDAY = 5; + /** 星期六 */ + public static final int WEEK_6_SATURDAY = 6; + /** 星期天 */ + public static final int WEEK_7_SUNDAY = 7; + /** 一月 */ + public static final int MONTH_1_JANUARY = 1; + /** 二月 */ + public static final int MONTH_2_FEBRUARY = 2; + /** 三月 */ + public static final int MONTH_3_MARCH = 3; + /** 四月 */ + public static final int MONTH_4_APRIL= 4; + /** 五月 */ + public static final int MONTH_5_MAY = 5; + /** 六月 */ + public static final int MONTH_6_JUNE = 6; + /** 七月 */ + public static final int MONTH_7_JULY = 7; + /** 八月 */ + public static final int MONTH_8_AUGUST = 8; + /** 九月 */ + public static final int MONTH_9_SEPTEMBER = 9; + /** 十月 */ + public static final int MONTH_10_OCTOBER = 10; + /** 十一月 */ + public static final int MONTH_11_NOVEMBER = 11; + /** 十二月 */ + public static final int MONTH_12_DECEMBER= 12; + /** 显示到日期 */ + public static final String FORMAT_DATE = "yyyy-MM-dd"; + /** 显示到小时 */ + public static final String FORMAT_HOUR = "yyyy-MM-dd HH"; + /** 显示到分 */ + public static final String FORMAT_MINUTE = "yyyy-MM-dd HH:mm"; + /** 显示到秒 */ + public static final String FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss"; + /** 显示到毫秒 */ + public static final String FORMAT_MILLISECOND = "yyyy-MM-dd HH:mm:ss:SSS"; + /** 显示到日期(数字格式) */ + public static final String FORMAT_NO_DATE = "yyyyMMdd"; + /** 显示到小时(数字格式) */ + public static final String FORMAT_NO_HOUR = "yyyyMMddHH"; + /** 显示到分(数字格式) */ + public static final String FORMAT_NO_MINUTE = "yyyyMMddHHmm"; + /** 显示到秒(数字格式) */ + public static final String FORMAT_NO_SECOND = "yyyyMMddHHmmss"; + /** 显示到毫秒(数字格式) */ + public static final String FORMAT_NO_MILLISECOND = "yyyyMMddHHmmssSSS"; + /** 时间格式化器集合 */ + private static final Map simpleDateFormatMap = new HashMap(); + static { + simpleDateFormatMap.put(FORMAT_DATE, new SimpleDateFormat(FORMAT_DATE)); + simpleDateFormatMap.put(FORMAT_HOUR, new SimpleDateFormat(FORMAT_HOUR)); + simpleDateFormatMap.put(FORMAT_MINUTE, new SimpleDateFormat(FORMAT_MINUTE)); + simpleDateFormatMap.put(FORMAT_SECOND, new SimpleDateFormat(FORMAT_SECOND)); + simpleDateFormatMap.put(FORMAT_MILLISECOND, new SimpleDateFormat(FORMAT_MILLISECOND)); + simpleDateFormatMap.put(FORMAT_NO_DATE, new SimpleDateFormat(FORMAT_NO_DATE)); + simpleDateFormatMap.put(FORMAT_NO_HOUR, new SimpleDateFormat(FORMAT_NO_HOUR)); + simpleDateFormatMap.put(FORMAT_NO_MINUTE, new SimpleDateFormat(FORMAT_NO_MINUTE)); + simpleDateFormatMap.put(FORMAT_NO_SECOND, new SimpleDateFormat(FORMAT_NO_SECOND)); + simpleDateFormatMap.put(FORMAT_NO_MILLISECOND, new SimpleDateFormat(FORMAT_NO_MILLISECOND)); + } + + /** + * 获取指定时间格式化器 + * + * @param formatStyle 时间格式 + * @return 时间格式化器 + */ + private static SimpleDateFormat getSimpleDateFormat(String formatStyle) { + SimpleDateFormat dateFormat = simpleDateFormatMap.get(formatStyle); + if (Objects.nonNull(dateFormat)) { + return dateFormat; + } + return new SimpleDateFormat(formatStyle); + } + + /** + * 将 Date 格式时间转化为指定格式时间 + * + * @param date Date 格式时间 + * @param formatStyle 转化指定格式(如: yyyy-MM-dd HH:mm:ss) + * @return 转化格式时间 + */ + public static String format(Date date, String formatStyle) { + if (Objects.isNull(date)) { + return ""; + } + return getSimpleDateFormat(formatStyle).format(date); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd 格式时间(如:2022-06-17) + */ + public static String formatDate(Date date) { + return format(date, FORMAT_DATE); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd HH:mm:ss 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd HH:mm:ss 格式时间(如:2022-06-17 16:06:17) + */ + public static String formatDateTime(Date date) { + return format(date, FORMAT_SECOND); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd HH:mm:ss:SSS 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd HH:mm:ss:SSS 格式时间(如:2022-06-17 16:06:17:325) + */ + public static String formatDateTimeStamp(Date date) { + return format(date, FORMAT_MILLISECOND); + } + + /** + * 将 yyyy-MM-dd 格式时间转化为 Date 格式时间 + * + * @param dateString yyyy-MM-dd 格式时间(如:2022-06-17) + * @return Date 格式时间 + */ + public static Date parseDate(String dateString) { + return parse(dateString, FORMAT_DATE); + } + + /** + * 将 yyyy-MM-dd HH:mm:ss 格式时间转化为 Date 格式时间 + * + * @param dateTimeStr yyyy-MM-dd HH:mm:ss 格式时间(如:2022-06-17 16:06:17) + * @return Date 格式时间 + */ + public static Date parseDateTime(String dateTimeStr) { + return parse(dateTimeStr, FORMAT_SECOND); + } + + /** + * 将 yyyy-MM-dd HH:mm:ss:SSS 格式时间转化为 Date 格式时间 + * + * @param dateTimeStr yyyy-MM-dd HH:mm:ss:SSS 格式时间(如:2022-06-17 16:06:17) + * @return Date 格式时间 + */ + public static Date parseDateTimeStamp(String dateTimeStampStr) { + return parse(dateTimeStampStr, FORMAT_MILLISECOND); + } + + /** + * 将字符串格式时间转化为 Date 格式时间 + * + * @param dateString 字符串时间(如:2022-06-17 16:06:17) + * @return formatStyle 格式内容 + * @return Date 格式时间 + */ + public static Date parse(String dateString, String formatStyle) { + String s = getString(dateString); + if (s.isEmpty()) { + return null; + } + try { + return getSimpleDateFormat(formatStyle).parse(dateString); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取字符串有效内容 + * + * @param s 字符串 + * @return 有效内容 + */ + private static String getString(String s) { + return Objects.isNull(s) ? "" : s.trim(); + } + + /** + * 获取一天的开始时间(即:0 点 0 分 0 秒 0 毫秒) + * + * @param date 指定时间 + * @return 当天的开始时间 + */ + public static Date getDateStart(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * 获取一天的截止时间(即:23 点 59 分 59 秒 999 毫秒) + * + * @param date 指定时间 + * @return 当天的开始时间 + */ + public static Date getDateEnd(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + + /** + * 获取日期数字 + * + * @param date 日期 + * @return 日期数字 + */ + public static int getDateNo(Date date) { + if (Objects.isNull(date)) { + return 0; + } + return Integer.valueOf(format(date, FORMAT_NO_DATE)); + } + + /** + * 获取日期时间数字(到秒) + * + * @param date 日期 + * @return 日期数字 + */ + public static long getDateTimeNo(Date date) { + if (Objects.isNull(date)) { + return 0L; + } + return Long.valueOf(format(date, FORMAT_NO_SECOND)); + } + + /** + * 获取日期时间数字(到毫秒) + * + * @param date 日期 + * @return 日期数字 + */ + public static long getDateTimeStampNo(Date date) { + if (Objects.isNull(date)) { + return 0L; + } + return Long.valueOf(format(date, FORMAT_NO_MILLISECOND)); + } + + /** + * 获取星期几 + * + * @param date 时间 + * @return 0(时间为空), 1(周一), 2(周二),3(周三),4(周四),5(周五),6(周六),7(周日) + */ + public static int getWeek(Date date) { + if (Objects.isNull(date)) { + return 0; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return getWeek(calendar); + } + + /** + * 获取星期几 + * + * @param date 时间 + * @return 0(时间为空), 1(周一), 2(周二),3(周三),4(周四),5(周五),6(周六),7(周日) + */ + private static int getWeek(Calendar calendar) { + switch (calendar.get(Calendar.DAY_OF_WEEK)) { + case Calendar.MONDAY: + return 1; + case Calendar.TUESDAY: + return 2; + case Calendar.WEDNESDAY: + return 3; + case Calendar.THURSDAY: + return 4; + case Calendar.FRIDAY: + return 5; + case Calendar.SATURDAY: + return 6; + case Calendar.SUNDAY: + return 7; + default: + return 0; + } + } + + /** + * 获取该日期是今年的第几周(以本年的周一为第1周,详见下面说明)
+ * + * 【说明】
+ * 比如 2022-01-01(周六)和 2022-01-02(周日)虽然在 2022 年里,但他们两天则属于 2021 年最后一周,
+ * 那么这两天不会算在 2022 年第 1 周里,此时会返回 0 ;而 2022 年第 1 周将从 2022-01-03(周一) 开始计算。
+ * + * @param date 时间 + * @return -1(时间为空), 0(为上个年的最后一周),其他数字(今年的第几周) + */ + public static int getWeekOfYear(Date date) { + if (Objects.isNull(date)) { + return -1; + } + int weeks = getWeekOfYearIgnoreLastYear(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MONTH, Calendar.JANUARY); + calendar.set(Calendar.DAY_OF_MONTH, 1); + int week = getWeek(calendar); + if (week == 1) { + return weeks; + } + return weeks - 1; + } + + /** + * 获取今年的第几周(以本年的1月1日为第1周第1天)
+ * + * @param date 时间 + * @return -1(时间为空),其他数字(今年的第几周) + */ + public static int getWeekOfYearIgnoreLastYear(Date date) { + if (Objects.isNull(date)) { + return -1; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int days = calendar.get(Calendar.DAY_OF_YEAR); + int weeks = days / 7; + // 如果是 7 的倍数,则表示恰好是多少周 + if (days % 7 == 0) { + return weeks; + } + // 如果有余数,则需要再加 1 + return weeks + 1; + } + + /** + * 获取时间节点对象 + * + * @param date 时间对象 + * @return DateNode + */ + public static DateNode getDateNode(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + DateNode node = new DateNode(); + node.setTime(format(date, FORMAT_MILLISECOND)); + node.setYear(calendar.get(Calendar.YEAR)); + node.setMonth(calendar.get(Calendar.MONTH) + 1); + node.setDay(calendar.get(Calendar.DAY_OF_MONTH)); + node.setHour(calendar.get(Calendar.HOUR_OF_DAY)); + node.setMinute(calendar.get(Calendar.MINUTE)); + node.setSecond(calendar.get(Calendar.SECOND)); + node.setMillisecond(calendar.get(Calendar.MILLISECOND)); + node.setWeek(getWeek(calendar)); + node.setDayOfYear(calendar.get(Calendar.DAY_OF_YEAR)); + node.setWeekOfYear(getWeekOfYear(date)); + node.setWeekOfYearIgnoreLastYear(getWeekOfYearIgnoreLastYear(date)); + node.setMillisecondStamp(date.getTime()); + node.setSecondStamp(node.getMillisecondStamp() / 1000); + return node; + } + + /** + * 日期变更 + * + * @param date 指定日期 + * @param field 变更属性(如变更年份,则该值为 Calendar.DAY_OF_YEAR) + * @param amount 变更大小(大于 0 时增加,小于 0 时减少) + * @return 变更后的日期时间 + */ + public static Date add(Date date, int field, int amount) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, amount); + return calendar.getTime(); + } + + /** + * 指定日期加减年份 + * + * @param date 指定日期 + * @param year 变更年份(大于 0 时增加,小于 0 时减少) + * @return 变更年份后的日期 + */ + public static Date addYear(Date date, int year) { + return add(date, Calendar.YEAR, year); + } + + /** + * 指定日期加减月份 + * + * @param date 指定日期 + * @param month 变更月份(大于 0 时增加,小于 0 时减少) + * @return 变更月份后的日期 + */ + public static Date addMonth(Date date, int month) { + return add(date, Calendar.MONTH, month); + } + + /** + * 指定日期加减天数 + * + * @param date 指定日期 + * @param day 变更天数(大于 0 时增加,小于 0 时减少) + * @return 变更天数后的日期 + */ + public static Date addDay(Date date, int day) { + return add(date, Calendar.DAY_OF_YEAR, day); + } + + /** + * 指定日期加减星期 + * + * @param date 指定日期 + * @param week 变更星期数(大于 0 时增加,小于 0 时减少) + * @return 变更星期数后的日期 + */ + public static Date addWeek(Date date, int week) { + return add(date, Calendar.WEEK_OF_YEAR, week); + } + + /** + * 指定日期加减小时 + * + * @param date 指定日期时间 + * @param hour 变更小时数(大于 0 时增加,小于 0 时减少) + * @return 变更小时数后的日期时间 + */ + public static Date addHour(Date date, int hour) { + return add(date, Calendar.HOUR_OF_DAY, hour); + } + + /** + * 指定日期加减分钟 + * + * @param date 指定日期时间 + * @param minute 变更分钟数(大于 0 时增加,小于 0 时减少) + * @return 变更分钟数后的日期时间 + */ + public static Date addMinute(Date date, int minute) { + return add(date, Calendar.MINUTE, minute); + } + + /** + * 指定日期加减秒 + * + * @param date 指定日期时间 + * @param second 变更秒数(大于 0 时增加,小于 0 时减少) + * @return 变更秒数后的日期时间 + */ + public static Date addSecond(Date date, int second) { + return add(date, Calendar.SECOND, second); + } + + /** + * 指定日期加减秒 + * + * @param date 指定日期时间 + * @param minute 变更毫秒数(大于 0 时增加,小于 0 时减少) + * @return 变更毫秒数后的日期时间 + */ + public static Date addMillisecond(Date date, int millisecond) { + return add(date, Calendar.MILLISECOND, millisecond); + } + + /** + * 获取该日期所在周指定星期的日期 + * + * @param date 日期所在时间 + * @return index 指定星期(1 - 7 分别对应星期一到星期天) + */ + public static Date getWeekDate(Date date, int index) { + if (index < WEEK_1_MONDAY || index > WEEK_7_SUNDAY) { + return null; + } + int week = getWeek(date); + return addDay(date, index - week); + } + + /** + * 获取该日期所在周开始日期 + * + * @param date 日期所在时间 + * @return 所在周开始日期 + */ + public static Date getWeekDateStart(Date date) { + return getDateStart(getWeekDate(date, WEEK_1_MONDAY)); + } + + /** + * 获取该日期所在周开始日期 + * + * @param date 日期所在时间 + * @return 所在周开始日期 + */ + public static Date getWeekDateEnd(Date date) { + return getWeekDateEnd(getWeekDate(date, WEEK_7_SUNDAY)); + } + + /** + * 获取该日期所在周的所有日期(周一到周日) + * + * @param Date 日期 + * @return 该日照所在周的所有日期 + */ + public static List getWeekDateList(Date date) { + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + // 获取本周开始时间 + Date weekFromDate = getWeekDateStart(date); + // 获取本周截止时间 + Date weekeEndDate = getWeekDateEnd(date); + return getBetweenDateList(weekFromDate, weekeEndDate, true); + } + + /** + * 获取该日期所在周的所有日期(周一到周日) + * + * @param dateString + * @return 该日照所在周的所有日期 + */ + public static List getWeekDateList(String dateString) { + Date date = parseDate(dateString); + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + return getDateStrList(getWeekDateList(date)); + } + + /** + * 获取该日期所在月的所有日期 + * + * @param dateString + * @return 该日照所月的所有日期 + */ + public static List getMonthDateList(Date date) { + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + Date monthDateStart = getMonthDateStart(date); + Date monthDateEnd = getMonthDateEnd(date); + return getBetweenDateList(monthDateStart, monthDateEnd, true); + } + + /** + * 获取该日期所在月的所有日期 + * + * @param dateString + * @return 该日照所月的所有日期 + */ + public static List getMonthDateList(String dateString) { + Date date = parseDate(dateString); + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + return getDateStrList(getMonthDateList(date)); + } + + /** + * 获取本日期所在月第一天 + * + * @param date 日期 + * @return 本日期所在月第一天 + */ + public static Date getMonthDateStart(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, 1); + return getDateStart(calendar.getTime()); + } + + /** + * 获取本日期所在月最后一天 + * + * @param date 日期 + * @return 本日期所在月最后一天 + */ + public static Date getMonthDateEnd(Date date) { + if (Objects.isNull(date)) { + return null; + } + Date monthDateStart = getMonthDateStart(date); + Date nextMonthDateStart = getMonthDateStart(addMonth(monthDateStart, 1)); + return getDateEnd(addDay(nextMonthDateStart, -1)); + } + + /** + * 获取两个日期相差的天数(以日期为单位计算,不以24小时制计算,详见下面说明)
+ * + * 【说明】比如 2022-06-17 23:00:00 和 2022-06-17 01:00:00,两者虽然只相差 2 个小时,但也算相差 1 天
+ * + * @param date1 日期1 + * @param date2 日期2 + * @return 相差天数(若返回 -1,则至少有一个日期存在为空,此时不能进行比较) + */ + public static int countBetweenDays(Date date1, Date date2) { + if (Objects.isNull(date1) || Objects.isNull(date2)) { + return -1; + } + // 获取两个日期 0 点 0 时 0 分 0 秒 0 毫秒时的时间戳(毫秒级) + long t1 = getDateStart(date1).getTime(); + long t2 = getDateStart(date2).getTime(); + // 相差天数 = 相差的毫秒数 / 一天的毫秒数 + return (int) (Math.abs(t1 - t2) / DAY_MILLISECONDS); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param date1 日期1 + * @param date2 日期2 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(Date date1, Date date2) { + return getBetweenDateList(date1, date2, false); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param date1 日期1 + * @param date2 日期2 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(Date date1, Date date2, boolean isContainParams) { + if (Objects.isNull(date1) || Objects.isNull(date2)) { + return Collections.emptyList(); + } + // 确定前后日期 + Date fromDate = date1; + Date toDate = date2; + if (date2.before(date1)) { + fromDate = date2; + toDate = date1; + } + // 获取两个日期每天的开始时间 + Date from = getDateStart(fromDate); + Date to = getDateStart(toDate); + // 获取日期,开始循环 + List dates = new ArrayList(); + if (isContainParams) { + dates.add(from); + } + Date date = from; + boolean isBefore = true; + while (isBefore) { + date = addDay(date, 1); + isBefore = date.before(to); + if (isBefore) { + dates.add(getDateStart(date)); + } + } + if (isContainParams) { + dates.add(to); + } + return dates; + } + + /** + * 获取两个日期之间的所有日期 + * + * @param dateString1 日期1(如:2022-06-20) + * @param dateString2 日期2(如:2022-07-15) + * @return 两个日期之间的所有日期(不包含参数日期) + */ + public static List getBetweenDateList(String dateString1, String dateString2) { + return getBetweenDateList(dateString1, dateString2, false); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param dateString1 日期1(如:2022-06-20) + * @param dateString2 日期2(如:2022-07-15) + * @param isContainParams 是否包含参数的两个日期 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(String dateString1, String dateString2, boolean isContainParams) { + Date date1 = parseDate(dateString1); + Date date2 = parseDate(dateString2); + List dates = getBetweenDateList(date1, date2, isContainParams); + return getDateStrList(dates); + } + + /** + * List 转 List + * + * @param dates 日期集合 + * @return 日期字符串集合 + */ + public static List getDateStrList(List dates) { + if (dates.isEmpty()) { + return Collections.emptyList(); + } + List dateList = new ArrayList(); + for (Date date : dates) { + dateList.add(formatDate(date)); + } + return dateList; + } + + static class DateNode { + /** 年 */ + private int year; + /** 月 */ + private int month; + /** 日 */ + private int day; + /** 时 */ + private int hour; + /** 分 */ + private int minute; + /** 秒 */ + private int second; + /** 毫秒 */ + private int millisecond; + /** 星期几( 1 - 7 对应周一到周日) */ + private int week; + /** 当年第几天 */ + private int dayOfYear; + /** 当年第几周(本年周 1 为第 1 周,0 则表示属于去年最后一周) */ + private int weekOfYear; + /** 当年第几周(本年周 1 为第 1 周,0 则表示属于去年最后一周) */ + private int weekOfYearIgnoreLastYear; + /** 时间戳(秒级) */ + private long secondStamp; + /** 时间戳(毫秒级) */ + private long millisecondStamp; + /** 显示时间 */ + private String time; + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public int getMonth() { + return month; + } + + public void setMonth(int month) { + this.month = month; + } + + public int getDay() { + return day; + } + + public void setDay(int day) { + this.day = day; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public int getMinute() { + return minute; + } + + public void setMinute(int minute) { + this.minute = minute; + } + + public int getSecond() { + return second; + } + + public void setSecond(int second) { + this.second = second; + } + + public int getMillisecond() { + return millisecond; + } + + public void setMillisecond(int millisecond) { + this.millisecond = millisecond; + } + + public int getWeek() { + return week; + } + + public void setWeek(int week) { + this.week = week; + } + + public int getDayOfYear() { + return dayOfYear; + } + + public void setDayOfYear(int dayOfYear) { + this.dayOfYear = dayOfYear; + } + + public int getWeekOfYear() { + return weekOfYear; + } + + public void setWeekOfYear(int weekOfYear) { + this.weekOfYear = weekOfYear; + } + + public int getWeekOfYearIgnoreLastYear() { + return weekOfYearIgnoreLastYear; + } + + public void setWeekOfYearIgnoreLastYear(int weekOfYearIgnoreLastYear) { + this.weekOfYearIgnoreLastYear = weekOfYearIgnoreLastYear; + } + + public long getSecondStamp() { + return secondStamp; + } + + public void setSecondStamp(long secondStamp) { + this.secondStamp = secondStamp; + } + + public long getMillisecondStamp() { + return millisecondStamp; + } + + public void setMillisecondStamp(long millisecondStamp) { + this.millisecondStamp = millisecondStamp; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/util/EsUtils.java b/backend/src/main/java/com/imurs/util/EsUtils.java new file mode 100644 index 0000000..d956f70 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/EsUtils.java @@ -0,0 +1,110 @@ +package com.imurs.util; + +import com.imurs.config.ElasticSearchConfig; +import com.imurs.dao.EsRepository; +import com.imurs.entity.BMDReportInfo; +import com.imurs.entity.BModeReport; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.core.TimeValue; +import org.elasticsearch.index.query.MatchAllQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +@ConditionalOnProperty(name = "es.enabled", havingValue = "true") +public class EsUtils { + @Autowired + private ElasticsearchRestTemplate elasticsearchRestTemplate; + @Autowired + EsRepository esRepository; + + @Autowired + RestHighLevelClient client; + + private boolean testSearchIndex() { + GetIndexRequest getIndexRequest = new GetIndexRequest(ElasticSearchConfig.index); + try { + return client.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + public List findAll(){ + SearchRequest searchRequest = new SearchRequest(ElasticSearchConfig.index); + List bModeReports = new ArrayList<>(); + //构建搜索条件 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + //查询条件使用 QueryBuilders 实现 + //termQuery为精确匹配 存在中午搜索不到问题 , 它会使用默认的分词器,把字全拆分开 + //matchQuery 为模糊匹配 text字段.keyword则是精确搜索 不加.keyword则是模糊匹配 + MatchAllQueryBuilder matchQueryBuilder = QueryBuilders.matchAllQuery(); + searchSourceBuilder.query(matchQueryBuilder); + searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); + searchSourceBuilder.from(0); + searchSourceBuilder.size(11); + searchRequest.source(searchSourceBuilder); + SearchResponse searchResponse = null; + try { + searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + //获得结果里对象的值 + for (SearchHit hit : searchResponse.getHits().getHits()) { + Map sourceAsMap = hit.getSourceAsMap(); + String x = GsonUtil.simpleObjToJson(sourceAsMap); + bModeReports.add(GsonUtil.simpleJsonToObj(x, BMDReportInfo.class)); + } + return bModeReports; + } + + + public String addDocument(BModeReport bModeReport){ + if (testSearchIndex()){ + BMDReportInfo bmdReportInfo = new BMDReportInfo(); + bmdReportInfo.setId(bModeReport.getId()); + bmdReportInfo.setExaminePart(bModeReport.getExaminePart()); + bmdReportInfo.setInitial(bModeReport.getInitial()); + bmdReportInfo.setOpinion(bModeReport.getOpinion()); + bmdReportInfo.setbSee(bModeReport.getbSee()); + bmdReportInfo.setbHint(bModeReport.getbHint()); + bmdReportInfo.setNature(bModeReport.getNature()); + bmdReportInfo.setOverallOpinion(bModeReport.getOverallOpinion()); + bmdReportInfo.setbId(bModeReport.getbId()); + bmdReportInfo.setImageIds(bModeReport.getImageIds()); + bmdReportInfo.setDiagnosisType(bModeReport.getDiagnosisType()); + bmdReportInfo.setDocId(bModeReport.getDocId()); + bmdReportInfo.setSpeId(bModeReport.getSpeId()); + bmdReportInfo.setGroupDate(bModeReport.getGroupDate()); + bmdReportInfo.setCategoryHospitalId(bModeReport.getCategoryHospitalId()); + bmdReportInfo.setGroupHospitalId(bModeReport.getGroupHospitalId()); + bmdReportInfo.setActive(bModeReport.getActive()); + bmdReportInfo.setUpdateTime(bModeReport.getUpdateTime()); + esRepository.save( bmdReportInfo); + //elasticsearchRestTemplate.save( bmdReportInfo); + // esRepository.save(paramS); + return "文档添加成功"; + } + return "索引不存在"; + } + + + +} diff --git a/backend/src/main/java/com/imurs/util/GsonUtil.java b/backend/src/main/java/com/imurs/util/GsonUtil.java new file mode 100644 index 0000000..26dc284 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/GsonUtil.java @@ -0,0 +1,200 @@ +package com.imurs.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author Laier + * @date 2022/11/9 + */ +public class GsonUtil { + + /** + * 简单对象转Json + * + * @param obj + * @return + */ + public static String simpleObjToJson(Object obj) { + if (Objects.isNull(obj)) { + return ""; + } + try { + Gson gson = new Gson(); + return gson.toJson(obj); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * 简单Json转对象 + * + * @param json + * @param cls + * @param + * @return + */ + public static T simpleJsonToObj(String json, Class cls) { + Gson gson = new Gson(); + if (Objects.isNull(json)) { + return null; + } + T obj = gson.fromJson(json, cls); + if (Objects.isNull(obj)) { + return null; + } else { + return obj; + } + } + + /** + * 复杂对象转Json + * + * @param obj + * @return + */ + public static String complexObjToJson(Object obj) { + Gson gson = new Gson(); + if (Objects.isNull(obj)) { + return ""; + } + String json = gson.toJson(obj); + if (Objects.isNull(json)) { + return ""; + } else { + return json; + } + } + /** + * 复杂Json转对象 + * + * @param json + * @param cls + * @param + * @return + */ + public static T complexJsonToObj(String json, Class cls) { + Gson gson = new Gson(); + if (Objects.isNull(json)) { + return null; + } + T obj = gson.fromJson(json, cls); + if (Objects.isNull(obj)) { + return null; + } else { + return obj; + } + } + + /** + * 数组转Json + * + * @param array + * @return + */ + public static String arrayToJson(Object array) { + if (Objects.isNull(array)) { + return ""; + } + Gson gson = new Gson(); + String json = gson.toJson(array); + if (Objects.isNull(json)) { + return ""; + } else { + return json; + } + } + + /** + * list To Json + * + * @param list + * @return + */ + public static String listToJson(List list) { + if (Objects.isNull(list)) { + return ""; + } + try { + Gson gson = new Gson(); + return gson.toJson(list); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * json to list + * + * @param json + * @param cls + * @param + * @return + */ + public static T jsonToList(String json,Class cls) { + if (Objects.isNull(json)) { + return null; + } + try { + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + return gson.fromJson(json, type); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 使用expose注解 obj to json + * + * @param obj + * @return + */ + public static String exposeObjToJson(Object obj) { + if (Objects.isNull(obj)) { + return ""; + } + try { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.excludeFieldsWithoutExposeAnnotation(); + Gson gson = gsonBuilder.create(); + return gson.toJson(obj); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * 使用expose注解 json to obj + * @param json + * @param cls + * @param + * @return + */ + public static T exposeJsonToObj(String json, Class cls) { + if (Objects.isNull(json)) { + return null; + } + try { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.excludeFieldsWithoutExposeAnnotation(); + Gson gson = gsonBuilder.create(); + return gson.fromJson(json, cls); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/backend/src/main/java/com/imurs/util/IpCacheManager.java b/backend/src/main/java/com/imurs/util/IpCacheManager.java new file mode 100644 index 0000000..753d0fe --- /dev/null +++ b/backend/src/main/java/com/imurs/util/IpCacheManager.java @@ -0,0 +1,134 @@ +package com.imurs.util; + + +import com.google.common.cache.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.Session; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author w + * 设置缓存,限制ip的访问次数 + */ +public class IpCacheManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(IpCacheManager.class); + + /** 缓存项最大数量 */ + private static final long GUAVA_CACHE_SIZE = 100000; + + /** 缓存时间:天 */ + private static final long GUAVA_CACHE_HOURS = 1; + + /** 缓存操作对象 */ + private static LoadingCache GLOBAL_CACHE = null; + + static { + try { + GLOBAL_CACHE = loadCache(new CacheLoader() { + @Override + public AtomicInteger load(String key) throws Exception { + // 处理缓存键不存在缓存值时的处理逻辑 + return null; + } + }); + } catch (Exception e) { + LOGGER.error("初始化Guava Cache出错", e); + } + } + + /** + * 全局缓存设置 + * @param cacheLoader + * @return + * @throws Exception + */ + private static LoadingCache loadCache(CacheLoader cacheLoader) throws Exception { + LoadingCache cache = CacheBuilder.newBuilder() + //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 + .maximumSize(GUAVA_CACHE_SIZE) + //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护) + .expireAfterAccess(GUAVA_CACHE_HOURS, TimeUnit.HOURS) + // 设置缓存在写入之后 设定时间 后失效 + .expireAfterWrite(GUAVA_CACHE_HOURS, TimeUnit.HOURS) + //移除监听器,缓存项被移除时会触发 + .removalListener(new RemovalListener() { + @Override + public void onRemoval(RemovalNotification rn) { + //逻辑操作 + } + }) + //开启Guava Cache的统计功能 + .recordStats() + .build(cacheLoader); + return cache; + } + + /** + * 设置缓存值 + * @param key + * @param value + */ + public static void put(String key, AtomicInteger value) { + try { + GLOBAL_CACHE.put(key, value); + } catch (Exception e) { + LOGGER.error("设置缓存值出错", e); + } + } + + + /** + * 获取缓存值 + * @param key + * @return + */ + public static AtomicInteger get(String key) { + AtomicInteger token; + try { + token = GLOBAL_CACHE.get(key); + return token; + } catch (CacheLoader.InvalidCacheLoadException e) { + LOGGER.warn("key为" + key + "时没有从缓存获取到数据,返回null"); + } catch (Exception e) { + LOGGER.error("获取缓存值出错", e); + } + return null; + } + + + /** + * 移除缓存值 + * @param key + */ + public static void remove(String key) { + try { + GLOBAL_CACHE.invalidate(key); + } catch (Exception e) { + LOGGER.error("移除缓存出错", e); + } + } + + /** + * @param ipAddress 限制的ip + * @param maxIpCount 该ip最大访问量 + * @return 同一ip超过最大访问量时返回false + */ + public static boolean countIp(String ipAddress,int maxIpCount) { + AtomicInteger integer = IpCacheManager.get(ipAddress); + if (integer == null) { + IpCacheManager.put(ipAddress,new AtomicInteger(1)); + } else if (integer.get() < maxIpCount) { + integer.incrementAndGet(); + IpCacheManager.put(ipAddress,integer); + } else { + return false; + } + return true; + } + + +} diff --git a/backend/src/main/java/com/imurs/util/JapiDoc.java b/backend/src/main/java/com/imurs/util/JapiDoc.java new file mode 100644 index 0000000..c51518d --- /dev/null +++ b/backend/src/main/java/com/imurs/util/JapiDoc.java @@ -0,0 +1,32 @@ +package com.imurs.util; + +import com.imurs.entity.ApplyBModeSpecialist; +import io.github.yedaxia.apidocs.Docs; +import io.github.yedaxia.apidocs.DocsConfig; +import io.github.yedaxia.apidocs.plugin.markdown.MarkdownDocPlugin; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class JapiDoc { + + /*public static void main(String[] args) { + DocsConfig config = new DocsConfig(); + // 项目根目录 + config.setProjectPath("E://new project//gansu_java_zs"); + // 项目名称 + config.setProjectName("ProjectName"); + // 声明该API的版本 + config.setApiVersion("V1.0"); + // 生成API 文档所在目录 + config.setDocsPath("C://Users//dxy//Desktop//ApiDoc"); + // 配置自动生成 false则要在需要导出的接口加注解@ApiDoc true则全部导出 + config.setAutoGenerate(Boolean.FALSE); + //配置导出文档类型 + config.addPlugin(new MarkdownDocPlugin()); + // 执行生成文档 + Docs.buildHtmlDocs(config); + }*/ + +} diff --git a/backend/src/main/java/com/imurs/util/LetterIncrementor.java b/backend/src/main/java/com/imurs/util/LetterIncrementor.java new file mode 100644 index 0000000..1fa7290 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/LetterIncrementor.java @@ -0,0 +1,82 @@ +package com.imurs.util; + +public class LetterIncrementor { + + + + /** + * 生成当前字母序列的下一个序列。 + * 例如,"A" 的下一个为 "B";"Z" 的下一个为 "AA";"AZ" 的下一个为 "BA"。 + * + * @param current 当前的字母序列 + * @param maxLength 序列的最大允许长度 + * @return 下一个字母序列 + * @throws IllegalArgumentException 如果输入字符串包含非字母字符,或当序列已达到最大长度且无法再递增时 + */ + public static String getNext(String current, int maxLength) { + if (current == null || current.isEmpty()) { + return "A"; // 如果初始为空,则从"A"开始 + } + + // 校验当前字符串是否全为字母 + if (!current.matches("[a-zA-Z]+")) { + throw new IllegalArgumentException("输入字符串必须只包含字母"); + } + + // 统一转换为大写处理,保证一致性。如果需要小写,可以修改。 + char[] chars = current.toUpperCase().toCharArray(); + + // 检查是否已经达到最大值(即长度等于maxLength,且每个字符都是'Z') + boolean allZ = true; + for (char c : chars) { + if (c != 'Z') { + allZ = false; + break; + } + } + if (allZ && chars.length == maxLength) { + throw new IllegalArgumentException("字母序列已达到最大值(长度为" + maxLength + "的全Z序列),无法继续递增。"); + } + + // 从右向左遍历字符数组 + for (int i = chars.length - 1; i >= 0; i--) { + if (chars[i] < 'Z') { + // 当前字符不需要进位,直接加一 + chars[i]++; + return new String(chars); + } else { + // 当前字符是'Z',需要进位,将其重置为'A' + chars[i] = 'A'; + // 循环继续,下一位(左边一位)会自然进入下一轮判断并加一 + } + } + + // 如果执行到这里,说明原字符串所有位都是'Z',但长度未达到maxLength,需要在前面补一个'A'(例如 "ZZ" -> "AAA") + if (chars.length < maxLength) { + return "A" + new String(chars); // chars现在已经是全'A'了 + } else { + // 理论上不会进入此分支,因为前面已经做了最大值判断,但为了安全起见 + throw new IllegalArgumentException("无法生成下一个字母序列。"); + } + } + + // 测试示例 + public static void main(String[] args) { + String[] testCases = {"A", "Z", "AA", "AZ", "ZZ", "AAA", "ZZZ", "ABCD"}; + for (String test : testCases) { + try { + System.out.println(test + " -> " + getNext(test, 10)); + } catch (IllegalArgumentException e) { + System.out.println(test + " -> ERROR: " + e.getMessage()); + } + } + // 测试边界情况:长度为10的全Z序列 + String maxZ = "ZZZZZZZZZZ"; + try { + System.out.println(maxZ + " -> " + getNext(maxZ, 10)); + } catch (IllegalArgumentException e) { + System.out.println(maxZ + " -> " + e.getMessage()); + } + } + +} diff --git a/backend/src/main/java/com/imurs/util/MD5.java b/backend/src/main/java/com/imurs/util/MD5.java new file mode 100644 index 0000000..2a46529 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/MD5.java @@ -0,0 +1,69 @@ +package com.imurs.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5 { + // 全局数组 + private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + + public MD5() { + } + + // 返回形式为数字跟字符串 + private static String byteToArrayString(byte bByte) { + int iRet = bByte; + // System.out.println("iRet="+iRet); + if (iRet < 0) { + iRet += 256; + } + int iD1 = iRet / 16; + int iD2 = iRet % 16; + return strDigits[iD1] + strDigits[iD2]; + } + + // 返回形式只为数字 + @SuppressWarnings("unused") + private static String byteToNum(byte bByte) { + int iRet = bByte; + System.out.println("iRet1=" + iRet); + if (iRet < 0) { + iRet += 256; + } + return String.valueOf(iRet); + } + + // 转换字节数组为16进制字串 + private static String byteToString(byte[] bByte) { + StringBuffer sBuffer = new StringBuffer(); + for (int i = 0; i < bByte.length; i++) { + sBuffer.append(byteToArrayString(bByte[i])); + } + return sBuffer.toString(); + } + + public static String GetMD5Code(String strObj) { + String resultString = null; + try { + resultString = strObj; + MessageDigest md = MessageDigest.getInstance("MD5"); + // md.digest() 该函数返回值为存放哈希值结果的byte数组 + resultString = byteToString(md.digest(strObj.getBytes())); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + return resultString; + } + + /*@SuppressWarnings("unused") + public static void main(String[] args) { + MD5 getMD5 = new MD5(); + //637190078353793191 + System.out.println("第一次MD5:"+MD5.GetMD5Code("123456a")); + String cnum= MD5.GetMD5Code(MD5.GetMD5Code("123456a")); + System.out.println("第二次MD5:"+cnum); + String MDNumber3 = MD5.GetMD5Code(MD5.GetMD5Code(MD5.GetMD5Code("123456a"))); + System.out.println("第三次MD5:" + MDNumber3); + }*/ +} diff --git a/backend/src/main/java/com/imurs/util/MsgCode.java b/backend/src/main/java/com/imurs/util/MsgCode.java new file mode 100644 index 0000000..eae7eec --- /dev/null +++ b/backend/src/main/java/com/imurs/util/MsgCode.java @@ -0,0 +1,69 @@ +package com.imurs.util; + +public class MsgCode { + + /** + * msg:1 成功 + * msg:2 失败 + * msg:3 空 + * msg:4 系统异常 + * msg:5 存在 + * msg:6 不存在 + * msg:7 权限不足 + * msg:8 账号已经冻结 + * mag:9 字段为空 + * msg:10未登录 + * msg:11旧密码不一致 + * msg:12 登录角色错误 + * msg:13 访问次数过多 + * msg:1001 您的账号在另一台设备上登录,如非本人操作,请立即修改密码! + * msg:1002 未登录 + * msg:1003 未注册 + * msg:1004:签名无效 + * + */ + + //网页地址 + public static final String sendUrl = "https://39.108.252.248/yidutest/#/"; + + //医院名字 + public static final String hospitalName="上海伦琴医生集团"; + + //短信接口 + public static final String account="N144131_N9903806"; + public static final String password="f3pNYkaCsg93cd"; + public static final String url="http://smssh1.253.com/msg/send/json"; + + //短信签名为广州铱度的短信接口 + public static final String ydAccount = "N144131_N9903806"; + public static final String ydPassword = "f3pNYkaCsg93cd"; + public static final String ydUrl = "http://smssh1.253.com/msg/send/json"; + + /**私钥*/ + public static String PRIVATEKEY=""; + + /**公钥*/ + public static String PUBLICKEY=""; + + /**甘肃测试地址密钥**/ + public static final String MYSQL_PUBLICKEY="G0CvDz7oJn6"; + + /**甘肃正式地址密钥**/ + public static final String MYSQL_PUBLICKEY_GS_ZS="GSJDYUHJKHJKHYTBG9874hhdfjkhj67t565yg5"; + + /**本地测试地址密钥*/ + public static final String MYSQL_PUBLICKEY_BD_TEST="G0CvDz7oJnYDXXKEYXGSDDWW"; + + /**API密钥*/ + public static final String API="U2FsdGVkX19vesbWMrQgcml30dYqMuy0U+AtwfoDQG8R5qey4zWSsTROMspCvdAisQkz1yPFpI5r43Bh3+6j6g=="; + + /**TOKEN*/ + public static final String TOKEN="test"; + + /**RSA私钥*/ + public static final String privateKeyString=" MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAiQlWCuM2KdeyG2ur2wAqiiynYyed2mkLKQcjJoY3I/+zoZ8PTTl6+Y1U/Fqw8SdDuEpgO5+/9F5WMhHY3ICL8QIDAQABAkAzjh+g2Pp3o36OcmOlcNqQQVx4IV9x3DMmrFi9FaGJGQkdTtlsEe7DIfJhsYQ4btP6e7H8+720q9qvWAiqVsABAiEA7mv2sAUseSiJqC5G/JGXCuAAPweYpZ2zMtn2HoHBlbECIQCTI8yvExrZZTD4Wr7Aurwd1feaDYKW7b5qVGzhXpKqQQIgfwMy8sh+zbijxN2KYYip31g/qVRBpJDjYwasT8ouN7ECIEO6q+I+4hIFwVfgtYOTsTnunu27oEwHHapmOEQ5OzvBAiEAgvciJPojZtjNgwrT1JLT7AnYg2sgK6v2cRblruKHQAg="; + + /**默认密码*/ + public static final String Password="123456a"; +} + diff --git a/backend/src/main/java/com/imurs/util/RSASecurityUtil2.java b/backend/src/main/java/com/imurs/util/RSASecurityUtil2.java new file mode 100644 index 0000000..86ca0c7 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/RSASecurityUtil2.java @@ -0,0 +1,22 @@ +package com.imurs.util; + +import org.jasypt.util.text.BasicTextEncryptor; +public class RSASecurityUtil2 { + + public static void main(String[] args) throws Exception { + + + BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); + //加密所需的salt(盐) + textEncryptor.setPassword(MsgCode.MYSQL_PUBLICKEY_BD_TEST); + //要加密的数据(数据库的用户名或密码) + + String username = textEncryptor.encrypt("root"); + String password = textEncryptor.encrypt("Zp.123456"); + String url = textEncryptor.encrypt("jdbc:mysql://39.108.252.248:3306/yd_jinma?characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true"); + System.out.println("username:"+username); + System.out.println("password:"+password); + System.out.println("url:"+url); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/util/RSAUtil.java b/backend/src/main/java/com/imurs/util/RSAUtil.java new file mode 100644 index 0000000..761a136 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/RSAUtil.java @@ -0,0 +1,116 @@ +package com.imurs.util; + + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +public class RSAUtil { + + + private static final int DEFAULT_RSA_KEY_SIZE = 1024; + + private static final String KEY_ALGORITHM = "RSA"; + + //存放密钥 + private static Map keyMap = new HashMap(); + + /** + * 随机生成密钥对 + * @throws NoSuchAlgorithmException + */ + public static void genKeyPair() throws NoSuchAlgorithmException { + // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + // 初始化密钥对生成器,密钥大小为96-1024位 + keyPairGen.initialize(DEFAULT_RSA_KEY_SIZE,new SecureRandom()); + // 生成一个密钥对,保存在keyPair中 + KeyPair keyPair = keyPairGen.generateKeyPair(); + // 得到私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + // 得到公钥 + String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded())); + // 得到私钥字符串 + String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); + // 将公钥和私钥保存到Map + //0表示公钥 + keyMap.put(0,publicKeyString); + //1表示私钥 + keyMap.put(1,privateKeyString); + } + + /** + * RSA公钥加密 + * + * @param str + * 加密字符串 + * @param publicKey + * 公钥 + * @return 密文 + * @throws Exception + * 加密过程中的异常信息 + */ + public static String encrypt( String str, String publicKey ) throws Exception{ + //base64编码的公钥 + byte[] decoded = Base64.decodeBase64(publicKey); + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); + //RSA加密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8"))); + return outStr; + } + + /** + * RSA私钥解密 + * + * @param str + * 加密字符串 + * @param privateKey + * 私钥 + * @return 铭文 + * @throws Exception + * 解密过程中的异常信息 + */ + public static String decrypt(String str, String privateKey) throws Exception{ + //64位解码加密后的字符串 + byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); + //base64编码的私钥 + byte[] decoded = Base64.decodeBase64(privateKey); + RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); + //RSA解密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, priKey); + String outStr = new String(cipher.doFinal(inputByte)); + return outStr; + } + +// public static void main(String[] args) throws Exception { +// //生成公钥和私钥 +// genKeyPair(); +// //加密字符串 +// String message = "123456a"; +// System.out.println("随机生成的公钥为:" + keyMap.get(0)); +// System.out.println("随机生成的私钥为:" + keyMap.get(1)); +// String messageEn = encrypt(message,keyMap.get(0)); +// System.out.println(message + "\t加密后的字符串为:" + messageEn); +// +//// String messageEn1 = "VowRoVzepi5GXigjYv1yzck6vEKhuJBDm6XP8p6uwBev7RMnyB6HxH+ronAaTqomudRMu3qQogtHpvay5WbyUQ=="; +//// String messageDe1 = decrypt(messageEn1,"MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAiQlWCuM2KdeyG2ur2wAqiiynYyed2mkLKQcjJoY3I/+zoZ8PTTl6+Y1U/Fqw8SdDuEpgO5+/9F5WMhHY3ICL8QIDAQABAkAzjh+g2Pp3o36OcmOlcNqQQVx4IV9x3DMmrFi9FaGJGQkdTtlsEe7DIfJhsYQ4btP6e7H8+720q9qvWAiqVsABAiEA7mv2sAUseSiJqC5G/JGXCuAAPweYpZ2zMtn2HoHBlbECIQCTI8yvExrZZTD4Wr7Aurwd1feaDYKW7b5qVGzhXpKqQQIgfwMy8sh+zbijxN2KYYip31g/qVRBpJDjYwasT8ouN7ECIEO6q+I+4hIFwVfgtYOTsTnunu27oEwHHapmOEQ5OzvBAiEAgvciJPojZtjNgwrT1JLT7AnYg2sgK6v2cRblruKHQAg="); +//// System.out.println("还原后的字符串为:" + messageDe1); +// +// +//// String messageDe = decrypt(messageEn1,keyMap.get(1)); +//// System.out.println("还原后的字符串为:" + messageDe); +// } + +} + diff --git a/backend/src/main/java/com/imurs/util/ScrewUtil.java b/backend/src/main/java/com/imurs/util/ScrewUtil.java new file mode 100644 index 0000000..bd8f555 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/ScrewUtil.java @@ -0,0 +1,81 @@ +package com.imurs.util; + +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +/** + * 生成数据库设计文档 + * @author wdh + */ +public class ScrewUtil { + + public static void main(String[] args) { + //需要用hikari连接池才行 + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setDriverClassName("com.mysql.jdbc.Driver"); + hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3307/yd_gansu_test?characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true"); + hikariConfig.setUsername("root"); + hikariConfig.setPassword("root"); + // 设置可以获取tables remarks信息 + hikariConfig.addDataSourceProperty("useInformationSchema", "true"); + hikariConfig.setMinimumIdle(2); + hikariConfig.setMaximumPoolSize(5); + DataSource dataSource = new HikariDataSource(hikariConfig); + + //生成配置文件 + EngineConfig engineConfig = EngineConfig.builder() + //生成文件路径 + .fileOutputDir("C://Users//dxy//Desktop//mysql") + //打开目录 + .openOutputDir(true) + //文件类型 + .fileType(EngineFileType.MD) + //生成模板实现 + .produceType(EngineTemplateType.freemarker).build(); + + //生成文档配置 + Configuration configuration = Configuration.builder() + .version("1.0.3") + .description("数据库设计文档") + .dataSource(dataSource) + .engineConfig(engineConfig) + .produceConfig(getProcessConfig()) + .build(); + //执行生成 + new DocumentationExecute(configuration).execute(); + } + + public static ProcessConfig getProcessConfig() { + //根据表名生成 + List tableName = Arrays.asList("test_group","test"); + //根据表前缀生成,如根据a开头的数据库表 + List prefix = Arrays.asList("a","b","c","d","h","i","l","p","r","s","t","u","v","w"); + //根据表后缀生成 + List suffix = Arrays.asList("test","test2"); + return ProcessConfig.builder() + //根据名称指定表生成 + .designatedTableName(tableName) + //根据表前缀生成 + .designatedTablePrefix(prefix) + //根据表后缀生成 + .designatedTableSuffix(suffix) + //忽略表名 + .ignoreTableName(new ArrayList<>()) + //忽略表前缀 + .ignoreTablePrefix(new ArrayList<>()) + //忽略表后缀 + .ignoreTableSuffix(new ArrayList<>()) + .build(); + } +} diff --git a/backend/src/main/java/com/imurs/util/Token.java b/backend/src/main/java/com/imurs/util/Token.java new file mode 100644 index 0000000..0c1482b --- /dev/null +++ b/backend/src/main/java/com/imurs/util/Token.java @@ -0,0 +1,18 @@ +package com.imurs.util; + +import io.agora.media.RtcTokenBuilder2; +import io.agora.media.RtcTokenBuilder2.Role; + +public class Token { + + public static void main(String[] args) { + // TODO Auto-generated method stub + String appCertificate ="c2809b8ba09e431e84097d60b4406e0a"; + int tokenExpirationInSeconds = 3600; + int privilegeExpirationInSeconds = 3600; + RtcTokenBuilder2 token = new RtcTokenBuilder2(); + String result = token.buildTokenWithUserAccount("3ee3f", appCertificate, "eede", "www", Role.ROLE_PUBLISHER, tokenExpirationInSeconds, privilegeExpirationInSeconds); + System.out.printf("Token with uid: %s\n", result); + } + +} diff --git a/backend/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java b/backend/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java new file mode 100644 index 0000000..78f1172 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java @@ -0,0 +1,68 @@ +package com.imurs.util.note; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * + * @author tianyh + * @Description:HTTP 请求 + */ + +@Service +public class ChuangLanSmsUtil { + + /** + * + * @author tianyh + * @Description + * @param path + * @param postContent + * @return String + * @throws + */ + public static String sendSmsByPost(String path, String postContent) { + URL url = null; + try { + url = new URL(path); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("POST");// 提交模式 + httpURLConnection.setConnectTimeout(10000);//连接超时 单位毫秒 + httpURLConnection.setReadTimeout(10000);//读取超时 单位毫秒 + // 发送POST请求必须设置如下两行 + httpURLConnection.setDoOutput(true); + httpURLConnection.setDoInput(true); + httpURLConnection.setRequestProperty("Charset", "UTF-8"); + httpURLConnection.setRequestProperty("Content-Type", "application/json"); + + httpURLConnection.connect(); + OutputStream os=httpURLConnection.getOutputStream(); + os.write(postContent.getBytes("UTF-8")); + os.flush(); + + StringBuilder sb = new StringBuilder(); + int httpRspCode = httpURLConnection.getResponseCode(); + if (httpRspCode == HttpURLConnection.HTTP_OK) { + // 开始获取数据 + BufferedReader br = new BufferedReader( + new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); + String line = null; + while ((line = br.readLine()) != null) { + sb.append(line); + } + br.close(); + return sb.toString(); + + } + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/backend/src/main/java/com/imurs/util/page/CustomPage.java b/backend/src/main/java/com/imurs/util/page/CustomPage.java new file mode 100644 index 0000000..1e3a2ba --- /dev/null +++ b/backend/src/main/java/com/imurs/util/page/CustomPage.java @@ -0,0 +1,120 @@ +package com.imurs.util.page; + +import java.util.List; + +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 分页工具类 + * 由此对象将page对象转换成json对象,传到前台处理 + * @author z77z + * 由于jqgrid框架定义的page对象里面的字段和mybatisplus的不一样 + * 所以这个由这个中间对象来转换 + * @param + */ +public class CustomPage{ + + //当前页数 + private int page; + + //每页显示数量 + private int pagesize; + + //总条数 + private int records; + + //数据列表 + private List rows; + + //总页数 + private int total; + + //排序字段 + //private String orderByField; + + //是否升序 + //private boolean isAsc; + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getPagesize() { + return pagesize; + } + + public void setPagesize(int pagesize) { + this.pagesize = pagesize; + } + + public int getRecords() { + return records; + } + + public void setRecords(int records) { + this.records = records; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + /*public String getOrderByField() { + return orderByField; + } + + public void setOrderByField(String orderByField) { + this.orderByField = orderByField; + } + + public boolean isAsc() { + return isAsc; + } + + public void setAsc(boolean isAsc) { + this.isAsc = isAsc; + }*/ + + public CustomPage(){} + + /*public CustomPage(Page page){ + this.page = page.getCurrent(); + this.pagesize = page.getSize(); + this.records = page.getTotal(); + this.rows = page.getRecords(); + this.total = page.getPages(); + this.orderByField = page.getOrderByField(); + this.isAsc = page.isAsc(); + }*/ + + //Page:{ [Pagination { total=0 ,size=6//每页大小 ,pages=0 ,current=1//第几页 }], records-size:11 //总数 } + public CustomPage(Page page){ + this.page = page.getCurrent(); + this.pagesize = page.getSize(); + this.records = (int) page.getTotal(); + //this.records = page.getRecords().size(); + this.rows = page.getRecords(); + this.total = (int) page.getPages(); + } + public CustomPage(int page, int pagesize, int records) { + this.page = page; + this.pagesize = pagesize; + this.records = records; + } +} diff --git a/backend/src/main/java/com/imurs/util/page/FrontPage.java b/backend/src/main/java/com/imurs/util/page/FrontPage.java new file mode 100644 index 0000000..b2b45ed --- /dev/null +++ b/backend/src/main/java/com/imurs/util/page/FrontPage.java @@ -0,0 +1,123 @@ +package com.imurs.util.page; + +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 用来接收页面传过来的查询字段 对象 + * + * @author z77z + * + */ +public class FrontPage { + // 是否是查询 + private boolean _search; + + // 时间戳(毫秒) + private String nd; + + // 每页显示条数 + private int rows; + + // 当前页数 + private int page; + + // 排序的字段 + private String sidx; + + // 排序方式 asc升序 desc降序 + private String sord; + + // 搜索条件 + private String keywords; + + public boolean is_search() { + return _search; + } + + public void set_search(boolean _search) { + this._search = _search; + } + + public String getNd() { + return nd; + } + + public void setNd(String nd) { + this.nd = nd; + } + + public int getRows() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public String getSidx() { + return sidx; + } + + public void setSidx(String sidx) { + this.sidx = sidx; + } + + public String getSord() { + return sord; + } + + public void setSord(String sord) { + this.sord = sord; + } + + // 获取mybatisPlus封装的Page对象 + public Page getPagePlus() { + Page pagePlus = new Page(); + pagePlus.setCurrent(this.page); + pagePlus.setSize(this.rows); + pagePlus.setAsc(this.sord.equals("asc")); + pagePlus.setOrderByField(this.sidx); + return pagePlus; + } + + // 获取mybatisPlus封装的Page对象 + public Page getPagePlusTwo() { + Page pagePlus = new Page(); + pagePlus.setCurrent(this.page); + pagePlus.setSize(this.rows); + return pagePlus; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + + + public FrontPage(boolean _search, String nd, int rows, int page, String sidx, String sord, String keywords) { + super(); + this._search = _search; + this.nd = nd; + this.rows = rows; + this.page = page; + this.sidx = sidx; + this.sord = sord; + this.keywords = keywords; + } + + public FrontPage() { + super(); + } +} diff --git a/backend/src/main/java/com/imurs/util/page/Pagetion.java b/backend/src/main/java/com/imurs/util/page/Pagetion.java new file mode 100644 index 0000000..e061a98 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/page/Pagetion.java @@ -0,0 +1,143 @@ +package com.imurs.util.page; + +import java.util.List; +import java.util.Set; + +public class Pagetion { + // 已知数据 + private int pageNo; // 当前页,从请求那边传过来。 + private int pageSize; // 每页显示的数据条数。 + private int resultCount; // 总的记录条数。查询数据库得到的数据 + + // 需要计算得来 + private int totalPage; // 总页数,通过resultCount和pageSize计算可以得来 + // 开始索引,也就是我们在数据库中要从第几行数据开始拿,有了startIndex和pageSize, + // 就知道了limit语句的两个数据,就能获得每页需要显示的数据了 + private int startIndex; + + // 将每页要显示的数据放在list集合中 + private List list; + + private Set set; + + // 分页显示的页数,比如在页面上显示1,2,3,4,5页,start就为1,end就为5,这个也是算过来的 + private int start; + private int end; + + // 通过pageNo,pageSize,resultCount计算得来tatalPage和startIndex + // 构造方法中将pageNo,pageSize,resultCount获得 + public Pagetion(int pageNo, int pageSize, int resultCount) { + this.pageNo = pageNo; + this.pageSize = pageSize; + this.resultCount = resultCount; + + // totalPage 总页数 + if (resultCount % pageSize == 0) { + // 说明整除,正好每页显示pageSize条数据,没有多余一页要显示少于pageSize条数据的 + this.totalPage = resultCount / pageSize; + } else { + // 不整除,就要在加一页,来显示多余的数据。 + this.totalPage = resultCount / pageSize + 1; + } + // 开始索引 + this.startIndex = (pageNo - 1) * pageSize; + // 显示5页,这里自己可以设置,想显示几页就自己通过下面算法修改 + this.start = 1; + this.end = 5; + // 显示页数的算法 + + if (totalPage <= 5) { + // 总页数都小于5,那么end就为总页数的值了。 + this.end = this.totalPage; + } else { + // 总页数大于5,那么就要根据当前是第几页,来判断start和end为多少了, + this.start = pageNo - 2; + this.end = pageNo + 2; + + if (start <=0) { + // 比如当前页是第1页,或者第2页,那么就不如和这个规则, + this.start = 1; + this.end = 5; + } + if (end > this.totalPage) { + // 比如当前页是倒数第2页或者最后一页,也同样不符合上面这个规则 + this.end = totalPage; + this.start = end - 5; + } + } + } + + // get、set方法。 + public int getPageNo() { + return pageNo; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getResultCount() { + return resultCount; + } + + public void setResultCount(int resultCount) { + this.resultCount = resultCount; + } + + public int getTotalPage() { + return totalPage; + } + + public void setTotalPage(int totalPage) { + this.totalPage = totalPage; + } + + public int getStartIndex() { + return startIndex; + } + + public void setStartIndex(int startIndex) { + this.startIndex = startIndex; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public int getStart() { + return start; + } + + public void setStart(int start) { + this.start = start; + } + + public int getEnd() { + return end; + } + + public void setEnd(int end) { + this.end = end; + } + + public Set getSet() { + return set; + } + + public void setSet(Set set) { + this.set = set; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java b/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java new file mode 100644 index 0000000..847c8e3 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java @@ -0,0 +1,69 @@ +package com.imurs.util.rateLimiter; + +import com.google.common.util.concurrent.RateLimiter; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author wang + * @date 2021年05月12日 9:58 + * SuppressWarnings注解:忽略掉RateLimiter被标记为不稳定的警告 + * 标注了RateLimiterAspect注解的类都会被增强,然后控制访问接口的并发量 + */ +@Component +@Scope +@Aspect +@SuppressWarnings("UnstableApiUsage") +public class RateLimiterAop { + @Autowired + private HttpServletResponse response; + + private final RateLimiter rateLimiter = RateLimiter.create(10.0); + + @Pointcut("@annotation(com.imurs.util.rateLimiter.RateLimiterAspect)") + public void serviceLimit() {} + + @Around("serviceLimit()") + public Object limit(ProceedingJoinPoint joinPoint) { + boolean acquire = rateLimiter.tryAcquire(); + Object obj = null; + try { + if (acquire) { + obj = joinPoint.proceed(); + } else { + output(response,"网络繁忙"); + } + } catch (Throwable e) { + e.printStackTrace(); + } + return obj; + } + + public void output(HttpServletResponse response, String msg) throws IOException { + response.setContentType("application/json;charset=UTF-8"); + ServletOutputStream outputStream = null; + try { + outputStream = response.getOutputStream(); + outputStream.write(msg.getBytes("UTF-8")); + } catch (IOException e) { + e.printStackTrace(); + } finally { + assert outputStream != null; + outputStream.flush(); + outputStream.close(); + } + } +} diff --git a/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java b/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java new file mode 100644 index 0000000..5c401d3 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java @@ -0,0 +1,14 @@ +package com.imurs.util.rateLimiter; + +import java.lang.annotation.*; + +/** + * @author w + * 自定义的注解,相当于一个标识,使用该注解的方法会被切面RateLimiterAop增强 + */ +@Inherited +@Documented +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RateLimiterAspect { +} diff --git a/backend/src/main/java/com/imurs/util/weblog/HttpContextUtil.java b/backend/src/main/java/com/imurs/util/weblog/HttpContextUtil.java new file mode 100644 index 0000000..1e49af5 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/weblog/HttpContextUtil.java @@ -0,0 +1,56 @@ +package com.imurs.util.weblog; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +public class HttpContextUtil { + + public static HttpServletRequest getHttpServletRequest() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (servletRequestAttributes != null) { + return servletRequestAttributes.getRequest(); + } + return null; + } + + /** + * 获取ip + * @return 返回ip + */ + public static String getIpAddress() { + HttpServletRequest request = getHttpServletRequest(); + assert request != null; + String ip = request.getHeader("X-Forwarded-For"); + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + }else if (ip.length() > 15) { + String[] ips = ip.split(","); + for (String s : ips) { + if (!("unknown".equalsIgnoreCase((String) s))) { + ip = (String) s; + break; + } + } + } + return ip; + } + +} diff --git a/backend/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java b/backend/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java new file mode 100644 index 0000000..05f1f4f --- /dev/null +++ b/backend/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java @@ -0,0 +1,43 @@ +package com.imurs.util.weblog; + +import com.imurs.dao.WebLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author wdh + * 定时删除weblog表十五天前的数据 + */ +@Component +@EnableScheduling +public class ScheduledDeleteWeblog { + + @Autowired + private WebLogMapper webLogMapper; + + private final Logger logger = LoggerFactory.getLogger(ScheduledDeleteWeblog.class); + + /** + * @Scheduled 定时器:表示每月每日的十八点启动 *表示每,0表示无 + * 每天下午六点定时删除web_log表十五天前的数据 十五天在WebLogMapper.xml中定义 + */ + @Scheduled(cron = "0 0 18 * * ?") + public void deleteWebLog() { + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + try { + int result = webLogMapper.deleteWebLog(dateFormat.parse(dateFormat.format(date))); + logger.info("成功删除十五天前总共" + result + "条数据!"); + } catch (Exception e) { + logger.info("删除十五天前数据失败:" + e.getMessage()); + } + } + +} diff --git a/backend/src/main/java/com/imurs/util/weblog/WebLogAspect.java b/backend/src/main/java/com/imurs/util/weblog/WebLogAspect.java new file mode 100644 index 0000000..321cb77 --- /dev/null +++ b/backend/src/main/java/com/imurs/util/weblog/WebLogAspect.java @@ -0,0 +1,141 @@ +package com.imurs.util.weblog; + +import com.imurs.entity.WebLog; +import com.imurs.service.WebLogService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +@Aspect +@Order +@Component +public class WebLogAspect { + + @Autowired + private WebLogService webLogService; + + private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); + + ThreadLocal startTime = new ThreadLocal<>(); + ThreadLocal webLogThreadLocal = new ThreadLocal<>(); + + /** + * 表示com.wonder.layui.controller,还有LoginshiroController下的任何子包下公有的任何方法,任何参数 + */ + @Pointcut("execution(public * com.imurs.controller..*.*(..)) || execution(public * com.imurs.shiro.LoginShiroController.*(..))") + public void webLogAll() {} + + /** + * 此切点不包括LoginshiroController里的logout()方法 + */ + @Pointcut("execution(public * com.imurs.controller..*.*(..)) || (execution(public * com.imurs.shiro.LoginShiroController.*(..)) && !execution(public * com.imurs.shiro.LoginShiroController.logout(..)))") + public void webLog() {} + + + /** + * 在切点的方法执行之前执行此方法,记录操作用户的操作信息 + * @param joinPoint + * @throws Throwable + */ + @Before("webLogAll()") + public void doBefore(JoinPoint joinPoint) throws Exception { + startTime.set(System.currentTimeMillis()); + //接收到请求,记录内容 + HttpServletRequest request = HttpContextUtil.getHttpServletRequest(); + String ipAddress = " "; + try { + ipAddress = HttpContextUtil.getIpAddress(); + } catch (Exception e) { + logger.error("ip获取异常",e); + } + //记录开始的时间 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date time = dateFormat.parse(dateFormat.format(startTime.get()) ); + + //记录操作用户 + WebLog webLog = new WebLog(); + webLog.setSuccess(0); + webLog.setIp(ipAddress); + webLog.setStartTime(time); + if (joinPoint != null) { + webLog.setParameter(Arrays.toString(joinPoint.getArgs())); + webLog.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + + "/" + joinPoint.getSignature().getName()); + //打印请求的类路径,哪个类中的哪个方法 + logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + + "/" + joinPoint.getSignature().getName()); + //打印请求的参数 + logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); + } + if (request != null) { + HttpSession session = request.getSession(); + //在登录成功时把name放入了session中 + String name = (String)session.getAttribute("name"); + //记录下请求内容 + logger.info("URL:" + request.getRequestURL().toString()); + logger.info("HTTP_METHOD : " + request.getMethod()); + logger.info("IP : " + request.getRemoteAddr()); + logger.info("ip:"+ipAddress); + + //或者请求网页所在服务器的主机名 + logger.info("serverName :" + request.getServerName()); + logger.info("host :" + request.getHeader("Host")); + + //封装到类中 + webLog.setHttpMethod(request.getMethod()); + webLog.setUrl(request.getRequestURL().toString()); + if (name != null) { + webLog.setUsername(name); + } + } + try { + webLogService.insert(webLog); + } catch (Exception e) { + logger.error("weblog插入异常",e); + } + webLogThreadLocal.set(webLog); + + } + + + /** + * 在切点方法执行成功返回后执行此方法,返回成功信息 + * @param ret + * @throws Throwable + */ + @AfterReturning(returning = "ret", pointcut = "webLog()") + public void doAfterReturning(Object ret) throws Throwable { + // 处理该请求消耗的时间 + long spendTime = System.currentTimeMillis() - startTime.get(); + //请求的返回内容 + //logger.info("RESPONSE : " + ret); + logger.info("SPEND TIME : " + spendTime); + //获取方法执行前的weblog + WebLog webLog = webLogThreadLocal.get(); + + //把请求成功的信息封装到类中 + webLog.setSuccess(1); + webLog.setSpendTime(spendTime); + try { + webLogService.updateById(webLog); + } catch (Exception e) { + logger.error("weblog更新异常",e); + } + startTime.remove(); + webLogThreadLocal.remove(); + } + +} diff --git a/backend/src/main/java/com/imurs/utils/BodyPartCounter.java b/backend/src/main/java/com/imurs/utils/BodyPartCounter.java new file mode 100644 index 0000000..562023a --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/BodyPartCounter.java @@ -0,0 +1,49 @@ +package com.imurs.utils; + +import java.util.*; +import java.util.regex.*; + +public class BodyPartCounter { + // 定义分类及其对应的正则表达式 + private static final Map CATEGORY_PATTERNS = new LinkedHashMap<>(); + + static { + CATEGORY_PATTERNS.put("胸部", Pattern.compile("肺|胸腔|纵隔|胸部")); + CATEGORY_PATTERNS.put("腹部", Pattern.compile("肝[脏]?|胆[囊]?|胰[腺]?|脾|全腹|腹部|腹水|腹腔浅表|右下腹|左下腹|肢|上腹部|腹股沟|腹|肾|膀胱")); + CATEGORY_PATTERNS.put("胃肠道", Pattern.compile("胃|肠[道]?|阑尾|肠系膜|胃肠道|浅表|清表")); + CATEGORY_PATTERNS.put("泌尿系", Pattern.compile("输尿管|泌尿|泌尿系")); + CATEGORY_PATTERNS.put("妇科", Pattern.compile("子宫|附件|卵巢|膀胱及周围组织|妇科|盆腔")); + CATEGORY_PATTERNS.put("产科", Pattern.compile("胎儿|宫腔|产科")); + CATEGORY_PATTERNS.put("乳腺", Pattern.compile("乳腺")); + CATEGORY_PATTERNS.put("颈部", Pattern.compile("双侧颈部|颈部")); + CATEGORY_PATTERNS.put("男性生殖系统", Pattern.compile("睾丸|附睾|输精管|精索|前列腺|阴道")); + CATEGORY_PATTERNS.put("浅表", Pattern.compile("软组织")); + } + + public static int countBodyPartCategories(String input) { + Set matchedCategories = new HashSet<>(); + + // 检查其他分类 + for (Map.Entry entry : CATEGORY_PATTERNS.entrySet()) { + String category = entry.getKey(); + Pattern pattern = entry.getValue(); + + if (pattern.matcher(input).find()) { + matchedCategories.add(category); + } + } + + return matchedCategories.size(); + } + + public static void main(String[] args) { + // 测试用例 + System.out.println(countBodyPartCategories("肾,膀胱,前列腺")); // 2 + System.out.println(countBodyPartCategories("盆腔")); // 1 + System.out.println(countBodyPartCategories("全腹,肠系膜")); // 2 + System.out.println(countBodyPartCategories("浅表B超")); // 1 + System.out.println(countBodyPartCategories("肾,膀胱")); // 2 + System.out.println(countBodyPartCategories("右侧腹股沟")); // 2 + System.out.println(countBodyPartCategories("泌尿,肝脏,胆囊,胰腺,脾")); // 2 + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/imurs/utils/Dateutil.java b/backend/src/main/java/com/imurs/utils/Dateutil.java new file mode 100644 index 0000000..66574ad --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/Dateutil.java @@ -0,0 +1,26 @@ +package com.imurs.utils; + + +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class Dateutil { + + + public static String exchangeDate(String datestr) { + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + + LocalDate date = LocalDate.parse(datestr, inputFormatter); + + String formattedDate = date.format(outputFormatter); + + + return formattedDate; + } + +} diff --git a/backend/src/main/java/com/imurs/utils/Excelvo.java b/backend/src/main/java/com/imurs/utils/Excelvo.java new file mode 100644 index 0000000..ee78e17 --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/Excelvo.java @@ -0,0 +1,41 @@ +package com.imurs.utils; + +import jxl.write.DateTime; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class Excelvo { +// private String language; + private Integer examinePartNum; + private String durationOfConsultation; + private String hospitalName; + private String checkNumber; + private String patientName; + private String gender; + private String age; + private String consultationMode; + private String device; + private String imagingMethod; + private String consultationTime; + private String reportingTime; + private String reviewTime; + private String examinationSite; + private String siteNumber; + private String workTimeType; + private String uploadDoctor; + private String TypeOfMedicalTreatment; + private String reportingDoctor; + private String reportingDoctorBegin; + private String reviewedDoctorBegin; + private String negativeAndPositive; + private String reportContent; + private String diagnosticConclusion; + private String ActualReportToTheDoctor; + private String PracticalDoctor; + private String ActualReviewDoctor; + private String conditions; + private String esrdNumber; +} diff --git a/backend/src/main/java/com/imurs/utils/PositiveResult.java b/backend/src/main/java/com/imurs/utils/PositiveResult.java new file mode 100644 index 0000000..8ec7d49 --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/PositiveResult.java @@ -0,0 +1,11 @@ +package com.imurs.utils; + + +import lombok.Data; + +@Data +public class PositiveResult { + private String positive; + private String totalCount; + private String yangCount; +} diff --git a/backend/src/main/java/com/imurs/utils/handleDuplicate.java b/backend/src/main/java/com/imurs/utils/handleDuplicate.java new file mode 100644 index 0000000..12c5295 --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/handleDuplicate.java @@ -0,0 +1,74 @@ +package com.imurs.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.time.format.DateTimeFormatter; +import java.util.*; + +@Slf4j +public class handleDuplicate { + public static List handleDuplicateRecords(List records) { + // 步骤1:创建分组标识的 Map + Map> groupMap = new LinkedHashMap<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); // 用于时间转换 + + // 步骤2:分组并转换 reportTime 为纯数字 + for (Excelvo record : records) { + String consultationTime = record.getConsultationTime(); + + // 提取并转换 reportTime 为纯数字形式 + String reportTimeNumeric = convertToNumericTime(record.getReportingTime()); + + // 生成分组键:患者姓名 + 年龄 + 纯数字处理时间 + String key = record.getPatientName() + + "|" + record.getAge() + + "|" + consultationTime.replaceAll("[^0-9]", ""); + + // 分组:将记录添加到对应的分组中 + groupMap.computeIfAbsent(key, k -> new ArrayList<>()).add(record); + } + + // 步骤3:分离正常记录和重复记录,并在分组内保留 reportTime 最早的记录 + List result = new ArrayList<>(); + + for (Map.Entry> entry : groupMap.entrySet()) { + List group = entry.getValue(); + + if (group.size() > 1) { + // 如果分组内有多条记录,找到 reportTime 最小的记录 + Excelvo earliestRecord = group.stream() + .min(Comparator.comparing( + r -> convertToNumericTime(r.getReportingTime()) + )) + .orElse(null); + + if (earliestRecord != null) { + System.err.println("重复病例中最早的病例"+earliestRecord); + result.add(earliestRecord); // 保留最早的记录 + } + } else { + // 如果分组内只有一条记录,直接添加到结果中 + result.add(group.get(0)); + } + } + + // 可选:对最终结果按照 reportTime 升序排序 +// result.sort(Comparator.comparing( +// r -> convertToNumericTime(r.getReportingTime()) +// )); + System.err.println("总数据数:"+result.stream().count()); + return result; + } + + + private static String convertToNumericTime(String timeStr) { + if (timeStr == null || timeStr.isEmpty()) { + throw new IllegalArgumentException("时间字符串不能为空"); + } + + // 假设时间格式为 "yyyy-MM-dd HH:mm:ss" 或其他包含非数字字符的格式 + // 使用正则表达式去除所有非数字字符 + return timeStr.replaceAll("[^0-9]", ""); + } + +} diff --git a/backend/src/main/java/com/imurs/utils/positiveCount.java b/backend/src/main/java/com/imurs/utils/positiveCount.java new file mode 100644 index 0000000..7609b70 --- /dev/null +++ b/backend/src/main/java/com/imurs/utils/positiveCount.java @@ -0,0 +1,31 @@ +package com.imurs.utils; + + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class positiveCount { + + public static PositiveResult countPositive(List> result) { + Map yinYangCount = result.stream() + .collect(Collectors.groupingBy(map -> map.get("negativeAndPositive").toString(), + Collectors.counting())); + + Long yangCount = yinYangCount.getOrDefault("阳", 0L); + + long total = result.size(); + // System.err.println("阳:" + yangCount + ",总数:" + total); + double count = ((double)yangCount/total) * 100; + + String positive = String.format("阳性率为: %.2f%%", count); + // System.err.println(positive); + PositiveResult positiveResult = new PositiveResult(); + positiveResult.setPositive(positive); + positiveResult.setTotalCount("阴阳总数为:"+total); + positiveResult.setYangCount("阳性总数为:"+yangCount); + + + return positiveResult; + } +} diff --git a/backend/src/main/java/com/imurs/websocket/SessionCacheManager.java b/backend/src/main/java/com/imurs/websocket/SessionCacheManager.java new file mode 100644 index 0000000..4137c62 --- /dev/null +++ b/backend/src/main/java/com/imurs/websocket/SessionCacheManager.java @@ -0,0 +1,115 @@ +package com.imurs.websocket; + + +import com.google.common.cache.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.Session; +import java.util.concurrent.TimeUnit; + +/** + * @author w + * 设置缓存 + */ +public class SessionCacheManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(SessionCacheManager.class); + + /** 缓存项最大数量 */ + private static final long GUAVA_CACHE_SIZE = 100000; + + /** 缓存时间:天 */ + private static final long GUAVA_CACHE_DAYS = 1; + + /** 缓存操作对象 */ + private static LoadingCache GLOBAL_CACHE = null; + + static { + try { + GLOBAL_CACHE = loadCache(new CacheLoader() { + @Override + public Session load(String key) throws Exception { + // 处理缓存键不存在缓存值时的处理逻辑 + return null; + } + }); + } catch (Exception e) { + LOGGER.error("初始化Guava Cache出错", e); + } + } + + /** + * 全局缓存设置 + * @param cacheLoader + * @return + * @throws Exception + */ + private static LoadingCache loadCache(CacheLoader cacheLoader) throws Exception { + LoadingCache cache = CacheBuilder.newBuilder() + //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 + .maximumSize(GUAVA_CACHE_SIZE) + //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护) + .expireAfterAccess(GUAVA_CACHE_DAYS, TimeUnit.DAYS) + // 设置缓存在写入之后 设定时间 后失效 + .expireAfterWrite(GUAVA_CACHE_DAYS, TimeUnit.DAYS) + //移除监听器,缓存项被移除时会触发 + .removalListener(new RemovalListener() { + @Override + public void onRemoval(RemovalNotification rn) { + //逻辑操作 + } + }) + //开启Guava Cache的统计功能 + .recordStats() + .build(cacheLoader); + return cache; + } + + /** + * 设置缓存值 + * @param key + * @param value + */ + public static void put(String key, Session value) { + try { + GLOBAL_CACHE.put(key, value); + } catch (Exception e) { + LOGGER.error("设置缓存值出错", e); + } + } + + + /** + * 获取缓存值 + * @param key + * @return + */ + public static Session get(String key) { + Session token; + try { + token = GLOBAL_CACHE.get(key); + return token; + } catch (CacheLoader.InvalidCacheLoadException e) { + LOGGER.warn("key为" + key + "时没有从缓存获取到数据,返回null"); + } catch (Exception e) { + LOGGER.error("获取缓存值出错", e); + } + return null; + } + + + /** + * 移除缓存值 + * @param key + */ + public static void remove(String key) { + try { + GLOBAL_CACHE.invalidate(key); + } catch (Exception e) { + LOGGER.error("移除缓存出错", e); + } + } + + +} diff --git a/backend/src/main/java/com/imurs/websocket/WebSocketConfig.java b/backend/src/main/java/com/imurs/websocket/WebSocketConfig.java new file mode 100644 index 0000000..7212898 --- /dev/null +++ b/backend/src/main/java/com/imurs/websocket/WebSocketConfig.java @@ -0,0 +1,30 @@ +package com.imurs.websocket; + +import com.imurs.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * @author w + */ +@Configuration +public class WebSocketConfig { + + /** + * @return 部署到线上需要注释掉这个bean + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + + /** + * @param userService 提前注入spring + */ + @Autowired + private void setUserService(UserService userService) { + WebSocketServer.userService = userService; + } +} diff --git a/backend/src/main/java/com/imurs/websocket/WebSocketServer.java b/backend/src/main/java/com/imurs/websocket/WebSocketServer.java new file mode 100644 index 0000000..dcf8b2a --- /dev/null +++ b/backend/src/main/java/com/imurs/websocket/WebSocketServer.java @@ -0,0 +1,169 @@ +package com.imurs.websocket; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author w + */ +@ServerEndpoint(value = "/ws/asset/{username}") +@Component +public class WebSocketServer { + + /** + * websocket容器启动优先与spring容器,直接注入会有空指针异常 + */ + public static UserService userService; + + @PostConstruct + public void init() { + System.out.println("============websocket加载=========="); + } + + /** + * 判断toUser是否为所有专家 + */ + private static final String ALL_SPECIALIST = "allSpecialist"; + + /** + * 前端测试连接是否中断 + */ + private static final String CONNECT_TEST = "test"; + + private static final Logger logger = LoggerFactory.getLogger(WebSocketServer.class); + + private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(); + + /** + * concurrent包的线程安全Set,用来存放专家客户端的Session对象。 + */ + private static final CopyOnWriteArraySet SESSION_SET = new CopyOnWriteArraySet<>(); + + /** + * 连接建立成功调用的方法 + * @param session + */ + @OnOpen + public void onOpen(Session session, @PathParam("username")String userName) { + SessionCacheManager.put(userName,session); + String phone = userName.substring(0,11); + User user = userService.selectUserByPhone(phone); + if (user != null && user.getRid() == 6) { + SESSION_SET.add(session); + logger.info("查询到专家登录,加入专家房间"); + } + //在线数加1 + int cnt = ONLINE_COUNT.incrementAndGet(); + logger.info("有连接加入,当前连接数为" + cnt + " key=" + userName + " value=" + session.getId()); + } + + /** + * 连接关闭调用的方法 + * @param session + */ + @OnClose + public void onClose(Session session,@PathParam("username")String userName) { + if (SessionCacheManager.get(userName).getId().equals(session.getId())) { + SessionCacheManager.remove(userName); + logger.info(userName + "的用户会话" + "已被移除"); + } + SESSION_SET.remove(session); + int cnt = ONLINE_COUNT.decrementAndGet(); + logger.info("有连接关闭,当前连接数为" + cnt); + } + + /** + * 收到客户端信息后调用的方法 + * @param messageFromClient 客户端发来的消息 + * @param session 发送者的session + */ + @OnMessage + public void onMessage(String messageFromClient, Session session) throws IOException { + logger.info("=====收到消息======" + messageFromClient); + JSONObject object = JSON.parseObject(messageFromClient); + Map map = new HashMap<>(8); + // 消息内容 + String message = Optional.ofNullable(object.get("message")).map(Object::toString).orElse(""); + // 发送消息者 + String fromUser = Optional.ofNullable((String) object.get("fromUser")).orElse(""); + // 接收消息者 + String toUser = Optional.ofNullable((String) object.get("toUser")).orElse(""); + // 要执行的动作 + String action = Optional.ofNullable((String) object.get("action")).orElse(""); + + map.put("message",message); + map.put("fromUser",fromUser); + map.put("toUser",toUser); + map.put("action",action); + + // 群发给所有专家 + if (ALL_SPECIALIST.equals(toUser)) { + broadCastInfo(map); + } + // 测试用,收到测试消息发送回去给发送者 + if (CONNECT_TEST.equals(toUser)) { + sendMessage(session,map); + } + // 把收到的消息转给接收者 + if (SessionCacheManager.get(toUser) != null) { + sendMessage(Objects.requireNonNull(SessionCacheManager.get(toUser)),map); + } + } + + + /** + * 出现错误 + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + logger.error("发生错误:{},sessionId是:{}",error.getMessage(),session.getId()); + error.printStackTrace(); + } + + /** + * 发送消息,实践表明,每次浏览器刷新,session会发生变化。 + * @param session + */ + public static void sendMessage(Session session, Map map) { + try { + session.getBasicRemote().sendText(new Gson().toJson(map)); + } catch (IOException e) { + logger.error("发送消息出错:{}", e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 群发消息 + * @param map + * @throws IOException + */ + public static void broadCastInfo(Map map) throws IOException { + for (Session session : SESSION_SET) { + if(session.isOpen()) { + sendMessage(session, map); + } + } + } + +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties new file mode 100644 index 0000000..8f73510 --- /dev/null +++ b/backend/src/main/resources/application.properties @@ -0,0 +1,53 @@ +#关闭页面缓存 + spring.thymeleaf.cache=false + +#tomcat +server.jsp-servlet.init-parameters.development=true +server.port=1011 + + +#ElasticSearch +es.enabled=false +es.url= http://192.168.2.110 +es.port=9200 +spring.data.elasticsearch.repositories.enabled=false +spring.main.allow-bean-definition-overriding=true +spring.main.allow-circular-references=true +spring.datasource.url=jdbc:mysql://39.108.252.248:3306/yd_gzlps_test?characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true +spring.datasource.username=root +spring.datasource.password=Zp.123456 +management.health.elasticsearch.enabled=false + + +#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl +spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver +spring.datasource.type= com.alibaba.druid.pool.DruidDataSource + +#druid_config +spring.datasource.max-active= 50 +spring.datasource.initial-size= 5 +spring.datasource.min-idle= 3 +spring.datasource.max-wait= 60000 +spring.datasource.time-between-eviction-runs-millis= 60000 +spring.datasource.min-evictable-idle-time-millis= 300000 +spring.datasource.test-while-idle= true +spring.datasource.test-on-borrow= false +spring.datasource.test-on-return= false +spring.datasource.poolPreparedStatements= true +spring.datasource.filters= stat,wall,slf4j + + +mybatis.mapper-locations=classpath*:/dao/**/**.xml + +# log_config DEBUG ERROR INFO WARN +logging.level.root= INFO +logging.level.io.z77z.dao= DEBUG +logging.file= ./logs/spring-boot-logging.log +logging.pattern.console= %d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n +logging.pattern.file= %d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n + +#crawler +#crawler.img.local= c:\\imag/ + + diff --git a/backend/src/main/resources/dao/AgoraRecordMapper.xml b/backend/src/main/resources/dao/AgoraRecordMapper.xml new file mode 100644 index 0000000..7d70f48 --- /dev/null +++ b/backend/src/main/resources/dao/AgoraRecordMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/AiQcVocabularyMapper.xml b/backend/src/main/resources/dao/AiQcVocabularyMapper.xml new file mode 100644 index 0000000..88475eb --- /dev/null +++ b/backend/src/main/resources/dao/AiQcVocabularyMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/dao/ApiUrlMapper.xml b/backend/src/main/resources/dao/ApiUrlMapper.xml new file mode 100644 index 0000000..ad0f566 --- /dev/null +++ b/backend/src/main/resources/dao/ApiUrlMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyBModeImgMapper.xml b/backend/src/main/resources/dao/ApplyBModeImgMapper.xml new file mode 100644 index 0000000..0f49c8f --- /dev/null +++ b/backend/src/main/resources/dao/ApplyBModeImgMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyBModeMapper.xml b/backend/src/main/resources/dao/ApplyBModeMapper.xml new file mode 100644 index 0000000..9766a3d --- /dev/null +++ b/backend/src/main/resources/dao/ApplyBModeMapper.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyBModeSpecialistMapper.xml b/backend/src/main/resources/dao/ApplyBModeSpecialistMapper.xml new file mode 100644 index 0000000..e5f41fa --- /dev/null +++ b/backend/src/main/resources/dao/ApplyBModeSpecialistMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyCaseImgMapper.xml b/backend/src/main/resources/dao/ApplyCaseImgMapper.xml new file mode 100644 index 0000000..d30ca11 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyCaseImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyCaseMapper.xml b/backend/src/main/resources/dao/ApplyCaseMapper.xml new file mode 100644 index 0000000..d7fd510 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyCaseMapper.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update apply_case set statu = #{statu} + + , inpatient = #{inpatient} + + + ,consultation_time = #{consultation_time} + + where pt_card =#{pt_card} and id= #{id} + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyConsulationSpecialist.xml b/backend/src/main/resources/dao/ApplyConsulationSpecialist.xml new file mode 100644 index 0000000..9dda0a2 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyConsulationSpecialist.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyConsultationImgMapper.xml b/backend/src/main/resources/dao/ApplyConsultationImgMapper.xml new file mode 100644 index 0000000..aa48575 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyConsultationImgMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyConsultationMapper.xml b/backend/src/main/resources/dao/ApplyConsultationMapper.xml new file mode 100644 index 0000000..749761f --- /dev/null +++ b/backend/src/main/resources/dao/ApplyConsultationMapper.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyDoctorPromoteMapper.xml b/backend/src/main/resources/dao/ApplyDoctorPromoteMapper.xml new file mode 100644 index 0000000..25eae53 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyDoctorPromoteMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/dao/ApplyEcgImgMapper.xml b/backend/src/main/resources/dao/ApplyEcgImgMapper.xml new file mode 100644 index 0000000..fa2331e --- /dev/null +++ b/backend/src/main/resources/dao/ApplyEcgImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyEcgMapper.xml b/backend/src/main/resources/dao/ApplyEcgMapper.xml new file mode 100644 index 0000000..161fe95 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyEcgMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyEcgSpecialistMapper.xml b/backend/src/main/resources/dao/ApplyEcgSpecialistMapper.xml new file mode 100644 index 0000000..9ae822c --- /dev/null +++ b/backend/src/main/resources/dao/ApplyEcgSpecialistMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyInformationImgMapper.xml b/backend/src/main/resources/dao/ApplyInformationImgMapper.xml new file mode 100644 index 0000000..734b101 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyInformationImgMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyInformationMapper.xml b/backend/src/main/resources/dao/ApplyInformationMapper.xml new file mode 100644 index 0000000..79d0b19 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyInformationMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE apply_information + SET + group_alias = #{item.groupAlias} + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyLisMapper.xml b/backend/src/main/resources/dao/ApplyLisMapper.xml new file mode 100644 index 0000000..744ca61 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyLisMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyPathologyFileMapper.xml b/backend/src/main/resources/dao/ApplyPathologyFileMapper.xml new file mode 100644 index 0000000..883f1e1 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyPathologyFileMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyPathologyImgMapper.xml b/backend/src/main/resources/dao/ApplyPathologyImgMapper.xml new file mode 100644 index 0000000..62c4276 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyPathologyImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyPathologyMapper.xml b/backend/src/main/resources/dao/ApplyPathologyMapper.xml new file mode 100644 index 0000000..eab27a8 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyPathologyMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplyPathologySpecialistMapper.xml b/backend/src/main/resources/dao/ApplyPathologySpecialistMapper.xml new file mode 100644 index 0000000..57fe490 --- /dev/null +++ b/backend/src/main/resources/dao/ApplyPathologySpecialistMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ApplySpecialistMapper.xml b/backend/src/main/resources/dao/ApplySpecialistMapper.xml new file mode 100644 index 0000000..1569287 --- /dev/null +++ b/backend/src/main/resources/dao/ApplySpecialistMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BModeHistoryMapper.xml b/backend/src/main/resources/dao/BModeHistoryMapper.xml new file mode 100644 index 0000000..be8def8 --- /dev/null +++ b/backend/src/main/resources/dao/BModeHistoryMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BModeReportMapper.xml b/backend/src/main/resources/dao/BModeReportMapper.xml new file mode 100644 index 0000000..c9936c7 --- /dev/null +++ b/backend/src/main/resources/dao/BModeReportMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BdiagnosisMapper.xml b/backend/src/main/resources/dao/BdiagnosisMapper.xml new file mode 100644 index 0000000..9d387f4 --- /dev/null +++ b/backend/src/main/resources/dao/BdiagnosisMapper.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BdiagnosisNextMapper.xml b/backend/src/main/resources/dao/BdiagnosisNextMapper.xml new file mode 100644 index 0000000..a497162 --- /dev/null +++ b/backend/src/main/resources/dao/BdiagnosisNextMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BmodelFrisMapper.xml b/backend/src/main/resources/dao/BmodelFrisMapper.xml new file mode 100644 index 0000000..c363474 --- /dev/null +++ b/backend/src/main/resources/dao/BmodelFrisMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BmodelMapper.xml b/backend/src/main/resources/dao/BmodelMapper.xml new file mode 100644 index 0000000..dcfb4a8 --- /dev/null +++ b/backend/src/main/resources/dao/BmodelMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/BmodelSecondMapper.xml b/backend/src/main/resources/dao/BmodelSecondMapper.xml new file mode 100644 index 0000000..549dbb7 --- /dev/null +++ b/backend/src/main/resources/dao/BmodelSecondMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/CaseTemplateMapper.xml b/backend/src/main/resources/dao/CaseTemplateMapper.xml new file mode 100644 index 0000000..f1bc5db --- /dev/null +++ b/backend/src/main/resources/dao/CaseTemplateMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ClinicalGuidelinesMapper.xml b/backend/src/main/resources/dao/ClinicalGuidelinesMapper.xml new file mode 100644 index 0000000..5fbcfdd --- /dev/null +++ b/backend/src/main/resources/dao/ClinicalGuidelinesMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/DoctorArrangeMapper.xml b/backend/src/main/resources/dao/DoctorArrangeMapper.xml new file mode 100644 index 0000000..cd5df15 --- /dev/null +++ b/backend/src/main/resources/dao/DoctorArrangeMapper.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/DoctorGroupMapper.xml b/backend/src/main/resources/dao/DoctorGroupMapper.xml new file mode 100644 index 0000000..1802c5b --- /dev/null +++ b/backend/src/main/resources/dao/DoctorGroupMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + id,group_name,group_alias,description,leader_doctor_id,status, + create_time,update_time + + diff --git a/backend/src/main/resources/dao/HomePageShowMapper.xml b/backend/src/main/resources/dao/HomePageShowMapper.xml new file mode 100644 index 0000000..b22e387 --- /dev/null +++ b/backend/src/main/resources/dao/HomePageShowMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/ImgArrangeMapper.xml b/backend/src/main/resources/dao/ImgArrangeMapper.xml new file mode 100644 index 0000000..361d207 --- /dev/null +++ b/backend/src/main/resources/dao/ImgArrangeMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/InoneagentBloodMapper.xml b/backend/src/main/resources/dao/InoneagentBloodMapper.xml new file mode 100644 index 0000000..d61712f --- /dev/null +++ b/backend/src/main/resources/dao/InoneagentBloodMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/InoneagentEcgMapper.xml b/backend/src/main/resources/dao/InoneagentEcgMapper.xml new file mode 100644 index 0000000..4a1e104 --- /dev/null +++ b/backend/src/main/resources/dao/InoneagentEcgMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/InoneagentPersionMapper.xml b/backend/src/main/resources/dao/InoneagentPersionMapper.xml new file mode 100644 index 0000000..35a562f --- /dev/null +++ b/backend/src/main/resources/dao/InoneagentPersionMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/InoneagentUrineMapper.xml b/backend/src/main/resources/dao/InoneagentUrineMapper.xml new file mode 100644 index 0000000..9c8d150 --- /dev/null +++ b/backend/src/main/resources/dao/InoneagentUrineMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/InstallModelMapper.xml b/backend/src/main/resources/dao/InstallModelMapper.xml new file mode 100644 index 0000000..3e6a8f7 --- /dev/null +++ b/backend/src/main/resources/dao/InstallModelMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/LiveMapper.xml b/backend/src/main/resources/dao/LiveMapper.xml new file mode 100644 index 0000000..4e22aa8 --- /dev/null +++ b/backend/src/main/resources/dao/LiveMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/LoginRecordMapper.xml b/backend/src/main/resources/dao/LoginRecordMapper.xml new file mode 100644 index 0000000..de7dfb0 --- /dev/null +++ b/backend/src/main/resources/dao/LoginRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/PatientMapper.xml b/backend/src/main/resources/dao/PatientMapper.xml new file mode 100644 index 0000000..e3a260f --- /dev/null +++ b/backend/src/main/resources/dao/PatientMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/PatientUserMapper.xml b/backend/src/main/resources/dao/PatientUserMapper.xml new file mode 100644 index 0000000..8d61eb4 --- /dev/null +++ b/backend/src/main/resources/dao/PatientUserMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/PatientUserRecordImgMapper.xml b/backend/src/main/resources/dao/PatientUserRecordImgMapper.xml new file mode 100644 index 0000000..bca55fa --- /dev/null +++ b/backend/src/main/resources/dao/PatientUserRecordImgMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/PatientUserRecordMapper.xml b/backend/src/main/resources/dao/PatientUserRecordMapper.xml new file mode 100644 index 0000000..94343d7 --- /dev/null +++ b/backend/src/main/resources/dao/PatientUserRecordMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/RoleMapper.xml b/backend/src/main/resources/dao/RoleMapper.xml new file mode 100644 index 0000000..5ffeb4a --- /dev/null +++ b/backend/src/main/resources/dao/RoleMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/SectionMapper.xml b/backend/src/main/resources/dao/SectionMapper.xml new file mode 100644 index 0000000..0d17b50 --- /dev/null +++ b/backend/src/main/resources/dao/SectionMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/SysMenuMapper.xml b/backend/src/main/resources/dao/SysMenuMapper.xml new file mode 100644 index 0000000..88e9e18 --- /dev/null +++ b/backend/src/main/resources/dao/SysMenuMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml b/backend/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml new file mode 100644 index 0000000..d1346e1 --- /dev/null +++ b/backend/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TotalInformationMapper.xml b/backend/src/main/resources/dao/TotalInformationMapper.xml new file mode 100644 index 0000000..57339a4 --- /dev/null +++ b/backend/src/main/resources/dao/TotalInformationMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TotalTrainingMapper.xml b/backend/src/main/resources/dao/TotalTrainingMapper.xml new file mode 100644 index 0000000..fb2455c --- /dev/null +++ b/backend/src/main/resources/dao/TotalTrainingMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TrainingFlowerMapper.xml b/backend/src/main/resources/dao/TrainingFlowerMapper.xml new file mode 100644 index 0000000..b2f5f70 --- /dev/null +++ b/backend/src/main/resources/dao/TrainingFlowerMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TrainingMapper.xml b/backend/src/main/resources/dao/TrainingMapper.xml new file mode 100644 index 0000000..9ea4edb --- /dev/null +++ b/backend/src/main/resources/dao/TrainingMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TrainingOpinionMapper.xml b/backend/src/main/resources/dao/TrainingOpinionMapper.xml new file mode 100644 index 0000000..56c0685 --- /dev/null +++ b/backend/src/main/resources/dao/TrainingOpinionMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TrainingPlanMapper.xml b/backend/src/main/resources/dao/TrainingPlanMapper.xml new file mode 100644 index 0000000..97e5de2 --- /dev/null +++ b/backend/src/main/resources/dao/TrainingPlanMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/TrainingRecordMapper.xml b/backend/src/main/resources/dao/TrainingRecordMapper.xml new file mode 100644 index 0000000..9c9a5d7 --- /dev/null +++ b/backend/src/main/resources/dao/TrainingRecordMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/UserMapper.xml b/backend/src/main/resources/dao/UserMapper.xml new file mode 100644 index 0000000..2077547 --- /dev/null +++ b/backend/src/main/resources/dao/UserMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE user + SET + group_alias = #{item.groupAlias} + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/VideoRecordMapper.xml b/backend/src/main/resources/dao/VideoRecordMapper.xml new file mode 100644 index 0000000..21b1113 --- /dev/null +++ b/backend/src/main/resources/dao/VideoRecordMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/dao/WebLogMapper.xml b/backend/src/main/resources/dao/WebLogMapper.xml new file mode 100644 index 0000000..5c75a6a --- /dev/null +++ b/backend/src/main/resources/dao/WebLogMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + delete from web_log where datediff(#{date},start_time) >= 15 + + + \ No newline at end of file diff --git a/backend/src/main/resources/ehcache-shiro.xml b/backend/src/main/resources/ehcache-shiro.xml new file mode 100644 index 0000000..c5963e9 --- /dev/null +++ b/backend/src/main/resources/ehcache-shiro.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/export-template.xlsx b/backend/src/main/resources/export-template.xlsx new file mode 100644 index 0000000..96f6ed4 Binary files /dev/null and b/backend/src/main/resources/export-template.xlsx differ diff --git a/backend/src/main/resources/jar/elasticsearch-2.4.0.jar b/backend/src/main/resources/jar/elasticsearch-2.4.0.jar new file mode 100644 index 0000000..ce33756 Binary files /dev/null and b/backend/src/main/resources/jar/elasticsearch-2.4.0.jar differ diff --git a/backend/src/main/resources/logback-spring.xml b/backend/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..14ba9a0 --- /dev/null +++ b/backend/src/main/resources/logback-spring.xml @@ -0,0 +1,193 @@ + + + + + + + logback-spring + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${logging.path}/web_debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${logging.path}/web_info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${logging.path}/web-info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${logging.path}/web_warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${logging.path}/web_error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${logging.path}/web-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mybatis-generator.xml b/backend/src/main/resources/mybatis-generator.xml new file mode 100644 index 0000000..3f13231 --- /dev/null +++ b/backend/src/main/resources/mybatis-generator.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
\ No newline at end of file diff --git a/backend/temp_mapping.txt b/backend/temp_mapping.txt new file mode 100644 index 0000000..1182f69 Binary files /dev/null and b/backend/temp_mapping.txt differ diff --git a/frontend/.babelrc b/frontend/.babelrc new file mode 100644 index 0000000..13b604e --- /dev/null +++ b/frontend/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "ignore": [ + "./src/components/system/public/TComm/TComm-mini.js" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"] +} diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..6697216 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.svn +.history +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..8a243e1 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,23 @@ +# imurs + +> A Vue.js project + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build + +# build for production and view the bundle analyzer report +npm run build --report +``` + +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). + +## Copy the yunnan_web_suixi project diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..b6b5ce0 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,23 @@ + + + + + + + 灌南县中医医院-医共体远程超声系统 + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..9886b19 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@/*": ["src/*"], + "assets/*": ["src/assets/*"], + "agora/*": ["src/agora/*"], + "public/*": ["src/components/system/public/*"], + }, + }, + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..cf01662 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,19402 @@ +{ + "name": "imurs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "imurs", + "version": "1.0.0", + "dependencies": { + "agora-rtc-sdk-ng": "^4.19.3", + "agora-rtm-sdk": "^1.2.0", + "ali-oss": "^6.0.1", + "awaitqueue": "^3.2.2", + "axios": "^1.7.3", + "crypto-js": "^4.2.0", + "echarts": "^5.6.0", + "element-china-area-data": "^4.1.1", + "element-ui": "^2.15.0", + "events": "^3.0.0", + "jsencrypt": "^3.3.2", + "lodash": "^4.14.2", + "moment": "^2.22.2", + "pdfjs-dist": "^2.12.313", + "pdfvuer": "^1.7.4", + "socket.io-client": "^4.7.5", + "viewerjs": "^1.3.1", + "vue": "^2.5.2", + "vue-router": "^3.0.1", + "vuex": "^3.6.2" + }, + "devDependencies": { + "@rollup/plugin-inject": "^5.0.5", + "@vitejs/plugin-vue2": "^2.3.1", + "@vitejs/plugin-vue2-jsx": "^1.1.1", + "sass": "^1.77.8", + "vite": "^5.3.4", + "vite-plugin-chunk-split": "^0.5.0" + } + }, + "node_modules/@achrinza/node-ipc": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz", + "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==", + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 10 || 12 || 14 || 16 || 17" + } + }, + "node_modules/@agora-js/media": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/media/-/media-4.19.3.tgz", + "integrity": "sha512-isdguA/wAYRILVN831Xuyaz7MWqhWBECuAoIQg+7aATbRNtNO8Y/OvWpb9dhHnUgyf8V/CIH1wz/6dWXQtIXTA==", + "dependencies": { + "@agora-js/report": "^4.19.3", + "@agora-js/shared": "^4.19.3", + "agora-rte-extension": "^1.2.3", + "axios": "^0.27.2", + "pako": "^2.1.0", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/@agora-js/media/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/media/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@agora-js/media/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@agora-js/report": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/report/-/report-4.19.3.tgz", + "integrity": "sha512-g64mpKEhuItmoKv8YJdjJAZyFxKwfCtOZ99RZ2d2HcN9yuKT7WoMJ1TbHdCl9nwigtxBloZTv49ukOp2qIUpcw==", + "dependencies": { + "@agora-js/shared": "^4.19.3", + "axios": "^0.27.2" + } + }, + "node_modules/@agora-js/report/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/report/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@agora-js/shared": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/shared/-/shared-4.19.3.tgz", + "integrity": "sha512-APC7HEA4240pSTk3Ri++lzzW+E4lr35YsgU8Va4WciLDQSlDrTybxiyY0gdZ5DqhrRE4Si0bOX32yc3p1HllWg==", + "dependencies": { + "axios": "^0.27.2", + "ua-parser-js": "^0.7.34" + } + }, + "node_modules/@agora-js/shared/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/shared/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "dependencies": { + "@babel/types": "^7.27.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==", + "dependencies": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmmirror.com/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "peer": true, + "dependencies": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@intervolga/optimize-cssnano-plugin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/@intervolga/optimize-cssnano-plugin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "peer": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dependencies": { + "easy-stack": "1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "peer": true, + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "peer": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "peer": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "peer": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "peer": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "peer": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "peer": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "peer": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "peer": true + }, + "node_modules/@types/node": { + "version": "24.0.4", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.0.4.tgz", + "integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==", + "peer": true, + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmmirror.com/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "peer": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "peer": true + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/@types/source-list-map/-/source-list-map-0.1.6.tgz", + "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", + "peer": true + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/@types/tapable/-/tapable-1.0.12.tgz", + "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", + "peer": true + }, + "node_modules/@types/uglify-js": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/@types/uglify-js/-/uglify-js-3.17.5.tgz", + "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", + "peer": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.40", + "resolved": "https://registry.npmmirror.com/@types/webpack/-/webpack-4.41.40.tgz", + "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmmirror.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "peer": true, + "dependencies": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vitejs/plugin-vue2": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue2/-/plugin-vue2-2.3.3.tgz", + "integrity": "sha512-qexY6+bbwY8h0AZerzUuGywNTi0cLOkbiSbggr0R3WEW95iB2hblQFyv4MAkkc2vm4gZN1cO5kzT1Kp6xlVzZw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >= 16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "vue": "^2.7.0-0" + } + }, + "node_modules/@vitejs/plugin-vue2-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue2-jsx/-/plugin-vue2-jsx-1.1.1.tgz", + "integrity": "sha512-r6BjWP2aVg4/uXdjf+wMwLuk0LQEUbPTC9UcRpWMhWsfVl9n/8RhiG6pQPO9g+oab/g3fHoZ2bmJJbKuraqCsw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.20.2", + "@rollup/pluginutils": "^5.0.2", + "@vue/babel-preset-jsx": "^1.4.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "peerDependencies": { + "vite": "^2.9.13 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "vue": "^2.7.0" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-4.5.19.tgz", + "integrity": "sha512-GdxvNSmOw7NHIazCO8gTK+xZbaOmScTtxj6eHVeMbYpDYVPJ+th3VMLWNpw/b6uOjwzzcyKlA5dRQ1DAb+gF/g==", + "peer": true + }, + "node_modules/@vue/cli-shared-utils": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz", + "integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==", + "dependencies": { + "@achrinza/node-ipc": "9.2.2", + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "optional": true, + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "optional": true, + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "peer": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "peer": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "peer": true + }, + "node_modules/@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "peer": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "html-webpack-plugin": ">=2.26.0", + "webpack": ">=4.0.0" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", + "optional": true, + "peer": true + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "peer": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/agora-rtc-sdk-ng": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.19.3.tgz", + "integrity": "sha512-vzIZ2wHoVRM/38YTCKIP6nQ3ehiBUfvpExsJw4Ala9QhCK6J8qMxmZxqBoNmz6jigMfMWi7c8UVZThbaNQM6Pg==", + "dependencies": { + "@agora-js/media": "^4.19.3", + "@agora-js/report": "^4.19.3", + "@agora-js/shared": "^4.19.3", + "agora-rte-extension": "^1.2.3", + "axios": "^0.27.2", + "formdata-polyfill": "^4.0.7", + "ua-parser-js": "^0.7.34", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/agora-rtc-sdk-ng/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/agora-rtc-sdk-ng/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/agora-rte-extension": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/agora-rte-extension/-/agora-rte-extension-1.2.3.tgz", + "integrity": "sha512-k3yNrYVyzJRoQJjaJUktKUI1XRtf8J1XsW8OzYKFqGlS8WQRMsES1+Phj2rfuEriiLObfuyuCimG6KHQCt5tiw==" + }, + "node_modules/agora-rtm-sdk": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/agora-rtm-sdk/-/agora-rtm-sdk-1.5.1.tgz", + "integrity": "sha512-4zMZVijEOTimIaY4VUS6kJxg7t+nTV3Frtt01Ffs6dvkOrPmpeuCu/1MX88QgAOE04IBiLo0l89ysc+woVn2FA==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ali-oss": { + "version": "6.17.1", + "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz", + "integrity": "sha512-v2oT3UhSJTH/LrsscVvi7iEGrnundydNaFzpYAKatqOl4JNcBV4UiwtlJU+ZHLys040JH2k+CutznA0GoE+P2w==", + "dependencies": { + "address": "^1.0.0", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^2.2.0", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.0.0", + "js-base64": "^2.5.2", + "jstoxml": "^2.0.0", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "mz-modules": "^2.1.0", + "platform": "^1.3.1", + "pump": "^3.0.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "^2.33.1", + "utility": "^1.8.0", + "xml2js": "^0.4.16" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "peer": true + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "peer": true, + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "peer": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "peer": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "peer": true + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "peer": true + }, + "node_modules/async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", + "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", + "dependencies": { + "babel-runtime": "6.x" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "peer": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/awaitqueue": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/awaitqueue/-/awaitqueue-3.2.2.tgz", + "integrity": "sha512-48FaZ48Rzb+ypT7PqwcAikewjWoWurgi0ufdQAYWDYWtijF43pX+r3oA6IkeZhFcRCW4BAlIhrHVSpjLjkYk8Q==", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, + "node_modules/awaitqueue/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dependencies": { + "babylon": "^6.18.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmmirror.com/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "peer": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "peer": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bindings/node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "peer": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "peer": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "peer": true + }, + "node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-rsa/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "peer": true + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "peer": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "peer": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "peer": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/cache-loader/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "peer": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cache-loader/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/cache-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "peer": true + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "peer": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "peer": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "peer": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "peer": true + }, + "node_modules/china-area-data": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/china-area-data/-/china-area-data-5.0.1.tgz", + "integrity": "sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cipher-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "peer": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "peer": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clipboardy/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==" + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "peer": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "peer": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "peer": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "node_modules/concat-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "peer": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "peer": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "peer": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "peer": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "peer": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "peer": true + }, + "node_modules/copy-webpack-plugin/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "peer": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "peer": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "peer": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "peer": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "peer": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "peer": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "peer": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "peer": true + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug-fabulous": { + "version": "0.0.4", + "resolved": "https://registry.npmmirror.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "integrity": "sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==", + "dependencies": { + "debug": "2.X", + "lazy-debug-legacy": "0.0.X", + "object-assign": "4.1.0" + } + }, + "node_modules/debug-fabulous/node_modules/object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "peer": true, + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "peer": true, + "dependencies": { + "execa": "^3.3.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "peer": true + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==", + "dependencies": { + "os-name": "~1.0.3" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "peer": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "peer": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/digest-header": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-1.0.0.tgz", + "integrity": "sha512-sRTuakZ2PkOUCuAaVv+SLjhr/hRf8ldZP0XnGEQ69RFGxmll5fVaMsnRXWKKK4XsUTnJf8+eRPSFNgE/lWa9wQ==", + "dependencies": { + "utility": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "peer": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "peer": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "peer": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "peer": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "peer": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "peer": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "peer": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==", + "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix." + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "peer": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "peer": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "peer": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "peer": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.177", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", + "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==" + }, + "node_modules/element-china-area-data": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/element-china-area-data/-/element-china-area-data-4.2.0.tgz", + "integrity": "sha512-FweMjytiPQOxPPpZfoY7iqGM8IJkEDdJU4aSuVgJOgSKuF/MGXdIQYRw+nF4zZzt1tXmm6RYC2z1iw5G6wKgcQ==", + "dependencies": { + "china-area-data": "^5.0.0", + "lodash-es": "^4.17.15" + } + }, + "node_modules/element-ui": { + "version": "2.15.12", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.12.tgz", + "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==", + "dependencies": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + }, + "peerDependencies": { + "vue": "^2.5.17" + } + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==", + "engines": { + "node": ">= 0.11.14" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "peer": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "peer": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "peer": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "peer": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "devOptional": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "peer": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "peer": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "peer": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-glob/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "peer": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "peer": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/fast-glob/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "peer": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "peer": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported." + }, + "node_modules/file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "peer": true, + "dependencies": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/formstream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.1.tgz", + "integrity": "sha512-yHRxt3qLFnhsKAfhReM4w17jP+U1OlhUjnKPPtonwKbIJO7oBP0MvoxkRUwb8AU9n0MIkYy5X5dK6pQnbj+R2Q==", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "pause-stream": "~0.0.11" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmmirror.com/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==", + "dependencies": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmmirror.com/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/glob-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "peer": true + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmmirror.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==", + "dependencies": { + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-sourcemaps/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "peer": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gzip-size/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "peer": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "peer": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "peer": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "peer": true + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "peer": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "peer": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "peer": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "peer": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "peer": true + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "deprecated": "3.x is no longer supported", + "peer": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "peer": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "peer": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "peer": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "peer": true, + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "peer": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/icss-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "peer": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "peer": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "peer": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "peer": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "peer": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "peer": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "peer": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "peer": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "peer": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "peer": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "peer": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "peer": true + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-type-of": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz", + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==", + "dependencies": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "peer": true + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsencrypt": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.2.tgz", + "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jstoxml": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-2.2.9.tgz", + "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==" + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "peer": true + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ko-sleep": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.1.4.tgz", + "integrity": "sha512-s05WGpvvzyTuRlRE8fM7ru2Z3O+InbJuBcckTWKg2W+2c1k6SnFa3IfiSSt0/peFrlYAXgNoxuJWWVNmWh+K/A==", + "dependencies": { + "ms": "*" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.10.0.tgz", + "integrity": "sha512-RzZu7MeVlE3p1H6Sadc2BhuDGAj7bkeDCBpNq/zSENP4ohJGhso00k5+iYaRwKshIpiOAhMmimce+5D389xmSg==", + "peer": true, + "dependencies": { + "launch-editor": "^2.10.0" + } + }, + "node_modules/lazy-debug-legacy": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "integrity": "sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==", + "peerDependencies": { + "debug": "*" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "node_modules/lodash.assigninwith": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz", + "integrity": "sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "peer": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "peer": true + }, + "node_modules/lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==" + }, + "node_modules/lodash.template": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/lodash.template/-/lodash.template-4.2.4.tgz", + "integrity": "sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "dependencies": { + "lodash._reinterpolate": "~3.0.0", + "lodash.assigninwith": "^4.0.0", + "lodash.keys": "^4.0.0", + "lodash.rest": "^4.0.0", + "lodash.templatesettings": "^4.0.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.tostring": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/lodash.tostring/-/lodash.tostring-4.1.4.tgz", + "integrity": "sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==" + }, + "node_modules/lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==", + "peer": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "peer": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "peer": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "devOptional": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/map-stream/-/map-stream-0.0.6.tgz", + "integrity": "sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "peer": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "peer": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmmirror.com/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "peer": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/module/-/module-1.2.5.tgz", + "integrity": "sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==", + "dependencies": { + "chalk": "1.1.3", + "concat-stream": "1.5.1", + "lodash.template": "4.2.4", + "map-stream": "0.0.6", + "tildify": "1.2.0", + "vinyl-fs": "2.4.3", + "yargs": "4.6.0" + }, + "bin": { + "module": "dist/cli.js" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "peer": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "peer": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/mz-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz", + "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==", + "dependencies": { + "glob": "^7.1.2", + "ko-sleep": "^1.0.3", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "rimraf": "^2.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmmirror.com/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "peer": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==", + "peer": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "peer": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "peer": true, + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "peer": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "peer": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "peer": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==", + "dependencies": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dependencies": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dependencies": { + "minimist": "^1.1.0" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "peer": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "peer": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "peer": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "peer": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "peer": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "peer": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "peer": true + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "dependencies": { + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/pdfjs-dist": { + "version": "2.12.313", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz", + "integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA==", + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, + "node_modules/pdfvuer": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/pdfvuer/-/pdfvuer-1.7.4.tgz", + "integrity": "sha512-9/BlW5orSG5bJhhWOhypufWLZmvWA3Gy1kyg/NcQWsi1Ibw3RMy+HnzKLj82HAqSr/lUEinDSOmUE6ykK1/H4Q==", + "dependencies": { + "@vue/cli-plugin-pwa": "^4.5.6", + "core-js": "3", + "module": "^1.2.5", + "pdfjs-dist": "^2.4.456", + "raw-loader": "^0.5.1", + "vue-resize-sensor": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^2.6.11" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-pwa": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.19.tgz", + "integrity": "sha512-3WLmI+ky1xejrvBK6mPiu3du16iZDOF/OHV0EDgdwuBPmmg6w4TvV0Ho4iWMK+BWY68qxIadhqX23JvFfFLvOg==", + "dependencies": { + "@vue/cli-shared-utils": "^4.5.19", + "webpack": "^4.0.0", + "workbox-webpack-plugin": "^4.3.1" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-router": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.19.tgz", + "integrity": "sha512-3icGzH1IbVYmMMsOwYa0lal/gtvZLebFXdE5hcQJo2mnTwngXGMTyYAzL56EgHBPjbMmRpyj6Iw9k4aVInVX6A==", + "peer": true, + "dependencies": { + "@vue/cli-shared-utils": "^4.5.19" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-vuex": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.19.tgz", + "integrity": "sha512-DUmfdkG3pCdkP7Iznd87RfE9Qm42mgp2hcrNcYQYSru1W1gX2dG/JcW8bxmeGSa06lsxi9LEIc/QD1yPajSCZw==", + "peer": true, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-service": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-4.5.19.tgz", + "integrity": "sha512-+Wpvj8fMTCt9ZPOLu5YaLkFCQmB4MrZ26aRmhhKiCQ/4PMoL6mLezfqdt6c+m2htM+1WV5RunRo+0WHl2DfwZA==", + "peer": true, + "dependencies": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.19", + "@vue/cli-plugin-router": "^4.5.19", + "@vue/cli-plugin-vuex": "^4.5.19", + "@vue/cli-shared-utils": "^4.5.19", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "vue-loader-v16": "npm:vue-loader@^16.1.0" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.0.0-beta.14", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/@vue/compiler-sfc": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/pdfvuer/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pdfvuer/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pdfvuer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pdfvuer/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/pdfvuer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pdfvuer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/pdfvuer/node_modules/core-js": { + "version": "3.43.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/pdfvuer/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/pdfvuer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/pdfjs-dist": { + "version": "2.16.105", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "dependencies": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" + }, + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "peer": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pdfvuer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==", + "dependencies": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "peer": true, + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.37", + "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", + "peer": true, + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "peer": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "peer": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "peer": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "peer": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "peer": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-modules-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "peer": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "peer": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "peer": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "peer": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "peer": true + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "peer": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "peer": true + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "peer": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "peer": true + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "peer": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "peer": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==", + "dependencies": { + "get-ready": "~1.0.0" + } + }, + "node_modules/sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "peer": true + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "peer": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "peer": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "peer": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "peer": true + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "peer": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "peer": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "peer": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "peer": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "peer": true + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "peer": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "peer": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==", + "dependencies": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "peer": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "peer": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "peer": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "peer": true + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "peer": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==" + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.6", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz", + "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "peer": true, + "dependencies": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "engines": { + "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", + "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "peer": true + }, + "node_modules/tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "peer": true + }, + "node_modules/to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/to-buffer/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "peer": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "peer": true + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.7.tgz", + "integrity": "sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "peer": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "peer": true + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "peer": true + }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "peer": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "peer": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unique-stream/node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "peer": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "peer": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "peer": true, + "dependencies": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "peer": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/urllib": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.40.0.tgz", + "integrity": "sha512-XDZjoijtzsbkXTXgM+A/sJM002nwoYsc46YOYr6MNH2jUUw1nCBf2ywT1WaPsVEWJX4Yr+9isGmYj4+yofFn9g==", + "dependencies": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "debug": "^2.6.9", + "default-user-agent": "^1.0.0", + "digest-header": "^1.0.0", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.4.15", + "ip": "^1.1.5", + "proxy-agent": "^5.0.0", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "peer": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "peer": true + }, + "node_modules/utility": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz", + "integrity": "sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw==", + "dependencies": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/viewerjs": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.1.tgz", + "integrity": "sha512-/VQ2zalHLZJOGIwlxOBtxagLZwNvU3Bf+nm692XlhNFxjBXRxpCVn+GeqmRFg9jK1Y2+Wf8PPGxZgTDN4pHXww==" + }, + "node_modules/vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==", + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-fs": { + "version": "2.4.3", + "resolved": "https://registry.npmmirror.com/vinyl-fs/-/vinyl-fs-2.4.3.tgz", + "integrity": "sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==", + "dependencies": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "^1.5.2", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-chunk-split": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-chunk-split/-/vite-plugin-chunk-split-0.5.0.tgz", + "integrity": "sha512-pasNKLhH+ICjoCF6HoKKvgmZ1LEPSCIKAa8Lz0ZpMyQC9bLmCLT7UxgKMULewsc9SUw89OX0udsGiIQCtr8wLA==", + "dev": true, + "dependencies": { + "es-module-lexer": "^1.4.1", + "import-meta-resolve": "^4.0.0", + "magic-string": "^0.30.5" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/vm2": { + "version": "3.9.11", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", + "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/vue": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "peer": true + }, + "node_modules/vue-loader": { + "version": "15.11.1", + "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "peer": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-loader-v16": { + "name": "vue-loader", + "version": "16.8.3", + "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + } + }, + "node_modules/vue-loader-v16/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-loader-v16/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true, + "peer": true + }, + "node_modules/vue-loader-v16/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader-v16/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "optional": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-loader-v16/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "optional": true, + "peer": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/vue-loader-v16/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/vue-resize-sensor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz", + "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==" + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "peer": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "peer": true + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "optional": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "optional": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "peer": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack": { + "version": "4.47.0", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "peer": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 6.14.4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "peer": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "peer": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "peer": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "peer": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "peer": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "peer": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "peer": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "peer": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "peer": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "peer": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "peer": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "peer": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "peer": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "peer": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/webpack/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webrtc-adapter": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.0.tgz", + "integrity": "sha512-umxCMgedPAVq4Pe/jl3xmelLXLn4XZWFEMR5Iipb5wJ+k1xMX0yC4ZY9CueZUU1MjapFxai1tFGE7R/kotH6Ww==", + "dependencies": { + "sdp": "^3.0.2" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "peer": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "peer": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "peer": true + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dependencies": { + "semver": "^5.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "dependencies": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/workbox-build/node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "node_modules/workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.3.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..ad87c27 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,42 @@ +{ + "name": "imurs", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite -m dev", + "dev:prod": "vite -m production", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "agora-rtc-sdk-ng": "^4.19.3", + "agora-rtm-sdk": "^1.2.0", + "ali-oss": "^6.0.1", + "awaitqueue": "^3.2.2", + "axios": "^1.7.3", + "crypto-js": "^4.2.0", + "echarts": "^5.6.0", + "element-china-area-data": "^4.1.1", + "element-ui": "^2.15.0", + "events": "^3.0.0", + "jsencrypt": "^3.3.2", + "lodash": "^4.14.2", + "moment": "^2.22.2", + "pdfjs-dist": "^2.12.313", + "pdfvuer": "^1.7.4", + "socket.io-client": "^4.7.5", + "viewerjs": "^1.3.1", + "vue": "^2.5.2", + "vue-router": "^3.0.1", + "vuex": "^3.6.2" + }, + "devDependencies": { + "@rollup/plugin-inject": "^5.0.5", + "@vitejs/plugin-vue2": "^2.3.1", + "@vitejs/plugin-vue2-jsx": "^1.1.1", + "sass": "^1.77.8", + "vite": "^5.3.4", + "vite-plugin-chunk-split": "^0.5.0" + } +} diff --git a/frontend/public/static/.gitkeep b/frontend/public/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/public/static/css/iconfont.css b/frontend/public/static/css/iconfont.css new file mode 100644 index 0000000..58b5bfc --- /dev/null +++ b/frontend/public/static/css/iconfont.css @@ -0,0 +1,10 @@ +[class^="ali-icon"], [class*="ali-icon"] +{ + margin-left: -3px; + font-family:"iconfont" !important; + font-size:28px; + color:white; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/frontend/public/static/css/reset.css b/frontend/public/static/css/reset.css new file mode 100644 index 0000000..5814571 --- /dev/null +++ b/frontend/public/static/css/reset.css @@ -0,0 +1,150 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, + p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 14px; + vertical-align: baseline; +} +html{ + line-height: 1.3; +} +h1, h2, h3, h4, h5, h6{ + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1.3; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +.table th, .table td{ + vertical-align: middle; +} +a{ + text-decoration: none; +} +.el-scrollbar { + height: 100%; +} +.el-scrollbar .el-scrollbar__wrap { + margin-bottom: 0 !important; + overflow-x: hidden; +} +.el-scrollbar .el-scrollbar__bar { + z-index: 2000; +} + +/* 标题样式 */ +.h1 { + font-size: 2.5rem; + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +/* table布局样式 */ +.table-bordered { + border: 1px solid #dee2e6; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +/* table { + border-collapse: collapse; +} */ +table { + border-collapse: collapse; + border-spacing: 0; +} +.table-bordered td, .table-bordered th { + border: 1px solid #dee2e6; +} +.table td, .table th { + padding: 1.1rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} +.table th, .table td { + vertical-align: middle; +} +.table-striped tbody tr:nth-of-type(odd) { + background-color: #FAFAFA; +} +.filter{ + width:250px!important; + float:right!important; +} +/* 备用图标 */ +[class^="my_icon"], [class*="my_icon"] +{ + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.el-form-item__label{ + font-weight: 600; +} +.el-table th>.cell{ + font-weight: 600; +} + +.el-table .warning-row { + background-color: oldlace!important; +} + +.el-table .success-row { + background-color: #e7f4e3!important; +} +.el-table .default-row { + background-color: #D9ECFF!important; +} +.el-table .gray-row { + background-color: #dbdbdb!important; +} +.el-table .danger-row { + background-color: #FDE2E2!important; +} \ No newline at end of file diff --git a/frontend/public/static/favicon.png b/frontend/public/static/favicon.png new file mode 100644 index 0000000..906f8d2 Binary files /dev/null and b/frontend/public/static/favicon.png differ diff --git a/frontend/public/static/img/bmode.jpg b/frontend/public/static/img/bmode.jpg new file mode 100644 index 0000000..20a7cab Binary files /dev/null and b/frontend/public/static/img/bmode.jpg differ diff --git a/frontend/public/static/img/cloud_with_transparent.png b/frontend/public/static/img/cloud_with_transparent.png new file mode 100644 index 0000000..40d88e8 Binary files /dev/null and b/frontend/public/static/img/cloud_with_transparent.png differ diff --git a/frontend/public/static/js/aliplayercomponents-1.0.5.min.js b/frontend/public/static/js/aliplayercomponents-1.0.5.min.js new file mode 100644 index 0000000..8b1f587 --- /dev/null +++ b/frontend/public/static/js/aliplayercomponents-1.0.5.min.js @@ -0,0 +1,20 @@ +!function(A){var t={};function e(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return A[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}e.m=A,e.c=t,e.d=function(A,t,n){e.o(A,t)||Object.defineProperty(A,t,{enumerable:!0,get:n})},e.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},e.t=function(A,t){if(1&t&&(A=e(A)),8&t)return A;if(4&t&&"object"==typeof A&&A&&A.__esModule)return A;var n=Object.create(null);if(e.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:A}),2&t&&"string"!=typeof A)for(var i in A)e.d(n,i,function(t){return A[t]}.bind(null,i));return n},e.n=function(A){var t=A&&A.__esModule?function(){return A.default}:function(){return A};return e.d(t,"a",t),t},e.o=function(A,t){return Object.prototype.hasOwnProperty.call(A,t)},e.p="",e(e.s=28)}([function(A,t){A.exports=function(A){var t=[];return t.toString=function(){return this.map(function(t){var e=function(A,t){var e,n=A[1]||"",i=A[3];if(!i)return n;if(t&&"function"==typeof btoa){var o=(e=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"),r=i.sources.map(function(A){return"/*# sourceURL="+i.sourceRoot+A+" */"});return[n].concat(r).concat([o]).join("\n")}return[n].join("\n")}(t,A);return t[2]?"@media "+t[2]+"{"+e+"}":e}).join("")},t.i=function(A,e){"string"==typeof A&&(A=[[null,A,""]]);for(var n={},i=0;i=0&&c.splice(t,1)}function m(A){var t=document.createElement("style");return void 0===A.attrs.type&&(A.attrs.type="text/css"),g(t,A.attrs),h(A,t),t}function g(A,t){Object.keys(t).forEach(function(e){A.setAttribute(e,t[e])})}function f(A,t){var e,n,i,o;if(t.transform&&A.css){if(!(o=t.transform(A.css)))return function(){};A.css=o}if(t.singleton){var r=s++;e=l||(l=m(t)),n=x.bind(null,e,r,!1),i=x.bind(null,e,r,!0)}else A.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(e=function(A){var t=document.createElement("link");return void 0===A.attrs.type&&(A.attrs.type="text/css"),A.attrs.rel="stylesheet",g(t,A.attrs),h(A,t),t}(t),n=function(A,t,e){var n=e.css,i=e.sourceMap,o=void 0===t.convertToAbsoluteUrls&&i;(t.convertToAbsoluteUrls||o)&&(n=d(n)),i&&(n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(i))))+" */");var r=new Blob([n],{type:"text/css"}),a=A.href;A.href=URL.createObjectURL(r),a&&URL.revokeObjectURL(a)}.bind(null,e,t),i=function(){y(e),e.href&&URL.revokeObjectURL(e.href)}):(e=m(t),n=function(A,t){var e=t.css,n=t.media;if(n&&A.setAttribute("media",n),A.styleSheet)A.styleSheet.cssText=e;else{for(;A.firstChild;)A.removeChild(A.firstChild);A.appendChild(document.createTextNode(e))}}.bind(null,e),i=function(){y(e)});return n(A),function(t){if(t){if(t.css===A.css&&t.media===A.media&&t.sourceMap===A.sourceMap)return;n(A=t)}else i()}}A.exports=function(A,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=r()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var e=p(A,t);return u(e,t),function(A){for(var n=[],i=0;i=0)return A.length;for(var n=0,i=0,o=0,r=A.length-1;n<=r;){if(o++,e(t,A[(i=Math.floor((r+n+1)/2))-1])>=0&&e(t,A[i])<0)return i;e(t,A[i-1])<0?r=i-1:e(t,A[i])>=0?n=i:console.error("Program Error"),o>1500&&console.error("Too many run cycles.")}return-1},binsert:function(t,e,n){var i=A.bsearch(t,e,n);return t.splice(i,0,e),i}};return A}()),c=function(A,t){for(var e in t)t.hasOwnProperty(e)&&(A[e]=t[e]);function n(){this.constructor=A}A.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},d=function(){function A(A,t){void 0===A&&(A=0),void 0===t&&(t=0),this._pools=[[]],this.avoid=1,this._width=A,this._height=t}return A.prototype.willCollide=function(A,t){return A.stime+A.ttl>=t.stime+t.ttl/2},A.prototype.pathCheck=function(A,t,e){for(var n=A+t.height,i=t.right,o=0;on||e[o].bottomi))return!1;if(this.willCollide(e[o],t))return!1}return!0},A.prototype.assign=function(A,t){for(;this._pools.length<=t;)this._pools.push([]);var e=this._pools[t];if(0===e.length)return A.cindex=t,0;if(this.pathCheck(0,A,e))return A.cindex=t,0;for(var n=0,i=0;ithis._height);i++)if(this.pathCheck(n,A,e))return A.cindex=t,n;return this.assign(A,t+1)},A.prototype.add=function(A){A.height>this._height?(A.cindex=-2,A.y=0):(A.y=this.assign(A,0),s.binsert(this._pools[A.cindex],A,function(A,t){return A.bottomt.bottom?1:0}))},A.prototype.remove=function(A){if(!(A.cindex<0)){if(A.cindex>=this._pools.length)throw new Error("cindex out of bounds");var t=this._pools[A.cindex].indexOf(A);t<0||this._pools[A.cindex].splice(t,1)}},A.prototype.setBounds=function(A,t){this._width=A,this._height=t},A}(),u=function(A){function t(){A.apply(this,arguments)}return c(t,A),t.prototype.add=function(t){A.prototype.add.call(this,t),t.x=(this._width-t.width)/2},t.prototype.willCollide=function(A,t){return!0},t.prototype.pathCheck=function(A,t,e){for(var n=A+t.height,i=0;in||e[i].bottom0&&this.animate()},Object.defineProperty(A.prototype,"x",{get:function(){return null!==this._x&&void 0!==this._x||(this.align%2==0?this._x=this.dom.offsetLeft:this._x=this.parent.width-this.dom.offsetLeft-this.width),this.absolute?this._x:this._x/this.parent.width},set:function(A){this._x=A,this.absolute||(this._x*=this.parent.width),this.align%2==0?this.dom.style.left=this._x+"px":this.dom.style.right=this._x+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"y",{get:function(){return null!==this._y&&void 0!==this._y||(this.align<2?this._y=this.dom.offsetTop:this._y=this.parent.height-this.dom.offsetTop-this.height),this.absolute?this._y:this._y/this.parent.height},set:function(A){this._y=A,this.absolute||(this._y*=this.parent.height),this.align<2?this.dom.style.top=this._y+"px":this.dom.style.bottom=this._y+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"bottom",{get:function(){return this.y+this.height},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"right",{get:function(){return this.x+this.width},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"width",{get:function(){return null!==this._width&&void 0!==this._width||(this._width=this.dom.offsetWidth),this._width},set:function(A){this._width=A,this.dom.style.width=this._width+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"height",{get:function(){return null!==this._height&&void 0!==this._height||(this._height=this.dom.offsetHeight),this._height},set:function(A){this._height=A,this.dom.style.height=this._height+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"size",{get:function(){return this._size},set:function(A){this._size=A,this.dom.style.fontSize=this._size+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"color",{get:function(){return this._color},set:function(A){this._color=A;var t=A.toString(16);t=t.length>=6?t:new Array(6-t.length+1).join("0")+t,this.dom.style.color="#"+t,0===this._color&&(this.dom.className=this.parent.options.global.className+" rshadow")},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"alpha",{get:function(){return this._alpha},set:function(A){this._alpha=A,this.dom.style.opacity=Math.min(this._alpha,this.parent.options.global.opacity)+""},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"border",{get:function(){return this._border},set:function(A){this._border=A,this._border?this.dom.style.border="1px solid #00ffff":this.dom.style.border="none"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"shadow",{get:function(){return this._shadow},set:function(A){this._shadow=A,this._shadow||(this.dom.className=this.parent.options.global.className+" noshadow")},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"font",{get:function(){return this._font},set:function(A){this._font=A,this._font.length>0?this.dom.style.fontFamily=this._font:this.dom.style.fontFamily=""},enumerable:!0,configurable:!0}),A.prototype.time=function(A){this.ttl-=A,this.ttl<0&&(this.ttl=0),this.movable&&this.update(),this.ttl<=0&&this.finish()},A.prototype.update=function(){this.animate()},A.prototype.invalidate=function(){this._x=null,this._y=null,this._width=null,this._height=null},A.prototype._execMotion=function(A,t){for(var e in A)if(A.hasOwnProperty(e)){var n=A[e];this[e]=n.easing(Math.min(Math.max(t-n.delay,0),n.dur),n.from,n.to-n.from,n.dur)}},A.prototype.animate=function(){if(this._alphaMotion&&(this.alpha=(this.dur-this.ttl)*(this._alphaMotion.to-this._alphaMotion.from)/this.dur+this._alphaMotion.from),0!==this.motion.length){var A=Math.max(this.ttl,0),t=this.dur-A-this._motionStart[this._curMotion];return this._execMotion(this.motion[this._curMotion],t),this.dur-A>this._motionEnd[this._curMotion]?(this._curMotion++,void(this._curMotion>=this.motion.length&&(this._curMotion=this.motion.length-1))):void 0}},A.prototype.finish=function(){this.parent.finish(this)},A.prototype.toString=function(){return["[",this.stime,"|",this.ttl,"/",this.dur,"]","(",this.mode,")",this.text].join("")},A.LINEAR=function(A,t,e,n){return A*e/n+t},A}()),h=function(A){function t(t,e){A.call(this,t,e),this.dur*=this.parent.options.scroll.scale,this.ttl*=this.parent.options.scroll.scale}return c(t,A),Object.defineProperty(t.prototype,"alpha",{set:function(A){this._alpha=A,this.dom.style.opacity=Math.min(Math.min(this._alpha,this.parent.options.global.opacity),this.parent.options.scroll.opacity)+""},enumerable:!0,configurable:!0}),t.prototype.init=function(t){void 0===t&&(t=null),A.prototype.init.call(this,t),this.x=this.parent.width,this.parent.options.scroll.opacity<1&&(this.alpha=this._alpha),this.absolute=!0},t.prototype.update=function(){this.x=this.ttl/this.dur*(this.parent.width+this.width)-this.width},t}(p),y=function(){var A=function(A,t){for(var e=Math.PI/180,n=A*e,i=t*e,o=Math.cos,r=Math.sin,a=[o(n)*o(i),o(n)*r(i),r(n),0,-r(i),o(i),0,0,-r(n)*o(i),-r(n)*r(i),o(n),0,0,0,0,1],l=0;l0)){var A=(new Date).getTime(),e=this;t=window.setInterval(function(){var t=(new Date).getTime()-A;A=(new Date).getTime(),e.onTimerEvent(t,e)},10)}},this.stopTimer=function(){window.clearInterval(t),t=0}}return t.prototype.stop=function(){this.stopTimer()},t.prototype.start=function(){this.startTimer()},t.prototype.seek=function(A){this.position=s.bsearch(this.timeline,A,function(A,t){return At.stime?1:0})},t.prototype.validate=function(A){return null!=A&&this.filter.doValidate(A)},t.prototype.load=function(A){this.timeline=A,this.timeline.sort(function(A,t){return A.stime>t.stime?2:A.stimet.date?1:A.datet.dbid?1:A.dbidt.stime?2:A.stimet.date?1:A.datet.dbid?1:A.dbid0;)this.runline[0].finish();this.dispatchEvent("clear")},t.prototype.setBounds=function(){for(var A in this.width=this.stage.offsetWidth,this.height=this.stage.offsetHeight,this.dispatchEvent("resize"),this.csa)this.csa[A].setBounds(this.width,this.height);this.stage.style.perspective=this.width*Math.tan(40*Math.PI/180)/2+"px",this.stage.style.webkitPerspective=this.width*Math.tan(40*Math.PI/180)/2+"px"},t.prototype.init=function(){this.setBounds(),null==this.filter&&(this.filter=new +/** + * Comment Filters Module Simplified (only supports modifiers & types) + * @license MIT + * @author Jim Chen + */ +function(){this.modifiers=[],this.runtime=null,this.allowTypes={1:!0,4:!0,5:!0,6:!0,7:!0,8:!0,17:!0},this.doModify=function(A){for(var t=0;t=this.timeline.length||Math.abs(this._lastPosition-A)>=2e3){if(this.seek(A),this._lastPosition=A,this.timeline.length<=this.position)return}else this._lastPosition=A;for(;this.position0&&this.runline.length>this.limiter||this.validate(this.timeline[this.position])&&this.send(this.timeline[this.position])},t.prototype.rescale=function(){},t.prototype.send=function(t){if(8!==t.mode){if(null==this.filter||null!=(t=this.filter.doModify(t))){if(1===t.mode||2===t.mode||6===t.mode)var e=new h(this,t);else e=new p(this,t);switch(e.mode){case 1:e.align=0;break;case 2:case 4:e.align=2;break;case 5:e.align=0;break;case 6:e.align=1}switch(e.init(),this.stage.appendChild(e.dom),e.mode){default:case 1:this.csa.scroll.add(e);break;case 2:this.csa.scrollbtm.add(e);break;case 4:this.csa.bottom.add(e);break;case 5:this.csa.top.add(e);break;case 6:this.csa.reverse.add(e);break;case 17:case 7:0===t.rY&&0===t.rZ||(e.dom.style.transform=A(t.rY,t.rZ),e.dom.style.webkitTransform=A(t.rY,t.rZ),e.dom.style.OTransform=A(t.rY,t.rZ),e.dom.style.MozTransform=A(t.rY,t.rZ),e.dom.style.MSTransform=A(t.rY,t.rZ))}e.y=e.y,this.dispatchEvent("enterComment",e),this.runline.push(e)}}else this.scripting&&this.scripting.eval(t.code)},t.prototype.sendComment=function(A){this.send(A)},t.prototype.finish=function(A){this.dispatchEvent("exitComment",A),this.stage.removeChild(A.dom);var t=this.runline.indexOf(A);switch(t>=0&&this.runline.splice(t,1),A.mode){default:case 1:this.csa.scroll.remove(A);break;case 2:this.csa.scrollbtm.remove(A);break;case 4:this.csa.bottom.remove(A);break;case 5:this.csa.top.remove(A);break;case 6:this.csa.reverse.remove(A);break;case 7:}},t.prototype.addEventListener=function(A,t){void 0!==this._listeners[A]?this._listeners[A].push(t):this._listeners[A]=[t]},t.prototype.dispatchEvent=function(A,t){if(void 0!==this._listeners[A])for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:"controlbar";!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.sendEl=e,this.danmukuList=t,this.html=m(i.a),this.danmuControlHtml=m(r.a),this.sendEl=e,this.danmuInput=null===e?null:m(l.a),this.CM=null,this.userDanmuOpen=!0}return f(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;if(this.isEn=n&&"en-us"===n,null!==this.danmuInput&&(this.danmuInput.querySelector(".danmu-input-enter").innerText=this.isEn?"Enter":"发送",this.danmuInput.querySelector("input").setAttribute("placeholder",this.isEn?"Input danmu":"输入弹幕")),this.danmuControlHtml.querySelector(".player-tooltip.close").innerText=this.isEn?"Close Bullect":"关闭弹幕",this.danmuControlHtml.querySelector(".player-tooltip.open").innerText=this.isEn?"Open Bullect":"打开弹幕","controlbar"===this.sendEl){var i=this.danmuControlHtml.querySelector(".ali-danmu-input-wrap");i.style.display="inline-block",i.appendChild(this.danmuInput)}else if(null!==this.sendEl)if(g(this.sendEl))this.sendEl.appendChild(this.danmuInput);else{if("string"!=typeof this.sendEl)throw new Error("sendEl must be an element or selector string");var o=document.querySelector(this.sendEl);if(!g(o))throw new Error("sendEl must be an element or selector string");o.appendChild(this.danmuInput)}A.querySelector(".prism-controlbar").appendChild(this.danmuControlHtml);var r=A.querySelector("video").nextElementSibling;r?A.insertBefore(this.html,r):A.appendChild(this.html),this.CM=new y(this.html.querySelector(".danmu")),this.CM.init(),this.CM.load(this.danmukuList),A.querySelector("video").ontimeupdate=function(){null!==A.querySelector("video")&&e.CM.time(1e3*A.querySelector("video").currentTime)};var a=this.danmuControlHtml.querySelector(".icon-danmu-close"),l=this.danmuControlHtml.querySelector(".icon-danmu-open");if(a.onclick=function(){e.userDanmuOpen=!1,a.style.display="none",l.style.display="inline-block",e.CM.clear(),e.CM.stop()},l.onclick=function(){l.style.display="none",a.style.display="inline-block",e.userDanmuOpen=!0,e.CM.start()},null!==this.danmuInput){var s=this.danmuInput.querySelector(".ali-danmu-input input");this.danmuInput.querySelector(".danmu-input-enter").onclick=this.sendDanmuHandle.bind(this),s.onkeydown=function(A){13===A.keyCode&&e.sendDanmuHandle.call(e)}}}},{key:"sendDanmuHandle",value:function(){var A=this.danmuInput.querySelector(".ali-danmu-input input"),t=A.value;""!==t&&(this.send({mode:1,text:t,stime:1e3,size:[16,18,25,36,45][this.randomIndex(5)],color:[16777215,255,13369344,16738047,16777011][this.randomIndex(5)]}),A.value="",A.focus())}},{key:"randomIndex",value:function(A){return Math.floor(Math.random()*A)}},{key:"play",value:function(A,t){this.userDanmuOpen&&this.CM.start()}},{key:"pause",value:function(A,t){this.userDanmuOpen&&this.CM.stop()}},{key:"send",value:function(A){this.CM.send(A)}},{key:"insert",value:function(A){this.CM&&this.CM.insert(A)}},{key:"dispose",value:function(){null!==this.danmuInput&&this.danmuInput.parentNode&&this.danmuInput.parentNode.removeChild(this.danmuInput)}}]),A}(),M=e(8),x=e.n(M),b=(e(34),function(){function A(A,t){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:"random";!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.text=t,this.style=e||{fontSize:"14px",color:"#fff"},this.html=m(x.a),this.bulletPosition=n}return b(A,[{key:"createEl",value:function(A,t){this.html.innerText=this.text,A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this;A.getOptions(),!1===A.getOptions().autoplay&&(this.html.style.animationPlayState="paused"),Object.keys(this.style).forEach(function(A){return e.html.style[A]=e.style[A]});var n=this.html.offsetHeight,i=parseInt(A.getOptions().height.replace("px",""))-n;if("bottom"===this.bulletPosition)this.html.style.bottom=0;else{var o="top"===this.bulletPosition?0:this.randomTop(i);this.html.style.top=o}"random"===this.bulletPosition&&this.html.addEventListener("animationiteration",function(){e.html.style.top=e.randomTop(i)})}},{key:"playing",value:function(A,t){this.html.style.animationPlayState="running"}},{key:"timeupdate",value:function(A,t){var e=A.el(),n=e.querySelector(".bullet-screen");if(n){"bullet-screen"!==n.className&&(n.className="bullet-screen");var i=getComputedStyle(n),o=i.getPropertyValue("display"),r=i.getPropertyValue("opacity"),a=i.getPropertyValue("visibility"),l=this.text,s=n.innerText;"none"===o&&n.style.setProperty("display","block"),"1"!==r&&n.style.setProperty("opacity","1"),"hidden"===a&&n.style.setProperty("visibility","visible"),l!=s&&(n.innerText=l)}else e.appendChild(this.html)}},{key:"pause",value:function(A,t){this.html.style.animationPlayState="paused"}},{key:"randomTop",value:function(A){return Math.floor(Math.random()*A)+"px"}}]),A}(),w=e(9),I=e.n(w),T=(e(36),function(){function A(A,t){for(var e=0;e0&&void 0!==arguments[0]&&arguments[0],e=arguments[1],n=arguments[2];!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.html=m(I.a),this.autoPlay=t,this.getTime=e||this._getTime,this.saveTimeFunction=n||this._saveTime,this.hasMemoryDisplay=!1}return T(A,[{key:"createEl",value:function(A){A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this,n=A.getOptions(),i=n.vid||n.source.replace(/\?.*$/,""),o=this.getTime(i);if(null!==(o=o?parseInt(o):0)&&0!==o&&!this.hasMemoryDisplay)if(this.hasMemoryDisplay=!0,this.autoPlay)A.seek(o),"playing"!==A.getStatus()&&A.play();else{var r=this.getVideoTime(o);if(o!==parseInt(A._duration)){var a='
\n \n 上次看到\n '+r+'\n 跳转播放\n
';this.html.innerHTML=a;var l=setTimeout(function(){e.html.innerHTML=""},15e3);this.html.querySelector(".icon-close").onclick=function(){e.html.innerHTML="",clearTimeout(l)},this.html.querySelector(".play-jump").onclick=function(){A.seek(o),"playing"!==A.getStatus()&&A.play(),e.html.innerHTML="",clearTimeout(l)}}}document.onvisibilitychange=function(){"hidden"===document.visibilityState&&0!==A.getCurrentTime()&&(this.saveTimeFunction(i,A.getCurrentTime()),play)},window.onbeforeunload=function(){0!==A.getCurrentTime()&&this.saveTimeFunction(i,A.getCurrentTime())}}},{key:"error",value:function(A,t){this.setMemory(A)}},{key:"dispose",value:function(A,t){this.setMemory(A)}},{key:"setMemory",value:function(A){var t=A.getOptions(),e=t.vid||t.source.replace(/\?.*$/,"");this.saveTimeFunction(e,A.getCurrentTime())}},{key:"getVideoTime",value:function(A){var t=Math.round(A),e=Math.floor(t/3600),n=Math.floor((t-3600*e)/60),i=t-3600*e-60*n;return n<10&&(n="0"+n),i<10&&(i="0"+i),0===e?n+":"+i:e+":"+n+":"+i}},{key:"_getTime",value:function(A){return localStorage.getItem(A)}},{key:"_saveTime",value:function(A,t){localStorage.setItem(A,t)}}]),A}(),E=e(10),Q=e.n(E),B=(e(38),function(){function A(A,t){for(var e=0;e-1?a:0,this.playingVideoIndex=a>-1?a:0),this.listHtml.querySelector(".list").childNodes[0].className="video-item active",A.appendChild(this.listHtml)}},{key:"ready",value:function(A,t){var e=this;this.controlHtml.querySelector(".icon-skip-previous").onclick=function(){0!==e.playingVideoIndex?e.playVideo(A,e.playingVideoIndex-1):e.playlistTip(e.isEn?"Already the first one~":"已经是第一个了~",A._el)},this.controlHtml.querySelector(".icon-skipnext").onclick=function(){e.playingVideoIndex!==e.playlist.length-1?e.playVideo(A,e.playingVideoIndex+1):e.playlistTip(e.isEn?"Already the last one~":"已经是最后一个了~",A._el)},this.listHtml.querySelector(".list").onclick=function(t){var n=t.target;if("video-item"===n.className){var i=parseInt(n.getAttribute("data-index"));e.playVideo(A,i)}}}},{key:"clearHideListTimeout",value:function(){null!==this.listHideTimeout&&(clearTimeout(this.listHideTimeout),this.listHideTimeout=null)}},{key:"playVideo",value:function(A,t){this.playingVideoIndex!==t&&(this.playingVideoIndex=parseInt(t),A.loadByUrl(this.playlist[t].source),this.listHtml.querySelector(".video-item.active").className="video-item",this.listHtml.querySelector(".list").childNodes[t].className="video-item active")}},{key:"tooglePlaylist",value:function(){var A=this;this.clearHideListTimeout(),"30%"===this.listHtml.style.width?this.listHtml.style.width=0:(this.listHtml.style.width="30%",this.listHideTimeout=setTimeout(function(){A.listHtml.style.width=0},5e3))}},{key:"playlistTip",value:function(A,t){var e=document.createElement("div");e.className="playlist-skip-tip",e.innerText=A,t.appendChild(e),setTimeout(function(){t.removeChild(e)},3e3)}},{key:"computedListDom",value:function(A){return A.map(function(A,t){return'
'+A.name+"
"}).join("")}}]),A}(),Y=e(13),U=e.n(Y),G=(e(42),function(){function A(A,t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.previewDuration=t,this.html=m(U.a),null!==e&&this.insertHTtml(e,"previewEndHtml"),null!==n&&this.insertHTtml(n,"previewBarHtml")}return G(A,[{key:"play",value:function(A){this.previewEnd&&(A._el.querySelector(".center").classList.remove("preview-hide"),A.seek(0),this.previewEnd=!1)}},{key:"insertHTtml",value:function(A,t){var e="previewEndHtml"===t?".preview-custom":".preview-custom-bar",n=this.html.querySelector(e);if("string"==typeof A)if("#"===A[0]){var i=document.querySelector(A);i?n.innerHTML=i.innerHTML:console.warn("[aliplayer components warn]: Invalid parameter "+t+", can't find element by this id")}else n.innerHTML=A;else console.warn("[aliplayer components warn]: Invalid parameter "+t+", "+t+" must be a string type")}},{key:"ready",value:function(A){var t=parseInt(A.getDuration());this.videoDuration=t,!this.invalidPreview&&this.previewDuration>=t&&(this.invalidPreview=!0,console.warn("[aliplayer components warn]: Invalid parameter previewDuration, previewDuration must be less than the video duration!")),0!==this.previewDuration&&this.previewDuration1?" "+o+(this.isEn?" senconds":" 秒"):" "+r+(this.isEn?" minutes":" 分钟"),o<60&&(r=" "+o+(this.isEn?" senconds":" 秒")),this.html.querySelector(".preview-time").innerText=r;var l=A.querySelector("video").nextElementSibling;l?A.insertBefore(this.html,l):A.appendChild(this.html),this.html.querySelector(".preview-vod-close").addEventListener("click",function(){e.html.querySelector(".preview-component-tip").style.display="none"}),t.setPreviewTime(Number(this.previewDuration))}},{key:"closePreviewLayer",value:function(){this.previewEnd=!1,this.html.querySelector(".preview-component-layer").style.display="none"}},{key:"timeupdate",value:function(A){if(!this.previewEnd&&0!==this.previewDuration&&this.previewDuratione?(n=e-330+"px",this.html.querySelector(".icon-arrowdown").style.left=e*t.left-e+317+"px"):this.html.querySelector(".icon-arrowdown").style.left="-2px";var i=t.progressMarker,o=i.coverUrl,r=i.title,a=i.describe,l=i.offset;this.currentOffset=l,this.html.style.left=n,this.imgEle.src=o,this.timeEle.innerText=r,this.describeEle.innerText=a,this.html.style.display="block"}},{key:"markerDotOut",value:function(A,t){var e=this;this.timer=setTimeout(function(){e.html.style.display="none"},100)}}]),A}(),P=e(15),R=e.n(P),J=e(16),W=e.n(J),K=(e(49),function(){function A(A,t){for(var e=0;e'+A.desc+""});this.html.querySelector(".quality-list").innerHTML=i.join(""),this.definition,0==this.hasCreated&&this.definition&&(n.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var o=null;e.onclick=function(){n.style.display="block"},e.onmouseleave=function(){o=setTimeout(function(){n.style.display="none"},100)},n.onmouseenter=function(){clearTimeout(o)},n.onmouseleave=function(){n.style.display="none"},n.onclick=function(e){var n=e.target,i=n.dataset.def,o=n.innerText;if(i&&"current"!==n.className){var r=t._urls.find(function(A){return A.definition===i});A.loadByUrl(r.Url,A.getCurrentTime(),!0,!0),t.setCurrentQuality(r.desc,r.definition),t.modalHtml.style.display="block",t.modalHtml.querySelector("span.current-quality-tag").innerText=r.desc}t.getQuality(i,o)}}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-quality");t&&t.classList.add("player-hidden")}}]),A}(),_=e(17),$=e.n(_),AA=(e(51),function(){function A(A,t){for(var e=0;e=i)&&t.play()}},1e3)}}},{key:"removeComponent",value:function(){this.html.parentNode.removeChild(this.html),this.html=null}},{key:"ready",value:function(A){null!==this.html&&A.pause()}}]),A}(),cA=e(20),dA=e.n(cA),uA=(e(57),e(21)),pA=e.n(uA),hA="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},yA="function"==typeof Symbol&&"symbol"===hA(Symbol.iterator)?function(A){return void 0===A?"undefined":hA(A)}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":void 0===A?"undefined":hA(A)},mA=window.device,gA={},fA=[];window.device=gA;var vA=window.document.documentElement,MA=window.navigator.userAgent.toLowerCase(),xA=["googletv","viera","smarttv","internet.tv","netcast","nettv","appletv","boxee","kylo","roku","dlnadoc","roku","pov_tv","hbbtv","ce-html"];function bA(A){return-1!==MA.indexOf(A)}function NA(A){return vA.className.match(new RegExp(A,"i"))}function wA(A){var t=null;NA(A)||(t=vA.className.replace(/^\s+|\s+$/g,""),vA.className=t+" "+A)}function IA(A){NA(A)&&(vA.className=vA.className.replace(" "+A,""))}function TA(){gA.landscape()?(IA("portrait"),wA("landscape"),DA("landscape")):(IA("landscape"),wA("portrait"),DA("portrait")),BA()}function DA(A){for(var t in fA)fA[t](A)}gA.macos=function(){return bA("mac")},gA.ios=function(){return gA.iphone()||gA.ipod()||gA.ipad()},gA.iphone=function(){return!gA.windows()&&bA("iphone")},gA.ipod=function(){return bA("ipod")},gA.ipad=function(){return bA("ipad")},gA.android=function(){return!gA.windows()&&bA("android")},gA.androidPhone=function(){return gA.android()&&bA("mobile")},gA.androidTablet=function(){return gA.android()&&!bA("mobile")},gA.blackberry=function(){return bA("blackberry")||bA("bb10")||bA("rim")},gA.blackberryPhone=function(){return gA.blackberry()&&!bA("tablet")},gA.blackberryTablet=function(){return gA.blackberry()&&bA("tablet")},gA.windows=function(){return bA("windows")},gA.windowsPhone=function(){return gA.windows()&&bA("phone")},gA.windowsTablet=function(){return gA.windows()&&bA("touch")&&!gA.windowsPhone()},gA.fxos=function(){return(bA("(mobile")||bA("(tablet"))&&bA(" rv:")},gA.fxosPhone=function(){return gA.fxos()&&bA("mobile")},gA.fxosTablet=function(){return gA.fxos()&&bA("tablet")},gA.meego=function(){return bA("meego")},gA.cordova=function(){return window.cordova&&"file:"===location.protocol},gA.nodeWebkit=function(){return"object"===yA(window.process)},gA.mobile=function(){return gA.androidPhone()||gA.iphone()||gA.ipod()||gA.windowsPhone()||gA.blackberryPhone()||gA.fxosPhone()||gA.meego()},gA.tablet=function(){return gA.ipad()||gA.androidTablet()||gA.blackberryTablet()||gA.windowsTablet()||gA.fxosTablet()},gA.desktop=function(){return!gA.tablet()&&!gA.mobile()},gA.television=function(){for(var A=0;A1},gA.landscape=function(){return screen.orientation&&Object.prototype.hasOwnProperty.call(window,"onorientationchange")?screen.orientation.type.includes("landscape"):window.innerHeight/window.innerWidth<1},gA.noConflict=function(){return window.device=mA,this},gA.ios()?gA.ipad()?wA("ios ipad tablet"):gA.iphone()?wA("ios iphone mobile"):gA.ipod()&&wA("ios ipod mobile"):gA.macos()?wA("macos desktop"):gA.android()?gA.androidTablet()?wA("android tablet"):wA("android mobile"):gA.blackberry()?gA.blackberryTablet()?wA("blackberry tablet"):wA("blackberry mobile"):gA.windows()?gA.windowsTablet()?wA("windows tablet"):gA.windowsPhone()?wA("windows mobile"):wA("windows desktop"):gA.fxos()?gA.fxosTablet()?wA("fxos tablet"):wA("fxos mobile"):gA.meego()?wA("meego mobile"):gA.nodeWebkit()?wA("node-webkit"):gA.television()?wA("television"):gA.desktop()&&wA("desktop"),gA.cordova()&&wA("cordova"),gA.onChangeOrientation=function(A){"function"==typeof A&&fA.push(A)};var EA="resize";function QA(A){for(var t=0;t3&&void 0!==arguments[3]?arguments[3]:"关闭广告";jA(this,A),this.adVideoSource=t,this.adLink=e,this.html=m(dA.a),this.adInterval=null,this.adCloseFunction=n,this.html.querySelector(".video-ad-close-text").innerText=i,this.adDuration=null,this.player=null}return kA(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;this.isEn=n&&"en-us"===n,this.html.querySelector(".video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击";var i=this.html.querySelector("#video-ad-content");i.setAttribute("src",this.adVideoSource);var o=this;this.html.querySelector(".icon-player-play").onclick=function(){e.playVideoAd(),e.html.querySelector(".autoplay-video-ad").style.display="none"},i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),document.getElementById("loadflag").style.display="none",o.adDuration=Math.ceil(i.duration),o.html.querySelector("#video-ad-duration").innerText=o.adDuration,i.play().then(function(){o.setAdInterval()}).catch(function(A){o.html.querySelector(".autoplay-video-ad").style.display="block"})});var r=this.html.querySelector(".video-ad-link"),a=this.html.querySelector(".video-ad-detail");r.setAttribute("href",this.adLink),a.setAttribute("href",this.adLink),A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this;null!==this.html&&(A.pause(),this.player=A,this.html.querySelector(".video-ad-close label").onclick=function(){"function"==typeof e.adCloseFunction?e.adCloseFunction(e):e.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()})}},{key:"pauseVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#video-ad-content").pause()}},{key:"playVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#video-ad-content").play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#video-ad-duration");this.adInterval=setInterval(function(){A.adDuration-=1,A.adDuration<=0?(A.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()):t.innerText=A.adDuration},1e3)}},{key:"closeVideoAd",value:function(){this.clearAdInterval(),this.html.parentNode.removeChild(this.html),this.html=null,this.player.getOptions().autoplay&&this.player.play()}}]),A}(),SA=function(){function A(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"关闭广告";jA(this,A),this.adVideoSource=t,this.adLink=e,this.html=m(pA.a),this.adInterval=null,this.adCloseFunction=n,this.html.querySelector(".video-ad-close-text").innerText=i,this.html.querySelector(".video-ad-link").setAttribute("href",this.adLink),this.html.querySelector(".video-ad-detail").setAttribute("href",this.adLink),this.adDuration=null}return kA(A,[{key:"createEl",value:function(A,t){var e=t._options&&t._options.language;this.isEn=e&&"en-us"===e,this.html.querySelector(".video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html),A.querySelector("video"),A.querySelector("video").setAttribute("preload","load");var n=A.querySelector(".prism-controlbar");n.className=n.className+" controlbar-element-hidden";var i=A.querySelector(".prism-big-play-btn");i.className=i.className+" controlbar-element-hidden"}},{key:"created",value:function(A){var t=this;if(this.player=A,this.vdSource=A.getOptions().source,A.loadByUrl(this.adVideoSource),this.html.querySelector(".autoplay-video-ad").onclick=function(){null!==t.adDuration&&(A.loadByUrl(t.adVideoSource),t.html.parentNode.querySelector(".prism-big-play-btn").click())},null===this.adDuration){this.adDuration=void 0;var e=this.html.parentNode.querySelector("video"),n=this;e.addEventListener("timeupdate",function t(){var i=e.duration;isNaN(i)||0===i||(e.removeEventListener("timeupdate",t),n.adDuration=Math.ceil(e.duration),"none"!==n.html.querySelector(".autoplay-video-ad").style.display&&(n.html.querySelector(".autoplay-video-ad").style.display="none",A.play()),n.html.querySelector("#video-ad-duration").innerText=n.adDuration,n.setAdInterval())})}}},{key:"ready",value:function(A){var t=this;this.html.querySelector(".video-ad-close label").onclick=function(){"function"==typeof t.adCloseFunction?t.adCloseFunction(t):t.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()}}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#video-ad-duration");this.adInterval=setInterval(function(){A.adDuration-=1,A.adDuration<=0?(A.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()):t.innerText=A.adDuration},1e3)}},{key:"closeVideoAd",value:function(){this.clearAdInterval(),this.player.loadByUrl(this.vdSource);var A=this.html.parentNode.querySelector(".prism-controlbar");A.className=A.className.replace(" controlbar-element-hidden","");var t=this.html.parentNode.querySelector(".prism-big-play-btn");t.className=t.className.replace(" controlbar-element-hidden",""),this.player.getOptions().autoplay&&this.player.play(),this.html.parentNode.removeChild(this.html)}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playVideoAd",value:function(){this.setAdInterval(),this.player.play()}},{key:"pauseVideoAd",value:function(){this.clearAdInterval(),this.player.pause()}}]),A}(),zA=LA;CA.mobile()&&(zA=SA);var OA=zA,YA=e(22),UA=e.n(YA),GA=e(23),FA=e.n(GA),HA=(e(59),function(){function A(A,t){for(var e=0;e'+A.text+""});e.html.querySelector(".caption-list").innerHTML='
  • 字幕
  • '+n.join("")});var i=this.html.querySelector(".current-caption"),o=this.html.querySelector(".caption-list");0==this.hasCreated&&this.definition&&(o.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var r=null;i.onclick=function(){o.style.display="block"},i.onmouseleave=function(){r=setTimeout(function(){o.style.display="none"},100)},o.onmouseenter=function(){clearTimeout(r)},o.onmouseleave=function(){o.style.display="none",e.modalHtml.style.display="none"},o.onclick=function(A){var n=A.target,i=n.dataset.def;if(i&&"current"!==n.className){var o=e.captionList.find(function(A){return A.value===i});t._ccService.switch(o.value),e.setCurrentCaption(o.text,o.value),e.modalHtml.style.display="block",e.modalHtml.querySelector(".switchimg").style.display="block",e.modalHtml.querySelector("span.current-caption-tag").innerText=o.text}}}},{key:"setCurrentCaption",value:function(A,t){var e=this.html.querySelector(".current-caption");e.innerText=A,e.dataset.def=t,this.definition=t;var n=this.html.querySelector(".caption-list"),i=n.querySelector(".current");i&&(i.className="");var o=n.querySelectorAll("li");o.forEach(function(t){t.innerText===A&&(t.className="current")}),o&&(o.className="current")}},{key:"created",value:function(A){}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-cc");t&&t.classList.add("player-hidden")}}]),A}(),VA=e(24),qA=e.n(VA),PA=e(25),RA=e.n(PA),JA=(e(61),function(){function A(A,t){for(var e=0;e'+A.text+""});e.html.querySelector(".track-list").innerHTML='
  • 音轨
  • '+n.join("")});var i=this.html.querySelector(".current-track"),o=this.html.querySelector(".track-list");0==this.hasCreated&&this.definition&&(o.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var r=null;i.onclick=function(){o.style.display="block"},i.onmouseleave=function(){r=setTimeout(function(){o.style.display="none"},100)},o.onmouseenter=function(){clearTimeout(r)},o.onmouseleave=function(){o.style.display="none",e.modalHtml.style.display="none"},o.onclick=function(A){var n=A.target,i=n.dataset.def;if(i&&"current"!==n.className){var o=e.trackList.find(function(A){return A.value.toString()===i});t._audioTrackService.switch(o.value),e.setCurrentTrack(o.text,o.value),e.modalHtml.style.display="block",e.modalHtml.querySelector(".switchimg").style.display="block",e.modalHtml.querySelector("span.current-track-tag").innerText=o.text}}}},{key:"setCurrentTrack",value:function(A,t){var e=this.html.querySelector(".current-track");e.innerText=A,e.dataset.def=t,this.definition=t;var n=this.html.querySelector(".track-list"),i=n.querySelector(".current");i&&(i.className="");var o=n.querySelectorAll("li");o.forEach(function(t){t.innerText===A&&(t.className="current")}),o&&(o.className="current")}},{key:"created",value:function(A){}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-audio");t&&t.classList.add("player-hidden")}}]),A}(),KA=e(26),XA=e.n(KA),_A=(e(63),e(27)),$A=e.n(_A),At=function(){function A(A,t){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:"关闭广告";tt(this,A),this.adVideoSource=t,this.html=m(XA.a),this.adInterval=null,this.adCloseFunction=e,this.html.querySelector(".many-video-ad-close-text").innerText=n,this.adDuration=null,this.player=null,this.indexVideo=1}return At(A,[{key:"createEl",value:function(A,t){var e=t._options&&t._options.language;this.isEn=e&&"en-us"===e,this.html.querySelector(".many-video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html)}},{key:"created",value:function(A){var t=this.adVideoSource.map(function(A,t){return''});this.html.querySelector(".videos").innerHTML=t.join(" "),this.indexVideo=Number(this.indexVideo);var e=this.indexVideo,n=this.adVideoSource,i=this.html.querySelector("#many-video-ad-content"+this.indexVideo),o=this.html.querySelector(".many-video-ad-detail"),r=this.html.querySelector("#many-video-ad-duration"),a=this,l=i.play();void 0!==l&&l.then(function(){i.play()}).catch(function(A){document.querySelector(".autoplay-many-video-ad").style.display="block",i.oncanplay=function(){var A=Math.ceil(i.duration);document.querySelector("#many-video-ad-duration").innerText=A}}),i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),o.href=n[e-1].adVideoLink,i.play().then(function(){var A=Math.ceil(i.duration);r.innerText=A,a.setAdInterval()}).catch(function(A){a.html.querySelector(".autoplay-many-video-ad").style.display="block",a.html.querySelector(".icon-player-play").onclick=function(){a.playManyVideoAd(),a.html.querySelector(".autoplay-many-video-ad").style.display="none"}})})}},{key:"ready",value:function(A,t){var e=this;this.indexVideo=Number(this.indexVideo);var n=this;this.html.querySelector("#many-video-ad-content"+this.indexVideo).addEventListener("ended",function(t){"-1"==n.playNext(n)&&A.play()}),this.html.querySelector(".many-video-ad-close label").onclick=function(){"function"==typeof e.adCloseFunction?e.adCloseFunction(e):e.closeManyVideoAd()}}},{key:"setAdInterval",value:function(A){var t=this,e=this.html.querySelector("#many-video-ad-duration"),n=this.html.querySelector("#many-video-ad-content"+this.indexVideo);this.adInterval=setInterval(function(){var A=Math.ceil(n.duration)-Math.ceil(n.currentTime);e.innerText=A,1==A&&clearInterval(t.adInterval)},1e3)}},{key:"pauseManyVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).pause()}},{key:"playManyVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playNext",value:function(A){if(A.indexVideo>=A.adVideoSource.length)return A.html.parentNode.removeChild(A.html),-1;this.indexVideo=Number(this.indexVideo),null!=document.getElementById("many-video-ad-content"+this.indexVideo)&&document.getElementById("many-video-ad-content"+this.indexVideo).remove();var t=this.indexVideo+1;A.html.querySelector(".many-video-ad-detail").href=A.adVideoSource[A.indexVideo].adVideoLink;var e=this.html.querySelector("#many-video-ad-content"+t),n=this.html.querySelector("#many-video-ad-duration");e.style.display="block",this.adVideoSource.length>=this.indexVideo&&(this.indexVideo=this.indexVideo+1);var i=Math.ceil(e.duration);n.innerText=i,A.setAdInterval(),e.play(),e.addEventListener("ended",function(t){"-1"==A.playNext(A)&&document.getElementById("player-con").getElementsByTagName("video")[0].play()})}},{key:"closeManyVideoAd",value:function(){this.clearAdInterval(),this.html.parentNode.removeChild(this.html),this.html=null,document.getElementById("player-con").getElementsByTagName("video")[0].play()}}]),A}(),nt=function(){function A(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"关闭广告";tt(this,A),this.adVideoSource=t,this.html=m($A.a),this.adInterval=null,this.adCloseFunction=e,this.html.querySelector(".many-video-ad-close-text").innerText=n,this.adDuration=null,this.player=null,this.indexVideo=1}return At(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;this.isEn=n&&"en-us"===n,this.html.querySelector(".many-video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html),A.querySelector(".videosmb"),A.querySelector(".videosmb").setAttribute("preload","load");var i=A.querySelector(".prism-controlbar");i.className=i.className+" controlbar-element-hidden",this.html.querySelector(".icon-player-play").onclick=function(){e.playManyVideoAd(),e.html.querySelector(".autoplay-many-video-ad").style.display="none"}}},{key:"created",value:function(A){var t=this.adVideoSource.map(function(A,t){return''});this.html.querySelector(".videosmb").innerHTML=t.join(" "),this.indexVideo=Number(this.indexVideo);var e=this.indexVideo,n=this.adVideoSource,i=this.html.querySelector("#many-video-ad-content"+this.indexVideo),o=this.html.querySelector(".many-video-ad-detail"),r=this;i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),o.href=n[e-1].adVideoLink,r.html.querySelector("#many-video-ad-duration").innerText=Math.ceil(i.duration)})}},{key:"ready",value:function(A){var t=this;this.indexVideo=Number(this.indexVideo);var e=this;this.html.querySelector("#many-video-ad-content"+this.indexVideo).addEventListener("ended",function(t){if("-1"==e.playNext(e)){A.play();var n=document.querySelector(".prism-controlbar");n.className=n.className.replace(" controlbar-element-hidden","")}}),this.html.querySelector(".many-video-ad-close label").onclick=function(){"function"==typeof t.adCloseFunction?t.adCloseFunction(t):t.closeManyVideoAd()}}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#many-video-ad-duration"),e=this.html.querySelector("#many-video-ad-content"+this.indexVideo);this.adInterval=setInterval(function(){var n=Math.ceil(e.duration)-Math.ceil(e.currentTime);t.innerText=n,1==n&&clearInterval(A.adInterval)},1e3)}},{key:"closeManyVideoAd",value:function(){this.clearAdInterval();var A=this.html.parentNode.querySelector(".prism-controlbar");A.className=A.className.replace(" controlbar-element-hidden",""),this.html.parentNode.removeChild(this.html),this.html=null,document.getElementById("player-con").getElementsByTagName("video")[0].play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playManyVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).play()}},{key:"pauseManyVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).pause()}},{key:"playNext",value:function(A){if(A.indexVideo>=A.adVideoSource.length)return A.html.parentNode.removeChild(A.html),-1;this.indexVideo=Number(this.indexVideo),null!=document.getElementById("many-video-ad-content"+this.indexVideo)&&document.getElementById("many-video-ad-content"+this.indexVideo).remove();var t=this.indexVideo+1;A.html.querySelector(".many-video-ad-detail").href=A.adVideoSource[A.indexVideo].adVideoLink;var e=this.html.querySelector("#many-video-ad-content"+t),n=this.html.querySelector("#many-video-ad-duration");e.style.display="block",this.adVideoSource.length>=this.indexVideo&&(this.indexVideo=this.indexVideo+1);var i=Math.ceil(e.duration);n.innerText=i,A.setAdInterval(),e.play(),e.addEventListener("ended",function(t){if("-1"==A.playNext(A)){document.getElementById("player-con").getElementsByTagName("video")[0].play();var e=document.querySelector(".prism-controlbar");e.className=e.className.replace(" controlbar-element-hidden","")}})}}]),A}(),it=et;CA.mobile()&&(it=nt);var ot=it;window.AliPlayerComponent={AliplayerDanmuComponent:v,BulletScreenComponent:N,MemoryPlayComponent:D,PauseADComponent:C,PlaylistComponent:O,PreviewVodComponent:F,RotateMirrorComponent:oA,StartADComponent:sA,VideoADComponent:OA,RateComponent:tA,QualityComponent:X,ProgressComponent:q,CaptionComponent:ZA,TrackComponent:WA,ManyVideoADComponent:ot}}]); \ No newline at end of file diff --git a/frontend/public/static/logo.png b/frontend/public/static/logo.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/frontend/public/static/logo.png differ diff --git a/frontend/public/static/logo3.png b/frontend/public/static/logo3.png new file mode 100644 index 0000000..53793a8 Binary files /dev/null and b/frontend/public/static/logo3.png differ diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..2f08534 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,64 @@ + + + + diff --git a/frontend/src/agora/InviteClient.js b/frontend/src/agora/InviteClient.js new file mode 100644 index 0000000..3639105 --- /dev/null +++ b/frontend/src/agora/InviteClient.js @@ -0,0 +1,307 @@ +import { EventEmitter } from 'events' +import { MessageBox } from 'element-ui' +import RtmClient from './rtmClient' +import StorageChannel from '../components/system/public/storageSignaling' + +export default class InviteClient { + constructor({ account = "", uid = "" }) { + localStorage.removeItem('account') + this.account = (account || '').trim() + this.appId = AGORA_APP_ID + this.channelName = '' + this.routeId = '' + this.call_is_immediate_join = true + this.is_call = false + this.isJoined = false + this.remoteLogin = false + this.uid = uid.toString() + this.events = new EventEmitter() + this.rtm = new RtmClient(this.appId) + // 基于H5的本地存储的跨页面通讯 + this.storageChannel = new StorageChannel('inviteClient') + this.storageChannelEvents() + this.storageChannel.postMessage('get_account', { account: this.account }) + + this.rtm.on("RemoteInvitationReceived", (content, callerId) => { this.onInviteReceived(content, callerId) }) + this.rtm.on("inviteEndByPeer", () => { this.onInviteEndByPeer() }) + this.rtm.on("LocalInvitationAccepted", ({ peerId }) => { + // remote user 已接收接受邀请 + this.rtm.client.getChannelMemberCount([this.channelName]).then(res => { + console.log(res) + }) + }) + this.rtm.on('MessageFromPeer', ({ text }) => { + console.log('[inviteClient] MessageFromPeer text ', text) + const storageChannel = this.storageChannel + const data = text.data + switch (text.name) { + case 'videoConsultationWindow': + if (text.type === 'tips') { + storageChannel.postMessage('videoConsultationWindowTips', data) + } + break + case 'router': // 超声会诊的提示信息 + this.$confirm(text.msg, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'info' + }).then(() => { + this.$router.push(text.router) + }).catch(() => { }) + break + + default: + break + } + }) + this.rtm.on('remoteLogin', res => { + this.storageChannel.postMessage('remoteLogin') + this.remoteLogin = true + MessageBox.alert('你的账号已在其他地方登录,导致部分功能无法正常使用。请重新登录!', '登录提示', { + confirmButton: '确定', + type: 'warning' + }).then(res => { + MessageBox.close() + this.storageChannel.postMessage('remoteLoginCloseAlert') + }) + }) + } + + async init() { + console.log('uid: ' + this.uid) + return this.rtm.login(this.uid).then(res => { + this.uid = this.rtm.uid + return res + }) + const rtmClient = await this.rtm.login(this.uid) + return rtmClient + } + + // 跨页面通讯事件注册 + storageChannelEvents() { + const storageChannel = this.storageChannel + storageChannel.on('remoteLoginCloseAlert', res => { + MessageBox.close() + }) + storageChannel.on('is_joined', res => { + this.isJoined = res.isJoined + }) + storageChannel.on('get_system_info', res => { + storageChannel.postMessage('get_account', { account: this.account }) + if (this.isJoined) { + this.isJoined = false + this.do_join() + } + }) + storageChannel.on('get_channelName', res => { + this.channelName = res.channelName + console.log('channelName: ' + this.channelName) + if (!this.call_is_immediate_join && this.is_call) { + console.log('call_is_immediate_join', this.call_is_immediate_join) + // 打开视频窗口 + storageChannel.postMessage(`open_videoWindow`, null) + // 调用加入视频函数 + this.do_join() + this.is_call = false + } + }) + storageChannel.on('do_call', res => { + let options = { + peers: res.callAccount + } + this.do_call(options) + this.do_join() + }) + storageChannel.on('do_join', res => { + this.do_join() + }) + storageChannel.on('do_leave', res => { + this.do_leave() + }) + // storageChannel.on('subscribePeersOnlineStatus', res => { + + // }) + // storageChannel.on('unsubscribePeersOnlineStatus', res => { + + // }) + storageChannel.on('sendMessageToPeer', res => { + const peerId = res.uid + peerId && this.rtm.sendMessageToPeer(res, peerId) + }) + } + + // 设置route Id + setRouteId(routeId) { + this.routeId = routeId || '' + } + + // 邀请远端用户方法 + call(content, peerId) { + return new Promise((resolve, reject) => { + this.rtm.invite(content, peerId) + }) + } + + // 结束呼叫的方法 + endCall(passive) { + //end rtm + if (!passive) { + this.rtm.endCall() + } + } + + do_call = (res) => { + // 被呼叫的用户 + const peers = res.peers + const len = peers.length + if (!len && false) { + peers.forEach(peer => { + if (!verifyPeers.includes(peer)) { + console.log('[ inviteClient ] call ' + peer.account + ' , channelName : ' + channelNamechannelName + ', extra : ' + JSON.stringify(extra)) + + // 添加到验证邀请用户是否已邀请的数组中 + verifyPeers.push(peer) + // 添加呼叫类型 + if (!current_callType.includes(peer.callType)) { + current_callType.push(peer.callType) + } + // 邀请peer用户加入频道的方法 + let call = session.channelInviteUser2(channelName, peer.account, JSON.stringify({ ...peer })) + console.log(call) + callLists.push(call) + init_call(call) + } else { + console.log('[ inviteClient ] ' + peer + '已在频道') + } + }) + return false + } else if (len == 1) { + const rtm = this.rtm + const peer = peers[0] + const uid = peer.uid.toString() + peer.channelName = this.channelName + rtm.client.queryPeersOnlineStatus([this.uid]).then(status => { + const onlineStatus = status[this.uid] + if (onlineStatus) { + rtm.client.queryPeersOnlineStatus([uid]).then(status => { + const onlineStatus = status[uid] + if (onlineStatus) { + this.call(peer, uid).then(() => { + // 设置local user 的用户属性 + // rtm.client.addOrUpdateLocalUserAttributes() + }).catch(() => { + this.endCall(false) + }) + } else { + this.storageChannel.postMessage('peer-online-status', { uid, result: onlineStatus, msg: 'offline' }) + } + }).catch(err => { + console.log(err) + this.storageChannel.postMessage('peer-online-status', { uid, result: false, msg: 'err' }) + }) + } else { + this.remoteLogin && this.storageChannel.postMessage('remoteLoginCloseAlert') + } + }).catch(err => { + console.log(err) + this.storageChannel.postMessage('remoteLoginCloseAlert') + }) + } else { + console.log('[ inviteClient ] 未填写邀请用户!!!') + } + } + + // 接收调用时委托回调 + onInviteReceived(res) { + const call = res.content + const channelName = this.channelName + if (!channelName || channelName == call.channelName) { + console.log('[ inviteClient ] recv inst msg from ' + call.uid + ', ' + call.channelName + ', ' + JSON.stringify(call)) + this.rtm.on("RemoteInvitationAccepted", ({ uid, channel, state }) => { + console.log("[ inviteClient ] RemoteInvitationAccepted ", { uid, channel, state }) + this.uid = uid + this.channelName = channel + this.events.emit('inviteReceived', { + path: call.path, + query: { + id: call.videoId, + diagnosisType: 'SP' + } + }) + console.log(' [ inviteClient ] onInviteReceived ', this.routeId, this.routeId === call.videoId, call.videoId) + this.call_is_immediate_join = this.routeId == call.videoId + this.is_call = true + if (this.call_is_immediate_join) { + console.log('[ inviteClient ] call_is_immediate_join', this.call_is_immediate_join) + // 调用加入视频函数 + this.do_join() + // 打开视频窗口 + this.storageChannel.postMessage(`open_videoWindow`, null) + } + }) + this.rtm.accept() + } + } + + // 调用结束时调用的委托回调 + onInviteEndByPeer() { + this.endCall(true) + } + + // 加入频道 + do_join() { // appId uid channelName + // if (!this.isJoined) { + this.isJoined = true + const { appId, channelName, uid } = this + this.storageChannel.postMessage(`do_join_media`, { appId, channelName }) + // } + } + + // 离开视频会诊界面退出频道和视频 + do_leave(res) { + console.log('do_leave') + // 退出视频 + this.storageChannel.postMessage(`do_leave_media`, null) + this.storageChannel.postMessage('is_joined', { isJoined: false, isSaveData: true }) + + if (this.isJoined) { + // 设置加入频道状态 + this.isJoined = false + // this.rtm.leave().then(res => { + // console.log('[ channel ] Leavel channel successfully') + // }) + } + } + + // signal退出登录 + doLogout() { + console.log('[ inviteClient ] Signaling logout successful'), + this.do_leave() + this.rtm.logout() + this.storageChannel.destroyed() + this.storageChannel = null + } + + _removeArray(arr) { + console.log(this) + let slice = Array.prototype.slice + let args = slice.call(arguments, 1) + if (Array.isArray(arr)) { + console.log(args) + args.forEach(el => { + let index = arr.indexOf(el) + console.log(index) + if (index > -1) { + arr.splice(index, 1) + } + }) + console.log('[ inviteClient ] RemoveArray:', arr) + } else { + console.error('[ inviteClient ] Error: arr is not a Array.') + } + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/frontend/src/agora/LiveShowDemo.vue b/frontend/src/agora/LiveShowDemo.vue new file mode 100644 index 0000000..e9dc142 --- /dev/null +++ b/frontend/src/agora/LiveShowDemo.vue @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/agora/LiveStreamAudience.vue b/frontend/src/agora/LiveStreamAudience.vue new file mode 100644 index 0000000..8fc7efd --- /dev/null +++ b/frontend/src/agora/LiveStreamAudience.vue @@ -0,0 +1,1065 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/agora/LiveStreamHost.vue b/frontend/src/agora/LiveStreamHost.vue new file mode 100644 index 0000000..c457181 --- /dev/null +++ b/frontend/src/agora/LiveStreamHost.vue @@ -0,0 +1,579 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/agora/SettingDevices.vue b/frontend/src/agora/SettingDevices.vue new file mode 100644 index 0000000..9842d52 --- /dev/null +++ b/frontend/src/agora/SettingDevices.vue @@ -0,0 +1,267 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/agora/agoraConfig.js b/frontend/src/agora/agoraConfig.js new file mode 100644 index 0000000..a58da00 --- /dev/null +++ b/frontend/src/agora/agoraConfig.js @@ -0,0 +1,2 @@ +// E33D67E2B174495F8F7AB9E154713D5E +export const AGORA_APP_ID = import.meta.env.PROD ? import.meta.env.VITE_AGORA_APP_ID : 'dbe6c79f3c8045b4abbf8429838189db' \ No newline at end of file diff --git a/frontend/src/agora/controller.js b/frontend/src/agora/controller.js new file mode 100644 index 0000000..4650863 --- /dev/null +++ b/frontend/src/agora/controller.js @@ -0,0 +1,183 @@ +import { EventEmitter } from 'events' +import RTMClient from './rtmClient' +import { MessageBox } from 'element-ui' +export default class Contorller { + constructor(appid) { + this._defineProperty('channelName') + this.peersOnlineState = {} + this.rtm = new RTMClient(appid) + this.events = new EventEmitter() + this.rtm.on('RemoteInvitationReceived', callerId => { this.onInviteReceived(callerId) }) + this.rtm.on('inviteEndByPeer', () => { this.onInviteEndByPeer() }) + this.rtm.on('LocalInvitationAccepted', ({ peerId }) => { + // + }) + this.rtm.on('LoginSuccess', res => { + this.events.emit('LoginSuccess') + }) + this.rtm.on('ConnectionStateChanged', state => { + console.log('[contorller] ConnectionStateChanged state: ', state) + this.events.emit('ConnectionStateChanged', state) + }) + this.rtm.on('PeersOnlineStatusChanged', status => { + console.log('[contorller] PeersOnlineStatusChanged status: ', status) + const peersOnlineState = this.peersOnlineState + Object.keys(status).forEach(item => { + peersOnlineState[item] = status[item] + }) + this.events.emit('PeersOnlineStatusChanged', status) + }) + this.rtm.on('MemberJoined', (memberId, channelName) => { + this.events.emit('MemberJoined', memberId, channelName) + }) + this.rtm.on('MemberLeft', (memberId, channelName) => { + this.events.emit('MemberLeft', memberId, channelName) + }) + this.rtm.on('ChannelMessage', ({ text, memberId, channelName }) => { + this.events.emit('ChannelMessage', { text, memberId, channelName }) + }) + this.rtm.on('MessageFromPeer', ({ text, peerId }) => { + this.events.emit('MessageFromPeer', { text, peerId }) + }) + this.rtm.on('remoteLogin', res => { + this.storageChannel.postMessage('remoteLogin') + this.remoteLogin = true + MessageBox.alert('你的账号已在其他地方登录,导致部分功能无法正常使用。请重新登录!', '登录提示', { + confirmButton: '确定', + type: 'warning' + }).then(res => { + MessageBox.close() + }) + }) + } + + async login(localAccount) { + return await this.rtm.login(localAccount) + } + + async logout() { + return await this.rtm.logout() + } + + async join(channelName) { + channelName && (this.channelName = 'contorller' + channelName) + return await this.rtm.join(this.channelName) + } + + async leave(channelName) { + return await this.rtm.leave(channelName) + } + + getMembers(channelName) { + return this.rtm.getMembers(channelName) + } + + // 邀请远端用户方法 + _call(content, peerId) { + return new Promise((resolve, reject) => { + this.channelName = content.channelName = 'contorller' + content.channelName + this.rtm.invite(content, peerId).then(res => { + resolve(res) + }).catch(err => { + reject(err) + }) + }) + } + + // 结束呼叫的方法 + endCall(passive) { + //end rtm + if (!passive) { + this.rtm.endCall() + } + } + + call(content, peerId) { + console.log('[ contorller ] call') + // 被呼叫的用户 + return this._call(content, peerId).then(async res => { + let channelMemberCount = await this.rtm.client.getChannelMemberCount([this.channelName]) + console.log('[ channelMemberCount ]', channelMemberCount) + }).catch(err => { + console.log('call err', err) + this.endCall(false) + }) + } + + // 接收呼叫时委托回调 + onInviteReceived(res) { + const call = res.content + const channelName = this.channelName + if (!channelName || channelName == call.channelName) { + console.log('recv inst msg from ' + call.peer + ', ' + call.channelName + ', ' + JSON.stringify(call)) + this.rtm.on("RemoteInvitationAccepted", ({ uid, channel, state }) => { + console.log("[client] RemoteInvitationAccepted ", { uid, channel, state }) + this.uid = uid + this.channelName = channel + this.endCall() + }) + this.rtm.accept() + } + } + + // 调用结束时调用的代理回调 + onInviteEndByPeer() { + console.log('[contorller] onInviteEndByPeer') + this.endCall(true) + } + + sendMessage(text) { + return this.rtm.sendMessage(text) + } + + sendMessageToPeer(msg, peerId) { + const isFilter = msg.type !== 'status' + + const peerOnlineState = this.peersOnlineState[peerId] + if (isFilter && peerOnlineState && peerOnlineState === 'OFFLINE') { + return Promise.reject('PEER_OFFLINE') + } + + return this.rtm.sendMessageToPeer(msg, peerId) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The channel ID of the specified channel. + * @param {AttributesMap} attributes — An array of channel attributes. + * @param {ChannelAttributeOptions} options — Options for this attribute operation. + * @memberof RTMClient + */ + setChannelAttributes(channelId, attributes, options = {}) { + return this.rtm.setChannelAttributes(channelId, attributes, options) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The ID of the specified channel. + * @param {string[]} keys — An array of attribute keys. + * @memberof RTMClient + */ + getChannelAttributesByKeys(channelId, keys) { + return this.rtm.getChannelAttributesByKeys(channelId, keys) + } + + _defineProperty(name) { + sessionStorage.Contorller = sessionStorage.Contorller || JSON.stringify({}) + let value = JSON.parse(sessionStorage.Contorller).cName || null + Object.defineProperty(this, name, { + get() { + return value + }, + set(val) { + let contorller = JSON.parse(sessionStorage.Contorller) + value = contorller.cName = val + sessionStorage.Contorller = JSON.stringify(contorller) + } + }) + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/frontend/src/agora/rtcClient.js b/frontend/src/agora/rtcClient.js new file mode 100644 index 0000000..47a0d5c --- /dev/null +++ b/frontend/src/agora/rtcClient.js @@ -0,0 +1,1114 @@ +// RtcClient-NG 1.0.0 +import { EventEmitter } from 'events' +import AgoraRTC, { + ClientRole, + ClientRoleOptions, + IAgoraRTCClient, + IMicrophoneAudioTrack, + ICameraVideoTrack, + IRemoteAudioTrack, + IAgoraRTCRemoteUser, + AudioEncoderConfiguration, + AudioEncoderConfigurationPreset, + VideoEncoderConfiguration, + VideoEncoderConfigurationPreset, + ScreenEncoderConfigurationPreset, +} from 'agora-rtc-sdk-ng' +import { axios } from '../vue-config' +import { cloneDeep } from 'lodash' + +/** + * @typedef IState + * @property {string} channel + * @property {boolean} isAuthentication + * @property {boolean} isProxy + * @property {boolean} joined + * @property {boolean} published + * @property {boolean} voiceCall + * @property {boolean} hasRemoteStream + */ + +/** + * @typedef IStreamConfig + * @property {boolean} audio + * @property {boolean} video + * @property {boolean} screen + * @property {string} screenAudio + * @property {string} microphoneId + * @property {string} cameraId + */ + +/** + * @typedef IDevicesFilter + * @property {RegExp|string|null} audio + * @property {RegExp|string|null} vidoe + * @property {RegExp|string|null} speaker + */ + +/** + * @typedef ICheckDevices + * @property {boolean} recordingDevices + * @property {boolean} videoDevices + * @property {boolean} playoutDevices + */ + +/** + * + * @param {string} message + * @returns Error + */ +const error = (message = '') => { + const err = new Error(message) + err.name = 'rtcClient [ERROR]' + return err +} + +const devicesErrorInfo = { + 'ERROR_NOT_MICROPHONE': '未检测到麦克风设备!!!', + 'ERROR_NOT_CAMERA': '未检测到摄像头设备!!!', + 'ERROR_NOT_LOUDSPEAKER': '未检测到扬声器设备!!!', + 'ERROR_NOT_MICROPHONE_CAMERA': '未检测到麦克风和摄像头设备!!!', + 'ERROR_NOT_MICROPHONE_LOUDSPEAKER': '未检测到麦克风和扬声器设备!!!', + 'ERROR_NOT_CAMERA_LOUDSPEAKER': '未检测到摄像头和扬声器设备!!!', + 'ERROR_NOT_MICROPHONE_CAMERA_LOUDSPEAKER': '未检测到麦克风、摄像头和扬声器设备!!!', +} + +/** + * @typedef IDevicesAllowedMsg + * @property {string} NotAllowedError + * @property {string} MEDIA_OPTION_INVALID + * @property {string} DEVICES_NOT_FOUND + * @property {string} NOT_SUPPORTED + * @property {string} PERMISSION_DENIED + * @property {string} CONSTRAINT_NOT_SATISFIED + * @property {string} PluginNotInstalledProperly + * @property {string} NotFoundError + * @property {string} NotReadableError + * @property {string} UNDEFINED + * @property {string} undefined + */ +const GET_DEVICES_ALLOWED_MSG = { + 'NotAllowedError': '浏览器拒绝授予对应的摄像头或麦克风权限。', + 'MEDIA_OPTION_INVALID': '摄像头被占用或者分辨率不支持', + 'DEVICES_NOT_FOUND': '未检测到设备', + 'NOT_SUPPORTED': '浏览器不支持获取获取摄像头和麦克风', + 'PERMISSION_DENIED': '浏览器禁用设备或者用户拒绝打开设备', + 'CONSTRAINT_NOT_SATISFIED': '配置参数不合法', + 'PluginNotInstalledProperly': '用户尝试在 Chrome 上进行屏幕共享,但未安装屏幕共享插件,或使用了错误的 extensionId', + 'NotFoundError': '未检测到设备', + 'NotReadableError': '无法启动视频源,请检查摄像头是否能正常使用或者被占用', + 'UNDEFINED': '未定义错误', + 'undefined': '未定义错误' +} + +const isProd = import.meta.env.PROD +const PREFIX = isProd ? location.hostname.split('.').slice(0)[0] : '' + +const defaultState = { + channel: '', + isAuthentication: false, + isProxy: false, + joined: false, + published: false, + voiceCall: false, + hasRemoteStream: false, +} + +class RTCClient { + /** + * @type {boolean} + * @memberof RtcClient + */ + _addEventListener = false + + /** + * @type {boolean} + * @memberof RtcClient + */ + _subscribable = true + + /** + * @type {EventEmitter} + * @memberof RtcClient + */ + events = new EventEmitter() + + /** + * @type {IAgoraRTCClient} + * @memberof RtcClient + */ + rtc = null + + /** + * @type {string} + * @memberof RtcClient + */ + appId = '' + + /** + * @type {string} + * @memberof RtcClient + */ + mode = '' + + /** + * @type {IMicrophoneAudioTrack} + * @memberof RtcClient + */ + localAudioTrack = null + + /** + * @type {ICameraVideoTrack} + * @memberof RtcClient + */ + localVideoTrack = null + + /** + * @type {string | number} + * @memberof RtcClient + */ + uid = null + + /** + * @type {IState} + * @memberof RtcClient + */ + state = cloneDeep(defaultState) + + /** + * @type {(string | number)[]} + * @memberof RtcClient + */ + unsubscribePeers = [] + + /** + * @type {IAgoraRTCRemoteUser[]} + * @memberof RtcClient + */ + remoteUsers = [] + + /** + * @type {(string | number)[]} + * @memberof RtcClient + */ + remotePeers = [] + + /** + * @type {AudioEncoderConfiguration | AudioEncoderConfigurationPreset} + * @memberof RtcClient + */ + audioProfile = 'high_quality' + + /** + * @type {VideoEncoderConfiguration | VideoEncoderConfigurationPreset | ScreenEncoderConfigurationPreset} + * @memberof RtcClient + */ + videoProfile = '720p_2' + + /** + * @type {IStreamConfig} + * @memberof RtcClient + */ + streamConfig = { + audio: true, + video: true, + screen: false, + screenAudio: 'disable', + } + + /** + * @type {IDevicesFilter} + * @memberof RtcClient + */ + devicesFilter = { + video: null, + audio: null, + speaker: null + } + + /** + * @type {IDevicesFilter} + * @memberof RtcClient + */ + devicesNotFilter = { + video: null, + audio: null, + speaker: null + } + + /** + * @type {ICheckDevices} + * @memberof RtcClient + */ + checkDevices = { + recordingDevices: true, + videoDevices: true, + playoutDevices: true, + } + + /** + * @type {IDevicesAllowedMsg} + * @memberof RtcClient + */ + GET_DEVICES_ALLOWED_MSG = GET_DEVICES_ALLOWED_MSG + + /** + * Creates an instance of RtcClient. + * @param {string} appId + * @param {string} [mode='rtc'] + * @memberof RtcClient + */ + constructor(appId, mode = 'rtc') { + this.appId = appId + this.mode = mode + this.rtc = AgoraRTC.createClient({ mode, codec: 'vp8' }) + this.subscribeAgoraRTCEvents() + // console.log('[rtcClient] rtcClient:', this) + } + + /** + * @type {boolean} + * @readonly + * @memberof RtcClient + */ + get isSubscribable () { + return this._subscribable + } + + /** + * @type {boolean} + * @readonly + * @memberof RtcClient + */ + get active () { + return this.state.joined || !!this.localAudioTrack || !!this.localVideoTrack + } + + /** + * @type {string} + * @readonly + * @memberof RtcClient + */ + get channel () { + return this.state.channel + } + + /** + * @type {boolean} + * @readonly + * @memberof RtcClient + */ + get published () { + return this.state.published + } + + /** + * @type {boolean} + * @readonly + * @memberof RtcClient + */ + get voiceCall () { + return this.state.voiceCall + } + + /** + * @param {ClientRole} role + * @param {ClientRoleOptions} [options?] + * @memberof RTCClient + */ + setClientRole(role, options) { + this.rtc.setClientRole(role, options) + } + + /** + * @param {boolean} subscribable + * @memberof RTCClient + */ + setSubscribable(subscribable) { + this._subscribable = subscribable + } + + /** + * @name getResolution + * @description 获取视频轨道类 vidoeTrack 的分辨率并返回, videoTrack 不存在返回 null + * @param {ICameraVideoTrack} videoTrack AgoraSDK 创建的视频轨道类 + * @return { [number, number] | null } resolution [width, height] + * @memberof RtcClient + */ + getResolution(videoTrack) { // TODO: yunnan_web 项目新增该方法 + console.log('[rtcClient] getResolution() invoking.') + if (!videoTrack) { + return console.log('[rtcClient] getResolution() videoTrack:', videoTrack), null + } + const width = videoTrack._width ? videoTrack._width : 0 + const height = videoTrack._height ? videoTrack._height : 0 + // console.log('[rtcClient] getResolution() width:', width, 'height:', height) + return [width, height] + } + + /** + * @param {AudioEncoderConfiguration | AudioEncoderConfigurationPreset} audioProfile + * @memberof RTCClient + */ + setAudioProfile(audioProfile) { + // 设置音频属性 + this.audioProfile = audioProfile + } + + /** + * @param {VideoEncoderConfiguration | VideoEncoderConfigurationPreset | ScreenEncoderConfigurationPreset} videoProfile + * @memberof RTCClient + */ + setVideoProfile(videoProfile) { + // 设置视频或者共享屏幕的分辨率 + this.videoProfile = videoProfile + } + + /** + * @param {IStreamConfig} config + * @memberof RtcClient + */ + setVideoConfig(config = {}) { + this.streamConfig = { + audio: true, + video: true, + screen: false, + screenAudio: 'disable', + ...config + } + } + + /** + * @param {IStreamConfig} config + * @memberof RtcClient + */ + setScreenConfig(config = {}) { + this.streamConfig = { + audio: false, + video: false, + screen: true, + screenAudio: 'auto', + ...config + } + } + + async join(channel, uid = this.uid) { + if (!channel) throw error('Invalid Channel Name undefined'); + const client = this.rtc + const state = this.state + channel = state.channel === channel ? channel : PREFIX + channel + console.log('[rtcClient] join() Get dynamic token before. channel:', channel) + const dynamicToken = await this.getDynamicToken(channel) + console.log('[rtcClient] join() Get dynamic token after. dynamicToken:', dynamicToken) + this.subscribeClientEvents() + state.channel = channel + state.isProxy && client.startProxyServer(3); + return client.join(this.appId, channel, dynamicToken, uid).then(uid => { + !state.joined && this.getLocalStats() + this.uid = uid + state.joined = true + // this._getTransportStats() + console.log('[rtcClient] join() Join successfully.') + return uid + }).catch(err => { + state.joined = false + return Promise.reject(err) + }) + } + + async leave() { + const rtc = this.rtc + + this.unsubscribeClientEvents() + this.removeRemoteStream() + + const state = this.state + const isProxy = state.isProxy + state.joined = false + + console.log('[rtcClient] leave() state:', state, 'defaultState:', defaultState, 'rtcClient', this) + + return rtc.leave().then(() => { + console.log('[rtcClient] leave() RTC leave successfully.') + isProxy && rtc.stopProxyServer() + }) + } + + createMicrophoneAudioTrack() { + const { streamConfig, audioProfile } = this + const config = { + microphoneId: streamConfig.microphoneId, + encoderConfig: audioProfile + } + return AgoraRTC.createMicrophoneAudioTrack(config) + } + + createCameraVideoTrack() { + const { streamConfig, videoProfile } = this + const config = { + cameraId: streamConfig.cameraId, + encoderConfig: videoProfile + } + return AgoraRTC.createCameraVideoTrack(config) + } + + createScreenVideoTrack() { + const { streamConfig, videoProfile } = this + const config = { + encoderConfig: videoProfile + } + return AgoraRTC.createScreenVideoTrack(config, streamConfig.screenAudio) + } + + async createStream(autoPublish = true) { + console.log('[rtcClient] createStream() Create track start.') + const { uid, streamConfig, state } = this + let audioTrack = null + let videoTrack = null + if (streamConfig.screen) { + const screenVideoTrack = await this.createScreenVideoTrack() + if (Array.isArray(screenVideoTrack)) { + audioTrack = screenVideoTrack[1] + videoTrack = screenVideoTrack[0] + } else { + videoTrack = screenVideoTrack + } + } else { + streamConfig.audio && (audioTrack = await this.createMicrophoneAudioTrack()) + streamConfig.video && (videoTrack = await this.createCameraVideoTrack()) + } + console.log('[rtcClient] createStream() The track was created successfully.') + this.localAudioTrack = audioTrack + this.localVideoTrack = videoTrack + if (state.joined && autoPublish) { + await this.publishLoackTrack() + console.log('[rtcClient] createStream() The track was published successfully.') + } + return { + uid, + audioTrack, + videoTrack + } + } + + async destroyAudioTrack() { // TODO: lunqin_web 项目因离线超声功能 stream 销毁从 leave() 方法中分离;yunnan_web 项目同上,此代码是 yunnan_web 上的 + const { localAudioTrack } = this + localAudioTrack && (this.stop(localAudioTrack), localAudioTrack.close()) + this.localAudioTrack = null + } + + async destroyVideoTrack() { // TODO: lunqin_web 项目因离线超声功能 stream 销毁从 leave() 方法中分离;yunnan_web 项目同上,此代码是 yunnan_web 上的 + const { localVideoTrack } = this + localVideoTrack && (this.stop(localVideoTrack), localVideoTrack.close()) + this.localVideoTrack = null + } + + async destroyStream() { // TODO: lunqin_web 项目因离线超声功能 stream 销毁从 leave() 方法中分离;yunnan_web 项目同上,此代码是 yunnan_web 上的 + const { rtc, localAudioTrack, localVideoTrack, state } = this + if (state.published) { + rtc.localTracks.forEach(track => { + this.stop(track) + track.close() + }) + await this.unpublish(rtc.localTracks) + } + localAudioTrack && (this.stop(localAudioTrack), localAudioTrack.close()) + localVideoTrack && (this.stop(localVideoTrack), localVideoTrack.close()) + this.localAudioTrack = null + this.localVideoTrack = null + } + + async publishLoackTrack() { + const { localAudioTrack, localVideoTrack } = this + const tracks = [] + if (localAudioTrack) { + tracks.push(localAudioTrack) + } + if (localVideoTrack) { + tracks.push(localVideoTrack) + } + console.log('[rtcClient] publishLoackTrack() tracks.length:', tracks.length) + tracks.length > 0 && await this.publish(tracks) + } + + async publish(tracks) { + const state = this.state + if (!state.joined) return console.log('[rtcClient] publish() RTC client did not join the channel.') + const { rtc } = this + if (tracks) { + const user = { uid: this.uid, ...this.streamConfig } + const mediaType = Array.isArray(tracks) ? (tracks.length === 2 ? 'tracks' : tracks[0].trackMediaType) : tracks.trackMediaType + await rtc.publish(tracks) + state.published = !!rtc.localTracks.length + this.events.emit('published', user, mediaType) + } + } + + async unpublishLoackTrack() { + const { localAudioTrack, localVideoTrack } = this + const tracks = [] + if (localAudioTrack) { + tracks.push(localAudioTrack) + } + if (localVideoTrack) { + tracks.push(localVideoTrack) + } + console.log('[rtcClient] unpublishLoackTrack() tracks.length:', tracks.length) + tracks.length > 0 && await this.unpublish(tracks) + } + + async unpublish(tracks) { + const state = this.state + if (!state.joined) return console.log('[rtcClient] unpublish() RTC client did not join the channel.') + const { rtc } = this + if (tracks) { + const user = { uid: this.uid } + const mediaType = Array.isArray(tracks) ? (tracks.length === 2 ? 'tracks' : tracks[0].trackMediaType) : tracks.trackMediaType + await rtc.unpublish(tracks) + state.published = !!rtc.localTracks.length + this.events.emit('unpublished', user, mediaType) + } + } + + /** + * @param {IMicrophoneAudioTrack|ICameraVideoTrack} track + * @param {string} name + * @param {object} config + * @return {void} + * @memberof RTCClient + */ + play(track, name, config = {}) { + if (!track) return; + + this.stop(track) + if (track.trackMediaType === 'video') { + const id = name || track.getTrackId() + const container = document.getElementById(id) + const option = Object.assign({ + fit: 'contain' + }, config) + container && (container.innerHTML = '') + track.elementID = id + track.play(id, option) + } else { + track.play() + } + console.log('[rtcClient] play() track:', track) + } + + /** + * @param {IMicrophoneAudioTrack|ICameraVideoTrack} track + * @return {void} + * @memberof RTCClient + */ + stop(track) { + if (track && track.isPlaying) { + track.stop() + } + } + + togglePlay(track) { + if (track) return; + if (track.isPlaying) { + this.stop(track) + } else { + this.play(track) + } + } + + setDevice(track, deviceId) { + return new Promise((resolve, reject) => { + if (track !== null) { + track.setDevice(deviceId).then(() => { + console.log(`[rtcClient] setDevice() Switch device ${track.trackMediaType} successed.`) + resolve() + }).catch(err => { + console.log(`[rtcClient] setDevice() Switch device ${track.trackMediaType} failed.`) + reject(err) + }) + } + }) + } + + /** + * @param {IRemoteAudioTrack} track + * @param {string} deviceId + * @memberof RTCClient + */ + setAudioOutput(track, deviceId) { + return new Promise((resolve, reject) => { + // console.log('[rtcClient] setAudioOutput() track:', track) + if (track != null && track.trackMediaType === 'audio') { + track.setPlaybackDevice(deviceId).then(() => { + console.log('[rtcClient] setAudioOutput() Set audio output successfully.') + resolve() + }).catch(err => { + console.log('[rtcClient] setAudioOutput() Set audio output failed. err:', err) + reject(err) + }) + } + }) + } + + toggleMute(track) { + console.log('[rtcClient] toggleMute() track:', track) + if (track !== null) return; + track.setMuted(!track.muted) + } + + async toggleVoiceCall() { + console.log('[rtcClient] toggleVoiceCall()') + const { state, rtc, remoteUsers } = this + const voiceCall = !state.voiceCall + const promises = remoteUsers.map(user => { + if (voiceCall) { + return rtc.unsubscribe(user, 'video') + } else { + return rtc.subscribe(user, 'video').then(track => { + this.events.emit('stream-subscribed', user, 'video') + }) + } + }) + await Promise.all(promises) + state.voiceCall = voiceCall + } + + getVolumeLevel(audioTrack) { + if (audioTrack && typeof audioTrack.getVolumeLevel === 'function') { + const audioLevel = audioTrack.getVolumeLevel() + const volume = Math.floor((audioLevel || 0) * 100) + // console.log('[rtcClient] getVolumeLevel() volume:', volume) + return volume + } else { + return 0 + } + } + + getRealTimeVolume(audioTrack) { // TODO: 修改为一次性调用 + // console.log('[rtcClient] getRealTimeVolume() audioTrack:', audioTrack) + if (!audioTrack) { + return false + } + + const isLocal = audioTrack === this.localAudioTrack + const uid = isLocal || !audioTrack.getUserId ? this.uid : audioTrack.getUserId() + const bool = isLocal || this.hasRemoteStream(uid) + // console.log('[rtcClient] getRealTimeVolume() bool:', bool) + if (bool) { + const volume = this.getVolumeLevel(audioTrack) + // console.log('[rtcClient] getRealTimeVolume() volume:', volume) + this.events.emit('real-time-volume', { uid, volume }) + requestAnimationFrame(() => { + this.getRealTimeVolume(audioTrack) + }) + } else { + this.events.emit('real-time-volume', { uid, volume: 0 }) + } + } + + /** + * @param { Function } callback The callback contains the statistics of the transmission quality. + * @param { Object } TransportStats Properties: NetworkType, OutgoingAvailableBandwidth, IncomingAvailableBandwidth, RTT + * @param { String } NetworkType 网络类型,"bluetooth" | "cellular" | "ethernet" | "none" | "wifi" | "wimax" | "other" | "unknown" | "UNSUPPORTED" + * @param { String } OutgoingAvailableBandwidth 上行可用带宽估计,单位为 Kbps + * @param { Object } IncomingAvailableBandwidth 下行可用带宽估计,单位为 Kbps;每个 remote user 的下行可用宽带对象,key 为 uid + * @param { String } RTT SDK 到 SD-RTN 接入节点的 RTT (Round-Trip Time),单位 ms + */ + getTransportStats() { + // 获取网络状态数据 + const stats = this.rtc.getRTCStats() + console.log('[rtcClient] _getTransportStats() transportStats:', stats) + // const conversionRule = 1000 + // 上行宽带换算 Kbps => KBps => MBps + // const OutgoingAvailableBandwidth = parseFloat(stats.OutgoingAvailableBandwidth) + // !isNaN(OutgoingAvailableBandwidth) && (stats.OutgoingAvailableBandwidth = (OutgoingAvailableBandwidth / 8 / conversionRule).toFixed(3).replace(/\d+\.0+$/, '')) + this.events.emit('transport-stats', stats) + setInterval(() => { + if (this.state.joined) { + this.getTransportStats() + } else { + this.events.emit('transport-stats', null) + } + }, 1000) + } + + // 获取本地发布流的统计数据 + getLocalStats() { + const rtc = this.rtc + const audioStats = rtc.getLocalAudioStats() + const videoStats = rtc.getLocalVideoStats() + this.events.emit('local-stats', { audioStats, videoStats }) + setTimeout(() => { + if (this.state.joined) { + this.getLocalStats() + } else { + this.events.emit('local-stats', null) + } + }, 1000) + } + + _getRemoteVideoStats() { // 创建一个 remote state 对象管理各种状态 + // 获取远端订阅流的视频统计数据 + const statsMap = this.rtc.getRemoteVideoStats() + // console.log('[rtcClient] _getRemoteVideoStats() statsMap:', JSON.stringify(statsMap)) + this.events.emit('remote-video-stats', statsMap) + setTimeout(() => { + if (this.remoteUsers.length) { + this._getRemoteVideoStats() + } else { + this.events.emit('remote-video-stats', null) + } + }, 1000) + } + + subscribeAgoraRTCEvents() { + // 设备改变是时的监听函数 start + AgoraRTC.on('microphone-changed', (evt) => { + console.log('[rtcClient] subscribeAgoraRTCEvents() event:microphone-changed Recording Device Changed! state:', evt.state, 'device:', evt.device) + this.getDevices() + }) + + AgoraRTC.on('camera-changed', (evt) => { + console.log('[rtcClient] subscribeAgoraRTCEvents() event:camera-changed Camera Changed! state:', evt.state, 'device:', evt.device) + this.getDevices() + }) + + AgoraRTC.on('playback-device-changed', (evt) => { + console.log('[rtcClient] subscribeAgoraRTCEvents() event:playback-device-changed Playback device changed! state:', evt.state, 'device:', evt.device) + this.getDevices() + }); + // 设备改变是时的监听函数 end + } + + subscribeClientEvents() { + if (this._addEventListener) return + this._addEventListener = true + console.log('[rtcClient] subscribeClientEvents()') + const rtc = this.rtc + rtc.on('exception', err => { + console.log('[rtcClient] subscribeClientEvents() event:exception Got exception. msg:', err.reason) + this.events.emit('err', err) + }) + + rtc.on('user-joined', user => { + console.log('[rtcClient] subscribeClientEvents() event:user-joined Peer has left. uid:', user.uid) + console.log('[rtcClient] subscribeClientEvents() event:user-joined Timestamp:', Date.now()) + console.log('[rtcClient] subscribeClientEvents() event:user-joined user:', user) + this.addRemotePeers(user.uid) + this.events.emit('peer-online', user) + }) + + rtc.on('user-left', user => { + console.log('[rtcClient] subscribeClientEvents() event:user-left Peer has left. uid:', user.uid) + console.log('[rtcClient] subscribeClientEvents() event:user-left Timestamp:', Date.now()) + console.log('[rtcClient] subscribeClientEvents() event:user-left user:', user) + this.removeRemotePeers(user.uid) + this.removeRemoteStream(user.uid) + this.events.emit('peer-leave', user) + }) + + rtc.on('token-privilege-will-expire', () => { + console.log('[rtcClient] subscribeClientEvents() event:token-privilege-will-expire') + // 重新申请 token 后 + this.getDynamicToken().then(token => { + client.renewToken(token) + }) + }) + + rtc.on('token-privilege-did-expire', () => { + console.log('[rtcClient] subscribeClientEvents() event:token-privilege-did-expire') + // 重新申请 token 后 + // await client.join(, , ); + }) + + rtc.on('user-published', async (user, mediaType) => { + console.log('[rtcClient] subscribeClientEvents() event:user-published Got user published event.') + console.log('[rtcClient] subscribeClientEvents() event:user-published Timestamp:', Date.now()) + console.log('[rtcClient] subscribeClientEvents() event:user-published params:', user, mediaType) + const unsubscribe = this.isUnsubscribePeers(user.uid) + if (this.isSubscribable && !unsubscribe && (!this.state.voiceCall || mediaType === 'audio')) { + await this.rtc.subscribe(user, mediaType) + console.log('[rtcClient] subscribeClientEvents() event:user-published Subscribe remote stream successfully. uid:', user.uid) + this.remoteUsers.length || this._getRemoteVideoStats() // remoteUsers 为 0 时,执行后面的函数 + this.addRemoteStream(user) + this.events.emit('stream-subscribed', user, mediaType) + } + }) + + rtc.on('user-unpublished', (user, mediaType) => { + console.log('[rtcClient] subscribeClientEvents() event:user-unpublished Stream removed. uid:', user.uid) + console.log('[rtcClient] subscribeClientEvents() event:user-unpublished Timestamp:', Date.now()) + console.log('[rtcClient] subscribeClientEvents() event:user-unpublished params:', user, mediaType) + const _user = this.findRemoteStream(user.uid) + if (_user && !_user.hasAudio && !_user.hasVideo) { + this.removeRemoteStream(user.uid) + } + this.events.emit('stream-removed', (user, mediaType)) + }) + + // 连接状态改变是时的监听函数 + rtc.on('connection-state-change', (curState, revState, reason) => { + const event = { curState: curState, prevState: revState, reason } + console.log('[rtcClient] subscribeClientEvents() event:connection-state-change curState:', curState, 'prevState:', revState) + this.events.emit('connection-state-change', event) + }) + + rtc.on('volume-indicator', (result) => { + // console.log('[rtcClient] subscribeClientEvents() event:volume-indicator Got user volume indicator event. result:', result) + this.events.emit('volume-indicator', result) + }) + } + + enableAudioVolumeIndicator() { + this.rtc.enableAudioVolumeIndicator() + } + + unsubscribeClientEvents() { + if (this._addEventListener) { + this.rtc.removeAllListeners() + this._addEventListener = false + } + } + + isUnsubscribePeers(uid) { + return this.unsubscribePeers.some(_uid => _uid !== uid) + } + + addUnsubscribePeers(uids) { + const _uids = [].concat(uids) + _uids.reduce((unsubscribePeers, uid) => { + if (unsubscribePeers.includes(uid)) { + unsubscribePeers.push(uid) + } + return unsubscribePeers + }, this.unsubscribePeers) + } + + removeUnsubscribePeers(uids) { + const _uids = [].concat(uids) + this.unsubscribePeers = this.unsubscribePeers.filter(uid => { + return !_uids.includes(uid) + }) + } + + hasRemotePeers(uid) { + return this.remotePeers.some(_uid => _uid === uid) + } + + addRemotePeers(uid) { + if (!this.hasRemotePeers(uid)) { + this.remotePeers.push(uid) + } + } + + removeRemotePeers(uid) { + this.remotePeers = this.remotePeers.filter(_uid => { + return uid && _uid !== uid + }) + } + + hasRemoteStream(uid) { + return this.remoteUsers.some(user => user.uid === uid) + } + + findRemoteStream(uid) { + return this.remoteUsers.find(user => user.uid === uid) + } + + addRemoteStream(user) { + if (!this.hasRemoteStream(user.uid)) { + this.remoteUsers.push(user) + this.state.hasRemoteStream = true + console.log('[rtcClient] addRemoteStream() remoteUsers:', this.remoteUsers) + } + } + + removeRemoteStream(uid, passive) { + this.remoteUsers = this.remoteUsers.filter(user => { + const bool = uid && user.uid !== uid + if (!bool && !passive) { + user.hasVideo && this.stop(user.videoTrack) + user.hasAudio && this.stop(user.audioTrack) + } + return bool || user.hasVideo || user.hasAudio + }) + this.state.hasRemoteStream = !!this.remoteUsers.length + } + + getDynamicToken(channel) { // 获取动态 token 函数 + const { appId, uid, state: { isAuthentication } } = this + const options = { + uid, + appId, + channel + } + this.getDynamicToken = (channel) => { + channel && (options.channel = channel); + return isAuthentication ? axios.post('/rtcToken/getToken', options).then(res => { + return res.data.token || null + }).catch(err => { + return null + }) : Promise.resolve(null) + } + + return this.getDynamicToken() + } + + getDevicesAllowed(config = {}) { + const streamConfig = cloneDeep(this.streamConfig) + config.screen ? this.setScreenConfig(config) : this.setVideoConfig(config) + return this.createStream(false).then(user => { + console.log('[rtcClient] getDevicesAllowed() successfully') + this.destroyStream() + return Promise.resolve() + }).catch(err => { + console.log('[rtcClient] getDevicesAllowed() err:', err) + return Promise.reject(err, GET_DEVICES_ALLOWED_MSG[err.msg]) + }).finally(() => { + console.log('[rtcClient] getDevicesAllowed() Finally finished.') + this.streamConfig = streamConfig + }) + } + + setCheckDevices(opts = {}) { + this.checkDevices = { + ...this.checkDevices, + ...opts + } + } + + setDevicesFilter(filters) { + if (this._typeof(filters) === 'regexp' || this._typeof(filters) === 'string' || this._typeof(filters) === 'null') { + this.devicesFilter = { + audio: filters, + video: filters + } + } else if (this._typeof(filters) === 'object') { + this.devicesFilter = filters + } else { + console.error('[rtcClient] filters 参数类型不合法,只能传递regexp、string、object、null类型') + } + } + + setDevicesNotFilter(filters) { + if (this._typeof(filters) === 'regexp' || this._typeof(filters) === 'string' || this._typeof(filters) === 'null') { + this.devicesNotFilter = { + audio: filters, + video: filters + } + } else if (this._typeof(filters) === 'object') { + this.devicesNotFilter = filters + } else { + console.error('[rtcClient] filters 参数类型不合法,只能传递regexp、string、object、null类型') + } + } + + getDevicesFilter(filter, devicename) { + if (filter) { + return this._typeof(filter) === 'regexp' ? filter.test(devicename) : devicename.includes(filter) + } + return true + } + + getDevicesNotFilter(filter, devicename) { + if (filter) { + return !(this._typeof(filter) === 'regexp' ? filter.test(devicename) : devicename.includes(filter)) + } + return true + } + + isDevicesFilter(label) { + const { devicesFilter, devicesNotFilter } = this + const { audio: filterAudio, video: filterVideo } = devicesFilter + const { audio: notFilterAudio, video: notFilterVideo } = devicesNotFilter + return { + isFilterAudio: this.getDevicesFilter(filterAudio, label) && this.getDevicesNotFilter(notFilterAudio, label), + isFilterVideo: this.getDevicesFilter(filterVideo, label) && this.getDevicesNotFilter(notFilterVideo, label) + } + } + + getDevices() { + AgoraRTC.getDevices().then(devices => { + console.log('[rtcClient] getDevices() devices:', devices) + const devicesState = { + recordingDevices: [], + videoDevices: [], + playoutDevices: [], + status: 'success', + statusText: 'SUCCESS', + msg: '设备获取成功' + } + const { checkDevices } = this + devices.forEach(({ label, kind, deviceId, groupId }) => { + const newDevice = { label, kind, deviceId, groupId } + const { isFilterAudio, isFilterVideo } = this.isDevicesFilter(label) + switch (newDevice.kind) { + case 'audioinput': + if (isFilterAudio) { + newDevice.label = label || 'microphone ' + (devicesState.recordingDevices.length + 1) + devicesState.recordingDevices.push(newDevice) + } + break + case 'videoinput': + if (isFilterVideo) { + newDevice.label = label || 'camera ' + (devicesState.videoDevices.length + 1) + devicesState.videoDevices.push(newDevice) + } + break + case 'audiooutput': + newDevice.label = label || 'speaker ' + (devicesState.playoutDevices.length + 1) + devicesState.playoutDevices.push(newDevice) + break + + default: + console.log('[rtcClient] getDevices() Fetch device failed. kind:', newDevice.kind) + } + }) + checkDevices.recordingDevices && !devicesState.recordingDevices.length && (devicesState.statusText += '_MICROPHONE') + checkDevices.videoDevices && !devicesState.videoDevices.length && (devicesState.statusText += '_CAMERA') + checkDevices.playoutDevices && !devicesState.playoutDevices.length && (devicesState.statusText += '_LOUDSPEAKER') + if (devicesState.statusText !== 'SUCCESS') { + devicesState.status = 'error' + devicesState.statusText = devicesState.statusText.replace(/^SUCCESS/, 'ERROR_NOT') + devicesState.msg = devicesErrorInfo[devicesState.statusText] + } + this.events.emit('get-devices', devicesState) + }) + } + + _typeof(target) { + return Object.prototype.toString.call(target).split(' ')[1].slice(null, -1).toLocaleLowerCase() + } + + get broswer() { + const _broswer = {} + const sUserAgent = navigator.userAgent + const isChrome = sUserAgent.indexOf('Chrome') > -1 + if (isChrome) { + const reChorme = new RegExp('Chrome/(\\d+\\.\\d+(?:\\.\\d+\\.\\d+))?') + reChorme.test(sUserAgent) + _broswer.version = parseFloat(RegExp['$1']) || 0 + _broswer.chrome = true + _broswer.name = 'chrome' + } else { + _broswer.chrome = false + } + return _broswer + } + + on(event, callback) { + this.events.on(event, callback) + } + + off(event, callback) { + if (callback) { + this.events.off(event, callback) + } else if (event) { + this.events.removeAllListeners(event) + } else { + this.events.removeAllListeners() + } + } +} + +export default RTCClient \ No newline at end of file diff --git a/frontend/src/agora/rtmClient.js b/frontend/src/agora/rtmClient.js new file mode 100644 index 0000000..e6cb240 --- /dev/null +++ b/frontend/src/agora/rtmClient.js @@ -0,0 +1,313 @@ +import { EventEmitter } from 'events' +import AgoraRTM, { RtmChannel } from 'agora-rtm-sdk' +export default class RTMClient { + /** + * Creates an instance of RTMClient. + * @param {string} appId + * @memberof RTMClient + */ + constructor(appId) { + this.client = AgoraRTM.createInstance(appId) + this.appId = appId + this.uid = null + this.loginState = '' + this.isLogined = false + this.isJoined = false + /** + * @type Map + */ + this._channels = new Map() + this._channelMessageList = new Set() + this.remoteInvitation = null + this.localInvitation = null + this.events = new EventEmitter() + + this.client.on("MessageFromPeer", ({ text }, peerId) => { + // console.log("[rtm] MessageFromPeer text " + text + " peerId " + peerId) + text = JSON.parse(text) + if (text == 'endCall') this.events.emit("inviteEndByPeer", { text, peerId }) + this.events.emit("MessageFromPeer", { text, peerId }) + }) + + this.client.on('PeersOnlineStatusChanged', status => { + console.log("[rtm] PeersOnlineStatusChanged status: ", status) + this.events.emit("PeersOnlineStatusChanged", status) + }) + + this.client.on("ConnectionStateChanged", (state, reason) => { + console.log("[rtm] ConnectionStateChanged state: " + state + " reason: " + reason) + const key = state + ' ' + reason + switch (key) { + case 'CONNECTING LOGIN': // 正在登录的状态 + this.loginState = 'LOGIN' + break; + + case 'CONNECTED LOGIN_SUCCESS': // 登录成功的状态 + this.loginState = 'LOGIN_SUCCESS' + break; + + case 'DISCONNECTED LOGIN_FAILURE': // 登录失败的状态 + this.loginState = 'LOGIN_FAILURE' + setTimeout(res => { + // this.logout().catch(err => {}) + this.login(this.uid).then(res => { + this.events.emit('LoginSuccess') + }).catch(err => { + console.log(err) + }) + }, 1000) + break; + + case 'RECONNECTING INTERRUPTED': // 重连的状态 + this.loginState = 'RECONNECTING' + break; + + case 'ABORTED REMOTE_LOGIN': // 另一个用户正以相同的 uid 登陆的状态 + this.loginState = 'REMOTE_LOGIN' + this.logout().then(res => { }).catch(err => { }) + this.events.emit('remoteLogin') + break; + + case 'DISCONNECTED LOGOUT': // 退出的状态 + this.loginState = 'LOGOUT' + break; + + default: + this.loginState = '' + break; + } + console.log("[rtm] ConnectionStateChanged loginState: " + this.loginState) + this.events.emit("ConnectionStateChanged", this.loginState) + }) + + this.client.on("RemoteInvitationReceived", remoteInvitation => { + console.log("[rtm] RemoteInvitationReceived remoteInvitation:", remoteInvitation) + this.remoteInvitation = remoteInvitation + const content = JSON.parse(remoteInvitation.content) + const channelName = content.channelName + const channel = this._channels.get(channelName) + this.events.emit("RemoteInvitationReceived", { + callerId: remoteInvitation.callerId, + content: content + }) + + remoteInvitation.on("RemoteInvitationAccepted", async () => { + console.log("[rtm] RemoteInvitationAccepted ") + if (!channel && content.active) await this.join(channelName); + this.events.emit("RemoteInvitationAccepted", { + uid: this.uid, + channel: channelName, + state: remoteInvitation.state + }) + }) + + remoteInvitation.on("RemoteInvitationCanceled", () => { + console.log("[rtm] RemoteInvitationCanceled ") + this.events.emit("RemoteInvitationCanceled", { + uid: this.uid, + channel: channelName, + state: remoteInvitation.state + }) + }) + + remoteInvitation.on("RemoteInvitationFailure", (reason) => { + console.log("[rtm] RemoteInvitationFailure ", reason) + this.events.emit("RemoteInvitationFailure", { + uid: this.uid, + channel: channelName, + state: remoteInvitation.state + }) + }) + + remoteInvitation.on("RemoteInvitationRefused", () => { + console.log("[rtm] RemoteInvitationRefused ") + this.events.emit("RemoteInvitationRefused", { + uid: this.uid, + channel: channelName, + state: remoteInvitation.state + }) + }) + }) + } + + login(uid) { + uid = uid.toString() + // console.log('Logging in ' + uid) + this.uid = uid + return this.client.login({ uid }).then(res => { + this.isLogined = true + console.log('[rtm] login suscess ' + uid) + return res + }) + } + + async logout() { + try { + this.isLogined && await this.client.logout() + this.isLogined = false + console.log('[rtm] logout suscess') + return true + } catch (e) { + this.isLogined = true + console.log('[rtm] logout failed ' + e) + return Promise.reject(e) + } + } + + _createChannel(channelName) { + const channel = this.client.createChannel(channelName) + this._channels.set(channelName, channel) + + channel.on('MemberJoined', (memberId) => { + console.log('[rtm] channel.MemberJoined memberId:', memberId, 'channelName:', channelName) + this.events.emit('MemberJoined', memberId, channelName) + }) + + channel.on('MemberLeft', (memberId) => { + console.log('[rtm] channel.MemberLeft memberId:', memberId, 'channelName:', channelName) + this.events.emit('MemberLeft', memberId, channelName) + }) + + channel.on('ChannelMessage', ({ text }, memberId) => { + console.log('[rtm] ChannelMessage text:', text, 'memberId:', memberId, 'channelName:', channelName) + text = JSON.parse(text) + this.events.emit('ChannelMessage', { text, memberId, channelName }) + }) + + channel.on('AttributesUpdated', (attributes) => { + console.log('[rtm] AttributesUpdated attributes:', attributes, 'channelName:', channelName) + this.events.emit('AttributesUpdated', attributes, channelName) + }) + + return channel + } + + async join(channelName) { + const channel = this._createChannel(channelName) + return await channel.join().then(() => { + channel.isJoined = true + }) + } + + async leave(channelName) { + let result = null + try { + const _channels = this._channels + const channel = _channels.get(channelName) + if (channel && channel.isJoined) { + result = await channel.leave().then(() => { + this.isJoined = false + _channels.delete(channelName) + }) + } + } catch (error) { + console.log(error) + // result = Promise.reject(error) + } + return result + } + + getMembers(channelName) { + const channel = this._channels.get(channelName) + return channel.getMembers() + } + + _createLocalInvitation(calleeId) { + this.localInvitation = this.client.createLocalInvitation(calleeId) + } + + async invite(content, peerId, active) { + console.log('[rtm] invite') + if (!this._channels.has(content.channelName) && active) { + await this.join(content.channelName) + } + this._createLocalInvitation(peerId) + this.localInvitation.on("LocalInvitationAccepted", (res) => { + console.log("[rtm] LocalInvitationAccepted ", res) + this.events.emit("LocalInvitationAccepted", { peerId: this.peerId, res, state: this.localInvitation.state }) + }) + this.localInvitation.on("LocalInvitationRefused", (res) => { + console.log("[rtm] LocalInvitationRefused ", res) + this.events.emit("LocalInvitationRefused", { res, state: this.localInvitation.state }) + }) + this.localInvitation.on("LocalInvitationCanceled", () => { + console.log("[rtm] LocalInvitationCanceled ", res) + this.events.emit("LocalInvitationCanceled", { state: this.localInvitation.state }) + }) + this.localInvitation.on("LocalInvitationFailure", (reason) => { + console.log("[rtm] LocalInvitationFailure ", reason) + this.events.emit("LocalInvitationFailure", { reason, state: this.localInvitation.state }) + this.leave() + + }) + this.localInvitation.on("LocalInvitationReceivedByPeer", () => { + console.log("[rtm] LocalInvitationReceivedByPeer ") + this.events.emit("LocalInvitationReceivedByPeer", { state: this.localInvitation.state }) + }) + content.active = active + this.localInvitation.content = JSON.stringify(content) + this.peerId = peerId + this.localInvitation.send() + return this.localInvitation + } + + accept() { + this.remoteInvitation.accept() + } + + refuse() { + this.remoteInvitation.refuse() + } + + sendMessage(text, channelName) { + const channel = this._channels.get(channelName) + text = JSON.stringify(text) + if (this.loginState === 'LOGIN_SUCCESS') { + // console.log("[rtm sendMessage] text " + text) + channel && channel.isJoined ? channel.sendMessage({ text }) : (console.log('未加入频道')) + } else { + console.log('未登录 rtm .') + } + } + + sendMessageToPeer(text, peerId) { + if (this.loginState === 'LOGIN_SUCCESS') { + text = JSON.stringify(text) + // console.log("[rtm sendMessageToPeer] text " + text + ', peerId ' + peerId) + return peerId && this.client.sendMessageToPeer({ text }, peerId) || console.log('不存在接收消息的指定用户id') + } else { + console.log('未登录 rtm .') + } + } + + async endCall() { + console.log("[rtm endCall]") + const peerId = this.localInvitation ? this.peerId : this.remoteInvitation && this.remoteInvitation.callerId + this.sendMessageToPeer('endCall', peerId) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The channel ID of the specified channel. + * @param {AttributesMap} attributes — An array of channel attributes. + * @param {ChannelAttributeOptions} options — Options for this attribute operation. + * @memberof RTMClient + */ + setChannelAttributes(channelId, attributes, options = {}) { + return this.client.setChannelAttributes(channelId, attributes, options) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The ID of the specified channel. + * @param {string[]} keys — An array of attribute keys. + * @memberof RTMClient + */ + getChannelAttributesByKeys(channelId, keys) { + return this.client.getChannelAttributesByKeys(channelId, keys) + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/frontend/src/agora/tagging.js b/frontend/src/agora/tagging.js new file mode 100644 index 0000000..15bba33 --- /dev/null +++ b/frontend/src/agora/tagging.js @@ -0,0 +1,232 @@ +import { EventEmitter } from 'events' + +class Tagging extends EventEmitter { + constructor({el, zIndex, role }) { + super() + this.parent = el + this.canvas = document.createElement('canvas') + this.context = this.canvas.getContext('2d') + this.isMove = false + this.zIndex = zIndex || '2000' + this.status = {} + this.role = role + this.shape = '矩形' + this.color = '#F56C6C' + this.init() + } + + init() { + const canvas = this.canvas + if (this.role == 'audience') { + canvas.onmousedown = this.mousedown.bind(this) + canvas.onmousemove = this.mousemove.bind(this) + canvas.onmouseup = this.mouseup.bind(this) + canvas.onmouseout = this.onmouseout.bind(this) + } + this.setStyle() + this.resize = this.resize.bind(this) + this.resize() + window.addEventListener('resize', this.resize, false) + } + + setStyle() { + const parent = this.parent + const parent_style = this.getStyle(parent) + const parent_position = parent_style.position + const canvas = this.canvas + canvas.style.position = 'absolute' + canvas.style.top = '0' + canvas.style.left = '0' + canvas.style.zIndex = this.zIndex + canvas.style.width = '100%' + canvas.style.height = '100%' + if (parent_position === 'static') { + parent.style.position = 'relative' + } + parent.appendChild(canvas) + } + + resize() { + const canvas = this.canvas + const style = this.getStyle(canvas) + canvas.width = parseFloat(style.width, 10) + canvas.height = parseFloat(style.height, 10) + } + + getStyle(el, pseudoElt = null) { + return (getComputedStyle || document.defaultView.getComputedStyle)(el, pseudoElt) + } + + mousedown(e) { + this.isMove = true + this.canvas.style.cursor = 'move' + let { x, y } = this.windowToCanvas(e.clientX, e.clientY) + // console.log(x,y); + this.status.startX = x + this.status.startY = y + + } + + mouseup(e) { + this.isMove = false + this.canvas.style.cursor = 'default' + // console.log(e); + let { x, y } = this.windowToCanvas(e.clientX, e.clientY) + this.status.endX = x + this.status.endY = y + if (this.shape == '矩形') { + this.drawStrokeRect(this.status) + }else if (this.shape == '扇形') { + this.drawSector(this.status) + }else if (this.shape == '圆形') { + this.drawCircle(this.status) + } + + this.emit('mouseup', this.status) + // + } + onmouseout(e) { + this.isMove = false + this.canvas.style.cursor = 'default' + } + mousemove(e) { + if (this.isMove) { + const { x, y } = this.windowToCanvas(e.clientX, e.clientY) + this.status.endX = x + this.status.endY = y + // this.drawSector(this.status) + if (this.shape == '矩形') { + this.drawStrokeRect(this.status) + }else if (this.shape == '扇形') { + this.drawSector(this.status) + }else if (this.shape == '圆形') { + this.drawCircle(this.status) + }else if (this.shape == '椭圆') { + this.drawEllipse(this.status) + }else if (this.shape == '箭头') { + this.drawArrow(this.status) + } + this.emit('mouseup', this.status) + // this.drawStrokeRect(this.status) + } + } + drawStrokeRect(status) { + const context = this.context + const { startX, startY, endX, endY } = status + const w = startX - endX + const h = startY - endY + // console.log(w, h); + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + context.strokeRect(endX, endY, w, h) + context.restore() + } + + drawSector(status) { + // console.log(endX, endY); + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const a = (endX+startX) / 2; + const b = startY - Math.sqrt(3) * Math.abs(endX-startX)/2; + const r = Math.abs(endX-startX) + const R = r + (endY-startY)*2 / Math.sqrt(3); + context.beginPath(); + context.arc(a, b, R, Math.PI * 60 / 180, Math.PI * 120 / 180); + context.arc(a, b, r, Math.PI * 120 / 180, Math.PI * 60 / 180, true); + context.closePath(); + context.stroke(); + context.restore() + } + drawCircle(status) { + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const r = Math.sqrt( Math.pow(startX-endX, 2) + Math.pow(startY-endY, 2)) + // console.log(r); + context.beginPath(); + context.arc(startX, startY, r, 0, 2*Math.PI); + context.stroke(); + context.restore() + } + drawEllipse(status) { + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const x = ( startX + endX ) / 2 + const y = ( startY + endY ) / 2 + const radiusX = Math.abs( endX - startX ) / 2 + const radiusY = Math.abs( endY - startY ) / 2 + context.beginPath(); + context.ellipse(x, y, radiusX, radiusY, 0, 0, Math.PI * 2) + context.stroke() + context.restore() + } + drawArrow(status) { + const ctx = this.context + const theta = 30; // 箭头半边夹角 + const headlen = 10; // 箭头尖端长度 + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + ctx.save() + ctx.strokeStyle = this.color; + ctx.lineWidth = 2; + + // 计算各角度和对应的P2,P3坐标 + var angle = Math.atan2(startY - endY, startX - endX) * 180 / Math.PI, + angle1 = (angle + theta) * Math.PI / 180, + angle2 = (angle - theta) * Math.PI / 180, + topX = headlen * Math.cos(angle1), + topY = headlen * Math.sin(angle1), + botX = headlen * Math.cos(angle2), + botY = headlen * Math.sin(angle2); + + ctx.beginPath(); + var arrowX = startX - topX, + arrowY = startY - topY; + ctx.moveTo(arrowX, arrowY); + ctx.moveTo(startX, startY); + ctx.lineTo(endX, endY); + + arrowX = endX + topX; + arrowY = endY + topY; + ctx.moveTo(arrowX, arrowY); + ctx.lineTo(endX, endY); + + arrowX = endX + botX; + arrowY = endY + botY; + ctx.lineTo(arrowX, arrowY); + ctx.stroke(); + ctx.restore(); + } + clearRect(x, y, w, h) { + const context = this.context + context.clearRect(x, y, w, h) + } + + destroyed() { + this.parent.removeChild(this.canvas) + window.removeEventListener('resize', this.resize, false) + } + + windowToCanvas(x, y) { + let box = this.canvas.getBoundingClientRect() + return { + x: x - box.left, + y: y - box.top + }; + } +} + +export default Tagging \ No newline at end of file diff --git a/frontend/src/api/config.js b/frontend/src/api/config.js new file mode 100644 index 0000000..8f15934 --- /dev/null +++ b/frontend/src/api/config.js @@ -0,0 +1,13 @@ +/** + * 配置链接头. + */ + +const HOST_NAME = import.meta.env.VITE_HOST_NAME +const OSS_NAME = import.meta.env.VITE_OSS_NAME +const OSS_ASSET_NAME = import.meta.env.VITE_OSS_ASSET_NAME + +export default { + HOST_NAME, + OSS_NAME, + OSS_ASSET_NAME +} diff --git a/frontend/src/assets/css/markdowncss.css b/frontend/src/assets/css/markdowncss.css new file mode 100644 index 0000000..03b160c --- /dev/null +++ b/frontend/src/assets/css/markdowncss.css @@ -0,0 +1 @@ +.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:#24292f;background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:' ';display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,");mask-image:url("data:image/svg+xml,")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:#0969da;text-decoration:none}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body abbr[title]{border-bottom:none;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:600;padding-bottom:.3em;font-size:2em;border-bottom:1px solid #d7dde3}.markdown-body mark{background-color:#fff8c5;color:#24292f}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace,monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:0 0;border-bottom:1px solid #d7dde3;height:.25em;padding:0;margin:24px 0;background-color:#d0d7de;border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button}.markdown-body [type=button]::-moz-focus-inner,.markdown-body [type=reset]::-moz-focus-inner,.markdown-body [type=submit]::-moz-focus-inner{border-style:none;padding:0}.markdown-body [type=button]:-moz-focusring,.markdown-body [type=reset]:-moz-focusring,.markdown-body [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none!important}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;color:#24292f;vertical-align:middle;background-color:#f6f8fa;border:solid 1px rgba(175,184,193,.2);border-bottom-color:rgba(175,184,193,.2);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(175,184,193,.2)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h2{font-weight:600;padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #d7dde3}.markdown-body h3{font-weight:600;font-size:1.25em}.markdown-body h4{font-weight:600;font-size:1em}.markdown-body h5{font-weight:600;font-size:.875em}.markdown-body h6{font-weight:600;font-size:.85em;color:#57606a}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:#57606a;border-left:.25em solid #d0d7de}.markdown-body ol,.markdown-body ul{margin-top:0;margin-bottom:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body ::placeholder{color:#6e7781;opacity:1}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.markdown-body .pl-c{color:#6e7781}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#0550ae}.markdown-body .pl-e,.markdown-body .pl-en{color:#8250df}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292f}.markdown-body .pl-ent{color:#116329}.markdown-body .pl-k{color:#cf222e}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#0a3069}.markdown-body .pl-smw,.markdown-body .pl-v{color:#953800}.markdown-body .pl-bu{color:#82071e}.markdown-body .pl-ii{color:#f6f8fa;background-color:#82071e}.markdown-body .pl-c2{color:#f6f8fa;background-color:#cf222e}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#116329}.markdown-body .pl-ml{color:#3b2300}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#0550ae}.markdown-body .pl-mi{font-style:italic;color:#24292f}.markdown-body .pl-mb{font-weight:700;color:#24292f}.markdown-body .pl-md{color:#82071e;background-color:#ffebe9}.markdown-body .pl-mi1{color:#116329;background-color:#dafbe1}.markdown-body .pl-mc{color:#953800;background-color:#ffd8b5}.markdown-body .pl-mi2{color:#eaeef2;background-color:#0550ae}.markdown-body .pl-mdr{font-weight:700;color:#8250df}.markdown-body .pl-ba{color:#57606a}.markdown-body .pl-sg{color:#8c959f}.markdown-body .pl-corl{text-decoration:underline;color:#0a3069}.markdown-body [data-catalyst]{display:block}.markdown-body g-emoji{font-family:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1em;font-style:normal!important;font-weight:400;line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cf222e}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body sup>a::before{content:"["}.markdown-body sup>a::after{content:"]"}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#24292f;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{padding:0 .2em;font-size:inherit}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #d0d7de}.markdown-body table tr{background-color:#fff;border-top:1px solid #d7dde3}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #d0d7de}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292f}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(175,184,193,.2);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.markdown-body .footnotes{font-size:12px;color:#57606a;border-top:1px solid #d0d7de}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target::before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid #0969da;border-radius:6px}.markdown-body .footnotes li:target{color:#24292f}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)} \ No newline at end of file diff --git a/frontend/src/assets/images/219.png b/frontend/src/assets/images/219.png new file mode 100644 index 0000000..593c26d Binary files /dev/null and b/frontend/src/assets/images/219.png differ diff --git a/frontend/src/assets/images/DetailsDesc.png b/frontend/src/assets/images/DetailsDesc.png new file mode 100644 index 0000000..8f976af Binary files /dev/null and b/frontend/src/assets/images/DetailsDesc.png differ diff --git a/frontend/src/assets/images/FullScreen.png b/frontend/src/assets/images/FullScreen.png new file mode 100644 index 0000000..a51d106 Binary files /dev/null and b/frontend/src/assets/images/FullScreen.png differ diff --git a/frontend/src/assets/images/bgc1.jpg b/frontend/src/assets/images/bgc1.jpg new file mode 100644 index 0000000..a927856 Binary files /dev/null and b/frontend/src/assets/images/bgc1.jpg differ diff --git a/frontend/src/assets/images/bgc2.jpg b/frontend/src/assets/images/bgc2.jpg new file mode 100644 index 0000000..5e25277 Binary files /dev/null and b/frontend/src/assets/images/bgc2.jpg differ diff --git a/frontend/src/assets/images/bgc3.jpg b/frontend/src/assets/images/bgc3.jpg new file mode 100644 index 0000000..edb5265 Binary files /dev/null and b/frontend/src/assets/images/bgc3.jpg differ diff --git a/frontend/src/assets/images/exitFullscreen.png b/frontend/src/assets/images/exitFullscreen.png new file mode 100644 index 0000000..e3abb23 Binary files /dev/null and b/frontend/src/assets/images/exitFullscreen.png differ diff --git a/frontend/src/assets/images/flower.png b/frontend/src/assets/images/flower.png new file mode 100644 index 0000000..0bddd42 Binary files /dev/null and b/frontend/src/assets/images/flower.png differ diff --git a/frontend/src/assets/images/jingma1.png b/frontend/src/assets/images/jingma1.png new file mode 100644 index 0000000..d9ec464 Binary files /dev/null and b/frontend/src/assets/images/jingma1.png differ diff --git a/frontend/src/assets/images/jingma2.png b/frontend/src/assets/images/jingma2.png new file mode 100644 index 0000000..b460ab6 Binary files /dev/null and b/frontend/src/assets/images/jingma2.png differ diff --git a/frontend/src/assets/images/large_data_screen.png b/frontend/src/assets/images/large_data_screen.png new file mode 100644 index 0000000..33956d5 Binary files /dev/null and b/frontend/src/assets/images/large_data_screen.png differ diff --git a/frontend/src/assets/images/login.jpg b/frontend/src/assets/images/login.jpg new file mode 100644 index 0000000..d698eaf Binary files /dev/null and b/frontend/src/assets/images/login.jpg differ diff --git a/frontend/src/assets/images/logo.png b/frontend/src/assets/images/logo.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/frontend/src/assets/images/logo.png differ diff --git a/frontend/src/assets/images/logo1.png b/frontend/src/assets/images/logo1.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/frontend/src/assets/images/logo1.png differ diff --git a/frontend/src/assets/images/logo2.png b/frontend/src/assets/images/logo2.png new file mode 100644 index 0000000..a931e59 Binary files /dev/null and b/frontend/src/assets/images/logo2.png differ diff --git a/frontend/src/assets/images/logo3.png b/frontend/src/assets/images/logo3.png new file mode 100644 index 0000000..53793a8 Binary files /dev/null and b/frontend/src/assets/images/logo3.png differ diff --git a/frontend/src/assets/images/map.png b/frontend/src/assets/images/map.png new file mode 100644 index 0000000..8550dfa Binary files /dev/null and b/frontend/src/assets/images/map.png differ diff --git a/frontend/src/assets/images/map2.png b/frontend/src/assets/images/map2.png new file mode 100644 index 0000000..04cba6c Binary files /dev/null and b/frontend/src/assets/images/map2.png differ diff --git a/frontend/src/assets/images/morentu.jpg b/frontend/src/assets/images/morentu.jpg new file mode 100644 index 0000000..dad87b3 Binary files /dev/null and b/frontend/src/assets/images/morentu.jpg differ diff --git a/frontend/src/assets/images/photo.png b/frontend/src/assets/images/photo.png new file mode 100644 index 0000000..906f8d2 Binary files /dev/null and b/frontend/src/assets/images/photo.png differ diff --git a/frontend/src/assets/images/record.png b/frontend/src/assets/images/record.png new file mode 100644 index 0000000..d745171 Binary files /dev/null and b/frontend/src/assets/images/record.png differ diff --git a/frontend/src/assets/images/speech_input_black_off.png b/frontend/src/assets/images/speech_input_black_off.png new file mode 100644 index 0000000..59eb1c8 Binary files /dev/null and b/frontend/src/assets/images/speech_input_black_off.png differ diff --git a/frontend/src/assets/images/speech_input_black_on.png b/frontend/src/assets/images/speech_input_black_on.png new file mode 100644 index 0000000..05c2464 Binary files /dev/null and b/frontend/src/assets/images/speech_input_black_on.png differ diff --git a/frontend/src/assets/images/star.gif b/frontend/src/assets/images/star.gif new file mode 100644 index 0000000..e87c36c Binary files /dev/null and b/frontend/src/assets/images/star.gif differ diff --git a/frontend/src/assets/images/star.png b/frontend/src/assets/images/star.png new file mode 100644 index 0000000..e732c2c Binary files /dev/null and b/frontend/src/assets/images/star.png differ diff --git a/frontend/src/assets/images/top.jpg b/frontend/src/assets/images/top.jpg new file mode 100644 index 0000000..d451d60 Binary files /dev/null and b/frontend/src/assets/images/top.jpg differ diff --git a/frontend/src/assets/images/vecss_zh.png b/frontend/src/assets/images/vecss_zh.png new file mode 100644 index 0000000..8925e06 Binary files /dev/null and b/frontend/src/assets/images/vecss_zh.png differ diff --git a/frontend/src/assets/images/wangshu.png b/frontend/src/assets/images/wangshu.png new file mode 100644 index 0000000..6a00f84 Binary files /dev/null and b/frontend/src/assets/images/wangshu.png differ diff --git a/frontend/src/assets/images/详细描述 (1).png b/frontend/src/assets/images/详细描述 (1).png new file mode 100644 index 0000000..682e049 Binary files /dev/null and b/frontend/src/assets/images/详细描述 (1).png differ diff --git a/frontend/src/assets/js/markdown.js b/frontend/src/assets/js/markdown.js new file mode 100644 index 0000000..948c740 --- /dev/null +++ b/frontend/src/assets/js/markdown.js @@ -0,0 +1,2188 @@ +/** + * marked v15.0.12 - a markdown parser + * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ + +/** + * DO NOT EDIT THIS FILE + * The code in this file is generated from files in ./src/ + */ + + +// src/defaults.ts +function _getDefaults() { + return { + async: false, + breaks: false, + extensions: null, + gfm: true, + hooks: null, + pedantic: false, + renderer: null, + silent: false, + tokenizer: null, + walkTokens: null + }; +} +var _defaults = _getDefaults(); +function changeDefaults(newDefaults) { + _defaults = newDefaults; +} + +// src/rules.ts +var noopTest = { exec: () => null }; +function edit(regex, opt = "") { + let source = typeof regex === "string" ? regex : regex.source; + const obj = { + replace: (name, val) => { + let valSource = typeof val === "string" ? val : val.source; + valSource = valSource.replace(other.caret, "$1"); + source = source.replace(name, valSource); + return obj; + }, + getRegex: () => { + return new RegExp(source, opt); + } + }; + return obj; +} +var other = { + codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, + outputLinkReplace: /\\([\[\]])/g, + indentCodeCompensation: /^(\s+)(?:```)/, + beginningSpace: /^\s+/, + endingHash: /#$/, + startingSpaceChar: /^ /, + endingSpaceChar: / $/, + nonSpaceChar: /[^ ]/, + newLineCharGlobal: /\n/g, + tabCharGlobal: /\t/g, + multipleSpaceGlobal: /\s+/g, + blankLine: /^[ \t]*$/, + doubleBlankLine: /\n[ \t]*\n[ \t]*$/, + blockquoteStart: /^ {0,3}>/, + blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, + blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, + listReplaceTabs: /^\t+/, + listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, + listIsTask: /^\[[ xX]\] /, + listReplaceTask: /^\[[ xX]\] +/, + anyLine: /\n.*\n/, + hrefBrackets: /^<(.*)>$/, + tableDelimiter: /[:|]/, + tableAlignChars: /^\||\| *$/g, + tableRowBlankLine: /\n[ \t]*$/, + tableAlignRight: /^ *-+: *$/, + tableAlignCenter: /^ *:-+: *$/, + tableAlignLeft: /^ *:-+ *$/, + startATag: /^/i, + startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, + endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, + startAngleBracket: /^$/, + pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, + unicodeAlphaNumeric: /[\p{L}\p{N}]/u, + escapeTest: /[&<>"']/, + escapeReplace: /[&<>"']/g, + escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, + escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, + unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, + caret: /(^|[^\[])\^/g, + percentDecode: /%25/g, + findPipe: /\|/g, + splitPipe: / \|/, + slashPipe: /\\\|/g, + carriageReturn: /\r\n|\r/g, + spaceLine: /^ +$/gm, + notSpaceStart: /^\S*/, + endingNewline: /\n$/, + listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`), + nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), + hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), + fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`), + headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`), + htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, "i") +}; +var newline = /^(?:[ \t]*(?:\n|$))+/; +var blockCode = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var bullet = /(?:[*+-]|\d{1,9}[.)])/; +var lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; +var lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); +var lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; +var blockText = /^[^\n]+/; +var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/; +var def = edit(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex(); +var _tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; +var _comment = /|$))/; +var html = edit( + "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", + "i" +).replace("comment", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex(); +var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex(); +var blockNormal = { + blockquote, + code: blockCode, + def, + fences, + heading, + hr, + html, + lheading, + list, + newline, + paragraph, + table: noopTest, + text: blockText +}; +var gfmTable = edit( + "^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" +).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex(); +var blockGfm = { + ...blockNormal, + lheading: lheadingGfm, + table: gfmTable, + paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex() +}; +var blockPedantic = { + ...blockNormal, + html: edit( + `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))` + ).replace("comment", _comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, + // fences not supported + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}; +var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var br = /^( {2,}|\\)\n(?!\s*$)/; +var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g; +var emStrongLDelimCore = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; +var emStrongLDelim = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuation).getRegex(); +var emStrongLDelimGfm = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuationGfmStrongEm).getRegex(); +var emStrongRDelimAstCore = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; +var emStrongRDelimAst = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex(); +var emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex(); +var emStrongRDelimUnd = edit( + "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", + "gu" +).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex(); +var anyPunctuation = edit(/\\(punct)/, "gu").replace(/punct/g, _punctuation).getRegex(); +var autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex(); +var tag = edit( + "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^" +).replace("comment", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; +var link = edit(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex(); +var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex(); +var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex(); +var inlineNormal = { + _backpedal: noopTest, + // only used for GFM url + anyPunctuation, + autolink, + blockSkip, + br, + code: inlineCode, + del: noopTest, + emStrongLDelim, + emStrongRDelimAst, + emStrongRDelimUnd, + escape, + link, + nolink, + punctuation, + reflink, + reflinkSearch, + tag, + text: inlineText, + url: noopTest +}; +var inlinePedantic = { + ...inlineNormal, + link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex() +}; +var inlineGfm = { + ...inlineNormal, + emStrongRDelimAst: emStrongRDelimAstGfm, + emStrongLDelim: emStrongLDelimGfm, + url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", + '"': """, + "'": "'" +}; +var getEscapeReplacement = (ch) => escapeReplacements[ch]; +function escape2(html2, encode) { + if (encode) { + if (other.escapeTest.test(html2)) { + return html2.replace(other.escapeReplace, getEscapeReplacement); + } + } else { + if (other.escapeTestNoEncode.test(html2)) { + return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement); + } + } + return html2; +} +function cleanUrl(href) { + try { + href = encodeURI(href).replace(other.percentDecode, "%"); + } catch { + return null; + } + return href; +} +function splitCells(tableRow, count) { + const row = tableRow.replace(other.findPipe, (match, offset, str) => { + let escaped = false; + let curr = offset; + while (--curr >= 0 && str[curr] === "\\") escaped = !escaped; + if (escaped) { + return "|"; + } else { + return " |"; + } + }), cells = row.split(other.splitPipe); + let i = 0; + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells.at(-1)?.trim()) { + cells.pop(); + } + if (count) { + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) cells.push(""); + } + } + for (; i < cells.length; i++) { + cells[i] = cells[i].trim().replace(other.slashPipe, "|"); + } + return cells; +} +function rtrim(str, c, invert) { + const l = str.length; + if (l === 0) { + return ""; + } + let suffLen = 0; + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + return str.slice(0, l - suffLen); +} +function findClosingBracket(str, b) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + let level = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === "\\") { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + if (level > 0) { + return -2; + } + return -1; +} + +// src/Tokenizer.ts +function outputLink(cap, link2, raw, lexer2, rules) { + const href = link2.href; + const title = link2.title || null; + const text = cap[1].replace(rules.other.outputLinkReplace, "$1"); + lexer2.state.inLink = true; + const token = { + type: cap[0].charAt(0) === "!" ? "image" : "link", + raw, + href, + title, + text, + tokens: lexer2.inlineTokens(text) + }; + lexer2.state.inLink = false; + return token; +} +function indentCodeCompensation(raw, text, rules) { + const matchIndentToCode = raw.match(rules.other.indentCodeCompensation); + if (matchIndentToCode === null) { + return text; + } + const indentToCode = matchIndentToCode[1]; + return text.split("\n").map((node) => { + const matchIndentInNode = node.match(rules.other.beginningSpace); + if (matchIndentInNode === null) { + return node; + } + const [indentInNode] = matchIndentInNode; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + return node; + }).join("\n"); +} +var _Tokenizer = class { + options; + rules; + // set by the lexer + lexer; + // set by the lexer + constructor(options2) { + this.options = options2 || _defaults; + } + space(src) { + const cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: "space", + raw: cap[0] + }; + } + } + code(src) { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text = cap[0].replace(this.rules.other.codeRemoveIndent, ""); + return { + type: "code", + raw: cap[0], + codeBlockStyle: "indented", + text: !this.options.pedantic ? rtrim(text, "\n") : text + }; + } + } + fences(src) { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text = indentCodeCompensation(raw, cap[3] || "", this.rules); + return { + type: "code", + raw, + lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2], + text + }; + } + } + heading(src) { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text = cap[2].trim(); + if (this.rules.other.endingHash.test(text)) { + const trimmed = rtrim(text, "#"); + if (this.options.pedantic) { + text = trimmed.trim(); + } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) { + text = trimmed.trim(); + } + } + return { + type: "heading", + raw: cap[0], + depth: cap[1].length, + text, + tokens: this.lexer.inline(text) + }; + } + } + hr(src) { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: "hr", + raw: rtrim(cap[0], "\n") + }; + } + } + blockquote(src) { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + let lines = rtrim(cap[0], "\n").split("\n"); + let raw = ""; + let text = ""; + const tokens = []; + while (lines.length > 0) { + let inBlockquote = false; + const currentLines = []; + let i; + for (i = 0; i < lines.length; i++) { + if (this.rules.other.blockquoteStart.test(lines[i])) { + currentLines.push(lines[i]); + inBlockquote = true; + } else if (!inBlockquote) { + currentLines.push(lines[i]); + } else { + break; + } + } + lines = lines.slice(i); + const currentRaw = currentLines.join("\n"); + const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, ""); + raw = raw ? `${raw} +${currentRaw}` : currentRaw; + text = text ? `${text} +${currentText}` : currentText; + const top = this.lexer.state.top; + this.lexer.state.top = true; + this.lexer.blockTokens(currentText, tokens, true); + this.lexer.state.top = top; + if (lines.length === 0) { + break; + } + const lastToken = tokens.at(-1); + if (lastToken?.type === "code") { + break; + } else if (lastToken?.type === "blockquote") { + const oldToken = lastToken; + const newText = oldToken.raw + "\n" + lines.join("\n"); + const newToken = this.blockquote(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.text.length) + newToken.text; + break; + } else if (lastToken?.type === "list") { + const oldToken = lastToken; + const newText = oldToken.raw + "\n" + lines.join("\n"); + const newToken = this.list(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw; + lines = newText.substring(tokens.at(-1).raw.length).split("\n"); + continue; + } + } + return { + type: "blockquote", + raw, + tokens, + text + }; + } + } + list(src) { + let cap = this.rules.block.list.exec(src); + if (cap) { + let bull = cap[1].trim(); + const isordered = bull.length > 1; + const list2 = { + type: "list", + raw: "", + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : "", + loose: false, + items: [] + }; + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; + if (this.options.pedantic) { + bull = isordered ? bull : "[*+-]"; + } + const itemRegex = this.rules.other.listItemRegex(bull); + let endsWithBlankLine = false; + while (src) { + let endEarly = false; + let raw = ""; + let itemContents = ""; + if (!(cap = itemRegex.exec(src))) { + break; + } + if (this.rules.block.hr.test(src)) { + break; + } + raw = cap[0]; + src = src.substring(raw.length); + let line = cap[2].split("\n", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => " ".repeat(3 * t.length)); + let nextLine = src.split("\n", 1)[0]; + let blankLine = !line.trim(); + let indent = 0; + if (this.options.pedantic) { + indent = 2; + itemContents = line.trimStart(); + } else if (blankLine) { + indent = cap[1].length + 1; + } else { + indent = cap[2].search(this.rules.other.nonSpaceChar); + indent = indent > 4 ? 1 : indent; + itemContents = line.slice(indent); + indent += cap[1].length; + } + if (blankLine && this.rules.other.blankLine.test(nextLine)) { + raw += nextLine + "\n"; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + if (!endEarly) { + const nextBulletRegex = this.rules.other.nextBulletRegex(indent); + const hrRegex = this.rules.other.hrRegex(indent); + const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent); + const headingBeginRegex = this.rules.other.headingBeginRegex(indent); + const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent); + while (src) { + const rawLine = src.split("\n", 1)[0]; + let nextLineWithoutTabs; + nextLine = rawLine; + if (this.options.pedantic) { + nextLine = nextLine.replace(this.rules.other.listReplaceNesting, " "); + nextLineWithoutTabs = nextLine; + } else { + nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, " "); + } + if (fencesBeginRegex.test(nextLine)) { + break; + } + if (headingBeginRegex.test(nextLine)) { + break; + } + if (htmlBeginRegex.test(nextLine)) { + break; + } + if (nextBulletRegex.test(nextLine)) { + break; + } + if (hrRegex.test(nextLine)) { + break; + } + if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { + itemContents += "\n" + nextLineWithoutTabs.slice(indent); + } else { + if (blankLine) { + break; + } + if (line.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4) { + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + itemContents += "\n" + nextLine; + } + if (!blankLine && !nextLine.trim()) { + blankLine = true; + } + raw += rawLine + "\n"; + src = src.substring(rawLine.length + 1); + line = nextLineWithoutTabs.slice(indent); + } + } + if (!list2.loose) { + if (endsWithBlankLine) { + list2.loose = true; + } else if (this.rules.other.doubleBlankLine.test(raw)) { + endsWithBlankLine = true; + } + } + let istask = null; + let ischecked; + if (this.options.gfm) { + istask = this.rules.other.listIsTask.exec(itemContents); + if (istask) { + ischecked = istask[0] !== "[ ] "; + itemContents = itemContents.replace(this.rules.other.listReplaceTask, ""); + } + } + list2.items.push({ + type: "list_item", + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents, + tokens: [] + }); + list2.raw += raw; + } + const lastItem = list2.items.at(-1); + if (lastItem) { + lastItem.raw = lastItem.raw.trimEnd(); + lastItem.text = lastItem.text.trimEnd(); + } else { + return; + } + list2.raw = list2.raw.trimEnd(); + for (let i = 0; i < list2.items.length; i++) { + this.lexer.state.top = false; + list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []); + if (!list2.loose) { + const spacers = list2.items[i].tokens.filter((t) => t.type === "space"); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw)); + list2.loose = hasMultipleLineBreaks; + } + } + if (list2.loose) { + for (let i = 0; i < list2.items.length; i++) { + list2.items[i].loose = true; + } + } + return list2; + } + } + html(src) { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token = { + type: "html", + block: true, + raw: cap[0], + pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style", + text: cap[0] + }; + return token; + } + } + def(src) { + const cap = this.rules.block.def.exec(src); + if (cap) { + const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "); + const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : ""; + const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3]; + return { + type: "def", + tag: tag2, + raw: cap[0], + href, + title + }; + } + } + table(src) { + const cap = this.rules.block.table.exec(src); + if (!cap) { + return; + } + if (!this.rules.other.tableDelimiter.test(cap[2])) { + return; + } + const headers = splitCells(cap[1]); + const aligns = cap[2].replace(this.rules.other.tableAlignChars, "").split("|"); + const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : []; + const item = { + type: "table", + raw: cap[0], + header: [], + align: [], + rows: [] + }; + if (headers.length !== aligns.length) { + return; + } + for (const align of aligns) { + if (this.rules.other.tableAlignRight.test(align)) { + item.align.push("right"); + } else if (this.rules.other.tableAlignCenter.test(align)) { + item.align.push("center"); + } else if (this.rules.other.tableAlignLeft.test(align)) { + item.align.push("left"); + } else { + item.align.push(null); + } + } + for (let i = 0; i < headers.length; i++) { + item.header.push({ + text: headers[i], + tokens: this.lexer.inline(headers[i]), + header: true, + align: item.align[i] + }); + } + for (const row of rows) { + item.rows.push(splitCells(row, item.header.length).map((cell, i) => { + return { + text: cell, + tokens: this.lexer.inline(cell), + header: false, + align: item.align[i] + }; + })); + } + return item; + } + lheading(src) { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: "heading", + raw: cap[0], + depth: cap[2].charAt(0) === "=" ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]) + }; + } + } + paragraph(src) { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1]; + return { + type: "paragraph", + raw: cap[0], + text, + tokens: this.lexer.inline(text) + }; + } + } + text(src) { + const cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: "text", + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]) + }; + } + } + escape(src) { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: "escape", + raw: cap[0], + text: cap[1] + }; + } + } + tag(src) { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) { + this.lexer.state.inLink = true; + } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: "html", + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: false, + text: cap[0] + }; + } + } + link(src) { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) { + if (!this.rules.other.endAngleBracket.test(trimmedUrl)) { + return; + } + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\"); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + const lastParenIndex = findClosingBracket(cap[2], "()"); + if (lastParenIndex === -2) { + return; + } + if (lastParenIndex > -1) { + const start = cap[0].indexOf("!") === 0 ? 5 : 4; + const linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ""; + } + } + let href = cap[2]; + let title = ""; + if (this.options.pedantic) { + const link2 = this.rules.other.pedanticHrefTitle.exec(href); + if (link2) { + href = link2[1]; + title = link2[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ""; + } + href = href.trim(); + if (this.rules.other.startAngleBracket.test(href)) { + if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) { + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href, + title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title + }, cap[0], this.lexer, this.rules); + } + } + reflink(src, links) { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { + const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, " "); + const link2 = links[linkString.toLowerCase()]; + if (!link2) { + const text = cap[0].charAt(0); + return { + type: "text", + raw: text, + text + }; + } + return outputLink(cap, link2, cap[0], this.lexer, this.rules); + } + } + emStrong(src, maskedSrc, prevChar = "") { + let match = this.rules.inline.emStrongLDelim.exec(src); + if (!match) return; + if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return; + const nextChar = match[1] || match[2] || ""; + if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) { + const lLength = [...match[0]].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + endReg.lastIndex = 0; + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + if (!rDelim) continue; + rLength = [...rDelim].length; + if (match[3] || match[4]) { + delimTotal += rLength; + continue; + } else if (match[5] || match[6]) { + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; + } + } + delimTotal -= rLength; + if (delimTotal > 0) continue; + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + const lastCharLength = [...match[0]][0].length; + const raw = src.slice(0, lLength + match.index + lastCharLength + rLength); + if (Math.min(lLength, rLength) % 2) { + const text2 = raw.slice(1, -1); + return { + type: "em", + raw, + text: text2, + tokens: this.lexer.inlineTokens(text2) + }; + } + const text = raw.slice(2, -2); + return { + type: "strong", + raw, + text, + tokens: this.lexer.inlineTokens(text) + }; + } + } + } + codespan(src) { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text = cap[2].replace(this.rules.other.newLineCharGlobal, " "); + const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text); + const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text = text.substring(1, text.length - 1); + } + return { + type: "codespan", + raw: cap[0], + text + }; + } + } + br(src) { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: "br", + raw: cap[0] + }; + } + } + del(src) { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: "del", + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]) + }; + } + } + autolink(src) { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text, href; + if (cap[2] === "@") { + text = cap[1]; + href = "mailto:" + text; + } else { + text = cap[1]; + href = text; + } + return { + type: "link", + raw: cap[0], + text, + href, + tokens: [ + { + type: "text", + raw: text, + text + } + ] + }; + } + } + url(src) { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text, href; + if (cap[2] === "@") { + text = cap[0]; + href = "mailto:" + text; + } else { + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? ""; + } while (prevCapZero !== cap[0]); + text = cap[0]; + if (cap[1] === "www.") { + href = "http://" + cap[0]; + } else { + href = cap[0]; + } + } + return { + type: "link", + raw: cap[0], + text, + href, + tokens: [ + { + type: "text", + raw: text, + text + } + ] + }; + } + } + inlineText(src) { + const cap = this.rules.inline.text.exec(src); + if (cap) { + const escaped = this.lexer.state.inRawBlock; + return { + type: "text", + raw: cap[0], + text: cap[0], + escaped + }; + } + } +}; + +// src/Lexer.ts +var _Lexer = class __Lexer { + tokens; + options; + state; + tokenizer; + inlineQueue; + constructor(options2) { + this.tokens = []; + this.tokens.links = /* @__PURE__ */ Object.create(null); + this.options = options2 || _defaults; + this.options.tokenizer = this.options.tokenizer || new _Tokenizer(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true + }; + const rules = { + other, + block: block.normal, + inline: inline.normal + }; + if (this.options.pedantic) { + rules.block = block.pedantic; + rules.inline = inline.pedantic; + } else if (this.options.gfm) { + rules.block = block.gfm; + if (this.options.breaks) { + rules.inline = inline.breaks; + } else { + rules.inline = inline.gfm; + } + } + this.tokenizer.rules = rules; + } + /** + * Expose Rules + */ + static get rules() { + return { + block, + inline + }; + } + /** + * Static Lex Method + */ + static lex(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.lex(src); + } + /** + * Static Lex Inline Method + */ + static lexInline(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.inlineTokens(src); + } + /** + * Preprocessing + */ + lex(src) { + src = src.replace(other.carriageReturn, "\n"); + this.blockTokens(src, this.tokens); + for (let i = 0; i < this.inlineQueue.length; i++) { + const next = this.inlineQueue[i]; + this.inlineTokens(next.src, next.tokens); + } + this.inlineQueue = []; + return this.tokens; + } + blockTokens(src, tokens = [], lastParagraphClipped = false) { + if (this.options.pedantic) { + src = src.replace(other.tabCharGlobal, " ").replace(other.spaceLine, ""); + } + while (src) { + let token; + if (this.options.extensions?.block?.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (token.raw.length === 1 && lastToken !== void 0) { + lastToken.raw += "\n"; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "paragraph" || lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "paragraph" || lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.raw; + this.inlineQueue.at(-1).src = lastToken.text; + } else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + let cutSrc = src; + if (this.options.extensions?.startBlock) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startBlock.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + const lastToken = tokens.at(-1); + if (lastParagraphClipped && lastToken?.type === "paragraph") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + lastParagraphClipped = cutSrc.length !== src.length; + src = src.substring(token.raw.length); + continue; + } + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + } + inline(src, tokens = []) { + this.inlineQueue.push({ src, tokens }); + return tokens; + } + /** + * Lexing/Compiling + */ + inlineTokens(src, tokens = []) { + let maskedSrc = src; + let match = null; + if (this.tokens.links) { + const links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + } + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + let keepPrevChar = false; + let prevChar = ""; + while (src) { + if (!keepPrevChar) { + prevChar = ""; + } + keepPrevChar = false; + let token; + if (this.options.extensions?.inline?.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (token.type === "text" && lastToken?.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.autolink(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (!this.state.inLink && (token = this.tokenizer.url(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + let cutSrc = src; + if (this.options.extensions?.startInline) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startInline.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (token = this.tokenizer.inlineText(cutSrc)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== "_") { + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + const lastToken = tokens.at(-1); + if (lastToken?.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + return tokens; + } +}; + +// src/Renderer.ts +var _Renderer = class { + options; + parser; + // set by the parser + constructor(options2) { + this.options = options2 || _defaults; + } + space(token) { + return ""; + } + code({ text, lang, escaped }) { + const langString = (lang || "").match(other.notSpaceStart)?.[0]; + const code = text.replace(other.endingNewline, "") + "\n"; + if (!langString) { + return "
    " + (escaped ? code : escape2(code, true)) + "
    \n"; + } + return '
    ' + (escaped ? code : escape2(code, true)) + "
    \n"; + } + blockquote({ tokens }) { + const body = this.parser.parse(tokens); + return `
    +${body}
    +`; + } + html({ text }) { + return text; + } + heading({ tokens, depth }) { + return `${this.parser.parseInline(tokens)} +`; + } + hr(token) { + return "
    \n"; + } + list(token) { + const ordered = token.ordered; + const start = token.start; + let body = ""; + for (let j = 0; j < token.items.length; j++) { + const item = token.items[j]; + body += this.listitem(item); + } + const type = ordered ? "ol" : "ul"; + const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : ""; + return "<" + type + startAttr + ">\n" + body + "\n"; + } + listitem(item) { + let itemBody = ""; + if (item.task) { + const checkbox = this.checkbox({ checked: !!item.checked }); + if (item.loose) { + if (item.tokens[0]?.type === "paragraph") { + item.tokens[0].text = checkbox + " " + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") { + item.tokens[0].tokens[0].text = checkbox + " " + escape2(item.tokens[0].tokens[0].text); + item.tokens[0].tokens[0].escaped = true; + } + } else { + item.tokens.unshift({ + type: "text", + raw: checkbox + " ", + text: checkbox + " ", + escaped: true + }); + } + } else { + itemBody += checkbox + " "; + } + } + itemBody += this.parser.parse(item.tokens, !!item.loose); + return `
  • ${itemBody}
  • +`; + } + checkbox({ checked }) { + return "'; + } + paragraph({ tokens }) { + return `

    ${this.parser.parseInline(tokens)}

    +`; + } + table(token) { + let header = ""; + let cell = ""; + for (let j = 0; j < token.header.length; j++) { + cell += this.tablecell(token.header[j]); + } + header += this.tablerow({ text: cell }); + let body = ""; + for (let j = 0; j < token.rows.length; j++) { + const row = token.rows[j]; + cell = ""; + for (let k = 0; k < row.length; k++) { + cell += this.tablecell(row[k]); + } + body += this.tablerow({ text: cell }); + } + if (body) body = `${body}`; + return "\n\n" + header + "\n" + body + "
    \n"; + } + tablerow({ text }) { + return ` +${text} +`; + } + tablecell(token) { + const content = this.parser.parseInline(token.tokens); + const type = token.header ? "th" : "td"; + const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`; + return tag2 + content + ` +`; + } + /** + * span level renderer + */ + strong({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + em({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + codespan({ text }) { + return `${escape2(text, true)}`; + } + br(token) { + return "
    "; + } + del({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + link({ href, title, tokens }) { + const text = this.parser.parseInline(tokens); + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = '
    "; + return out; + } + image({ href, title, text, tokens }) { + if (tokens) { + text = this.parser.parseInline(tokens, this.parser.textRenderer); + } + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return escape2(text); + } + href = cleanHref; + let out = `${text} { + const tokens2 = genericToken[childTokens].flat(Infinity); + values = values.concat(this.walkTokens(tokens2, callback)); + }); + } else if (genericToken.tokens) { + values = values.concat(this.walkTokens(genericToken.tokens, callback)); + } + } + } + } + return values; + } + use(...args) { + const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} }; + args.forEach((pack) => { + const opts = { ...pack }; + opts.async = this.defaults.async || opts.async || false; + if (pack.extensions) { + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error("extension name required"); + } + if ("renderer" in ext) { + const prevRenderer = extensions.renderers[ext.name]; + if (prevRenderer) { + extensions.renderers[ext.name] = function(...args2) { + let ret = ext.renderer.apply(this, args2); + if (ret === false) { + ret = prevRenderer.apply(this, args2); + } + return ret; + }; + } else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if ("tokenizer" in ext) { + if (!ext.level || ext.level !== "block" && ext.level !== "inline") { + throw new Error("extension level must be 'block' or 'inline'"); + } + const extLevel = extensions[ext.level]; + if (extLevel) { + extLevel.unshift(ext.tokenizer); + } else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { + if (ext.level === "block") { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } else { + extensions.startBlock = [ext.start]; + } + } else if (ext.level === "inline") { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } else { + extensions.startInline = [ext.start]; + } + } + } + } + if ("childTokens" in ext && ext.childTokens) { + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + opts.extensions = extensions; + } + if (pack.renderer) { + const renderer = this.defaults.renderer || new _Renderer(this.defaults); + for (const prop in pack.renderer) { + if (!(prop in renderer)) { + throw new Error(`renderer '${prop}' does not exist`); + } + if (["options", "parser"].includes(prop)) { + continue; + } + const rendererProp = prop; + const rendererFunc = pack.renderer[rendererProp]; + const prevRenderer = renderer[rendererProp]; + renderer[rendererProp] = (...args2) => { + let ret = rendererFunc.apply(renderer, args2); + if (ret === false) { + ret = prevRenderer.apply(renderer, args2); + } + return ret || ""; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults); + for (const prop in pack.tokenizer) { + if (!(prop in tokenizer)) { + throw new Error(`tokenizer '${prop}' does not exist`); + } + if (["options", "rules", "lexer"].includes(prop)) { + continue; + } + const tokenizerProp = prop; + const tokenizerFunc = pack.tokenizer[tokenizerProp]; + const prevTokenizer = tokenizer[tokenizerProp]; + tokenizer[tokenizerProp] = (...args2) => { + let ret = tokenizerFunc.apply(tokenizer, args2); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args2); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + if (pack.hooks) { + const hooks = this.defaults.hooks || new _Hooks(); + for (const prop in pack.hooks) { + if (!(prop in hooks)) { + throw new Error(`hook '${prop}' does not exist`); + } + if (["options", "block"].includes(prop)) { + continue; + } + const hooksProp = prop; + const hooksFunc = pack.hooks[hooksProp]; + const prevHook = hooks[hooksProp]; + if (_Hooks.passThroughHooks.has(prop)) { + hooks[hooksProp] = (arg) => { + if (this.defaults.async) { + return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => { + return prevHook.call(hooks, ret2); + }); + } + const ret = hooksFunc.call(hooks, arg); + return prevHook.call(hooks, ret); + }; + } else { + hooks[hooksProp] = (...args2) => { + let ret = hooksFunc.apply(hooks, args2); + if (ret === false) { + ret = prevHook.apply(hooks, args2); + } + return ret; + }; + } + } + opts.hooks = hooks; + } + if (pack.walkTokens) { + const walkTokens2 = this.defaults.walkTokens; + const packWalktokens = pack.walkTokens; + opts.walkTokens = function(token) { + let values = []; + values.push(packWalktokens.call(this, token)); + if (walkTokens2) { + values = values.concat(walkTokens2.call(this, token)); + } + return values; + }; + } + this.defaults = { ...this.defaults, ...opts }; + }); + return this; + } + setOptions(opt) { + this.defaults = { ...this.defaults, ...opt }; + return this; + } + lexer(src, options2) { + return _Lexer.lex(src, options2 ?? this.defaults); + } + parser(tokens, options2) { + return _Parser.parse(tokens, options2 ?? this.defaults); + } + parseMarkdown(blockType) { + const parse2 = (src, options2) => { + const origOpt = { ...options2 }; + const opt = { ...this.defaults, ...origOpt }; + const throwError = this.onError(!!opt.silent, !!opt.async); + if (this.defaults.async === true && origOpt.async === false) { + return throwError(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + } + if (typeof src === "undefined" || src === null) { + return throwError(new Error("marked(): input parameter is undefined or null")); + } + if (typeof src !== "string") { + return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected")); + } + if (opt.hooks) { + opt.hooks.options = opt; + opt.hooks.block = blockType; + } + const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline; + const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline; + if (opt.async) { + return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError); + } + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + let tokens = lexer2(src, opt); + if (opt.hooks) { + tokens = opt.hooks.processAllTokens(tokens); + } + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + let html2 = parser2(tokens, opt); + if (opt.hooks) { + html2 = opt.hooks.postprocess(html2); + } + return html2; + } catch (e) { + return throwError(e); + } + }; + return parse2; + } + onError(silent, async) { + return (e) => { + e.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (silent) { + const msg = "

    An error occurred:

    " + escape2(e.message + "", true) + "
    "; + if (async) { + return Promise.resolve(msg); + } + return msg; + } + if (async) { + return Promise.reject(e); + } + throw e; + }; + } +}; + +// src/marked.ts +var markedInstance = new Marked(); +function marked(src, opt) { + return markedInstance.parse(src, opt); +} +marked.options = marked.setOptions = function(options2) { + markedInstance.setOptions(options2); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; +marked.getDefaults = _getDefaults; +marked.defaults = _defaults; +marked.use = function(...args) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; +marked.walkTokens = function(tokens, callback) { + return markedInstance.walkTokens(tokens, callback); +}; +marked.parseInline = markedInstance.parseInline; +marked.Parser = _Parser; +marked.parser = _Parser.parse; +marked.Renderer = _Renderer; +marked.TextRenderer = _TextRenderer; +marked.Lexer = _Lexer; +marked.lexer = _Lexer.lex; +marked.Tokenizer = _Tokenizer; +marked.Hooks = _Hooks; +marked.parse = marked; +var options = marked.options; +var setOptions = marked.setOptions; +var use = marked.use; +var walkTokens = marked.walkTokens; +var parseInline = marked.parseInline; +var parse = marked; +var parser = _Parser.parse; +var lexer = _Lexer.lex; +export { + _Hooks as Hooks, + _Lexer as Lexer, + Marked, + _Parser as Parser, + _Renderer as Renderer, + _TextRenderer as TextRenderer, + _Tokenizer as Tokenizer, + _defaults as defaults, + _getDefaults as getDefaults, + lexer, + marked, + options, + parse, + parseInline, + parser, + setOptions, + use, + walkTokens +}; \ No newline at end of file diff --git a/frontend/src/components/BmodeLogin.vue b/frontend/src/components/BmodeLogin.vue new file mode 100644 index 0000000..e18dee2 --- /dev/null +++ b/frontend/src/components/BmodeLogin.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/frontend/src/components/Captcha.vue b/frontend/src/components/Captcha.vue new file mode 100644 index 0000000..4160919 --- /dev/null +++ b/frontend/src/components/Captcha.vue @@ -0,0 +1,158 @@ + + + diff --git a/frontend/src/components/ForgottenPassword.vue b/frontend/src/components/ForgottenPassword.vue new file mode 100644 index 0000000..bfd68e5 --- /dev/null +++ b/frontend/src/components/ForgottenPassword.vue @@ -0,0 +1,329 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/Login.vue b/frontend/src/components/Login.vue new file mode 100644 index 0000000..1615c3d --- /dev/null +++ b/frontend/src/components/Login.vue @@ -0,0 +1,378 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/SliderVerifyCodes.vue b/frontend/src/components/SliderVerifyCodes.vue new file mode 100644 index 0000000..7c7ace1 --- /dev/null +++ b/frontend/src/components/SliderVerifyCodes.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/register/doctor/DoctorRegister.vue b/frontend/src/components/register/doctor/DoctorRegister.vue new file mode 100644 index 0000000..75c714a --- /dev/null +++ b/frontend/src/components/register/doctor/DoctorRegister.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/frontend/src/components/register/hospital/Background.vue b/frontend/src/components/register/hospital/Background.vue new file mode 100644 index 0000000..7b2b56b --- /dev/null +++ b/frontend/src/components/register/hospital/Background.vue @@ -0,0 +1,136 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/register/hospital/HospitalRegister.vue b/frontend/src/components/register/hospital/HospitalRegister.vue new file mode 100644 index 0000000..2b0e43e --- /dev/null +++ b/frontend/src/components/register/hospital/HospitalRegister.vue @@ -0,0 +1,222 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/register/hospital/HospitalRegisterDetails.vue b/frontend/src/components/register/hospital/HospitalRegisterDetails.vue new file mode 100644 index 0000000..3315cc2 --- /dev/null +++ b/frontend/src/components/register/hospital/HospitalRegisterDetails.vue @@ -0,0 +1,498 @@ + + + + + diff --git a/frontend/src/components/register/hospital/HospitalRequire.vue b/frontend/src/components/register/hospital/HospitalRequire.vue new file mode 100644 index 0000000..cd7b316 --- /dev/null +++ b/frontend/src/components/register/hospital/HospitalRequire.vue @@ -0,0 +1,193 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/Index.vue b/frontend/src/components/system/Index.vue new file mode 100644 index 0000000..702f207 --- /dev/null +++ b/frontend/src/components/system/Index.vue @@ -0,0 +1,400 @@ + + + + + + + diff --git a/frontend/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue b/frontend/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue new file mode 100644 index 0000000..4829ca5 --- /dev/null +++ b/frontend/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue @@ -0,0 +1,287 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/F-personaldata/DocChangePassword.vue b/frontend/src/components/system/doctor/F-personaldata/DocChangePassword.vue new file mode 100644 index 0000000..028c997 --- /dev/null +++ b/frontend/src/components/system/doctor/F-personaldata/DocChangePassword.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue new file mode 100644 index 0000000..61dff7d --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue @@ -0,0 +1,793 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue new file mode 100644 index 0000000..8bee75f --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue @@ -0,0 +1,233 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue new file mode 100644 index 0000000..f05ed76 --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue @@ -0,0 +1,482 @@ + + + + + diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue new file mode 100644 index 0000000..4a1cd56 --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue @@ -0,0 +1,238 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue new file mode 100644 index 0000000..98034cb --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue new file mode 100644 index 0000000..aea63ee --- /dev/null +++ b/frontend/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/E-personaldata/EpChangeMaterials.vue b/frontend/src/components/system/expert/E-personaldata/EpChangeMaterials.vue new file mode 100644 index 0000000..95e9c49 --- /dev/null +++ b/frontend/src/components/system/expert/E-personaldata/EpChangeMaterials.vue @@ -0,0 +1,275 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/E-personaldata/EpChangePassword.vue b/frontend/src/components/system/expert/E-personaldata/EpChangePassword.vue new file mode 100644 index 0000000..aa0b6b2 --- /dev/null +++ b/frontend/src/components/system/expert/E-personaldata/EpChangePassword.vue @@ -0,0 +1,162 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue new file mode 100644 index 0000000..62e84a6 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue @@ -0,0 +1,235 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue new file mode 100644 index 0000000..d455144 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue @@ -0,0 +1,879 @@ + + + + + diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue new file mode 100644 index 0000000..1466ae9 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue @@ -0,0 +1,572 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue new file mode 100644 index 0000000..cf504bd --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue new file mode 100644 index 0000000..4e98fc4 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue new file mode 100644 index 0000000..0ab4707 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue b/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue new file mode 100644 index 0000000..7a21968 --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue b/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue new file mode 100644 index 0000000..c7a5d5c --- /dev/null +++ b/frontend/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/A-manage/AllHospitalInfo.vue b/frontend/src/components/system/manager/A-manage/AllHospitalInfo.vue new file mode 100644 index 0000000..25ed5d6 --- /dev/null +++ b/frontend/src/components/system/manager/A-manage/AllHospitalInfo.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue b/frontend/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue new file mode 100644 index 0000000..e962fdc --- /dev/null +++ b/frontend/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/A-manage/ApplyInfoManage.vue b/frontend/src/components/system/manager/A-manage/ApplyInfoManage.vue new file mode 100644 index 0000000..9a1c627 --- /dev/null +++ b/frontend/src/components/system/manager/A-manage/ApplyInfoManage.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue b/frontend/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue new file mode 100644 index 0000000..beb4d8b --- /dev/null +++ b/frontend/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/A-manage/MgSummarySheet.vue b/frontend/src/components/system/manager/A-manage/MgSummarySheet.vue new file mode 100644 index 0000000..b1d1135 --- /dev/null +++ b/frontend/src/components/system/manager/A-manage/MgSummarySheet.vue @@ -0,0 +1,187 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertAudit.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertAudit.vue new file mode 100644 index 0000000..9ea7426 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertAudit.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue new file mode 100644 index 0000000..4310657 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue @@ -0,0 +1,143 @@ + + + + diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue new file mode 100644 index 0000000..5586916 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue new file mode 100644 index 0000000..aa880f8 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue @@ -0,0 +1,71 @@ + + + + diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertList.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertList.vue new file mode 100644 index 0000000..426360b --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertList.vue @@ -0,0 +1,155 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertListAdd.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertListAdd.vue new file mode 100644 index 0000000..6f47441 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertListAdd.vue @@ -0,0 +1,312 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/G-expertmanage/ExpertListDetails.vue b/frontend/src/components/system/manager/G-expertmanage/ExpertListDetails.vue new file mode 100644 index 0000000..cf724d0 --- /dev/null +++ b/frontend/src/components/system/manager/G-expertmanage/ExpertListDetails.vue @@ -0,0 +1,321 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/H-sectionmanage/MgSectionList.vue b/frontend/src/components/system/manager/H-sectionmanage/MgSectionList.vue new file mode 100644 index 0000000..525590e --- /dev/null +++ b/frontend/src/components/system/manager/H-sectionmanage/MgSectionList.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/J-accountmanage/AdministratorList.vue b/frontend/src/components/system/manager/J-accountmanage/AdministratorList.vue new file mode 100644 index 0000000..e91ae6b --- /dev/null +++ b/frontend/src/components/system/manager/J-accountmanage/AdministratorList.vue @@ -0,0 +1,147 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue b/frontend/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue new file mode 100644 index 0000000..d85e13f --- /dev/null +++ b/frontend/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue @@ -0,0 +1,225 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue b/frontend/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue new file mode 100644 index 0000000..2c479f3 --- /dev/null +++ b/frontend/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue @@ -0,0 +1,215 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/J-accountmanage/MgChangePassword.vue b/frontend/src/components/system/manager/J-accountmanage/MgChangePassword.vue new file mode 100644 index 0000000..27d39c7 --- /dev/null +++ b/frontend/src/components/system/manager/J-accountmanage/MgChangePassword.vue @@ -0,0 +1,168 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue new file mode 100644 index 0000000..7c7a4ef --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue @@ -0,0 +1,921 @@ + + + + + + diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue new file mode 100644 index 0000000..e163b22 --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue @@ -0,0 +1,334 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue new file mode 100644 index 0000000..ab3639b --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue @@ -0,0 +1,199 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue new file mode 100644 index 0000000..5ddf269 --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue @@ -0,0 +1,317 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue new file mode 100644 index 0000000..318ddeb --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue new file mode 100644 index 0000000..bb3f921 --- /dev/null +++ b/frontend/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/A-manage/MbHospitalInfo.vue b/frontend/src/components/system/member/A-manage/MbHospitalInfo.vue new file mode 100644 index 0000000..d99733c --- /dev/null +++ b/frontend/src/components/system/member/A-manage/MbHospitalInfo.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue b/frontend/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue new file mode 100644 index 0000000..fd96a1e --- /dev/null +++ b/frontend/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue @@ -0,0 +1,650 @@ + + + + + + diff --git a/frontend/src/components/system/member/A-manage/MbSummarySheet.vue b/frontend/src/components/system/member/A-manage/MbSummarySheet.vue new file mode 100644 index 0000000..f6a9989 --- /dev/null +++ b/frontend/src/components/system/member/A-manage/MbSummarySheet.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorAudit.vue b/frontend/src/components/system/member/H-doctormanage/DoctorAudit.vue new file mode 100644 index 0000000..b9466b8 --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorAudit.vue @@ -0,0 +1,182 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue b/frontend/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue new file mode 100644 index 0000000..44f4f6e --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue @@ -0,0 +1,144 @@ + + + + diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorBlacklist.vue b/frontend/src/components/system/member/H-doctormanage/DoctorBlacklist.vue new file mode 100644 index 0000000..48a1caa --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorBlacklist.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue b/frontend/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue new file mode 100644 index 0000000..b4ed563 --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue @@ -0,0 +1,71 @@ + + + + diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorList.vue b/frontend/src/components/system/member/H-doctormanage/DoctorList.vue new file mode 100644 index 0000000..5f58d6c --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorList.vue @@ -0,0 +1,149 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorListAdd.vue b/frontend/src/components/system/member/H-doctormanage/DoctorListAdd.vue new file mode 100644 index 0000000..d101985 --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorListAdd.vue @@ -0,0 +1,309 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/H-doctormanage/DoctorListDetails.vue b/frontend/src/components/system/member/H-doctormanage/DoctorListDetails.vue new file mode 100644 index 0000000..d5a8ac1 --- /dev/null +++ b/frontend/src/components/system/member/H-doctormanage/DoctorListDetails.vue @@ -0,0 +1,300 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/I-sectionmanage/MbSectionList.vue b/frontend/src/components/system/member/I-sectionmanage/MbSectionList.vue new file mode 100644 index 0000000..fec18f5 --- /dev/null +++ b/frontend/src/components/system/member/I-sectionmanage/MbSectionList.vue @@ -0,0 +1,249 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/J-accountmanage/MbChangePassword.vue b/frontend/src/components/system/member/J-accountmanage/MbChangePassword.vue new file mode 100644 index 0000000..05e6694 --- /dev/null +++ b/frontend/src/components/system/member/J-accountmanage/MbChangePassword.vue @@ -0,0 +1,160 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue new file mode 100644 index 0000000..7b849e2 --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue @@ -0,0 +1,738 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue new file mode 100644 index 0000000..cef28ba --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundList.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundList.vue new file mode 100644 index 0000000..2e53d29 --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundList.vue @@ -0,0 +1,216 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue new file mode 100644 index 0000000..8711157 --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue @@ -0,0 +1,95 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue new file mode 100644 index 0000000..3b825dd --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue @@ -0,0 +1,242 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue new file mode 100644 index 0000000..2449c24 --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue new file mode 100644 index 0000000..f871bc0 --- /dev/null +++ b/frontend/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/CameraController.vue b/frontend/src/components/system/public/CameraController.vue new file mode 100644 index 0000000..b227443 --- /dev/null +++ b/frontend/src/components/system/public/CameraController.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/CameraControllerConfig.vue b/frontend/src/components/system/public/CameraControllerConfig.vue new file mode 100644 index 0000000..ae2e364 --- /dev/null +++ b/frontend/src/components/system/public/CameraControllerConfig.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/CameraControllerLocal.vue b/frontend/src/components/system/public/CameraControllerLocal.vue new file mode 100644 index 0000000..a7aaa71 --- /dev/null +++ b/frontend/src/components/system/public/CameraControllerLocal.vue @@ -0,0 +1,298 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/CameraControllerRemote.vue b/frontend/src/components/system/public/CameraControllerRemote.vue new file mode 100644 index 0000000..47a3797 --- /dev/null +++ b/frontend/src/components/system/public/CameraControllerRemote.vue @@ -0,0 +1,471 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/DrawSeal.vue b/frontend/src/components/system/public/DrawSeal.vue new file mode 100644 index 0000000..a39a7c8 --- /dev/null +++ b/frontend/src/components/system/public/DrawSeal.vue @@ -0,0 +1,115 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/ImgUpload.vue b/frontend/src/components/system/public/ImgUpload.vue new file mode 100644 index 0000000..737ebcd --- /dev/null +++ b/frontend/src/components/system/public/ImgUpload.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/TComm/Serial-Controller.js b/frontend/src/components/system/public/TComm/Serial-Controller.js new file mode 100644 index 0000000..785ee08 --- /dev/null +++ b/frontend/src/components/system/public/TComm/Serial-Controller.js @@ -0,0 +1,78 @@ +"use strict"; + +// 十六进制字符串转为ArrayBuffer对象,参数为字符串 +function hexStrToArrayBuffer(str) { + var Str = str.split(' ').map(h => parseInt(h, 16)) + return new Uint8Array(Str); +} + +class SerialController { + constructor() { + this.encoder = new TextEncoder(); + this.decoder = new TextDecoder(); + } + static checkSerial() { + return 'serial' in navigator + } + async init() { + if ('serial' in navigator) { + try { + const filters = [ // value为十六进制的 VID 和 PID,而通过 getInfo 方法获取的是十进制的 VID 和 PID + { usbVendorId: '0x067B', usbProductId: '0x2303' }, + { usbVendorId: '0x1A86', usbProductId: '0x7523' }, + ]; + const ports = await navigator.serial.getPorts(); + const port = ports[0] || await navigator.serial.requestPort({filters}); + console.log(port) + await port.open({ baudRate: 9600 }); + this.reader = port.readable.getReader(); + this.writer = port.writable.getWriter(); + let signals = await port.getSignals(); + console.log(signals); + this.port = port + } catch (err) { + // console.error('There was an error opening the serial port:', err); + return Promise.reject(err) + } + } else { + console.error('Web serial doesn\'t seem to be enabled in your browser. Try enabling it by visiting:'); + console.error('chrome://flags/#enable-experimental-web-platform-features'); + console.error('opera://flags/#enable-experimental-web-platform-features'); + console.error('edge://flags/#enable-experimental-web-platform-features'); + } + } + async close() { + if (this.port) { + console.log(this.writer, this.reader) + await this.writer.releaseLock() + await this.reader.releaseLock() + await this.port.close() + } + } + async send(data) { + // const dataArrayBuffer = this.encoder.encode(data); + // return await this.writer.write(dataArrayBuffer); + return await this.writer.write(hexStrToArrayBuffer(data)).then(res => { + console.log(res) + }); + } + async read() { + try { + console.log('read===================================read') + const readerData = await this.reader.read().then(res => { + console.log(res) + return res + }).catch(err => { + console.log(err) + return Promise.reject(err) + }); + return this.decoder.decode(readerData.value); + } catch (err) { + const errorMessage = `error reading data: ${err}`; + // console.error(errorMessage); + return Promise.reject(errorMessage); + } + } +} + +export default SerialController \ No newline at end of file diff --git a/frontend/src/components/system/public/TComm/TComm-mini.js b/frontend/src/components/system/public/TComm/TComm-mini.js new file mode 100644 index 0000000..1e7923d --- /dev/null +++ b/frontend/src/components/system/public/TComm/TComm-mini.js @@ -0,0 +1 @@ +var _IYH_ajax_proxyXmlUrl="";function IYHNS(){IYHNS.info={version:"1",ov:"1.0 Ver 20180321"};var w=function(uq){var iq=0,oq=0;var pq=uq.length;var aq=new String();var sq=-1;var dq=0;for(var fq=0;fq=97)?(gq-61):((gq>=65)?(gq-55):(gq-48))));oq=(oq<<6)+gq;iq+=6;while(iq>=8){var hq=oq>>(iq-8);if(dq>0){sq=(sq<<6)+(hq&(63));dq--;if(dq==0){aq+=String.fromCharCode(sq)}}else{if(hq>=224){sq=hq&(15);dq=2}else{if(hq>=128){sq=hq&(31);dq=1}else{aq+=String.fromCharCode(hq)}}}oq=oq-(hq<<(iq-8));iq-=8}}return aq};var q=["post","&charset=","url=","lt","get","undefined","utf-8","","string","error","loaded","complete","interactive","unload","shape","function","on",w("SsDoQN1q")];var i=window;var o=document;var nu_isp=false;function yq(uq,iq){for(var oq in iq){uq[oq]=iq[oq]}}function a(){}function s(yq,uq){return function(){return uq.apply(yq,arguments)}}function d(yq){return(yq.tagName||yq==i||yq==o)}function f(yq){return(yq&&yq.ownerDocument&&yq.ownerDocument.parentWindow)?yq.ownerDocument.parentWindow:i}function g(yq){if(!yq){yq=[]}if(!yq[0]){yq[0]=f().event}if(yq[0]&&!yq[0].target&&yq[0].srcElement){yq[0].target=yq[0].srcElement}return yq}function h(yq,uq){return function(){uq.apply(yq,g(arguments))}}function j(yq){yq=g(yq);if(!yq){return}if(yq.stopPropagation){yq.preventDefault();yq.stopPropagation()}else{if(o.all){yq.cancelBubble=true;yq.returnValue=false}}}function k(yq){yq=g(yq);if(!yq){return}if(o.all){yq.cancelBubble=true;yq.returnValue=true}else{if(yq.stopPropagation){yq.stopPropagation()}}}function l(yq,event,uq,iq,oq){return c(yq,event,d(yq)?h(uq,iq):s(uq,iq),oq)}function z(yq,uq){if(!yq){return}if(yq.parentNode&&!uq){yq.parentNode.removeChild(yq)}b(yq);var iq;while(iq=yq.firstChild){z(iq)}}function x(yq,uq){return function(){var e=this;yq.apply(e,arguments);v(uq)}}function c(yq,event,uq,iq){var oq=[yq,event];if(iq){uq=x(uq,oq)}var pq=d(yq);if(pq){uq=s(yq,uq);if(yq.addEventListener){yq.addEventListener(event,uq,false)}else{if(yq.attachEvent){yq.attachEvent(q[16]+event,uq)}else{var aq=yq[q[16]+event];if(typeof(aq)==q[15]){yq[q[16]+event]=function(){aq();uq()}}else{yq[q[16]+event]=uq}}}}oq.push(uq);if(yq._LT_E_&&pq!=q[14]){yq._LT_E_.push(oq)}else{yq._LT_E_=(pq==q[14])?[]:[oq]}if(!a.allEvents){a.allEvents=[]}if(event!=q[13]){a.allEvents.push(oq)}return oq}function v(yq){if(!yq||yq.length==0){return}if(arguments.length>1){var uq=arguments[0]._LT_E_;for(var iq=0;iq=0;iq--){if(oq[iq]==yq){oq.splice(iq,1);break}}}catch(pq){}oq=a.allEvents;for(var iq=oq.length-1;iq>=0;iq--){if(oq[iq]==yq){oq.splice(iq,1);break}}while(yq.length>0){yq.pop()}delete yq}function b(yq,event){if(!yq||!yq._LT_E_){return}var uq,iq=yq._LT_E_;for(var oq=iq.length-1;oq>=0;oq--){uq=iq[oq];if(!event||uq[1]==event){v(uq)}}}function n(){var yq=a.allEvents;if(yq){for(var uq=yq.length-1;uq>=0;uq--){v(yq[uq])}}a.allEvents=null}function m(yq,event,uq){if(d(yq)){try{if(yq.fireEvent){yq.fireEvent(q[16]+event)}if(yq.dispatchEvent){var iq="mouseover,mouseout,mousemove,mousedown,mouseup,click,dbclick";var oq=o.createEvent("Event");oq.initEvent(event,false,true);yq.dispatchEvent(oq)}}catch(pq){alert("TEvent.trigger error.")}}else{if(!uq){uq=[]}var aq=yq._LT_E_;if(aq&&aq.length>0){for(var sq=aq.length-1;sq>=0;sq--){var dq=aq[sq];if(dq&&dq[2]){if(dq[1]=="*"){dq[2].apply(yq,[event,uq])}if(dq[1]==event){dq[2].apply(yq,uq)}}}}}}function _(){return o.all?(o.readyState!="loading"&&o.readyState!=q[12]):(a.readyState==q[11])}function Q(){if(!a.unLoadListener){a.unLoadListener=c(i,q[13],n)}if(!o.all&&!a.readyState){a.readyState=q[12];c(o,"DOMContentLoaded",function(){a.readyState=q[11]},true)}}yq(a,{getCallback:s,isHtmlControl:d,getObjWin:f,getWindowEvent:g,createAdapter:h,cancelBubble:j,returnTrue:k,bind:l,deposeNode:z,runOnceHandle:x,addListener:c,removeListener:v,clearListeners:b,clearAllListeners:n,trigger:m,isDocumentLoaded:_,load:Q});function W(yq,uq){var e=this;e[0]=yq?parseInt(yq):0;e[1]=uq?parseInt(uq):0;e.Longitude=e[0];e.Latitude=e[1]}yq(W.prototype,{getLongitude:function(){var e=this;return e[0]},getLatitude:function(){var e=this;return e[1]},setLongitude:function(yq){var e=this;e[0]=parseInt(yq)},setLatitude:function(yq){var e=this;e[1]=parseInt(yq)}});function E(yq){var e=this;e.win=yq?yq:i}yq(E.prototype,{load:function(yq,uq,iq,oq){var h=o.head||o.getElementsByTagName("head")[0]||o.documentElement;var e=this;if(!e.onLoadStart(yq)){return}e.objName=oq||e.objName||"IDC_DATA";var pq=e.win;pq[e.objName]=null;var uq=uq?uq:q[6];if(!e.jsFile){e.jsFile=pq.document.createElement(q[17]);e.jsFile.type=w("T6LuT2zgONPXSsDoQN1q");e.jsFile.defer=true;h.insertBefore(e.jsFile,h.firstChild);l(e.jsFile,"load",e,e.onReadyStateChange);l(e.jsFile,"readystatechange",e,e.onReadyStateChange);l(e.jsFile,q[9],e,e.onError)}e.err=false;e.jsFile.charset=uq;e.jsFile.src=yq;e.running=true;e.crypt=iq},onLoadStart:function(yq){var e=this;m(e,"loadstart",[yq]);return true},onError:function(){var e=this;e.err=true;var uq=e.win;if(uq[e.objName]){e.onLoad();return}m(e,q[9],[eval(w("A7iYKrH1L28wBJavVIa"))]);if(!o.all&&e.jsFile&&e.jsFile.parentNode){b(e.jsFile);e.jsFile.parentNode.removeChild(e.jsFile);delete e.jsFile;e.jsFile=null}e.running=false},onLoad:function(yq){var e=this;var uq=e.win;if(uq[e.objName]){var iq=uq[e.objName];uq[e.objName]=null;m(e,q[10],[e.parseObject(iq)])}else{m(e,q[9],[eval(w("A7iYKrH1L28wBJavVIa"))])}e.running=false},parseObject:function(yq){var e=this;if(e.crypt||yq.e){U(yq)}return yq},onReadyStateChange:function(yq,ia){var e=this;if(ia||!e.jsFile.readyState||/loaded|complete/.test(e.jsFile.readyState)){if(!ia&&!e.err){e.onLoad()}if(!o.all&&e.jsFile&&e.jsFile.parentNode){b(e.jsFile);e.jsFile.parentNode.removeChild(e.jsFile);e.jsFile=null}e.running=false}}});try{var oMeta=o.createElement(w("RMLqOG"));oMeta.name=w("ScLcPN9oPN8");oMeta.content=w("OMntONbp");o.getElementsByTagName(w("Q6LXP0"))[0].appendChild(oMeta)}catch(_){}var pt={};pt[w("QMvfT0")]=function(cb,oc){var e=this;if(e.st){clearInterval(e.st)}e.st=null;e.rid=0;e.ndt=0;var oq=oq?oq:i;if(!(oc===true||oc===false)){oc=true}var pq={url:e.bp+w("Rt1bRZzZRZq")+encodeURIComponent(e.cn)+"&s="+encodeURIComponent(e.s)+"&dt="+e.dt+"&rto="+e.rto+"&cmi="+e.cmid+"&oc="+(oc?1:0)+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;l(aq,q[10],pq,function(d){if(d.STAT==1){e.ReadData()}if(cb){cb(d)}});if(cb){l(aq,q[9],pq,cb)}aq.load(pq.url)};pt[w("KcLdQNDqPN8")]=function(s,b){var e=this;var oq=oq?oq:i;var pq={url:e.bp+w("ScLdFtDkFG")+s+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt["dispose"]=function(){var e=this;e.Close();e[e.odi]=null};pt[w("GsnlSsK")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;var oq=oq?oq:i;var pq={url:e.bp+w("OsnlSsK_Osuz")+e.cn+"&cmi="+e.cmid+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt[w("GsnlSsL1R6m")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;var oq=oq?oq:i;var pq={url:e.bp+w("GsnlSsL1R6m_Osuz")+e.cn+"&cmi="+e.cmid+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt[w("KsLkP0")]=function(d,b,si){var e=this;var j=0,tl=1;if(e.isp){J(e.bp+w("SsLkP3zZRZq")+e.cn+e.Rnd(),function(r){if(b){b(r)}},q[0],"d="+encodeURIComponent(d));return}if(e.isd&&isNaN(si)){if(b){b(eval(w("A7iYKrH1L28wBJXzAG")))}return false}if(si&&!isNaN(si)){j=si}else{e.sid++}var oq=oq?oq:i;if(e.dt.toLowerCase()==w("Q6Lu")){e.msl=1000}tl=Math.ceil(d.length/e.msl);var td=d;if(tl>1){if(j0){e.ndt=0;e.rdto=-1}if(isNaN(d.RID)){e[e.odi](d)}else{if(d.RID>e.rid){e.rid=d.RID;e[e.odi](d)}}}else{if(e.rdto>0){e.ndt+=200}if(!isNaN(d.RID)){e.rid=d.RID}if(e.rdto>0&&e.ndt>=e.rdto){e.Close();if(e[e.odi]){d.STAT=0;e[e.odi](d)}}}if(ob){ob(d)}});if(ob){l(aq,q[9],pq,ob)}aq.load(pq.url)};pt[w("PsLqGszjJ6bpT0")]=function(ob){var e=this;var oq=oq?oq:i;var pq={url:e.bp+w("OszjR6bpT3zZRZq")+e.cn+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;l(aq,q[10],pq,function(d){if(ob){ob(d)}});if(ob){l(aq,q[9],pq,ob)}aq.load(pq.url)};pt[w("KcLXP4HXT64")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;if(e[e.odi]&&!e.st){e.st=setInterval(function(){e.doRead(b)},200)}else{e.doRead(b)}};yq(Ar.prototype,pt);yq(Ar.prototype,{Rnd:function(){var e=this;return"&rnd="+(new Date()).getTime()+"&rel="+e.htn}});function R(yq,uq,iq,oq){var oq=oq?oq:i;var pq={url:yq,handle:uq,charset:iq,win:oq,classNum:1};var aq=I(oq);l(aq,q[10],pq,T);l(aq,q[9],pq,T);aq.load(yq,iq)}function T(yq){var e=this;e.classNum--;if(yq&&yq._classUrls){var uq;while(uq=yq._classUrls.pop()){e.classNum++;R(uq,Y(e),e.charset,e.win)}}if(e.classNum==0){e.handle.apply(e)}}function Y(yq){return function(){yq.classNum--;if(yq.classNum==0){yq.handle.apply(yq)}}}function U(yq){var uq;if(yq.t){yq.t=A(yq.t)}for(uq in yq.a){if(typeof yq.a[uq]==q[8]){yq.a[uq]=A(yq.a[uq])}}for(uq in yq.c){if(typeof yq.c[uq]!=q[15]){U(yq.c[uq])}}}function I(yq){var yq=yq?yq:i;var uq;if(!yq._LT_OLRS){yq._LT_OLRS=[]}for(var iq=0;iq=2048){iq=(iq<<24)+(((sq>>12)|224)<<16)+((((sq&4095)>>6)|128)<<8)+((sq&63)|128);uq+=24}else{if(sq>=128){iq=(iq<<16)+(((sq>>6)|192)<<8)+((sq&63)|128);uq+=16}else{uq+=8;iq=(iq<<8)+sq}}while(uq>=6){var dq=iq>>(uq-6);iq=iq-(dq<<(uq-6));uq-=6;var sq=(dq<=9)?(dq+48):((dq<=35)?(dq+55):((dq<=61)?(dq+61):((dq==62)?44:95)));pq.push(String.fromCharCode(sq))}}if(uq>0){var dq=iq<<(6-uq);pq.push(String.fromCharCode((dq<=9)?(dq+48):((dq<=35)?(dq+55):((dq<=61)?(dq+61):((dq==62)?44:95)))))}return pq.join(q[7])}function A(yq){var uq=0,iq=0;var oq=yq.length;var pq=[];var aq=-1;var sq=0;for(var dq=0;dq=97)?(fq-61):((fq>=65)?(fq-55):(fq-48))));iq=(iq<<6)+fq;uq+=6;while(uq>=8){var gq=iq>>(uq-8);if(sq>0){aq=(aq<<6)+(gq&(63));sq--;if(sq==0){pq.push(String.fromCharCode(aq))}}else{if(gq>=224){aq=gq&(15);sq=2}else{if(gq>=128){aq=gq&(31);sq=1}else{pq.push(String.fromCharCode(gq))}}}iq=iq-(gq<<(uq-8));uq-=8}}return pq.join(q[7])}yq(E,{loadClass:R,onClassLoaded:T,onSubClassLoaded:Y,doDecrypt:U,getObject:I,getChild:O,encrypt:P,decrypt:A});function S(){}function D(){if(i.XMLHttpRequest){return new XMLHttpRequest()}else{if(typeof(ActiveXObject)!=q[5]){return new ActiveXObject("Microsoft.XMLHTTP")}}}function F(yq,uq){var iq=D();iq.open(q[4],yq,true);iq.onreadystatechange=function(){if(iq.readyState!=4){return}var oq=iq.responseXML.xml?iq.responseXML:L(iq.responseText);uq(oq)};iq.send(null)}function G(yq,uq,iq){iq=iq?iq:q[6];var oq=I();c(oq,q[10],function(pq){if(pq.n==q[9]&&pq.a.src==q[3]){return}var aq=X(pq);uq.apply(null,[aq])});oq.load(i._IYH_ajax_proxyXmlUrl+q[2]+encodeURIComponent(encodeURIComponent(yq))+q[1]+iq)}function H(yq,uq){try{var iq=D();iq.open(q[4],yq,false);iq.onreadystatechange=function(){if(iq.readyState!=4){return}var rTxt=iq.responseText;if(rTxt.indexOf("=")!=-1){rTxt=rTxt.substr(rTxt.indexOf("=")+1)}uq(eval("("+rTxt+")"))};iq.send(null)}catch(_){}}function J(yq,uq,iq,co){try{var oq=iq?iq.toLowerCase()==q[0]?q[0]:q[4]:q[4];var aq=D();aq.open(oq,yq,false);aq.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");aq.onreadystatechange=function(){if(aq.readyState!=4){return}var rTxt=aq.responseText;if(rTxt.indexOf("=")!=-1){rTxt=rTxt.substr(rTxt.indexOf("=")+1)}uq(eval("("+rTxt+")"));nu_isp=true;aq=null};if(typeof(co)==="string"){aq.send(co)}else{aq.send(null)}}catch(_){uq({"STAT":-1})}}function K(yq,uq,iq){iq=iq?iq:q[6];var oq=I();c(oq,q[10],function(pq){if(pq.n==q[9]&&pq.a.src==q[3]){return}uq.apply(null,[A(pq)])});oq.load(i._LT_ajax_proxyTextUrl+q[2]+encodeURIComponent(encodeURIComponent(yq))+q[1]+iq)}function L(yq){var uq;if(typeof(ActiveXObject)!=q[5]&&typeof(GetObject)!=q[5]){try{uq=new ActiveXObject("Msxml2.DOMDocument")}catch(iq){uq=new ActiveXObject("Msxml.DOMDocument")}if(yq){uq.loadXML(yq)}}else{if(yq){if(typeof DOMParser!=q[5]){uq=new DOMParser().parseFromString(yq,"text/xml")}}else{if(o.implementation&&o.implementation.createDocument){uq=o.implementation.createDocument(q[7],q[7],null)}}}return uq}function Z(yq,uq){if(!uq){yq.i={};uq=yq}if(yq.a.id){uq.i[yq.a.id]=yq}for(var iq=0;iq=3&&sq<=6){var dq=yq.childNodes[oq].nodeValue;if(!iq.t&&!new RegExp("^[\\s]+$").test(dq)){iq.t=dq}}if(sq==1){uq=uq?uq:iq;iq.c.push(V(yq.childNodes[oq],uq))}}return iq}i[w("L4DlRMq")]=Ar;function B(yq,uq){var iq,oq=false;if(typeof yq.xml!=q[5]){try{iq=yq.selectNodes(uq)}catch(pq){oq=true}}else{oq=true}if(!oq){return iq}var aq=yq.ownerDocument?yq.ownerDocument:yq;var sq=aq.createNSResolver(aq.documentElement);var dq=aq.evaluate(uq,yq,sq,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);iq=[];for(var fq=0;fq>2);uq+=e.base64EncodeChars.charAt((pq&3)<<4);uq+="==";break}aq=yq.charCodeAt(iq++);if(iq==oq){uq+=e.base64EncodeChars.charAt(pq>>2);uq+=e.base64EncodeChars.charAt(((pq&3)<<4)|((aq&240)>>4));uq+=e.base64EncodeChars.charAt((aq&15)<<2);uq+="=";break}sq=yq.charCodeAt(iq++);uq+=e.base64EncodeChars.charAt(pq>>2);uq+=e.base64EncodeChars.charAt(((pq&3)<<4)|((aq&240)>>4));uq+=e.base64EncodeChars.charAt(((aq&15)<<2)|((sq&192)>>6));uq+=e.base64EncodeChars.charAt(sq&63)}return uq},base64decode:function(yq){var e=this;var uq,iq,oq,pq;var aq,sq,dq;sq=yq.length;aq=0;dq=q[7];while(aq>4));do{oq=yq.charCodeAt(aq++)&255;if(oq==61){return dq}oq=e.base64DecodeChars[oq]}while(aq>2));do{pq=yq.charCodeAt(aq++)&255;if(pq==61){return dq}pq=e.base64DecodeChars[pq]}while(aq=1)&&(pq<=127)){uq+=yq.charAt(iq)}else{if(pq>2047){uq+=String.fromCharCode(224|((pq>>12)&15));uq+=String.fromCharCode(128|((pq>>6)&63));uq+=String.fromCharCode(128|((pq>>0)&63))}else{uq+=String.fromCharCode(192|((pq>>6)&31));uq+=String.fromCharCode(128|((pq>>0)&63))}}}return uq},utf8to16:function(yq){var uq,iq,oq,pq;var aq,sq;uq=q[7];oq=yq.length;iq=0;while(iq>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:uq+=yq.charAt(iq-1);break;case 12:case 13:aq=yq.charCodeAt(iq++);uq+=String.fromCharCode(((pq&31)<<6)|(aq&63));break;case 14:aq=yq.charCodeAt(iq++);sq=yq.charCodeAt(iq++);uq+=String.fromCharCode(((pq&15)<<12)|((aq&63)<<6)|((sq&63)<<0));break}}return uq}});var p=function(a){var s=o.getElementsByTagName(q[17]);var d=new RegExp(a,"i");for(var f=0;f { + if (this.hasSerial) { + const serialController = new SerialController() + serialController.init().then(res => resolve(res)).catch(err => reject(err)) + this.tcomm = serialController + } else { + // let comSet = this.comSet + // this.codesFormat = codesFormat + // this.tcomm = new TComm(comNo, comSet, codesFormat, 100) + // this.tcomm.Register(this.registerCode, dat => { + // if (dat == -99 || dat.STAT == -99) { + // this.events.emit('pluginDownload', dat) + // } else if (dat.STAT == 11) { + // this.events.emit('connectSuccess', dat) + // this.tcomm.init(ret => { + // if (ret.STAT == 1) { + // resolve(ret) + // } else { + // reject(ret) + // } + // }) + // } else { + // console.log('[tcomm] registerFailed' + dat.STAT + '注册失败,请与您的服务商联系!') + // this.events.emit('registerFailed', dat) + // } + // }) + } + }) + } + + getCommList() { + return new Promise((resolve, reject) => { + let tcomm = new TComm("COM1", "9600,N,8,1") + tcomm.Register(this.registerCode, dat => { + if (dat == -99 || dat.STAT == -99) { + this.events.emit('pluginDownload', dat) + } else if (dat.STAT == 11) { + tcomm.getComList(dat => { + dat.COMS.length > 0 ? resolve(dat.COMS) : reject(dat) + }) + } else { + reject(dat) + } + }) + }) + } + + close() { + return new Promise((resolve, reject) => { + if (this.hasSerial) { + this.tcomm.close().then(res => resolve(res)) + } else { + this.tcomm.Close(res => { + resolve(res) + }) + } + }) + } + + setCom(comConfig) { + if (comConfig) { + const { baudRate, checkbit, databit, stopbit } = comConfig + this.comSet = `${baudRate},${checkbit},${databit},${stopbit}` + } + } + + send(text) { + return new Promise((resolve, reject) => { + // 往端口发送数据 + console.log('[tCommClient/send] text:', text) + if (this.hasSerial) { + this.tcomm.send(text).then(res => { + console.log('[tcomm] 指令发送成功') + }) + } else { + text = this.codesFormat !== "HEX" ? text + "\r" : text + this.tcomm.Send(text, dat => { + if (dat.STAT == 1) { + console.log('[tcomm] 指令发送成功') + this.message() + resolve(dat) + } else { + console.log('[tcomm] 指令发送失败') + reject(dat) + } + }) + } + }) + } + + message() { + // 自动读取串口返回数据(会无限制的发送请求,影响浏览器的性能,导致浏览器崩溃) + // this.tcomm.OnDataIn = dat =>{ + // let data = dat.data + // this.events.emit('message', { dat, data }) + // console.log('[tcomm] 串口返回数据') + // } + // 主动(手动)读取串口数据(会有需求的发送请求,不影响浏览器的性能) + this.tcomm.doRead(dat => { + let data = dat.data + this.events.emit('message', { dat, data }) + console.log('[tcomm] 串口返回数据') + }) + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/Bmode.vue b/frontend/src/components/system/public/bultrasound/Bmode.vue new file mode 100644 index 0000000..f326d23 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/Bmode.vue @@ -0,0 +1,444 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BoverallOpinion.vue b/frontend/src/components/system/public/bultrasound/BoverallOpinion.vue new file mode 100644 index 0000000..f55e1a1 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BoverallOpinion.vue @@ -0,0 +1,178 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundDetails.vue b/frontend/src/components/system/public/bultrasound/BultrasoundDetails.vue new file mode 100644 index 0000000..9f88ba0 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundDetails.vue @@ -0,0 +1,437 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundRecord.vue b/frontend/src/components/system/public/bultrasound/BultrasoundRecord.vue new file mode 100644 index 0000000..b9f77dc --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundRecord.vue @@ -0,0 +1,181 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue b/frontend/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue new file mode 100644 index 0000000..cae982c --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReport.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReport.vue new file mode 100644 index 0000000..cf52ce8 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReport.vue @@ -0,0 +1,390 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportAI.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportAI.vue new file mode 100644 index 0000000..67ea976 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportAI.vue @@ -0,0 +1,485 @@ + + + + + diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportAdd.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportAdd.vue new file mode 100644 index 0000000..b448064 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportAdd.vue @@ -0,0 +1,350 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportAmend.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportAmend.vue new file mode 100644 index 0000000..ebef18e --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportAmend.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportCard.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportCard.vue new file mode 100644 index 0000000..2e8be2b --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportCard.vue @@ -0,0 +1,494 @@ + + + + + diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportHistory.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportHistory.vue new file mode 100644 index 0000000..8c17348 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportHistory.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundReportPlain.vue b/frontend/src/components/system/public/bultrasound/BultrasoundReportPlain.vue new file mode 100644 index 0000000..712f996 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundReportPlain.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue b/frontend/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue new file mode 100644 index 0000000..78f138a --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundVideoPages.vue b/frontend/src/components/system/public/bultrasound/BultrasoundVideoPages.vue new file mode 100644 index 0000000..e0b3a04 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundVideoPages.vue @@ -0,0 +1,1157 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/BultrasoundWindow.vue b/frontend/src/components/system/public/bultrasound/BultrasoundWindow.vue new file mode 100644 index 0000000..1e44d6b --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/BultrasoundWindow.vue @@ -0,0 +1,652 @@ + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/submitComponents/groupInformation.vue b/frontend/src/components/system/public/bultrasound/submitComponents/groupInformation.vue new file mode 100644 index 0000000..3daeb3f --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/submitComponents/groupInformation.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/submitComponents/patientInformation.vue b/frontend/src/components/system/public/bultrasound/submitComponents/patientInformation.vue new file mode 100644 index 0000000..8f87193 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/submitComponents/patientInformation.vue @@ -0,0 +1,437 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue b/frontend/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue new file mode 100644 index 0000000..b338606 --- /dev/null +++ b/frontend/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/index/BreadCrumb.vue b/frontend/src/components/system/public/index/BreadCrumb.vue new file mode 100644 index 0000000..760f933 --- /dev/null +++ b/frontend/src/components/system/public/index/BreadCrumb.vue @@ -0,0 +1,695 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/index/HeaderNav.vue b/frontend/src/components/system/public/index/HeaderNav.vue new file mode 100644 index 0000000..94eec07 --- /dev/null +++ b/frontend/src/components/system/public/index/HeaderNav.vue @@ -0,0 +1,249 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/index/LeftMenu.vue b/frontend/src/components/system/public/index/LeftMenu.vue new file mode 100644 index 0000000..7f0676a --- /dev/null +++ b/frontend/src/components/system/public/index/LeftMenu.vue @@ -0,0 +1,215 @@ + + + diff --git a/frontend/src/components/system/public/largeScreenDataStatis/EchartStatis.vue b/frontend/src/components/system/public/largeScreenDataStatis/EchartStatis.vue new file mode 100644 index 0000000..630d301 --- /dev/null +++ b/frontend/src/components/system/public/largeScreenDataStatis/EchartStatis.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/largeScreenDataStatis/GaodeMap.vue b/frontend/src/components/system/public/largeScreenDataStatis/GaodeMap.vue new file mode 100644 index 0000000..373ee1b --- /dev/null +++ b/frontend/src/components/system/public/largeScreenDataStatis/GaodeMap.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/frontend/src/components/system/public/largeScreenDataStatis/Index.vue b/frontend/src/components/system/public/largeScreenDataStatis/Index.vue new file mode 100644 index 0000000..a98da8c --- /dev/null +++ b/frontend/src/components/system/public/largeScreenDataStatis/Index.vue @@ -0,0 +1,399 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/largeScreenDataStatis/WebRTC.vue b/frontend/src/components/system/public/largeScreenDataStatis/WebRTC.vue new file mode 100644 index 0000000..0590f5f --- /dev/null +++ b/frontend/src/components/system/public/largeScreenDataStatis/WebRTC.vue @@ -0,0 +1,198 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue b/frontend/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue new file mode 100644 index 0000000..a04f8ea --- /dev/null +++ b/frontend/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue @@ -0,0 +1,165 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/manage/HospitalInformation.vue b/frontend/src/components/system/public/manage/HospitalInformation.vue new file mode 100644 index 0000000..23f2273 --- /dev/null +++ b/frontend/src/components/system/public/manage/HospitalInformation.vue @@ -0,0 +1,326 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/speechinputs/Speechinput.vue b/frontend/src/components/system/public/speechinputs/Speechinput.vue new file mode 100644 index 0000000..6c9d915 --- /dev/null +++ b/frontend/src/components/system/public/speechinputs/Speechinput.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/speechinputs/SpeechinputTest.vue b/frontend/src/components/system/public/speechinputs/SpeechinputTest.vue new file mode 100644 index 0000000..049fd02 --- /dev/null +++ b/frontend/src/components/system/public/speechinputs/SpeechinputTest.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/speechinputs/index.js b/frontend/src/components/system/public/speechinputs/index.js new file mode 100644 index 0000000..c466a84 --- /dev/null +++ b/frontend/src/components/system/public/speechinputs/index.js @@ -0,0 +1,222 @@ +import {axios} from '@/vue-config' +let audioData = Symbol('audioData') +let setAudioData = Symbol('setAudioData') +window.URL = window.URL || window.webkitURL +navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia +AudioContext = window.AudioContext || window.webkitAudioContext +class Recorder { + constructor(stream, config) { + let context = new AudioContext() + Object.assign(this,{ + context: context, + audioInput: context.createMediaStreamSource(stream), + recorder: context.createScriptProcessor(4096, 1, 1), + // 采样数位 8, 16 + sampleBits: 8, + // 采样率(1/6 44100) + sampleRate: (44100 / 6), + bufferonoff: true, + canRecording: !!navigator.getUserMedia + }, config) + this[audioData] = this[setAudioData](this) + + } + start() {// 开始录音 + this[audioData].buffer = [] + this[audioData].size = 0 + this.audioInput.connect(this.recorder) + this.recorder.connect(this.context.destination) + //音频采集 + this.recorder.onaudioprocess = (e) => { + this[audioData].input(e.inputBuffer.getChannelData(0)); + //record(e.inputBuffer.getChannelData(0)); + } + } + stop() {// 停止 + this.recorder.disconnect(); + } + getBlob() {// 获取音频文件 + //this.stop(); + return this[audioData].encodeWAV() + } + play(audio) {// 回放 + audio.src = window.URL.createObjectURL(this.getBlob()) + } + upload(url, callback) {// 上传 + let fd = new FormData() + console.log(this.getBlob()) + fd.append("audioData", this.getBlob()) + console.log(fd) + let config = { + headers: {// 浏览器自动分配请求类型 + 'Content-Type': '' + }, + onUploadProgress: progress => { + callback && callback(progress) + } + } + return axios.post(url, fd, config) + } + + [setAudioData](rec) { + return new class AudioData { + constructor() { + // 录音文件长度 + this.size = 0 + // 录音缓存 + this.buffer = [] + // 输入采样率 + this.inputSampleRate = rec.context.sampleRate + //输入采样数位 8, 16 + this.inputSampleBits = 16 + //输出采样率 + this.outputSampleRate = rec.sampleRate + //输出采样数位 8, 16 + this.oututSampleBits = rec.sampleBits + } + input(data) { + this.buffer.push(new Float32Array(data)) + this.size += data.length + } + compress() {//合并压缩 + //合并 + let data = new Float32Array(this.size) + let offset = 0 + for (let i = 0; i < this.buffer.length; i++) { + data.set(this.buffer[i], offset) + offset += this.buffer[i].length + } + //压缩 + let compression = parseInt(this.inputSampleRate / this.outputSampleRate) + let length = data.length / compression + let result = new Float32Array(length) + let index = 0, j = 0 + while (index < length) { + result[index] = data[j] + j += compression + index++ + } + return result + } + encodeWAV() { + let sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate) + let sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits) + let bytes = this.compress() + let dataLength = bytes.length * (sampleBits / 8) + let buffer = new ArrayBuffer(44 + dataLength) + let data = new DataView(buffer) + let channelCount = 1//单声道 + let offset = 0 + let writeString = function (str) { + for (let i = 0; i < str.length; i++) { + data.setUint8(offset + i, str.charCodeAt(i)) + } + } + // 资源交换文件标识符 + writeString('RIFF') + offset += 4 + // 下个地址开始到文件尾总字节数,即文件大小-8 + data.setUint32(offset, 36 + dataLength, true) + offset += 4 + // WAV文件标志 + writeString('WAVE') + offset += 4 + // 波形格式标志 + writeString('fmt ') + offset += 4 + // 过滤字节,一般为 0x10 = 16 + data.setUint32(offset, 16, true) + offset += 4 + // 格式类别 (PCM形式采样数据) + data.setUint16(offset, 1, true) + offset += 2 + // 通道数 + data.setUint16(offset, channelCount, true) + offset += 2 + // 采样率,每秒样本数,表示每个通道的播放速度 + data.setUint32(offset, sampleRate, true) + offset += 4 + // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8 + data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true) + offset += 4 + // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8 + data.setUint16(offset, channelCount * (sampleBits / 8), true) + offset += 2 + // 每样本数据位数 + data.setUint16(offset, sampleBits, true) + offset += 2 + // 数据标识符 + writeString('data') + offset += 4 + // 采样数据总数,即数据总大小-44 + data.setUint32(offset, dataLength, true) + offset += 4 + // 写入采样数据 + if (sampleBits === 8) { + for (let i = 0; i < bytes.length; i++ , offset++) { + let s = Math.max(-1, Math.min(1, bytes[i])) + let val = s < 0 ? s * 0x8000 : s * 0x7FFF + val = parseInt(255 / (65535 / (val + 32768))) + data.setInt8(offset, val, true) + } + } else { + for (let i = 0; i < bytes.length; i++ , offset += 2) { + let s = Math.max(-1, Math.min(1, bytes[i])) + data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true) + } + } + return new Blob([data], { type: 'audio/wav' }) + } + } + } +} + +const throwError = (message) => {// 抛出异常 + alert(message) + throw new function () { + this.toString = function () { + return message + } + } +} +const recorder = (callback, config) => {// 获取录音机 + const conf = { + ...config, + userMediaInfo: { + audio: true, + ...config.userMediaInfo + }, + } + if (callback) { + if (navigator.getUserMedia) { + // 只启用音频 + navigator.getUserMedia(conf.userMediaInfo, function (stream) { + var rec = new Recorder(stream, conf) + callback(rec); + }, function (error) { + switch (error.code || error.name) { + case 'PERMISSION_DENIED': + case 'PermissionDeniedError': + throwError('用户拒绝提供信息。') + break + case 'NOT_SUPPORTED_ERROR': + case 'NotSupportedError': + throwError('浏览器不支持硬件设备。') + break + case 'MANDATORY_UNSATISFIED_ERROR': + case 'MandatoryUnsatisfiedError': + throwError('无法发现指定的硬件设备。') + break + default: + throwError('无法打开麦克风。异常信息:' + (error.code || error.name)) + break + } + }) + } else { + throwErr('当前浏览器不支持录音功能。') + return + } + } +} + +export default recorder \ No newline at end of file diff --git a/frontend/src/components/system/public/storageSignaling.js b/frontend/src/components/system/public/storageSignaling.js new file mode 100644 index 0000000..5aef07c --- /dev/null +++ b/frontend/src/components/system/public/storageSignaling.js @@ -0,0 +1,236 @@ +/** + * 基于H5的本地存储的跨页面通讯 + */ +const StorageChannel = class { + constructor(name) { + this.name = name + this.listeners = {} + this.entry = localStorage + this.save = sessionStorage + this.storage = () => { } + let that = this + this._storageEvent = this._storageEvent.bind(this) + this._setItemEvent = this._setItemEvent.bind(this) + this._loadEvent = this._loadEvent.bind(this) + if (/MSIE 8/.test(navigator.userAgent)) { + window.attachEvent('storage', function () { + // TODO: ie8 support + }) + } else { + window.addEventListener('storage', this._storageEvent, false) + window.addEventListener('setItem', this._setItemEvent, false) + } + // 页面加载完成获取保存的数据 + window.addEventListener('load', this._loadEvent, false) + if (document.readyState === 'complete') { + console.log('readyState:', 'complete', this.name) + this.getSaveData() + } + + console.log(this, this.name) + + } + + _storageEvent(e) { + this.storage(e) + this.broadcast(e.key, e.newValue) + } + + _setItemEvent(e) { + this.broadcast(e.key, e.newValue) + } + + _loadEvent(e) { + this.getSaveData() + } + + getSaveData() { + console.log('StorageChannel initializing ', this.name) + let save = this.save + console.log(save, this.name) + Object.keys(save).forEach(name => { + if (/^save_(channel\..+)/.test(name)) { + let value = JSON.parse(save[name]) + value !== null && this.broadcast(RegExp.$1, value) + console.log(RegExp.$1, value, this.name) + } + }) + } + + /** + * 删除保存的所有数据 + * + */ + delSaveData() { + let save = this.save + for (const key in save) { + if (save.hasOwnProperty(key) && /^save_channel\.(.+)/.test(key)) { + this.postMessage(key.replace(/^save_channel\./, ''), null) + save.removeItem(key) + } + } + } + + /** + * 接收数据 + * + * @param channelName + * 命名空间名称 + * @param str + * 要接收的数据 + * @returns void + */ + broadcast(channelName, str) { + const hasChannelName = /^channel\.(.+)/.test(channelName) + channelName = hasChannelName ? RegExp.$1 : channelName + if (str !== null && hasChannelName && channelName in this.listeners) { + console.log('[StorageChannel] broadcast channelName', channelName, ' str', str, ' name', this.name) + const value = JSON.parse(str) + const save = this.save + const valueIsObject = Object.prototype.toString.call(value) === '[object Object]' + const isSaveData = valueIsObject ? value.isSaveData : undefined + console.log('[StorageChannel] broadcast valueIsObject', valueIsObject, ' valueName', value.name, value.name !== this.name, ' name', this.name) + if (valueIsObject && value.name && value.name !== this.name) { + console.log('[StorageChannel] broadcast name 不同,return function') + return false + } + // 保存||删除 数据 + isSaveData ? save['save_channel.' + channelName] = JSON.stringify(str) : save.removeItem('save_channel.' + channelName) + for (let i = 0, arr = this.listeners[channelName], L = arr.length; i < L; i++) { + try { + arr[i](value) + } catch (e) { + console.error('[StorageChannel] broadcast ', e, this.name) + } + } + } + } + + /** + * 发布数据到其它页面 + * + * @param name + * 命名空间名称 + * @param arguments + * 第二个参数开始是要发布的数据,当只有一个时,如果有多个命名空间名称会共用同一个数据 + * @returns this + */ + postMessage(name) { + const nameList = name.split(' ') + const valList = Array.prototype.slice.call(arguments, 1) + nameList.forEach((name, index) => { + index = valList.length <= 1 ? index % valList.length : index + const value = valList[index] || '' + this.handleMessage(name, value) + }) + + return this + } + + _setItem(entry) { + const setItemEvent = new Event("setItem") + const args = Array.prototype.slice.call(arguments, 1) + const key = args[0] + const value = args[1] + setItemEvent.key = key + setItemEvent.newValue = value + setItemEvent.oldValue = entry.getItem(key) + setItemEvent.storageArea = entry + setItemEvent.url = location.href + Storage.prototype.setItem.apply(entry, args) + window.dispatchEvent(setItemEvent) + } + + /** + * 处理发布数据 + * + * @param name + * 命名空间名称 + * @param value + * 要发布的数据 + * @returns this + */ + handleMessage(name, value) { + console.log('[ StorageChannel ] handleMessage ', name, value, this.name) + const entry = this.entry + if (entry) { + this._setItem(entry, "channel." + name, JSON.stringify(value)) + setTimeout(() => { + entry.removeItem("channel." + name) + }, 0) + } + return this + } + + // 销毁绑定事件 + destroyed() { + this.listeners = {} + window.removeEventListener('storage', this._storageEvent, false) + window.removeEventListener('setItem', this._setItemEvent, false) + window.removeEventListener('load', this._loadEvent, false) + this.delSaveData() + } + + /** + * 注册监听器 + * + * @param name + * 要监听的命名空间 + * @param callback + * 回调函数 + * @returns this + */ + on(name, callback) { + if (name in this.listeners) { + this.listeners[name].push(callback) + } else { + this.listeners[name] = [callback] + } + return this + } + /** + * 注册监听器 只能执行一次 + * + * @param name + * 要监听的命名空间 + * @param callback + * 回调函数 + * @returns this + */ + once(name, callback) { + const cb = (...args) => { + callback(args) + this.off(name, cb) + } + + this.on(name, cb) + return this + } + /** + * 取消监听器 + * + * @param name + * 要取消监听的命名空间 + * @param callback + * 回调函数,如果为空,则取消所有监听函数 + * @returns this + */ + off(name, callback) { + const arr = this.listeners[name] + if (arr) { + if (!callback) { + delete this.listeners[name] + } else { + let i = arr.length + while (i--) { + if (arr[i] === callback) { + arr.splice(i, 1) + } + } + } + } + return this + } +} + +export default StorageChannel \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/CustomPlayer.vue b/frontend/src/components/system/public/utils/CustomPlayer.vue new file mode 100644 index 0000000..0e364e3 --- /dev/null +++ b/frontend/src/components/system/public/utils/CustomPlayer.vue @@ -0,0 +1,303 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/js/websocket/index.js b/frontend/src/components/system/public/utils/js/websocket/index.js new file mode 100644 index 0000000..8b6f8bf --- /dev/null +++ b/frontend/src/components/system/public/utils/js/websocket/index.js @@ -0,0 +1,59 @@ +import WebSockets from './webSockets' +import { EventEmitter } from 'events' + + +WebSockets.defaults.baseURL = import.meta.env.VITE_HOST_NAME +export default class Socket { + constructor(socketSpecs) { + this.isConnect = false + this.events = new EventEmitter() + this.socket = new WebSockets(`/ws/asset/${socketSpecs.name}`) + this._subscribeSocketEvent() + } + + _subscribeSocketEvent() { + const socket = this.socket + socket.on('open', evt => { + this.isConnect = true + this.emit('open', evt) + }) + socket.on('close', evt => { + this.isConnect = false + this.destroy() + }) + socket.on('message', evt => { + this.emit('message', evt) + }) + } + + send(msg) { + // console.log('=============',this.socket&&this.isConnect) + if (this.socket && this.isConnect) { + this.socket._send(msg) + } + } + + close() { + this.socket.close() + } + + destroy() { + this.socket = null + this.events = null + } + + emit(event, callback) { + const events = this.events + return events ? events.emit(event, callback) : nop + } + + on(event, callback) { + const events = this.events + return events ? events.on(event, callback) : nop + } + + off(event, callback) { + const events = this.events + return events ? events.off(event, callback) : nop + } +} \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/js/websocket/webSockets.js b/frontend/src/components/system/public/utils/js/websocket/webSockets.js new file mode 100644 index 0000000..8d10afc --- /dev/null +++ b/frontend/src/components/system/public/utils/js/websocket/webSockets.js @@ -0,0 +1,189 @@ +import { EventEmitter } from 'events' + +const nop = () => {} + +const _getBaseUrl = url => { + const path = url || window.location.origin + const baseURL = _setProtocolHTTPToWS(path) + console.log('[webSocket] _getBaseUrl baseURL:', baseURL) + return baseURL.replace(/\/$/, '') +} + +const _setProtocolHTTPToWS = path => { + const isWS = /^wss?\:/.test(path) + if (isWS) { + return path + } else { + return path.replace(/^https?\:/, /^https:/.test(path) ? 'wss:' : 'ws:') + } +} + +let isPassiveClose = false +let lockReconnect = false + +// websocket 连接检查 +class ConnectChecker { + timeout = 15000 // 毫秒 + timeoutObj = null + serverTimeoutObj = null + reset() { + clearTimeout(this.timeoutObj) + clearTimeout(this.serverTimeoutObj) + return this + } + start(ws) { + this.timeoutObj = setTimeout(() => { + // 这里发送一个心跳,后端收到后,返回一个心跳消息, + // onmessage 拿到返回的心跳就说明连接正常 + let obj = { + toUser: 'test', + message: { + text: 'connect test' + } + } + let str = JSON.stringify(obj) + if (ws.readyState == WebSocket.CLOSED) return + ws.send(str) + // ws.send('connect test') + this.serverTimeoutObj = setTimeout(() => { // 如果超过一定时间还没重置,说明后端主动断开了 + ws.close() // 如果 onclose 会执行 reconnect,我们执行 ws.close() 就行了。如果直接执行 reconnect 会触发 onclose 导致重连两次 + }, this.timeout) + }, this.timeout) + } +} + +class WebSockets { + defaultStore = { + ws: null, + connectChecker: null, + events: null + } + + static defaults = { + baseURL: '' + } + + constructor(url) { + this.store = {...this.defaultStore} + this._init(url) + } + + _init(url) { + const baseURL = _getBaseUrl(WebSockets.defaults.baseURL) + if (!baseURL) return + this.connect(baseURL + this._autoAddPrefix('/', url)) + } + + _subscribeWebSoketEvent(url) { + const ws = this.store.ws + const connectChecker = this.store.connectChecker + + // 连接成功建立的回调方法 + ws.onopen = (event) => { + connectChecker.reset().start(ws) + this.emit('open', event) + } + + // 连接发生错误的回调方法 + ws.onerror = (event) => { + this.emit('err', event) + } + + // 接收到消息的回调方法 + ws.onmessage = (event) => { + const msg = event.data + // console.log(msg); + // console.log('======================================',msg); + const text = JSON.parse(JSON.parse(msg).message).text + connectChecker.reset().start(ws) + if (text !== 'connect test') { + this.emit('message', msg) + } + } + + // 连接关闭的回调方法 + ws.onclose = (event) => { + console.log('[webSocket] onclose event:', event) + this.destroy() + !isPassiveClose && this._reconnect(url) + this.emit('close', event) + } + + window.addEventListener('beforeunload', this._beforeunload(), false) + } + + _reconnect(url) { + if (lockReconnect) return + lockReconnect = true + setTimeout(() => { + this.connect(url) + lockReconnect = false + }, 1000) + } + + _beforeunload() { + const ws = this + this._beforeunload = event => { + console.log('[webSocket] _beforeunload this:', this) + ws && ws.close() + } + return this._beforeunload + } + + _autoAddPrefix(prefix, target) { + console.log('[webSocket] _autoAddPrefix target:', target) + const len = prefix.length + const hasPrefix = target.substr(0, len) === prefix + return hasPrefix ? target : (prefix + target) + } + + // 连接 WebSocket + connect(url) { + try { + this.store.events = new EventEmitter() + this.store.connectChecker = new ConnectChecker() + this.store.ws = new WebSocket(url) + this._subscribeWebSoketEvent(url) + } catch (error) { + this._reconnect(url) + } + } + + _send(meg) { + const ws = this.store.ws + if (ws) { + ws.send(meg) + } + } + + close() { + const ws = this.store.ws + if (ws) { + isPassiveClose = true + ws.close() + } + this.destroy() + } + + destroy() { + window.removeEventListener('beforeunload', this._beforeunload, false) + this.store = this.defaultStore + } + + emit(event, callback) { + const events = this.store.events + return events ? events.emit(event, callback) : nop + } + + on(event, callback) { + const events = this.store.events + return events ? events.on(event, callback) : nop + } + + off(event, callback) { + const events = this.store.events + return events ? events.off(event, callback) : nop + } +} + +export default WebSockets \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/pdf.vue b/frontend/src/components/system/public/utils/pdf.vue new file mode 100644 index 0000000..a0fadd3 --- /dev/null +++ b/frontend/src/components/system/public/utils/pdf.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/recordBultrasoundVideo/Index.vue b/frontend/src/components/system/public/utils/recordBultrasoundVideo/Index.vue new file mode 100644 index 0000000..4e5ec71 --- /dev/null +++ b/frontend/src/components/system/public/utils/recordBultrasoundVideo/Index.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue b/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue new file mode 100644 index 0000000..5100fcb --- /dev/null +++ b/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue @@ -0,0 +1,851 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue b/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue new file mode 100644 index 0000000..671af07 --- /dev/null +++ b/frontend/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue @@ -0,0 +1,469 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/reportTemplate/EditDialog.vue b/frontend/src/components/system/public/utils/reportTemplate/EditDialog.vue new file mode 100644 index 0000000..49f54ef --- /dev/null +++ b/frontend/src/components/system/public/utils/reportTemplate/EditDialog.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/system/public/utils/reportTemplate/Index.vue b/frontend/src/components/system/public/utils/reportTemplate/Index.vue new file mode 100644 index 0000000..29ae065 --- /dev/null +++ b/frontend/src/components/system/public/utils/reportTemplate/Index.vue @@ -0,0 +1,254 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..017bd79 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,31 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +// import Vue from 'vue' +import App from "./App.vue"; +import router from "./router"; +import ElementUI from "element-ui"; +import "element-ui/lib/theme-chalk/index.css"; +import Vue from "./vue-config"; // vue配置扩展 +import { store } from "./store"; +import Print from "./vue-print"; +import * as echarts from 'echarts'; + +Vue.prototype.$echarts = echarts; + +Vue.use(ElementUI); // ElementUI注册 +Vue.use(Print); // 打印注册 +Vue.config.productionTip = false; + +// 设置域名访问时的路径名称 +let pathname = window.location.pathname; +if (/\w+\.html/.test(pathname) && import.meta.env.PROD === "production") { + window.location.pathname = pathname.replace(/\w+\.html/, ""); +} + +/* eslint-disable no-new */ +new Vue({ + el: "#app", + router, + store, + render: (h) => h(App), +}).$mount(); diff --git a/frontend/src/oss/index.js b/frontend/src/oss/index.js new file mode 100644 index 0000000..491f4f6 --- /dev/null +++ b/frontend/src/oss/index.js @@ -0,0 +1,173 @@ +import OSS from 'ali-oss' +import api from '@/api/config' +import { md5Base64 } from '@/vue-config/utils/custom-crypto' + +const ossName = api.OSS_NAME +const endpoint = ossName.replace(/(https:\/\/)(\w*\.)|(\.com)(\/\w*)*/g, '$1$3') +const bucket = ossName.split(/https:\/\/|\.oss/)[1] +console.log('endpoint:', endpoint) +console.log('bucket:', bucket) +const client = OSS({ + // gansu + accessKeyId: "LTAImVN6wtEJLfH1", + accessKeySecret: "lO7FsV3pxSaP6lcd8KP9SsfBIeFhPw", + // hunan + // accessKeyId: "LTAIzVoWY3AdBfOR", + // accessKeySecret: "qsZpfUp7sClQ6ZT9atqFTUgjGtBnvs", + // endpoint: vm.$oss + // endpoint: "https://oss-cn-shenzhen.aliyuncs.com", + endpoint, + bucket +}) +const uploadRequest = (option) => { + console.log('[OSS] uploadRequest() option:', option) + const file = option.file + const data = option.data || {} + const point = file.name.lastIndexOf(".") + const suffix = file.name.substr(point) + const UUID = getUUID(3) + const filePath = data.filePath ? (data.filePath + '/') : '' + const path = ossName.split(/\.com\//)[1] + '/' + filePath + const fileNames = `${path}${UUID}${suffix}` + const reader = new FileReader() + reader.readAsArrayBuffer(file) + reader.onload = function () { + const contents = reader.result + const md5Val = md5Base64(contents) + console.log(md5Val) + uploadType(fileNames, file, { + headers: { + 'Content-Md5': md5Val + }, + progress: async function (p) { + let e = {} + e.percent = p * 100 + option.onProgress(e) + } + }).then(ret => { + console.log(ret) + if (ret.res.statusCode === 200) { + option.onSuccess(ret) + return ret + } + }).catch(err => { + console.log(err) + option.onError("上传失败") + }) + } +} + +const uploadType = (fileNames, file, option) => { + const size = file.size / 1024 / 1024 + if (size <= 50) { + // 普通上传文件 + return client.put(fileNames, file, option) + } else { + // 分片上传文件 + return client.multipartUpload(fileNames, file, option) + } +} + +// 文件上传 +const put = (option) => { + console.log(option) + const file = option.file + const data = option.data || {} + const point = file.name.lastIndexOf(".") + const suffix = file.name.substr(point) + const UUID = getUUID(3) + const filePath = data.filePath ? (data.filePath + '/') : '' + const path = ossName.split(/\.com\//)[1] + '/' + filePath + const fileNames = `${path}${UUID}${suffix}` + console.log(fileNames) + return client.put(fileNames, file.imgData) +} + +// fileName 文件名 +const deleteFile = (fileName) => { + return client.delete(fileName) +} + +// fileNamArr 数组 文件名的数组 +const deleteFileMulti = (fileNameArr) => { + return client.deleteMulti(fileNameArr) +} + +// fileName 文件名 +const downloadFile = (fileUrl, fileName) => { + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') + const Images = new Image() + fileName = fileName || fileUrl.split('/').slice(-1)[0].split(/\?|\#/)[0] + Images.src = fileUrl + '?' + Date.now() + Images.crossOrigin = 'anonymous' + Images.onload = function () { + canvas.width = Images.width + canvas.height = Images.height + context.drawImage(Images, 0, 0, Images.width, Images.height) + const save_link = document.createElement('a') + save_link.href = canvas.toDataURL("image/jpeg") + save_link.download = fileName + save_link.click() + } +} + +// 处理请求失败的情况,防止promise.all中断,并返回失败原因和失败文件名。 +async function handleDel(name, options) { + try { + await client.delete(name) + } catch (error) { + error.failObjectName = name + return error + } +} + +// 删除指定前缀的文件。 +async function deletePrefix(prefix) { + const list = await client.list({ + prefix: prefix, + }) + console.log('[oss] deletePrefix list', list) + list.objects = list.objects || [] + const result = await Promise.all(list.objects.map((v) => handleDel(v.name))) + const state = result.every(item => item === undefined) ? 'success' : 'failed' + console.log('[oss] deletePrefix result', result) + return { state, result } +} + +// 通过设置不同的文件前缀列举不同的目标文件。 +async function listDir(dir) { + const result = await client.list({ + prefix: dir, + // 设置正斜线(/)为文件夹的分隔符。 + delimiter: '/' + }); + // console.log(result); + return result + // result.prefixes.forEach(subDir => { + // console.log('SubDir: %s', subDir); + // }); + // result.objects.forEach(obj => { + // console.log('Object: %s', obj.name); + // }); + +} + +/** + * @name getUUID + * @description 生成一个用不重复的ID + * + */ +function getUUID(randomLength) { + return Number(Math.random().toString().substr(3, randomLength) + Date.now()).toString(36) +} + +export default{ + uploadRequest, + put, + deleteFile, + deleteFileMulti, + downloadFile, + deletePrefix, + listDir +} diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..7393df5 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,505 @@ +import Vue from "vue"; +import Router from "vue-router"; + +// ===================================== 登录 ===================================== +const BmodeLogin = res => + import(/* webpackChunkName: "group-Login" */ "@/components/BmodeLogin.vue"); +const ForgottenPassword = res => + import( + /* webpackChunkName: "group-Login" */ "@/components/ForgottenPassword.vue" + ); + +// ===================================== 医院注册 ===================================== +const HospitalRequire = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRequire.vue" + ); +const HospitalRegister = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRegister.vue" + ); +const HospitalRegisterDetails = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRegisterDetails.vue" + ); + +// ===================================== 医生注册 ===================================== +const DoctorRegister = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/doctor/DoctorRegister.vue" + ); + +// ===================================== 系统 ===================================== +const Index = res => + import( + /* webpackChunkName: "group-system'" */ "@/components/system/Index.vue" + ); + +// ===================================== 公共组件 ===================================== +const BultrasoundWindow = res => + import( + /* webpackChunkName: "group-system-public" */ "@/components/system/public/bultrasound/BultrasoundWindow.vue" + ); + +const LargeScreenDataStatis = res => import( + /* webpackChunkName: "group-system-public" */ "@/components/system/public/largeScreenDataStatis/Index.vue" + ); + +// ===================================== 管理医院 ===================================== +// 医院管理 +const ApplyInfoManage = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/ApplyInfoManage.vue" + ); +const ApplyInfoManageDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/ApplyInfoManageDetails.vue" + ); +const AllHospitalInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/AllHospitalInfo.vue" + ); +const AllHospitalInfoDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/AllHospitalInfoDetails.vue" + ); +const MgSummarySheet = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/MgSummarySheet.vue" + ); +// 专家管理 +const ExpertBlacklist = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertBlacklist.vue" + ); +const ExpertBlacklistDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue" + ); +const ExpertAudit = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertAudit.vue" + ); +const ExpertAuditDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertAuditDetails.vue" + ); +const ExpertList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertList.vue" + ); +const ExpertListAdd = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertListAdd.vue" + ); +const ExpertListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertListDetails.vue" + ); +// 科室管理 +const MgSectionList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/H-sectionmanage/MgSectionList.vue" + ); +// 账号管理 +const AdministratorList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorList.vue" + ); +const AdministratorListAdd = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorListAdd.vue" + ); +const AdministratorListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorListDetails.vue" + ); +const MgChangePassword = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/MgChangePassword.vue" + ); +// 远程超声 +const MgBultrasoundList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundList.vue" + ); +const MgBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue" + ); +const MgBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue" + ); +const MgBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue" + ); +const MgBultrasoundInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue" + ); +const MgBultrasoundFollowUpEntry = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue" + ); + +// ===================================== 基层医院 ===================================== +// 医院管理 +const MbHospitalInfo = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbHospitalInfo.vue" + ); +const MbHospitalInfoUpdate = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbHospitalInfoUpdate.vue" + ); +const MbSummarySheet = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbSummarySheet.vue" + ); +// 远程超声 +const MbBultrasoundApply = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundApply.vue" + ); +const MbBultrasoundList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundList.vue" + ); +const MbBultrasoundListEdit = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue" + ); +const MbBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue" + ); +const MbBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundRecord.vue" + ); +const MbBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue" + ); +const MbBultrasoundInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/member/O-bultrasound/MbBultrasoundInfo.vue" + ); +// 医生管理 +const DoctorBlacklist = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorBlacklist.vue" + ); +const DoctorBlacklistDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue" + ); +const DoctorAudit = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorAudit.vue" + ); +const DoctorAuditDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorAuditDetails.vue" + ); +const DoctorList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorList.vue" + ); +const DoctorListAdd = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorListAdd.vue" + ); +const DoctorListDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorListDetails.vue" + ); +// 科室管理 +const MbSectionList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/I-sectionmanage/MbSectionList.vue" + ); +// 账号管理 +const MbChangePassword = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/J-accountmanage/MbChangePassword.vue" + ); + +// ===================================== 上级专家 ===================================== +// 个人信息 +const EpChangeMaterials = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/E-personaldata/EpChangeMaterials.vue" + ); +const EpChangePassword = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/E-personaldata/EpChangePassword.vue" + ); +// 远程超声 +const EpMultiConsultation = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpMultiConsultation.vue" + ); +const EpMultiConsultationDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue" + ); +const EpBultrasoundList = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundList.vue" + ); +const EpBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue" + ); +const EpBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue" + ); +const EpBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue" + ); +const EpBultrasoundListDetailsOffline = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue" + ); +const EpBultrasoundReportTemplate = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue" + ); + +// ===================================== 基层医生 ===================================== +// 远程超声 +const DocBultrasoundApply = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue" + ); +const DocBultrasoundList = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundList.vue" + ); +const DocBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue" + ); +const DocBultrasoundListEdit = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue" + ); +const DocBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue" + ); +const DocBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue" + ); +// 个人数据 +const DocChangeMaterials = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/F-personaldata/DocChangeMaterials.vue" + ); +const DocChangePassword = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/F-personaldata/DocChangePassword.vue" + ); + +Vue.use(Router); +export default new Router({ + routes: [ + { path: "/", name: "BmodeLogin", component: BmodeLogin }, + { + path: "/forgottenPassword", + name: "ForgottenPassword", + component: ForgottenPassword + }, + // 医院注册 + { + path: "/hospitalRequire", + name: "HospitalRequire", + component: HospitalRequire + }, + { + path: "/hospitalRegister", + name: "HospitalRegister", + component: HospitalRegister + }, + { + path: "/hospitalRegisterDetails", + name: "HospitalRegisterDetails", + component: HospitalRegisterDetails, + props: { isApply: true } + }, + // 医生注册 + { + path: "/doctorRegister", + name: "DoctorRegister", + component: DoctorRegister + }, + // 公共组件 + { + path: "/bultrasoundWindow/:id", + name: "bultrasoundWindow", + component: BultrasoundWindow, + props: true + }, + // { + // path: "/largeScreenDataStatis", + // name: "LargeScreenDataStatis", + // component: LargeScreenDataStatis, + // props: true + // }, + // 系统主页 + // 基层医生 + { + path: "/doctor", + component: Index, + redirect: "/docBultrasoundList", + children: [ + { path: "/docBultrasoundApply", component: DocBultrasoundApply }, + { path: "/docBultrasoundList", component: DocBultrasoundList }, + { + path: "/docBultrasoundListDetails", + component: DocBultrasoundListDetails + }, + { path: "/docBultrasoundListEdit", component: DocBultrasoundListEdit }, + { path: "/docBultrasoundRecord", component: DocBultrasoundRecord }, + { + path: "/docBultrasoundRecordDetails", + component: DocBultrasoundRecordDetails + }, + + { path: "/docChangeMaterials", component: DocChangeMaterials }, + { path: "/docChangePassword", component: DocChangePassword } + ] + }, + // 管理医院 + { + path: "/manager", + component: Index, + redirect: "/mgBultrasoundList", + children: [ + { path: "/applyInfoManage", component: ApplyInfoManage }, + { path: "/applyInfoManageDetails", component: ApplyInfoManageDetails }, + { path: "/allHospitalInfo", component: AllHospitalInfo }, + { path: "/allHospitalInfoDetails", component: AllHospitalInfoDetails }, + { path: "/mgSummarySheet", component: MgSummarySheet }, + + { path: "/expertBlacklist", component: ExpertBlacklist }, + { path: "/expertAudit", component: ExpertAudit }, + { path: "/expertAuditDetails", component: ExpertAuditDetails }, + { path: "/expertList", component: ExpertList }, + { path: "/expertListDetails", component: ExpertListDetails }, + { path: "/expertListAdd", component: ExpertListAdd }, + { path: "/expertBlacklistDetails", component: ExpertBlacklistDetails }, + + { path: "/mgSectionList", component: MgSectionList }, + + { path: "/administratorList", component: AdministratorList }, + { path: "/administratorListAdd", component: AdministratorListAdd }, + { path: "/mgChangePassword", component: MgChangePassword }, + { + path: "/administratorListDetails", + component: AdministratorListDetails + }, + + { path: "/mgBultrasoundList", component: MgBultrasoundList }, + { + path: "/mgBultrasoundListDetails", + component: MgBultrasoundListDetails + }, + { path: "/mgBultrasoundRecord", component: MgBultrasoundRecord }, + { + path: "/mgBultrasoundRecordDetails", + component: MgBultrasoundRecordDetails + }, + { path: "/mgBultrasoundInfo", component: MgBultrasoundInfo }, + { path: "/largeScreenDataStatis", component: LargeScreenDataStatis }, + { + path: "/ultrasoundFollowUpEntry", + component: MgBultrasoundFollowUpEntry + } + ] + }, + // 基层医院 + { + path: "/member", + component: Index, + redirect: "/mbBultrasoundList", + children: [ + { path: "/mbBultrasoundApply", component: MbBultrasoundApply }, + { path: "/mbBultrasoundList", component: MbBultrasoundList }, + { path: "/mbBultrasoundListEdit", component: MbBultrasoundListEdit }, + { + path: "/mbBultrasoundListDetails", + component: MbBultrasoundListDetails + }, + { path: "/mbBultrasoundRecord", component: MbBultrasoundRecord }, + { + path: "/mbBultrasoundRecordDetails", + component: MbBultrasoundRecordDetails + }, + { path: "/mbBultrasoundInfo", component: MbBultrasoundInfo }, + + { path: "/mbHospitalInfo", component: MbHospitalInfo }, + { path: "/mbHospitalInfoUpdate", component: MbHospitalInfoUpdate }, + { path: "/mbSummarySheet", component: MbSummarySheet }, + + { path: "/mbSectionList", component: MbSectionList }, + + { path: "/mbChangePassword", component: MbChangePassword }, + + { path: "/doctorBlacklist", component: DoctorBlacklist }, + { path: "/doctorBlacklistDetails", component: DoctorBlacklistDetails }, + { path: "/doctorAudit", component: DoctorAudit }, + { path: "/doctorAuditDetails", component: DoctorAuditDetails }, + { path: "/doctorList", component: DoctorList }, + { path: "/doctorListDetails", component: DoctorListDetails }, + { path: "/doctorListAdd", component: DoctorListAdd } + ] + }, + // 专家 + { + path: "/expert", + component: Index, + redirect: "/epBultrasoundList", + children: [ + { path: "/epMultiConsultation", component: EpMultiConsultation }, + { + path: "/epMultiConsultationDetails", + component: EpMultiConsultationDetails + }, + { path: "/epBultrasoundList", component: EpBultrasoundList }, + { + path: "/epBultrasoundListDetails", + component: EpBultrasoundListDetails + }, + { path: "/epBultrasoundRecord", component: EpBultrasoundRecord }, + { + path: "/epBultrasoundRecordDetails", + component: EpBultrasoundRecordDetails + }, + { + path: "/epBultrasoundListDetailsOffline", + component: EpBultrasoundListDetailsOffline + }, + { + path: "/epBultrasoundReportTemplate", + component: EpBultrasoundReportTemplate + }, + + { path: "/epChangeMaterials", component: EpChangeMaterials }, + { path: "/epChangePassword", component: EpChangePassword } + ] + }, + // 重定向 + { + path: "*", + redirect: "/" + } + ] + // mode: 'history' +}); diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js new file mode 100644 index 0000000..ed8becd --- /dev/null +++ b/frontend/src/store/index.js @@ -0,0 +1,28 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +Vue.use(Vuex) + +export const store = new Vuex.Store({ + state: { + socket: null, + docAccount: null + }, + getters: { + getSocket: state => { + return state.socket + }, + getDocAccount: state => { + return state.docAccount + } + }, + mutations: { + webSocketInit(state, socket) { + state.socket = socket + }, + setDocAccount(state, docAccount) { + state.docAccount = docAccount + } + }, + +}) \ No newline at end of file diff --git a/frontend/src/vue-config/custom-components/Aliplayer.vue b/frontend/src/vue-config/custom-components/Aliplayer.vue new file mode 100644 index 0000000..db968d8 --- /dev/null +++ b/frontend/src/vue-config/custom-components/Aliplayer.vue @@ -0,0 +1,439 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/vue-config/index.js b/frontend/src/vue-config/index.js new file mode 100644 index 0000000..1641b73 --- /dev/null +++ b/frontend/src/vue-config/index.js @@ -0,0 +1,617 @@ +import Vue from "vue" +import router from '../router' +import Axios from 'axios' +import api from '../api/config' +import Moment from 'moment' +import OssApi from '../oss' +import { MessageBox } from 'element-ui' +import { isFunction, isPlainObject, prefix , drag } from './utils/index.js' +import { merge, set, unset, get } from "lodash" +import Viewer from 'viewerjs' +import 'viewerjs/dist/viewer.css' + +const $isProxy = true +const $isProduction = import.meta.env.PROD + +Vue.use(drag) + +// 组件配置 自定义组件添加install方法用Vue.use()插入到原型 start + +import Aliplayer from './custom-components/Aliplayer.vue' +Vue.use({ + install: function(Vue) { + Vue.component('Aliplayer', Aliplayer); + } +}) + +// 组件配置 自定义组件添加install方法用Vue.use()插入到原型 end + +const $extends = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false + if (typeof target === "boolean") { + deep = target + target = arguments[i] || {}; + i++ + } + if (typeof target !== "object" && !isFunction(target)) { + target = {} + } + if (i === length) { + target = this + i-- + } + for (; i < length; i++) { + if ((options = arguments[i]) != null) { + for (name in options) { + src = target[name] + copy = options[name] + if (target === copy) { + continue + } + if (deep && copy && (isPlainObject(copy) || + (copyIsArray = Array.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false + clone = src && Array.isArray(src) ? src : [] + } else { + clone = src && isPlainObject(src) ? src : {} + } + target[name] = $extends(deep, clone, copy) + } else if (copy !== undefined && copy !== null) { + target[name] = copy + } + } + } + } + return target; +} + +Vue.prototype.$extends = $extends + +// axios 配置 start +Axios.defaults.baseURL = $isProduction || !$isProxy ? api.HOST_NAME : '/imurs' + +// 设置请求头 +Axios.defaults.headers = { + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' +} + +// 设置提交数据的格式 +Axios.defaults.transformRequest = [function (data,headers) { + const contentType = headers['Content-Type'].toLocaleLowerCase() + if (contentType === 'application/json;charset=utf-8') { + return JSON.stringify(data) + } else if (contentType === 'application/x-www-form-urlencoded;charset=utf-8') { + let ret = '' + for (let it in data) { + ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' + } + return ret + } + return data +}] + +// 设置跨域 +Axios.defaults.withCredentials = true + +// 设置request 拦截器 +Axios.interceptors.request.use(config => { + return config +}, error => { + return Promise.reject(error) +}) + +// 设置response 拦截器 +let isAlert = false +let isErrAlert = false +Axios.interceptors.response.use(res => { + console.log('[ Axios interceptors ]', res) + console.log('[ Axios interceptors ]', res.data) + switch (res.data.msg) { + case '1001': + !isAlert && (MessageBox.alert('您的账号在其它地方登录,如非本人操作,请立即修改密码!!!', '消息提示', { + confirmButtonText: '确定', + callback(){ + router.replace({ path: 'login' }) + isAlert = false + } + }), + isAlert = true) + break + case '1002': + !isAlert && (MessageBox.alert('您的账号未登录或登录已失效,请重新登录!!!', '消息提示', { + confirmButtonText: '确定', + callback() { + router.replace({ path: 'login' }) + isAlert = false + } + }), + isAlert = true) + break + default: '' + } + return res +}, err => { + console.log('[ Axios interceptors ]', err) + !$isProduction && !isErrAlert && (MessageBox.alert('页面请求失败。', '消息提示', { + confirmButtonText: '确定', + callback() { + isErrAlert = false + } + }), + isErrAlert = true) + if (err.response) { + switch (err.response.status) { + // case 401: + // 返回 401 清除token信息并跳转到登录页面 + // router.replace({ + // path: 'login', + // query: { redirect: router.currentRoute.fullPath } + // }) + } + } + return Promise.reject(err) // 返回接口返回的错误信息 +}) +export const axios = Axios +// Vue.prototype.$axios = axios +// axios 配置 end + +/** + * @function + * @description 将options对象或数组中的不为空或者未定义属性值赋给target对象中已存在的对象或数组 + * @name $axiosDataClone + * @param {Object,Array} target 需要给属性赋值的target对象或数组 + * @param {Object,Array} options 需要被克隆属性值的options对像或数组(从第二个参数开始或者第二个参数至倒数第二个都是被克隆的对象或数组) + * @param {Object} replaceAttrs 需要被克隆属性值与target对像属性值不相同,可传入以被克隆的键与target对像的键为键和值的对象作为桥接; + * 对象必须属性replaceAttr,以此判断是否为桥接对象(参数为最后一个对象) + * @returns {Object,Array} target 返回目标对象 + * + */ +export const $axiosDataClone = function() { + let options, src, copy, copyIsArray, clone, deep + options = src = copy = copyIsArray = clone = undefined + deep = false + let target = arguments[0] + let length = arguments.length + let i = 1 + let replaceAttrs = arguments[length - 1] + let isReplaceAttr = isPlainObject(replaceAttrs) && replaceAttrs.replaceAttr + if (isReplaceAttr) { + length = length - 1 + } + if (typeof target === "boolean") { + deep = target + target = arguments[i] + i++ + } + if (i >= length) { + console.error(['', + '缺少参数,必须传入两个或者两个以上的参数!!!', + '缺少参数,必须传入三个或者三个以上的参数!!!' + ][i]) + return target + } + for ( ; i < length; i++ ) { + if ((options = arguments[i]) != null) { + if ( (!isPlainObject(target) || !isPlainObject(options)) && (!Array.isArray(target) || !Array.isArray(options)) ) { + console.warn('参数类型错误,请传入参数类型都相同的对象或数组!!!') + return target + } + for (let attr in options) { + src = target[attr] + copy = options[attr] + + if (isReplaceAttr && replaceAttrs[attr] !== undefined) { + attr = replaceAttrs[attr] + src = target[attr] + } + + if ((!Array.isArray(target) && !target.hasOwnProperty(attr)) || target === copy || src === copy) { + continue + } + + if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false + clone = src && Array.isArray(src) ? src : [] + } else { + clone = src && isPlainObject(src) ? src : {} + } + target[attr] = $axiosDataClone(deep, clone, copy) + } else if (copy !== undefined) { + target[attr] = copy + } + } + } + } + return target +} + +let $statuChange= (e,id)=> { + if(e==1){ return '待医院审核'} + else if(e==2){ return '等待接收'} + else if(e==3){ + if(id=='doc'){ + return '待医生接收' + }else{ + return '待专家接收' + } + } + else if(e==4){ return '已接收'} + else if(e==5){ return '已就诊'} + else if(e==6){ return '已住院'} + else if(e==7){ return '未就诊'} + else if(e==8){ return '已撤销'} + else if(e==9){ return '本医院撤销'} +} +let $protectTypeChange = (e)=>{ + if(e==1){ return '省医保'} + else if(e==2){ return '市职工医保'} + else if(e==3){ return '市居民医保'} + else if(e==4){ return '新农合'} + else if(e==5){ return '自费'} + else if(e==6){ return '异地医保'} + else if(e==7){ return '其他'} +} + +// imageLoaded start +let $imageLoaded = imgUrl => { + return new Promise((resolve, reject) => { + let search = !(/^(http\:|https\:)/.test(imgUrl)) ? '' : '?' + Math.ceil(Math.random() + 1000) + let image = new Image() + image.crossOrigin = 'anonymous' + image.src = imgUrl + search + image.complete ? resolve(image) : + (image.onload = res => { + resolve(image) + }, + image.onerror = res => { + reject(res) + }) + }) +} +// imageLoaded end + +// renderOffscreen (离屏渲染) start +let $renderOffscreen = ({ width = 800, height = 600, elementId = 'canvas', draw }) => { + const canvas = document.createElement('canvas') + const renderCanvas = document.getElementById(elementId) + canvas.width = renderCanvas.width = width + canvas.height = renderCanvas.height = height + typeof draw === 'function' && draw(canvas.getContext('2d')) + renderCanvas.getContext('2d').drawImage(canvas, 0, 0, width, height) +} +// renderOffscreen (离屏渲染) end + +// getBase64 获取base64 start +let $getBase64 = ({ width = 800, height = 600, type = 'image/png', image }) => { + let canvas = document.createElement('canvas') + canvas.width = image.width || width + canvas.height = image.height || height + let context = canvas.getContext("2d") + context.drawImage(image, 0, 0, canvas.width, canvas.height) + let stream = canvas.toDataURL(type) + canvas.remove() + console.log(stream); + + return stream +} +// getBase64 获取base64 end + +// base64ToBlob base64 转 Blob 二进制 start +let $base64ToBlob = (urlData) => { + let arr = urlData.split(',') + let mime = arr[0].match(/:(.*?);/)[1] + // 去掉url的头,并转化为byte + let byteString = window.atob(arr[1]) + // 处理异常,将ascii码小于0的转换为大于0 + let arrayBuffer = new ArrayBuffer(byteString.length) + // 生成视图(直接针对内存):8位无符号整数,长度1个字节 + let u8arr = new Uint8Array(arrayBuffer) + for (let i = 0; i < byteString.length; i++) { + u8arr[i] = byteString.charCodeAt(i) + } + return new Blob([u8arr], { + type: mime + }) +} +// base64ToBlob base64 转 Blob 二进制 end + +// imageToBlob image 转 Blob 二进制 start +let $imageToBlob = ({ width = 800, height = 600, type = 'image/png', image }) => { + let canvas = document.createElement('canvas') + canvas.width = image.width || width + canvas.height = image.height || height + let context = canvas.getContext("2d") + context.drawImage(image, 0, 0, canvas.width, canvas.height) + let stream = canvas.toDataURL(type) + canvas.remove() + console.log(stream); + + return $base64ToBlob(stream) // 调用base64转图片方法 +} +// imageToBlob image 转 Blob 二进制 end + +// createURL start +let $createURL = (config) => { + if (config.image instanceof Blob) { + return URL.createObjectURL(config.image) + } else if (config.image instanceof Image || config.image instanceof HTMLVideoElement) { + return URL.createObjectURL($imageToBlob(config)) + } else if (typeof config.image === 'string' && /^data:image\/([a-zA-Z]+);base64,/.test(config.image)) { + return URL.createObjectURL($base64ToBlob(config.image)) + } + return 'param 不合法' +} +// createURL end + +// download file(下载文件) start +let $downloadFile = (urlData, name) => { + urlData = urlData && /^data:(.+?);base64,/.test(urlData) ? $base64ToBlob(urlData) : urlData + console.log(urlData) + let save_link = document.createElement('a') + save_link.href = /https?/.test(urlData) ? urlData : URL.createObjectURL(urlData) + save_link.download = name || (location.hostName + '-' + Date.now()) + save_link.click() +} +// download file(下载文件) end + +let $isPC = true +let userAgentInfo = navigator.userAgent +let Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"] +for (let v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + $isPC = false + break + } +} + +// 关闭页面之前事件 start +const $beforeunload = (() => { + const CACHE = [] + window.addEventListener('beforeunload', () => { + CACHE.forEach(cb => typeof cb === 'function' && cb(e)) + }) + return (callback) => { + CACHE.push(callback) + } +})() +// 关闭页面之前事件 end + +// 关闭页面事件 start +const $unload = (() => { + const CACHE = [] + let time = 0 + window.addEventListener('beforeunload', () => { + time = Date.now() + }) + window.addEventListener('unload', (e) => { + const diffTime = Date.now() - time + if (diffTime < 2) { + CACHE.forEach(cb => typeof cb === 'function' && cb(e)) + } + }) + return (callback) => { + CACHE.push(callback) + } +})() +// 关闭页面事件 end + +// 获取指定日期之前的某一天 start +const $getDateBefore = (days, date) => { + const _date = date ? new Date(date) : new Date(); + _date.setDate(_date.getDate() - days); + return _date; +} +// 获取指定日期之前的某一天 end + +// 生成完整 OSS URL start +const $generateOssURL = (url) => { + const baseURL = api.OSS_ASSET_NAME.replace(/\/$/, ''); + if (url) { + return /^(https?)|(blob)/.test(url) ? url : `${baseURL}/${url.replace(/^\//, '')}` + } else { + return '' + } +} +// 生成完整 OSS URL end + +// 删除基地址 +const $delbaseURL = (path, baseURL = api.OSS_ASSET_NAME) => { + baseURL = baseURL.replace(/\/*$/, '/'); + if (path) { + const reg = new RegExp(`^${baseURL}`); + return /^(https?)|(blob)/.test(path) ? path.replace(reg, '') : path; + } else { + return ''; + } +} +// 删除基地址 + +// 用户信息类 start +const $user = new class { + constructor() { + const user = sessionStorage.getItem('user') + merge(this, user) + } + + save() { + sessionStorage.setItem('user', this) + } + + add(...agrs) { + if (agrs.length == 0) throw '缺少参数!'; + merge(this, ...agrs) + this.save() + // console.log('[vue-config/index.js] $user.add() $user:', this, 'agrs:', agrs) + } + + setItem(path, value) { + set(this, path, value) + this.save() + } + + getItem(path, defaultValue) { + return get(this, path, defaultValue) + } + + removeItem(path) { + const result = unset(this, path) + this.save() + return result + } + + clear() { + Object.keys(this).forEach(key => { + delete this[key] + }) + this.save() + console.log('[vue-config/index.js] $user.clear() $user:', this) + } +} +// 用户信息类 end + +// 系统信息类 start +const $system = new class { + constructor() { + this.init() + } + + init() { + const system = localStorage.getItem('system') + merge(this, system) + // $beforeunload(() => { + // this.save() + // }) + window.addEventListener('beforeunload', () => { + this.save() + }) + } + + save() { + localStorage.setItem('system', this) + } + + add(...agrs) { + if (agrs.length == 0) throw '缺少参数!'; + merge(this, ...agrs) + this.save() + // console.log('[vue-config/index.js] $system.add() $system:', this, 'agrs:', agrs) + } + + setItem(path, value) { + set(this, path, value) + this.save() + } + + getItem(path, defaultValue) { + return get(this, path, defaultValue) + } + + removeItem(path) { + const result = unset(this, path) + this.save() + return result + } + + clear() { + Object.keys(this).forEach(key => { + delete this[key] + }) + this.save() + console.log('[vue-config/index.js] $system.clear() $system:', this) + } +} +// 系统信息类 end + +// 退出系统的方法 start +const handleLogout = res => { + router.push({ name: 'BmodeLogin' }) + $user.clear() + sessionStorage.clear() +} +const $logout = () => { + return Axios.post('/shiro/logout').then(res => { + + }).catch(err => { + console.error(err) + }).finally(res => { + handleLogout() + console.log('[vue-config] $logout finally') + }) +} +// 退出系统的方法 end + +// 创建 uid start +const $createUID = (min = 1000000001, max = 4294967295) => { + min = Math.ceil(min) + max = Math.floor(max) + return Math.floor(Math.random() * (max - min + 1)) + min +} +// 创建 uid end + +Vue.prototype.$extends({ + // 关闭页面之前事件 + $beforeunload, + // 关闭页面事件 + $unload, + // 用户信息类 + $user, + // 系统信息类 + $system, + // 判断运行环境 是否为生产环境 + $isProduction, + // axios 配置 + $axios: Axios, + // axios data属性值clone + $axiosDataClone, + // oss上传API name + $ossName: api.OSS_NAME, + // oss上传API 方法 + $ossApi: OssApi, + // oss读取文件 name + $ossAssetName: api.OSS_ASSET_NAME, + // 生成完整 OSS URL start + $generateOssURL, + // 删除基地址 + $delbaseURL, + // 日期格式方法 + $moment: Moment, + // 转诊状态转换 + $statuChange, + // 医保类型转换 + $protectTypeChange, + // 域名 + $hostName: api.HOST_NAME, + // renderOffscreen (离屏渲染) + $renderOffscreen, + // 获取base64 + $getBase64, + // base64 转 Blob 二进制 + $base64ToBlob, + // image 转 Blob 二进制 + $imageToBlob, + // createURL + $createURL, + // imageloaded 图片加载完毕函数 + $imageLoaded, + // download file(下载文件) + $downloadFile, + // 添加前缀(下载文件) + $prefix: prefix, + // 是否PC端 + $isPC, + // 退出系统的方法 + $logout, + // 创建 uid 的方法 + $createUID, + // 获取指定日期之前的某一天 + $getDateBefore, + // 图片查看器 + $viewer: Viewer +}) +export default Vue diff --git a/frontend/src/vue-config/utils/custom-crypto.js b/frontend/src/vue-config/utils/custom-crypto.js new file mode 100644 index 0000000..537b5c9 --- /dev/null +++ b/frontend/src/vue-config/utils/custom-crypto.js @@ -0,0 +1,111 @@ +import CryptoJS from 'crypto-js' +import JSEncrypt from 'jsencrypt' + +function stringToArrayBuffer(string) { + const encoder = new TextEncoder(); + return encoder.encode(string).buffer; +} + +function md5Hex(data) { + const words = typeof data === 'string' ? stringToArrayBuffer(data) : data; + const wordArray = CryptoJS.lib.WordArray.create(words) + return CryptoJS.MD5(wordArray).toString(CryptoJS.enc.Hex) +} + +function md5Base64(data) { + const words = typeof data === 'string' ? stringToArrayBuffer(data) : data; + const wordArray = CryptoJS.lib.WordArray.create(words) + return CryptoJS.MD5(wordArray).toString(CryptoJS.enc.Base64) +} + +function aesEncrypt(data, key = import.meta.env.VITE_AES_KEY) { + const encrypted = CryptoJS.AES.encrypt( + JSON.stringify(data), + key + ).toString() + return encrypted +} + +function aesDecrypt(encrypted, key = import.meta.env.VITE_AES_KEY) { + const bytes = CryptoJS.AES.decrypt(encrypted, key) + const decrypted = bytes.toString(CryptoJS.enc.Utf8) + return JSON.parse(decrypted) +} + +// 更安全的 AES 加密 +function secureAESEncrypt(data, password = import.meta.env.VITE_AES_KEY) { + // crypto-js + // 生成随机盐值 + const salt = CryptoJS.lib.WordArray.random(128/8) + + // 使用 PBKDF2 派生密钥 + const key = CryptoJS.PBKDF2(password, salt, { + keySize: 256/32, + iterations: 1000 + }) + + // 生成随机 IV + const iv = CryptoJS.lib.WordArray.random(128/8) + + // 加密 + const encrypted = CryptoJS.AES.encrypt( + JSON.stringify(data), + key, + { iv: iv } + ) + + // 组合 salt, iv 和密文 + const result = salt.toString() + iv.toString() + encrypted.toString() + return result +} + +// 更安全的 AES 解密 +function secureAESDecrypt(encrypted, password = import.meta.env.VITE_AES_KEY) { + // crypto-js + // 提取 salt (前 32 个字符) + const salt = CryptoJS.enc.Hex.parse(encrypted.substr(0, 32)) + + // 提取 iv (接下来的 32 个字符) + const iv = CryptoJS.enc.Hex.parse(encrypted.substr(32, 32)) + + // 提取实际密文 + const ciphertext = encrypted.substring(64) + + // 派生密钥 + const key = CryptoJS.PBKDF2(password, salt, { + keySize: 256/32, + iterations: 1000 + }) + + // 解密 + const decrypted = CryptoJS.AES.decrypt( + ciphertext, + key, + { iv: iv } + ) + + return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8)) +} + +function rsaPublicKeyEncrypt(data, pubKey = import.meta.env.VITE_RSA_PUBKEY) { + const encrypt = new JSEncrypt() + encrypt.setPublicKey(pubKey) + return encrypt.encrypt(data) +} + +function rsaPublicKeyDecrypt(data, pubKey = import.meta.env.VITE_RSA_PUBKEY) { + const encrypt = new JSEncrypt() + encrypt.setPublicKey(pubKey) + return encrypt.decrypt(data) +} + +export { + md5Hex, + md5Base64, + aesEncrypt, + aesDecrypt, + secureAESEncrypt, + secureAESDecrypt, + rsaPublicKeyEncrypt, + rsaPublicKeyDecrypt, +} \ No newline at end of file diff --git a/frontend/src/vue-config/utils/drag.js b/frontend/src/vue-config/utils/drag.js new file mode 100644 index 0000000..d6ce8c1 --- /dev/null +++ b/frontend/src/vue-config/utils/drag.js @@ -0,0 +1,215 @@ + +const drag = (el, binding, vnode) => { + console.log('el', el) + console.log('binding', binding) + console.log('vnode', vnode) + let nullObj = Object.create(null) + const $this = nullObj + const options = binding.value + const { minW, minH, isParent } = { ...options } // 元素最小可视宽高 + const parentEl = el.parentNode + const positions = {} + {({ top: positions.top, right: positions.right, bottom: positions.bottom, left: positions.left } = { ...options})} + // console.log('[drag] parentEl', nullObj, positions) + // console.log('[drag] parentEl', parentEl, 'innerWidth', innerWidth, 'innerHeight', innerHeight) + return Object.assign(nullObj, { + x: 0, + y: 0, + minX: 0, + minY: 0, + maxX: 0, + maxY: 0, + diffX: 0, // 元素内鼠标的点到元素最左边的距离 + diffY: 0, // 元素内鼠标的点到元素最上边的距离 + init() { + // console.log('[drag] init x', this.x, 'y', this.y) + $this.setStyle() + $this.setMaxXY() + $this.setXY() + $this.setTranslate() + $this.setMaxXY(minW, minH) + }, + resizeEvent() { // 窗口 change 事件 + console.log('[drag] resizeEvent') + $this.setMaxXY(minW, minH) + $this.setTranslate() + }, + setStyle() { // 设置样式 + let position = 'fixed' + if (isParent) { + Object.assign(parentEl.style, { + position: 'relative', + overflow: 'hidden' + }) + position = 'absolute' + } + Object.assign(el.style, { + position: position, + top: '0', + left: '0', + right: 'initial', + bottom: 'initial', + cursor: 'move', + }) + }, + setXY() { // 设置 x y + let x = 0 + let y = 0 + Object.keys(positions).forEach(name => { + const value = isNaN(positions[name]) ? positions[name] : positions[name] + 'px' + if (!value) { + return false + } + switch (name) { + case 'top': + y = $this.getWH(value, 'height') + y = y > $this.maxY ? $this.maxY : y < $this.minY ? $this.minY : y + break; + case 'bottom': + y = $this.maxY - $this.getWH(value, 'height') + y = y > $this.maxY ? $this.maxY : y < $this.minY ? $this.minY : y + break; + case 'left': + x = $this.getWH(value, 'width') + x = x > $this.maxX ? $this.maxX : x < $this.minX ? $this.minX : x + break; + case 'right': + x = $this.maxX - $this.getWH(value, 'width') + x = x > $this.maxX ? $this.maxX : x < $this.minX ? $this.minX : x + break; + + default: + x = $this.maxX + y = $this.maxY + break; + } + }) + $this.x = el.__vOriginalX || x + $this.y = el.__vOriginalY || y + // console.log('[drag] setXY') + }, + setMaxXY(minW, minH) { // 设置最大的 x y + const { innerWidth, innerHeight } = this.getWrapperWH() + const elStyle = getComputedStyle(el) + const elWidth = $this.getWH(elStyle.width, 'width') + const elHeight = $this.getWH(elStyle.height, 'height') + // console.log('[drag] setMaxXY elWidth', elWidth, 'elHeight', elHeight) + minW = isNaN(minW) || minW >= elWidth ? 0 : elWidth - minW + minH = isNaN(minH) || minH >= elHeight ? 0 : elHeight - minH + $this.minX = 0 - minW + $this.minY = 0 - minH + $this.maxX = innerWidth - elWidth + minW + $this.maxY = innerHeight - elHeight + minH + // console.log('[drag] setMaxXY $this.maxX', $this.maxX, '$this.maxY', $this.maxY) + }, + getWH(value, key) { + const { innerWidth, innerHeight } = this.getWrapperWH() + const num = value.toString().replace(/^(\d*.?\d*)(\w{2}|%|vw|vh)/g, (val, num, str) => { + // console.log('[drag] getWH num', num, 'str', str, 'val', val) + return str === 'px' ? num : num / 100 * ({ + width: innerWidth, + height: innerHeight + })[key] + }) + // console.log('[drag] getWH num', num, 'value', value) + return parseInt(num) + }, + getTranslate(minX, minY, maxX, maxY) { // 获取在条件范围内的 x y + // console.log('[drag] getTranslate') + return (x, y) => { + x = x < minX ? minX : (x > maxX ? maxX : x) + y = y < minY ? minY : (y > maxY ? maxY : y) + return { x, y } + } + }, + setTranslate() { // 设置 translate 的 x y + const { minX, minY, maxX, maxY } = $this + const { x, y } = $this.getTranslate(minX, minY, maxX, maxY)($this.x, $this.y) + // __vOriginalX __vOriginalY 保存当前的 x y 值 + el.__vOriginalX = $this.x = x + el.__vOriginalY = $this.y = y + el.style.transform = `translate( ${$this.x}px, ${$this.y}px)` + // console.log('[drag] setTranslate x', $this.x, 'y', $this.y) + }, + getWrapperWH() { + const innerWidth = isParent ? parentEl.clientWidth : window.innerWidth + const innerHeight = isParent ? parentEl.clientHeight : window.innerHeight + return { innerWidth, innerHeight } + }, + bindEvent() { // 绑定事件 + const el = isParent ? parentEl : document + el.addEventListener('mousemove', $this.handleDrag, false) + el.addEventListener('mouseup', $this.handleDragEnd, false) + el.addEventListener('mouseleave', $this.handleDragEnd, false) + el.addEventListener('touchmove', $this.handleDrag, { passive: false }) + el.addEventListener('touchend', $this.handleDragEnd, false) + }, + removeEvent() { // 移除事件 + const el = isParent ? parentEl : document + el.removeEventListener('mousemove', $this.handleDrag, false) + el.removeEventListener('mouseup', $this.handleDragEnd, false) + el.removeEventListener('mouseleave', $this.handleDragEnd, false) + el.removeEventListener('touchmove', $this.handleDrag, { passive: false }) + el.removeEventListener('touchend', $this.handleDragEnd, false) + }, + handleDragStart(e) { // 拖拽开始事件 down|start 事件 + const event = e.targetTouches && e.targetTouches[0] || e + $this.diffX = event.pageX - $this.x + $this.diffY = event.pageY - $this.y + $this.resizeEvent() + $this.bindEvent() + }, + handleDrag(e) { // 拖拽事件 move|drag 事件 + e.preventDefault() + const event = e.targetTouches && e.targetTouches[0] || e + $this.x = event.pageX - $this.diffX + $this.y = event.pageY - $this.diffY + $this.setTranslate() + }, + handleDragEnd(e) { // 拖拽结束事件 up|end 事件 + $this.removeEvent() + }, + }) +} +const bindEvent = (el, drags) => { + el.addEventListener('mousedown', drags.handleDragStart, false) + el.addEventListener('touchstart', drags.handleDragStart, false) + window.addEventListener('resize', drags.resizeEvent, false) + el.offEvent = () => { + el.removeEventListener('mousedown', drags.handleDragStart, false) + el.removeEventListener('touchstart', drags.handleDragStart, false) + window.removeEventListener('resize', drags.resizeEvent, false) + } +} + +export default { + install(Vue) { + Vue.directive('drag', this); + }, + bind(el, binding, vnode) { + const vue = vnode.context + vue.$nextTick(res => { + const drags = drag(el, binding, vnode) + drags.init() + bindEvent(el, drags) + }) + }, + update(el, binding, vnode) { + const value = JSON.stringify(binding.value) + const oldValue = JSON.stringify(binding.oldValue) + + if (value !== oldValue) { + console.log('[drag] update') + const vue = vnode.context + el.offEvent() + vue.$nextTick(res => { + const drags = drag(el, binding, vnode) + drags.resizeEvent() + bindEvent(el, drags) + }) + } + }, + unbind(el) { + el.offEvent() + } +} \ No newline at end of file diff --git a/frontend/src/vue-config/utils/index.js b/frontend/src/vue-config/utils/index.js new file mode 100644 index 0000000..62fea99 --- /dev/null +++ b/frontend/src/vue-config/utils/index.js @@ -0,0 +1,73 @@ +import Drag from './drag.js' + +export const drag = Drag + +// 判断是否为函数 +export const isFunction = (obj) => { + return typeof obj === "function" && typeof obj.nodeType !== "number" +} + +// 判断是否为普通对象 +export const isPlainObject = (obj) => { + let proto, Ctor + if (!obj || obj.toString() !== "[object Object]") { + return false + } + proto = Object.getPrototypeOf(obj) + if (!proto) { + return true + } + Ctor = proto.hasOwnProperty("constructor") && proto.constructor + return typeof Ctor === "function" && Ctor.toString() === Object.toString() +} + +// 添加前缀prefix +export const prefix = (target = '', char = '', length = 0) => { + target = target.toString() + let diff = length - target.length + diff = diff < 0 ? 0 : diff + let prefixStr = new Array(diff + 1).join(char) + return prefixStr + target +} + +// 扩展 String +// ocr图片识别成数值是进行校正的方法 +String.prototype.ocrNumCorrect = function () { + return this.replace(/([loqzBIOZ]|[cC][mMnN]2?$)/g, function (node, key) { + return ({ + 'o': '0', + 'O': '0', + 'I': '1', + 'l': '1', + 'z': '2', + 'Z': '2', + 'B': '8', + 'q': '9', + })[key] || '' + }) +} + +// 扩展 sessionStorage & localStorage +sessionStorage.getItem = localStorage.getItem = function (key) { + let args = Array.prototype.slice.call(arguments) + let value = Storage.prototype.getItem.apply(this, args) + try { + value = JSON.parse(value) + } catch (error) { + // console.warn(error) + } + + return value === undefined ? null : value +} +sessionStorage.setItem = localStorage.setItem = function (key, newValue) { + let setItemEvent = new Event("setItem") + let args = Array.prototype.slice.call(arguments) + args[1] = JSON.stringify(args[1]) + setItemEvent.key = args[0] + setItemEvent.newValue = args[1] + setItemEvent.oldValue = this.getItem(key) + setItemEvent.storageArea = this + setItemEvent.url = location.href + Storage.prototype.setItem.apply(this, args) + window.dispatchEvent(setItemEvent) +} \ No newline at end of file diff --git a/frontend/src/vue-print/index.js b/frontend/src/vue-print/index.js new file mode 100644 index 0000000..acd8fe7 --- /dev/null +++ b/frontend/src/vue-print/index.js @@ -0,0 +1,6 @@ +import Print from './src/print.js'; +Print.install = function(Vue) { + Vue.directive('print', Print); +}; + +export default Print; \ No newline at end of file diff --git a/frontend/src/vue-print/src/print.js b/frontend/src/vue-print/src/print.js new file mode 100644 index 0000000..9b7f915 --- /dev/null +++ b/frontend/src/vue-print/src/print.js @@ -0,0 +1,81 @@ +import Print from './printarea.js'; +/** + * @file 打印 + * 指令`v-print`,默认打印整个窗口 + * 传入参数`v-print="'#id'"` , 参数为需要打印局部的盒子标识. + */ +let closeBtn = true; +let options = { + endCallback() { + closeBtn = true; + } +} +const validateType = (expectedTypes, gotType) => { + console.error('[Print warn]: Invalid prop: type check failed for prop "print".Expected ' + expectedTypes.join(', ') + ', got ' + gotType + '.') + return false +} +const print = (el, binding, vnode) => { + let gotType = Object.prototype.toString.call(binding.value).slice(8, -1) + switch (binding.rawName) { + case 'v-print:onStart': + if (gotType === 'Function') { + options.startCallback = binding.value + } else { + return validateType(['Function'], gotType) + } + break; + + case 'v-print:onEnd': + if (gotType === 'Function') { + options.endCallback = () => { + closeBtn = true; + binding.value.endCallback() + } + } else { + return validateType(['Function'], gotType) + } + break; + + default: + if (gotType === 'String') { + options.el = binding.value + } else { + return validateType(['String'], gotType) + } + break; + } +} + +export default { + directiveName: 'print', + bind(el, binding, vnode) { + let vue = vnode.context; + let reval = print(el, binding, vnode) + if (binding.rawName === 'v-print') { + el.addEventListener('click', (event) => { + if (options.el) { + localPrint(); + } else { + window.print(); + } + }); + } + const localPrint = () => { + vue.$nextTick(() => { + if (closeBtn) { + closeBtn = false; + let print = new Print(options); + } + }); + }; + }, + + update(el, binding, vnode) { + print(el, binding, vnode) + closeBtn = true; + }, + + unbind(el) { + + } +}; \ No newline at end of file diff --git a/frontend/src/vue-print/src/printarea.js b/frontend/src/vue-print/src/printarea.js new file mode 100644 index 0000000..8bff3c6 --- /dev/null +++ b/frontend/src/vue-print/src/printarea.js @@ -0,0 +1,158 @@ +export default class { + constructor(option) { + this.standards = { + strict: 'strict', + loose: 'loose', + html5: 'html5' + }; + this.ele = null; + this.counter = 0; + this.settings = { + standard: this.standards.html5, + extraHead: '', // 附加在head标签上的额外元素,使用逗号分隔 + extraCss: '', // 额外的css逗号分隔 + popTitle: '', // 标题 + startCallback: ()=>{}, // 打开前的回调函数 + endCallback: null, // 成功打开后的回调函数 + el: '' // 局部打印的id + }; + Object.assign(this.settings, option); + this.init(); + }; + init() { + this.counter++; + this.settings.id = `printArea_${this.counter}`; + let box = document.getElementById(this.settings.id); + if (box) { + box.parentNode.removeChild(box); + } + let PrintAreaWindow = this.getPrintWindow(); // 创建iframe + let ele = this.getFormData(document.querySelector(this.settings.el)); + this.ele = ele; + this.settings.startCallback(this.ele); + this.write(PrintAreaWindow.doc); // 写入内容 + this.print(PrintAreaWindow); + this.settings.endCallback(); + }; + print(PAWindow) { + let paWindow = PAWindow.win; + paWindow.onload = () => { + paWindow.focus(); + paWindow.print(); + }; + }; + write(PADocument, $ele) { + PADocument.open(); + // PADocument.write(`${this.docType()}${this.getHead()}${this.getBody()}`); + PADocument.write(`${this.getHead()}${this.getBody()}`); + PADocument.close(); + }; + docType() { + if (this.settings.standard === this.standards.html5) { + return ''; + } + var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : ''; + var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict'; + + return ``; + }; + getHead() { + let extraHead = ''; + let links = ''; + let style = ''; + if (this.settings.extraHead) { + this.settings.extraHead.replace(/([^,]+)/g, function(m) { + extraHead += m; + }); + } + document.querySelectorAll('link').forEach((item, i) => { + if (item.href.indexOf('.css') >= 0) { + links += ``; + } + }); + for (let i = 0; i < document.getElementsByTagName('style').length; i++) { + try { + let styleHtml = document.getElementsByTagName('style')[i].outerHTML || ''; + style += styleHtml + } catch (error) { } + } + if (this.settings.extraCss) { + this.settings.extraCss.replace(/([^,\s]+)/g, function(m) { + links += ``; + }); + } + + return `${this.settings.popTitle}${extraHead}${links}${style}`; + }; + getBody() { + let htm = this.ele.outerHTML; + // console.log('htm', htm); + return '' + htm + ''; + }; + // 处理form表单的默认状态 + getFormData(ele) { + let copy = ele.cloneNode(true); + let copiedInputs = copy.querySelectorAll('input,select,textarea'); + + copiedInputs.forEach((item, i) => { + let typeInput = item.getAttribute('type'); + let copiedInput = copiedInputs[i]; + if (typeInput === undefined) { + typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : ''; + } + if (typeInput === 'radio' || typeInput === 'checkbox') { + + copiedInput.setAttribute('checked', item.checked); + + } else if (typeInput === 'text' || typeInput === '') { + copiedInput.value = item.value; + copiedInput.setAttribute('value', item.value); + } else if (typeInput === 'select') { + copiedInput.querySelectorAll('option').forEach((op, b) => { + if (op.selected) { + op.setAttribute('selected', true); + }; + }); + } else if (typeInput === 'textarea') { + copiedInput.value = item.value; + copiedInput.setAttribute('value', item.value); + copiedInput.innerHTML = item.value; + } + }); + return copy; + }; + getPrintWindow() { + var f = this.Iframe(); + return { + win: f.contentWindow || f, + doc: f.doc + }; + }; + Iframe() { + let frameId = this.settings.id; + let iframe; + + try { + iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + iframe.style.border = '0px'; + iframe.style.position = 'absolute'; + iframe.style.width = '0px'; + iframe.style.height = '0px'; + iframe.style.right = '0px'; + iframe.style.top = '0px'; + iframe.setAttribute('id', frameId); + iframe.setAttribute('src', new Date().getTime()); + iframe.doc = null; + iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document); + } catch (e) { + throw new Error(e + '. iframes may not be supported in this browser.'); + } + + if (iframe.doc == null) { + throw new Error('Cannot find document.'); + } + + return iframe; + }; +}; \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..407efdd --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,64 @@ +import { fileURLToPath, URL } from 'node:url' +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue2' +import vueJsx from '@vitejs/plugin-vue2-jsx' +import inject from '@rollup/plugin-inject' +import { chunkSplitPlugin } from 'vite-plugin-chunk-split' + +const resolve = (dir) => { + return fileURLToPath(new URL(dir, import.meta.url)) +} + +export default defineConfig(({ command, mode }) => { + // 根据当前工作目录中的 `mode` 加载 .env 文件 + // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。 + const env = loadEnv(mode, process.cwd(), '') + return { + // vite 配置 + build: { + outDir: 'dist', + assetsDir: 'static', + rollupOptions: { + output: { + entryFileNames: `static/[name].[hash].js`, + chunkFileNames: `static/[name].[hash].js`, + assetFileNames: `static/[name].[hash].[ext]` + } + } + }, + server: { + host: '0.0.0.0', + port: 5050, + proxy: { + '/imurs': { + target: env.VITE_HOST_NAME, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/imurs/, '') + }, + } + }, + resolve: { + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + 'assets': resolve('src/assets'), + 'agora': resolve('src/agora'), + 'public': resolve('src/components/system/public'), + } + }, + plugins: [vue(), vueJsx(), chunkSplitPlugin({ + // customSplitting: { + // 'vue-vendor': ['vue', 'vuex', 'vue-router', 'vue-template-compiler', /src\/vue-config/] + // } + }), inject({ + modules: { + AGORA_APP_ID: ['agora/agoraConfig', 'AGORA_APP_ID'], + RtcClient: ['agora/rtcClient', 'default'], + StorageChannel: ['public/storageSignaling', 'default'], + } + })], + // define: { + // __APP_ENV__: env.APP_ENV, + // } + } +}) diff --git a/qa/admin_app.py b/qa/admin_app.py new file mode 100644 index 0000000..3e01283 --- /dev/null +++ b/qa/admin_app.py @@ -0,0 +1,113 @@ +import os +import json +from flask import Flask, render_template_string, request, redirect, url_for, flash + +app = Flask(__name__) +app.secret_key = "supersecretkey" + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +VOCAB_DIR = os.path.join(BASE_DIR, "data", "vocab") +CONFIG_DIR = os.path.join(BASE_DIR, "data", "config") + +FILES = { + "l1": os.path.join(VOCAB_DIR, "l1_standard.json"), + "l2": os.path.join(VOCAB_DIR, "l2_hospital.json"), + "l3": os.path.join(VOCAB_DIR, "l3_mapping.json"), + "pinyin": os.path.join(VOCAB_DIR, "pinyin_map.json"), + "scoring": os.path.join(CONFIG_DIR, "scoring_standard.json") +} + +HTML_TEMPLATE = """ + + + + 医疗影像AI质控 - 后台管理 + + + +
    +

    🏥 医疗影像质控后台管理

    + + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
    {{ message }}
    + {% endfor %} + {% endif %} + {% endwith %} + +
    +

    正在编辑:{{ file_name }}

    +
    + + +
    +
    +
    + + +""" + +@app.route('/') +def index(): + return redirect(url_for('edit', file_key='l1')) + +@app.route('/edit/', methods=['GET', 'POST']) +def edit(file_key): + if file_key not in FILES: + return "File not found", 404 + + file_path = FILES[file_key] + + if request.method == 'POST': + content = request.form.get('content') + try: + # Validate JSON + json_data = json.loads(content) + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(json_data, f, ensure_ascii=False, indent=2) + flash("保存成功!RuleEngine 已实时同步最新规则。", "success") + except Exception as e: + flash(f"保存失败:JSON 格式错误 ( {str(e)} )", "error") + return redirect(url_for('edit', file_key=file_key)) + + # GET + if os.path.exists(file_path): + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + else: + content = "{}" if file_key != "l1" and file_key != "l2" else "[]" + + return render_template_string( + HTML_TEMPLATE, + content=content, + current=file_key, + file_name=os.path.basename(file_path) + ) + +if __name__ == '__main__': + # Ensure directories exist + os.makedirs(VOCAB_DIR, exist_ok=True) + os.makedirs(CONFIG_DIR, exist_ok=True) + app.run(port=5005, debug=True) diff --git a/qa/age_fix_result.txt b/qa/age_fix_result.txt new file mode 100644 index 0000000..9c6e539 Binary files /dev/null and b/qa/age_fix_result.txt differ diff --git a/qa/age_fix_result_v2.txt b/qa/age_fix_result_v2.txt new file mode 100644 index 0000000..1c93a7b Binary files /dev/null and b/qa/age_fix_result_v2.txt differ diff --git a/qa/data/config/scoring_standard.json b/qa/data/config/scoring_standard.json new file mode 100644 index 0000000..7208f1c --- /dev/null +++ b/qa/data/config/scoring_standard.json @@ -0,0 +1,31 @@ +{ + "dimensions": { + "information_completeness": { + "name": "信息完整性", + "weight": 20, + "description": "基本信息(姓名/性别/部位)是否齐全" + }, + "expression_clarity": { + "name": "表达清晰性", + "weight": 20, + "description": "逻辑是否通顺,无拼音错误或歧义" + }, + "professionalism": { + "name": "描述专业性", + "weight": 20, + "description": "术语使用是否标准(如 cm vs mm)" + }, + "clinical_relevance": { + "name": "临床相关性", + "weight": 20, + "description": "所见与结论是否一致,解剖关系是否合理" + }, + "format_standards": { + "name": "格式规范性", + "weight": 20, + "description": "文字录入格式(如全角/半角标点)、医学术语单位规范。注意:报表的‘所见’与‘提示’分段展示已由系统自动完成,禁止对此类排版提出建议。" + } + }, + "critical_threshold": 60, + "critical_error_penalty_logic": "如果存在严重性别/侧位冲突,总分必须低于 60 分。" +} \ No newline at end of file diff --git a/qa/data/vocab/l1_standard.json b/qa/data/vocab/l1_standard.json new file mode 100644 index 0000000..9e63f66 --- /dev/null +++ b/qa/data/vocab/l1_standard.json @@ -0,0 +1,10 @@ +[ + "起搏器", + "骨质疏松", + "心包积液", + "左心房", + "右心室", + "胰腺", + "病灶", + "密度" +] \ No newline at end of file diff --git a/qa/data/vocab/l2_hospital.json b/qa/data/vocab/l2_hospital.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/qa/data/vocab/l2_hospital.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/qa/data/vocab/l3_mapping.json b/qa/data/vocab/l3_mapping.json new file mode 100644 index 0000000..e800647 --- /dev/null +++ b/qa/data/vocab/l3_mapping.json @@ -0,0 +1,9 @@ +{ + "起步器": "起搏器", + "心脏起步器": "心脏起搏器", + "两field": "两肺", + "大笑": "大小", + "骨质只能说": "骨质疏松", + "灶度影": "密度影", + "冥想": "明显" +} \ No newline at end of file diff --git a/qa/data/vocab/pinyin_map.json b/qa/data/vocab/pinyin_map.json new file mode 100644 index 0000000..25646ae --- /dev/null +++ b/qa/data/vocab/pinyin_map.json @@ -0,0 +1,5 @@ +{ + "qiboqi": "起搏器", + "gzss": "骨质疏松", + "xbjy": "心包积液" +} \ No newline at end of file diff --git a/qa/faiss_index/index.faiss b/qa/faiss_index/index.faiss new file mode 100644 index 0000000..1af0726 Binary files /dev/null and b/qa/faiss_index/index.faiss differ diff --git a/qa/faiss_index/index.pkl b/qa/faiss_index/index.pkl new file mode 100644 index 0000000..3bc162a Binary files /dev/null and b/qa/faiss_index/index.pkl differ diff --git a/qa/migrate_to_db.py b/qa/migrate_to_db.py new file mode 100644 index 0000000..2c13829 --- /dev/null +++ b/qa/migrate_to_db.py @@ -0,0 +1,84 @@ +import json +import pymysql +import os + +# 数据库配置 +DB_CONFIG = { + "host": "39.108.252.248", + "port": 3306, + "user": "root", + "password": "Zp.123456", + "database": "yd_gzlps_test", + "charset": "utf8mb4" +} + +VOCAB_DIR = r"d:\Projects\US_RPT_QA\data\vocab" + +def migrate(): + # 建立数据库连接 + try: + conn = pymysql.connect(**DB_CONFIG) + cursor = conn.cursor() + print("🚀 已连接到数据库,准备开始迁移数据...") + except Exception as e: + print(f"❌ 无法连接到数据库: {e}") + return + + try: + count = 0 + # 1. 迁移 L3 纠错对照库 + l3_path = os.path.join(VOCAB_DIR, "l3_mapping.json") + if os.path.exists(l3_path): + with open(l3_path, 'r', encoding='utf-8') as f: + data = json.load(f) + for raw, correct in data.items(): + sql = "INSERT IGNORE INTO ai_qc_vocabulary (raw_text, correct_text, vocab_type, status) VALUES (%s, %s, 'L3', 'approved')" + cursor.execute(sql, (raw, correct)) + count += cursor.rowcount + print(f"--- L3 纠错库处理完成") + + # 2. 迁移 Pinyin 映射库 + py_path = os.path.join(VOCAB_DIR, "pinyin_map.json") + if os.path.exists(py_path): + with open(py_path, 'r', encoding='utf-8') as f: + data = json.load(f) + for raw, correct in data.items(): + sql = "INSERT IGNORE INTO ai_qc_vocabulary (raw_text, correct_text, vocab_type, status) VALUES (%s, %s, 'Pinyin', 'approved')" + cursor.execute(sql, (raw, correct)) + count += cursor.rowcount + print(f"--- Pinyin 映射库处理完成") + + # 3. 迁移 L1 标准术语库 + l1_path = os.path.join(VOCAB_DIR, "l1_standard.json") + if os.path.exists(l1_path): + with open(l1_path, 'r', encoding='utf-8') as f: + data = json.load(f) + for word in data: + # L1这种白名单,raw和correct存一样 + sql = "INSERT IGNORE INTO ai_qc_vocabulary (raw_text, correct_text, vocab_type, status) VALUES (%s, %s, 'L1', 'approved')" + cursor.execute(sql, (word, word)) + count += cursor.rowcount + print(f"--- L1 标准库处理完成") + + # 4. 迁移 L2 本院特色术语库 + l2_path = os.path.join(VOCAB_DIR, "l2_hospital.json") + if os.path.exists(l2_path): + with open(l2_path, 'r', encoding='utf-8') as f: + data = json.load(f) + for word in data: + sql = "INSERT IGNORE INTO ai_qc_vocabulary (raw_text, correct_text, vocab_type, status) VALUES (%s, %s, 'L2', 'approved')" + cursor.execute(sql, (word, word)) + count += cursor.rowcount + print(f"--- L2 本院库处理完成") + + conn.commit() + print(f"✅ 迁移任务圆满完成!共成功导入/更新 {count} 条词项到 ai_qc_vocabulary 表。") + + except Exception as e: + conn.rollback() + print(f"❌ 迁移过程中发生错误: {e}") + finally: + conn.close() + +if __name__ == "__main__": + migrate() diff --git a/qa/qc_engine.py b/qa/qc_engine.py new file mode 100644 index 0000000..fda20b6 --- /dev/null +++ b/qa/qc_engine.py @@ -0,0 +1,745 @@ +import os +import asyncio +import re +import json +from typing import List, Dict, Any, Optional +import pymysql + +# LangChain Imports +try: + from langchain_community.document_loaders import PyPDFLoader + from langchain_text_splitters import RecursiveCharacterTextSplitter + from langchain_community.vectorstores import FAISS + from langchain_openai import OpenAIEmbeddings, ChatOpenAI + from langchain_core.prompts import ChatPromptTemplate + from langchain_core.runnables import RunnablePassthrough + from langchain_core.output_parsers import StrOutputParser + from langchain_core.embeddings import Embeddings + from zhipuai import ZhipuAI +except ImportError as e: + print(f"Warning: Dependencies missing ({e}). Core rules will still work.") + +# API Configuration +ZHIPU_API_KEY = "dc8bfe33db15c49026cedbf5ffa461e0.1grbcRvEZyADTWJi" +QWEN_API_KEY = "sk-c7d5687a4d044489974b65bde467e93e" +DEEPSEEK_API_KEY = "sk-ee2871ac206c4cadbfa60d06dba0a8fe" + +ZHIPU_BASE_URL = "https://open.bigmodel.cn/api/paas/v4/" +QWEN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1" +DEEPSEEK_BASE_URL = "https://api.deepseek.com" + +PDF_PATH = r"d:\Projects\US_RPT_QA\超声医学质量控制管理规范.pdf" +INDEX_PATH = os.path.join(os.path.dirname(__file__), "faiss_index") + +# 数据库配置(与 imurs 保持一致) +DB_CONFIG = { + "host": "39.108.252.248", + "port": 3306, + "user": "root", + "password": "Zp.123456", + "database": "yd_gzlps_test", + "charset": "utf8mb4", + "cursorclass": pymysql.cursors.DictCursor +} + +# Config Management for Engineering Approach +class ConfigManager: + def __init__(self): + self.base_dir = os.path.dirname(os.path.abspath(__file__)) + self.vocab_dir = os.path.join(self.base_dir, "data", "vocab") + self.config_dir = os.path.join(self.base_dir, "data", "config") + self.load_all() + + def load_all(self): + # 实时加载以确保用户修改 JSON 后立即生效,无需重启 + self.l1_standard = self._load_json(os.path.join(self.vocab_dir, "l1_standard.json"), []) + self.l2_hospital = self._load_json(os.path.join(self.vocab_dir, "l2_hospital.json"), []) + self.l3_mapping = self._load_json(os.path.join(self.vocab_dir, "l3_mapping.json"), {}) + self.pinyin_map = self._load_json(os.path.join(self.vocab_dir, "pinyin_map.json"), {}) + self.scoring_standard = self._load_json(os.path.join(self.config_dir, "scoring_standard.json"), {}) + # self._load_from_db() # 优先使用本地 JSON 词库,如需同步数据库请手动开启 + + def _load_from_db(self): + try: + # 增加连接超时,防止数据库不可用时阻塞整个请求 + conn = pymysql.connect(**DB_CONFIG, connect_timeout=3) + with conn.cursor() as cursor: + sql = "SELECT raw_text, correct_text, vocab_type FROM ai_qc_vocabulary WHERE status = 'approved'" + cursor.execute(sql) + results = cursor.fetchall() + + if results: + # 重置字典(避免累积旧数据,实现真正的热覆盖) + db_l3 = {} + db_pinyin = {} + db_l1 = [] + db_l2 = [] + + for row in results: + v_type = row['vocab_type'] + raw = row['raw_text'] + correct = row['correct_text'] + + if v_type == 'L3': db_l3[raw] = correct + elif v_type == 'Pinyin': db_pinyin[raw] = correct + elif v_type == 'L1': db_l1.append(raw) + elif v_type == 'L2': db_l2.append(raw) + + # 只有数据库有数据时才覆盖 + if db_l3: self.l3_mapping.update(db_l3) + if db_pinyin: self.pinyin_map.update(db_pinyin) + if db_l1: self.l1_standard = db_l1 + if db_l2: self.l2_hospital = db_l2 + conn.close() + except Exception as e: + print(f"⚠️ 数据库热加载失败,使用本地缓存: {e}") + + def _load_json(self, path, default): + try: + if os.path.exists(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Error loading {path}: {e}") + return default + + def get_scoring_text(self): + text = "【核心评分规则(必须严格遵守)】:\n" + text += "1. 初始满分 100 分,根据发现的问题倒扣,最低 0 分。\n" + text += "2. **扣分阶梯(禁止针对小错误过度扣分,禁止重复扣分)**:\n" + text += " - 术语瑕疵/错别字/标点规范(如‘冥想’应为‘明显’):同类型错误无论出现多少次,**累计扣分上限为 5 分**。\n" + text += " - 描述不全(如未注大小)、基础信息漏项:每次扣 **5 分**。\n" + text += " - 严重逻辑矛盾(如性别不符、结论与描述完全相反):单项直接扣 **40 分以上**,使得分低于 60 分。\n" + text += "3. **打分维度(仅作参考方向)**:信息完整性、表达清晰度、术语专业性、临床相关性、格式规范性。\n" + return text + +# Global Config Instance +config_manager = ConfigManager() + +# Medical Rules Data (Mostly static mapping) +GENDER_MAP = { + "女": ["前列腺", "精囊", "睾丸", "阴囊"], + "女性": ["前列腺", "精囊", "睾丸", "阴囊"], + "男": ["子宫", "卵巢", "输卵管", "阴道"], + "男性": ["子宫", "卵巢", "输卵管", "阴道"] +} + +class RuleEngine: + def run_checks(self, report_text: str, patient_info: Dict[str, Any], examine_part: str, clinical_diagnosis: str = "") -> List[str]: + # Always reload removed to prevent DB lag per request + # config_manager.load_all() + gender = patient_info.get("sex", "未知") + try: + age = int(re.sub(r"\D", "", str(patient_info.get("age", 0)))) + except: + age = 0 + findings = [] + + # 1. Gender/Organ Mismatch + if gender in GENDER_MAP: + conflicting_organs = [organ for organ in GENDER_MAP[gender] if organ in report_text] + if conflicting_organs: + organs_str = "、".join([f"'{o}'" for o in conflicting_organs]) + findings.append(f"【严重】性别与部位冲突:患者性别为{gender},但在报告描述中出现了{organs_str}。") + + # 1b. Age/Logic Conflict + if age > 60: + age_sensitive_keywords = ["胎儿", "早孕", "妊娠", "卵泡", "月经"] + found_age_conflicts = [kw for kw in age_sensitive_keywords if kw in report_text] + if found_age_conflicts: + kws_str = "、".join([f"'{k}'" for k in found_age_conflicts]) + findings.append(f"【生理逻辑冲突】高龄风险:患者年龄为{age}岁,报告中出现{kws_str},不符合生理常规或伦理审核。") + + # 2. Typos & Mapping (Layer 1 - dynamic - Weighted Pattern Matching) + # 获取所有映射并按词长度倒序排列(长词优先,避免子串重复匹配,如“冥想异常”优先于“冥想”) + sorted_mappings = sorted(config_manager.l3_mapping.items(), key=lambda x: len(x[0]), reverse=True) + + covered_ranges = [] # 记录已覆盖的文本区间 [(start, end), ...] + matched_results = {} # correction -> {typo1, typo2, ...} + + for typo, correction in sorted_mappings: + # 使用正则查找所有出现位置,确保转义特殊字符 + for m in re.finditer(re.escape(typo), report_text): + start, end = m.span() + # 检查此位置是否已被之前的长词匹配覆盖 + if any(start >= s and end <= e for s, e in covered_ranges): + continue + + # 记录新匹配区间 + covered_ranges.append((start, end)) + if correction not in matched_results: + matched_results[correction] = set() + matched_results[correction].add(typo) + + # 归并输出结果,解决用户反馈的“多次重复报错”问题 + for correction, typos in matched_results.items(): + typos_list = sorted(list(typos), key=len, reverse=True) + typos_str = "、".join([f"'{t}'" for t in typos_list]) + if len(typos_list) > 1: + findings.append(f"【建议修正】检测到多处相关术语错误({typos_str}),均应统一修正为'{correction}'。") + else: + findings.append(f"【建议修正】术语错误:检测到'{typos_list[0]}',应修正为'{correction}'。") + + # 3. Pinyin Mapping (Input Assist - dynamic) + for py, term in config_manager.pinyin_map.items(): + if py in report_text.lower(): + findings.append(f"【建议修正】拼音残留:检测到输入法残留'{py}',建议修正为'{term}'。") + + # 3. Units check (cm vs mm) + keywords = ["结节", "病灶", "占位", "团块"] + for kw in keywords: + if kw in report_text: + if re.search(rf"{kw}.*?(\d+\.?\d*)\s*cm", report_text): + findings.append(f"【规范建议】单位使用:针对'{kw}',行业规范建议使用'mm',当前报告中使用了'cm'。") + + # 4. Global Site/System Mismatch + system_keywords = { + "血管": ["颈动脉", "股动脉", "静脉", "血流", "斑块"], + "腹部": ["肝", "胆", "胰", "脾", "肾", "腹水"], + "妇科": ["子宫", "卵巢", "附件", "内膜"], + "泌尿": ["膀胱", "前列腺", "输尿管"] + } + + if examine_part: + match_found = False + for sys_name, sys_kws in system_keywords.items(): + if sys_name in examine_part: + match_found = True + # Check if report mentions something completely outside this system + other_systems = {k: v for k, v in system_keywords.items() if k != sys_name} + for other_name, other_kws in other_systems.items(): + # If a report for 'Vessels' only mentions 'Liver/Gallbladder', flag it + found_other = [okw for okw in other_kws if okw in report_text] + if found_other: + # Count how many words match the current system + current_sys_matches = [skw for skw in sys_kws if skw in report_text] + if len(current_sys_matches) == 0: + findings.append(f"【系统性偏离】检查部位为'{examine_part}',但报告描述中却出现了{found_other[0]}等'{other_name}'系统内容。") + break + + # 5. Enhanced Left/Right Consistency(分字段精准侧位核查) + part_norm = (examine_part or "").replace(" ", "") + l_in_part = "左" in part_norm + r_in_part = "右" in part_norm + h_side = "左" if l_in_part and not r_in_part else "右" if r_in_part and not l_in_part else None + + if h_side: + o_side = "右" if h_side == "左" else "左" + + # 分字段提取:兼容「超声所见」和「超声提示」两种格式 + # 格式1:「超声所见:...」(标准格式) + # 格式2:「【字段:超声所见】:...」(前端传入格式) + see_match = re.search( + r"(?:【字段:)?超声所见(?:】)?[\s::]+(.*?)(?=(?:【字段:)?超声提示|结论|提示|\Z)", + report_text, re.DOTALL + ) + see_text = see_match.group(1).strip() if see_match else "" + + hint_match = re.search( + r"(?:【字段:)?超声提示(?:】)?[\s::\n\r]+(.*)", + report_text, re.DOTALL | re.IGNORECASE + ) + hint_text = hint_match.group(1).strip() if hint_match else "" + + # 如果字段提取均失败,降级为后半段 + if not hint_text and len(report_text) > 100: + hint_text = report_text[len(report_text)//2:] + + print(f"DEBUG RuleEngine: TargetSide={h_side}, SeeLen={len(see_text)}, HintLen={len(hint_text)}") + + # 逐字段核查侧位 + field_errors = [] + + # 核查「超声所见」 + if see_text: + if o_side in see_text and h_side not in see_text: + field_errors.append(f"超声所见(仅含'{o_side}'侧,应为'{h_side}'侧)") + + # 核查「超声提示」 + if hint_text: + if o_side in hint_text and h_side not in hint_text: + field_errors.append(f"超声提示(仅含'{o_side}'侧,应为'{h_side}'侧)") + + if field_errors: + fields_str = "、".join(field_errors) + findings.append( + f"【严重】侧位冲突:申请部位为'{h_side}'侧,但以下字段描述有误——{fields_str}。" + f"请逐一核实并统一修正为'{h_side}'侧。" + ) + else: + # 全篇频次兴局安全层(字段提取均失败时的兴局降级方案) + if h_side not in report_text and o_side in report_text: + findings.append(f"【严重】侧位矛盾:申请部位要求'{h_side}'侧,但报告全篇描述均为'{o_side}'侧。") + elif report_text.count(o_side) > report_text.count(h_side) * 2 and h_side in report_text: + findings.append(f"【逻辑疑虑】侧位倾向:描述中'{o_side}'侧占比远超申请的'{h_side}'侧,请核实。") + + return findings + +# Embedding and RAG Classes + +class ZhipuEmbeddings(Embeddings): + """自定义智谱AI向量类,确保完全兼容官方API""" + def __init__(self, api_key: str): + self.client = ZhipuAI(api_key=api_key, timeout=15) + self.model = "embedding-2" + + def embed_documents(self, texts: List[str]) -> List[List[float]]: + # SDK 内部处理了单条或列表 + embeddings = [] + for text in texts: + # 过滤空字符串或过短内容 + if not text.strip(): + embeddings.append([0.0] * 1024) # 假设长度,失败时填充 + continue + try: + response = self.client.embeddings.create( + model=self.model, + input=text.strip() + ) + embeddings.append(response.data[0].embedding) + except Exception as e: + print(f"Embedding error for text snippet: {e}") + embeddings.append([0.0] * 1024) + return embeddings + + def embed_query(self, text: str) -> List[float]: + try: + response = self.client.embeddings.create( + model=self.model, + input=text + ) + return response.data[0].embedding + except Exception as e: + print(f"Query embedding error: {e}") + return [0.0] * 1024 + +class RAGManager: + def __init__(self): + self.embeddings = ZhipuEmbeddings(api_key=ZHIPU_API_KEY) + self.vectorstore = None + + def get_vectorstore(self): + if self.vectorstore: + return self.vectorstore + + if os.path.exists(INDEX_PATH): + try: + self.vectorstore = FAISS.load_local( + INDEX_PATH, + self.embeddings, + allow_dangerous_deserialization=True + ) + return self.vectorstore + except Exception as e: + print(f"Error loading index: {e}") + + # Build if not exists + self.build_index() + return self.vectorstore + + def build_index(self): + print(f"Loading PDF from {PDF_PATH}...") + if not os.path.exists(PDF_PATH): + print("PDF file not found!") + return + + try: + loader = PyPDFLoader(PDF_PATH) + docs = loader.load() + # 调小块尺寸以适应 embedding-2 的 512 token 限制 + text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) + splits = text_splitter.split_documents(docs) + print(f"Created {len(splits)} chunks. Generating embeddings...") + + # 使用自定义的向量类构建索引 + self.vectorstore = FAISS.from_documents(splits, self.embeddings) + self.vectorstore.save_local(INDEX_PATH) + print("Index build and saved.") + except Exception as e: + print(f"Failed to build index: {e}") + +class QCManager: + def __init__(self): + self.rag = RAGManager() + self.rule_engine = RuleEngine() + + async def get_llm_analysis(self, model_name: str, report_text: str, context: str, extra_instruction: str = "") -> str: + try: + if "qwen" in model_name.lower(): + llm = ChatOpenAI( + model="qwen-max", + api_key=QWEN_API_KEY, + base_url=QWEN_BASE_URL, + temperature=0.1 + ) + elif "deepseek" in model_name.lower(): + llm = ChatOpenAI( + model="deepseek-chat", + api_key=DEEPSEEK_API_KEY, + base_url=DEEPSEEK_BASE_URL, + temperature=0.1 + ) + else: # Default to Zhipu GLM-4 Flash for speed + llm = ChatOpenAI( + model="glm-4-flash", + api_key=ZHIPU_API_KEY, + base_url=ZHIPU_BASE_URL, + temperature=0.1, + timeout=60 # 增加到60秒,确保在复杂网络环境下不超时 + ) + + prompt = ChatPromptTemplate.from_template(""" +你是一名严谨的【医疗影像报告审核专家】。请审核以下包含背景信息和正文的超声报告。 + +【自动检测发现(必须处理并计入扣分)】: +{rule_findings} + +【关键须知】: +- **背景信息(表头)已包含患者姓名、性别、年龄、检查部位**。 +- **只要背景信息中已有对应数值,即视为信息完整**。严禁以此为由扣分。 + +【硬性约束】: +1. **合并同类项**:上方【自动检测发现】中若已指出多处术语错误或模式错误,请在最终结果中将其视为一个“模式错误”进行归并,**严禁对同一错别字的不同出现位置重复扣分**。 +2. **采纳规则建议**:优先使用规则检测提供的修正建议(例如将‘冥想’修正为‘明显’),除非发现其存在严重的常识错误。 +3. **深度逻辑审核**:AI 应重点关注规则引擎无法覆盖的深度逻辑(如解剖部位矛盾、结论不支持所见等)。 +4. **侧位一致性**:必须严格核对【背景信息】中的检查部位与【报告正文】描述。若检查部位为‘右膝’,正文描述却为‘左膝’,必须判定为【严重】错误并至少扣除 40 分。 +5. **严禁排版建议**:绝对禁止就“超声所见”与“超声提示”的加粗标题、分段、冒号等排版细节提出改进建议。 +6. **无错处理**:若未发现真实医学或逻辑错误,且自动检测也无明显问题,请仅输出:【该报告未发现质量问题】。 + +【输出格式要求(若发现错误)】: +- 初始满分为 100,根据下方标准进行扣分。 +- 先逐条列出真实的扣分理由(注明具体扣分值,如 -2 分)。 +- 最后输出一个 JSON 块,内容如下(注意:issues 列表必须包含所有【自动检测发现】中的原文词): + {{ + "score": 评分(int), + "issues": [ + {{ "original": "原文词", "reason": "原因", "suggestion": "建议", "type": "类型" }} + ], + "corrected_fields": {{ + "bSee": "修正后的【超声所见】全文本", + "bHint": "修正后的【超声提示】全文本" + }} + }} + +【评分标准】: +{scoring_text} + +【待审内容】: +{report} + +{extra_instruction} +""") + + chain = ( + { + "context": lambda x: context, + "rule_findings": lambda x: extra_instruction.get("rule_findings", "无"), + "scoring_text": lambda x: config_manager.get_scoring_text(), + "report": RunnablePassthrough(), + "extra_instruction": lambda x: extra_instruction.get("text", "") + } + | prompt + | llm + | StrOutputParser() + ) + + import time + start_time = time.time() + print(f"DEBUG: Invoking LLM ({model_name})...") + res = await chain.ainvoke(report_text) + elapsed = time.time() - start_time + print(f"DEBUG: LLM ({model_name}) response received in {elapsed:.2f}s.") + return res + except Exception as e: + print(f"DEBUG: LLM Analysis Error: {e}") + return "✅ 已完成报告基础合规性校验。建议结合自动规则检测结果进行微调。" + + async def run_qc(self, report_data: Dict[str, Any]): + import time + overall_start = time.time() + # 每次运行前重新加载词库,确保用户修改 l3_mapping.json 后立即生效 + config_manager.load_all() + + raw_report = report_data.get("report", "") + patient_info = report_data.get("patient_info", {}) + examine_part = report_data.get("examinePart", "") + + # 构造包含完整背景信息的报告文本,防止 AI 误报缺失表头信息 + full_report_context = f""" +【报告背景信息】: +患者姓名:{patient_info.get('patientName', '测试')} +患者性别:{patient_info.get('sex', '未提供')} +患者年龄:{patient_info.get('age', '未提供')} +检查部位:{examine_part or '全腹'} + +【报告正文】: +{raw_report} + """.strip() + + # 切换为单模型模式以提升响应速度,不再使用耗时的共识模式 + selected_model = "glm-4-flash" + + # 1. Rules (Instant) + print("DEBUG: Running Rule Engine...") + try: + rule_findings = self.rule_engine.run_checks(raw_report, patient_info, examine_part) + print(f"DEBUG: Rule findings count: {len(rule_findings)}") + except Exception as rule_err: + print(f"DEBUG: Rule Engine Error: {rule_err}") + rule_findings = [] + rule_str = "\n".join(rule_findings) if rule_findings else "未发现自动规则错误。" + + # 2. RAG Context (安全加载) + print("DEBUG: Fetching RAG Context...") + context = "请根据医学常识进行判断。" + try: + vs = self.rag.get_vectorstore() + if vs: + relevant_docs = vs.similarity_search(raw_report, k=1) + context = "\n".join([doc.page_content for doc in relevant_docs]) + except Exception as rag_err: + print(f"DEBUG: RAG Step missed: {rag_err}") + + # 3. LLM Analysis + print("DEBUG: Starting LLM Analysis...") + instruction_payload = { + "text": "只输出发现的错误,不输出无错误项。", + "rule_findings": rule_str + } + + if selected_model == "consensus": + print(f"DEBUG: Selected model: consensus. Calling sub-models...") + # ... (保持原有的多模型并发逻辑,但合并提示词会要求它们都闭嘴不谈正确项) + tasks = [ + self.get_llm_analysis("glm-4-flash", full_report_context, context, instruction_payload), + self.get_llm_analysis("qwen-max", full_report_context, context, instruction_payload), + ] + results = await asyncio.gather(*tasks) + print("DEBUG: Sub-models finished. Starting synthesis...") + + synthesizer_llm = ChatOpenAI( + model="glm-4-flash", + api_key=ZHIPU_API_KEY, + base_url=ZHIPU_BASE_URL, + temperature=0.1, + timeout=30 + ) + + synthesis_prompt = ChatPromptTemplate.from_template(""" +你现在是【终审质控组长】。请汇总多方质控意见(下方 A/B 记录),生成最终结论。 + +【质控原始记录】: +{results} + +【绝对禁令】: +1. 严禁输出任何“未见明显错误”、“符合规范”或“基本正确”的描述。 +2. 严禁输出“范例报告”、“参考报告”、“修改后报告”或任何类似的全篇重写内容。 +3. **重点:绝对禁止就“超声所见”与“超声提示”的分段、分行、加粗标题、冒号区分等格式排版问题提出任何建议。即使 A/B 记录中有此类建议,也请将其判定为误报并剔除。** +4. 严禁输出“评分报告”、“评分与范例生成”等标题。 + +【输出格式要求】: +1. 仅列出发现的每一个真实错误及其扣分理由(按点排列,直接说事,不废话)。 +2. 最后必须输出一个合法的 JSON 块。 +3. 如果合法的扣分项为零,则正文仅显示:该报告未发现明显质量问题。 + +```json +{{ + "score": XX, + "issues": [ + {{ "original": "原文词", "reason": "扣分原因", "suggestion": "修正建议" }} + ], + "corrected_fields": {{ "bSee": "修正后的完整所见", "bHint": "修正后的完整提示" }} +}} +``` +""") + synth_chain = synthesis_prompt | synthesizer_llm | StrOutputParser() + combined_results = f"A: {results[0]}\nB: {results[1]}" + ai_findings = await synth_chain.ainvoke({ + "raw_report": raw_report, + "rule_findings": rule_str, + "results": combined_results, + "scoring_text": config_manager.get_scoring_text() + }) + else: + ai_findings = await self.get_llm_analysis(selected_model, full_report_context, context, instruction_payload) + + # Parse AI results to extract score and structured issues + ai_description = ai_findings + ai_score = 100 + ai_structured_issues = [] + + try: + # 改进 JSON 提取:查找所有疑似 JSON 块并选取“信息量最大”的一个 + json_blocks = re.findall(r"```json\s*(.*?)\s*```", ai_findings, re.DOTALL) + if not json_blocks: + # 尝试直接找大括号 + json_blocks = re.findall(r"(\{.*?\})", ai_findings, re.DOTALL) + + target_json = "" + if json_blocks: + # 优先级排序:先找包含 issues 的,再找位置靠后的 + candidates = [] + for jb in json_blocks: + try: + parsed = json.loads(jb.strip()) + if isinstance(parsed, dict): + # 计算权重:有 issues 权重更高 + weight = len(parsed.get('issues', [])) * 10 - parsed.get('score', 100) + candidates.append((weight, parsed, jb)) + except: continue + + if candidates: + # 选取权重最高的一个 + candidates.sort(key=lambda x: x[0], reverse=True) + best_match = candidates[0][1] + ai_score = best_match.get("score", 100) + ai_structured_issues = best_match.get("issues", []) + target_json = candidates[0][2] + + # 提取描述(第一个 JSON 块之前的内容) + first_pos = ai_findings.find(target_json) + if first_pos > 0: + ai_description = ai_findings[:first_pos].strip() + except Exception as e: + print(f"DEBUG: JSON Parser Error: {e}") + + # 评分校准逻辑:确保分值真实反映报告质量 + # 1. 本地规则校准(最高优先级) + if rule_findings: + has_severe = any("【严重】" in f for f in rule_findings) + has_fix = any("【建议修正】" in f or "【规范建议】" in f for f in rule_findings) + if has_severe: ai_score = min(ai_score, 60) + elif has_fix: ai_score = min(ai_score, 95) + + # 2. AI 自身识别出的严重错误校准(防止 AI 说一套做一套) + if ai_structured_issues: + has_ai_severe = any("严重" in str(i.get('type', '')) or "严重" in str(i.get('reason', '')) for i in ai_structured_issues if isinstance(i, dict)) + if has_ai_severe and ai_score > 60: + print("DEBUG: AI identified severe issues but gave high score. Calibrating to 60.") + ai_score = 60 + + # 最后屏护:只有真的没分扣了且没规则发现,才维持 100 分。 + # 只要有 issues,分值绝对不允许是 100 + if ai_structured_issues and ai_score >= 100: + ai_score = 98 + + # 闭环逻辑:仅仅在真的没任何问题时才隐藏清单 + if ai_score == 100 and not rule_findings and not ai_structured_issues: + ai_structured_issues = [] + + # 归一化处理:确保 rule_findings 中的原始词也被加入高亮列表,支撑前端展示 + existing_originals = {str(issue.get('original', '')) for issue in ai_structured_issues if isinstance(issue, dict)} + SIDE_CONFLICT_KEYWORDS = ("侧位冲突", "侧位矛盾", "侧位倾向") + for find in rule_findings: + if any(kw in find for kw in SIDE_CONFLICT_KEYWORDS): + # 侧位冲突:同时注入两类高亮 + # - "仅含'X'侧" → 错误侧位字,type=侧位错误(前端标黄) + # - "应为'Y'侧" → 正确侧位字,type=侧位参照(前端标蓝) + # 规则文本格式: ...(仅含'左'侧,应为'右'侧)... + quoted = re.findall(r"'([^']+)'", find) + for q in quoted: + if q not in ("左", "右"): + continue + if f"仅含'{q}'侧" in find and q not in existing_originals: + ai_structured_issues.append({ + "original": q, + "reason": "侧位冲突(规则引擎检测)", + "suggestion": f"报告中出现了'{q}'侧,与申请部位不符,请核实", + "type": "侧位错误" # 前端 → 黄色高亮 + }) + existing_originals.add(q) + elif f"应为'{q}'侧" in find and q not in existing_originals: + ai_structured_issues.append({ + "original": q, + "reason": "正确侧位参照", + "suggestion": f"申请部位要求'{q}'侧,请确认报告中该侧描述是否准确", + "type": "侧位参照" # 前端 → 蓝色高亮 + }) + existing_originals.add(q) + continue + # 其他规则:提取引号中的敏感词(如检测到'冥想') + extracted_words = re.findall(r"'(.*?)'", find) + if extracted_words: + orig_word = extracted_words[0] + if orig_word not in existing_originals: + ai_structured_issues.append({ + "original": orig_word, + "reason": "规则引擎自动发现", + "suggestion": "请参考规则修正建议", + "type": "自动规则" + }) + existing_originals.add(orig_word) + + # Final Report Construction + final_report = "### 超声报告质控分析报告\n\n" + final_report += f"#### 🎯 综合评分:**{ai_score} 分**\n\n" + + if rule_findings: + final_report += "#### ⚠️ 自动规则检测(高可靠):\n" + for find in rule_findings: + final_report += f"- {find}\n" + final_report += "\n" + + final_report += "#### 🤖 AI 智能分析:\n" + if ai_description and len(ai_description) > 5 and "未发现" not in ai_description: + final_report += f"{ai_description}\n" + elif rule_findings: + final_report += "✅ AI 深度审核未发现其它语义逻辑错误,请优先参考上方‘自动检测’给出的修正建议。\n" + else: + final_report += "✅ 该报告未发现明显质量问题。\n" + + if ai_structured_issues: + final_report += "\n#### 📝 详细建议清单:\n" + # 强化去重:根据 (原文词, 修正建议) 进行去重,防止 AI 重复输出或规则重复合并 + seen_issue_keys = set() + unique_issues = [] + for issue in ai_structured_issues: + if not isinstance(issue, dict): continue + key = (str(issue.get('original', '')).strip(), str(issue.get('suggestion', '')).strip()) + if key not in seen_issue_keys: + unique_issues.append(issue) + seen_issue_keys.add(key) + + for issue in unique_issues: + orig = issue.get('original', '原文') + sugg = issue.get('suggestion', '建议内容') + reason = issue.get('reason', '原因描述') + itype = issue.get('type', '核心错误') + final_report += f"- **[{itype}]** {orig} -> {sugg} ({reason})\n" + + # 兜底:如果完全没提到规则发现,则 AI 可能漏掉了 + if rule_findings and not ai_structured_issues: + final_report += "\n*(提示:已根据自动规则检测结果更新最终评分)*\n" + + # 如果解析后的描述太短且有原始输出,则作为参考附上(先剥离其中的 json 代码块避免干扰前端解析) + if len(final_report) < 150 and len(ai_findings) > 100: + final_report += "\n---\n#### 🔍 原始分析记录:\n" + clean_ai_findings = re.sub(r"```json[\s\S]*?```", "", ai_findings).strip() + final_report += clean_ai_findings + + # 追加最终的结构化 JSON 块,供前端精准解析高亮和一键修正 + # 提取 AI 的纠正字段(保留其深度修正后的全文本) + final_corrected_fields = {} + try: + # 再次从原始输出提取 corrected_fields + json_blocks = re.findall(r"```json\s*(.*?)\s*```", ai_findings, re.DOTALL) + if json_blocks: + last_json = json.loads(json_blocks[-1].strip()) + final_corrected_fields = last_json.get("corrected_fields", {}) + except: + pass + + final_json = { + "score": ai_score, + "issues": ai_structured_issues, + "corrected_fields": final_corrected_fields + } + # 使用唯一标记包裹最终 JSON,前端按此标记精确定位,避免误匹配多个代码块 + final_report += f"\n\n===FINAL_QC_JSON===\n{json.dumps(final_json, ensure_ascii=False, indent=2)}\n===END_QC_JSON===\n" + + overall_elapsed = time.time() - overall_start + print(f"DEBUG: Total QC processing time: {overall_elapsed:.2f}s. Final Score: {ai_score}") + return final_report + +# Global instance +qc_manager = QCManager() diff --git a/qa/radiology_qc_checklist.md b/qa/radiology_qc_checklist.md new file mode 100644 index 0000000..073a99c --- /dev/null +++ b/qa/radiology_qc_checklist.md @@ -0,0 +1,144 @@ +# 影像报告质控检查表 + +**科室:____________ 报告医师:____________ 审核人:____________ 日期:____________** + +--- + +## 一、基本信息核查(必查项) + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 患者姓名、性别、年龄正确 | ☐ | ☐ | | +| 检查号/住院号正确 | ☐ | ☐ | | +| 检查日期、报告日期正确 | ☐ | ☐ | | +| 检查部位与申请单一致 | ☐ | ☐ | | +| 检查方法描述准确(CT/MRI/X线/超声等) | ☐ | ☐ | | + +--- + +## 二、解剖部位准确性 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 左右侧标注正确 | ☐ | ☐ | | +| 肺叶/脑叶位置描述准确 | ☐ | ☐ | | +| 椎体节段标注正确 | ☐ | ☐ | | +| 肋骨/血管编号正确 | ☐ | ☐ | | +| 器官名称无错别字 | ☐ | ☐ | | + +--- + +## 三、测量数值准确性 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 病灶大小测量值合理 | ☐ | ☐ | | +| 小数点位置正确 | ☐ | ☐ | | +| 单位标注准确(mm/cm) | ☐ | ☐ | | +| 多发病灶测量对应正确 | ☐ | ☐ | | +| 数值与图像相符 | ☐ | ☐ | | + +--- + +## 四、医学术语规范性 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 专业术语使用规范 | ☐ | ☐ | | +| 无错别字(结节/积液/钙化等) | ☐ | ☐ | | +| 密度/信号描述准确 | ☐ | ☐ | | +| 缩写使用规范 | ☐ | ☐ | | +| 避免使用模糊、歧义词汇 | ☐ | ☐ | | + +--- + +## 五、报告结构完整性 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 包含"检查所见"部分 | ☐ | ☐ | | +| 包含"诊断意见/影像表现"部分 | ☐ | ☐ | | +| 重要阴性所见有描述 | ☐ | ☐ | | +| 对比剂使用情况已说明(增强检查) | ☐ | ☐ | | +| 扫描技术参数描述完整 | ☐ | ☐ | | + +--- + +## 六、逻辑一致性 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 所见与诊断相符 | ☐ | ☐ | | +| 病灶数量描述前后一致 | ☐ | ☐ | | +| 无自相矛盾描述 | ☐ | ☐ | | +| 与既往片对比描述准确(如有) | ☐ | ☐ | | +| 随访建议合理 | ☐ | ☐ | | + +--- + +## 七、特殊情况处理 + +| 检查项目 | 符合 | 不符合 | 备注/不适用 | +|---------|------|--------|------------| +| 危急值已标注并及时通知 | ☐ | ☐ | ☐ | +| 急诊报告已注明"急" | ☐ | ☐ | ☐ | +| 重大阳性发现突出显示 | ☐ | ☐ | ☐ | +| 疑难病例建议会诊或进一步检查 | ☐ | ☐ | ☐ | + +--- + +## 八、格式与规范 + +| 检查项目 | 符合 | 不符合 | 备注 | +|---------|------|--------|------| +| 标点符号使用正确 | ☐ | ☐ | | +| 段落结构清晰 | ☐ | ☐ | | +| 无明显复制粘贴错误 | ☐ | ☐ | | +| 医师签名完整 | ☐ | ☐ | | + +--- + +## 九、综合评价 + +**总体评分:** ☐ 优秀(0-1处错误) ☐ 良好(2-3处错误) ☐ 合格(4-5处错误) ☐ 不合格(6处以上错误) + +**主要问题记录:** + +``` +1. +2. +3. +``` + +**整改建议:** + +``` +1. +2. +3. +``` + +**是否需要返工修改:** ☐ 是 ☐ 否 + +--- + +## 十、常见错误提示卡(快速参考) + +### ⚠️ 高频错误Top 5 +1. **左右侧混淆** - 仔细核对图像标记 +2. **小数点错误** - 3.2cm vs 32mm要注意换算 +3. **复制粘贴未修改** - 患者信息、检查部位必须逐项检查 +4. **所见与诊断不符** - 描述的病变在诊断中必须体现 +5. **数量描述矛盾** - "多发"与"单发"必须前后一致 + +### 📋 报告书写提醒 +- 左右一定要看图像标记,不能凭经验 +- 测量值保留1位小数即可 +- 危急值(如主动脉夹层、气胸、骨折等)必须电话通知临床 +- 不确定的表述用"考虑""建议进一步检查"等 +- 既往对比一定要写清楚对比日期 + +--- + +**审核人签名:____________** +**审核日期:____________** \ No newline at end of file diff --git a/qa/stability_test_result.txt b/qa/stability_test_result.txt new file mode 100644 index 0000000..3f9dc67 Binary files /dev/null and b/qa/stability_test_result.txt differ diff --git a/qa/stability_test_result_v2.txt b/qa/stability_test_result_v2.txt new file mode 100644 index 0000000..0ea7fe0 Binary files /dev/null and b/qa/stability_test_result_v2.txt differ diff --git a/qa/stability_test_v3.txt b/qa/stability_test_v3.txt new file mode 100644 index 0000000..7df143d Binary files /dev/null and b/qa/stability_test_v3.txt differ diff --git a/qa/stability_test_v4.txt b/qa/stability_test_v4.txt new file mode 100644 index 0000000..411a8a7 Binary files /dev/null and b/qa/stability_test_v4.txt differ diff --git a/qa/stability_test_v5.txt b/qa/stability_test_v5.txt new file mode 100644 index 0000000..4fec44f Binary files /dev/null and b/qa/stability_test_v5.txt differ diff --git a/qa/stability_test_v6.txt b/qa/stability_test_v6.txt new file mode 100644 index 0000000..1c64919 Binary files /dev/null and b/qa/stability_test_v6.txt differ diff --git a/qa/stability_test_v7.txt b/qa/stability_test_v7.txt new file mode 100644 index 0000000..ee341ba Binary files /dev/null and b/qa/stability_test_v7.txt differ diff --git a/qa/test_age_fix.py b/qa/test_age_fix.py new file mode 100644 index 0000000..479c904 --- /dev/null +++ b/qa/test_age_fix.py @@ -0,0 +1,29 @@ +import asyncio +import sys +import os + +# 将当前目录加入路径以便导入 qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def test_age_fix(): + # 模拟用户的情况:带年龄的报告 + report_text = "肝脏大小、形态正常,表面光整。" + + mock_report_data = { + "report": report_text, + "examinePart": "全腹", + "patient_info": { + "sex": "男", + "patientName": "张三", + "age": "36" + } + } + + print("--- Testing Age Context Fix ---") + result = await qc_manager.run_qc(mock_report_data) + print(result) + +if __name__ == "__main__": + asyncio.run(test_age_fix()) diff --git a/qa/test_case_1.py b/qa/test_case_1.py new file mode 100644 index 0000000..c83a5f0 --- /dev/null +++ b/qa/test_case_1.py @@ -0,0 +1,49 @@ +import asyncio +import sys +import os + +# 将当前目录加入路径以便导入 qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def test_case_1(): + # 用户提供的报告 + report_1 = """ +【字段:超声所见】: +I级产前彩色多普勒超声检查: +胎头位置:右中腹部,双顶径: 81 mm 头围: 296 mm 腹围:284 mm 股骨长: 61 mm。 +胎方位:横位。 +胎儿腹部胃泡旁可见一大小约18x16mm的囊性暗区,胃泡大小约48x21mm。 +脊柱部分显示。 +胎盘位于子宫后壁,胎盘内见光点分布均匀,厚 29 mm。 +羊水暗区:80 mm,指数:246 mm 。 +脐动脉两条;胎儿颈部未见压迹。 +脐动脉S/D值: 2.4。 +因胎位关系,胎儿颜面部及四肢部分显示欠清。  + +【字段:超声提示】: +宫内晚期妊娠,单活胎,如孕32周大小。 +胎儿腹部双泡征,十二指肠闭锁不排除,建议上级医院产前诊断检查。 +胎儿脐带未见绕颈。 +脐动脉频谱未见异常。 +胎盘成熟度:I级。 +羊水量多。 +估计胎重:1924 g+/-281g。 +(I级产前超声检查主要为解决临床特定问题而进行的产前超声检查,不是以筛查胎儿畸形为主要目的的超声检查。由于多因素影响(孕妇腹壁厚度、胎位、羊水、孕周等)超声观察,请理解超声检查具有局限性以及因胎儿生长发育过程中的变化造成结果的不确定性和随访的必要性。) + """ + + data_1 = { + "report": report_1, + "examinePart": "产前彩色多普勒超声检查", + "patient_info": {"sex": "女", "age": "28"} + } + + print("DEBUG: Case 1 Start") + result = await qc_manager.run_qc(data_1) + print("\nRESULT_START") + print(result) + print("RESULT_END") + +if __name__ == "__main__": + asyncio.run(test_case_1()) diff --git a/qa/test_debug.py b/qa/test_debug.py new file mode 100644 index 0000000..ab8fca5 --- /dev/null +++ b/qa/test_debug.py @@ -0,0 +1,31 @@ +import asyncio +import sys +import os + +sys.path.append(os.path.dirname(__file__)) +from qc_engine import qc_manager + +async def debug_checks(): + report_text = "超声所见:肝内见多发点片状冥想异常高灶。" + patient_info = {"sex": "男", "age": "36"} + examine_part = "肝胆" + + print("--- Testing Rule Engine ---") + findings = qc_manager.rule_engine.run_checks(report_text, patient_info, examine_part) + print("Rule Findings:", findings) + # Test 3: Lateral Mismatch (User Case) + report_text_side = """超声所见: +两侧肺野内肺纹理走行、分布大致如常,胸膜无明显增厚与粘连。 +右膝关节髌骨、设骨外侧胫骨平台外侧缘、膝关节诸骨未见明显错位性骨折征象。 + +超声提示: +胸部平扫未见明显异常,随诊; +左膝关节髌骨、骨外侧错位; +左膝关节髌上囊积脂血症。""" + examine_part_side = "胸部平扫 右膝平扫" + print("\n--- Testing Lateral Mismatch (User Case) ---") + findings_side = qc_manager.rule_engine.run_checks(report_text_side, patient_info, examine_part_side) + print("Lateral Findings:", findings_side) + +if __name__ == "__main__": + asyncio.run(debug_checks()) diff --git a/qa/test_highlight_debug.py b/qa/test_highlight_debug.py new file mode 100644 index 0000000..f3d784e --- /dev/null +++ b/qa/test_highlight_debug.py @@ -0,0 +1,58 @@ +import re, json + +# 模拟后端实际返回的 error_report(根据用户截图重建) +raw = ( + "### 超声报告质控分析报告\n\n" + "#### 🎯 综合评分:**60 分**\n\n" + "#### 📝 详细建议清单:\n" + "- **[严重错误]** 左膝关节髌骨、骨外侧错位;\n\n" + "```json\n" + '{\n "score": 60,\n "issues": [\n' + ' {\n "original": "左膝关节髌骨、骨外侧错位;",\n' + ' "reason": "侧位冲突",\n "suggestion": "修正为右膝",\n' + ' "type": "严重错误"\n }\n ],\n' + ' "corrected_fields": {"bSee": "右膝...", "bHint": "右膝..."}\n}\n' + "```\n" +) + +print("=== 原始字符串末尾 ===") +print(repr(raw[-100:])) + +# 测试反引号字符编码 +idx = raw.find("```json") +print(f"\n=== 反引号位置: {idx} ===") +if idx >= 0: + print(f"字符编码: {[ord(c) for c in raw[idx:idx+7]]}") + print(f"内容: {repr(raw[idx:idx+20])}") + +# 测试正则匹配 +pattern = r"```json[\s\S]*?```" +blocks = re.findall(pattern, raw) +print(f"\n=== Python正则找到 {len(blocks)} 个代码块 ===") +for i, b in enumerate(blocks): + print(f"Block {i}: {repr(b[:80])}") + +# 模拟JS的matchAll +import re +all_blocks = list(re.finditer(r"```json([\s\S]*?)```", raw)) +print(f"\n=== finditer找到 {len(all_blocks)} 个 ===") +for m in all_blocks: + try: + parsed = json.loads(m.group(1).strip()) + print(f"解析成功: score={parsed.get('score')}, issues={len(parsed.get('issues',[]))}") + for issue in parsed.get('issues', []): + orig = issue.get('original', '') + has_left = '左' in orig + has_right = '右' in orig + print(f" orig={repr(orig)}, hasLeft={has_left}, hasRight={has_right}") + if has_left: + print(f" -> 应高亮: '左'") + if has_right: + print(f" -> 应高亮: '右'") + except Exception as e: + print(f"解析失败: {e}") + +# 移除代码块后的文本 +clean = re.sub(r"```json[\s\S]*?```", "", raw).strip() +print(f"\n=== 清理后文本 ===") +print(clean) diff --git a/qa/test_qc_complex.py b/qa/test_qc_complex.py new file mode 100644 index 0000000..e9ea72e --- /dev/null +++ b/qa/test_qc_complex.py @@ -0,0 +1,66 @@ +import asyncio +import sys +import os +import re + +# Add the current directory to path so we can import qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def test_complex_report(): + report_text = """ + 姓名:张世红 + 性别:女 + 年龄:49 + 检查部位:全腹部螺旋CT平扫加扫50层 + + 检查所见: + 肝脏大小、形态正常、表面光整,肝脏各叶比例协调,肝左叶见多发点片状增高灶,肝内血管走行正常,肝内外胆管无扩张,胆囊不大,壁不厚,内未见明显异常。双肾见多发点片状致密增高灶,左侧输尿管腹段见多发点片状致密增高灶,最大直径约0.8cm,左肾积水;胰腺大小形态及密度正常,脾不大,质均匀,腹膜后未见肿大淋巴结。双侧血管走行未见明显异常,腹腔内结构正常,膀胱充盈良好,壁光滑无增厚,内未见明显异常灶度影。前列腺大小形态正常,内未见异常密度,双侧精囊腺正常,盆腔内未见肿大淋巴结。小肠内少量积气。 + + 诊断结论: + 1.左侧输尿管腹段多发结石,左肾积水; + 2.双肾结石; + 3.肝左叶内钙化灶 + 4.小肠内少量积气。 + """ + + mock_report_data = { + "report": report_text, + "examinePart": "全腹部螺旋CT平扫加扫50层", + "patient_info": { + "sex": "女", + "patientName": "张世红", + "age": "49" + }, + "model": "consensus" + } + + print("="*50) + print("🚀 开始测试复杂样本:性别与器官严重冲突测试") + print("="*50) + print(f"姓名: {mock_report_data['patient_info']['patientName']}") + print(f"性别: {mock_report_data['patient_info']['sex']}") + print(f"检查部位: {mock_report_data['examinePart']}") + print("-" * 20) + + try: + result = await qc_manager.run_qc(mock_report_data) + print("\n✅ 质控分析报告:") + print(result) + + # 验证 JSON + json_match = re.search(r"```json\s+([\s\S]*?)\s+```", result) + if json_match: + print("\n🔍 提取到的 JSON 结构:") + print(json_match.group(1)) + else: + print("\n⚠️ 未能在结果中找到合法的 JSON 块") + + except Exception as e: + print(f"\n❌ 测试失败: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + asyncio.run(test_complex_report()) diff --git a/qa/test_qc_local.py b/qa/test_qc_local.py new file mode 100644 index 0000000..ba983da --- /dev/null +++ b/qa/test_qc_local.py @@ -0,0 +1,70 @@ +import asyncio +import sys +import os +import re + +# Add the current directory to path so we can import qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def test_local_report(): + report_text = """ + 姓名:郭翠 + 性别:男 + 年龄:47 + 检查部位:子宫,卵巢 + + 检查所见: + 膀胱充盈良好,子宫前位,体积大笑如常,宫区光点分布均匀,内膜厚约0.9cm,宫颈厚约3.5cm,于左侧附件区探及一大小约2.2x1.8cm的无回声区,边界清晰,后方回声增强,余未见其他明显异常回声。彩色多普勒未探及异常血流信号。 + + 诊断结论: + 1.宫颈肥厚 + 2.右侧附件区囊肿 + """ + + mock_report_data = { + "report": report_text, + "examinePart": "子宫,卵巢", + "patient_info": { + "sex": "男", + "patientName": "郭翠", + "age": "47" + }, + "model": "consensus" # 使用交叉验证进行一致性测试 + } + + print("="*50) + print("🚀 开始本地质控一致性测试 (运行3次)") + print("="*50) + + all_results = [] + for i in range(3): + print(f"\n[第 {i+1} 次运行] 分析中...") + try: + result = await qc_manager.run_qc(mock_report_data) + all_results.append(result) + print(f"✅ 第 {i+1} 次运行完成") + except Exception as e: + print(f"❌ 第 {i+1} 次运行失败: {e}") + + print("\n" + "="*50) + print("📊 一致性分析总结") + print("="*50) + + # 改进的评分提取正则 + for idx, res in enumerate(all_results): + # 尝试匹配各种可能的评分格式 + score_match = re.search(r"(?:总计得分|最终评分)[::]\D*(\d+)/100", res) + score = score_match.group(1) if score_match else "未知" + print(f"运行 {idx+1}: 评分={score}, 结果长度={len(res)}") + if score == "未知": + print(f"--- 运行 {idx+1} 未提取到评分,内容片段: {res[-200:].strip()} ---") + + print("\n【第 3 次运行的完整输出文本】:") + print("-" * 20) + print(all_results[-1]) + print("-" * 20) + +if __name__ == "__main__": + asyncio.run(test_local_report()) diff --git a/qa/test_qc_semantics.py b/qa/test_qc_semantics.py new file mode 100644 index 0000000..d80925e --- /dev/null +++ b/qa/test_qc_semantics.py @@ -0,0 +1,30 @@ +import asyncio +from qc_engine import qc_manager + +async def test_semantics(): + test_cases = [ + { + "name": "拼音与语义冲突测试", + "report": "患者因胸痛就诊,检查发现右肺起步器位置正常。xbjy量约20ml。测量病灶大笑约3.2cm。", + "patient_info": {"sex": "男", "age": "45"}, + "examinePart": "胸部CT" + }, + { + "name": "知识图谱实体位置关系测试", + "report": "超声显示:肝脏形态正常,内可见起搏器影,大小约2x3cm。骨质只能说提示疏松建议进一步检查。", + "patient_info": {"sex": "女", "age": "70"}, + "examinePart": "腹部超声" + } + ] + + for case in test_cases: + print(f"\n" + "="*50) + print(f"🚀 开始测试:{case['name']}") + print(f"原始文本: {case['report']}") + print("-" * 20) + + result = await qc_manager.run_qc(case) + print(result) + +if __name__ == "__main__": + asyncio.run(test_semantics()) diff --git a/qa/test_result.txt b/qa/test_result.txt new file mode 100644 index 0000000..b4195dd Binary files /dev/null and b/qa/test_result.txt differ diff --git a/qa/test_result_combined.txt b/qa/test_result_combined.txt new file mode 100644 index 0000000..2adac8a Binary files /dev/null and b/qa/test_result_combined.txt differ diff --git a/qa/test_score_stability.py b/qa/test_score_stability.py new file mode 100644 index 0000000..788477a --- /dev/null +++ b/qa/test_score_stability.py @@ -0,0 +1,29 @@ +import asyncio +import sys +import os + +# 将当前目录加入路径以便导入 qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def test_score_stability(): + # 模拟用户提到的带“冥想”错误的报告 + report_text = "超声所见:肝脏大小、形态正常,表面光整,肝内见多发点片状冥想异常高灶。双肾见多发点片状冥想灶密度影。" + + mock_report_data = { + "report": report_text, + "examinePart": "肝胆脾胰双肾", + "patient_info": { + "sex": "男", + "patientName": "测试", + "age": "36" + } + } + + print("--- Testing Score Stability (Terminology Typo) ---") + result = await qc_manager.run_qc(mock_report_data) + print(result) + +if __name__ == "__main__": + asyncio.run(test_score_stability()) diff --git a/qa/test_user_report.py b/qa/test_user_report.py new file mode 100644 index 0000000..d66d375 --- /dev/null +++ b/qa/test_user_report.py @@ -0,0 +1,66 @@ +import asyncio +import sys +import os + +# 将当前目录加入路径以便导入 qc_engine +sys.path.append(os.path.dirname(__file__)) + +from qc_engine import qc_manager + +async def run_test(name, report_data): + print("\n" + "="*50) + print(f"🚀 测试案例: {name}") + print("="*50) + try: + result = await qc_manager.run_qc(report_data) + print("\n【质控分析结果】:") + print("-" * 20) + print(result) + print("-" * 20) + except Exception as e: + print(f"❌ 分析失败: {e}") + +async def test_all(): + # 案例1: 用户提供的正常(高质量)产前报告 + report_1 = """ +【字段:超声所见】: +I级产前彩色多普勒超声检查: +胎头位置:右中腹部,双顶径: 81 mm 头围: 296 mm 腹围:284 mm 股骨长: 61 mm。 +胎方位:横位。 +胎儿腹部胃泡旁可见一大小约18x16mm的囊性暗区,胃泡大小约48x21mm。 +胎盘位于子宫后壁,羊水暗区:80 mm,指数:246 mm 。 + +【字段:超声提示】: +宫内晚期妊娠,单活胎,如孕32周大小。 +胎儿腹部双泡征,十二指肠闭锁不排除,建议上级医院产前诊断检查。 +羊水量多。 + """ + + # 案例2: 故意构造的错误报告(性别冲突 + 逻辑矛盾) + report_2 = """ +【字段:超声所见】: +患者性别: 男 +检查部位: 子宫 +子宫增大,宫腔内可见一胎儿,双顶径 90mm。 +【字段:超声提示】: +1. 宫内妊娠(男)。 +2. 子宫肥大。 + """ + + data_1 = { + "report": report_1, + "examinePart": "产前超声", + "patient_info": {"sex": "女", "age": "28"} + } + + data_2 = { + "report": report_2, + "examinePart": "盆腔超声", + "patient_info": {"sex": "男", "age": "45"} + } + + await run_test("用户产前报告(应当无质量问题)", data_1) + await run_test("错误报告(应当发现性别冲突)", data_2) + +if __name__ == "__main__": + asyncio.run(test_all()) diff --git a/qa/tyMri.py b/qa/tyMri.py new file mode 100644 index 0000000..da7990a --- /dev/null +++ b/qa/tyMri.py @@ -0,0 +1,233 @@ +from flask import Flask, request,jsonify +from flask_cors import CORS +app = Flask(__name__) +CORS(app, supports_credentials=True) +import time +import jieba +import re +import dashscope +from http import HTTPStatus +# 配置 Qwen API +dashscope.api_key = 'sk-c7d5687a4d044489974b65bde467e93e' +dashscope.base_url = 'https://dashscope.aliyuncs.com/compatible-mode/v1' +def USReport_LLM(report): + + + query = """ + 请列出报告中的常见错误,特别关注错别字、拼写错误、单位使用问题。请确保单位用数字形式表达,并指出需要修改的地方。 + """ + + custom_prompt = f""" + 你是一个医学报告专家,擅长阅读和撰写医学报告。在分析报告时,请特别注意以下几点: + + **错别字和拼写错误**:指出任何拼写错误或术语使用不当的情况。 + **语法错误**:指出任何语法错误。 + **单位使用**:所有尺寸单位必须以数字形式表达,避免文字形式,并保持一致性。 + **信息不一致**:检查报告中是否存在信息不一致的情况。 + **术语使用**:确保所有术语符合医学标准。 + **格式错误**:检查报告格式是否一致,有无错误。 + **漏项**:检查报告是否缺少必要信息。 + **上下文错误**:检查上下文是否存在逻辑错误或内容不符的情况。 + **性别与检查部位不符**:确保报告中涉及性别特定的器官信息明确且一致。 + + 请根据以下报告进行分析,并保持简洁明了的回应: + 、、、 + {report} + 、、、 + + 你是一个医学报告专家,请仔细阅读以下报告,列出发现的所有错误和问题。**不要**将缺少图像和患者隐私信息视为信息完整性或格式规范性问题。只需检查报告是否包含所有必要信息,如检查日期、患者姓名、检查部位等。 + + **评分与范例生成**: + + **评分报告**: + - 信息完整性:检查报告是否包含所有必要信息,如检查日期、患者姓名、检查项目等。请给出具体评分。(满分20分) + - 表达清晰性:检查报告语言是否清晰易懂。请给出具体评分。(满分20分) + - 描述专业性:报告中使用的医学术语是否正确,描述是否准确。请给出具体评分。(满分20分) + - 临床相关性:检查报告是否提供了与患者临床状况相关的有用信息。请给出具体评分。(满分20分) + - 格式规范性:报告是否遵循医学报告的标准格式,包括检查所见和结论的标题区分。请给出具体评分。(满分20分) + + 请逐项列出评分细节,并给出总分并用**粗体**标注,格式如:**总计得分:80/100**。 + + **范例报告**: + - 请在开始处注明“此处为范例报告”。 + - 使用原医生的报告内容,避免增加未提及的症状或信息。 + - 关注检查所见和检查结论部分的语法、拼写、报告格式等问题,进行改进。 + + 、、、 + {report} + 、、、 + 用户问题: + 、、、 + {query} + 、、、 + """ + + messages = [ + {'role': 'system', 'content': '你是医学报告专家'}, + {'role': 'user', 'content': custom_prompt} # 添加 user 角色消息 + ] + + response = dashscope.Generation.call( + model="qwen-max", + messages=messages, + # 将输出设置为"message"格式 + result_format='message' + ) + + # 检查响应并输出结果 + if response.status_code == HTTPStatus.OK: + return response.output.choices[0]['message']['content'] + else: + print(f"请求错误: {response.status_code}, 错误消息: {response.message}") + return None + +def USReport_VLLM(report_text, query, image_urls): + # 定义生成prompt的函数 + def generate_prompt(report, query): + prompt = f""" + 你是一个医学报告专家,擅长阅读和撰写医学报告。擅长分析和解读超声影像,并根据影像生成相应的医学报告。请按照以下步骤进行分析: + + **影像质量评估**: + - 评估输入的超声图像是否清晰,是否存在伪影或模糊区域。无需说出具体哪些部位。 + - 判断图像是否能准确显示关键解剖结构。无需说出具体哪些部位。 + - 评估图像截取的质量是否合格。无需说出具体哪些部位。 + + + 请根据以下报告进行分析,并保持简洁明了的回应: + 、、、 + {report} + 、、、 + + **超声报告总评分**: + - 信息完整性:检查报告是否包含所有必要信息,如检查日期、患者姓名、检查项目等。请给出具体评分。(满分20分) + - 表达清晰性:检查报告语言是否清晰易懂。请给出具体评分。(满分20分) + - 描述专业性:报告中使用的医学术语是否正确,描述是否准确。请给出具体评分。(满分20分) + - 临床相关性:报告是否提供了与患者临床状况相关的有用信息。请给出具体评分。(满分20分) + - 格式规范性:报告是否遵循医学报告的标准格式。请给出具体评分。(满分10分) + - 影像清晰度:评估影像的清晰度和细节展示程度。请给出具体评分。(满分10分) + + 请逐项列出评分细节,并给出总分并用**粗体**标注,格式如:**总计得分:80/100**。 + + 、、、 + {report} + 、、、 + 用户问题: + 、、、 + {query} + 、、、 + """ + return prompt + + prompt = generate_prompt(report_text, query) + + # 构造消息,确保超声图像和文本都传递正确 + messages = [ + { + "role": "user", + "content": [ + *[{"image": url} for url in image_urls], # 添加所有图片链接 + {"text": prompt} # 添加文本提示 + ] + } + ] + + # 调用 Qwen-VL-Max 模型 + response = dashscope.MultiModalConversation.call( + model='qwen-vl-max', + messages=messages + ) + + # 检查响应并输出结果 + if response.status_code == HTTPStatus.OK: + return response.output.choices[0]['message']['content'] + else: + print(f"请求错误: {response.status_code}, 错误消息: {response.message}") + return None + +def format_vllm_output(vllm_output): + """ + 格式化第二段代码的输出结果。 + """ + # 提取文本内容,确保提取的是字符串 + text = vllm_output[0].get('text', '') + + # 检查是否成功提取字符串并非空 + if isinstance(text, str) and text: + # 分割文本内容,按段落分割 + sections = text.split('\n\n') + + # 定义一个函数来解析每个部分 + def parse_section(section): + lines = section.split('\n') + parsed_section = {} + for line in lines: + if ':' in line: + key, value = line.split(':', 1) + parsed_section[key.strip()] = value.strip() + else: + parsed_section[line] = None + return parsed_section + + # 解析每个部分 + parsed_output = {} + for section in sections: + parsed_section = parse_section(section) + parsed_output.update(parsed_section) + + # 格式化解析后的内容 + formatted_output = "" + for key, value in parsed_output.items(): + if value is not None: + formatted_output += f"{key}: {value}\n"# + else: + formatted_output += f"{key}\n" + + return formatted_output + else: + return "未能正确提取文本内容或文本为空" + +def US_Report_CompleteAnalysis(report,image_urls): + # 调用第一段代码 + llm_output = USReport_LLM(report) + + # 提取从开头到 **评分报告**: 这部分内容 + if llm_output: + report_text = llm_output.split('**评分报告**:')[0] + example_report_text = llm_output.split('**范例报告**:')[1] if '**范例报告**:' in llm_output else "" + + # 定义用户查询 + query = """ + 请根据输入的超声报告文字的问题总结和超声图像来评估整体超声报告的质量,需要按照严格标准给超声报告打分。 + """ + + # 定义超声图像 URL 列表 + """ image_urls = [ + "https://ultrasound-imgs.oss-eu-central-1.aliyuncs.com/Ulstrasound_IMG1.jpg", + "https://ultrasound-imgs.oss-eu-central-1.aliyuncs.com/Ulstrasound_IMG2.jpg", + "https://ultrasound-imgs.oss-eu-central-1.aliyuncs.com/Ulstrasound_IMG3.jpg", + "https://ultrasound-imgs.oss-eu-central-1.aliyuncs.com/Ulstrasound_IMG4.jpg", + "https://ultrasound-imgs.oss-eu-central-1.aliyuncs.com/Ulstrasound_IMG5.jpg" + ] """ + + # 调用第二段代码 + vllm_output = USReport_VLLM(report_text, query, image_urls) + + # 格式化第二段代码的输出结果 + formatted_vllm_output = format_vllm_output(vllm_output) + + # 拼接完整的分析报告 + complete_analysis = f"{report_text}\n\n{formatted_vllm_output}\n\n{example_report_text}" + + return complete_analysis + else: + print("第一段代码输出为空") + return None +@app.route('/imgapi', methods=['POST']) +def analyze_report_img(): + user_info = request.get_json() + report= user_info.get("report") + image_urls= user_info.get("image_urls") + result=US_Report_CompleteAnalysis(report,image_urls) + #print(result) + return jsonify({"result":result}) +app.run(host='0.0.0.0', port=5000) diff --git a/qa/zhipu_new.py b/qa/zhipu_new.py new file mode 100644 index 0000000..afea828 --- /dev/null +++ b/qa/zhipu_new.py @@ -0,0 +1,54 @@ +from flask import Flask, request, jsonify +from flask_cors import CORS +import asyncio +from qc_engine import QCManager + +app = Flask(__name__) +CORS(app, supports_credentials=True) + +# 初始化质控管理器 +qc_manager = QCManager() + +@app.route('/') +def hello(): + return 'Ultrasound AI QC Engine is running.' + +@app.route('/h', methods=["POST"]) +def zhipu(): + """ + 对接前端的质控接口 + """ + user_info = request.get_json() + + # 构造传递给 QCManager 的数据 + report_data = { + "report": user_info.get("report", ""), + "patient_info": user_info.get("patient_info", {}), + "examinePart": user_info.get("examinePart", ""), + "image_urls": user_info.get("image_urls", []) + } + + # 运行异步质控逻辑 + try: + # 在 Flask 同步路由中运行异步方法 + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + final_analysis = loop.run_until_complete(qc_manager.run_qc(report_data)) + loop.close() + + # 为了兼容旧前端代码,将结果放入 error_report 字段 + # 此时 final_analysis 已经是包含 Markdown 和 JSON 的字符串 + return jsonify({ + 'error_report': final_analysis, + 'corrected_report': '建议查看下方的原地纠错建议。' + }) + except Exception as e: + print(f"质控运行出错: {e}") + return jsonify({ + 'error_report': f"AI 质控分析暂时不可用: {str(e)}", + 'corrected_report': '' + }), 500 + +if __name__ == '__main__': + # 注意:生产环境建议使用 gunicorn + app.run(host='0.0.0.0', port=5000) diff --git a/qa/zhipu_v2.py b/qa/zhipu_v2.py new file mode 100644 index 0000000..afea828 --- /dev/null +++ b/qa/zhipu_v2.py @@ -0,0 +1,54 @@ +from flask import Flask, request, jsonify +from flask_cors import CORS +import asyncio +from qc_engine import QCManager + +app = Flask(__name__) +CORS(app, supports_credentials=True) + +# 初始化质控管理器 +qc_manager = QCManager() + +@app.route('/') +def hello(): + return 'Ultrasound AI QC Engine is running.' + +@app.route('/h', methods=["POST"]) +def zhipu(): + """ + 对接前端的质控接口 + """ + user_info = request.get_json() + + # 构造传递给 QCManager 的数据 + report_data = { + "report": user_info.get("report", ""), + "patient_info": user_info.get("patient_info", {}), + "examinePart": user_info.get("examinePart", ""), + "image_urls": user_info.get("image_urls", []) + } + + # 运行异步质控逻辑 + try: + # 在 Flask 同步路由中运行异步方法 + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + final_analysis = loop.run_until_complete(qc_manager.run_qc(report_data)) + loop.close() + + # 为了兼容旧前端代码,将结果放入 error_report 字段 + # 此时 final_analysis 已经是包含 Markdown 和 JSON 的字符串 + return jsonify({ + 'error_report': final_analysis, + 'corrected_report': '建议查看下方的原地纠错建议。' + }) + except Exception as e: + print(f"质控运行出错: {e}") + return jsonify({ + 'error_report': f"AI 质控分析暂时不可用: {str(e)}", + 'corrected_report': '' + }), 500 + +if __name__ == '__main__': + # 注意:生产环境建议使用 gunicorn + app.run(host='0.0.0.0', port=5000) diff --git a/sfu-server/guannancs_web_mediasoup/.babelrc b/sfu-server/guannancs_web_mediasoup/.babelrc new file mode 100644 index 0000000..13b604e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "ignore": [ + "./src/components/system/public/TComm/TComm-mini.js" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"] +} diff --git a/sfu-server/guannancs_web_mediasoup/.editorconfig b/sfu-server/guannancs_web_mediasoup/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/sfu-server/guannancs_web_mediasoup/.gitignore b/sfu-server/guannancs_web_mediasoup/.gitignore new file mode 100644 index 0000000..6697216 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.svn +.history +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/sfu-server/guannancs_web_mediasoup/README.md b/sfu-server/guannancs_web_mediasoup/README.md new file mode 100644 index 0000000..8a243e1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/README.md @@ -0,0 +1,23 @@ +# imurs + +> A Vue.js project + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build + +# build for production and view the bundle analyzer report +npm run build --report +``` + +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). + +## Copy the yunnan_web_suixi project diff --git a/sfu-server/guannancs_web_mediasoup/index.html b/sfu-server/guannancs_web_mediasoup/index.html new file mode 100644 index 0000000..b6b5ce0 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/index.html @@ -0,0 +1,23 @@ + + + + + + + 灌南县中医医院-医共体远程超声系统 + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/jsconfig.json b/sfu-server/guannancs_web_mediasoup/jsconfig.json new file mode 100644 index 0000000..9886b19 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/jsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@/*": ["src/*"], + "assets/*": ["src/assets/*"], + "agora/*": ["src/agora/*"], + "public/*": ["src/components/system/public/*"], + }, + }, + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/package-lock.json b/sfu-server/guannancs_web_mediasoup/package-lock.json new file mode 100644 index 0000000..cf01662 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/package-lock.json @@ -0,0 +1,19402 @@ +{ + "name": "imurs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "imurs", + "version": "1.0.0", + "dependencies": { + "agora-rtc-sdk-ng": "^4.19.3", + "agora-rtm-sdk": "^1.2.0", + "ali-oss": "^6.0.1", + "awaitqueue": "^3.2.2", + "axios": "^1.7.3", + "crypto-js": "^4.2.0", + "echarts": "^5.6.0", + "element-china-area-data": "^4.1.1", + "element-ui": "^2.15.0", + "events": "^3.0.0", + "jsencrypt": "^3.3.2", + "lodash": "^4.14.2", + "moment": "^2.22.2", + "pdfjs-dist": "^2.12.313", + "pdfvuer": "^1.7.4", + "socket.io-client": "^4.7.5", + "viewerjs": "^1.3.1", + "vue": "^2.5.2", + "vue-router": "^3.0.1", + "vuex": "^3.6.2" + }, + "devDependencies": { + "@rollup/plugin-inject": "^5.0.5", + "@vitejs/plugin-vue2": "^2.3.1", + "@vitejs/plugin-vue2-jsx": "^1.1.1", + "sass": "^1.77.8", + "vite": "^5.3.4", + "vite-plugin-chunk-split": "^0.5.0" + } + }, + "node_modules/@achrinza/node-ipc": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@achrinza/node-ipc/-/node-ipc-9.2.2.tgz", + "integrity": "sha512-b90U39dx0cU6emsOvy5hxU4ApNXnE3+Tuo8XQZfiKTGelDwpMwBVgBP7QX6dGTcJgu/miyJuNJ/2naFBliNWEw==", + "dependencies": { + "@node-ipc/js-queue": "2.0.3", + "event-pubsub": "4.3.0", + "js-message": "1.0.7" + }, + "engines": { + "node": "8 || 10 || 12 || 14 || 16 || 17" + } + }, + "node_modules/@agora-js/media": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/media/-/media-4.19.3.tgz", + "integrity": "sha512-isdguA/wAYRILVN831Xuyaz7MWqhWBECuAoIQg+7aATbRNtNO8Y/OvWpb9dhHnUgyf8V/CIH1wz/6dWXQtIXTA==", + "dependencies": { + "@agora-js/report": "^4.19.3", + "@agora-js/shared": "^4.19.3", + "agora-rte-extension": "^1.2.3", + "axios": "^0.27.2", + "pako": "^2.1.0", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/@agora-js/media/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/media/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@agora-js/media/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/@agora-js/report": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/report/-/report-4.19.3.tgz", + "integrity": "sha512-g64mpKEhuItmoKv8YJdjJAZyFxKwfCtOZ99RZ2d2HcN9yuKT7WoMJ1TbHdCl9nwigtxBloZTv49ukOp2qIUpcw==", + "dependencies": { + "@agora-js/shared": "^4.19.3", + "axios": "^0.27.2" + } + }, + "node_modules/@agora-js/report/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/report/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@agora-js/shared": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@agora-js/shared/-/shared-4.19.3.tgz", + "integrity": "sha512-APC7HEA4240pSTk3Ri++lzzW+E4lr35YsgU8Va4WciLDQSlDrTybxiyY0gdZ5DqhrRE4Si0bOX32yc3p1HllWg==", + "dependencies": { + "axios": "^0.27.2", + "ua-parser-js": "^0.7.34" + } + }, + "node_modules/@agora-js/shared/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@agora-js/shared/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "dependencies": { + "@babel/types": "^7.27.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==", + "dependencies": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmmirror.com/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "peer": true, + "dependencies": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@intervolga/optimize-cssnano-plugin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/@intervolga/optimize-cssnano-plugin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "peer": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@node-ipc/js-queue": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", + "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", + "dependencies": { + "easy-stack": "1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "peer": true, + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "peer": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "peer": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "peer": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "peer": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "peer": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "peer": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "peer": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "peer": true + }, + "node_modules/@types/node": { + "version": "24.0.4", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.0.4.tgz", + "integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==", + "peer": true, + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmmirror.com/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "peer": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "peer": true + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/@types/source-list-map/-/source-list-map-0.1.6.tgz", + "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", + "peer": true + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/@types/tapable/-/tapable-1.0.12.tgz", + "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", + "peer": true + }, + "node_modules/@types/uglify-js": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/@types/uglify-js/-/uglify-js-3.17.5.tgz", + "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", + "peer": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.40", + "resolved": "https://registry.npmmirror.com/@types/webpack/-/webpack-4.41.40.tgz", + "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmmirror.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "peer": true, + "dependencies": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vitejs/plugin-vue2": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue2/-/plugin-vue2-2.3.3.tgz", + "integrity": "sha512-qexY6+bbwY8h0AZerzUuGywNTi0cLOkbiSbggr0R3WEW95iB2hblQFyv4MAkkc2vm4gZN1cO5kzT1Kp6xlVzZw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >= 16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "vue": "^2.7.0-0" + } + }, + "node_modules/@vitejs/plugin-vue2-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue2-jsx/-/plugin-vue2-jsx-1.1.1.tgz", + "integrity": "sha512-r6BjWP2aVg4/uXdjf+wMwLuk0LQEUbPTC9UcRpWMhWsfVl9n/8RhiG6pQPO9g+oab/g3fHoZ2bmJJbKuraqCsw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.20.2", + "@rollup/pluginutils": "^5.0.2", + "@vue/babel-preset-jsx": "^1.4.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "peerDependencies": { + "vite": "^2.9.13 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "vue": "^2.7.0" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-4.5.19.tgz", + "integrity": "sha512-GdxvNSmOw7NHIazCO8gTK+xZbaOmScTtxj6eHVeMbYpDYVPJ+th3VMLWNpw/b6uOjwzzcyKlA5dRQ1DAb+gF/g==", + "peer": true + }, + "node_modules/@vue/cli-shared-utils": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.19.tgz", + "integrity": "sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==", + "dependencies": { + "@achrinza/node-ipc": "9.2.2", + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "optional": true, + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "optional": true, + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "peer": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "peer": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "peer": true + }, + "node_modules/@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "peer": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "html-webpack-plugin": ">=2.26.0", + "webpack": ">=4.0.0" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", + "optional": true, + "peer": true + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "peer": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/agora-rtc-sdk-ng": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/agora-rtc-sdk-ng/-/agora-rtc-sdk-ng-4.19.3.tgz", + "integrity": "sha512-vzIZ2wHoVRM/38YTCKIP6nQ3ehiBUfvpExsJw4Ala9QhCK6J8qMxmZxqBoNmz6jigMfMWi7c8UVZThbaNQM6Pg==", + "dependencies": { + "@agora-js/media": "^4.19.3", + "@agora-js/report": "^4.19.3", + "@agora-js/shared": "^4.19.3", + "agora-rte-extension": "^1.2.3", + "axios": "^0.27.2", + "formdata-polyfill": "^4.0.7", + "ua-parser-js": "^0.7.34", + "webrtc-adapter": "8.2.0" + } + }, + "node_modules/agora-rtc-sdk-ng/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/agora-rtc-sdk-ng/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/agora-rte-extension": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/agora-rte-extension/-/agora-rte-extension-1.2.3.tgz", + "integrity": "sha512-k3yNrYVyzJRoQJjaJUktKUI1XRtf8J1XsW8OzYKFqGlS8WQRMsES1+Phj2rfuEriiLObfuyuCimG6KHQCt5tiw==" + }, + "node_modules/agora-rtm-sdk": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/agora-rtm-sdk/-/agora-rtm-sdk-1.5.1.tgz", + "integrity": "sha512-4zMZVijEOTimIaY4VUS6kJxg7t+nTV3Frtt01Ffs6dvkOrPmpeuCu/1MX88QgAOE04IBiLo0l89ysc+woVn2FA==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ali-oss": { + "version": "6.17.1", + "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.17.1.tgz", + "integrity": "sha512-v2oT3UhSJTH/LrsscVvi7iEGrnundydNaFzpYAKatqOl4JNcBV4UiwtlJU+ZHLys040JH2k+CutznA0GoE+P2w==", + "dependencies": { + "address": "^1.0.0", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^2.2.0", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.0.0", + "js-base64": "^2.5.2", + "jstoxml": "^2.0.0", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "mz-modules": "^2.1.0", + "platform": "^1.3.1", + "pump": "^3.0.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "^2.33.1", + "utility": "^1.8.0", + "xml2js": "^0.4.16" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "peer": true + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "peer": true, + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "peer": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "peer": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "peer": true + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "peer": true + }, + "node_modules/async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", + "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", + "dependencies": { + "babel-runtime": "6.x" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "peer": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/awaitqueue": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/awaitqueue/-/awaitqueue-3.2.2.tgz", + "integrity": "sha512-48FaZ48Rzb+ypT7PqwcAikewjWoWurgi0ufdQAYWDYWtijF43pX+r3oA6IkeZhFcRCW4BAlIhrHVSpjLjkYk8Q==", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, + "node_modules/awaitqueue/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dependencies": { + "babylon": "^6.18.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmmirror.com/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "peer": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "peer": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bindings/node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "peer": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "peer": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "peer": true + }, + "node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-rsa/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "peer": true + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "peer": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "peer": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "peer": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/cache-loader/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "peer": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cache-loader/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/cache-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "peer": true + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "peer": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "peer": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "peer": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "peer": true + }, + "node_modules/china-area-data": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/china-area-data/-/china-area-data-5.0.1.tgz", + "integrity": "sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cipher-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "peer": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "peer": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clipboardy/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==" + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "peer": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "peer": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "peer": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + } + }, + "node_modules/concat-stream/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "peer": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "peer": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "peer": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "peer": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "peer": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "peer": true + }, + "node_modules/copy-webpack-plugin/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "peer": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.1", + "resolved": "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dependencies": { + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "peer": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "peer": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "peer": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "peer": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "peer": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "peer": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "peer": true + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug-fabulous": { + "version": "0.0.4", + "resolved": "https://registry.npmmirror.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "integrity": "sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==", + "dependencies": { + "debug": "2.X", + "lazy-debug-legacy": "0.0.X", + "object-assign": "4.1.0" + } + }, + "node_modules/debug-fabulous/node_modules/object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "peer": true, + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "peer": true, + "dependencies": { + "execa": "^3.3.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "peer": true + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==", + "dependencies": { + "os-name": "~1.0.3" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "peer": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "peer": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/digest-header": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-1.0.0.tgz", + "integrity": "sha512-sRTuakZ2PkOUCuAaVv+SLjhr/hRf8ldZP0XnGEQ69RFGxmll5fVaMsnRXWKKK4XsUTnJf8+eRPSFNgE/lWa9wQ==", + "dependencies": { + "utility": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "peer": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "peer": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "peer": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "peer": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "peer": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "peer": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "peer": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==", + "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix." + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "peer": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "peer": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "peer": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "peer": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.177", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", + "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==" + }, + "node_modules/element-china-area-data": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/element-china-area-data/-/element-china-area-data-4.2.0.tgz", + "integrity": "sha512-FweMjytiPQOxPPpZfoY7iqGM8IJkEDdJU4aSuVgJOgSKuF/MGXdIQYRw+nF4zZzt1tXmm6RYC2z1iw5G6wKgcQ==", + "dependencies": { + "china-area-data": "^5.0.0", + "lodash-es": "^4.17.15" + } + }, + "node_modules/element-ui": { + "version": "2.15.12", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.12.tgz", + "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==", + "dependencies": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + }, + "peerDependencies": { + "vue": "^2.5.17" + } + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmmirror.com/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==", + "engines": { + "node": ">= 0.11.14" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "peer": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "peer": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "peer": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "peer": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "devOptional": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "peer": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "peer": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "peer": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-glob/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "peer": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "peer": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/fast-glob/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "peer": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "peer": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported." + }, + "node_modules/file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "peer": true, + "dependencies": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/formstream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.1.tgz", + "integrity": "sha512-yHRxt3qLFnhsKAfhReM4w17jP+U1OlhUjnKPPtonwKbIJO7oBP0MvoxkRUwb8AU9n0MIkYy5X5dK6pQnbj+R2Q==", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "pause-stream": "~0.0.11" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmmirror.com/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==", + "dependencies": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmmirror.com/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/glob-stream/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "peer": true + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/gulp-sourcemaps": { + "version": "1.12.1", + "resolved": "https://registry.npmmirror.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz", + "integrity": "sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==", + "dependencies": { + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-sourcemaps/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "peer": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/gzip-size/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "peer": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "peer": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "peer": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "peer": true + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "peer": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "peer": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "peer": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "peer": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "peer": true + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "deprecated": "3.x is no longer supported", + "peer": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "peer": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "peer": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "peer": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "peer": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "peer": true, + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "peer": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "peer": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/icss-utils/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/icss-utils/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "peer": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "peer": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "peer": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "peer": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "peer": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "peer": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "peer": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "peer": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "peer": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "peer": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "peer": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "peer": true + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-type-of": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz", + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==", + "dependencies": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "peer": true + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsencrypt": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.2.tgz", + "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jstoxml": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-2.2.9.tgz", + "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==" + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "peer": true + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ko-sleep": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.1.4.tgz", + "integrity": "sha512-s05WGpvvzyTuRlRE8fM7ru2Z3O+InbJuBcckTWKg2W+2c1k6SnFa3IfiSSt0/peFrlYAXgNoxuJWWVNmWh+K/A==", + "dependencies": { + "ms": "*" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.10.0.tgz", + "integrity": "sha512-RzZu7MeVlE3p1H6Sadc2BhuDGAj7bkeDCBpNq/zSENP4ohJGhso00k5+iYaRwKshIpiOAhMmimce+5D389xmSg==", + "peer": true, + "dependencies": { + "launch-editor": "^2.10.0" + } + }, + "node_modules/lazy-debug-legacy": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "integrity": "sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==", + "peerDependencies": { + "debug": "*" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "node_modules/lodash.assigninwith": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.assigninwith/-/lodash.assigninwith-4.2.0.tgz", + "integrity": "sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "peer": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "peer": true + }, + "node_modules/lodash.rest": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/lodash.rest/-/lodash.rest-4.0.5.tgz", + "integrity": "sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==" + }, + "node_modules/lodash.template": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/lodash.template/-/lodash.template-4.2.4.tgz", + "integrity": "sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "dependencies": { + "lodash._reinterpolate": "~3.0.0", + "lodash.assigninwith": "^4.0.0", + "lodash.keys": "^4.0.0", + "lodash.rest": "^4.0.0", + "lodash.templatesettings": "^4.0.0", + "lodash.tostring": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.tostring": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/lodash.tostring/-/lodash.tostring-4.1.4.tgz", + "integrity": "sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==" + }, + "node_modules/lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==", + "peer": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "peer": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "peer": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "peer": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "devOptional": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/map-stream/-/map-stream-0.0.6.tgz", + "integrity": "sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==" + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "peer": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "peer": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmmirror.com/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "peer": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/module/-/module-1.2.5.tgz", + "integrity": "sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==", + "dependencies": { + "chalk": "1.1.3", + "concat-stream": "1.5.1", + "lodash.template": "4.2.4", + "map-stream": "0.0.6", + "tildify": "1.2.0", + "vinyl-fs": "2.4.3", + "yargs": "4.6.0" + }, + "bin": { + "module": "dist/cli.js" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "peer": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "peer": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/mz-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz", + "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==", + "dependencies": { + "glob": "^7.1.2", + "ko-sleep": "^1.0.3", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "rimraf": "^2.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmmirror.com/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "peer": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "peer": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==", + "peer": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "peer": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "peer": true, + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "peer": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "peer": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "peer": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==", + "dependencies": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dependencies": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dependencies": { + "minimist": "^1.1.0" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "peer": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "peer": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-asn1/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "peer": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "peer": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "peer": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "peer": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "peer": true + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "dependencies": { + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/pdfjs-dist": { + "version": "2.12.313", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz", + "integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA==", + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, + "node_modules/pdfvuer": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/pdfvuer/-/pdfvuer-1.7.4.tgz", + "integrity": "sha512-9/BlW5orSG5bJhhWOhypufWLZmvWA3Gy1kyg/NcQWsi1Ibw3RMy+HnzKLj82HAqSr/lUEinDSOmUE6ykK1/H4Q==", + "dependencies": { + "@vue/cli-plugin-pwa": "^4.5.6", + "core-js": "3", + "module": "^1.2.5", + "pdfjs-dist": "^2.4.456", + "raw-loader": "^0.5.1", + "vue-resize-sensor": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^2.6.11" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-pwa": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.19.tgz", + "integrity": "sha512-3WLmI+ky1xejrvBK6mPiu3du16iZDOF/OHV0EDgdwuBPmmg6w4TvV0Ho4iWMK+BWY68qxIadhqX23JvFfFLvOg==", + "dependencies": { + "@vue/cli-shared-utils": "^4.5.19", + "webpack": "^4.0.0", + "workbox-webpack-plugin": "^4.3.1" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-router": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.19.tgz", + "integrity": "sha512-3icGzH1IbVYmMMsOwYa0lal/gtvZLebFXdE5hcQJo2mnTwngXGMTyYAzL56EgHBPjbMmRpyj6Iw9k4aVInVX6A==", + "peer": true, + "dependencies": { + "@vue/cli-shared-utils": "^4.5.19" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-plugin-vuex": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.19.tgz", + "integrity": "sha512-DUmfdkG3pCdkP7Iznd87RfE9Qm42mgp2hcrNcYQYSru1W1gX2dG/JcW8bxmeGSa06lsxi9LEIc/QD1yPajSCZw==", + "peer": true, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/pdfvuer/node_modules/@vue/cli-service": { + "version": "4.5.19", + "resolved": "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-4.5.19.tgz", + "integrity": "sha512-+Wpvj8fMTCt9ZPOLu5YaLkFCQmB4MrZ26aRmhhKiCQ/4PMoL6mLezfqdt6c+m2htM+1WV5RunRo+0WHl2DfwZA==", + "peer": true, + "dependencies": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.19", + "@vue/cli-plugin-router": "^4.5.19", + "@vue/cli-plugin-vuex": "^4.5.19", + "@vue/cli-shared-utils": "^4.5.19", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "vue-loader-v16": "npm:vue-loader@^16.1.0" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.0.0-beta.14", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/@vue/compiler-sfc": { + "version": "3.5.17", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/pdfvuer/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pdfvuer/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pdfvuer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pdfvuer/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/pdfvuer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pdfvuer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/pdfvuer/node_modules/core-js": { + "version": "3.43.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/pdfvuer/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/pdfvuer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/pdfjs-dist": { + "version": "2.16.105", + "resolved": "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "dependencies": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" + }, + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, + "node_modules/pdfvuer/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "peer": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pdfvuer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfvuer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==", + "dependencies": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "peer": true, + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.37", + "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", + "peer": true, + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "peer": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "peer": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "peer": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "peer": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "peer": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "peer": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-modules-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "peer": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "peer": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "peer": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "peer": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "peer": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "peer": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "peer": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "peer": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "peer": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "peer": true + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "peer": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "peer": true + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "peer": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "peer": true + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "peer": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "peer": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "4.44.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.89.2", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==", + "dependencies": { + "get-ready": "~1.0.0" + } + }, + "node_modules/sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "peer": true + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "peer": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "peer": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "peer": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "peer": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "peer": true + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "peer": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "peer": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "peer": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "peer": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "peer": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "peer": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "peer": true + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "peer": true + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "peer": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==", + "dependencies": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "peer": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "peer": true + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "peer": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "peer": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "peer": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "peer": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "peer": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "peer": true + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "peer": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==" + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.6", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz", + "integrity": "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "peer": true, + "dependencies": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "engines": { + "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", + "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "peer": true + }, + "node_modules/tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "peer": true + }, + "node_modules/to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/to-buffer/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "peer": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "peer": true + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.7.tgz", + "integrity": "sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "peer": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "peer": true + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "peer": true + }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "peer": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "peer": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unique-stream/node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "peer": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "peer": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "peer": true, + "dependencies": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "peer": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/urllib": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.40.0.tgz", + "integrity": "sha512-XDZjoijtzsbkXTXgM+A/sJM002nwoYsc46YOYr6MNH2jUUw1nCBf2ywT1WaPsVEWJX4Yr+9isGmYj4+yofFn9g==", + "dependencies": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "debug": "^2.6.9", + "default-user-agent": "^1.0.0", + "digest-header": "^1.0.0", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.4.15", + "ip": "^1.1.5", + "proxy-agent": "^5.0.0", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "peer": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "peer": true + }, + "node_modules/utility": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz", + "integrity": "sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw==", + "dependencies": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/viewerjs": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.1.tgz", + "integrity": "sha512-/VQ2zalHLZJOGIwlxOBtxagLZwNvU3Bf+nm692XlhNFxjBXRxpCVn+GeqmRFg9jK1Y2+Wf8PPGxZgTDN4pHXww==" + }, + "node_modules/vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==", + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-fs": { + "version": "2.4.3", + "resolved": "https://registry.npmmirror.com/vinyl-fs/-/vinyl-fs-2.4.3.tgz", + "integrity": "sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==", + "dependencies": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "^1.5.2", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-chunk-split": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-chunk-split/-/vite-plugin-chunk-split-0.5.0.tgz", + "integrity": "sha512-pasNKLhH+ICjoCF6HoKKvgmZ1LEPSCIKAa8Lz0ZpMyQC9bLmCLT7UxgKMULewsc9SUw89OX0udsGiIQCtr8wLA==", + "dev": true, + "dependencies": { + "es-module-lexer": "^1.4.1", + "import-meta-resolve": "^4.0.0", + "magic-string": "^0.30.5" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/vm2": { + "version": "3.9.11", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", + "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/vue": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "peer": true + }, + "node_modules/vue-loader": { + "version": "15.11.1", + "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "peer": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-loader-v16": { + "name": "vue-loader", + "version": "16.8.3", + "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + } + }, + "node_modules/vue-loader-v16/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-loader-v16/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true, + "peer": true + }, + "node_modules/vue-loader-v16/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader-v16/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "optional": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-loader-v16/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "optional": true, + "peer": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/vue-loader-v16/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/vue-resize-sensor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz", + "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==" + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "peer": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "peer": true + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "peer": true + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "optional": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "optional": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "optional": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "optional": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "optional": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "peer": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack": { + "version": "4.47.0", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "peer": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 6.14.4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "peer": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "peer": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "peer": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "peer": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "peer": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "peer": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "peer": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "peer": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "peer": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/webpack-dev-server/node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "peer": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "peer": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "peer": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "peer": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "peer": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "peer": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "peer": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "peer": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "peer": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/webpack/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webrtc-adapter": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.0.tgz", + "integrity": "sha512-umxCMgedPAVq4Pe/jl3xmelLXLn4XZWFEMR5Iipb5wJ+k1xMX0yC4ZY9CueZUU1MjapFxai1tFGE7R/kotH6Ww==", + "dependencies": { + "sdp": "^3.0.2" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "peer": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "peer": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "peer": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "peer": true + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dependencies": { + "semver": "^5.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "dependencies": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/workbox-build/node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "node_modules/workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.3.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "dependencies": { + "workbox-core": "^4.3.1" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } +} diff --git a/sfu-server/guannancs_web_mediasoup/package.json b/sfu-server/guannancs_web_mediasoup/package.json new file mode 100644 index 0000000..7faa423 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/package.json @@ -0,0 +1,41 @@ +{ + "name": "imurs", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite -m dev", + "dev:prod": "vite -m production", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "mediasoup-client": "^3.6.86", + "ali-oss": "^6.0.1", + "awaitqueue": "^3.2.2", + "axios": "^1.7.3", + "crypto-js": "^4.2.0", + "echarts": "^5.6.0", + "element-china-area-data": "^4.1.1", + "element-ui": "^2.15.0", + "events": "^3.0.0", + "jsencrypt": "^3.3.2", + "lodash": "^4.14.2", + "moment": "^2.22.2", + "pdfjs-dist": "^2.12.313", + "pdfvuer": "^1.7.4", + "socket.io-client": "^4.7.5", + "viewerjs": "^1.3.1", + "vue": "^2.5.2", + "vue-router": "^3.0.1", + "vuex": "^3.6.2" + }, + "devDependencies": { + "@rollup/plugin-inject": "^5.0.5", + "@vitejs/plugin-vue2": "^2.3.1", + "@vitejs/plugin-vue2-jsx": "^1.1.1", + "sass": "^1.77.8", + "vite": "^5.3.4", + "vite-plugin-chunk-split": "^0.5.0" + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/public/static/.gitkeep b/sfu-server/guannancs_web_mediasoup/public/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sfu-server/guannancs_web_mediasoup/public/static/css/iconfont.css b/sfu-server/guannancs_web_mediasoup/public/static/css/iconfont.css new file mode 100644 index 0000000..58b5bfc --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/public/static/css/iconfont.css @@ -0,0 +1,10 @@ +[class^="ali-icon"], [class*="ali-icon"] +{ + margin-left: -3px; + font-family:"iconfont" !important; + font-size:28px; + color:white; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/public/static/css/reset.css b/sfu-server/guannancs_web_mediasoup/public/static/css/reset.css new file mode 100644 index 0000000..5814571 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/public/static/css/reset.css @@ -0,0 +1,150 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, + p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + font-size: 14px; + vertical-align: baseline; +} +html{ + line-height: 1.3; +} +h1, h2, h3, h4, h5, h6{ + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1.3; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +.table th, .table td{ + vertical-align: middle; +} +a{ + text-decoration: none; +} +.el-scrollbar { + height: 100%; +} +.el-scrollbar .el-scrollbar__wrap { + margin-bottom: 0 !important; + overflow-x: hidden; +} +.el-scrollbar .el-scrollbar__bar { + z-index: 2000; +} + +/* 标题样式 */ +.h1 { + font-size: 2.5rem; + margin-bottom: .5rem; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +/* table布局样式 */ +.table-bordered { + border: 1px solid #dee2e6; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +/* table { + border-collapse: collapse; +} */ +table { + border-collapse: collapse; + border-spacing: 0; +} +.table-bordered td, .table-bordered th { + border: 1px solid #dee2e6; +} +.table td, .table th { + padding: 1.1rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} +.table th, .table td { + vertical-align: middle; +} +.table-striped tbody tr:nth-of-type(odd) { + background-color: #FAFAFA; +} +.filter{ + width:250px!important; + float:right!important; +} +/* 备用图标 */ +[class^="my_icon"], [class*="my_icon"] +{ + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.el-form-item__label{ + font-weight: 600; +} +.el-table th>.cell{ + font-weight: 600; +} + +.el-table .warning-row { + background-color: oldlace!important; +} + +.el-table .success-row { + background-color: #e7f4e3!important; +} +.el-table .default-row { + background-color: #D9ECFF!important; +} +.el-table .gray-row { + background-color: #dbdbdb!important; +} +.el-table .danger-row { + background-color: #FDE2E2!important; +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/public/static/favicon.png b/sfu-server/guannancs_web_mediasoup/public/static/favicon.png new file mode 100644 index 0000000..906f8d2 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/public/static/favicon.png differ diff --git a/sfu-server/guannancs_web_mediasoup/public/static/img/bmode.jpg b/sfu-server/guannancs_web_mediasoup/public/static/img/bmode.jpg new file mode 100644 index 0000000..20a7cab Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/public/static/img/bmode.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/public/static/img/cloud_with_transparent.png b/sfu-server/guannancs_web_mediasoup/public/static/img/cloud_with_transparent.png new file mode 100644 index 0000000..40d88e8 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/public/static/img/cloud_with_transparent.png differ diff --git a/sfu-server/guannancs_web_mediasoup/public/static/js/aliplayercomponents-1.0.5.min.js b/sfu-server/guannancs_web_mediasoup/public/static/js/aliplayercomponents-1.0.5.min.js new file mode 100644 index 0000000..8b1f587 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/public/static/js/aliplayercomponents-1.0.5.min.js @@ -0,0 +1,20 @@ +!function(A){var t={};function e(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return A[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}e.m=A,e.c=t,e.d=function(A,t,n){e.o(A,t)||Object.defineProperty(A,t,{enumerable:!0,get:n})},e.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},e.t=function(A,t){if(1&t&&(A=e(A)),8&t)return A;if(4&t&&"object"==typeof A&&A&&A.__esModule)return A;var n=Object.create(null);if(e.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:A}),2&t&&"string"!=typeof A)for(var i in A)e.d(n,i,function(t){return A[t]}.bind(null,i));return n},e.n=function(A){var t=A&&A.__esModule?function(){return A.default}:function(){return A};return e.d(t,"a",t),t},e.o=function(A,t){return Object.prototype.hasOwnProperty.call(A,t)},e.p="",e(e.s=28)}([function(A,t){A.exports=function(A){var t=[];return t.toString=function(){return this.map(function(t){var e=function(A,t){var e,n=A[1]||"",i=A[3];if(!i)return n;if(t&&"function"==typeof btoa){var o=(e=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"),r=i.sources.map(function(A){return"/*# sourceURL="+i.sourceRoot+A+" */"});return[n].concat(r).concat([o]).join("\n")}return[n].join("\n")}(t,A);return t[2]?"@media "+t[2]+"{"+e+"}":e}).join("")},t.i=function(A,e){"string"==typeof A&&(A=[[null,A,""]]);for(var n={},i=0;i=0&&c.splice(t,1)}function m(A){var t=document.createElement("style");return void 0===A.attrs.type&&(A.attrs.type="text/css"),g(t,A.attrs),h(A,t),t}function g(A,t){Object.keys(t).forEach(function(e){A.setAttribute(e,t[e])})}function f(A,t){var e,n,i,o;if(t.transform&&A.css){if(!(o=t.transform(A.css)))return function(){};A.css=o}if(t.singleton){var r=s++;e=l||(l=m(t)),n=x.bind(null,e,r,!1),i=x.bind(null,e,r,!0)}else A.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(e=function(A){var t=document.createElement("link");return void 0===A.attrs.type&&(A.attrs.type="text/css"),A.attrs.rel="stylesheet",g(t,A.attrs),h(A,t),t}(t),n=function(A,t,e){var n=e.css,i=e.sourceMap,o=void 0===t.convertToAbsoluteUrls&&i;(t.convertToAbsoluteUrls||o)&&(n=d(n)),i&&(n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(i))))+" */");var r=new Blob([n],{type:"text/css"}),a=A.href;A.href=URL.createObjectURL(r),a&&URL.revokeObjectURL(a)}.bind(null,e,t),i=function(){y(e),e.href&&URL.revokeObjectURL(e.href)}):(e=m(t),n=function(A,t){var e=t.css,n=t.media;if(n&&A.setAttribute("media",n),A.styleSheet)A.styleSheet.cssText=e;else{for(;A.firstChild;)A.removeChild(A.firstChild);A.appendChild(document.createTextNode(e))}}.bind(null,e),i=function(){y(e)});return n(A),function(t){if(t){if(t.css===A.css&&t.media===A.media&&t.sourceMap===A.sourceMap)return;n(A=t)}else i()}}A.exports=function(A,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=r()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var e=p(A,t);return u(e,t),function(A){for(var n=[],i=0;i=0)return A.length;for(var n=0,i=0,o=0,r=A.length-1;n<=r;){if(o++,e(t,A[(i=Math.floor((r+n+1)/2))-1])>=0&&e(t,A[i])<0)return i;e(t,A[i-1])<0?r=i-1:e(t,A[i])>=0?n=i:console.error("Program Error"),o>1500&&console.error("Too many run cycles.")}return-1},binsert:function(t,e,n){var i=A.bsearch(t,e,n);return t.splice(i,0,e),i}};return A}()),c=function(A,t){for(var e in t)t.hasOwnProperty(e)&&(A[e]=t[e]);function n(){this.constructor=A}A.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},d=function(){function A(A,t){void 0===A&&(A=0),void 0===t&&(t=0),this._pools=[[]],this.avoid=1,this._width=A,this._height=t}return A.prototype.willCollide=function(A,t){return A.stime+A.ttl>=t.stime+t.ttl/2},A.prototype.pathCheck=function(A,t,e){for(var n=A+t.height,i=t.right,o=0;on||e[o].bottomi))return!1;if(this.willCollide(e[o],t))return!1}return!0},A.prototype.assign=function(A,t){for(;this._pools.length<=t;)this._pools.push([]);var e=this._pools[t];if(0===e.length)return A.cindex=t,0;if(this.pathCheck(0,A,e))return A.cindex=t,0;for(var n=0,i=0;ithis._height);i++)if(this.pathCheck(n,A,e))return A.cindex=t,n;return this.assign(A,t+1)},A.prototype.add=function(A){A.height>this._height?(A.cindex=-2,A.y=0):(A.y=this.assign(A,0),s.binsert(this._pools[A.cindex],A,function(A,t){return A.bottomt.bottom?1:0}))},A.prototype.remove=function(A){if(!(A.cindex<0)){if(A.cindex>=this._pools.length)throw new Error("cindex out of bounds");var t=this._pools[A.cindex].indexOf(A);t<0||this._pools[A.cindex].splice(t,1)}},A.prototype.setBounds=function(A,t){this._width=A,this._height=t},A}(),u=function(A){function t(){A.apply(this,arguments)}return c(t,A),t.prototype.add=function(t){A.prototype.add.call(this,t),t.x=(this._width-t.width)/2},t.prototype.willCollide=function(A,t){return!0},t.prototype.pathCheck=function(A,t,e){for(var n=A+t.height,i=0;in||e[i].bottom0&&this.animate()},Object.defineProperty(A.prototype,"x",{get:function(){return null!==this._x&&void 0!==this._x||(this.align%2==0?this._x=this.dom.offsetLeft:this._x=this.parent.width-this.dom.offsetLeft-this.width),this.absolute?this._x:this._x/this.parent.width},set:function(A){this._x=A,this.absolute||(this._x*=this.parent.width),this.align%2==0?this.dom.style.left=this._x+"px":this.dom.style.right=this._x+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"y",{get:function(){return null!==this._y&&void 0!==this._y||(this.align<2?this._y=this.dom.offsetTop:this._y=this.parent.height-this.dom.offsetTop-this.height),this.absolute?this._y:this._y/this.parent.height},set:function(A){this._y=A,this.absolute||(this._y*=this.parent.height),this.align<2?this.dom.style.top=this._y+"px":this.dom.style.bottom=this._y+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"bottom",{get:function(){return this.y+this.height},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"right",{get:function(){return this.x+this.width},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"width",{get:function(){return null!==this._width&&void 0!==this._width||(this._width=this.dom.offsetWidth),this._width},set:function(A){this._width=A,this.dom.style.width=this._width+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"height",{get:function(){return null!==this._height&&void 0!==this._height||(this._height=this.dom.offsetHeight),this._height},set:function(A){this._height=A,this.dom.style.height=this._height+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"size",{get:function(){return this._size},set:function(A){this._size=A,this.dom.style.fontSize=this._size+"px"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"color",{get:function(){return this._color},set:function(A){this._color=A;var t=A.toString(16);t=t.length>=6?t:new Array(6-t.length+1).join("0")+t,this.dom.style.color="#"+t,0===this._color&&(this.dom.className=this.parent.options.global.className+" rshadow")},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"alpha",{get:function(){return this._alpha},set:function(A){this._alpha=A,this.dom.style.opacity=Math.min(this._alpha,this.parent.options.global.opacity)+""},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"border",{get:function(){return this._border},set:function(A){this._border=A,this._border?this.dom.style.border="1px solid #00ffff":this.dom.style.border="none"},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"shadow",{get:function(){return this._shadow},set:function(A){this._shadow=A,this._shadow||(this.dom.className=this.parent.options.global.className+" noshadow")},enumerable:!0,configurable:!0}),Object.defineProperty(A.prototype,"font",{get:function(){return this._font},set:function(A){this._font=A,this._font.length>0?this.dom.style.fontFamily=this._font:this.dom.style.fontFamily=""},enumerable:!0,configurable:!0}),A.prototype.time=function(A){this.ttl-=A,this.ttl<0&&(this.ttl=0),this.movable&&this.update(),this.ttl<=0&&this.finish()},A.prototype.update=function(){this.animate()},A.prototype.invalidate=function(){this._x=null,this._y=null,this._width=null,this._height=null},A.prototype._execMotion=function(A,t){for(var e in A)if(A.hasOwnProperty(e)){var n=A[e];this[e]=n.easing(Math.min(Math.max(t-n.delay,0),n.dur),n.from,n.to-n.from,n.dur)}},A.prototype.animate=function(){if(this._alphaMotion&&(this.alpha=(this.dur-this.ttl)*(this._alphaMotion.to-this._alphaMotion.from)/this.dur+this._alphaMotion.from),0!==this.motion.length){var A=Math.max(this.ttl,0),t=this.dur-A-this._motionStart[this._curMotion];return this._execMotion(this.motion[this._curMotion],t),this.dur-A>this._motionEnd[this._curMotion]?(this._curMotion++,void(this._curMotion>=this.motion.length&&(this._curMotion=this.motion.length-1))):void 0}},A.prototype.finish=function(){this.parent.finish(this)},A.prototype.toString=function(){return["[",this.stime,"|",this.ttl,"/",this.dur,"]","(",this.mode,")",this.text].join("")},A.LINEAR=function(A,t,e,n){return A*e/n+t},A}()),h=function(A){function t(t,e){A.call(this,t,e),this.dur*=this.parent.options.scroll.scale,this.ttl*=this.parent.options.scroll.scale}return c(t,A),Object.defineProperty(t.prototype,"alpha",{set:function(A){this._alpha=A,this.dom.style.opacity=Math.min(Math.min(this._alpha,this.parent.options.global.opacity),this.parent.options.scroll.opacity)+""},enumerable:!0,configurable:!0}),t.prototype.init=function(t){void 0===t&&(t=null),A.prototype.init.call(this,t),this.x=this.parent.width,this.parent.options.scroll.opacity<1&&(this.alpha=this._alpha),this.absolute=!0},t.prototype.update=function(){this.x=this.ttl/this.dur*(this.parent.width+this.width)-this.width},t}(p),y=function(){var A=function(A,t){for(var e=Math.PI/180,n=A*e,i=t*e,o=Math.cos,r=Math.sin,a=[o(n)*o(i),o(n)*r(i),r(n),0,-r(i),o(i),0,0,-r(n)*o(i),-r(n)*r(i),o(n),0,0,0,0,1],l=0;l0)){var A=(new Date).getTime(),e=this;t=window.setInterval(function(){var t=(new Date).getTime()-A;A=(new Date).getTime(),e.onTimerEvent(t,e)},10)}},this.stopTimer=function(){window.clearInterval(t),t=0}}return t.prototype.stop=function(){this.stopTimer()},t.prototype.start=function(){this.startTimer()},t.prototype.seek=function(A){this.position=s.bsearch(this.timeline,A,function(A,t){return At.stime?1:0})},t.prototype.validate=function(A){return null!=A&&this.filter.doValidate(A)},t.prototype.load=function(A){this.timeline=A,this.timeline.sort(function(A,t){return A.stime>t.stime?2:A.stimet.date?1:A.datet.dbid?1:A.dbidt.stime?2:A.stimet.date?1:A.datet.dbid?1:A.dbid0;)this.runline[0].finish();this.dispatchEvent("clear")},t.prototype.setBounds=function(){for(var A in this.width=this.stage.offsetWidth,this.height=this.stage.offsetHeight,this.dispatchEvent("resize"),this.csa)this.csa[A].setBounds(this.width,this.height);this.stage.style.perspective=this.width*Math.tan(40*Math.PI/180)/2+"px",this.stage.style.webkitPerspective=this.width*Math.tan(40*Math.PI/180)/2+"px"},t.prototype.init=function(){this.setBounds(),null==this.filter&&(this.filter=new +/** + * Comment Filters Module Simplified (only supports modifiers & types) + * @license MIT + * @author Jim Chen + */ +function(){this.modifiers=[],this.runtime=null,this.allowTypes={1:!0,4:!0,5:!0,6:!0,7:!0,8:!0,17:!0},this.doModify=function(A){for(var t=0;t=this.timeline.length||Math.abs(this._lastPosition-A)>=2e3){if(this.seek(A),this._lastPosition=A,this.timeline.length<=this.position)return}else this._lastPosition=A;for(;this.position0&&this.runline.length>this.limiter||this.validate(this.timeline[this.position])&&this.send(this.timeline[this.position])},t.prototype.rescale=function(){},t.prototype.send=function(t){if(8!==t.mode){if(null==this.filter||null!=(t=this.filter.doModify(t))){if(1===t.mode||2===t.mode||6===t.mode)var e=new h(this,t);else e=new p(this,t);switch(e.mode){case 1:e.align=0;break;case 2:case 4:e.align=2;break;case 5:e.align=0;break;case 6:e.align=1}switch(e.init(),this.stage.appendChild(e.dom),e.mode){default:case 1:this.csa.scroll.add(e);break;case 2:this.csa.scrollbtm.add(e);break;case 4:this.csa.bottom.add(e);break;case 5:this.csa.top.add(e);break;case 6:this.csa.reverse.add(e);break;case 17:case 7:0===t.rY&&0===t.rZ||(e.dom.style.transform=A(t.rY,t.rZ),e.dom.style.webkitTransform=A(t.rY,t.rZ),e.dom.style.OTransform=A(t.rY,t.rZ),e.dom.style.MozTransform=A(t.rY,t.rZ),e.dom.style.MSTransform=A(t.rY,t.rZ))}e.y=e.y,this.dispatchEvent("enterComment",e),this.runline.push(e)}}else this.scripting&&this.scripting.eval(t.code)},t.prototype.sendComment=function(A){this.send(A)},t.prototype.finish=function(A){this.dispatchEvent("exitComment",A),this.stage.removeChild(A.dom);var t=this.runline.indexOf(A);switch(t>=0&&this.runline.splice(t,1),A.mode){default:case 1:this.csa.scroll.remove(A);break;case 2:this.csa.scrollbtm.remove(A);break;case 4:this.csa.bottom.remove(A);break;case 5:this.csa.top.remove(A);break;case 6:this.csa.reverse.remove(A);break;case 7:}},t.prototype.addEventListener=function(A,t){void 0!==this._listeners[A]?this._listeners[A].push(t):this._listeners[A]=[t]},t.prototype.dispatchEvent=function(A,t){if(void 0!==this._listeners[A])for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:"controlbar";!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.sendEl=e,this.danmukuList=t,this.html=m(i.a),this.danmuControlHtml=m(r.a),this.sendEl=e,this.danmuInput=null===e?null:m(l.a),this.CM=null,this.userDanmuOpen=!0}return f(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;if(this.isEn=n&&"en-us"===n,null!==this.danmuInput&&(this.danmuInput.querySelector(".danmu-input-enter").innerText=this.isEn?"Enter":"发送",this.danmuInput.querySelector("input").setAttribute("placeholder",this.isEn?"Input danmu":"输入弹幕")),this.danmuControlHtml.querySelector(".player-tooltip.close").innerText=this.isEn?"Close Bullect":"关闭弹幕",this.danmuControlHtml.querySelector(".player-tooltip.open").innerText=this.isEn?"Open Bullect":"打开弹幕","controlbar"===this.sendEl){var i=this.danmuControlHtml.querySelector(".ali-danmu-input-wrap");i.style.display="inline-block",i.appendChild(this.danmuInput)}else if(null!==this.sendEl)if(g(this.sendEl))this.sendEl.appendChild(this.danmuInput);else{if("string"!=typeof this.sendEl)throw new Error("sendEl must be an element or selector string");var o=document.querySelector(this.sendEl);if(!g(o))throw new Error("sendEl must be an element or selector string");o.appendChild(this.danmuInput)}A.querySelector(".prism-controlbar").appendChild(this.danmuControlHtml);var r=A.querySelector("video").nextElementSibling;r?A.insertBefore(this.html,r):A.appendChild(this.html),this.CM=new y(this.html.querySelector(".danmu")),this.CM.init(),this.CM.load(this.danmukuList),A.querySelector("video").ontimeupdate=function(){null!==A.querySelector("video")&&e.CM.time(1e3*A.querySelector("video").currentTime)};var a=this.danmuControlHtml.querySelector(".icon-danmu-close"),l=this.danmuControlHtml.querySelector(".icon-danmu-open");if(a.onclick=function(){e.userDanmuOpen=!1,a.style.display="none",l.style.display="inline-block",e.CM.clear(),e.CM.stop()},l.onclick=function(){l.style.display="none",a.style.display="inline-block",e.userDanmuOpen=!0,e.CM.start()},null!==this.danmuInput){var s=this.danmuInput.querySelector(".ali-danmu-input input");this.danmuInput.querySelector(".danmu-input-enter").onclick=this.sendDanmuHandle.bind(this),s.onkeydown=function(A){13===A.keyCode&&e.sendDanmuHandle.call(e)}}}},{key:"sendDanmuHandle",value:function(){var A=this.danmuInput.querySelector(".ali-danmu-input input"),t=A.value;""!==t&&(this.send({mode:1,text:t,stime:1e3,size:[16,18,25,36,45][this.randomIndex(5)],color:[16777215,255,13369344,16738047,16777011][this.randomIndex(5)]}),A.value="",A.focus())}},{key:"randomIndex",value:function(A){return Math.floor(Math.random()*A)}},{key:"play",value:function(A,t){this.userDanmuOpen&&this.CM.start()}},{key:"pause",value:function(A,t){this.userDanmuOpen&&this.CM.stop()}},{key:"send",value:function(A){this.CM.send(A)}},{key:"insert",value:function(A){this.CM&&this.CM.insert(A)}},{key:"dispose",value:function(){null!==this.danmuInput&&this.danmuInput.parentNode&&this.danmuInput.parentNode.removeChild(this.danmuInput)}}]),A}(),M=e(8),x=e.n(M),b=(e(34),function(){function A(A,t){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:"random";!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.text=t,this.style=e||{fontSize:"14px",color:"#fff"},this.html=m(x.a),this.bulletPosition=n}return b(A,[{key:"createEl",value:function(A,t){this.html.innerText=this.text,A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this;A.getOptions(),!1===A.getOptions().autoplay&&(this.html.style.animationPlayState="paused"),Object.keys(this.style).forEach(function(A){return e.html.style[A]=e.style[A]});var n=this.html.offsetHeight,i=parseInt(A.getOptions().height.replace("px",""))-n;if("bottom"===this.bulletPosition)this.html.style.bottom=0;else{var o="top"===this.bulletPosition?0:this.randomTop(i);this.html.style.top=o}"random"===this.bulletPosition&&this.html.addEventListener("animationiteration",function(){e.html.style.top=e.randomTop(i)})}},{key:"playing",value:function(A,t){this.html.style.animationPlayState="running"}},{key:"timeupdate",value:function(A,t){var e=A.el(),n=e.querySelector(".bullet-screen");if(n){"bullet-screen"!==n.className&&(n.className="bullet-screen");var i=getComputedStyle(n),o=i.getPropertyValue("display"),r=i.getPropertyValue("opacity"),a=i.getPropertyValue("visibility"),l=this.text,s=n.innerText;"none"===o&&n.style.setProperty("display","block"),"1"!==r&&n.style.setProperty("opacity","1"),"hidden"===a&&n.style.setProperty("visibility","visible"),l!=s&&(n.innerText=l)}else e.appendChild(this.html)}},{key:"pause",value:function(A,t){this.html.style.animationPlayState="paused"}},{key:"randomTop",value:function(A){return Math.floor(Math.random()*A)+"px"}}]),A}(),w=e(9),I=e.n(w),T=(e(36),function(){function A(A,t){for(var e=0;e0&&void 0!==arguments[0]&&arguments[0],e=arguments[1],n=arguments[2];!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.html=m(I.a),this.autoPlay=t,this.getTime=e||this._getTime,this.saveTimeFunction=n||this._saveTime,this.hasMemoryDisplay=!1}return T(A,[{key:"createEl",value:function(A){A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this,n=A.getOptions(),i=n.vid||n.source.replace(/\?.*$/,""),o=this.getTime(i);if(null!==(o=o?parseInt(o):0)&&0!==o&&!this.hasMemoryDisplay)if(this.hasMemoryDisplay=!0,this.autoPlay)A.seek(o),"playing"!==A.getStatus()&&A.play();else{var r=this.getVideoTime(o);if(o!==parseInt(A._duration)){var a='
    \n \n 上次看到\n '+r+'\n 跳转播放\n
    ';this.html.innerHTML=a;var l=setTimeout(function(){e.html.innerHTML=""},15e3);this.html.querySelector(".icon-close").onclick=function(){e.html.innerHTML="",clearTimeout(l)},this.html.querySelector(".play-jump").onclick=function(){A.seek(o),"playing"!==A.getStatus()&&A.play(),e.html.innerHTML="",clearTimeout(l)}}}document.onvisibilitychange=function(){"hidden"===document.visibilityState&&0!==A.getCurrentTime()&&(this.saveTimeFunction(i,A.getCurrentTime()),play)},window.onbeforeunload=function(){0!==A.getCurrentTime()&&this.saveTimeFunction(i,A.getCurrentTime())}}},{key:"error",value:function(A,t){this.setMemory(A)}},{key:"dispose",value:function(A,t){this.setMemory(A)}},{key:"setMemory",value:function(A){var t=A.getOptions(),e=t.vid||t.source.replace(/\?.*$/,"");this.saveTimeFunction(e,A.getCurrentTime())}},{key:"getVideoTime",value:function(A){var t=Math.round(A),e=Math.floor(t/3600),n=Math.floor((t-3600*e)/60),i=t-3600*e-60*n;return n<10&&(n="0"+n),i<10&&(i="0"+i),0===e?n+":"+i:e+":"+n+":"+i}},{key:"_getTime",value:function(A){return localStorage.getItem(A)}},{key:"_saveTime",value:function(A,t){localStorage.setItem(A,t)}}]),A}(),E=e(10),Q=e.n(E),B=(e(38),function(){function A(A,t){for(var e=0;e-1?a:0,this.playingVideoIndex=a>-1?a:0),this.listHtml.querySelector(".list").childNodes[0].className="video-item active",A.appendChild(this.listHtml)}},{key:"ready",value:function(A,t){var e=this;this.controlHtml.querySelector(".icon-skip-previous").onclick=function(){0!==e.playingVideoIndex?e.playVideo(A,e.playingVideoIndex-1):e.playlistTip(e.isEn?"Already the first one~":"已经是第一个了~",A._el)},this.controlHtml.querySelector(".icon-skipnext").onclick=function(){e.playingVideoIndex!==e.playlist.length-1?e.playVideo(A,e.playingVideoIndex+1):e.playlistTip(e.isEn?"Already the last one~":"已经是最后一个了~",A._el)},this.listHtml.querySelector(".list").onclick=function(t){var n=t.target;if("video-item"===n.className){var i=parseInt(n.getAttribute("data-index"));e.playVideo(A,i)}}}},{key:"clearHideListTimeout",value:function(){null!==this.listHideTimeout&&(clearTimeout(this.listHideTimeout),this.listHideTimeout=null)}},{key:"playVideo",value:function(A,t){this.playingVideoIndex!==t&&(this.playingVideoIndex=parseInt(t),A.loadByUrl(this.playlist[t].source),this.listHtml.querySelector(".video-item.active").className="video-item",this.listHtml.querySelector(".list").childNodes[t].className="video-item active")}},{key:"tooglePlaylist",value:function(){var A=this;this.clearHideListTimeout(),"30%"===this.listHtml.style.width?this.listHtml.style.width=0:(this.listHtml.style.width="30%",this.listHideTimeout=setTimeout(function(){A.listHtml.style.width=0},5e3))}},{key:"playlistTip",value:function(A,t){var e=document.createElement("div");e.className="playlist-skip-tip",e.innerText=A,t.appendChild(e),setTimeout(function(){t.removeChild(e)},3e3)}},{key:"computedListDom",value:function(A){return A.map(function(A,t){return'
    '+A.name+"
    "}).join("")}}]),A}(),Y=e(13),U=e.n(Y),G=(e(42),function(){function A(A,t){for(var e=0;e1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;!function(A,t){if(!(A instanceof t))throw new TypeError("Cannot call a class as a function")}(this,A),this.previewDuration=t,this.html=m(U.a),null!==e&&this.insertHTtml(e,"previewEndHtml"),null!==n&&this.insertHTtml(n,"previewBarHtml")}return G(A,[{key:"play",value:function(A){this.previewEnd&&(A._el.querySelector(".center").classList.remove("preview-hide"),A.seek(0),this.previewEnd=!1)}},{key:"insertHTtml",value:function(A,t){var e="previewEndHtml"===t?".preview-custom":".preview-custom-bar",n=this.html.querySelector(e);if("string"==typeof A)if("#"===A[0]){var i=document.querySelector(A);i?n.innerHTML=i.innerHTML:console.warn("[aliplayer components warn]: Invalid parameter "+t+", can't find element by this id")}else n.innerHTML=A;else console.warn("[aliplayer components warn]: Invalid parameter "+t+", "+t+" must be a string type")}},{key:"ready",value:function(A){var t=parseInt(A.getDuration());this.videoDuration=t,!this.invalidPreview&&this.previewDuration>=t&&(this.invalidPreview=!0,console.warn("[aliplayer components warn]: Invalid parameter previewDuration, previewDuration must be less than the video duration!")),0!==this.previewDuration&&this.previewDuration1?" "+o+(this.isEn?" senconds":" 秒"):" "+r+(this.isEn?" minutes":" 分钟"),o<60&&(r=" "+o+(this.isEn?" senconds":" 秒")),this.html.querySelector(".preview-time").innerText=r;var l=A.querySelector("video").nextElementSibling;l?A.insertBefore(this.html,l):A.appendChild(this.html),this.html.querySelector(".preview-vod-close").addEventListener("click",function(){e.html.querySelector(".preview-component-tip").style.display="none"}),t.setPreviewTime(Number(this.previewDuration))}},{key:"closePreviewLayer",value:function(){this.previewEnd=!1,this.html.querySelector(".preview-component-layer").style.display="none"}},{key:"timeupdate",value:function(A){if(!this.previewEnd&&0!==this.previewDuration&&this.previewDuratione?(n=e-330+"px",this.html.querySelector(".icon-arrowdown").style.left=e*t.left-e+317+"px"):this.html.querySelector(".icon-arrowdown").style.left="-2px";var i=t.progressMarker,o=i.coverUrl,r=i.title,a=i.describe,l=i.offset;this.currentOffset=l,this.html.style.left=n,this.imgEle.src=o,this.timeEle.innerText=r,this.describeEle.innerText=a,this.html.style.display="block"}},{key:"markerDotOut",value:function(A,t){var e=this;this.timer=setTimeout(function(){e.html.style.display="none"},100)}}]),A}(),P=e(15),R=e.n(P),J=e(16),W=e.n(J),K=(e(49),function(){function A(A,t){for(var e=0;e'+A.desc+""});this.html.querySelector(".quality-list").innerHTML=i.join(""),this.definition,0==this.hasCreated&&this.definition&&(n.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var o=null;e.onclick=function(){n.style.display="block"},e.onmouseleave=function(){o=setTimeout(function(){n.style.display="none"},100)},n.onmouseenter=function(){clearTimeout(o)},n.onmouseleave=function(){n.style.display="none"},n.onclick=function(e){var n=e.target,i=n.dataset.def,o=n.innerText;if(i&&"current"!==n.className){var r=t._urls.find(function(A){return A.definition===i});A.loadByUrl(r.Url,A.getCurrentTime(),!0,!0),t.setCurrentQuality(r.desc,r.definition),t.modalHtml.style.display="block",t.modalHtml.querySelector("span.current-quality-tag").innerText=r.desc}t.getQuality(i,o)}}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-quality");t&&t.classList.add("player-hidden")}}]),A}(),_=e(17),$=e.n(_),AA=(e(51),function(){function A(A,t){for(var e=0;e=i)&&t.play()}},1e3)}}},{key:"removeComponent",value:function(){this.html.parentNode.removeChild(this.html),this.html=null}},{key:"ready",value:function(A){null!==this.html&&A.pause()}}]),A}(),cA=e(20),dA=e.n(cA),uA=(e(57),e(21)),pA=e.n(uA),hA="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},yA="function"==typeof Symbol&&"symbol"===hA(Symbol.iterator)?function(A){return void 0===A?"undefined":hA(A)}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":void 0===A?"undefined":hA(A)},mA=window.device,gA={},fA=[];window.device=gA;var vA=window.document.documentElement,MA=window.navigator.userAgent.toLowerCase(),xA=["googletv","viera","smarttv","internet.tv","netcast","nettv","appletv","boxee","kylo","roku","dlnadoc","roku","pov_tv","hbbtv","ce-html"];function bA(A){return-1!==MA.indexOf(A)}function NA(A){return vA.className.match(new RegExp(A,"i"))}function wA(A){var t=null;NA(A)||(t=vA.className.replace(/^\s+|\s+$/g,""),vA.className=t+" "+A)}function IA(A){NA(A)&&(vA.className=vA.className.replace(" "+A,""))}function TA(){gA.landscape()?(IA("portrait"),wA("landscape"),DA("landscape")):(IA("landscape"),wA("portrait"),DA("portrait")),BA()}function DA(A){for(var t in fA)fA[t](A)}gA.macos=function(){return bA("mac")},gA.ios=function(){return gA.iphone()||gA.ipod()||gA.ipad()},gA.iphone=function(){return!gA.windows()&&bA("iphone")},gA.ipod=function(){return bA("ipod")},gA.ipad=function(){return bA("ipad")},gA.android=function(){return!gA.windows()&&bA("android")},gA.androidPhone=function(){return gA.android()&&bA("mobile")},gA.androidTablet=function(){return gA.android()&&!bA("mobile")},gA.blackberry=function(){return bA("blackberry")||bA("bb10")||bA("rim")},gA.blackberryPhone=function(){return gA.blackberry()&&!bA("tablet")},gA.blackberryTablet=function(){return gA.blackberry()&&bA("tablet")},gA.windows=function(){return bA("windows")},gA.windowsPhone=function(){return gA.windows()&&bA("phone")},gA.windowsTablet=function(){return gA.windows()&&bA("touch")&&!gA.windowsPhone()},gA.fxos=function(){return(bA("(mobile")||bA("(tablet"))&&bA(" rv:")},gA.fxosPhone=function(){return gA.fxos()&&bA("mobile")},gA.fxosTablet=function(){return gA.fxos()&&bA("tablet")},gA.meego=function(){return bA("meego")},gA.cordova=function(){return window.cordova&&"file:"===location.protocol},gA.nodeWebkit=function(){return"object"===yA(window.process)},gA.mobile=function(){return gA.androidPhone()||gA.iphone()||gA.ipod()||gA.windowsPhone()||gA.blackberryPhone()||gA.fxosPhone()||gA.meego()},gA.tablet=function(){return gA.ipad()||gA.androidTablet()||gA.blackberryTablet()||gA.windowsTablet()||gA.fxosTablet()},gA.desktop=function(){return!gA.tablet()&&!gA.mobile()},gA.television=function(){for(var A=0;A1},gA.landscape=function(){return screen.orientation&&Object.prototype.hasOwnProperty.call(window,"onorientationchange")?screen.orientation.type.includes("landscape"):window.innerHeight/window.innerWidth<1},gA.noConflict=function(){return window.device=mA,this},gA.ios()?gA.ipad()?wA("ios ipad tablet"):gA.iphone()?wA("ios iphone mobile"):gA.ipod()&&wA("ios ipod mobile"):gA.macos()?wA("macos desktop"):gA.android()?gA.androidTablet()?wA("android tablet"):wA("android mobile"):gA.blackberry()?gA.blackberryTablet()?wA("blackberry tablet"):wA("blackberry mobile"):gA.windows()?gA.windowsTablet()?wA("windows tablet"):gA.windowsPhone()?wA("windows mobile"):wA("windows desktop"):gA.fxos()?gA.fxosTablet()?wA("fxos tablet"):wA("fxos mobile"):gA.meego()?wA("meego mobile"):gA.nodeWebkit()?wA("node-webkit"):gA.television()?wA("television"):gA.desktop()&&wA("desktop"),gA.cordova()&&wA("cordova"),gA.onChangeOrientation=function(A){"function"==typeof A&&fA.push(A)};var EA="resize";function QA(A){for(var t=0;t3&&void 0!==arguments[3]?arguments[3]:"关闭广告";jA(this,A),this.adVideoSource=t,this.adLink=e,this.html=m(dA.a),this.adInterval=null,this.adCloseFunction=n,this.html.querySelector(".video-ad-close-text").innerText=i,this.adDuration=null,this.player=null}return kA(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;this.isEn=n&&"en-us"===n,this.html.querySelector(".video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击";var i=this.html.querySelector("#video-ad-content");i.setAttribute("src",this.adVideoSource);var o=this;this.html.querySelector(".icon-player-play").onclick=function(){e.playVideoAd(),e.html.querySelector(".autoplay-video-ad").style.display="none"},i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),document.getElementById("loadflag").style.display="none",o.adDuration=Math.ceil(i.duration),o.html.querySelector("#video-ad-duration").innerText=o.adDuration,i.play().then(function(){o.setAdInterval()}).catch(function(A){o.html.querySelector(".autoplay-video-ad").style.display="block"})});var r=this.html.querySelector(".video-ad-link"),a=this.html.querySelector(".video-ad-detail");r.setAttribute("href",this.adLink),a.setAttribute("href",this.adLink),A.appendChild(this.html)}},{key:"ready",value:function(A,t){var e=this;null!==this.html&&(A.pause(),this.player=A,this.html.querySelector(".video-ad-close label").onclick=function(){"function"==typeof e.adCloseFunction?e.adCloseFunction(e):e.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()})}},{key:"pauseVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#video-ad-content").pause()}},{key:"playVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#video-ad-content").play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#video-ad-duration");this.adInterval=setInterval(function(){A.adDuration-=1,A.adDuration<=0?(A.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()):t.innerText=A.adDuration},1e3)}},{key:"closeVideoAd",value:function(){this.clearAdInterval(),this.html.parentNode.removeChild(this.html),this.html=null,this.player.getOptions().autoplay&&this.player.play()}}]),A}(),SA=function(){function A(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"关闭广告";jA(this,A),this.adVideoSource=t,this.adLink=e,this.html=m(pA.a),this.adInterval=null,this.adCloseFunction=n,this.html.querySelector(".video-ad-close-text").innerText=i,this.html.querySelector(".video-ad-link").setAttribute("href",this.adLink),this.html.querySelector(".video-ad-detail").setAttribute("href",this.adLink),this.adDuration=null}return kA(A,[{key:"createEl",value:function(A,t){var e=t._options&&t._options.language;this.isEn=e&&"en-us"===e,this.html.querySelector(".video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html),A.querySelector("video"),A.querySelector("video").setAttribute("preload","load");var n=A.querySelector(".prism-controlbar");n.className=n.className+" controlbar-element-hidden";var i=A.querySelector(".prism-big-play-btn");i.className=i.className+" controlbar-element-hidden"}},{key:"created",value:function(A){var t=this;if(this.player=A,this.vdSource=A.getOptions().source,A.loadByUrl(this.adVideoSource),this.html.querySelector(".autoplay-video-ad").onclick=function(){null!==t.adDuration&&(A.loadByUrl(t.adVideoSource),t.html.parentNode.querySelector(".prism-big-play-btn").click())},null===this.adDuration){this.adDuration=void 0;var e=this.html.parentNode.querySelector("video"),n=this;e.addEventListener("timeupdate",function t(){var i=e.duration;isNaN(i)||0===i||(e.removeEventListener("timeupdate",t),n.adDuration=Math.ceil(e.duration),"none"!==n.html.querySelector(".autoplay-video-ad").style.display&&(n.html.querySelector(".autoplay-video-ad").style.display="none",A.play()),n.html.querySelector("#video-ad-duration").innerText=n.adDuration,n.setAdInterval())})}}},{key:"ready",value:function(A){var t=this;this.html.querySelector(".video-ad-close label").onclick=function(){"function"==typeof t.adCloseFunction?t.adCloseFunction(t):t.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()}}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#video-ad-duration");this.adInterval=setInterval(function(){A.adDuration-=1,A.adDuration<=0?(A.closeVideoAd(),document.getElementById("player-con").getElementsByTagName("video")[0].play()):t.innerText=A.adDuration},1e3)}},{key:"closeVideoAd",value:function(){this.clearAdInterval(),this.player.loadByUrl(this.vdSource);var A=this.html.parentNode.querySelector(".prism-controlbar");A.className=A.className.replace(" controlbar-element-hidden","");var t=this.html.parentNode.querySelector(".prism-big-play-btn");t.className=t.className.replace(" controlbar-element-hidden",""),this.player.getOptions().autoplay&&this.player.play(),this.html.parentNode.removeChild(this.html)}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playVideoAd",value:function(){this.setAdInterval(),this.player.play()}},{key:"pauseVideoAd",value:function(){this.clearAdInterval(),this.player.pause()}}]),A}(),zA=LA;CA.mobile()&&(zA=SA);var OA=zA,YA=e(22),UA=e.n(YA),GA=e(23),FA=e.n(GA),HA=(e(59),function(){function A(A,t){for(var e=0;e'+A.text+""});e.html.querySelector(".caption-list").innerHTML='
  • 字幕
  • '+n.join("")});var i=this.html.querySelector(".current-caption"),o=this.html.querySelector(".caption-list");0==this.hasCreated&&this.definition&&(o.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var r=null;i.onclick=function(){o.style.display="block"},i.onmouseleave=function(){r=setTimeout(function(){o.style.display="none"},100)},o.onmouseenter=function(){clearTimeout(r)},o.onmouseleave=function(){o.style.display="none",e.modalHtml.style.display="none"},o.onclick=function(A){var n=A.target,i=n.dataset.def;if(i&&"current"!==n.className){var o=e.captionList.find(function(A){return A.value===i});t._ccService.switch(o.value),e.setCurrentCaption(o.text,o.value),e.modalHtml.style.display="block",e.modalHtml.querySelector(".switchimg").style.display="block",e.modalHtml.querySelector("span.current-caption-tag").innerText=o.text}}}},{key:"setCurrentCaption",value:function(A,t){var e=this.html.querySelector(".current-caption");e.innerText=A,e.dataset.def=t,this.definition=t;var n=this.html.querySelector(".caption-list"),i=n.querySelector(".current");i&&(i.className="");var o=n.querySelectorAll("li");o.forEach(function(t){t.innerText===A&&(t.className="current")}),o&&(o.className="current")}},{key:"created",value:function(A){}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-cc");t&&t.classList.add("player-hidden")}}]),A}(),VA=e(24),qA=e.n(VA),PA=e(25),RA=e.n(PA),JA=(e(61),function(){function A(A,t){for(var e=0;e'+A.text+""});e.html.querySelector(".track-list").innerHTML='
  • 音轨
  • '+n.join("")});var i=this.html.querySelector(".current-track"),o=this.html.querySelector(".track-list");0==this.hasCreated&&this.definition&&(o.querySelector('li[data-def="'+this.definition+'"]').className="current"),this.hasCreated=!0;var r=null;i.onclick=function(){o.style.display="block"},i.onmouseleave=function(){r=setTimeout(function(){o.style.display="none"},100)},o.onmouseenter=function(){clearTimeout(r)},o.onmouseleave=function(){o.style.display="none",e.modalHtml.style.display="none"},o.onclick=function(A){var n=A.target,i=n.dataset.def;if(i&&"current"!==n.className){var o=e.trackList.find(function(A){return A.value.toString()===i});t._audioTrackService.switch(o.value),e.setCurrentTrack(o.text,o.value),e.modalHtml.style.display="block",e.modalHtml.querySelector(".switchimg").style.display="block",e.modalHtml.querySelector("span.current-track-tag").innerText=o.text}}}},{key:"setCurrentTrack",value:function(A,t){var e=this.html.querySelector(".current-track");e.innerText=A,e.dataset.def=t,this.definition=t;var n=this.html.querySelector(".track-list"),i=n.querySelector(".current");i&&(i.className="");var o=n.querySelectorAll("li");o.forEach(function(t){t.innerText===A&&(t.className="current")}),o&&(o.className="current")}},{key:"created",value:function(A){}},{key:"ready",value:function(A){this.modalHtml.style.display="none";var t=document.querySelector(".prism-setting-item.prism-setting-audio");t&&t.classList.add("player-hidden")}}]),A}(),KA=e(26),XA=e.n(KA),_A=(e(63),e(27)),$A=e.n(_A),At=function(){function A(A,t){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:"关闭广告";tt(this,A),this.adVideoSource=t,this.html=m(XA.a),this.adInterval=null,this.adCloseFunction=e,this.html.querySelector(".many-video-ad-close-text").innerText=n,this.adDuration=null,this.player=null,this.indexVideo=1}return At(A,[{key:"createEl",value:function(A,t){var e=t._options&&t._options.language;this.isEn=e&&"en-us"===e,this.html.querySelector(".many-video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html)}},{key:"created",value:function(A){var t=this.adVideoSource.map(function(A,t){return''});this.html.querySelector(".videos").innerHTML=t.join(" "),this.indexVideo=Number(this.indexVideo);var e=this.indexVideo,n=this.adVideoSource,i=this.html.querySelector("#many-video-ad-content"+this.indexVideo),o=this.html.querySelector(".many-video-ad-detail"),r=this.html.querySelector("#many-video-ad-duration"),a=this,l=i.play();void 0!==l&&l.then(function(){i.play()}).catch(function(A){document.querySelector(".autoplay-many-video-ad").style.display="block",i.oncanplay=function(){var A=Math.ceil(i.duration);document.querySelector("#many-video-ad-duration").innerText=A}}),i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),o.href=n[e-1].adVideoLink,i.play().then(function(){var A=Math.ceil(i.duration);r.innerText=A,a.setAdInterval()}).catch(function(A){a.html.querySelector(".autoplay-many-video-ad").style.display="block",a.html.querySelector(".icon-player-play").onclick=function(){a.playManyVideoAd(),a.html.querySelector(".autoplay-many-video-ad").style.display="none"}})})}},{key:"ready",value:function(A,t){var e=this;this.indexVideo=Number(this.indexVideo);var n=this;this.html.querySelector("#many-video-ad-content"+this.indexVideo).addEventListener("ended",function(t){"-1"==n.playNext(n)&&A.play()}),this.html.querySelector(".many-video-ad-close label").onclick=function(){"function"==typeof e.adCloseFunction?e.adCloseFunction(e):e.closeManyVideoAd()}}},{key:"setAdInterval",value:function(A){var t=this,e=this.html.querySelector("#many-video-ad-duration"),n=this.html.querySelector("#many-video-ad-content"+this.indexVideo);this.adInterval=setInterval(function(){var A=Math.ceil(n.duration)-Math.ceil(n.currentTime);e.innerText=A,1==A&&clearInterval(t.adInterval)},1e3)}},{key:"pauseManyVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).pause()}},{key:"playManyVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playNext",value:function(A){if(A.indexVideo>=A.adVideoSource.length)return A.html.parentNode.removeChild(A.html),-1;this.indexVideo=Number(this.indexVideo),null!=document.getElementById("many-video-ad-content"+this.indexVideo)&&document.getElementById("many-video-ad-content"+this.indexVideo).remove();var t=this.indexVideo+1;A.html.querySelector(".many-video-ad-detail").href=A.adVideoSource[A.indexVideo].adVideoLink;var e=this.html.querySelector("#many-video-ad-content"+t),n=this.html.querySelector("#many-video-ad-duration");e.style.display="block",this.adVideoSource.length>=this.indexVideo&&(this.indexVideo=this.indexVideo+1);var i=Math.ceil(e.duration);n.innerText=i,A.setAdInterval(),e.play(),e.addEventListener("ended",function(t){"-1"==A.playNext(A)&&document.getElementById("player-con").getElementsByTagName("video")[0].play()})}},{key:"closeManyVideoAd",value:function(){this.clearAdInterval(),this.html.parentNode.removeChild(this.html),this.html=null,document.getElementById("player-con").getElementsByTagName("video")[0].play()}}]),A}(),nt=function(){function A(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"关闭广告";tt(this,A),this.adVideoSource=t,this.html=m($A.a),this.adInterval=null,this.adCloseFunction=e,this.html.querySelector(".many-video-ad-close-text").innerText=n,this.adDuration=null,this.player=null,this.indexVideo=1}return At(A,[{key:"createEl",value:function(A,t){var e=this,n=t._options&&t._options.language;this.isEn=n&&"en-us"===n,this.html.querySelector(".many-video-ad-detail").innerText=this.isEn?"For more information":"查看广告详情",this.html.querySelector(".limit").innerText=this.isEn?"Your browser limits autoplay":"您的浏览器限制",this.html.querySelector(".manual").innerText=this.isEn?"Please Click":"自动播放请点击",A.appendChild(this.html),A.querySelector(".videosmb"),A.querySelector(".videosmb").setAttribute("preload","load");var i=A.querySelector(".prism-controlbar");i.className=i.className+" controlbar-element-hidden",this.html.querySelector(".icon-player-play").onclick=function(){e.playManyVideoAd(),e.html.querySelector(".autoplay-many-video-ad").style.display="none"}}},{key:"created",value:function(A){var t=this.adVideoSource.map(function(A,t){return''});this.html.querySelector(".videosmb").innerHTML=t.join(" "),this.indexVideo=Number(this.indexVideo);var e=this.indexVideo,n=this.adVideoSource,i=this.html.querySelector("#many-video-ad-content"+this.indexVideo),o=this.html.querySelector(".many-video-ad-detail"),r=this;i.addEventListener("canplay",function A(){i.removeEventListener("canplay",A),o.href=n[e-1].adVideoLink,r.html.querySelector("#many-video-ad-duration").innerText=Math.ceil(i.duration)})}},{key:"ready",value:function(A){var t=this;this.indexVideo=Number(this.indexVideo);var e=this;this.html.querySelector("#many-video-ad-content"+this.indexVideo).addEventListener("ended",function(t){if("-1"==e.playNext(e)){A.play();var n=document.querySelector(".prism-controlbar");n.className=n.className.replace(" controlbar-element-hidden","")}}),this.html.querySelector(".many-video-ad-close label").onclick=function(){"function"==typeof t.adCloseFunction?t.adCloseFunction(t):t.closeManyVideoAd()}}},{key:"setAdInterval",value:function(){var A=this,t=this.html.querySelector("#many-video-ad-duration"),e=this.html.querySelector("#many-video-ad-content"+this.indexVideo);this.adInterval=setInterval(function(){var n=Math.ceil(e.duration)-Math.ceil(e.currentTime);t.innerText=n,1==n&&clearInterval(A.adInterval)},1e3)}},{key:"closeManyVideoAd",value:function(){this.clearAdInterval();var A=this.html.parentNode.querySelector(".prism-controlbar");A.className=A.className.replace(" controlbar-element-hidden",""),this.html.parentNode.removeChild(this.html),this.html=null,document.getElementById("player-con").getElementsByTagName("video")[0].play()}},{key:"clearAdInterval",value:function(){null!==this.adInterval&&clearInterval(this.adInterval),this.adInterval=null}},{key:"playManyVideoAd",value:function(){this.setAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).play()}},{key:"pauseManyVideoAd",value:function(){this.clearAdInterval(),this.html.querySelector("#many-video-ad-content"+this.indexVideo).pause()}},{key:"playNext",value:function(A){if(A.indexVideo>=A.adVideoSource.length)return A.html.parentNode.removeChild(A.html),-1;this.indexVideo=Number(this.indexVideo),null!=document.getElementById("many-video-ad-content"+this.indexVideo)&&document.getElementById("many-video-ad-content"+this.indexVideo).remove();var t=this.indexVideo+1;A.html.querySelector(".many-video-ad-detail").href=A.adVideoSource[A.indexVideo].adVideoLink;var e=this.html.querySelector("#many-video-ad-content"+t),n=this.html.querySelector("#many-video-ad-duration");e.style.display="block",this.adVideoSource.length>=this.indexVideo&&(this.indexVideo=this.indexVideo+1);var i=Math.ceil(e.duration);n.innerText=i,A.setAdInterval(),e.play(),e.addEventListener("ended",function(t){if("-1"==A.playNext(A)){document.getElementById("player-con").getElementsByTagName("video")[0].play();var e=document.querySelector(".prism-controlbar");e.className=e.className.replace(" controlbar-element-hidden","")}})}}]),A}(),it=et;CA.mobile()&&(it=nt);var ot=it;window.AliPlayerComponent={AliplayerDanmuComponent:v,BulletScreenComponent:N,MemoryPlayComponent:D,PauseADComponent:C,PlaylistComponent:O,PreviewVodComponent:F,RotateMirrorComponent:oA,StartADComponent:sA,VideoADComponent:OA,RateComponent:tA,QualityComponent:X,ProgressComponent:q,CaptionComponent:ZA,TrackComponent:WA,ManyVideoADComponent:ot}}]); \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/public/static/logo.png b/sfu-server/guannancs_web_mediasoup/public/static/logo.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/public/static/logo.png differ diff --git a/sfu-server/guannancs_web_mediasoup/public/static/logo3.png b/sfu-server/guannancs_web_mediasoup/public/static/logo3.png new file mode 100644 index 0000000..53793a8 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/public/static/logo3.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/App.vue b/sfu-server/guannancs_web_mediasoup/src/App.vue new file mode 100644 index 0000000..2f08534 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/App.vue @@ -0,0 +1,64 @@ + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/InviteClient.js b/sfu-server/guannancs_web_mediasoup/src/agora/InviteClient.js new file mode 100644 index 0000000..5c35adc --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/InviteClient.js @@ -0,0 +1,304 @@ +import { EventEmitter } from 'events' +import { MessageBox } from 'element-ui' +import RtmClient from './rtmClient' +import StorageChannel from '../components/system/public/storageSignaling' + +export default class InviteClient { + constructor({ account = "", uid = "" }) { + localStorage.removeItem('account') + this.account = (account || '').trim() + this.appId = AGORA_APP_ID + this.channelName = '' + this.routeId = '' + this.call_is_immediate_join = true + this.is_call = false + this.isJoined = false + this.remoteLogin = false + this.uid = uid.toString() + this.events = new EventEmitter() + this.rtm = new RtmClient(this.appId) + // 基于H5的本地存储的跨页面通讯 + this.storageChannel = new StorageChannel('inviteClient') + this.storageChannelEvents() + this.storageChannel.postMessage('get_account', { account: this.account }) + + this.rtm.on("RemoteInvitationReceived", (content, callerId) => { this.onInviteReceived(content, callerId) }) + this.rtm.on("inviteEndByPeer", () => { this.onInviteEndByPeer() }) + this.rtm.on("LocalInvitationAccepted", ({ peerId }) => { + // remote user 已接收接受邀请 + console.log('Invitation accepted by:', peerId) + }) + this.rtm.on('MessageFromPeer', ({ text }) => { + console.log('[inviteClient] MessageFromPeer text ', text) + const storageChannel = this.storageChannel + const data = text.data + switch (text.name) { + case 'videoConsultationWindow': + if (text.type === 'tips') { + storageChannel.postMessage('videoConsultationWindowTips', data) + } + break + case 'router': // 超声会诊的提示信息 + this.$confirm(text.msg, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'info' + }).then(() => { + this.$router.push(text.router) + }).catch(() => { }) + break + + default: + break + } + }) + this.rtm.on('remoteLogin', res => { + this.storageChannel.postMessage('remoteLogin') + this.remoteLogin = true + MessageBox.alert('你的账号已在其他地方登录,导致部分功能无法正常使用。请重新登录!', '登录提示', { + confirmButton: '确定', + type: 'warning' + }).then(res => { + MessageBox.close() + this.storageChannel.postMessage('remoteLoginCloseAlert') + }) + }) + } + + async init() { + console.log('uid: ' + this.uid) + return this.rtm.login(this.uid).then(res => { + this.uid = this.rtm.uid + return res + }) + const rtmClient = await this.rtm.login(this.uid) + return rtmClient + } + + // 跨页面通讯事件注册 + storageChannelEvents() { + const storageChannel = this.storageChannel + storageChannel.on('remoteLoginCloseAlert', res => { + MessageBox.close() + }) + storageChannel.on('is_joined', res => { + this.isJoined = res.isJoined + }) + storageChannel.on('get_system_info', res => { + storageChannel.postMessage('get_account', { account: this.account }) + if (this.isJoined) { + this.isJoined = false + this.do_join() + } + }) + storageChannel.on('get_channelName', res => { + this.channelName = res.channelName + console.log('channelName: ' + this.channelName) + if (!this.call_is_immediate_join && this.is_call) { + console.log('call_is_immediate_join', this.call_is_immediate_join) + // 打开视频窗口 + storageChannel.postMessage(`open_videoWindow`, null) + // 调用加入视频函数 + this.do_join() + this.is_call = false + } + }) + storageChannel.on('do_call', res => { + let options = { + peers: res.callAccount + } + this.do_call(options) + this.do_join() + }) + storageChannel.on('do_join', res => { + this.do_join() + }) + storageChannel.on('do_leave', res => { + this.do_leave() + }) + // storageChannel.on('subscribePeersOnlineStatus', res => { + + // }) + // storageChannel.on('unsubscribePeersOnlineStatus', res => { + + // }) + storageChannel.on('sendMessageToPeer', res => { + const peerId = res.uid + peerId && this.rtm.sendMessageToPeer(res, peerId) + }) + } + + // 设置route Id + setRouteId(routeId) { + this.routeId = routeId || '' + } + + // 邀请远端用户方法 + call(content, peerId) { + return new Promise((resolve, reject) => { + this.rtm.invite(content, peerId) + }) + } + + // 结束呼叫的方法 + endCall(passive) { + //end rtm + if (!passive) { + this.rtm.endCall() + } + } + + do_call = (res) => { + // 被呼叫的用户 + const peers = res.peers + const len = peers.length + if (!len && false) { + peers.forEach(peer => { + if (!verifyPeers.includes(peer)) { + console.log('[ inviteClient ] call ' + peer.account + ' , channelName : ' + channelNamechannelName + ', extra : ' + JSON.stringify(extra)) + + // 添加到验证邀请用户是否已邀请的数组中 + verifyPeers.push(peer) + // 添加呼叫类型 + if (!current_callType.includes(peer.callType)) { + current_callType.push(peer.callType) + } + // 邀请peer用户加入频道的方法 + let call = session.channelInviteUser2(channelName, peer.account, JSON.stringify({ ...peer })) + console.log(call) + callLists.push(call) + init_call(call) + } else { + console.log('[ inviteClient ] ' + peer + '已在频道') + } + }) + return false + } else if (len == 1) { + const rtm = this.rtm + const peer = peers[0] + const uid = peer.uid.toString() + peer.channelName = this.channelName + this.rtm.queryPeersOnlineStatus([this.uid]).then(status => { + const onlineStatus = status[this.uid] + if (onlineStatus) { + this.rtm.queryPeersOnlineStatus([uid]).then(status => { + const onlineStatus = status[uid] + if (onlineStatus) { + this.call(peer, uid).then(() => { + // 已发起呼叫 + }).catch(() => { + this.endCall(false) + }) + } else { + this.storageChannel.postMessage('peer-online-status', { uid, result: onlineStatus, msg: 'offline' }) + } + }).catch(err => { + console.log(err) + this.storageChannel.postMessage('peer-online-status', { uid, result: false, msg: 'err' }) + }) + } else { + this.remoteLogin && this.storageChannel.postMessage('remoteLoginCloseAlert') + } + }).catch(err => { + console.log(err) + this.storageChannel.postMessage('remoteLoginCloseAlert') + }) + } else { + console.log('[ inviteClient ] 未填写邀请用户!!!') + } + } + + // 接收调用时委托回调 + onInviteReceived(res) { + const call = res.content + const channelName = this.channelName + if (!channelName || channelName == call.channelName) { + console.log('[ inviteClient ] recv inst msg from ' + call.uid + ', ' + call.channelName + ', ' + JSON.stringify(call)) + this.rtm.on("RemoteInvitationAccepted", ({ uid, channel, state }) => { + console.log("[ inviteClient ] RemoteInvitationAccepted ", { uid, channel, state }) + this.uid = uid + this.channelName = channel + this.events.emit('inviteReceived', { + path: call.path, + query: { + id: call.videoId, + diagnosisType: 'SP' + } + }) + console.log(' [ inviteClient ] onInviteReceived ', this.routeId, this.routeId === call.videoId, call.videoId) + this.call_is_immediate_join = this.routeId == call.videoId + this.is_call = true + if (this.call_is_immediate_join) { + console.log('[ inviteClient ] call_is_immediate_join', this.call_is_immediate_join) + // 调用加入视频函数 + this.do_join() + // 打开视频窗口 + this.storageChannel.postMessage(`open_videoWindow`, null) + } + }) + this.rtm.accept() + } + } + + // 调用结束时调用的委托回调 + onInviteEndByPeer() { + this.endCall(true) + } + + // 加入频道 + do_join() { // appId uid channelName + // if (!this.isJoined) { + this.isJoined = true + const { appId, channelName, uid } = this + this.storageChannel.postMessage(`do_join_media`, { appId, channelName }) + // } + } + + // 离开视频会诊界面退出频道和视频 + do_leave(res) { + console.log('do_leave') + // 退出视频 + this.storageChannel.postMessage(`do_leave_media`, null) + this.storageChannel.postMessage('is_joined', { isJoined: false, isSaveData: true }) + + if (this.isJoined) { + // 设置加入频道状态 + this.isJoined = false + // this.rtm.leave().then(res => { + // console.log('[ channel ] Leavel channel successfully') + // }) + } + } + + // signal退出登录 + doLogout() { + console.log('[ inviteClient ] Signaling logout successful'), + this.do_leave() + this.rtm.logout() + this.storageChannel.destroyed() + this.storageChannel = null + } + + _removeArray(arr) { + console.log(this) + let slice = Array.prototype.slice + let args = slice.call(arguments, 1) + if (Array.isArray(arr)) { + console.log(args) + args.forEach(el => { + let index = arr.indexOf(el) + console.log(index) + if (index > -1) { + arr.splice(index, 1) + } + }) + console.log('[ inviteClient ] RemoveArray:', arr) + } else { + console.error('[ inviteClient ] Error: arr is not a Array.') + } + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/LiveShowDemo.vue b/sfu-server/guannancs_web_mediasoup/src/agora/LiveShowDemo.vue new file mode 100644 index 0000000..e9dc142 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/LiveShowDemo.vue @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamAudience.vue b/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamAudience.vue new file mode 100644 index 0000000..8fc7efd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamAudience.vue @@ -0,0 +1,1065 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamHost.vue b/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamHost.vue new file mode 100644 index 0000000..c457181 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/LiveStreamHost.vue @@ -0,0 +1,579 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/SettingDevices.vue b/sfu-server/guannancs_web_mediasoup/src/agora/SettingDevices.vue new file mode 100644 index 0000000..9842d52 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/SettingDevices.vue @@ -0,0 +1,267 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/agoraConfig.js b/sfu-server/guannancs_web_mediasoup/src/agora/agoraConfig.js new file mode 100644 index 0000000..a58da00 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/agoraConfig.js @@ -0,0 +1,2 @@ +// E33D67E2B174495F8F7AB9E154713D5E +export const AGORA_APP_ID = import.meta.env.PROD ? import.meta.env.VITE_AGORA_APP_ID : 'dbe6c79f3c8045b4abbf8429838189db' \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/controller.js b/sfu-server/guannancs_web_mediasoup/src/agora/controller.js new file mode 100644 index 0000000..4650863 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/controller.js @@ -0,0 +1,183 @@ +import { EventEmitter } from 'events' +import RTMClient from './rtmClient' +import { MessageBox } from 'element-ui' +export default class Contorller { + constructor(appid) { + this._defineProperty('channelName') + this.peersOnlineState = {} + this.rtm = new RTMClient(appid) + this.events = new EventEmitter() + this.rtm.on('RemoteInvitationReceived', callerId => { this.onInviteReceived(callerId) }) + this.rtm.on('inviteEndByPeer', () => { this.onInviteEndByPeer() }) + this.rtm.on('LocalInvitationAccepted', ({ peerId }) => { + // + }) + this.rtm.on('LoginSuccess', res => { + this.events.emit('LoginSuccess') + }) + this.rtm.on('ConnectionStateChanged', state => { + console.log('[contorller] ConnectionStateChanged state: ', state) + this.events.emit('ConnectionStateChanged', state) + }) + this.rtm.on('PeersOnlineStatusChanged', status => { + console.log('[contorller] PeersOnlineStatusChanged status: ', status) + const peersOnlineState = this.peersOnlineState + Object.keys(status).forEach(item => { + peersOnlineState[item] = status[item] + }) + this.events.emit('PeersOnlineStatusChanged', status) + }) + this.rtm.on('MemberJoined', (memberId, channelName) => { + this.events.emit('MemberJoined', memberId, channelName) + }) + this.rtm.on('MemberLeft', (memberId, channelName) => { + this.events.emit('MemberLeft', memberId, channelName) + }) + this.rtm.on('ChannelMessage', ({ text, memberId, channelName }) => { + this.events.emit('ChannelMessage', { text, memberId, channelName }) + }) + this.rtm.on('MessageFromPeer', ({ text, peerId }) => { + this.events.emit('MessageFromPeer', { text, peerId }) + }) + this.rtm.on('remoteLogin', res => { + this.storageChannel.postMessage('remoteLogin') + this.remoteLogin = true + MessageBox.alert('你的账号已在其他地方登录,导致部分功能无法正常使用。请重新登录!', '登录提示', { + confirmButton: '确定', + type: 'warning' + }).then(res => { + MessageBox.close() + }) + }) + } + + async login(localAccount) { + return await this.rtm.login(localAccount) + } + + async logout() { + return await this.rtm.logout() + } + + async join(channelName) { + channelName && (this.channelName = 'contorller' + channelName) + return await this.rtm.join(this.channelName) + } + + async leave(channelName) { + return await this.rtm.leave(channelName) + } + + getMembers(channelName) { + return this.rtm.getMembers(channelName) + } + + // 邀请远端用户方法 + _call(content, peerId) { + return new Promise((resolve, reject) => { + this.channelName = content.channelName = 'contorller' + content.channelName + this.rtm.invite(content, peerId).then(res => { + resolve(res) + }).catch(err => { + reject(err) + }) + }) + } + + // 结束呼叫的方法 + endCall(passive) { + //end rtm + if (!passive) { + this.rtm.endCall() + } + } + + call(content, peerId) { + console.log('[ contorller ] call') + // 被呼叫的用户 + return this._call(content, peerId).then(async res => { + let channelMemberCount = await this.rtm.client.getChannelMemberCount([this.channelName]) + console.log('[ channelMemberCount ]', channelMemberCount) + }).catch(err => { + console.log('call err', err) + this.endCall(false) + }) + } + + // 接收呼叫时委托回调 + onInviteReceived(res) { + const call = res.content + const channelName = this.channelName + if (!channelName || channelName == call.channelName) { + console.log('recv inst msg from ' + call.peer + ', ' + call.channelName + ', ' + JSON.stringify(call)) + this.rtm.on("RemoteInvitationAccepted", ({ uid, channel, state }) => { + console.log("[client] RemoteInvitationAccepted ", { uid, channel, state }) + this.uid = uid + this.channelName = channel + this.endCall() + }) + this.rtm.accept() + } + } + + // 调用结束时调用的代理回调 + onInviteEndByPeer() { + console.log('[contorller] onInviteEndByPeer') + this.endCall(true) + } + + sendMessage(text) { + return this.rtm.sendMessage(text) + } + + sendMessageToPeer(msg, peerId) { + const isFilter = msg.type !== 'status' + + const peerOnlineState = this.peersOnlineState[peerId] + if (isFilter && peerOnlineState && peerOnlineState === 'OFFLINE') { + return Promise.reject('PEER_OFFLINE') + } + + return this.rtm.sendMessageToPeer(msg, peerId) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The channel ID of the specified channel. + * @param {AttributesMap} attributes — An array of channel attributes. + * @param {ChannelAttributeOptions} options — Options for this attribute operation. + * @memberof RTMClient + */ + setChannelAttributes(channelId, attributes, options = {}) { + return this.rtm.setChannelAttributes(channelId, attributes, options) + } + + /** + * Gets the attributes of a specified channel by attribute keys. + * @param {string} channelId — The ID of the specified channel. + * @param {string[]} keys — An array of attribute keys. + * @memberof RTMClient + */ + getChannelAttributesByKeys(channelId, keys) { + return this.rtm.getChannelAttributesByKeys(channelId, keys) + } + + _defineProperty(name) { + sessionStorage.Contorller = sessionStorage.Contorller || JSON.stringify({}) + let value = JSON.parse(sessionStorage.Contorller).cName || null + Object.defineProperty(this, name, { + get() { + return value + }, + set(val) { + let contorller = JSON.parse(sessionStorage.Contorller) + value = contorller.cName = val + sessionStorage.Contorller = JSON.stringify(contorller) + } + }) + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/rtcClient.js b/sfu-server/guannancs_web_mediasoup/src/agora/rtcClient.js new file mode 100644 index 0000000..cbc454f --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/rtcClient.js @@ -0,0 +1,164 @@ +import { EventEmitter } from 'events'; +import * as mediasoupClient from 'mediasoup-client'; +import { io } from 'socket.io-client'; + +/** + * Mediasoup 客户端封装 + * 适配原有的调用习惯,替换底层 Agora 实现 + */ +class RTCClient { + constructor(appId, mode = 'rtc') { + this.appId = appId; + this.mode = mode; + this.device = null; + this.socket = null; + this.sendTransport = null; + this.recvTransport = null; + this.producers = new Map(); // kind => producer + this.consumers = new Map(); // producerId => consumer + + this.events = new EventEmitter(); + this.state = { + joined: false, + published: false, + channel: '' + }; + + // 默认指向我们新创建的国产测试服务器地址 + // TODO: 在医院专网部署时,请修改为服务器实体IP + this.serverUrl = import.meta.env.PROD ? `http://${location.hostname}:3000` : 'http://localhost:3000'; + } + + /** + * 初始化并加入房间 + */ + async join(channel, uid) { + if (this.state.joined) return; + + this.state.channel = channel; + this.uid = uid; + + // 1. 连接信令服务器 + this.socket = io(this.serverUrl); + + return new Promise((resolve, reject) => { + this.socket.on('connect', async () => { + console.log('[Mediasoup] Signaling connected'.green); + try { + // 2. 获取服务器渲染能力并初始化设备 + const rtpCapabilities = await this._sendRequest('getRouterRtpCapabilities', { roomName: channel }); + this.device = new mediasoupClient.Device(); + await this.device.load({ routerRtpCapabilities: rtpCapabilities.rtpCapabilities }); + + this.state.joined = true; + this.events.emit('joined', uid); + resolve(uid); + } catch (err) { + reject(err); + } + }); + + // 监听新流通知 + this.socket.on('newProducer', async ({ producerId, kind }) => { + console.log('[Mediasoup] Remote stream detected:', kind); + this.events.emit('peer-online', { uid: producerId, kind }); // 模拟 Agora 用户上线 + }); + }); + } + + /** + * 推流 (超声传输/语音通话) + */ + async createStream(streamConfig = { audio: true, video: true }) { + if (!this.device.canProduce('video')) { + console.error('Cannot produce video'); + return; + } + + try { + // 1. 创建服务端的 SendTransport + const transportInfo = await this._sendRequest('createWebRtcTransport', { roomName: this.state.channel }); + + // 2. 创建本地的 SendTransport + this.sendTransport = this.device.createSendTransport(transportInfo.params); + + // 3. 设置 Transport 事件 + this.sendTransport.on('connect', ({ dtlsParameters }, callback, errback) => { + this._sendRequest('connectWebRtcTransport', { + transportId: this.sendTransport.id, + dtlsParameters + }).then(callback).catch(errback); + }); + + this.sendTransport.on('produce', ({ kind, rtpParameters, appData }, callback, errback) => { + this._sendRequest('produce', { + transportId: this.sendTransport.id, + kind, + rtpParameters, + appData + }).then(({ id }) => callback({ id })).catch(errback); + }); + + // 4. 获取本地媒体轨道 + const stream = await navigator.mediaDevices.getUserMedia(streamConfig); + + if (streamConfig.video) { + const videoTrack = stream.getVideoTracks()[0]; + const videoProducer = await this.sendTransport.produce({ track: videoTrack }); + this.producers.set('video', videoProducer); + this.localVideoTrack = videoTrack; + } + + if (streamConfig.audio) { + const audioTrack = stream.getAudioTracks()[0]; + const audioProducer = await this.sendTransport.produce({ track: audioTrack }); + this.producers.set('audio', audioProducer); + this.localAudioTrack = audioTrack; + } + + this.state.published = true; + return { videoTrack: this.localVideoTrack, audioTrack: this.localAudioTrack }; + } catch (err) { + console.error('[Mediasoup] Publish failed:', err); + } + } + + /** + * 播放(模拟 Agora 接口) + */ + play(track, elementId) { + if (!track) return; + const mediaStream = new MediaStream([track]); + const videoElement = document.getElementById(elementId); + if (videoElement) { + videoElement.srcObject = mediaStream; + videoElement.play().catch(e => console.warn('Play error:', e)); + } + } + + /** + * 离开房间 + */ + async leave() { + if (this.socket) this.socket.disconnect(); + if (this.sendTransport) this.sendTransport.close(); + if (this.recvTransport) this.recvTransport.close(); + this.state.joined = false; + this.state.published = false; + console.log('[Mediasoup] Left room'); + } + + /** + * 封装 Socket 请求为 Promise + */ + _sendRequest(type, data) { + return new Promise((resolve, reject) => { + this.socket.emit(type, data, (res) => { + if (res.error) reject(res.error); + else resolve(res); + }); + }); + } +} + +export default RTCClient; \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/rtmClient.js b/sfu-server/guannancs_web_mediasoup/src/agora/rtmClient.js new file mode 100644 index 0000000..fd61db1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/rtmClient.js @@ -0,0 +1,118 @@ +import { EventEmitter } from 'events'; +import { io } from 'socket.io-client'; + +/** + * RTM 客户端封装 (替代 Agora RTM) + * 使用 Socket.io 实现私有云信令 + */ +export default class RTMClient { + constructor(appId) { + this.appId = appId; + this.uid = null; + this.socket = null; + this.isLogined = false; + this.loginState = 'DISCONNECTED'; + this.events = new EventEmitter(); + + // 服务器地址与 RTC 保持一致 + this.serverUrl = import.meta.env.PROD ? `http://${location.hostname}:3000` : 'http://localhost:3000'; + } + + /** + * 登录信令系统 + */ + async login(uid) { + this.uid = uid.toString(); + console.log(`[Signaling] Logging in: ${this.uid}`); + + this.socket = io(this.serverUrl, { + query: { uid: this.uid } + }); + + return new Promise((resolve) => { + this.socket.on('connect', () => { + this.isLogined = true; + this.loginState = 'CONNECTED'; + console.log('[Signaling] Connected to SFU Server'.green); + + // 注册通用消息监听 + this._setupListeners(); + + this.events.emit('ConnectionStateChanged', 'LOGIN_SUCCESS'); + resolve(true); + }); + + this.socket.on('disconnect', () => { + this.isLogined = false; + this.loginState = 'DISCONNECTED'; + this.events.emit('ConnectionStateChanged', 'LOGOUT'); + }); + }); + } + + _setupListeners() { + // 监听点对点消息 (模拟 Agora MessageFromPeer) + this.socket.on('messageFromPeer', ({ from, text }) => { + console.log(`[Signaling] Msg from ${from}:`, text); + this.events.emit('MessageFromPeer', { text: JSON.stringify(text) }, from); + }); + + // 监听呼叫邀请 (模拟 Agora RemoteInvitationReceived) + this.socket.on('invite', (invitation) => { + console.log('[Signaling] Received invitation:', invitation); + + // 构造类似 Agora 的 invitation 对象供上层使用 + const remoteInvitation = { + callerId: invitation.from, + content: JSON.stringify(invitation.content), + state: 'PENDING', + accept: () => this.socket.emit('acceptInvite', { to: invitation.from }), + refuse: () => this.socket.emit('refuseInvite', { to: invitation.from }) + }; + + this.events.emit('RemoteInvitationReceived', remoteInvitation); + }); + } + + /** + * 发送点对点消息 + */ + async sendMessageToPeer(message, peerId) { + if (!this.isLogined) return; + this.socket.emit('sendMessageToPeer', { + to: peerId, + text: typeof message === 'string' ? JSON.parse(message) : message + }); + } + + /** + * 发起呼叫邀请 (模拟 Agora invite) + */ + async invite(content, peerId) { + console.log(`[Signaling] Inviting ${peerId}...`); + this.socket.emit('invite', { + to: peerId, + content: content + }); + } + + async logout() { + if (this.socket) this.socket.disconnect(); + this.isLogined = false; + } + + /** + * 查询远端用户是否在线 (模拟 Agora RTM 接口) + */ + async queryPeersOnlineStatus(peerIds) { + return new Promise((resolve) => { + this.socket.emit('queryPeersOnlineStatus', { peerIds }, (results) => { + resolve(results); // 返回格式如 { "uid1": true, "uid2": false } + }); + }); + } + + on(event, callback) { + this.events.on(event, callback); + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/agora/tagging.js b/sfu-server/guannancs_web_mediasoup/src/agora/tagging.js new file mode 100644 index 0000000..15bba33 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/agora/tagging.js @@ -0,0 +1,232 @@ +import { EventEmitter } from 'events' + +class Tagging extends EventEmitter { + constructor({el, zIndex, role }) { + super() + this.parent = el + this.canvas = document.createElement('canvas') + this.context = this.canvas.getContext('2d') + this.isMove = false + this.zIndex = zIndex || '2000' + this.status = {} + this.role = role + this.shape = '矩形' + this.color = '#F56C6C' + this.init() + } + + init() { + const canvas = this.canvas + if (this.role == 'audience') { + canvas.onmousedown = this.mousedown.bind(this) + canvas.onmousemove = this.mousemove.bind(this) + canvas.onmouseup = this.mouseup.bind(this) + canvas.onmouseout = this.onmouseout.bind(this) + } + this.setStyle() + this.resize = this.resize.bind(this) + this.resize() + window.addEventListener('resize', this.resize, false) + } + + setStyle() { + const parent = this.parent + const parent_style = this.getStyle(parent) + const parent_position = parent_style.position + const canvas = this.canvas + canvas.style.position = 'absolute' + canvas.style.top = '0' + canvas.style.left = '0' + canvas.style.zIndex = this.zIndex + canvas.style.width = '100%' + canvas.style.height = '100%' + if (parent_position === 'static') { + parent.style.position = 'relative' + } + parent.appendChild(canvas) + } + + resize() { + const canvas = this.canvas + const style = this.getStyle(canvas) + canvas.width = parseFloat(style.width, 10) + canvas.height = parseFloat(style.height, 10) + } + + getStyle(el, pseudoElt = null) { + return (getComputedStyle || document.defaultView.getComputedStyle)(el, pseudoElt) + } + + mousedown(e) { + this.isMove = true + this.canvas.style.cursor = 'move' + let { x, y } = this.windowToCanvas(e.clientX, e.clientY) + // console.log(x,y); + this.status.startX = x + this.status.startY = y + + } + + mouseup(e) { + this.isMove = false + this.canvas.style.cursor = 'default' + // console.log(e); + let { x, y } = this.windowToCanvas(e.clientX, e.clientY) + this.status.endX = x + this.status.endY = y + if (this.shape == '矩形') { + this.drawStrokeRect(this.status) + }else if (this.shape == '扇形') { + this.drawSector(this.status) + }else if (this.shape == '圆形') { + this.drawCircle(this.status) + } + + this.emit('mouseup', this.status) + // + } + onmouseout(e) { + this.isMove = false + this.canvas.style.cursor = 'default' + } + mousemove(e) { + if (this.isMove) { + const { x, y } = this.windowToCanvas(e.clientX, e.clientY) + this.status.endX = x + this.status.endY = y + // this.drawSector(this.status) + if (this.shape == '矩形') { + this.drawStrokeRect(this.status) + }else if (this.shape == '扇形') { + this.drawSector(this.status) + }else if (this.shape == '圆形') { + this.drawCircle(this.status) + }else if (this.shape == '椭圆') { + this.drawEllipse(this.status) + }else if (this.shape == '箭头') { + this.drawArrow(this.status) + } + this.emit('mouseup', this.status) + // this.drawStrokeRect(this.status) + } + } + drawStrokeRect(status) { + const context = this.context + const { startX, startY, endX, endY } = status + const w = startX - endX + const h = startY - endY + // console.log(w, h); + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + context.strokeRect(endX, endY, w, h) + context.restore() + } + + drawSector(status) { + // console.log(endX, endY); + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const a = (endX+startX) / 2; + const b = startY - Math.sqrt(3) * Math.abs(endX-startX)/2; + const r = Math.abs(endX-startX) + const R = r + (endY-startY)*2 / Math.sqrt(3); + context.beginPath(); + context.arc(a, b, R, Math.PI * 60 / 180, Math.PI * 120 / 180); + context.arc(a, b, r, Math.PI * 120 / 180, Math.PI * 60 / 180, true); + context.closePath(); + context.stroke(); + context.restore() + } + drawCircle(status) { + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const r = Math.sqrt( Math.pow(startX-endX, 2) + Math.pow(startY-endY, 2)) + // console.log(r); + context.beginPath(); + context.arc(startX, startY, r, 0, 2*Math.PI); + context.stroke(); + context.restore() + } + drawEllipse(status) { + const context = this.context + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + context.save() + context.strokeStyle = this.color + context.lineWidth = 2 + const x = ( startX + endX ) / 2 + const y = ( startY + endY ) / 2 + const radiusX = Math.abs( endX - startX ) / 2 + const radiusY = Math.abs( endY - startY ) / 2 + context.beginPath(); + context.ellipse(x, y, radiusX, radiusY, 0, 0, Math.PI * 2) + context.stroke() + context.restore() + } + drawArrow(status) { + const ctx = this.context + const theta = 30; // 箭头半边夹角 + const headlen = 10; // 箭头尖端长度 + const { startX, startY, endX, endY } = status + this.clearRect(0, 0, this.canvas.width, this.canvas.height) + ctx.save() + ctx.strokeStyle = this.color; + ctx.lineWidth = 2; + + // 计算各角度和对应的P2,P3坐标 + var angle = Math.atan2(startY - endY, startX - endX) * 180 / Math.PI, + angle1 = (angle + theta) * Math.PI / 180, + angle2 = (angle - theta) * Math.PI / 180, + topX = headlen * Math.cos(angle1), + topY = headlen * Math.sin(angle1), + botX = headlen * Math.cos(angle2), + botY = headlen * Math.sin(angle2); + + ctx.beginPath(); + var arrowX = startX - topX, + arrowY = startY - topY; + ctx.moveTo(arrowX, arrowY); + ctx.moveTo(startX, startY); + ctx.lineTo(endX, endY); + + arrowX = endX + topX; + arrowY = endY + topY; + ctx.moveTo(arrowX, arrowY); + ctx.lineTo(endX, endY); + + arrowX = endX + botX; + arrowY = endY + botY; + ctx.lineTo(arrowX, arrowY); + ctx.stroke(); + ctx.restore(); + } + clearRect(x, y, w, h) { + const context = this.context + context.clearRect(x, y, w, h) + } + + destroyed() { + this.parent.removeChild(this.canvas) + window.removeEventListener('resize', this.resize, false) + } + + windowToCanvas(x, y) { + let box = this.canvas.getBoundingClientRect() + return { + x: x - box.left, + y: y - box.top + }; + } +} + +export default Tagging \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/api/config.js b/sfu-server/guannancs_web_mediasoup/src/api/config.js new file mode 100644 index 0000000..8f15934 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/api/config.js @@ -0,0 +1,13 @@ +/** + * 配置链接头. + */ + +const HOST_NAME = import.meta.env.VITE_HOST_NAME +const OSS_NAME = import.meta.env.VITE_OSS_NAME +const OSS_ASSET_NAME = import.meta.env.VITE_OSS_ASSET_NAME + +export default { + HOST_NAME, + OSS_NAME, + OSS_ASSET_NAME +} diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/css/markdowncss.css b/sfu-server/guannancs_web_mediasoup/src/assets/css/markdowncss.css new file mode 100644 index 0000000..03b160c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/assets/css/markdowncss.css @@ -0,0 +1 @@ +.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:#24292f;background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:' ';display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,");mask-image:url("data:image/svg+xml,")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:#0969da;text-decoration:none}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body abbr[title]{border-bottom:none;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:600;padding-bottom:.3em;font-size:2em;border-bottom:1px solid #d7dde3}.markdown-body mark{background-color:#fff8c5;color:#24292f}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace,monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:0 0;border-bottom:1px solid #d7dde3;height:.25em;padding:0;margin:24px 0;background-color:#d0d7de;border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button}.markdown-body [type=button]::-moz-focus-inner,.markdown-body [type=reset]::-moz-focus-inner,.markdown-body [type=submit]::-moz-focus-inner{border-style:none;padding:0}.markdown-body [type=button]:-moz-focusring,.markdown-body [type=reset]:-moz-focusring,.markdown-body [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none!important}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;color:#24292f;vertical-align:middle;background-color:#f6f8fa;border:solid 1px rgba(175,184,193,.2);border-bottom-color:rgba(175,184,193,.2);border-radius:6px;box-shadow:inset 0 -1px 0 rgba(175,184,193,.2)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h2{font-weight:600;padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid #d7dde3}.markdown-body h3{font-weight:600;font-size:1.25em}.markdown-body h4{font-weight:600;font-size:1em}.markdown-body h5{font-weight:600;font-size:.875em}.markdown-body h6{font-weight:600;font-size:.85em;color:#57606a}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:#57606a;border-left:.25em solid #d0d7de}.markdown-body ol,.markdown-body ul{margin-top:0;margin-bottom:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body ::placeholder{color:#6e7781;opacity:1}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.markdown-body .pl-c{color:#6e7781}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#0550ae}.markdown-body .pl-e,.markdown-body .pl-en{color:#8250df}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292f}.markdown-body .pl-ent{color:#116329}.markdown-body .pl-k{color:#cf222e}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#0a3069}.markdown-body .pl-smw,.markdown-body .pl-v{color:#953800}.markdown-body .pl-bu{color:#82071e}.markdown-body .pl-ii{color:#f6f8fa;background-color:#82071e}.markdown-body .pl-c2{color:#f6f8fa;background-color:#cf222e}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#116329}.markdown-body .pl-ml{color:#3b2300}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#0550ae}.markdown-body .pl-mi{font-style:italic;color:#24292f}.markdown-body .pl-mb{font-weight:700;color:#24292f}.markdown-body .pl-md{color:#82071e;background-color:#ffebe9}.markdown-body .pl-mi1{color:#116329;background-color:#dafbe1}.markdown-body .pl-mc{color:#953800;background-color:#ffd8b5}.markdown-body .pl-mi2{color:#eaeef2;background-color:#0550ae}.markdown-body .pl-mdr{font-weight:700;color:#8250df}.markdown-body .pl-ba{color:#57606a}.markdown-body .pl-sg{color:#8c959f}.markdown-body .pl-corl{text-decoration:underline;color:#0a3069}.markdown-body [data-catalyst]{display:block}.markdown-body g-emoji{font-family:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1em;font-style:normal!important;font-weight:400;line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cf222e}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body sup>a::before{content:"["}.markdown-body sup>a::after{content:"]"}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#24292f;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{padding:0 .2em;font-size:inherit}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #d0d7de}.markdown-body table tr{background-color:#fff;border-top:1px solid #d7dde3}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #d0d7de}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292f}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(175,184,193,.2);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:0 0;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.markdown-body .footnotes{font-size:12px;color:#57606a;border-top:1px solid #d0d7de}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target::before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid #0969da;border-radius:6px}.markdown-body .footnotes li:target{color:#24292f}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/219.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/219.png new file mode 100644 index 0000000..593c26d Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/219.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/DetailsDesc.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/DetailsDesc.png new file mode 100644 index 0000000..8f976af Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/DetailsDesc.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/FullScreen.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/FullScreen.png new file mode 100644 index 0000000..a51d106 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/FullScreen.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc1.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc1.jpg new file mode 100644 index 0000000..a927856 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc1.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc2.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc2.jpg new file mode 100644 index 0000000..5e25277 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc2.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc3.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc3.jpg new file mode 100644 index 0000000..edb5265 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/bgc3.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/exitFullscreen.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/exitFullscreen.png new file mode 100644 index 0000000..e3abb23 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/exitFullscreen.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/flower.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/flower.png new file mode 100644 index 0000000..0bddd42 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/flower.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma1.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma1.png new file mode 100644 index 0000000..d9ec464 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma1.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma2.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma2.png new file mode 100644 index 0000000..b460ab6 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/jingma2.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/large_data_screen.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/large_data_screen.png new file mode 100644 index 0000000..33956d5 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/large_data_screen.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/login.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/login.jpg new file mode 100644 index 0000000..d698eaf Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/login.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/logo.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/logo1.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo1.png new file mode 100644 index 0000000..2fd797c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo1.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/logo2.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo2.png new file mode 100644 index 0000000..a931e59 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo2.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/logo3.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo3.png new file mode 100644 index 0000000..53793a8 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/logo3.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/map.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/map.png new file mode 100644 index 0000000..8550dfa Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/map.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/map2.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/map2.png new file mode 100644 index 0000000..04cba6c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/map2.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/morentu.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/morentu.jpg new file mode 100644 index 0000000..dad87b3 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/morentu.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/photo.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/photo.png new file mode 100644 index 0000000..906f8d2 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/photo.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/record.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/record.png new file mode 100644 index 0000000..d745171 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/record.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_off.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_off.png new file mode 100644 index 0000000..59eb1c8 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_off.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_on.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_on.png new file mode 100644 index 0000000..05c2464 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/speech_input_black_on.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/star.gif b/sfu-server/guannancs_web_mediasoup/src/assets/images/star.gif new file mode 100644 index 0000000..e87c36c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/star.gif differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/star.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/star.png new file mode 100644 index 0000000..e732c2c Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/star.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/top.jpg b/sfu-server/guannancs_web_mediasoup/src/assets/images/top.jpg new file mode 100644 index 0000000..d451d60 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/top.jpg differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/vecss_zh.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/vecss_zh.png new file mode 100644 index 0000000..8925e06 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/vecss_zh.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/wangshu.png b/sfu-server/guannancs_web_mediasoup/src/assets/images/wangshu.png new file mode 100644 index 0000000..6a00f84 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/wangshu.png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/images/详细描述 (1).png b/sfu-server/guannancs_web_mediasoup/src/assets/images/详细描述 (1).png new file mode 100644 index 0000000..682e049 Binary files /dev/null and b/sfu-server/guannancs_web_mediasoup/src/assets/images/详细描述 (1).png differ diff --git a/sfu-server/guannancs_web_mediasoup/src/assets/js/markdown.js b/sfu-server/guannancs_web_mediasoup/src/assets/js/markdown.js new file mode 100644 index 0000000..948c740 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/assets/js/markdown.js @@ -0,0 +1,2188 @@ +/** + * marked v15.0.12 - a markdown parser + * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ + +/** + * DO NOT EDIT THIS FILE + * The code in this file is generated from files in ./src/ + */ + + +// src/defaults.ts +function _getDefaults() { + return { + async: false, + breaks: false, + extensions: null, + gfm: true, + hooks: null, + pedantic: false, + renderer: null, + silent: false, + tokenizer: null, + walkTokens: null + }; +} +var _defaults = _getDefaults(); +function changeDefaults(newDefaults) { + _defaults = newDefaults; +} + +// src/rules.ts +var noopTest = { exec: () => null }; +function edit(regex, opt = "") { + let source = typeof regex === "string" ? regex : regex.source; + const obj = { + replace: (name, val) => { + let valSource = typeof val === "string" ? val : val.source; + valSource = valSource.replace(other.caret, "$1"); + source = source.replace(name, valSource); + return obj; + }, + getRegex: () => { + return new RegExp(source, opt); + } + }; + return obj; +} +var other = { + codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, + outputLinkReplace: /\\([\[\]])/g, + indentCodeCompensation: /^(\s+)(?:```)/, + beginningSpace: /^\s+/, + endingHash: /#$/, + startingSpaceChar: /^ /, + endingSpaceChar: / $/, + nonSpaceChar: /[^ ]/, + newLineCharGlobal: /\n/g, + tabCharGlobal: /\t/g, + multipleSpaceGlobal: /\s+/g, + blankLine: /^[ \t]*$/, + doubleBlankLine: /\n[ \t]*\n[ \t]*$/, + blockquoteStart: /^ {0,3}>/, + blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, + blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, + listReplaceTabs: /^\t+/, + listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, + listIsTask: /^\[[ xX]\] /, + listReplaceTask: /^\[[ xX]\] +/, + anyLine: /\n.*\n/, + hrefBrackets: /^<(.*)>$/, + tableDelimiter: /[:|]/, + tableAlignChars: /^\||\| *$/g, + tableRowBlankLine: /\n[ \t]*$/, + tableAlignRight: /^ *-+: *$/, + tableAlignCenter: /^ *:-+: *$/, + tableAlignLeft: /^ *:-+ *$/, + startATag: /^/i, + startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, + endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, + startAngleBracket: /^$/, + pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, + unicodeAlphaNumeric: /[\p{L}\p{N}]/u, + escapeTest: /[&<>"']/, + escapeReplace: /[&<>"']/g, + escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, + escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, + unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, + caret: /(^|[^\[])\^/g, + percentDecode: /%25/g, + findPipe: /\|/g, + splitPipe: / \|/, + slashPipe: /\\\|/g, + carriageReturn: /\r\n|\r/g, + spaceLine: /^ +$/gm, + notSpaceStart: /^\S*/, + endingNewline: /\n$/, + listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`), + nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), + hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), + fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`), + headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`), + htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, "i") +}; +var newline = /^(?:[ \t]*(?:\n|$))+/; +var blockCode = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; +var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; +var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; +var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; +var bullet = /(?:[*+-]|\d{1,9}[.)])/; +var lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; +var lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); +var lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); +var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; +var blockText = /^[^\n]+/; +var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/; +var def = edit(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); +var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex(); +var _tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; +var _comment = /|$))/; +var html = edit( + "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", + "i" +).replace("comment", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex(); +var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex(); +var blockNormal = { + blockquote, + code: blockCode, + def, + fences, + heading, + hr, + html, + lheading, + list, + newline, + paragraph, + table: noopTest, + text: blockText +}; +var gfmTable = edit( + "^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" +).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex(); +var blockGfm = { + ...blockNormal, + lheading: lheadingGfm, + table: gfmTable, + paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex() +}; +var blockPedantic = { + ...blockNormal, + html: edit( + `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))` + ).replace("comment", _comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, + // fences not supported + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() +}; +var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; +var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; +var br = /^( {2,}|\\)\n(?!\s*$)/; +var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g; +var emStrongLDelimCore = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; +var emStrongLDelim = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuation).getRegex(); +var emStrongLDelimGfm = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuationGfmStrongEm).getRegex(); +var emStrongRDelimAstCore = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; +var emStrongRDelimAst = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex(); +var emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex(); +var emStrongRDelimUnd = edit( + "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", + "gu" +).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex(); +var anyPunctuation = edit(/\\(punct)/, "gu").replace(/punct/g, _punctuation).getRegex(); +var autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); +var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex(); +var tag = edit( + "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^" +).replace("comment", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); +var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; +var link = edit(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); +var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex(); +var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex(); +var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex(); +var inlineNormal = { + _backpedal: noopTest, + // only used for GFM url + anyPunctuation, + autolink, + blockSkip, + br, + code: inlineCode, + del: noopTest, + emStrongLDelim, + emStrongRDelimAst, + emStrongRDelimUnd, + escape, + link, + nolink, + punctuation, + reflink, + reflinkSearch, + tag, + text: inlineText, + url: noopTest +}; +var inlinePedantic = { + ...inlineNormal, + link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex() +}; +var inlineGfm = { + ...inlineNormal, + emStrongRDelimAst: emStrongRDelimAstGfm, + emStrongLDelim: emStrongLDelimGfm, + url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), + _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", + '"': """, + "'": "'" +}; +var getEscapeReplacement = (ch) => escapeReplacements[ch]; +function escape2(html2, encode) { + if (encode) { + if (other.escapeTest.test(html2)) { + return html2.replace(other.escapeReplace, getEscapeReplacement); + } + } else { + if (other.escapeTestNoEncode.test(html2)) { + return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement); + } + } + return html2; +} +function cleanUrl(href) { + try { + href = encodeURI(href).replace(other.percentDecode, "%"); + } catch { + return null; + } + return href; +} +function splitCells(tableRow, count) { + const row = tableRow.replace(other.findPipe, (match, offset, str) => { + let escaped = false; + let curr = offset; + while (--curr >= 0 && str[curr] === "\\") escaped = !escaped; + if (escaped) { + return "|"; + } else { + return " |"; + } + }), cells = row.split(other.splitPipe); + let i = 0; + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells.at(-1)?.trim()) { + cells.pop(); + } + if (count) { + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) cells.push(""); + } + } + for (; i < cells.length; i++) { + cells[i] = cells[i].trim().replace(other.slashPipe, "|"); + } + return cells; +} +function rtrim(str, c, invert) { + const l = str.length; + if (l === 0) { + return ""; + } + let suffLen = 0; + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + return str.slice(0, l - suffLen); +} +function findClosingBracket(str, b) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + let level = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === "\\") { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + if (level > 0) { + return -2; + } + return -1; +} + +// src/Tokenizer.ts +function outputLink(cap, link2, raw, lexer2, rules) { + const href = link2.href; + const title = link2.title || null; + const text = cap[1].replace(rules.other.outputLinkReplace, "$1"); + lexer2.state.inLink = true; + const token = { + type: cap[0].charAt(0) === "!" ? "image" : "link", + raw, + href, + title, + text, + tokens: lexer2.inlineTokens(text) + }; + lexer2.state.inLink = false; + return token; +} +function indentCodeCompensation(raw, text, rules) { + const matchIndentToCode = raw.match(rules.other.indentCodeCompensation); + if (matchIndentToCode === null) { + return text; + } + const indentToCode = matchIndentToCode[1]; + return text.split("\n").map((node) => { + const matchIndentInNode = node.match(rules.other.beginningSpace); + if (matchIndentInNode === null) { + return node; + } + const [indentInNode] = matchIndentInNode; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + return node; + }).join("\n"); +} +var _Tokenizer = class { + options; + rules; + // set by the lexer + lexer; + // set by the lexer + constructor(options2) { + this.options = options2 || _defaults; + } + space(src) { + const cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: "space", + raw: cap[0] + }; + } + } + code(src) { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text = cap[0].replace(this.rules.other.codeRemoveIndent, ""); + return { + type: "code", + raw: cap[0], + codeBlockStyle: "indented", + text: !this.options.pedantic ? rtrim(text, "\n") : text + }; + } + } + fences(src) { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text = indentCodeCompensation(raw, cap[3] || "", this.rules); + return { + type: "code", + raw, + lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2], + text + }; + } + } + heading(src) { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text = cap[2].trim(); + if (this.rules.other.endingHash.test(text)) { + const trimmed = rtrim(text, "#"); + if (this.options.pedantic) { + text = trimmed.trim(); + } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) { + text = trimmed.trim(); + } + } + return { + type: "heading", + raw: cap[0], + depth: cap[1].length, + text, + tokens: this.lexer.inline(text) + }; + } + } + hr(src) { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: "hr", + raw: rtrim(cap[0], "\n") + }; + } + } + blockquote(src) { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + let lines = rtrim(cap[0], "\n").split("\n"); + let raw = ""; + let text = ""; + const tokens = []; + while (lines.length > 0) { + let inBlockquote = false; + const currentLines = []; + let i; + for (i = 0; i < lines.length; i++) { + if (this.rules.other.blockquoteStart.test(lines[i])) { + currentLines.push(lines[i]); + inBlockquote = true; + } else if (!inBlockquote) { + currentLines.push(lines[i]); + } else { + break; + } + } + lines = lines.slice(i); + const currentRaw = currentLines.join("\n"); + const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, ""); + raw = raw ? `${raw} +${currentRaw}` : currentRaw; + text = text ? `${text} +${currentText}` : currentText; + const top = this.lexer.state.top; + this.lexer.state.top = true; + this.lexer.blockTokens(currentText, tokens, true); + this.lexer.state.top = top; + if (lines.length === 0) { + break; + } + const lastToken = tokens.at(-1); + if (lastToken?.type === "code") { + break; + } else if (lastToken?.type === "blockquote") { + const oldToken = lastToken; + const newText = oldToken.raw + "\n" + lines.join("\n"); + const newToken = this.blockquote(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.text.length) + newToken.text; + break; + } else if (lastToken?.type === "list") { + const oldToken = lastToken; + const newText = oldToken.raw + "\n" + lines.join("\n"); + const newToken = this.list(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw; + lines = newText.substring(tokens.at(-1).raw.length).split("\n"); + continue; + } + } + return { + type: "blockquote", + raw, + tokens, + text + }; + } + } + list(src) { + let cap = this.rules.block.list.exec(src); + if (cap) { + let bull = cap[1].trim(); + const isordered = bull.length > 1; + const list2 = { + type: "list", + raw: "", + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : "", + loose: false, + items: [] + }; + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; + if (this.options.pedantic) { + bull = isordered ? bull : "[*+-]"; + } + const itemRegex = this.rules.other.listItemRegex(bull); + let endsWithBlankLine = false; + while (src) { + let endEarly = false; + let raw = ""; + let itemContents = ""; + if (!(cap = itemRegex.exec(src))) { + break; + } + if (this.rules.block.hr.test(src)) { + break; + } + raw = cap[0]; + src = src.substring(raw.length); + let line = cap[2].split("\n", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => " ".repeat(3 * t.length)); + let nextLine = src.split("\n", 1)[0]; + let blankLine = !line.trim(); + let indent = 0; + if (this.options.pedantic) { + indent = 2; + itemContents = line.trimStart(); + } else if (blankLine) { + indent = cap[1].length + 1; + } else { + indent = cap[2].search(this.rules.other.nonSpaceChar); + indent = indent > 4 ? 1 : indent; + itemContents = line.slice(indent); + indent += cap[1].length; + } + if (blankLine && this.rules.other.blankLine.test(nextLine)) { + raw += nextLine + "\n"; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + if (!endEarly) { + const nextBulletRegex = this.rules.other.nextBulletRegex(indent); + const hrRegex = this.rules.other.hrRegex(indent); + const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent); + const headingBeginRegex = this.rules.other.headingBeginRegex(indent); + const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent); + while (src) { + const rawLine = src.split("\n", 1)[0]; + let nextLineWithoutTabs; + nextLine = rawLine; + if (this.options.pedantic) { + nextLine = nextLine.replace(this.rules.other.listReplaceNesting, " "); + nextLineWithoutTabs = nextLine; + } else { + nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, " "); + } + if (fencesBeginRegex.test(nextLine)) { + break; + } + if (headingBeginRegex.test(nextLine)) { + break; + } + if (htmlBeginRegex.test(nextLine)) { + break; + } + if (nextBulletRegex.test(nextLine)) { + break; + } + if (hrRegex.test(nextLine)) { + break; + } + if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { + itemContents += "\n" + nextLineWithoutTabs.slice(indent); + } else { + if (blankLine) { + break; + } + if (line.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4) { + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + itemContents += "\n" + nextLine; + } + if (!blankLine && !nextLine.trim()) { + blankLine = true; + } + raw += rawLine + "\n"; + src = src.substring(rawLine.length + 1); + line = nextLineWithoutTabs.slice(indent); + } + } + if (!list2.loose) { + if (endsWithBlankLine) { + list2.loose = true; + } else if (this.rules.other.doubleBlankLine.test(raw)) { + endsWithBlankLine = true; + } + } + let istask = null; + let ischecked; + if (this.options.gfm) { + istask = this.rules.other.listIsTask.exec(itemContents); + if (istask) { + ischecked = istask[0] !== "[ ] "; + itemContents = itemContents.replace(this.rules.other.listReplaceTask, ""); + } + } + list2.items.push({ + type: "list_item", + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents, + tokens: [] + }); + list2.raw += raw; + } + const lastItem = list2.items.at(-1); + if (lastItem) { + lastItem.raw = lastItem.raw.trimEnd(); + lastItem.text = lastItem.text.trimEnd(); + } else { + return; + } + list2.raw = list2.raw.trimEnd(); + for (let i = 0; i < list2.items.length; i++) { + this.lexer.state.top = false; + list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []); + if (!list2.loose) { + const spacers = list2.items[i].tokens.filter((t) => t.type === "space"); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw)); + list2.loose = hasMultipleLineBreaks; + } + } + if (list2.loose) { + for (let i = 0; i < list2.items.length; i++) { + list2.items[i].loose = true; + } + } + return list2; + } + } + html(src) { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token = { + type: "html", + block: true, + raw: cap[0], + pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style", + text: cap[0] + }; + return token; + } + } + def(src) { + const cap = this.rules.block.def.exec(src); + if (cap) { + const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "); + const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : ""; + const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3]; + return { + type: "def", + tag: tag2, + raw: cap[0], + href, + title + }; + } + } + table(src) { + const cap = this.rules.block.table.exec(src); + if (!cap) { + return; + } + if (!this.rules.other.tableDelimiter.test(cap[2])) { + return; + } + const headers = splitCells(cap[1]); + const aligns = cap[2].replace(this.rules.other.tableAlignChars, "").split("|"); + const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : []; + const item = { + type: "table", + raw: cap[0], + header: [], + align: [], + rows: [] + }; + if (headers.length !== aligns.length) { + return; + } + for (const align of aligns) { + if (this.rules.other.tableAlignRight.test(align)) { + item.align.push("right"); + } else if (this.rules.other.tableAlignCenter.test(align)) { + item.align.push("center"); + } else if (this.rules.other.tableAlignLeft.test(align)) { + item.align.push("left"); + } else { + item.align.push(null); + } + } + for (let i = 0; i < headers.length; i++) { + item.header.push({ + text: headers[i], + tokens: this.lexer.inline(headers[i]), + header: true, + align: item.align[i] + }); + } + for (const row of rows) { + item.rows.push(splitCells(row, item.header.length).map((cell, i) => { + return { + text: cell, + tokens: this.lexer.inline(cell), + header: false, + align: item.align[i] + }; + })); + } + return item; + } + lheading(src) { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: "heading", + raw: cap[0], + depth: cap[2].charAt(0) === "=" ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]) + }; + } + } + paragraph(src) { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1]; + return { + type: "paragraph", + raw: cap[0], + text, + tokens: this.lexer.inline(text) + }; + } + } + text(src) { + const cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: "text", + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]) + }; + } + } + escape(src) { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: "escape", + raw: cap[0], + text: cap[1] + }; + } + } + tag(src) { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) { + this.lexer.state.inLink = true; + } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: "html", + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: false, + text: cap[0] + }; + } + } + link(src) { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) { + if (!this.rules.other.endAngleBracket.test(trimmedUrl)) { + return; + } + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\"); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + const lastParenIndex = findClosingBracket(cap[2], "()"); + if (lastParenIndex === -2) { + return; + } + if (lastParenIndex > -1) { + const start = cap[0].indexOf("!") === 0 ? 5 : 4; + const linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ""; + } + } + let href = cap[2]; + let title = ""; + if (this.options.pedantic) { + const link2 = this.rules.other.pedanticHrefTitle.exec(href); + if (link2) { + href = link2[1]; + title = link2[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ""; + } + href = href.trim(); + if (this.rules.other.startAngleBracket.test(href)) { + if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) { + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href, + title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title + }, cap[0], this.lexer, this.rules); + } + } + reflink(src, links) { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { + const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, " "); + const link2 = links[linkString.toLowerCase()]; + if (!link2) { + const text = cap[0].charAt(0); + return { + type: "text", + raw: text, + text + }; + } + return outputLink(cap, link2, cap[0], this.lexer, this.rules); + } + } + emStrong(src, maskedSrc, prevChar = "") { + let match = this.rules.inline.emStrongLDelim.exec(src); + if (!match) return; + if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return; + const nextChar = match[1] || match[2] || ""; + if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) { + const lLength = [...match[0]].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + endReg.lastIndex = 0; + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + if (!rDelim) continue; + rLength = [...rDelim].length; + if (match[3] || match[4]) { + delimTotal += rLength; + continue; + } else if (match[5] || match[6]) { + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; + } + } + delimTotal -= rLength; + if (delimTotal > 0) continue; + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + const lastCharLength = [...match[0]][0].length; + const raw = src.slice(0, lLength + match.index + lastCharLength + rLength); + if (Math.min(lLength, rLength) % 2) { + const text2 = raw.slice(1, -1); + return { + type: "em", + raw, + text: text2, + tokens: this.lexer.inlineTokens(text2) + }; + } + const text = raw.slice(2, -2); + return { + type: "strong", + raw, + text, + tokens: this.lexer.inlineTokens(text) + }; + } + } + } + codespan(src) { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text = cap[2].replace(this.rules.other.newLineCharGlobal, " "); + const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text); + const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text = text.substring(1, text.length - 1); + } + return { + type: "codespan", + raw: cap[0], + text + }; + } + } + br(src) { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: "br", + raw: cap[0] + }; + } + } + del(src) { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: "del", + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]) + }; + } + } + autolink(src) { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text, href; + if (cap[2] === "@") { + text = cap[1]; + href = "mailto:" + text; + } else { + text = cap[1]; + href = text; + } + return { + type: "link", + raw: cap[0], + text, + href, + tokens: [ + { + type: "text", + raw: text, + text + } + ] + }; + } + } + url(src) { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text, href; + if (cap[2] === "@") { + text = cap[0]; + href = "mailto:" + text; + } else { + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? ""; + } while (prevCapZero !== cap[0]); + text = cap[0]; + if (cap[1] === "www.") { + href = "http://" + cap[0]; + } else { + href = cap[0]; + } + } + return { + type: "link", + raw: cap[0], + text, + href, + tokens: [ + { + type: "text", + raw: text, + text + } + ] + }; + } + } + inlineText(src) { + const cap = this.rules.inline.text.exec(src); + if (cap) { + const escaped = this.lexer.state.inRawBlock; + return { + type: "text", + raw: cap[0], + text: cap[0], + escaped + }; + } + } +}; + +// src/Lexer.ts +var _Lexer = class __Lexer { + tokens; + options; + state; + tokenizer; + inlineQueue; + constructor(options2) { + this.tokens = []; + this.tokens.links = /* @__PURE__ */ Object.create(null); + this.options = options2 || _defaults; + this.options.tokenizer = this.options.tokenizer || new _Tokenizer(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true + }; + const rules = { + other, + block: block.normal, + inline: inline.normal + }; + if (this.options.pedantic) { + rules.block = block.pedantic; + rules.inline = inline.pedantic; + } else if (this.options.gfm) { + rules.block = block.gfm; + if (this.options.breaks) { + rules.inline = inline.breaks; + } else { + rules.inline = inline.gfm; + } + } + this.tokenizer.rules = rules; + } + /** + * Expose Rules + */ + static get rules() { + return { + block, + inline + }; + } + /** + * Static Lex Method + */ + static lex(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.lex(src); + } + /** + * Static Lex Inline Method + */ + static lexInline(src, options2) { + const lexer2 = new __Lexer(options2); + return lexer2.inlineTokens(src); + } + /** + * Preprocessing + */ + lex(src) { + src = src.replace(other.carriageReturn, "\n"); + this.blockTokens(src, this.tokens); + for (let i = 0; i < this.inlineQueue.length; i++) { + const next = this.inlineQueue[i]; + this.inlineTokens(next.src, next.tokens); + } + this.inlineQueue = []; + return this.tokens; + } + blockTokens(src, tokens = [], lastParagraphClipped = false) { + if (this.options.pedantic) { + src = src.replace(other.tabCharGlobal, " ").replace(other.spaceLine, ""); + } + while (src) { + let token; + if (this.options.extensions?.block?.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (token.raw.length === 1 && lastToken !== void 0) { + lastToken.raw += "\n"; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "paragraph" || lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "paragraph" || lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.raw; + this.inlineQueue.at(-1).src = lastToken.text; + } else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + let cutSrc = src; + if (this.options.extensions?.startBlock) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startBlock.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + const lastToken = tokens.at(-1); + if (lastParagraphClipped && lastToken?.type === "paragraph") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + lastParagraphClipped = cutSrc.length !== src.length; + src = src.substring(token.raw.length); + continue; + } + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (lastToken?.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue.at(-1).src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + } + inline(src, tokens = []) { + this.inlineQueue.push({ src, tokens }); + return tokens; + } + /** + * Lexing/Compiling + */ + inlineTokens(src, tokens = []) { + let maskedSrc = src; + let match = null; + if (this.tokens.links) { + const links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + } + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + let keepPrevChar = false; + let prevChar = ""; + while (src) { + if (!keepPrevChar) { + prevChar = ""; + } + keepPrevChar = false; + let token; + if (this.options.extensions?.inline?.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + const lastToken = tokens.at(-1); + if (token.type === "text" && lastToken?.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.autolink(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (!this.state.inLink && (token = this.tokenizer.url(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + let cutSrc = src; + if (this.options.extensions?.startInline) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startInline.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (token = this.tokenizer.inlineText(cutSrc)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== "_") { + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + const lastToken = tokens.at(-1); + if (lastToken?.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + return tokens; + } +}; + +// src/Renderer.ts +var _Renderer = class { + options; + parser; + // set by the parser + constructor(options2) { + this.options = options2 || _defaults; + } + space(token) { + return ""; + } + code({ text, lang, escaped }) { + const langString = (lang || "").match(other.notSpaceStart)?.[0]; + const code = text.replace(other.endingNewline, "") + "\n"; + if (!langString) { + return "
    " + (escaped ? code : escape2(code, true)) + "
    \n"; + } + return '
    ' + (escaped ? code : escape2(code, true)) + "
    \n"; + } + blockquote({ tokens }) { + const body = this.parser.parse(tokens); + return `
    +${body}
    +`; + } + html({ text }) { + return text; + } + heading({ tokens, depth }) { + return `${this.parser.parseInline(tokens)} +`; + } + hr(token) { + return "
    \n"; + } + list(token) { + const ordered = token.ordered; + const start = token.start; + let body = ""; + for (let j = 0; j < token.items.length; j++) { + const item = token.items[j]; + body += this.listitem(item); + } + const type = ordered ? "ol" : "ul"; + const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : ""; + return "<" + type + startAttr + ">\n" + body + "\n"; + } + listitem(item) { + let itemBody = ""; + if (item.task) { + const checkbox = this.checkbox({ checked: !!item.checked }); + if (item.loose) { + if (item.tokens[0]?.type === "paragraph") { + item.tokens[0].text = checkbox + " " + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") { + item.tokens[0].tokens[0].text = checkbox + " " + escape2(item.tokens[0].tokens[0].text); + item.tokens[0].tokens[0].escaped = true; + } + } else { + item.tokens.unshift({ + type: "text", + raw: checkbox + " ", + text: checkbox + " ", + escaped: true + }); + } + } else { + itemBody += checkbox + " "; + } + } + itemBody += this.parser.parse(item.tokens, !!item.loose); + return `
  • ${itemBody}
  • +`; + } + checkbox({ checked }) { + return "'; + } + paragraph({ tokens }) { + return `

    ${this.parser.parseInline(tokens)}

    +`; + } + table(token) { + let header = ""; + let cell = ""; + for (let j = 0; j < token.header.length; j++) { + cell += this.tablecell(token.header[j]); + } + header += this.tablerow({ text: cell }); + let body = ""; + for (let j = 0; j < token.rows.length; j++) { + const row = token.rows[j]; + cell = ""; + for (let k = 0; k < row.length; k++) { + cell += this.tablecell(row[k]); + } + body += this.tablerow({ text: cell }); + } + if (body) body = `${body}`; + return "\n\n" + header + "\n" + body + "
    \n"; + } + tablerow({ text }) { + return ` +${text} +`; + } + tablecell(token) { + const content = this.parser.parseInline(token.tokens); + const type = token.header ? "th" : "td"; + const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`; + return tag2 + content + ` +`; + } + /** + * span level renderer + */ + strong({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + em({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + codespan({ text }) { + return `${escape2(text, true)}`; + } + br(token) { + return "
    "; + } + del({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + link({ href, title, tokens }) { + const text = this.parser.parseInline(tokens); + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = '
    "; + return out; + } + image({ href, title, text, tokens }) { + if (tokens) { + text = this.parser.parseInline(tokens, this.parser.textRenderer); + } + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return escape2(text); + } + href = cleanHref; + let out = `${text} { + const tokens2 = genericToken[childTokens].flat(Infinity); + values = values.concat(this.walkTokens(tokens2, callback)); + }); + } else if (genericToken.tokens) { + values = values.concat(this.walkTokens(genericToken.tokens, callback)); + } + } + } + } + return values; + } + use(...args) { + const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} }; + args.forEach((pack) => { + const opts = { ...pack }; + opts.async = this.defaults.async || opts.async || false; + if (pack.extensions) { + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error("extension name required"); + } + if ("renderer" in ext) { + const prevRenderer = extensions.renderers[ext.name]; + if (prevRenderer) { + extensions.renderers[ext.name] = function(...args2) { + let ret = ext.renderer.apply(this, args2); + if (ret === false) { + ret = prevRenderer.apply(this, args2); + } + return ret; + }; + } else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if ("tokenizer" in ext) { + if (!ext.level || ext.level !== "block" && ext.level !== "inline") { + throw new Error("extension level must be 'block' or 'inline'"); + } + const extLevel = extensions[ext.level]; + if (extLevel) { + extLevel.unshift(ext.tokenizer); + } else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { + if (ext.level === "block") { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } else { + extensions.startBlock = [ext.start]; + } + } else if (ext.level === "inline") { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } else { + extensions.startInline = [ext.start]; + } + } + } + } + if ("childTokens" in ext && ext.childTokens) { + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + opts.extensions = extensions; + } + if (pack.renderer) { + const renderer = this.defaults.renderer || new _Renderer(this.defaults); + for (const prop in pack.renderer) { + if (!(prop in renderer)) { + throw new Error(`renderer '${prop}' does not exist`); + } + if (["options", "parser"].includes(prop)) { + continue; + } + const rendererProp = prop; + const rendererFunc = pack.renderer[rendererProp]; + const prevRenderer = renderer[rendererProp]; + renderer[rendererProp] = (...args2) => { + let ret = rendererFunc.apply(renderer, args2); + if (ret === false) { + ret = prevRenderer.apply(renderer, args2); + } + return ret || ""; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults); + for (const prop in pack.tokenizer) { + if (!(prop in tokenizer)) { + throw new Error(`tokenizer '${prop}' does not exist`); + } + if (["options", "rules", "lexer"].includes(prop)) { + continue; + } + const tokenizerProp = prop; + const tokenizerFunc = pack.tokenizer[tokenizerProp]; + const prevTokenizer = tokenizer[tokenizerProp]; + tokenizer[tokenizerProp] = (...args2) => { + let ret = tokenizerFunc.apply(tokenizer, args2); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args2); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + if (pack.hooks) { + const hooks = this.defaults.hooks || new _Hooks(); + for (const prop in pack.hooks) { + if (!(prop in hooks)) { + throw new Error(`hook '${prop}' does not exist`); + } + if (["options", "block"].includes(prop)) { + continue; + } + const hooksProp = prop; + const hooksFunc = pack.hooks[hooksProp]; + const prevHook = hooks[hooksProp]; + if (_Hooks.passThroughHooks.has(prop)) { + hooks[hooksProp] = (arg) => { + if (this.defaults.async) { + return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => { + return prevHook.call(hooks, ret2); + }); + } + const ret = hooksFunc.call(hooks, arg); + return prevHook.call(hooks, ret); + }; + } else { + hooks[hooksProp] = (...args2) => { + let ret = hooksFunc.apply(hooks, args2); + if (ret === false) { + ret = prevHook.apply(hooks, args2); + } + return ret; + }; + } + } + opts.hooks = hooks; + } + if (pack.walkTokens) { + const walkTokens2 = this.defaults.walkTokens; + const packWalktokens = pack.walkTokens; + opts.walkTokens = function(token) { + let values = []; + values.push(packWalktokens.call(this, token)); + if (walkTokens2) { + values = values.concat(walkTokens2.call(this, token)); + } + return values; + }; + } + this.defaults = { ...this.defaults, ...opts }; + }); + return this; + } + setOptions(opt) { + this.defaults = { ...this.defaults, ...opt }; + return this; + } + lexer(src, options2) { + return _Lexer.lex(src, options2 ?? this.defaults); + } + parser(tokens, options2) { + return _Parser.parse(tokens, options2 ?? this.defaults); + } + parseMarkdown(blockType) { + const parse2 = (src, options2) => { + const origOpt = { ...options2 }; + const opt = { ...this.defaults, ...origOpt }; + const throwError = this.onError(!!opt.silent, !!opt.async); + if (this.defaults.async === true && origOpt.async === false) { + return throwError(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + } + if (typeof src === "undefined" || src === null) { + return throwError(new Error("marked(): input parameter is undefined or null")); + } + if (typeof src !== "string") { + return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected")); + } + if (opt.hooks) { + opt.hooks.options = opt; + opt.hooks.block = blockType; + } + const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline; + const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline; + if (opt.async) { + return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError); + } + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + let tokens = lexer2(src, opt); + if (opt.hooks) { + tokens = opt.hooks.processAllTokens(tokens); + } + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + let html2 = parser2(tokens, opt); + if (opt.hooks) { + html2 = opt.hooks.postprocess(html2); + } + return html2; + } catch (e) { + return throwError(e); + } + }; + return parse2; + } + onError(silent, async) { + return (e) => { + e.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (silent) { + const msg = "

    An error occurred:

    " + escape2(e.message + "", true) + "
    "; + if (async) { + return Promise.resolve(msg); + } + return msg; + } + if (async) { + return Promise.reject(e); + } + throw e; + }; + } +}; + +// src/marked.ts +var markedInstance = new Marked(); +function marked(src, opt) { + return markedInstance.parse(src, opt); +} +marked.options = marked.setOptions = function(options2) { + markedInstance.setOptions(options2); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; +marked.getDefaults = _getDefaults; +marked.defaults = _defaults; +marked.use = function(...args) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; +}; +marked.walkTokens = function(tokens, callback) { + return markedInstance.walkTokens(tokens, callback); +}; +marked.parseInline = markedInstance.parseInline; +marked.Parser = _Parser; +marked.parser = _Parser.parse; +marked.Renderer = _Renderer; +marked.TextRenderer = _TextRenderer; +marked.Lexer = _Lexer; +marked.lexer = _Lexer.lex; +marked.Tokenizer = _Tokenizer; +marked.Hooks = _Hooks; +marked.parse = marked; +var options = marked.options; +var setOptions = marked.setOptions; +var use = marked.use; +var walkTokens = marked.walkTokens; +var parseInline = marked.parseInline; +var parse = marked; +var parser = _Parser.parse; +var lexer = _Lexer.lex; +export { + _Hooks as Hooks, + _Lexer as Lexer, + Marked, + _Parser as Parser, + _Renderer as Renderer, + _TextRenderer as TextRenderer, + _Tokenizer as Tokenizer, + _defaults as defaults, + _getDefaults as getDefaults, + lexer, + marked, + options, + parse, + parseInline, + parser, + setOptions, + use, + walkTokens +}; \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/BmodeLogin.vue b/sfu-server/guannancs_web_mediasoup/src/components/BmodeLogin.vue new file mode 100644 index 0000000..e18dee2 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/BmodeLogin.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/Captcha.vue b/sfu-server/guannancs_web_mediasoup/src/components/Captcha.vue new file mode 100644 index 0000000..4160919 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/Captcha.vue @@ -0,0 +1,158 @@ + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/ForgottenPassword.vue b/sfu-server/guannancs_web_mediasoup/src/components/ForgottenPassword.vue new file mode 100644 index 0000000..bfd68e5 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/ForgottenPassword.vue @@ -0,0 +1,329 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/Login.vue b/sfu-server/guannancs_web_mediasoup/src/components/Login.vue new file mode 100644 index 0000000..1615c3d --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/Login.vue @@ -0,0 +1,378 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/SliderVerifyCodes.vue b/sfu-server/guannancs_web_mediasoup/src/components/SliderVerifyCodes.vue new file mode 100644 index 0000000..7c7ace1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/SliderVerifyCodes.vue @@ -0,0 +1,162 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/register/doctor/DoctorRegister.vue b/sfu-server/guannancs_web_mediasoup/src/components/register/doctor/DoctorRegister.vue new file mode 100644 index 0000000..75c714a --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/register/doctor/DoctorRegister.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/Background.vue b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/Background.vue new file mode 100644 index 0000000..7b2b56b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/Background.vue @@ -0,0 +1,136 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegister.vue b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegister.vue new file mode 100644 index 0000000..2b0e43e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegister.vue @@ -0,0 +1,222 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegisterDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegisterDetails.vue new file mode 100644 index 0000000..3315cc2 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRegisterDetails.vue @@ -0,0 +1,498 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRequire.vue b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRequire.vue new file mode 100644 index 0000000..cd7b316 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/register/hospital/HospitalRequire.vue @@ -0,0 +1,193 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/Index.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/Index.vue new file mode 100644 index 0000000..702f207 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/Index.vue @@ -0,0 +1,400 @@ + + + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue new file mode 100644 index 0000000..4829ca5 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangeMaterials.vue @@ -0,0 +1,287 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangePassword.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangePassword.vue new file mode 100644 index 0000000..028c997 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/F-personaldata/DocChangePassword.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue new file mode 100644 index 0000000..61dff7d --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue @@ -0,0 +1,793 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue new file mode 100644 index 0000000..8bee75f --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundList.vue @@ -0,0 +1,233 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue new file mode 100644 index 0000000..f05ed76 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue @@ -0,0 +1,482 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue new file mode 100644 index 0000000..4a1cd56 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue @@ -0,0 +1,238 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue new file mode 100644 index 0000000..98034cb --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue new file mode 100644 index 0000000..aea63ee --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangeMaterials.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangeMaterials.vue new file mode 100644 index 0000000..95e9c49 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangeMaterials.vue @@ -0,0 +1,275 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangePassword.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangePassword.vue new file mode 100644 index 0000000..aa0b6b2 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/E-personaldata/EpChangePassword.vue @@ -0,0 +1,162 @@ + + + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue new file mode 100644 index 0000000..62e84a6 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundList.vue @@ -0,0 +1,235 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue new file mode 100644 index 0000000..d455144 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue @@ -0,0 +1,879 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue new file mode 100644 index 0000000..1466ae9 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue @@ -0,0 +1,572 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue new file mode 100644 index 0000000..cf504bd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue new file mode 100644 index 0000000..4e98fc4 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue new file mode 100644 index 0000000..0ab4707 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue new file mode 100644 index 0000000..7a21968 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultation.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue new file mode 100644 index 0000000..c7a5d5c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfo.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfo.vue new file mode 100644 index 0000000..25ed5d6 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfo.vue @@ -0,0 +1,206 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue new file mode 100644 index 0000000..e962fdc --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/AllHospitalInfoDetails.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManage.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManage.vue new file mode 100644 index 0000000..9a1c627 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManage.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue new file mode 100644 index 0000000..beb4d8b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/ApplyInfoManageDetails.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/MgSummarySheet.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/MgSummarySheet.vue new file mode 100644 index 0000000..b1d1135 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/A-manage/MgSummarySheet.vue @@ -0,0 +1,187 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAudit.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAudit.vue new file mode 100644 index 0000000..9ea7426 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAudit.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue new file mode 100644 index 0000000..4310657 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertAuditDetails.vue @@ -0,0 +1,143 @@ + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue new file mode 100644 index 0000000..5586916 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklist.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue new file mode 100644 index 0000000..aa880f8 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue @@ -0,0 +1,71 @@ + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertList.vue new file mode 100644 index 0000000..426360b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertList.vue @@ -0,0 +1,155 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListAdd.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListAdd.vue new file mode 100644 index 0000000..6f47441 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListAdd.vue @@ -0,0 +1,312 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListDetails.vue new file mode 100644 index 0000000..cf724d0 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/G-expertmanage/ExpertListDetails.vue @@ -0,0 +1,321 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/H-sectionmanage/MgSectionList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/H-sectionmanage/MgSectionList.vue new file mode 100644 index 0000000..525590e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/H-sectionmanage/MgSectionList.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorList.vue new file mode 100644 index 0000000..e91ae6b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorList.vue @@ -0,0 +1,147 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue new file mode 100644 index 0000000..d85e13f --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListAdd.vue @@ -0,0 +1,225 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue new file mode 100644 index 0000000..2c479f3 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/AdministratorListDetails.vue @@ -0,0 +1,215 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/MgChangePassword.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/MgChangePassword.vue new file mode 100644 index 0000000..27d39c7 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/J-accountmanage/MgChangePassword.vue @@ -0,0 +1,168 @@ + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue new file mode 100644 index 0000000..7c7a4ef --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue @@ -0,0 +1,921 @@ + + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue new file mode 100644 index 0000000..e163b22 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue @@ -0,0 +1,334 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue new file mode 100644 index 0000000..ab3639b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundList.vue @@ -0,0 +1,199 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue new file mode 100644 index 0000000..5ddf269 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue @@ -0,0 +1,317 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue new file mode 100644 index 0000000..318ddeb --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue new file mode 100644 index 0000000..bb3f921 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfo.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfo.vue new file mode 100644 index 0000000..d99733c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfo.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue new file mode 100644 index 0000000..fd96a1e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbHospitalInfoUpdate.vue @@ -0,0 +1,650 @@ + + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbSummarySheet.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbSummarySheet.vue new file mode 100644 index 0000000..f6a9989 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/A-manage/MbSummarySheet.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAudit.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAudit.vue new file mode 100644 index 0000000..b9466b8 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAudit.vue @@ -0,0 +1,182 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue new file mode 100644 index 0000000..44f4f6e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorAuditDetails.vue @@ -0,0 +1,144 @@ + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklist.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklist.vue new file mode 100644 index 0000000..48a1caa --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklist.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue new file mode 100644 index 0000000..b4ed563 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue @@ -0,0 +1,71 @@ + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorList.vue new file mode 100644 index 0000000..5f58d6c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorList.vue @@ -0,0 +1,149 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListAdd.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListAdd.vue new file mode 100644 index 0000000..d101985 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListAdd.vue @@ -0,0 +1,309 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListDetails.vue new file mode 100644 index 0000000..d5a8ac1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/H-doctormanage/DoctorListDetails.vue @@ -0,0 +1,300 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/I-sectionmanage/MbSectionList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/I-sectionmanage/MbSectionList.vue new file mode 100644 index 0000000..fec18f5 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/I-sectionmanage/MbSectionList.vue @@ -0,0 +1,249 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/J-accountmanage/MbChangePassword.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/J-accountmanage/MbChangePassword.vue new file mode 100644 index 0000000..05e6694 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/J-accountmanage/MbChangePassword.vue @@ -0,0 +1,160 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue new file mode 100644 index 0000000..7b849e2 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundApply.vue @@ -0,0 +1,738 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue new file mode 100644 index 0000000..cef28ba --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundInfo.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundList.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundList.vue new file mode 100644 index 0000000..2e53d29 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundList.vue @@ -0,0 +1,216 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue new file mode 100644 index 0000000..8711157 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue @@ -0,0 +1,95 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue new file mode 100644 index 0000000..3b825dd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue @@ -0,0 +1,242 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue new file mode 100644 index 0000000..2449c24 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecord.vue @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue new file mode 100644 index 0000000..f871bc0 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraController.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraController.vue new file mode 100644 index 0000000..b227443 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraController.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerConfig.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerConfig.vue new file mode 100644 index 0000000..ae2e364 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerConfig.vue @@ -0,0 +1,183 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerLocal.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerLocal.vue new file mode 100644 index 0000000..a7aaa71 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerLocal.vue @@ -0,0 +1,298 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerRemote.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerRemote.vue new file mode 100644 index 0000000..47a3797 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/CameraControllerRemote.vue @@ -0,0 +1,471 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/DrawSeal.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/DrawSeal.vue new file mode 100644 index 0000000..a39a7c8 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/DrawSeal.vue @@ -0,0 +1,115 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/ImgUpload.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/ImgUpload.vue new file mode 100644 index 0000000..737ebcd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/ImgUpload.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/Serial-Controller.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/Serial-Controller.js new file mode 100644 index 0000000..785ee08 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/Serial-Controller.js @@ -0,0 +1,78 @@ +"use strict"; + +// 十六进制字符串转为ArrayBuffer对象,参数为字符串 +function hexStrToArrayBuffer(str) { + var Str = str.split(' ').map(h => parseInt(h, 16)) + return new Uint8Array(Str); +} + +class SerialController { + constructor() { + this.encoder = new TextEncoder(); + this.decoder = new TextDecoder(); + } + static checkSerial() { + return 'serial' in navigator + } + async init() { + if ('serial' in navigator) { + try { + const filters = [ // value为十六进制的 VID 和 PID,而通过 getInfo 方法获取的是十进制的 VID 和 PID + { usbVendorId: '0x067B', usbProductId: '0x2303' }, + { usbVendorId: '0x1A86', usbProductId: '0x7523' }, + ]; + const ports = await navigator.serial.getPorts(); + const port = ports[0] || await navigator.serial.requestPort({filters}); + console.log(port) + await port.open({ baudRate: 9600 }); + this.reader = port.readable.getReader(); + this.writer = port.writable.getWriter(); + let signals = await port.getSignals(); + console.log(signals); + this.port = port + } catch (err) { + // console.error('There was an error opening the serial port:', err); + return Promise.reject(err) + } + } else { + console.error('Web serial doesn\'t seem to be enabled in your browser. Try enabling it by visiting:'); + console.error('chrome://flags/#enable-experimental-web-platform-features'); + console.error('opera://flags/#enable-experimental-web-platform-features'); + console.error('edge://flags/#enable-experimental-web-platform-features'); + } + } + async close() { + if (this.port) { + console.log(this.writer, this.reader) + await this.writer.releaseLock() + await this.reader.releaseLock() + await this.port.close() + } + } + async send(data) { + // const dataArrayBuffer = this.encoder.encode(data); + // return await this.writer.write(dataArrayBuffer); + return await this.writer.write(hexStrToArrayBuffer(data)).then(res => { + console.log(res) + }); + } + async read() { + try { + console.log('read===================================read') + const readerData = await this.reader.read().then(res => { + console.log(res) + return res + }).catch(err => { + console.log(err) + return Promise.reject(err) + }); + return this.decoder.decode(readerData.value); + } catch (err) { + const errorMessage = `error reading data: ${err}`; + // console.error(errorMessage); + return Promise.reject(errorMessage); + } + } +} + +export default SerialController \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/TComm-mini.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/TComm-mini.js new file mode 100644 index 0000000..1e7923d --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/TComm/TComm-mini.js @@ -0,0 +1 @@ +var _IYH_ajax_proxyXmlUrl="";function IYHNS(){IYHNS.info={version:"1",ov:"1.0 Ver 20180321"};var w=function(uq){var iq=0,oq=0;var pq=uq.length;var aq=new String();var sq=-1;var dq=0;for(var fq=0;fq=97)?(gq-61):((gq>=65)?(gq-55):(gq-48))));oq=(oq<<6)+gq;iq+=6;while(iq>=8){var hq=oq>>(iq-8);if(dq>0){sq=(sq<<6)+(hq&(63));dq--;if(dq==0){aq+=String.fromCharCode(sq)}}else{if(hq>=224){sq=hq&(15);dq=2}else{if(hq>=128){sq=hq&(31);dq=1}else{aq+=String.fromCharCode(hq)}}}oq=oq-(hq<<(iq-8));iq-=8}}return aq};var q=["post","&charset=","url=","lt","get","undefined","utf-8","","string","error","loaded","complete","interactive","unload","shape","function","on",w("SsDoQN1q")];var i=window;var o=document;var nu_isp=false;function yq(uq,iq){for(var oq in iq){uq[oq]=iq[oq]}}function a(){}function s(yq,uq){return function(){return uq.apply(yq,arguments)}}function d(yq){return(yq.tagName||yq==i||yq==o)}function f(yq){return(yq&&yq.ownerDocument&&yq.ownerDocument.parentWindow)?yq.ownerDocument.parentWindow:i}function g(yq){if(!yq){yq=[]}if(!yq[0]){yq[0]=f().event}if(yq[0]&&!yq[0].target&&yq[0].srcElement){yq[0].target=yq[0].srcElement}return yq}function h(yq,uq){return function(){uq.apply(yq,g(arguments))}}function j(yq){yq=g(yq);if(!yq){return}if(yq.stopPropagation){yq.preventDefault();yq.stopPropagation()}else{if(o.all){yq.cancelBubble=true;yq.returnValue=false}}}function k(yq){yq=g(yq);if(!yq){return}if(o.all){yq.cancelBubble=true;yq.returnValue=true}else{if(yq.stopPropagation){yq.stopPropagation()}}}function l(yq,event,uq,iq,oq){return c(yq,event,d(yq)?h(uq,iq):s(uq,iq),oq)}function z(yq,uq){if(!yq){return}if(yq.parentNode&&!uq){yq.parentNode.removeChild(yq)}b(yq);var iq;while(iq=yq.firstChild){z(iq)}}function x(yq,uq){return function(){var e=this;yq.apply(e,arguments);v(uq)}}function c(yq,event,uq,iq){var oq=[yq,event];if(iq){uq=x(uq,oq)}var pq=d(yq);if(pq){uq=s(yq,uq);if(yq.addEventListener){yq.addEventListener(event,uq,false)}else{if(yq.attachEvent){yq.attachEvent(q[16]+event,uq)}else{var aq=yq[q[16]+event];if(typeof(aq)==q[15]){yq[q[16]+event]=function(){aq();uq()}}else{yq[q[16]+event]=uq}}}}oq.push(uq);if(yq._LT_E_&&pq!=q[14]){yq._LT_E_.push(oq)}else{yq._LT_E_=(pq==q[14])?[]:[oq]}if(!a.allEvents){a.allEvents=[]}if(event!=q[13]){a.allEvents.push(oq)}return oq}function v(yq){if(!yq||yq.length==0){return}if(arguments.length>1){var uq=arguments[0]._LT_E_;for(var iq=0;iq=0;iq--){if(oq[iq]==yq){oq.splice(iq,1);break}}}catch(pq){}oq=a.allEvents;for(var iq=oq.length-1;iq>=0;iq--){if(oq[iq]==yq){oq.splice(iq,1);break}}while(yq.length>0){yq.pop()}delete yq}function b(yq,event){if(!yq||!yq._LT_E_){return}var uq,iq=yq._LT_E_;for(var oq=iq.length-1;oq>=0;oq--){uq=iq[oq];if(!event||uq[1]==event){v(uq)}}}function n(){var yq=a.allEvents;if(yq){for(var uq=yq.length-1;uq>=0;uq--){v(yq[uq])}}a.allEvents=null}function m(yq,event,uq){if(d(yq)){try{if(yq.fireEvent){yq.fireEvent(q[16]+event)}if(yq.dispatchEvent){var iq="mouseover,mouseout,mousemove,mousedown,mouseup,click,dbclick";var oq=o.createEvent("Event");oq.initEvent(event,false,true);yq.dispatchEvent(oq)}}catch(pq){alert("TEvent.trigger error.")}}else{if(!uq){uq=[]}var aq=yq._LT_E_;if(aq&&aq.length>0){for(var sq=aq.length-1;sq>=0;sq--){var dq=aq[sq];if(dq&&dq[2]){if(dq[1]=="*"){dq[2].apply(yq,[event,uq])}if(dq[1]==event){dq[2].apply(yq,uq)}}}}}}function _(){return o.all?(o.readyState!="loading"&&o.readyState!=q[12]):(a.readyState==q[11])}function Q(){if(!a.unLoadListener){a.unLoadListener=c(i,q[13],n)}if(!o.all&&!a.readyState){a.readyState=q[12];c(o,"DOMContentLoaded",function(){a.readyState=q[11]},true)}}yq(a,{getCallback:s,isHtmlControl:d,getObjWin:f,getWindowEvent:g,createAdapter:h,cancelBubble:j,returnTrue:k,bind:l,deposeNode:z,runOnceHandle:x,addListener:c,removeListener:v,clearListeners:b,clearAllListeners:n,trigger:m,isDocumentLoaded:_,load:Q});function W(yq,uq){var e=this;e[0]=yq?parseInt(yq):0;e[1]=uq?parseInt(uq):0;e.Longitude=e[0];e.Latitude=e[1]}yq(W.prototype,{getLongitude:function(){var e=this;return e[0]},getLatitude:function(){var e=this;return e[1]},setLongitude:function(yq){var e=this;e[0]=parseInt(yq)},setLatitude:function(yq){var e=this;e[1]=parseInt(yq)}});function E(yq){var e=this;e.win=yq?yq:i}yq(E.prototype,{load:function(yq,uq,iq,oq){var h=o.head||o.getElementsByTagName("head")[0]||o.documentElement;var e=this;if(!e.onLoadStart(yq)){return}e.objName=oq||e.objName||"IDC_DATA";var pq=e.win;pq[e.objName]=null;var uq=uq?uq:q[6];if(!e.jsFile){e.jsFile=pq.document.createElement(q[17]);e.jsFile.type=w("T6LuT2zgONPXSsDoQN1q");e.jsFile.defer=true;h.insertBefore(e.jsFile,h.firstChild);l(e.jsFile,"load",e,e.onReadyStateChange);l(e.jsFile,"readystatechange",e,e.onReadyStateChange);l(e.jsFile,q[9],e,e.onError)}e.err=false;e.jsFile.charset=uq;e.jsFile.src=yq;e.running=true;e.crypt=iq},onLoadStart:function(yq){var e=this;m(e,"loadstart",[yq]);return true},onError:function(){var e=this;e.err=true;var uq=e.win;if(uq[e.objName]){e.onLoad();return}m(e,q[9],[eval(w("A7iYKrH1L28wBJavVIa"))]);if(!o.all&&e.jsFile&&e.jsFile.parentNode){b(e.jsFile);e.jsFile.parentNode.removeChild(e.jsFile);delete e.jsFile;e.jsFile=null}e.running=false},onLoad:function(yq){var e=this;var uq=e.win;if(uq[e.objName]){var iq=uq[e.objName];uq[e.objName]=null;m(e,q[10],[e.parseObject(iq)])}else{m(e,q[9],[eval(w("A7iYKrH1L28wBJavVIa"))])}e.running=false},parseObject:function(yq){var e=this;if(e.crypt||yq.e){U(yq)}return yq},onReadyStateChange:function(yq,ia){var e=this;if(ia||!e.jsFile.readyState||/loaded|complete/.test(e.jsFile.readyState)){if(!ia&&!e.err){e.onLoad()}if(!o.all&&e.jsFile&&e.jsFile.parentNode){b(e.jsFile);e.jsFile.parentNode.removeChild(e.jsFile);e.jsFile=null}e.running=false}}});try{var oMeta=o.createElement(w("RMLqOG"));oMeta.name=w("ScLcPN9oPN8");oMeta.content=w("OMntONbp");o.getElementsByTagName(w("Q6LXP0"))[0].appendChild(oMeta)}catch(_){}var pt={};pt[w("QMvfT0")]=function(cb,oc){var e=this;if(e.st){clearInterval(e.st)}e.st=null;e.rid=0;e.ndt=0;var oq=oq?oq:i;if(!(oc===true||oc===false)){oc=true}var pq={url:e.bp+w("Rt1bRZzZRZq")+encodeURIComponent(e.cn)+"&s="+encodeURIComponent(e.s)+"&dt="+e.dt+"&rto="+e.rto+"&cmi="+e.cmid+"&oc="+(oc?1:0)+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;l(aq,q[10],pq,function(d){if(d.STAT==1){e.ReadData()}if(cb){cb(d)}});if(cb){l(aq,q[9],pq,cb)}aq.load(pq.url)};pt[w("KcLdQNDqPN8")]=function(s,b){var e=this;var oq=oq?oq:i;var pq={url:e.bp+w("ScLdFtDkFG")+s+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt["dispose"]=function(){var e=this;e.Close();e[e.odi]=null};pt[w("GsnlSsK")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;var oq=oq?oq:i;var pq={url:e.bp+w("OsnlSsK_Osuz")+e.cn+"&cmi="+e.cmid+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt[w("GsnlSsL1R6m")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;var oq=oq?oq:i;var pq={url:e.bp+w("GsnlSsL1R6m_Osuz")+e.cn+"&cmi="+e.cmid+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;if(b){l(aq,q[10],pq,b);l(aq,q[9],pq,b)}aq.load(pq.url)};pt[w("KsLkP0")]=function(d,b,si){var e=this;var j=0,tl=1;if(e.isp){J(e.bp+w("SsLkP3zZRZq")+e.cn+e.Rnd(),function(r){if(b){b(r)}},q[0],"d="+encodeURIComponent(d));return}if(e.isd&&isNaN(si)){if(b){b(eval(w("A7iYKrH1L28wBJXzAG")))}return false}if(si&&!isNaN(si)){j=si}else{e.sid++}var oq=oq?oq:i;if(e.dt.toLowerCase()==w("Q6Lu")){e.msl=1000}tl=Math.ceil(d.length/e.msl);var td=d;if(tl>1){if(j0){e.ndt=0;e.rdto=-1}if(isNaN(d.RID)){e[e.odi](d)}else{if(d.RID>e.rid){e.rid=d.RID;e[e.odi](d)}}}else{if(e.rdto>0){e.ndt+=200}if(!isNaN(d.RID)){e.rid=d.RID}if(e.rdto>0&&e.ndt>=e.rdto){e.Close();if(e[e.odi]){d.STAT=0;e[e.odi](d)}}}if(ob){ob(d)}});if(ob){l(aq,q[9],pq,ob)}aq.load(pq.url)};pt[w("PsLqGszjJ6bpT0")]=function(ob){var e=this;var oq=oq?oq:i;var pq={url:e.bp+w("OszjR6bpT3zZRZq")+e.cn+e.Rnd(),win:oq};var aq=I(oq);aq.objName=e.on;l(aq,q[10],pq,function(d){if(ob){ob(d)}});if(ob){l(aq,q[9],pq,ob)}aq.load(pq.url)};pt[w("KcLXP4HXT64")]=function(b){var e=this;if(e.st){clearInterval(e.st)}e.st=null;if(e[e.odi]&&!e.st){e.st=setInterval(function(){e.doRead(b)},200)}else{e.doRead(b)}};yq(Ar.prototype,pt);yq(Ar.prototype,{Rnd:function(){var e=this;return"&rnd="+(new Date()).getTime()+"&rel="+e.htn}});function R(yq,uq,iq,oq){var oq=oq?oq:i;var pq={url:yq,handle:uq,charset:iq,win:oq,classNum:1};var aq=I(oq);l(aq,q[10],pq,T);l(aq,q[9],pq,T);aq.load(yq,iq)}function T(yq){var e=this;e.classNum--;if(yq&&yq._classUrls){var uq;while(uq=yq._classUrls.pop()){e.classNum++;R(uq,Y(e),e.charset,e.win)}}if(e.classNum==0){e.handle.apply(e)}}function Y(yq){return function(){yq.classNum--;if(yq.classNum==0){yq.handle.apply(yq)}}}function U(yq){var uq;if(yq.t){yq.t=A(yq.t)}for(uq in yq.a){if(typeof yq.a[uq]==q[8]){yq.a[uq]=A(yq.a[uq])}}for(uq in yq.c){if(typeof yq.c[uq]!=q[15]){U(yq.c[uq])}}}function I(yq){var yq=yq?yq:i;var uq;if(!yq._LT_OLRS){yq._LT_OLRS=[]}for(var iq=0;iq=2048){iq=(iq<<24)+(((sq>>12)|224)<<16)+((((sq&4095)>>6)|128)<<8)+((sq&63)|128);uq+=24}else{if(sq>=128){iq=(iq<<16)+(((sq>>6)|192)<<8)+((sq&63)|128);uq+=16}else{uq+=8;iq=(iq<<8)+sq}}while(uq>=6){var dq=iq>>(uq-6);iq=iq-(dq<<(uq-6));uq-=6;var sq=(dq<=9)?(dq+48):((dq<=35)?(dq+55):((dq<=61)?(dq+61):((dq==62)?44:95)));pq.push(String.fromCharCode(sq))}}if(uq>0){var dq=iq<<(6-uq);pq.push(String.fromCharCode((dq<=9)?(dq+48):((dq<=35)?(dq+55):((dq<=61)?(dq+61):((dq==62)?44:95)))))}return pq.join(q[7])}function A(yq){var uq=0,iq=0;var oq=yq.length;var pq=[];var aq=-1;var sq=0;for(var dq=0;dq=97)?(fq-61):((fq>=65)?(fq-55):(fq-48))));iq=(iq<<6)+fq;uq+=6;while(uq>=8){var gq=iq>>(uq-8);if(sq>0){aq=(aq<<6)+(gq&(63));sq--;if(sq==0){pq.push(String.fromCharCode(aq))}}else{if(gq>=224){aq=gq&(15);sq=2}else{if(gq>=128){aq=gq&(31);sq=1}else{pq.push(String.fromCharCode(gq))}}}iq=iq-(gq<<(uq-8));uq-=8}}return pq.join(q[7])}yq(E,{loadClass:R,onClassLoaded:T,onSubClassLoaded:Y,doDecrypt:U,getObject:I,getChild:O,encrypt:P,decrypt:A});function S(){}function D(){if(i.XMLHttpRequest){return new XMLHttpRequest()}else{if(typeof(ActiveXObject)!=q[5]){return new ActiveXObject("Microsoft.XMLHTTP")}}}function F(yq,uq){var iq=D();iq.open(q[4],yq,true);iq.onreadystatechange=function(){if(iq.readyState!=4){return}var oq=iq.responseXML.xml?iq.responseXML:L(iq.responseText);uq(oq)};iq.send(null)}function G(yq,uq,iq){iq=iq?iq:q[6];var oq=I();c(oq,q[10],function(pq){if(pq.n==q[9]&&pq.a.src==q[3]){return}var aq=X(pq);uq.apply(null,[aq])});oq.load(i._IYH_ajax_proxyXmlUrl+q[2]+encodeURIComponent(encodeURIComponent(yq))+q[1]+iq)}function H(yq,uq){try{var iq=D();iq.open(q[4],yq,false);iq.onreadystatechange=function(){if(iq.readyState!=4){return}var rTxt=iq.responseText;if(rTxt.indexOf("=")!=-1){rTxt=rTxt.substr(rTxt.indexOf("=")+1)}uq(eval("("+rTxt+")"))};iq.send(null)}catch(_){}}function J(yq,uq,iq,co){try{var oq=iq?iq.toLowerCase()==q[0]?q[0]:q[4]:q[4];var aq=D();aq.open(oq,yq,false);aq.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");aq.onreadystatechange=function(){if(aq.readyState!=4){return}var rTxt=aq.responseText;if(rTxt.indexOf("=")!=-1){rTxt=rTxt.substr(rTxt.indexOf("=")+1)}uq(eval("("+rTxt+")"));nu_isp=true;aq=null};if(typeof(co)==="string"){aq.send(co)}else{aq.send(null)}}catch(_){uq({"STAT":-1})}}function K(yq,uq,iq){iq=iq?iq:q[6];var oq=I();c(oq,q[10],function(pq){if(pq.n==q[9]&&pq.a.src==q[3]){return}uq.apply(null,[A(pq)])});oq.load(i._LT_ajax_proxyTextUrl+q[2]+encodeURIComponent(encodeURIComponent(yq))+q[1]+iq)}function L(yq){var uq;if(typeof(ActiveXObject)!=q[5]&&typeof(GetObject)!=q[5]){try{uq=new ActiveXObject("Msxml2.DOMDocument")}catch(iq){uq=new ActiveXObject("Msxml.DOMDocument")}if(yq){uq.loadXML(yq)}}else{if(yq){if(typeof DOMParser!=q[5]){uq=new DOMParser().parseFromString(yq,"text/xml")}}else{if(o.implementation&&o.implementation.createDocument){uq=o.implementation.createDocument(q[7],q[7],null)}}}return uq}function Z(yq,uq){if(!uq){yq.i={};uq=yq}if(yq.a.id){uq.i[yq.a.id]=yq}for(var iq=0;iq=3&&sq<=6){var dq=yq.childNodes[oq].nodeValue;if(!iq.t&&!new RegExp("^[\\s]+$").test(dq)){iq.t=dq}}if(sq==1){uq=uq?uq:iq;iq.c.push(V(yq.childNodes[oq],uq))}}return iq}i[w("L4DlRMq")]=Ar;function B(yq,uq){var iq,oq=false;if(typeof yq.xml!=q[5]){try{iq=yq.selectNodes(uq)}catch(pq){oq=true}}else{oq=true}if(!oq){return iq}var aq=yq.ownerDocument?yq.ownerDocument:yq;var sq=aq.createNSResolver(aq.documentElement);var dq=aq.evaluate(uq,yq,sq,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);iq=[];for(var fq=0;fq>2);uq+=e.base64EncodeChars.charAt((pq&3)<<4);uq+="==";break}aq=yq.charCodeAt(iq++);if(iq==oq){uq+=e.base64EncodeChars.charAt(pq>>2);uq+=e.base64EncodeChars.charAt(((pq&3)<<4)|((aq&240)>>4));uq+=e.base64EncodeChars.charAt((aq&15)<<2);uq+="=";break}sq=yq.charCodeAt(iq++);uq+=e.base64EncodeChars.charAt(pq>>2);uq+=e.base64EncodeChars.charAt(((pq&3)<<4)|((aq&240)>>4));uq+=e.base64EncodeChars.charAt(((aq&15)<<2)|((sq&192)>>6));uq+=e.base64EncodeChars.charAt(sq&63)}return uq},base64decode:function(yq){var e=this;var uq,iq,oq,pq;var aq,sq,dq;sq=yq.length;aq=0;dq=q[7];while(aq>4));do{oq=yq.charCodeAt(aq++)&255;if(oq==61){return dq}oq=e.base64DecodeChars[oq]}while(aq>2));do{pq=yq.charCodeAt(aq++)&255;if(pq==61){return dq}pq=e.base64DecodeChars[pq]}while(aq=1)&&(pq<=127)){uq+=yq.charAt(iq)}else{if(pq>2047){uq+=String.fromCharCode(224|((pq>>12)&15));uq+=String.fromCharCode(128|((pq>>6)&63));uq+=String.fromCharCode(128|((pq>>0)&63))}else{uq+=String.fromCharCode(192|((pq>>6)&31));uq+=String.fromCharCode(128|((pq>>0)&63))}}}return uq},utf8to16:function(yq){var uq,iq,oq,pq;var aq,sq;uq=q[7];oq=yq.length;iq=0;while(iq>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:uq+=yq.charAt(iq-1);break;case 12:case 13:aq=yq.charCodeAt(iq++);uq+=String.fromCharCode(((pq&31)<<6)|(aq&63));break;case 14:aq=yq.charCodeAt(iq++);sq=yq.charCodeAt(iq++);uq+=String.fromCharCode(((pq&15)<<12)|((aq&63)<<6)|((sq&63)<<0));break}}return uq}});var p=function(a){var s=o.getElementsByTagName(q[17]);var d=new RegExp(a,"i");for(var f=0;f { + if (this.hasSerial) { + const serialController = new SerialController() + serialController.init().then(res => resolve(res)).catch(err => reject(err)) + this.tcomm = serialController + } else { + // let comSet = this.comSet + // this.codesFormat = codesFormat + // this.tcomm = new TComm(comNo, comSet, codesFormat, 100) + // this.tcomm.Register(this.registerCode, dat => { + // if (dat == -99 || dat.STAT == -99) { + // this.events.emit('pluginDownload', dat) + // } else if (dat.STAT == 11) { + // this.events.emit('connectSuccess', dat) + // this.tcomm.init(ret => { + // if (ret.STAT == 1) { + // resolve(ret) + // } else { + // reject(ret) + // } + // }) + // } else { + // console.log('[tcomm] registerFailed' + dat.STAT + '注册失败,请与您的服务商联系!') + // this.events.emit('registerFailed', dat) + // } + // }) + } + }) + } + + getCommList() { + return new Promise((resolve, reject) => { + let tcomm = new TComm("COM1", "9600,N,8,1") + tcomm.Register(this.registerCode, dat => { + if (dat == -99 || dat.STAT == -99) { + this.events.emit('pluginDownload', dat) + } else if (dat.STAT == 11) { + tcomm.getComList(dat => { + dat.COMS.length > 0 ? resolve(dat.COMS) : reject(dat) + }) + } else { + reject(dat) + } + }) + }) + } + + close() { + return new Promise((resolve, reject) => { + if (this.hasSerial) { + this.tcomm.close().then(res => resolve(res)) + } else { + this.tcomm.Close(res => { + resolve(res) + }) + } + }) + } + + setCom(comConfig) { + if (comConfig) { + const { baudRate, checkbit, databit, stopbit } = comConfig + this.comSet = `${baudRate},${checkbit},${databit},${stopbit}` + } + } + + send(text) { + return new Promise((resolve, reject) => { + // 往端口发送数据 + console.log('[tCommClient/send] text:', text) + if (this.hasSerial) { + this.tcomm.send(text).then(res => { + console.log('[tcomm] 指令发送成功') + }) + } else { + text = this.codesFormat !== "HEX" ? text + "\r" : text + this.tcomm.Send(text, dat => { + if (dat.STAT == 1) { + console.log('[tcomm] 指令发送成功') + this.message() + resolve(dat) + } else { + console.log('[tcomm] 指令发送失败') + reject(dat) + } + }) + } + }) + } + + message() { + // 自动读取串口返回数据(会无限制的发送请求,影响浏览器的性能,导致浏览器崩溃) + // this.tcomm.OnDataIn = dat =>{ + // let data = dat.data + // this.events.emit('message', { dat, data }) + // console.log('[tcomm] 串口返回数据') + // } + // 主动(手动)读取串口数据(会有需求的发送请求,不影响浏览器的性能) + this.tcomm.doRead(dat => { + let data = dat.data + this.events.emit('message', { dat, data }) + console.log('[tcomm] 串口返回数据') + }) + } + + on(event, callback) { + this.events.on(event, callback) + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/Bmode.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/Bmode.vue new file mode 100644 index 0000000..f326d23 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/Bmode.vue @@ -0,0 +1,444 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BoverallOpinion.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BoverallOpinion.vue new file mode 100644 index 0000000..f55e1a1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BoverallOpinion.vue @@ -0,0 +1,178 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundDetails.vue new file mode 100644 index 0000000..9f88ba0 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundDetails.vue @@ -0,0 +1,437 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecord.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecord.vue new file mode 100644 index 0000000..b9f77dc --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecord.vue @@ -0,0 +1,181 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue new file mode 100644 index 0000000..cae982c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundRecordDetails.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReport.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReport.vue new file mode 100644 index 0000000..cf52ce8 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReport.vue @@ -0,0 +1,390 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAI.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAI.vue new file mode 100644 index 0000000..2865e03 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAI.vue @@ -0,0 +1,378 @@ + + + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAdd.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAdd.vue new file mode 100644 index 0000000..b448064 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAdd.vue @@ -0,0 +1,350 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAmend.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAmend.vue new file mode 100644 index 0000000..ebef18e --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportAmend.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportCard.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportCard.vue new file mode 100644 index 0000000..27bed75 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportCard.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportHistory.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportHistory.vue new file mode 100644 index 0000000..8c17348 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportHistory.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportPlain.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportPlain.vue new file mode 100644 index 0000000..712f996 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundReportPlain.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue new file mode 100644 index 0000000..78f138a --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoLayout.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoPages.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoPages.vue new file mode 100644 index 0000000..e0b3a04 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundVideoPages.vue @@ -0,0 +1,1157 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundWindow.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundWindow.vue new file mode 100644 index 0000000..1e44d6b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/BultrasoundWindow.vue @@ -0,0 +1,652 @@ + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/groupInformation.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/groupInformation.vue new file mode 100644 index 0000000..3daeb3f --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/groupInformation.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/patientInformation.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/patientInformation.vue new file mode 100644 index 0000000..8f87193 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/patientInformation.vue @@ -0,0 +1,437 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue new file mode 100644 index 0000000..b338606 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/bultrasound/submitComponents/uploadMaterial.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/BreadCrumb.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/BreadCrumb.vue new file mode 100644 index 0000000..760f933 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/BreadCrumb.vue @@ -0,0 +1,695 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/HeaderNav.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/HeaderNav.vue new file mode 100644 index 0000000..94eec07 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/HeaderNav.vue @@ -0,0 +1,249 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/LeftMenu.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/LeftMenu.vue new file mode 100644 index 0000000..7f0676a --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/index/LeftMenu.vue @@ -0,0 +1,215 @@ + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/EchartStatis.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/EchartStatis.vue new file mode 100644 index 0000000..630d301 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/EchartStatis.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/GaodeMap.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/GaodeMap.vue new file mode 100644 index 0000000..373ee1b --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/GaodeMap.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/Index.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/Index.vue new file mode 100644 index 0000000..a98da8c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/Index.vue @@ -0,0 +1,399 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTC.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTC.vue new file mode 100644 index 0000000..0590f5f --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTC.vue @@ -0,0 +1,198 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue new file mode 100644 index 0000000..a04f8ea --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/largeScreenDataStatis/WebRTCGroup.vue @@ -0,0 +1,165 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/manage/HospitalInformation.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/manage/HospitalInformation.vue new file mode 100644 index 0000000..23f2273 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/manage/HospitalInformation.vue @@ -0,0 +1,326 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/Speechinput.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/Speechinput.vue new file mode 100644 index 0000000..6c9d915 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/Speechinput.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/SpeechinputTest.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/SpeechinputTest.vue new file mode 100644 index 0000000..049fd02 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/SpeechinputTest.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/index.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/index.js new file mode 100644 index 0000000..c466a84 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/speechinputs/index.js @@ -0,0 +1,222 @@ +import {axios} from '@/vue-config' +let audioData = Symbol('audioData') +let setAudioData = Symbol('setAudioData') +window.URL = window.URL || window.webkitURL +navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia +AudioContext = window.AudioContext || window.webkitAudioContext +class Recorder { + constructor(stream, config) { + let context = new AudioContext() + Object.assign(this,{ + context: context, + audioInput: context.createMediaStreamSource(stream), + recorder: context.createScriptProcessor(4096, 1, 1), + // 采样数位 8, 16 + sampleBits: 8, + // 采样率(1/6 44100) + sampleRate: (44100 / 6), + bufferonoff: true, + canRecording: !!navigator.getUserMedia + }, config) + this[audioData] = this[setAudioData](this) + + } + start() {// 开始录音 + this[audioData].buffer = [] + this[audioData].size = 0 + this.audioInput.connect(this.recorder) + this.recorder.connect(this.context.destination) + //音频采集 + this.recorder.onaudioprocess = (e) => { + this[audioData].input(e.inputBuffer.getChannelData(0)); + //record(e.inputBuffer.getChannelData(0)); + } + } + stop() {// 停止 + this.recorder.disconnect(); + } + getBlob() {// 获取音频文件 + //this.stop(); + return this[audioData].encodeWAV() + } + play(audio) {// 回放 + audio.src = window.URL.createObjectURL(this.getBlob()) + } + upload(url, callback) {// 上传 + let fd = new FormData() + console.log(this.getBlob()) + fd.append("audioData", this.getBlob()) + console.log(fd) + let config = { + headers: {// 浏览器自动分配请求类型 + 'Content-Type': '' + }, + onUploadProgress: progress => { + callback && callback(progress) + } + } + return axios.post(url, fd, config) + } + + [setAudioData](rec) { + return new class AudioData { + constructor() { + // 录音文件长度 + this.size = 0 + // 录音缓存 + this.buffer = [] + // 输入采样率 + this.inputSampleRate = rec.context.sampleRate + //输入采样数位 8, 16 + this.inputSampleBits = 16 + //输出采样率 + this.outputSampleRate = rec.sampleRate + //输出采样数位 8, 16 + this.oututSampleBits = rec.sampleBits + } + input(data) { + this.buffer.push(new Float32Array(data)) + this.size += data.length + } + compress() {//合并压缩 + //合并 + let data = new Float32Array(this.size) + let offset = 0 + for (let i = 0; i < this.buffer.length; i++) { + data.set(this.buffer[i], offset) + offset += this.buffer[i].length + } + //压缩 + let compression = parseInt(this.inputSampleRate / this.outputSampleRate) + let length = data.length / compression + let result = new Float32Array(length) + let index = 0, j = 0 + while (index < length) { + result[index] = data[j] + j += compression + index++ + } + return result + } + encodeWAV() { + let sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate) + let sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits) + let bytes = this.compress() + let dataLength = bytes.length * (sampleBits / 8) + let buffer = new ArrayBuffer(44 + dataLength) + let data = new DataView(buffer) + let channelCount = 1//单声道 + let offset = 0 + let writeString = function (str) { + for (let i = 0; i < str.length; i++) { + data.setUint8(offset + i, str.charCodeAt(i)) + } + } + // 资源交换文件标识符 + writeString('RIFF') + offset += 4 + // 下个地址开始到文件尾总字节数,即文件大小-8 + data.setUint32(offset, 36 + dataLength, true) + offset += 4 + // WAV文件标志 + writeString('WAVE') + offset += 4 + // 波形格式标志 + writeString('fmt ') + offset += 4 + // 过滤字节,一般为 0x10 = 16 + data.setUint32(offset, 16, true) + offset += 4 + // 格式类别 (PCM形式采样数据) + data.setUint16(offset, 1, true) + offset += 2 + // 通道数 + data.setUint16(offset, channelCount, true) + offset += 2 + // 采样率,每秒样本数,表示每个通道的播放速度 + data.setUint32(offset, sampleRate, true) + offset += 4 + // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8 + data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true) + offset += 4 + // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8 + data.setUint16(offset, channelCount * (sampleBits / 8), true) + offset += 2 + // 每样本数据位数 + data.setUint16(offset, sampleBits, true) + offset += 2 + // 数据标识符 + writeString('data') + offset += 4 + // 采样数据总数,即数据总大小-44 + data.setUint32(offset, dataLength, true) + offset += 4 + // 写入采样数据 + if (sampleBits === 8) { + for (let i = 0; i < bytes.length; i++ , offset++) { + let s = Math.max(-1, Math.min(1, bytes[i])) + let val = s < 0 ? s * 0x8000 : s * 0x7FFF + val = parseInt(255 / (65535 / (val + 32768))) + data.setInt8(offset, val, true) + } + } else { + for (let i = 0; i < bytes.length; i++ , offset += 2) { + let s = Math.max(-1, Math.min(1, bytes[i])) + data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true) + } + } + return new Blob([data], { type: 'audio/wav' }) + } + } + } +} + +const throwError = (message) => {// 抛出异常 + alert(message) + throw new function () { + this.toString = function () { + return message + } + } +} +const recorder = (callback, config) => {// 获取录音机 + const conf = { + ...config, + userMediaInfo: { + audio: true, + ...config.userMediaInfo + }, + } + if (callback) { + if (navigator.getUserMedia) { + // 只启用音频 + navigator.getUserMedia(conf.userMediaInfo, function (stream) { + var rec = new Recorder(stream, conf) + callback(rec); + }, function (error) { + switch (error.code || error.name) { + case 'PERMISSION_DENIED': + case 'PermissionDeniedError': + throwError('用户拒绝提供信息。') + break + case 'NOT_SUPPORTED_ERROR': + case 'NotSupportedError': + throwError('浏览器不支持硬件设备。') + break + case 'MANDATORY_UNSATISFIED_ERROR': + case 'MandatoryUnsatisfiedError': + throwError('无法发现指定的硬件设备。') + break + default: + throwError('无法打开麦克风。异常信息:' + (error.code || error.name)) + break + } + }) + } else { + throwErr('当前浏览器不支持录音功能。') + return + } + } +} + +export default recorder \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/storageSignaling.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/storageSignaling.js new file mode 100644 index 0000000..5aef07c --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/storageSignaling.js @@ -0,0 +1,236 @@ +/** + * 基于H5的本地存储的跨页面通讯 + */ +const StorageChannel = class { + constructor(name) { + this.name = name + this.listeners = {} + this.entry = localStorage + this.save = sessionStorage + this.storage = () => { } + let that = this + this._storageEvent = this._storageEvent.bind(this) + this._setItemEvent = this._setItemEvent.bind(this) + this._loadEvent = this._loadEvent.bind(this) + if (/MSIE 8/.test(navigator.userAgent)) { + window.attachEvent('storage', function () { + // TODO: ie8 support + }) + } else { + window.addEventListener('storage', this._storageEvent, false) + window.addEventListener('setItem', this._setItemEvent, false) + } + // 页面加载完成获取保存的数据 + window.addEventListener('load', this._loadEvent, false) + if (document.readyState === 'complete') { + console.log('readyState:', 'complete', this.name) + this.getSaveData() + } + + console.log(this, this.name) + + } + + _storageEvent(e) { + this.storage(e) + this.broadcast(e.key, e.newValue) + } + + _setItemEvent(e) { + this.broadcast(e.key, e.newValue) + } + + _loadEvent(e) { + this.getSaveData() + } + + getSaveData() { + console.log('StorageChannel initializing ', this.name) + let save = this.save + console.log(save, this.name) + Object.keys(save).forEach(name => { + if (/^save_(channel\..+)/.test(name)) { + let value = JSON.parse(save[name]) + value !== null && this.broadcast(RegExp.$1, value) + console.log(RegExp.$1, value, this.name) + } + }) + } + + /** + * 删除保存的所有数据 + * + */ + delSaveData() { + let save = this.save + for (const key in save) { + if (save.hasOwnProperty(key) && /^save_channel\.(.+)/.test(key)) { + this.postMessage(key.replace(/^save_channel\./, ''), null) + save.removeItem(key) + } + } + } + + /** + * 接收数据 + * + * @param channelName + * 命名空间名称 + * @param str + * 要接收的数据 + * @returns void + */ + broadcast(channelName, str) { + const hasChannelName = /^channel\.(.+)/.test(channelName) + channelName = hasChannelName ? RegExp.$1 : channelName + if (str !== null && hasChannelName && channelName in this.listeners) { + console.log('[StorageChannel] broadcast channelName', channelName, ' str', str, ' name', this.name) + const value = JSON.parse(str) + const save = this.save + const valueIsObject = Object.prototype.toString.call(value) === '[object Object]' + const isSaveData = valueIsObject ? value.isSaveData : undefined + console.log('[StorageChannel] broadcast valueIsObject', valueIsObject, ' valueName', value.name, value.name !== this.name, ' name', this.name) + if (valueIsObject && value.name && value.name !== this.name) { + console.log('[StorageChannel] broadcast name 不同,return function') + return false + } + // 保存||删除 数据 + isSaveData ? save['save_channel.' + channelName] = JSON.stringify(str) : save.removeItem('save_channel.' + channelName) + for (let i = 0, arr = this.listeners[channelName], L = arr.length; i < L; i++) { + try { + arr[i](value) + } catch (e) { + console.error('[StorageChannel] broadcast ', e, this.name) + } + } + } + } + + /** + * 发布数据到其它页面 + * + * @param name + * 命名空间名称 + * @param arguments + * 第二个参数开始是要发布的数据,当只有一个时,如果有多个命名空间名称会共用同一个数据 + * @returns this + */ + postMessage(name) { + const nameList = name.split(' ') + const valList = Array.prototype.slice.call(arguments, 1) + nameList.forEach((name, index) => { + index = valList.length <= 1 ? index % valList.length : index + const value = valList[index] || '' + this.handleMessage(name, value) + }) + + return this + } + + _setItem(entry) { + const setItemEvent = new Event("setItem") + const args = Array.prototype.slice.call(arguments, 1) + const key = args[0] + const value = args[1] + setItemEvent.key = key + setItemEvent.newValue = value + setItemEvent.oldValue = entry.getItem(key) + setItemEvent.storageArea = entry + setItemEvent.url = location.href + Storage.prototype.setItem.apply(entry, args) + window.dispatchEvent(setItemEvent) + } + + /** + * 处理发布数据 + * + * @param name + * 命名空间名称 + * @param value + * 要发布的数据 + * @returns this + */ + handleMessage(name, value) { + console.log('[ StorageChannel ] handleMessage ', name, value, this.name) + const entry = this.entry + if (entry) { + this._setItem(entry, "channel." + name, JSON.stringify(value)) + setTimeout(() => { + entry.removeItem("channel." + name) + }, 0) + } + return this + } + + // 销毁绑定事件 + destroyed() { + this.listeners = {} + window.removeEventListener('storage', this._storageEvent, false) + window.removeEventListener('setItem', this._setItemEvent, false) + window.removeEventListener('load', this._loadEvent, false) + this.delSaveData() + } + + /** + * 注册监听器 + * + * @param name + * 要监听的命名空间 + * @param callback + * 回调函数 + * @returns this + */ + on(name, callback) { + if (name in this.listeners) { + this.listeners[name].push(callback) + } else { + this.listeners[name] = [callback] + } + return this + } + /** + * 注册监听器 只能执行一次 + * + * @param name + * 要监听的命名空间 + * @param callback + * 回调函数 + * @returns this + */ + once(name, callback) { + const cb = (...args) => { + callback(args) + this.off(name, cb) + } + + this.on(name, cb) + return this + } + /** + * 取消监听器 + * + * @param name + * 要取消监听的命名空间 + * @param callback + * 回调函数,如果为空,则取消所有监听函数 + * @returns this + */ + off(name, callback) { + const arr = this.listeners[name] + if (arr) { + if (!callback) { + delete this.listeners[name] + } else { + let i = arr.length + while (i--) { + if (arr[i] === callback) { + arr.splice(i, 1) + } + } + } + } + return this + } +} + +export default StorageChannel \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/CustomPlayer.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/CustomPlayer.vue new file mode 100644 index 0000000..0e364e3 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/CustomPlayer.vue @@ -0,0 +1,303 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/index.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/index.js new file mode 100644 index 0000000..8b6f8bf --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/index.js @@ -0,0 +1,59 @@ +import WebSockets from './webSockets' +import { EventEmitter } from 'events' + + +WebSockets.defaults.baseURL = import.meta.env.VITE_HOST_NAME +export default class Socket { + constructor(socketSpecs) { + this.isConnect = false + this.events = new EventEmitter() + this.socket = new WebSockets(`/ws/asset/${socketSpecs.name}`) + this._subscribeSocketEvent() + } + + _subscribeSocketEvent() { + const socket = this.socket + socket.on('open', evt => { + this.isConnect = true + this.emit('open', evt) + }) + socket.on('close', evt => { + this.isConnect = false + this.destroy() + }) + socket.on('message', evt => { + this.emit('message', evt) + }) + } + + send(msg) { + // console.log('=============',this.socket&&this.isConnect) + if (this.socket && this.isConnect) { + this.socket._send(msg) + } + } + + close() { + this.socket.close() + } + + destroy() { + this.socket = null + this.events = null + } + + emit(event, callback) { + const events = this.events + return events ? events.emit(event, callback) : nop + } + + on(event, callback) { + const events = this.events + return events ? events.on(event, callback) : nop + } + + off(event, callback) { + const events = this.events + return events ? events.off(event, callback) : nop + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/webSockets.js b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/webSockets.js new file mode 100644 index 0000000..8d10afc --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/js/websocket/webSockets.js @@ -0,0 +1,189 @@ +import { EventEmitter } from 'events' + +const nop = () => {} + +const _getBaseUrl = url => { + const path = url || window.location.origin + const baseURL = _setProtocolHTTPToWS(path) + console.log('[webSocket] _getBaseUrl baseURL:', baseURL) + return baseURL.replace(/\/$/, '') +} + +const _setProtocolHTTPToWS = path => { + const isWS = /^wss?\:/.test(path) + if (isWS) { + return path + } else { + return path.replace(/^https?\:/, /^https:/.test(path) ? 'wss:' : 'ws:') + } +} + +let isPassiveClose = false +let lockReconnect = false + +// websocket 连接检查 +class ConnectChecker { + timeout = 15000 // 毫秒 + timeoutObj = null + serverTimeoutObj = null + reset() { + clearTimeout(this.timeoutObj) + clearTimeout(this.serverTimeoutObj) + return this + } + start(ws) { + this.timeoutObj = setTimeout(() => { + // 这里发送一个心跳,后端收到后,返回一个心跳消息, + // onmessage 拿到返回的心跳就说明连接正常 + let obj = { + toUser: 'test', + message: { + text: 'connect test' + } + } + let str = JSON.stringify(obj) + if (ws.readyState == WebSocket.CLOSED) return + ws.send(str) + // ws.send('connect test') + this.serverTimeoutObj = setTimeout(() => { // 如果超过一定时间还没重置,说明后端主动断开了 + ws.close() // 如果 onclose 会执行 reconnect,我们执行 ws.close() 就行了。如果直接执行 reconnect 会触发 onclose 导致重连两次 + }, this.timeout) + }, this.timeout) + } +} + +class WebSockets { + defaultStore = { + ws: null, + connectChecker: null, + events: null + } + + static defaults = { + baseURL: '' + } + + constructor(url) { + this.store = {...this.defaultStore} + this._init(url) + } + + _init(url) { + const baseURL = _getBaseUrl(WebSockets.defaults.baseURL) + if (!baseURL) return + this.connect(baseURL + this._autoAddPrefix('/', url)) + } + + _subscribeWebSoketEvent(url) { + const ws = this.store.ws + const connectChecker = this.store.connectChecker + + // 连接成功建立的回调方法 + ws.onopen = (event) => { + connectChecker.reset().start(ws) + this.emit('open', event) + } + + // 连接发生错误的回调方法 + ws.onerror = (event) => { + this.emit('err', event) + } + + // 接收到消息的回调方法 + ws.onmessage = (event) => { + const msg = event.data + // console.log(msg); + // console.log('======================================',msg); + const text = JSON.parse(JSON.parse(msg).message).text + connectChecker.reset().start(ws) + if (text !== 'connect test') { + this.emit('message', msg) + } + } + + // 连接关闭的回调方法 + ws.onclose = (event) => { + console.log('[webSocket] onclose event:', event) + this.destroy() + !isPassiveClose && this._reconnect(url) + this.emit('close', event) + } + + window.addEventListener('beforeunload', this._beforeunload(), false) + } + + _reconnect(url) { + if (lockReconnect) return + lockReconnect = true + setTimeout(() => { + this.connect(url) + lockReconnect = false + }, 1000) + } + + _beforeunload() { + const ws = this + this._beforeunload = event => { + console.log('[webSocket] _beforeunload this:', this) + ws && ws.close() + } + return this._beforeunload + } + + _autoAddPrefix(prefix, target) { + console.log('[webSocket] _autoAddPrefix target:', target) + const len = prefix.length + const hasPrefix = target.substr(0, len) === prefix + return hasPrefix ? target : (prefix + target) + } + + // 连接 WebSocket + connect(url) { + try { + this.store.events = new EventEmitter() + this.store.connectChecker = new ConnectChecker() + this.store.ws = new WebSocket(url) + this._subscribeWebSoketEvent(url) + } catch (error) { + this._reconnect(url) + } + } + + _send(meg) { + const ws = this.store.ws + if (ws) { + ws.send(meg) + } + } + + close() { + const ws = this.store.ws + if (ws) { + isPassiveClose = true + ws.close() + } + this.destroy() + } + + destroy() { + window.removeEventListener('beforeunload', this._beforeunload, false) + this.store = this.defaultStore + } + + emit(event, callback) { + const events = this.store.events + return events ? events.emit(event, callback) : nop + } + + on(event, callback) { + const events = this.store.events + return events ? events.on(event, callback) : nop + } + + off(event, callback) { + const events = this.store.events + return events ? events.off(event, callback) : nop + } +} + +export default WebSockets \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/pdf.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/pdf.vue new file mode 100644 index 0000000..a0fadd3 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/pdf.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/Index.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/Index.vue new file mode 100644 index 0000000..4e5ec71 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/Index.vue @@ -0,0 +1,209 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue new file mode 100644 index 0000000..5100fcb --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordBultrasound.vue @@ -0,0 +1,851 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue new file mode 100644 index 0000000..671af07 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/recordBultrasoundVideo/RecordVideo.vue @@ -0,0 +1,469 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/EditDialog.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/EditDialog.vue new file mode 100644 index 0000000..49f54ef --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/EditDialog.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/Index.vue b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/Index.vue new file mode 100644 index 0000000..29ae065 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/components/system/public/utils/reportTemplate/Index.vue @@ -0,0 +1,254 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/main.js b/sfu-server/guannancs_web_mediasoup/src/main.js new file mode 100644 index 0000000..017bd79 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/main.js @@ -0,0 +1,31 @@ +// The Vue build version to load with the `import` command +// (runtime-only or standalone) has been set in webpack.base.conf with an alias. +// import Vue from 'vue' +import App from "./App.vue"; +import router from "./router"; +import ElementUI from "element-ui"; +import "element-ui/lib/theme-chalk/index.css"; +import Vue from "./vue-config"; // vue配置扩展 +import { store } from "./store"; +import Print from "./vue-print"; +import * as echarts from 'echarts'; + +Vue.prototype.$echarts = echarts; + +Vue.use(ElementUI); // ElementUI注册 +Vue.use(Print); // 打印注册 +Vue.config.productionTip = false; + +// 设置域名访问时的路径名称 +let pathname = window.location.pathname; +if (/\w+\.html/.test(pathname) && import.meta.env.PROD === "production") { + window.location.pathname = pathname.replace(/\w+\.html/, ""); +} + +/* eslint-disable no-new */ +new Vue({ + el: "#app", + router, + store, + render: (h) => h(App), +}).$mount(); diff --git a/sfu-server/guannancs_web_mediasoup/src/oss/index.js b/sfu-server/guannancs_web_mediasoup/src/oss/index.js new file mode 100644 index 0000000..491f4f6 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/oss/index.js @@ -0,0 +1,173 @@ +import OSS from 'ali-oss' +import api from '@/api/config' +import { md5Base64 } from '@/vue-config/utils/custom-crypto' + +const ossName = api.OSS_NAME +const endpoint = ossName.replace(/(https:\/\/)(\w*\.)|(\.com)(\/\w*)*/g, '$1$3') +const bucket = ossName.split(/https:\/\/|\.oss/)[1] +console.log('endpoint:', endpoint) +console.log('bucket:', bucket) +const client = OSS({ + // gansu + accessKeyId: "LTAImVN6wtEJLfH1", + accessKeySecret: "lO7FsV3pxSaP6lcd8KP9SsfBIeFhPw", + // hunan + // accessKeyId: "LTAIzVoWY3AdBfOR", + // accessKeySecret: "qsZpfUp7sClQ6ZT9atqFTUgjGtBnvs", + // endpoint: vm.$oss + // endpoint: "https://oss-cn-shenzhen.aliyuncs.com", + endpoint, + bucket +}) +const uploadRequest = (option) => { + console.log('[OSS] uploadRequest() option:', option) + const file = option.file + const data = option.data || {} + const point = file.name.lastIndexOf(".") + const suffix = file.name.substr(point) + const UUID = getUUID(3) + const filePath = data.filePath ? (data.filePath + '/') : '' + const path = ossName.split(/\.com\//)[1] + '/' + filePath + const fileNames = `${path}${UUID}${suffix}` + const reader = new FileReader() + reader.readAsArrayBuffer(file) + reader.onload = function () { + const contents = reader.result + const md5Val = md5Base64(contents) + console.log(md5Val) + uploadType(fileNames, file, { + headers: { + 'Content-Md5': md5Val + }, + progress: async function (p) { + let e = {} + e.percent = p * 100 + option.onProgress(e) + } + }).then(ret => { + console.log(ret) + if (ret.res.statusCode === 200) { + option.onSuccess(ret) + return ret + } + }).catch(err => { + console.log(err) + option.onError("上传失败") + }) + } +} + +const uploadType = (fileNames, file, option) => { + const size = file.size / 1024 / 1024 + if (size <= 50) { + // 普通上传文件 + return client.put(fileNames, file, option) + } else { + // 分片上传文件 + return client.multipartUpload(fileNames, file, option) + } +} + +// 文件上传 +const put = (option) => { + console.log(option) + const file = option.file + const data = option.data || {} + const point = file.name.lastIndexOf(".") + const suffix = file.name.substr(point) + const UUID = getUUID(3) + const filePath = data.filePath ? (data.filePath + '/') : '' + const path = ossName.split(/\.com\//)[1] + '/' + filePath + const fileNames = `${path}${UUID}${suffix}` + console.log(fileNames) + return client.put(fileNames, file.imgData) +} + +// fileName 文件名 +const deleteFile = (fileName) => { + return client.delete(fileName) +} + +// fileNamArr 数组 文件名的数组 +const deleteFileMulti = (fileNameArr) => { + return client.deleteMulti(fileNameArr) +} + +// fileName 文件名 +const downloadFile = (fileUrl, fileName) => { + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') + const Images = new Image() + fileName = fileName || fileUrl.split('/').slice(-1)[0].split(/\?|\#/)[0] + Images.src = fileUrl + '?' + Date.now() + Images.crossOrigin = 'anonymous' + Images.onload = function () { + canvas.width = Images.width + canvas.height = Images.height + context.drawImage(Images, 0, 0, Images.width, Images.height) + const save_link = document.createElement('a') + save_link.href = canvas.toDataURL("image/jpeg") + save_link.download = fileName + save_link.click() + } +} + +// 处理请求失败的情况,防止promise.all中断,并返回失败原因和失败文件名。 +async function handleDel(name, options) { + try { + await client.delete(name) + } catch (error) { + error.failObjectName = name + return error + } +} + +// 删除指定前缀的文件。 +async function deletePrefix(prefix) { + const list = await client.list({ + prefix: prefix, + }) + console.log('[oss] deletePrefix list', list) + list.objects = list.objects || [] + const result = await Promise.all(list.objects.map((v) => handleDel(v.name))) + const state = result.every(item => item === undefined) ? 'success' : 'failed' + console.log('[oss] deletePrefix result', result) + return { state, result } +} + +// 通过设置不同的文件前缀列举不同的目标文件。 +async function listDir(dir) { + const result = await client.list({ + prefix: dir, + // 设置正斜线(/)为文件夹的分隔符。 + delimiter: '/' + }); + // console.log(result); + return result + // result.prefixes.forEach(subDir => { + // console.log('SubDir: %s', subDir); + // }); + // result.objects.forEach(obj => { + // console.log('Object: %s', obj.name); + // }); + +} + +/** + * @name getUUID + * @description 生成一个用不重复的ID + * + */ +function getUUID(randomLength) { + return Number(Math.random().toString().substr(3, randomLength) + Date.now()).toString(36) +} + +export default{ + uploadRequest, + put, + deleteFile, + deleteFileMulti, + downloadFile, + deletePrefix, + listDir +} diff --git a/sfu-server/guannancs_web_mediasoup/src/router/index.js b/sfu-server/guannancs_web_mediasoup/src/router/index.js new file mode 100644 index 0000000..7393df5 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/router/index.js @@ -0,0 +1,505 @@ +import Vue from "vue"; +import Router from "vue-router"; + +// ===================================== 登录 ===================================== +const BmodeLogin = res => + import(/* webpackChunkName: "group-Login" */ "@/components/BmodeLogin.vue"); +const ForgottenPassword = res => + import( + /* webpackChunkName: "group-Login" */ "@/components/ForgottenPassword.vue" + ); + +// ===================================== 医院注册 ===================================== +const HospitalRequire = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRequire.vue" + ); +const HospitalRegister = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRegister.vue" + ); +const HospitalRegisterDetails = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/hospital/HospitalRegisterDetails.vue" + ); + +// ===================================== 医生注册 ===================================== +const DoctorRegister = res => + import( + /* webpackChunkName: "group-register" */ "@/components/register/doctor/DoctorRegister.vue" + ); + +// ===================================== 系统 ===================================== +const Index = res => + import( + /* webpackChunkName: "group-system'" */ "@/components/system/Index.vue" + ); + +// ===================================== 公共组件 ===================================== +const BultrasoundWindow = res => + import( + /* webpackChunkName: "group-system-public" */ "@/components/system/public/bultrasound/BultrasoundWindow.vue" + ); + +const LargeScreenDataStatis = res => import( + /* webpackChunkName: "group-system-public" */ "@/components/system/public/largeScreenDataStatis/Index.vue" + ); + +// ===================================== 管理医院 ===================================== +// 医院管理 +const ApplyInfoManage = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/ApplyInfoManage.vue" + ); +const ApplyInfoManageDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/ApplyInfoManageDetails.vue" + ); +const AllHospitalInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/AllHospitalInfo.vue" + ); +const AllHospitalInfoDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/AllHospitalInfoDetails.vue" + ); +const MgSummarySheet = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/A-manage/MgSummarySheet.vue" + ); +// 专家管理 +const ExpertBlacklist = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertBlacklist.vue" + ); +const ExpertBlacklistDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertBlacklistDetails.vue" + ); +const ExpertAudit = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertAudit.vue" + ); +const ExpertAuditDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertAuditDetails.vue" + ); +const ExpertList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertList.vue" + ); +const ExpertListAdd = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertListAdd.vue" + ); +const ExpertListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/G-expertmanage/ExpertListDetails.vue" + ); +// 科室管理 +const MgSectionList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/H-sectionmanage/MgSectionList.vue" + ); +// 账号管理 +const AdministratorList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorList.vue" + ); +const AdministratorListAdd = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorListAdd.vue" + ); +const AdministratorListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/AdministratorListDetails.vue" + ); +const MgChangePassword = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/J-accountmanage/MgChangePassword.vue" + ); +// 远程超声 +const MgBultrasoundList = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundList.vue" + ); +const MgBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundListDetails.vue" + ); +const MgBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundRecord.vue" + ); +const MgBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundRecordDetails.vue" + ); +const MgBultrasoundInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundInfo.vue" + ); +const MgBultrasoundFollowUpEntry = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/manager/M-bultrasound/MgBultrasoundFollowUpEntry.vue" + ); + +// ===================================== 基层医院 ===================================== +// 医院管理 +const MbHospitalInfo = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbHospitalInfo.vue" + ); +const MbHospitalInfoUpdate = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbHospitalInfoUpdate.vue" + ); +const MbSummarySheet = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/A-manage/MbSummarySheet.vue" + ); +// 远程超声 +const MbBultrasoundApply = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundApply.vue" + ); +const MbBultrasoundList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundList.vue" + ); +const MbBultrasoundListEdit = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundListEdit.vue" + ); +const MbBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundListDetails.vue" + ); +const MbBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundRecord.vue" + ); +const MbBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/O-bultrasound/MbBultrasoundRecordDetails.vue" + ); +const MbBultrasoundInfo = res => + import( + /* webpackChunkName: "group-system-manager" */ "@/components/system/member/O-bultrasound/MbBultrasoundInfo.vue" + ); +// 医生管理 +const DoctorBlacklist = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorBlacklist.vue" + ); +const DoctorBlacklistDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorBlacklistDetails.vue" + ); +const DoctorAudit = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorAudit.vue" + ); +const DoctorAuditDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorAuditDetails.vue" + ); +const DoctorList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorList.vue" + ); +const DoctorListAdd = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorListAdd.vue" + ); +const DoctorListDetails = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/H-doctormanage/DoctorListDetails.vue" + ); +// 科室管理 +const MbSectionList = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/I-sectionmanage/MbSectionList.vue" + ); +// 账号管理 +const MbChangePassword = res => + import( + /* webpackChunkName: "group-system-member" */ "@/components/system/member/J-accountmanage/MbChangePassword.vue" + ); + +// ===================================== 上级专家 ===================================== +// 个人信息 +const EpChangeMaterials = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/E-personaldata/EpChangeMaterials.vue" + ); +const EpChangePassword = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/E-personaldata/EpChangePassword.vue" + ); +// 远程超声 +const EpMultiConsultation = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpMultiConsultation.vue" + ); +const EpMultiConsultationDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpMultiConsultationDetails.vue" + ); +const EpBultrasoundList = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundList.vue" + ); +const EpBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundListDetails.vue" + ); +const EpBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundRecord.vue" + ); +const EpBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundRecordDetails.vue" + ); +const EpBultrasoundListDetailsOffline = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundListDetailsOffline.vue" + ); +const EpBultrasoundReportTemplate = res => + import( + /* webpackChunkName: "group-system-expert" */ "@/components/system/expert/GG-bultrasound/EpBultrasoundReportTemplate.vue" + ); + +// ===================================== 基层医生 ===================================== +// 远程超声 +const DocBultrasoundApply = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundApply.vue" + ); +const DocBultrasoundList = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundList.vue" + ); +const DocBultrasoundListDetails = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundListDetails.vue" + ); +const DocBultrasoundListEdit = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundListEdit.vue" + ); +const DocBultrasoundRecord = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundRecord.vue" + ); +const DocBultrasoundRecordDetails = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/J-bultrasound/DocBultrasoundRecordDetails.vue" + ); +// 个人数据 +const DocChangeMaterials = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/F-personaldata/DocChangeMaterials.vue" + ); +const DocChangePassword = res => + import( + /* webpackChunkName: "group-system-doctor" */ "@/components/system/doctor/F-personaldata/DocChangePassword.vue" + ); + +Vue.use(Router); +export default new Router({ + routes: [ + { path: "/", name: "BmodeLogin", component: BmodeLogin }, + { + path: "/forgottenPassword", + name: "ForgottenPassword", + component: ForgottenPassword + }, + // 医院注册 + { + path: "/hospitalRequire", + name: "HospitalRequire", + component: HospitalRequire + }, + { + path: "/hospitalRegister", + name: "HospitalRegister", + component: HospitalRegister + }, + { + path: "/hospitalRegisterDetails", + name: "HospitalRegisterDetails", + component: HospitalRegisterDetails, + props: { isApply: true } + }, + // 医生注册 + { + path: "/doctorRegister", + name: "DoctorRegister", + component: DoctorRegister + }, + // 公共组件 + { + path: "/bultrasoundWindow/:id", + name: "bultrasoundWindow", + component: BultrasoundWindow, + props: true + }, + // { + // path: "/largeScreenDataStatis", + // name: "LargeScreenDataStatis", + // component: LargeScreenDataStatis, + // props: true + // }, + // 系统主页 + // 基层医生 + { + path: "/doctor", + component: Index, + redirect: "/docBultrasoundList", + children: [ + { path: "/docBultrasoundApply", component: DocBultrasoundApply }, + { path: "/docBultrasoundList", component: DocBultrasoundList }, + { + path: "/docBultrasoundListDetails", + component: DocBultrasoundListDetails + }, + { path: "/docBultrasoundListEdit", component: DocBultrasoundListEdit }, + { path: "/docBultrasoundRecord", component: DocBultrasoundRecord }, + { + path: "/docBultrasoundRecordDetails", + component: DocBultrasoundRecordDetails + }, + + { path: "/docChangeMaterials", component: DocChangeMaterials }, + { path: "/docChangePassword", component: DocChangePassword } + ] + }, + // 管理医院 + { + path: "/manager", + component: Index, + redirect: "/mgBultrasoundList", + children: [ + { path: "/applyInfoManage", component: ApplyInfoManage }, + { path: "/applyInfoManageDetails", component: ApplyInfoManageDetails }, + { path: "/allHospitalInfo", component: AllHospitalInfo }, + { path: "/allHospitalInfoDetails", component: AllHospitalInfoDetails }, + { path: "/mgSummarySheet", component: MgSummarySheet }, + + { path: "/expertBlacklist", component: ExpertBlacklist }, + { path: "/expertAudit", component: ExpertAudit }, + { path: "/expertAuditDetails", component: ExpertAuditDetails }, + { path: "/expertList", component: ExpertList }, + { path: "/expertListDetails", component: ExpertListDetails }, + { path: "/expertListAdd", component: ExpertListAdd }, + { path: "/expertBlacklistDetails", component: ExpertBlacklistDetails }, + + { path: "/mgSectionList", component: MgSectionList }, + + { path: "/administratorList", component: AdministratorList }, + { path: "/administratorListAdd", component: AdministratorListAdd }, + { path: "/mgChangePassword", component: MgChangePassword }, + { + path: "/administratorListDetails", + component: AdministratorListDetails + }, + + { path: "/mgBultrasoundList", component: MgBultrasoundList }, + { + path: "/mgBultrasoundListDetails", + component: MgBultrasoundListDetails + }, + { path: "/mgBultrasoundRecord", component: MgBultrasoundRecord }, + { + path: "/mgBultrasoundRecordDetails", + component: MgBultrasoundRecordDetails + }, + { path: "/mgBultrasoundInfo", component: MgBultrasoundInfo }, + { path: "/largeScreenDataStatis", component: LargeScreenDataStatis }, + { + path: "/ultrasoundFollowUpEntry", + component: MgBultrasoundFollowUpEntry + } + ] + }, + // 基层医院 + { + path: "/member", + component: Index, + redirect: "/mbBultrasoundList", + children: [ + { path: "/mbBultrasoundApply", component: MbBultrasoundApply }, + { path: "/mbBultrasoundList", component: MbBultrasoundList }, + { path: "/mbBultrasoundListEdit", component: MbBultrasoundListEdit }, + { + path: "/mbBultrasoundListDetails", + component: MbBultrasoundListDetails + }, + { path: "/mbBultrasoundRecord", component: MbBultrasoundRecord }, + { + path: "/mbBultrasoundRecordDetails", + component: MbBultrasoundRecordDetails + }, + { path: "/mbBultrasoundInfo", component: MbBultrasoundInfo }, + + { path: "/mbHospitalInfo", component: MbHospitalInfo }, + { path: "/mbHospitalInfoUpdate", component: MbHospitalInfoUpdate }, + { path: "/mbSummarySheet", component: MbSummarySheet }, + + { path: "/mbSectionList", component: MbSectionList }, + + { path: "/mbChangePassword", component: MbChangePassword }, + + { path: "/doctorBlacklist", component: DoctorBlacklist }, + { path: "/doctorBlacklistDetails", component: DoctorBlacklistDetails }, + { path: "/doctorAudit", component: DoctorAudit }, + { path: "/doctorAuditDetails", component: DoctorAuditDetails }, + { path: "/doctorList", component: DoctorList }, + { path: "/doctorListDetails", component: DoctorListDetails }, + { path: "/doctorListAdd", component: DoctorListAdd } + ] + }, + // 专家 + { + path: "/expert", + component: Index, + redirect: "/epBultrasoundList", + children: [ + { path: "/epMultiConsultation", component: EpMultiConsultation }, + { + path: "/epMultiConsultationDetails", + component: EpMultiConsultationDetails + }, + { path: "/epBultrasoundList", component: EpBultrasoundList }, + { + path: "/epBultrasoundListDetails", + component: EpBultrasoundListDetails + }, + { path: "/epBultrasoundRecord", component: EpBultrasoundRecord }, + { + path: "/epBultrasoundRecordDetails", + component: EpBultrasoundRecordDetails + }, + { + path: "/epBultrasoundListDetailsOffline", + component: EpBultrasoundListDetailsOffline + }, + { + path: "/epBultrasoundReportTemplate", + component: EpBultrasoundReportTemplate + }, + + { path: "/epChangeMaterials", component: EpChangeMaterials }, + { path: "/epChangePassword", component: EpChangePassword } + ] + }, + // 重定向 + { + path: "*", + redirect: "/" + } + ] + // mode: 'history' +}); diff --git a/sfu-server/guannancs_web_mediasoup/src/store/index.js b/sfu-server/guannancs_web_mediasoup/src/store/index.js new file mode 100644 index 0000000..ed8becd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/store/index.js @@ -0,0 +1,28 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +Vue.use(Vuex) + +export const store = new Vuex.Store({ + state: { + socket: null, + docAccount: null + }, + getters: { + getSocket: state => { + return state.socket + }, + getDocAccount: state => { + return state.docAccount + } + }, + mutations: { + webSocketInit(state, socket) { + state.socket = socket + }, + setDocAccount(state, docAccount) { + state.docAccount = docAccount + } + }, + +}) \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-config/custom-components/Aliplayer.vue b/sfu-server/guannancs_web_mediasoup/src/vue-config/custom-components/Aliplayer.vue new file mode 100644 index 0000000..db968d8 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-config/custom-components/Aliplayer.vue @@ -0,0 +1,439 @@ + + + + + \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-config/index.js b/sfu-server/guannancs_web_mediasoup/src/vue-config/index.js new file mode 100644 index 0000000..1641b73 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-config/index.js @@ -0,0 +1,617 @@ +import Vue from "vue" +import router from '../router' +import Axios from 'axios' +import api from '../api/config' +import Moment from 'moment' +import OssApi from '../oss' +import { MessageBox } from 'element-ui' +import { isFunction, isPlainObject, prefix , drag } from './utils/index.js' +import { merge, set, unset, get } from "lodash" +import Viewer from 'viewerjs' +import 'viewerjs/dist/viewer.css' + +const $isProxy = true +const $isProduction = import.meta.env.PROD + +Vue.use(drag) + +// 组件配置 自定义组件添加install方法用Vue.use()插入到原型 start + +import Aliplayer from './custom-components/Aliplayer.vue' +Vue.use({ + install: function(Vue) { + Vue.component('Aliplayer', Aliplayer); + } +}) + +// 组件配置 自定义组件添加install方法用Vue.use()插入到原型 end + +const $extends = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false + if (typeof target === "boolean") { + deep = target + target = arguments[i] || {}; + i++ + } + if (typeof target !== "object" && !isFunction(target)) { + target = {} + } + if (i === length) { + target = this + i-- + } + for (; i < length; i++) { + if ((options = arguments[i]) != null) { + for (name in options) { + src = target[name] + copy = options[name] + if (target === copy) { + continue + } + if (deep && copy && (isPlainObject(copy) || + (copyIsArray = Array.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false + clone = src && Array.isArray(src) ? src : [] + } else { + clone = src && isPlainObject(src) ? src : {} + } + target[name] = $extends(deep, clone, copy) + } else if (copy !== undefined && copy !== null) { + target[name] = copy + } + } + } + } + return target; +} + +Vue.prototype.$extends = $extends + +// axios 配置 start +Axios.defaults.baseURL = $isProduction || !$isProxy ? api.HOST_NAME : '/imurs' + +// 设置请求头 +Axios.defaults.headers = { + 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' +} + +// 设置提交数据的格式 +Axios.defaults.transformRequest = [function (data,headers) { + const contentType = headers['Content-Type'].toLocaleLowerCase() + if (contentType === 'application/json;charset=utf-8') { + return JSON.stringify(data) + } else if (contentType === 'application/x-www-form-urlencoded;charset=utf-8') { + let ret = '' + for (let it in data) { + ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' + } + return ret + } + return data +}] + +// 设置跨域 +Axios.defaults.withCredentials = true + +// 设置request 拦截器 +Axios.interceptors.request.use(config => { + return config +}, error => { + return Promise.reject(error) +}) + +// 设置response 拦截器 +let isAlert = false +let isErrAlert = false +Axios.interceptors.response.use(res => { + console.log('[ Axios interceptors ]', res) + console.log('[ Axios interceptors ]', res.data) + switch (res.data.msg) { + case '1001': + !isAlert && (MessageBox.alert('您的账号在其它地方登录,如非本人操作,请立即修改密码!!!', '消息提示', { + confirmButtonText: '确定', + callback(){ + router.replace({ path: 'login' }) + isAlert = false + } + }), + isAlert = true) + break + case '1002': + !isAlert && (MessageBox.alert('您的账号未登录或登录已失效,请重新登录!!!', '消息提示', { + confirmButtonText: '确定', + callback() { + router.replace({ path: 'login' }) + isAlert = false + } + }), + isAlert = true) + break + default: '' + } + return res +}, err => { + console.log('[ Axios interceptors ]', err) + !$isProduction && !isErrAlert && (MessageBox.alert('页面请求失败。', '消息提示', { + confirmButtonText: '确定', + callback() { + isErrAlert = false + } + }), + isErrAlert = true) + if (err.response) { + switch (err.response.status) { + // case 401: + // 返回 401 清除token信息并跳转到登录页面 + // router.replace({ + // path: 'login', + // query: { redirect: router.currentRoute.fullPath } + // }) + } + } + return Promise.reject(err) // 返回接口返回的错误信息 +}) +export const axios = Axios +// Vue.prototype.$axios = axios +// axios 配置 end + +/** + * @function + * @description 将options对象或数组中的不为空或者未定义属性值赋给target对象中已存在的对象或数组 + * @name $axiosDataClone + * @param {Object,Array} target 需要给属性赋值的target对象或数组 + * @param {Object,Array} options 需要被克隆属性值的options对像或数组(从第二个参数开始或者第二个参数至倒数第二个都是被克隆的对象或数组) + * @param {Object} replaceAttrs 需要被克隆属性值与target对像属性值不相同,可传入以被克隆的键与target对像的键为键和值的对象作为桥接; + * 对象必须属性replaceAttr,以此判断是否为桥接对象(参数为最后一个对象) + * @returns {Object,Array} target 返回目标对象 + * + */ +export const $axiosDataClone = function() { + let options, src, copy, copyIsArray, clone, deep + options = src = copy = copyIsArray = clone = undefined + deep = false + let target = arguments[0] + let length = arguments.length + let i = 1 + let replaceAttrs = arguments[length - 1] + let isReplaceAttr = isPlainObject(replaceAttrs) && replaceAttrs.replaceAttr + if (isReplaceAttr) { + length = length - 1 + } + if (typeof target === "boolean") { + deep = target + target = arguments[i] + i++ + } + if (i >= length) { + console.error(['', + '缺少参数,必须传入两个或者两个以上的参数!!!', + '缺少参数,必须传入三个或者三个以上的参数!!!' + ][i]) + return target + } + for ( ; i < length; i++ ) { + if ((options = arguments[i]) != null) { + if ( (!isPlainObject(target) || !isPlainObject(options)) && (!Array.isArray(target) || !Array.isArray(options)) ) { + console.warn('参数类型错误,请传入参数类型都相同的对象或数组!!!') + return target + } + for (let attr in options) { + src = target[attr] + copy = options[attr] + + if (isReplaceAttr && replaceAttrs[attr] !== undefined) { + attr = replaceAttrs[attr] + src = target[attr] + } + + if ((!Array.isArray(target) && !target.hasOwnProperty(attr)) || target === copy || src === copy) { + continue + } + + if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false + clone = src && Array.isArray(src) ? src : [] + } else { + clone = src && isPlainObject(src) ? src : {} + } + target[attr] = $axiosDataClone(deep, clone, copy) + } else if (copy !== undefined) { + target[attr] = copy + } + } + } + } + return target +} + +let $statuChange= (e,id)=> { + if(e==1){ return '待医院审核'} + else if(e==2){ return '等待接收'} + else if(e==3){ + if(id=='doc'){ + return '待医生接收' + }else{ + return '待专家接收' + } + } + else if(e==4){ return '已接收'} + else if(e==5){ return '已就诊'} + else if(e==6){ return '已住院'} + else if(e==7){ return '未就诊'} + else if(e==8){ return '已撤销'} + else if(e==9){ return '本医院撤销'} +} +let $protectTypeChange = (e)=>{ + if(e==1){ return '省医保'} + else if(e==2){ return '市职工医保'} + else if(e==3){ return '市居民医保'} + else if(e==4){ return '新农合'} + else if(e==5){ return '自费'} + else if(e==6){ return '异地医保'} + else if(e==7){ return '其他'} +} + +// imageLoaded start +let $imageLoaded = imgUrl => { + return new Promise((resolve, reject) => { + let search = !(/^(http\:|https\:)/.test(imgUrl)) ? '' : '?' + Math.ceil(Math.random() + 1000) + let image = new Image() + image.crossOrigin = 'anonymous' + image.src = imgUrl + search + image.complete ? resolve(image) : + (image.onload = res => { + resolve(image) + }, + image.onerror = res => { + reject(res) + }) + }) +} +// imageLoaded end + +// renderOffscreen (离屏渲染) start +let $renderOffscreen = ({ width = 800, height = 600, elementId = 'canvas', draw }) => { + const canvas = document.createElement('canvas') + const renderCanvas = document.getElementById(elementId) + canvas.width = renderCanvas.width = width + canvas.height = renderCanvas.height = height + typeof draw === 'function' && draw(canvas.getContext('2d')) + renderCanvas.getContext('2d').drawImage(canvas, 0, 0, width, height) +} +// renderOffscreen (离屏渲染) end + +// getBase64 获取base64 start +let $getBase64 = ({ width = 800, height = 600, type = 'image/png', image }) => { + let canvas = document.createElement('canvas') + canvas.width = image.width || width + canvas.height = image.height || height + let context = canvas.getContext("2d") + context.drawImage(image, 0, 0, canvas.width, canvas.height) + let stream = canvas.toDataURL(type) + canvas.remove() + console.log(stream); + + return stream +} +// getBase64 获取base64 end + +// base64ToBlob base64 转 Blob 二进制 start +let $base64ToBlob = (urlData) => { + let arr = urlData.split(',') + let mime = arr[0].match(/:(.*?);/)[1] + // 去掉url的头,并转化为byte + let byteString = window.atob(arr[1]) + // 处理异常,将ascii码小于0的转换为大于0 + let arrayBuffer = new ArrayBuffer(byteString.length) + // 生成视图(直接针对内存):8位无符号整数,长度1个字节 + let u8arr = new Uint8Array(arrayBuffer) + for (let i = 0; i < byteString.length; i++) { + u8arr[i] = byteString.charCodeAt(i) + } + return new Blob([u8arr], { + type: mime + }) +} +// base64ToBlob base64 转 Blob 二进制 end + +// imageToBlob image 转 Blob 二进制 start +let $imageToBlob = ({ width = 800, height = 600, type = 'image/png', image }) => { + let canvas = document.createElement('canvas') + canvas.width = image.width || width + canvas.height = image.height || height + let context = canvas.getContext("2d") + context.drawImage(image, 0, 0, canvas.width, canvas.height) + let stream = canvas.toDataURL(type) + canvas.remove() + console.log(stream); + + return $base64ToBlob(stream) // 调用base64转图片方法 +} +// imageToBlob image 转 Blob 二进制 end + +// createURL start +let $createURL = (config) => { + if (config.image instanceof Blob) { + return URL.createObjectURL(config.image) + } else if (config.image instanceof Image || config.image instanceof HTMLVideoElement) { + return URL.createObjectURL($imageToBlob(config)) + } else if (typeof config.image === 'string' && /^data:image\/([a-zA-Z]+);base64,/.test(config.image)) { + return URL.createObjectURL($base64ToBlob(config.image)) + } + return 'param 不合法' +} +// createURL end + +// download file(下载文件) start +let $downloadFile = (urlData, name) => { + urlData = urlData && /^data:(.+?);base64,/.test(urlData) ? $base64ToBlob(urlData) : urlData + console.log(urlData) + let save_link = document.createElement('a') + save_link.href = /https?/.test(urlData) ? urlData : URL.createObjectURL(urlData) + save_link.download = name || (location.hostName + '-' + Date.now()) + save_link.click() +} +// download file(下载文件) end + +let $isPC = true +let userAgentInfo = navigator.userAgent +let Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"] +for (let v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + $isPC = false + break + } +} + +// 关闭页面之前事件 start +const $beforeunload = (() => { + const CACHE = [] + window.addEventListener('beforeunload', () => { + CACHE.forEach(cb => typeof cb === 'function' && cb(e)) + }) + return (callback) => { + CACHE.push(callback) + } +})() +// 关闭页面之前事件 end + +// 关闭页面事件 start +const $unload = (() => { + const CACHE = [] + let time = 0 + window.addEventListener('beforeunload', () => { + time = Date.now() + }) + window.addEventListener('unload', (e) => { + const diffTime = Date.now() - time + if (diffTime < 2) { + CACHE.forEach(cb => typeof cb === 'function' && cb(e)) + } + }) + return (callback) => { + CACHE.push(callback) + } +})() +// 关闭页面事件 end + +// 获取指定日期之前的某一天 start +const $getDateBefore = (days, date) => { + const _date = date ? new Date(date) : new Date(); + _date.setDate(_date.getDate() - days); + return _date; +} +// 获取指定日期之前的某一天 end + +// 生成完整 OSS URL start +const $generateOssURL = (url) => { + const baseURL = api.OSS_ASSET_NAME.replace(/\/$/, ''); + if (url) { + return /^(https?)|(blob)/.test(url) ? url : `${baseURL}/${url.replace(/^\//, '')}` + } else { + return '' + } +} +// 生成完整 OSS URL end + +// 删除基地址 +const $delbaseURL = (path, baseURL = api.OSS_ASSET_NAME) => { + baseURL = baseURL.replace(/\/*$/, '/'); + if (path) { + const reg = new RegExp(`^${baseURL}`); + return /^(https?)|(blob)/.test(path) ? path.replace(reg, '') : path; + } else { + return ''; + } +} +// 删除基地址 + +// 用户信息类 start +const $user = new class { + constructor() { + const user = sessionStorage.getItem('user') + merge(this, user) + } + + save() { + sessionStorage.setItem('user', this) + } + + add(...agrs) { + if (agrs.length == 0) throw '缺少参数!'; + merge(this, ...agrs) + this.save() + // console.log('[vue-config/index.js] $user.add() $user:', this, 'agrs:', agrs) + } + + setItem(path, value) { + set(this, path, value) + this.save() + } + + getItem(path, defaultValue) { + return get(this, path, defaultValue) + } + + removeItem(path) { + const result = unset(this, path) + this.save() + return result + } + + clear() { + Object.keys(this).forEach(key => { + delete this[key] + }) + this.save() + console.log('[vue-config/index.js] $user.clear() $user:', this) + } +} +// 用户信息类 end + +// 系统信息类 start +const $system = new class { + constructor() { + this.init() + } + + init() { + const system = localStorage.getItem('system') + merge(this, system) + // $beforeunload(() => { + // this.save() + // }) + window.addEventListener('beforeunload', () => { + this.save() + }) + } + + save() { + localStorage.setItem('system', this) + } + + add(...agrs) { + if (agrs.length == 0) throw '缺少参数!'; + merge(this, ...agrs) + this.save() + // console.log('[vue-config/index.js] $system.add() $system:', this, 'agrs:', agrs) + } + + setItem(path, value) { + set(this, path, value) + this.save() + } + + getItem(path, defaultValue) { + return get(this, path, defaultValue) + } + + removeItem(path) { + const result = unset(this, path) + this.save() + return result + } + + clear() { + Object.keys(this).forEach(key => { + delete this[key] + }) + this.save() + console.log('[vue-config/index.js] $system.clear() $system:', this) + } +} +// 系统信息类 end + +// 退出系统的方法 start +const handleLogout = res => { + router.push({ name: 'BmodeLogin' }) + $user.clear() + sessionStorage.clear() +} +const $logout = () => { + return Axios.post('/shiro/logout').then(res => { + + }).catch(err => { + console.error(err) + }).finally(res => { + handleLogout() + console.log('[vue-config] $logout finally') + }) +} +// 退出系统的方法 end + +// 创建 uid start +const $createUID = (min = 1000000001, max = 4294967295) => { + min = Math.ceil(min) + max = Math.floor(max) + return Math.floor(Math.random() * (max - min + 1)) + min +} +// 创建 uid end + +Vue.prototype.$extends({ + // 关闭页面之前事件 + $beforeunload, + // 关闭页面事件 + $unload, + // 用户信息类 + $user, + // 系统信息类 + $system, + // 判断运行环境 是否为生产环境 + $isProduction, + // axios 配置 + $axios: Axios, + // axios data属性值clone + $axiosDataClone, + // oss上传API name + $ossName: api.OSS_NAME, + // oss上传API 方法 + $ossApi: OssApi, + // oss读取文件 name + $ossAssetName: api.OSS_ASSET_NAME, + // 生成完整 OSS URL start + $generateOssURL, + // 删除基地址 + $delbaseURL, + // 日期格式方法 + $moment: Moment, + // 转诊状态转换 + $statuChange, + // 医保类型转换 + $protectTypeChange, + // 域名 + $hostName: api.HOST_NAME, + // renderOffscreen (离屏渲染) + $renderOffscreen, + // 获取base64 + $getBase64, + // base64 转 Blob 二进制 + $base64ToBlob, + // image 转 Blob 二进制 + $imageToBlob, + // createURL + $createURL, + // imageloaded 图片加载完毕函数 + $imageLoaded, + // download file(下载文件) + $downloadFile, + // 添加前缀(下载文件) + $prefix: prefix, + // 是否PC端 + $isPC, + // 退出系统的方法 + $logout, + // 创建 uid 的方法 + $createUID, + // 获取指定日期之前的某一天 + $getDateBefore, + // 图片查看器 + $viewer: Viewer +}) +export default Vue diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/custom-crypto.js b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/custom-crypto.js new file mode 100644 index 0000000..537b5c9 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/custom-crypto.js @@ -0,0 +1,111 @@ +import CryptoJS from 'crypto-js' +import JSEncrypt from 'jsencrypt' + +function stringToArrayBuffer(string) { + const encoder = new TextEncoder(); + return encoder.encode(string).buffer; +} + +function md5Hex(data) { + const words = typeof data === 'string' ? stringToArrayBuffer(data) : data; + const wordArray = CryptoJS.lib.WordArray.create(words) + return CryptoJS.MD5(wordArray).toString(CryptoJS.enc.Hex) +} + +function md5Base64(data) { + const words = typeof data === 'string' ? stringToArrayBuffer(data) : data; + const wordArray = CryptoJS.lib.WordArray.create(words) + return CryptoJS.MD5(wordArray).toString(CryptoJS.enc.Base64) +} + +function aesEncrypt(data, key = import.meta.env.VITE_AES_KEY) { + const encrypted = CryptoJS.AES.encrypt( + JSON.stringify(data), + key + ).toString() + return encrypted +} + +function aesDecrypt(encrypted, key = import.meta.env.VITE_AES_KEY) { + const bytes = CryptoJS.AES.decrypt(encrypted, key) + const decrypted = bytes.toString(CryptoJS.enc.Utf8) + return JSON.parse(decrypted) +} + +// 更安全的 AES 加密 +function secureAESEncrypt(data, password = import.meta.env.VITE_AES_KEY) { + // crypto-js + // 生成随机盐值 + const salt = CryptoJS.lib.WordArray.random(128/8) + + // 使用 PBKDF2 派生密钥 + const key = CryptoJS.PBKDF2(password, salt, { + keySize: 256/32, + iterations: 1000 + }) + + // 生成随机 IV + const iv = CryptoJS.lib.WordArray.random(128/8) + + // 加密 + const encrypted = CryptoJS.AES.encrypt( + JSON.stringify(data), + key, + { iv: iv } + ) + + // 组合 salt, iv 和密文 + const result = salt.toString() + iv.toString() + encrypted.toString() + return result +} + +// 更安全的 AES 解密 +function secureAESDecrypt(encrypted, password = import.meta.env.VITE_AES_KEY) { + // crypto-js + // 提取 salt (前 32 个字符) + const salt = CryptoJS.enc.Hex.parse(encrypted.substr(0, 32)) + + // 提取 iv (接下来的 32 个字符) + const iv = CryptoJS.enc.Hex.parse(encrypted.substr(32, 32)) + + // 提取实际密文 + const ciphertext = encrypted.substring(64) + + // 派生密钥 + const key = CryptoJS.PBKDF2(password, salt, { + keySize: 256/32, + iterations: 1000 + }) + + // 解密 + const decrypted = CryptoJS.AES.decrypt( + ciphertext, + key, + { iv: iv } + ) + + return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8)) +} + +function rsaPublicKeyEncrypt(data, pubKey = import.meta.env.VITE_RSA_PUBKEY) { + const encrypt = new JSEncrypt() + encrypt.setPublicKey(pubKey) + return encrypt.encrypt(data) +} + +function rsaPublicKeyDecrypt(data, pubKey = import.meta.env.VITE_RSA_PUBKEY) { + const encrypt = new JSEncrypt() + encrypt.setPublicKey(pubKey) + return encrypt.decrypt(data) +} + +export { + md5Hex, + md5Base64, + aesEncrypt, + aesDecrypt, + secureAESEncrypt, + secureAESDecrypt, + rsaPublicKeyEncrypt, + rsaPublicKeyDecrypt, +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/drag.js b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/drag.js new file mode 100644 index 0000000..d6ce8c1 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/drag.js @@ -0,0 +1,215 @@ + +const drag = (el, binding, vnode) => { + console.log('el', el) + console.log('binding', binding) + console.log('vnode', vnode) + let nullObj = Object.create(null) + const $this = nullObj + const options = binding.value + const { minW, minH, isParent } = { ...options } // 元素最小可视宽高 + const parentEl = el.parentNode + const positions = {} + {({ top: positions.top, right: positions.right, bottom: positions.bottom, left: positions.left } = { ...options})} + // console.log('[drag] parentEl', nullObj, positions) + // console.log('[drag] parentEl', parentEl, 'innerWidth', innerWidth, 'innerHeight', innerHeight) + return Object.assign(nullObj, { + x: 0, + y: 0, + minX: 0, + minY: 0, + maxX: 0, + maxY: 0, + diffX: 0, // 元素内鼠标的点到元素最左边的距离 + diffY: 0, // 元素内鼠标的点到元素最上边的距离 + init() { + // console.log('[drag] init x', this.x, 'y', this.y) + $this.setStyle() + $this.setMaxXY() + $this.setXY() + $this.setTranslate() + $this.setMaxXY(minW, minH) + }, + resizeEvent() { // 窗口 change 事件 + console.log('[drag] resizeEvent') + $this.setMaxXY(minW, minH) + $this.setTranslate() + }, + setStyle() { // 设置样式 + let position = 'fixed' + if (isParent) { + Object.assign(parentEl.style, { + position: 'relative', + overflow: 'hidden' + }) + position = 'absolute' + } + Object.assign(el.style, { + position: position, + top: '0', + left: '0', + right: 'initial', + bottom: 'initial', + cursor: 'move', + }) + }, + setXY() { // 设置 x y + let x = 0 + let y = 0 + Object.keys(positions).forEach(name => { + const value = isNaN(positions[name]) ? positions[name] : positions[name] + 'px' + if (!value) { + return false + } + switch (name) { + case 'top': + y = $this.getWH(value, 'height') + y = y > $this.maxY ? $this.maxY : y < $this.minY ? $this.minY : y + break; + case 'bottom': + y = $this.maxY - $this.getWH(value, 'height') + y = y > $this.maxY ? $this.maxY : y < $this.minY ? $this.minY : y + break; + case 'left': + x = $this.getWH(value, 'width') + x = x > $this.maxX ? $this.maxX : x < $this.minX ? $this.minX : x + break; + case 'right': + x = $this.maxX - $this.getWH(value, 'width') + x = x > $this.maxX ? $this.maxX : x < $this.minX ? $this.minX : x + break; + + default: + x = $this.maxX + y = $this.maxY + break; + } + }) + $this.x = el.__vOriginalX || x + $this.y = el.__vOriginalY || y + // console.log('[drag] setXY') + }, + setMaxXY(minW, minH) { // 设置最大的 x y + const { innerWidth, innerHeight } = this.getWrapperWH() + const elStyle = getComputedStyle(el) + const elWidth = $this.getWH(elStyle.width, 'width') + const elHeight = $this.getWH(elStyle.height, 'height') + // console.log('[drag] setMaxXY elWidth', elWidth, 'elHeight', elHeight) + minW = isNaN(minW) || minW >= elWidth ? 0 : elWidth - minW + minH = isNaN(minH) || minH >= elHeight ? 0 : elHeight - minH + $this.minX = 0 - minW + $this.minY = 0 - minH + $this.maxX = innerWidth - elWidth + minW + $this.maxY = innerHeight - elHeight + minH + // console.log('[drag] setMaxXY $this.maxX', $this.maxX, '$this.maxY', $this.maxY) + }, + getWH(value, key) { + const { innerWidth, innerHeight } = this.getWrapperWH() + const num = value.toString().replace(/^(\d*.?\d*)(\w{2}|%|vw|vh)/g, (val, num, str) => { + // console.log('[drag] getWH num', num, 'str', str, 'val', val) + return str === 'px' ? num : num / 100 * ({ + width: innerWidth, + height: innerHeight + })[key] + }) + // console.log('[drag] getWH num', num, 'value', value) + return parseInt(num) + }, + getTranslate(minX, minY, maxX, maxY) { // 获取在条件范围内的 x y + // console.log('[drag] getTranslate') + return (x, y) => { + x = x < minX ? minX : (x > maxX ? maxX : x) + y = y < minY ? minY : (y > maxY ? maxY : y) + return { x, y } + } + }, + setTranslate() { // 设置 translate 的 x y + const { minX, minY, maxX, maxY } = $this + const { x, y } = $this.getTranslate(minX, minY, maxX, maxY)($this.x, $this.y) + // __vOriginalX __vOriginalY 保存当前的 x y 值 + el.__vOriginalX = $this.x = x + el.__vOriginalY = $this.y = y + el.style.transform = `translate( ${$this.x}px, ${$this.y}px)` + // console.log('[drag] setTranslate x', $this.x, 'y', $this.y) + }, + getWrapperWH() { + const innerWidth = isParent ? parentEl.clientWidth : window.innerWidth + const innerHeight = isParent ? parentEl.clientHeight : window.innerHeight + return { innerWidth, innerHeight } + }, + bindEvent() { // 绑定事件 + const el = isParent ? parentEl : document + el.addEventListener('mousemove', $this.handleDrag, false) + el.addEventListener('mouseup', $this.handleDragEnd, false) + el.addEventListener('mouseleave', $this.handleDragEnd, false) + el.addEventListener('touchmove', $this.handleDrag, { passive: false }) + el.addEventListener('touchend', $this.handleDragEnd, false) + }, + removeEvent() { // 移除事件 + const el = isParent ? parentEl : document + el.removeEventListener('mousemove', $this.handleDrag, false) + el.removeEventListener('mouseup', $this.handleDragEnd, false) + el.removeEventListener('mouseleave', $this.handleDragEnd, false) + el.removeEventListener('touchmove', $this.handleDrag, { passive: false }) + el.removeEventListener('touchend', $this.handleDragEnd, false) + }, + handleDragStart(e) { // 拖拽开始事件 down|start 事件 + const event = e.targetTouches && e.targetTouches[0] || e + $this.diffX = event.pageX - $this.x + $this.diffY = event.pageY - $this.y + $this.resizeEvent() + $this.bindEvent() + }, + handleDrag(e) { // 拖拽事件 move|drag 事件 + e.preventDefault() + const event = e.targetTouches && e.targetTouches[0] || e + $this.x = event.pageX - $this.diffX + $this.y = event.pageY - $this.diffY + $this.setTranslate() + }, + handleDragEnd(e) { // 拖拽结束事件 up|end 事件 + $this.removeEvent() + }, + }) +} +const bindEvent = (el, drags) => { + el.addEventListener('mousedown', drags.handleDragStart, false) + el.addEventListener('touchstart', drags.handleDragStart, false) + window.addEventListener('resize', drags.resizeEvent, false) + el.offEvent = () => { + el.removeEventListener('mousedown', drags.handleDragStart, false) + el.removeEventListener('touchstart', drags.handleDragStart, false) + window.removeEventListener('resize', drags.resizeEvent, false) + } +} + +export default { + install(Vue) { + Vue.directive('drag', this); + }, + bind(el, binding, vnode) { + const vue = vnode.context + vue.$nextTick(res => { + const drags = drag(el, binding, vnode) + drags.init() + bindEvent(el, drags) + }) + }, + update(el, binding, vnode) { + const value = JSON.stringify(binding.value) + const oldValue = JSON.stringify(binding.oldValue) + + if (value !== oldValue) { + console.log('[drag] update') + const vue = vnode.context + el.offEvent() + vue.$nextTick(res => { + const drags = drag(el, binding, vnode) + drags.resizeEvent() + bindEvent(el, drags) + }) + } + }, + unbind(el) { + el.offEvent() + } +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/index.js b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/index.js new file mode 100644 index 0000000..62fea99 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-config/utils/index.js @@ -0,0 +1,73 @@ +import Drag from './drag.js' + +export const drag = Drag + +// 判断是否为函数 +export const isFunction = (obj) => { + return typeof obj === "function" && typeof obj.nodeType !== "number" +} + +// 判断是否为普通对象 +export const isPlainObject = (obj) => { + let proto, Ctor + if (!obj || obj.toString() !== "[object Object]") { + return false + } + proto = Object.getPrototypeOf(obj) + if (!proto) { + return true + } + Ctor = proto.hasOwnProperty("constructor") && proto.constructor + return typeof Ctor === "function" && Ctor.toString() === Object.toString() +} + +// 添加前缀prefix +export const prefix = (target = '', char = '', length = 0) => { + target = target.toString() + let diff = length - target.length + diff = diff < 0 ? 0 : diff + let prefixStr = new Array(diff + 1).join(char) + return prefixStr + target +} + +// 扩展 String +// ocr图片识别成数值是进行校正的方法 +String.prototype.ocrNumCorrect = function () { + return this.replace(/([loqzBIOZ]|[cC][mMnN]2?$)/g, function (node, key) { + return ({ + 'o': '0', + 'O': '0', + 'I': '1', + 'l': '1', + 'z': '2', + 'Z': '2', + 'B': '8', + 'q': '9', + })[key] || '' + }) +} + +// 扩展 sessionStorage & localStorage +sessionStorage.getItem = localStorage.getItem = function (key) { + let args = Array.prototype.slice.call(arguments) + let value = Storage.prototype.getItem.apply(this, args) + try { + value = JSON.parse(value) + } catch (error) { + // console.warn(error) + } + + return value === undefined ? null : value +} +sessionStorage.setItem = localStorage.setItem = function (key, newValue) { + let setItemEvent = new Event("setItem") + let args = Array.prototype.slice.call(arguments) + args[1] = JSON.stringify(args[1]) + setItemEvent.key = args[0] + setItemEvent.newValue = args[1] + setItemEvent.oldValue = this.getItem(key) + setItemEvent.storageArea = this + setItemEvent.url = location.href + Storage.prototype.setItem.apply(this, args) + window.dispatchEvent(setItemEvent) +} \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-print/index.js b/sfu-server/guannancs_web_mediasoup/src/vue-print/index.js new file mode 100644 index 0000000..acd8fe7 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-print/index.js @@ -0,0 +1,6 @@ +import Print from './src/print.js'; +Print.install = function(Vue) { + Vue.directive('print', Print); +}; + +export default Print; \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-print/src/print.js b/sfu-server/guannancs_web_mediasoup/src/vue-print/src/print.js new file mode 100644 index 0000000..9b7f915 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-print/src/print.js @@ -0,0 +1,81 @@ +import Print from './printarea.js'; +/** + * @file 打印 + * 指令`v-print`,默认打印整个窗口 + * 传入参数`v-print="'#id'"` , 参数为需要打印局部的盒子标识. + */ +let closeBtn = true; +let options = { + endCallback() { + closeBtn = true; + } +} +const validateType = (expectedTypes, gotType) => { + console.error('[Print warn]: Invalid prop: type check failed for prop "print".Expected ' + expectedTypes.join(', ') + ', got ' + gotType + '.') + return false +} +const print = (el, binding, vnode) => { + let gotType = Object.prototype.toString.call(binding.value).slice(8, -1) + switch (binding.rawName) { + case 'v-print:onStart': + if (gotType === 'Function') { + options.startCallback = binding.value + } else { + return validateType(['Function'], gotType) + } + break; + + case 'v-print:onEnd': + if (gotType === 'Function') { + options.endCallback = () => { + closeBtn = true; + binding.value.endCallback() + } + } else { + return validateType(['Function'], gotType) + } + break; + + default: + if (gotType === 'String') { + options.el = binding.value + } else { + return validateType(['String'], gotType) + } + break; + } +} + +export default { + directiveName: 'print', + bind(el, binding, vnode) { + let vue = vnode.context; + let reval = print(el, binding, vnode) + if (binding.rawName === 'v-print') { + el.addEventListener('click', (event) => { + if (options.el) { + localPrint(); + } else { + window.print(); + } + }); + } + const localPrint = () => { + vue.$nextTick(() => { + if (closeBtn) { + closeBtn = false; + let print = new Print(options); + } + }); + }; + }, + + update(el, binding, vnode) { + print(el, binding, vnode) + closeBtn = true; + }, + + unbind(el) { + + } +}; \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/src/vue-print/src/printarea.js b/sfu-server/guannancs_web_mediasoup/src/vue-print/src/printarea.js new file mode 100644 index 0000000..8bff3c6 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/src/vue-print/src/printarea.js @@ -0,0 +1,158 @@ +export default class { + constructor(option) { + this.standards = { + strict: 'strict', + loose: 'loose', + html5: 'html5' + }; + this.ele = null; + this.counter = 0; + this.settings = { + standard: this.standards.html5, + extraHead: '', // 附加在head标签上的额外元素,使用逗号分隔 + extraCss: '', // 额外的css逗号分隔 + popTitle: '', // 标题 + startCallback: ()=>{}, // 打开前的回调函数 + endCallback: null, // 成功打开后的回调函数 + el: '' // 局部打印的id + }; + Object.assign(this.settings, option); + this.init(); + }; + init() { + this.counter++; + this.settings.id = `printArea_${this.counter}`; + let box = document.getElementById(this.settings.id); + if (box) { + box.parentNode.removeChild(box); + } + let PrintAreaWindow = this.getPrintWindow(); // 创建iframe + let ele = this.getFormData(document.querySelector(this.settings.el)); + this.ele = ele; + this.settings.startCallback(this.ele); + this.write(PrintAreaWindow.doc); // 写入内容 + this.print(PrintAreaWindow); + this.settings.endCallback(); + }; + print(PAWindow) { + let paWindow = PAWindow.win; + paWindow.onload = () => { + paWindow.focus(); + paWindow.print(); + }; + }; + write(PADocument, $ele) { + PADocument.open(); + // PADocument.write(`${this.docType()}${this.getHead()}${this.getBody()}`); + PADocument.write(`${this.getHead()}${this.getBody()}`); + PADocument.close(); + }; + docType() { + if (this.settings.standard === this.standards.html5) { + return ''; + } + var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : ''; + var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict'; + + return ``; + }; + getHead() { + let extraHead = ''; + let links = ''; + let style = ''; + if (this.settings.extraHead) { + this.settings.extraHead.replace(/([^,]+)/g, function(m) { + extraHead += m; + }); + } + document.querySelectorAll('link').forEach((item, i) => { + if (item.href.indexOf('.css') >= 0) { + links += ``; + } + }); + for (let i = 0; i < document.getElementsByTagName('style').length; i++) { + try { + let styleHtml = document.getElementsByTagName('style')[i].outerHTML || ''; + style += styleHtml + } catch (error) { } + } + if (this.settings.extraCss) { + this.settings.extraCss.replace(/([^,\s]+)/g, function(m) { + links += ``; + }); + } + + return `${this.settings.popTitle}${extraHead}${links}${style}`; + }; + getBody() { + let htm = this.ele.outerHTML; + // console.log('htm', htm); + return '' + htm + ''; + }; + // 处理form表单的默认状态 + getFormData(ele) { + let copy = ele.cloneNode(true); + let copiedInputs = copy.querySelectorAll('input,select,textarea'); + + copiedInputs.forEach((item, i) => { + let typeInput = item.getAttribute('type'); + let copiedInput = copiedInputs[i]; + if (typeInput === undefined) { + typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : ''; + } + if (typeInput === 'radio' || typeInput === 'checkbox') { + + copiedInput.setAttribute('checked', item.checked); + + } else if (typeInput === 'text' || typeInput === '') { + copiedInput.value = item.value; + copiedInput.setAttribute('value', item.value); + } else if (typeInput === 'select') { + copiedInput.querySelectorAll('option').forEach((op, b) => { + if (op.selected) { + op.setAttribute('selected', true); + }; + }); + } else if (typeInput === 'textarea') { + copiedInput.value = item.value; + copiedInput.setAttribute('value', item.value); + copiedInput.innerHTML = item.value; + } + }); + return copy; + }; + getPrintWindow() { + var f = this.Iframe(); + return { + win: f.contentWindow || f, + doc: f.doc + }; + }; + Iframe() { + let frameId = this.settings.id; + let iframe; + + try { + iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + iframe.style.border = '0px'; + iframe.style.position = 'absolute'; + iframe.style.width = '0px'; + iframe.style.height = '0px'; + iframe.style.right = '0px'; + iframe.style.top = '0px'; + iframe.setAttribute('id', frameId); + iframe.setAttribute('src', new Date().getTime()); + iframe.doc = null; + iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document); + } catch (e) { + throw new Error(e + '. iframes may not be supported in this browser.'); + } + + if (iframe.doc == null) { + throw new Error('Cannot find document.'); + } + + return iframe; + }; +}; \ No newline at end of file diff --git a/sfu-server/guannancs_web_mediasoup/vite.config.js b/sfu-server/guannancs_web_mediasoup/vite.config.js new file mode 100644 index 0000000..407efdd --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/vite.config.js @@ -0,0 +1,64 @@ +import { fileURLToPath, URL } from 'node:url' +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue2' +import vueJsx from '@vitejs/plugin-vue2-jsx' +import inject from '@rollup/plugin-inject' +import { chunkSplitPlugin } from 'vite-plugin-chunk-split' + +const resolve = (dir) => { + return fileURLToPath(new URL(dir, import.meta.url)) +} + +export default defineConfig(({ command, mode }) => { + // 根据当前工作目录中的 `mode` 加载 .env 文件 + // 设置第三个参数为 '' 来加载所有环境变量,而不管是否有 `VITE_` 前缀。 + const env = loadEnv(mode, process.cwd(), '') + return { + // vite 配置 + build: { + outDir: 'dist', + assetsDir: 'static', + rollupOptions: { + output: { + entryFileNames: `static/[name].[hash].js`, + chunkFileNames: `static/[name].[hash].js`, + assetFileNames: `static/[name].[hash].[ext]` + } + } + }, + server: { + host: '0.0.0.0', + port: 5050, + proxy: { + '/imurs': { + target: env.VITE_HOST_NAME, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/imurs/, '') + }, + } + }, + resolve: { + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + 'assets': resolve('src/assets'), + 'agora': resolve('src/agora'), + 'public': resolve('src/components/system/public'), + } + }, + plugins: [vue(), vueJsx(), chunkSplitPlugin({ + // customSplitting: { + // 'vue-vendor': ['vue', 'vuex', 'vue-router', 'vue-template-compiler', /src\/vue-config/] + // } + }), inject({ + modules: { + AGORA_APP_ID: ['agora/agoraConfig', 'AGORA_APP_ID'], + RtcClient: ['agora/rtcClient', 'default'], + StorageChannel: ['public/storageSignaling', 'default'], + } + })], + // define: { + // __APP_ENV__: env.APP_ENV, + // } + } +}) diff --git a/sfu-server/guannancs_web_mediasoup/vite.config.js.timestamp-1751247700782-a70c1e3b0b9fb.mjs b/sfu-server/guannancs_web_mediasoup/vite.config.js.timestamp-1751247700782-a70c1e3b0b9fb.mjs new file mode 100644 index 0000000..0e08b90 --- /dev/null +++ b/sfu-server/guannancs_web_mediasoup/vite.config.js.timestamp-1751247700782-a70c1e3b0b9fb.mjs @@ -0,0 +1,66 @@ +// vite.config.js +import { fileURLToPath, URL } from "node:url"; +import { defineConfig, loadEnv } from "file:///E:/project/guannancs_web/node_modules/vite/dist/node/index.js"; +import vue from "file:///E:/project/guannancs_web/node_modules/@vitejs/plugin-vue2/dist/index.mjs"; +import vueJsx from "file:///E:/project/guannancs_web/node_modules/@vitejs/plugin-vue2-jsx/dist/index.mjs"; +import inject from "file:///E:/project/guannancs_web/node_modules/@rollup/plugin-inject/dist/es/index.js"; +import { chunkSplitPlugin } from "file:///E:/project/guannancs_web/node_modules/vite-plugin-chunk-split/dist/index.mjs"; +var __vite_injected_original_import_meta_url = "file:///E:/project/guannancs_web/vite.config.js"; +var resolve = (dir) => { + return fileURLToPath(new URL(dir, __vite_injected_original_import_meta_url)); +}; +var vite_config_default = defineConfig(({ command, mode }) => { + const env = loadEnv(mode, process.cwd(), ""); + return { + // vite 配置 + build: { + outDir: "dist", + assetsDir: "static", + rollupOptions: { + output: { + entryFileNames: `static/[name]/[name].[hash].js`, + chunkFileNames: `static/[name]/[name].[hash].js`, + assetFileNames: `static/[name]/[name].[hash].[ext]` + } + } + }, + server: { + host: "0.0.0.0", + port: 5050, + proxy: { + "/imurs": { + target: env.VITE_HOST_NAME, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/imurs/, "") + } + } + }, + resolve: { + alias: { + "vue$": "vue/dist/vue.esm.js", + "@": resolve("src"), + "assets": resolve("src/assets"), + "agora": resolve("src/agora"), + "public": resolve("src/components/system/public") + } + }, + plugins: [vue(), vueJsx(), chunkSplitPlugin({ + // customSplitting: { + // 'vue-vendor': ['vue', 'vuex', 'vue-router', 'vue-template-compiler', /src\/vue-config/] + // } + }), inject({ + modules: { + AGORA_APP_ID: ["agora/agoraConfig", "AGORA_APP_ID"], + RtcClient: ["agora/rtcClient", "default"], + StorageChannel: ["public/storageSignaling", "default"] + } + })] + // define: { + // __APP_ENV__: env.APP_ENV, + // } + }; +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxwcm9qZWN0XFxcXGd1YW5uYW5jc193ZWJcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXHByb2plY3RcXFxcZ3Vhbm5hbmNzX3dlYlxcXFx2aXRlLmNvbmZpZy5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovcHJvamVjdC9ndWFubmFuY3Nfd2ViL3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgVVJMIH0gZnJvbSAnbm9kZTp1cmwnXHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiB9IGZyb20gJ3ZpdGUnXHJcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlMidcclxuaW1wb3J0IHZ1ZUpzeCBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUyLWpzeCdcclxuaW1wb3J0IGluamVjdCBmcm9tICdAcm9sbHVwL3BsdWdpbi1pbmplY3QnXHJcbmltcG9ydCB7IGNodW5rU3BsaXRQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1jaHVuay1zcGxpdCdcclxuXHJcbmNvbnN0IHJlc29sdmUgPSAoZGlyKSA9PiB7XHJcbiAgcmV0dXJuIGZpbGVVUkxUb1BhdGgobmV3IFVSTChkaXIsIGltcG9ydC5tZXRhLnVybCkpXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZygoeyBjb21tYW5kLCBtb2RlIH0pID0+IHtcclxuICAvLyBcdTY4MzlcdTYzNkVcdTVGNTNcdTUyNERcdTVERTVcdTRGNUNcdTc2RUVcdTVGNTVcdTRFMkRcdTc2ODQgYG1vZGVgIFx1NTJBMFx1OEY3RCAuZW52IFx1NjU4N1x1NEVGNlxyXG4gIC8vIFx1OEJCRVx1N0Y2RVx1N0IyQ1x1NEUwOVx1NEUyQVx1NTNDMlx1NjU3MFx1NEUzQSAnJyBcdTY3NjVcdTUyQTBcdThGN0RcdTYyNDBcdTY3MDlcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0ZcdUZGMENcdTgwMENcdTRFMERcdTdCQTFcdTY2MkZcdTU0MjZcdTY3MDkgYFZJVEVfYCBcdTUyNERcdTdGMDBcdTMwMDJcclxuICBjb25zdCBlbnYgPSBsb2FkRW52KG1vZGUsIHByb2Nlc3MuY3dkKCksICcnKVxyXG4gIHJldHVybiB7XHJcbiAgICAvLyB2aXRlIFx1OTE0RFx1N0Y2RVxyXG4gICAgYnVpbGQ6IHtcclxuICAgICAgb3V0RGlyOiAnZGlzdCcsXHJcbiAgICAgIGFzc2V0c0RpcjogJ3N0YXRpYycsXHJcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgICBvdXRwdXQ6IHtcclxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBgc3RhdGljL1tuYW1lXS9bbmFtZV0uW2hhc2hdLmpzYCxcclxuICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiBgc3RhdGljL1tuYW1lXS9bbmFtZV0uW2hhc2hdLmpzYCxcclxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBgc3RhdGljL1tuYW1lXS9bbmFtZV0uW2hhc2hdLltleHRdYFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHNlcnZlcjoge1xyXG4gICAgICBob3N0OiAnMC4wLjAuMCcsXHJcbiAgICAgIHBvcnQ6IDUwNTAsXHJcbiAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgJy9pbXVycyc6IHtcclxuICAgICAgICAgIHRhcmdldDogZW52LlZJVEVfSE9TVF9OQU1FLFxyXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZSgvXlxcL2ltdXJzLywgJycpXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJlc29sdmU6IHtcclxuICAgICAgYWxpYXM6IHtcclxuICAgICAgICAndnVlJCc6ICd2dWUvZGlzdC92dWUuZXNtLmpzJyxcclxuICAgICAgICAnQCc6IHJlc29sdmUoJ3NyYycpLFxyXG4gICAgICAgICdhc3NldHMnOiByZXNvbHZlKCdzcmMvYXNzZXRzJyksXHJcbiAgICAgICAgJ2Fnb3JhJzogcmVzb2x2ZSgnc3JjL2Fnb3JhJyksXHJcbiAgICAgICAgJ3B1YmxpYyc6IHJlc29sdmUoJ3NyYy9jb21wb25lbnRzL3N5c3RlbS9wdWJsaWMnKSxcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHBsdWdpbnM6IFt2dWUoKSwgdnVlSnN4KCksIGNodW5rU3BsaXRQbHVnaW4oe1xyXG4gICAgICAvLyBjdXN0b21TcGxpdHRpbmc6IHtcclxuICAgICAgLy8gICAndnVlLXZlbmRvcic6IFsndnVlJywgJ3Z1ZXgnLCAndnVlLXJvdXRlcicsICd2dWUtdGVtcGxhdGUtY29tcGlsZXInLCAvc3JjXFwvdnVlLWNvbmZpZy9dXHJcbiAgICAgIC8vIH1cclxuICAgIH0pLCBpbmplY3Qoe1xyXG4gICAgICBtb2R1bGVzOiB7XHJcbiAgICAgICAgQUdPUkFfQVBQX0lEOiBbJ2Fnb3JhL2Fnb3JhQ29uZmlnJywgJ0FHT1JBX0FQUF9JRCddLFxyXG4gICAgICAgIFJ0Y0NsaWVudDogWydhZ29yYS9ydGNDbGllbnQnLCAnZGVmYXVsdCddLFxyXG4gICAgICAgIFN0b3JhZ2VDaGFubmVsOiBbJ3B1YmxpYy9zdG9yYWdlU2lnbmFsaW5nJywgJ2RlZmF1bHQnXSxcclxuICAgICAgfVxyXG4gICAgfSldLFxyXG4gICAgLy8gZGVmaW5lOiB7XHJcbiAgICAvLyAgIF9fQVBQX0VOVl9fOiBlbnYuQVBQX0VOVixcclxuICAgIC8vIH1cclxuICB9XHJcbn0pXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBZ1EsU0FBUyxlQUFlLFdBQVc7QUFDblMsU0FBUyxjQUFjLGVBQWU7QUFDdEMsT0FBTyxTQUFTO0FBQ2hCLE9BQU8sWUFBWTtBQUNuQixPQUFPLFlBQVk7QUFDbkIsU0FBUyx3QkFBd0I7QUFMNEgsSUFBTSwyQ0FBMkM7QUFPOU0sSUFBTSxVQUFVLENBQUMsUUFBUTtBQUN2QixTQUFPLGNBQWMsSUFBSSxJQUFJLEtBQUssd0NBQWUsQ0FBQztBQUNwRDtBQUVBLElBQU8sc0JBQVEsYUFBYSxDQUFDLEVBQUUsU0FBUyxLQUFLLE1BQU07QUFHakQsUUFBTSxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksR0FBRyxFQUFFO0FBQzNDLFNBQU87QUFBQTtBQUFBLElBRUwsT0FBTztBQUFBLE1BQ0wsUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsUUFDbEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLFFBQ0wsVUFBVTtBQUFBLFVBQ1IsUUFBUSxJQUFJO0FBQUEsVUFDWixjQUFjO0FBQUEsVUFDZCxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsWUFBWSxFQUFFO0FBQUEsUUFDaEQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0wsUUFBUTtBQUFBLFFBQ1IsS0FBSyxRQUFRLEtBQUs7QUFBQSxRQUNsQixVQUFVLFFBQVEsWUFBWTtBQUFBLFFBQzlCLFNBQVMsUUFBUSxXQUFXO0FBQUEsUUFDNUIsVUFBVSxRQUFRLDhCQUE4QjtBQUFBLE1BQ2xEO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUyxDQUFDLElBQUksR0FBRyxPQUFPLEdBQUcsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJNUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxNQUNULFNBQVM7QUFBQSxRQUNQLGNBQWMsQ0FBQyxxQkFBcUIsY0FBYztBQUFBLFFBQ2xELFdBQVcsQ0FBQyxtQkFBbUIsU0FBUztBQUFBLFFBQ3hDLGdCQUFnQixDQUFDLDJCQUEyQixTQUFTO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLENBQUMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUo7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo= diff --git a/sfu-server/imurs_mediasoup/.classpath b/sfu-server/imurs_mediasoup/.classpath new file mode 100644 index 0000000..653dfd7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/.classpath @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/.project b/sfu-server/imurs_mediasoup/.project new file mode 100644 index 0000000..dc6467a --- /dev/null +++ b/sfu-server/imurs_mediasoup/.project @@ -0,0 +1,49 @@ + + + imurs + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.core.springbuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.springframework.ide.eclipse.core.springnature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + + + 1765520094917 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/sfu-server/imurs_mediasoup/.settings/.jsdtscope b/sfu-server/imurs_mediasoup/.settings/.jsdtscope new file mode 100644 index 0000000..92e666d --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.core.resources.prefs b/sfu-server/imurs_mediasoup/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.apt.core.prefs b/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..dfa4f3a --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=true +org.eclipse.jdt.apt.genSrcDir=target/generated-sources/annotations +org.eclipse.jdt.apt.genTestSrcDir=target/generated-test-sources/test-annotations diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.core.prefs b/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..bb2eb88 --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,22 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=javax.annotation.Nonnull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=javax.annotation.ParametersAreNonnullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled +org.eclipse.jdt.core.compiler.processAnnotations=enabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.m2e.core.prefs b/sfu-server/imurs_mediasoup/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.component b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..4a82129 --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.component @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.project.facet.core.xml b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..225e769 --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.validation.prefs b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/sfu-server/imurs_mediasoup/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/sfu-server/imurs_mediasoup/ApplyBModeController.java b/sfu-server/imurs_mediasoup/ApplyBModeController.java new file mode 100644 index 0000000..ba92782 --- /dev/null +++ b/sfu-server/imurs_mediasoup/ApplyBModeController.java @@ -0,0 +1,575 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.dto.SpecialistSubmitDto; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyBModeSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.service.impl.ApplyBModeServiceImpl; +import com.imurs.service.impl.BmodeMachineModelServiceImpl; +import com.imurs.util.DateUtils; +import com.imurs.util.page.Pagetion; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Controller +@RestController +@RequestMapping({"bmode"}) +public class ApplyBModeController { + @Autowired + ApplyBModeService applyBModeService; + + @Autowired + ApplyBModeServiceImpl applyBModeServiceImpl; + + @Autowired + PatientService patientService; + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + + @Autowired + UserService userService; + + @Autowired + BmodeMachineModelServiceImpl bmodeMachineModelServiceImpl; + + @Transactional + @RequestMapping({"insertBmodeImg"}) + public Map insertBmodeImg(@RequestBody List abmiList) { + Map map = new HashMap<>(); + try { + if (!abmiList.isEmpty()) { + boolean result = this.applyBModeImgService.insertBatch(abmiList); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({"insertBmode"}) + public Map insertBmode(@RequestBody List abmList) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!abmList.isEmpty() && abmList.get(0) != null) { + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()).eq("category_hospital_id", ((ApplyBMode)abmList.get(0)).getCategoryHospitalId()).and().ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and().le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + abm.setBtype(DateUtils.format(date, "yyyyMMdd") + "0" + abmNo); + // abm.setGroupDate(new Timestamp(date.getTime())); + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (result == true) { + map.put("id", ((ApplyBMode)abmList.get(0)).getId()); + map.put("msg", "1"); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getHisEsrdNumber())) { + wrapper.eq("his_esrd_number", ((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + } else { + wrapper.eq("out_patien", ((ApplyBMode)abmList.get(0)).getOutPatien()); + wrapper2.eq("out_patien", ((ApplyBMode)abmList.get(0)).getOutPatien()); + } + wrapper.eq("hospital_id", ((ApplyBMode)abmList.get(0)).getCategoryHospitalId()); + Patient patient2 = (Patient)this.patientService.selectOne((Wrapper)wrapper); + wrapper2.eq("hospital_id", ((ApplyBMode)abmList.get(0)).getGroupHospitalId()); + Patient patient3 = (Patient)this.patientService.selectOne((Wrapper)wrapper2); + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtCard())) + patient.setCard(((ApplyBMode)abmList.get(0)).getPtCard()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getSex())) + patient.setSex(((ApplyBMode)abmList.get(0)).getSex()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPatientName())) + patient.setPatientName(((ApplyBMode)abmList.get(0)).getPatientName()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtCity())) + patient.setFamily(((ApplyBMode)abmList.get(0)).getPtCity()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getPtPhone())) + patient.setPhone(((ApplyBMode)abmList.get(0)).getPtPhone()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getHisEsrdNumber())) + patient.setHisEsrdNumber(((ApplyBMode)abmList.get(0)).getHisEsrdNumber()); + if (StringUtils.isNotEmpty(((ApplyBMode)abmList.get(0)).getOutPatien())) + patient.setOutPatien(((ApplyBMode)abmList.get(0)).getOutPatien()); + if (patient2 == null) { + patient.setHospitalId(((ApplyBMode)abmList.get(0)).getCategoryHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = "yd03" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(((ApplyBMode)abmList.get(0)).getGroupHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber : ("yd03" + patient.getId()); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + Long id = ((ApplyBMode)abmList.get(0)).getId(); + ((ApplyBMode)abmList.get(0)).setEsrdNumber(ptEsrdNumber); + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) + ((ApplyBModeImg)ImgList.get(i)).setbId(id); + this.applyBModeImgService.insertBatch(ImgList); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateBmode"}) + public Map updateBmode(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(8); + boolean result = false; + try { + if (applyBMode != null) + result = this.applyBModeService.updateBmodeById(applyBMode); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateBmodeImg"}) + public Map updateBmodeImg(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(); + try { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", applyBMode.getId()); + List idList = this.applyBModeImgService.selectList((Wrapper)wrapper); + List abmList = applyBMode.getAbmList(); + if (!idList.isEmpty()) { + if (!abmList.isEmpty()) { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } else { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + } + } else if (!abmList.isEmpty()) { + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } + boolean result = this.applyBModeService.updateById(applyBMode); + map.put("msg", (result == true) ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({"deleteBmodeById"}) + public Map deleteBmodeById(Long id) { + Map map = new HashMap<>(); + try { + boolean result = this.applyBModeService.deleteById(id); + if (result == true) { + map.put("b_id", id); + this.applyBModeImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodeById"}) + public Map selectBmodeById(Long id) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode)this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User)this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper)wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper)wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist)abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist)abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist)abmSp.get(0)).getSpeId(); + //医生删了 那user 就为null 2025 0211 + User selectById = (User)this.userService.selectById(speId); + if(selectById!=null) + phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodePage"}) + public Map selectBmodePage(String categoryHospitalId, String groupHospitalId, String startTime, String endTime, String patientName, Integer pageNo, Integer pageSize, Integer type, String part, Long docId, Integer cureType, String diagnosisType, String status, String isRemote) { + Map map = new HashMap<>(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + map.put("isRemote", isRemote); + map.put("diagnosisType", diagnosisType); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("status", status); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + try { + Pagetion pagetion = this.applyBModeService.selectBmodePage(map, pageNo, pageSize); + map.clear(); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((ApplyBMode)pagetion.getList().get(i)).getId()).ne("state", "80"); + List abmSp = this.applyBModeSpecialistService.selectList((Wrapper)wrapper); + if (!abmSp.isEmpty()) + ((ApplyBMode)pagetion.getList().get(i)).setAbmSp(abmSp); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + map.remove("cureType"); + map.remove("status"); + } + return map; + } + + @RequestMapping({"insertBModeSpecialist"}) + public Map insertBModeSpecialist(@RequestBody List acList) { + Map map = new HashMap<>(); + boolean insert = false; + try { + Long bId = ((ApplyBModeSpecialist)acList.get(0)).getbId(); + EntityWrapper bModeWrapper = new EntityWrapper(); + bModeWrapper.eq("id", bId); + ApplyBMode bMode = (ApplyBMode)this.applyBModeService.selectOne((Wrapper)bModeWrapper); + for (ApplyBModeSpecialist applyBModeSpecialist : acList) { + EntityWrapper wrapper = new EntityWrapper(); + if (applyBModeSpecialist.getbId() != null && applyBModeSpecialist.getSpeId() != null) { + wrapper.eq("b_id", applyBModeSpecialist.getbId()) + .eq("spe_id", applyBModeSpecialist.getSpeId()); + ApplyBModeSpecialist queryApply = (ApplyBModeSpecialist)this.applyBModeSpecialistService.selectOne((Wrapper)wrapper); + if (queryApply != null) { + applyBModeSpecialist.setId(queryApply.getId()); + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.updateById(applyBModeSpecialist); + } else { + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.insert(applyBModeSpecialist); + } + } + if (!insert) + break; + } + map.put("msg", insert ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"updateConSpecialist"}) + public Map updateConSpecialist(ApplyBModeSpecialist abmSp) { + ApplyBMode bmode = (ApplyBMode)this.applyBModeService.selectById(abmSp.getbId()); + Map map = new HashMap<>(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + EntityWrapper wrapper = new EntityWrapper(); + String status = ""; + try { + if (abmSp != null) { + abmSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", abmSp.getSpeId()).eq("b_id", abmSp.getbId()); + boolean result = this.applyBModeSpecialistService.update(abmSp, (Wrapper)wrapper); + if (result == true) { + if ("1".equals(bmode.getConsultationWay())) { + status = abmSp.getState() + ""; + } else { + map.put("b_id", abmSp.getbId()); + List accList = this.applyBModeSpecialistService.selectByMap(map); + if (!accList.isEmpty()) { + Map collect = (Map)accList.stream().collect(Collectors.groupingBy(ApplyBModeSpecialist::getState, Collectors.counting())); + int sum30 = (collect.get(Integer.valueOf(30)) != null) ? ((Long)collect.get(Integer.valueOf(30))).intValue() : 0; + int sum40 = (collect.get(Integer.valueOf(40)) != null) ? ((Long)collect.get(Integer.valueOf(40))).intValue() : 0; + int sum80 = (collect.get(Integer.valueOf(80)) != null) ? ((Long)collect.get(Integer.valueOf(80))).intValue() : 0; + if (sum40 != 0 && sum30 == 0 && sum80 == 0) { + status = "40"; + } else if (sum80 != 0 && sum40 == 0 && sum30 == 0) { + status = "20"; + } else { + status = "30"; + } + } + } + if (StringUtils.isNotEmpty(status)) { + ApplyBMode ab = new ApplyBMode(); + ab.setStatus(status); + ab.setId(abmSp.getbId()); + ab.setDismissReason(abmSp.getDismissReason()); + this.applyBModeService.updateById(ab); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({"selectBmodeSpePage"}) + public Map selectBmodeSpePage(Integer pageNo, Integer pageSize, String patientName, String startTime, String endTime, String specialistId, Integer cureType, String diagnosisType, Integer part, Integer type, String status) { + Map map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId", specialistId); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("diagnosisType", diagnosisType); + map.put("part", part); + map.put("type", type); + map.put("status", status); + try { + Pagetion> pagetion = this.applyBModeService.selectBmodeSpePage(map, pageNo, pageSize); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((Map)pagetion.getList().get(i)).get("id")); + List applyBModeSpecialists = this.applyBModeSpecialistService.selectList((Wrapper)wrapper); + pagetion.getList().get(i).put("abmSp", applyBModeSpecialists); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("cureType"); + map.remove("part"); + map.remove("type"); + map.remove("status"); + } + return map; + } + + @RequestMapping({"selectMachineModel"}) + public Map selectMachineModel() { + Map map = this.bmodeMachineModelServiceImpl.selectMachineModel(); + return map; + } + + @RequestMapping({"DataStatistics"}) + public Map DataStatistics() { + Map dataStatistics = this.applyBModeServiceImpl.DataStatistics(); + return dataStatistics; + } + + @RequestMapping({"categoryHospitalStatistics"}) + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = this.applyBModeService.categoryHospitalStatistics(id, startTime, endTime); + return map; + } + + @RequestMapping({"manageHospitalDataStatistics"}) + public Map dataStatisticsForHospital(String startTime, String endTime) { + Map map = this.applyBModeService.dataStatisticsForHospital(startTime, endTime); + return map; + } + + @RequestMapping({"queuing"}) + public Map getQueuing(Long id) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + int people = 0; + int waitTime = 0; + int active = 1; + try { + wrapper.eq("status", "40").eq("active", Integer.valueOf(3)); + wrapper.orderBy("active", false); + List applyBModes = this.applyBModeService.selectList((Wrapper)wrapper); + if (!applyBModes.isEmpty()) + for (int i = 0; i < applyBModes.size(); i++) { + ApplyBMode bMode = applyBModes.get(i); + if (bMode.getId().equals(id)) { + people = i; + waitTime = i * 15; + active = bMode.getActive().intValue(); + break; + } + } + map.put("msg", "1"); + map.put("people", Integer.valueOf(people)); + map.put("waitTime", Integer.valueOf(waitTime)); + map.put("active", Integer.valueOf(active)); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = {Exception.class}) + @RequestMapping({"updateSpecialistBySubmit"}) + public Map updateSpecialistBySubmit(@RequestBody List submitDtos) { + Map map = new HashMap<>(4); + SpecialistSubmitDto submitDto = submitDtos.get(0); + EntityWrapper speWrapper = new EntityWrapper(); + speWrapper.eq("spe_id", submitDto.getContactsId()); + speWrapper.eq("b_id", submitDto.getbId()); + try { + Long bId = null; + String type = null; + int successCount = 0; + ApplyBModeSpecialist bModeSpecialist = (ApplyBModeSpecialist)this.applyBModeSpecialistService.selectOne((Wrapper)speWrapper); + if (bModeSpecialist != null) { + bId = bModeSpecialist.getbId(); + type = bModeSpecialist.getDiagnosisType(); + bModeSpecialist.setSpeId(submitDto.getUserId()); + bModeSpecialist.setSpeName(submitDto.getUserName()); + bModeSpecialist.setState(Integer.valueOf(70)); + boolean updateResult = this.applyBModeSpecialistService.updateById(bModeSpecialist); + if (updateResult) + successCount++; + } + if (submitDtos.size() > 1) + for (int i = 1; i < submitDtos.size(); i++) { + ApplyBModeSpecialist addSpecialist = new ApplyBModeSpecialist(); + addSpecialist.setSpeId(((SpecialistSubmitDto)submitDtos.get(i)).getUserId()); + addSpecialist.setSpeName(((SpecialistSubmitDto)submitDtos.get(i)).getUserName()); + addSpecialist.setState(Integer.valueOf(70)); + if (bId != null && type != null) { + addSpecialist.setbId(bId); + addSpecialist.setDiagnosisType(type); + } + boolean addResult = this.applyBModeSpecialistService.insert(addSpecialist); + if (addResult) + successCount++; + } + if (successCount == submitDtos.size()) + map.put("msg", "1"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/WebContent/META-INF/MANIFEST.MF b/sfu-server/imurs_mediasoup/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/sfu-server/imurs_mediasoup/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/sfu-server/imurs_mediasoup/extract_struct.py b/sfu-server/imurs_mediasoup/extract_struct.py new file mode 100644 index 0000000..21d7ba4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/extract_struct.py @@ -0,0 +1,74 @@ +import os +import re + +entity_dir = r"d:/Projects/洛川康复中医院/imurs/src/main/java/com/imurs/entity" + +# Header +print("| Table Name | Entity Class | Description |") +print("| :--- | :--- | :--- |") + +files = sorted([f for f in os.listdir(entity_dir) if f.endswith(".java")]) + +for f in files: + path = os.path.join(entity_dir, f) + content = "" + try: + with open(path, 'r', encoding='utf-8') as file: + content = file.read() + except UnicodeDecodeError: + try: + with open(path, 'r', encoding='gbk') as file: + content = file.read() + except: + pass + + if not content: + continue + + # Extract Table Name + table_match = re.search(r'@TableName\s*\(\s*(?:value\s*=\s*)?"([^"]+)"\s*\)', content) + if not table_match: + table_match = re.search(r"@TableName\s*\(\s*(?:value\s*=\s*)?'([^']+)'\s*\)", content) + + table_name = table_match.group(1) if table_match else "" + + # Extract Class Name + class_match = re.search(r'public\s+class\s+(\w+)', content) + class_name = class_match.group(1) if class_match else f.replace(".java", "") + + # Extract Description + description = "" + if class_match: + start_index = class_match.start() + # Search backwards from class definition + preceding = content[:start_index] + # Find all javadoc blocks + # We want the one closest to the class def, but typically it is the last one in 'preceding' + # unless there are other methods/fields above (unlikely for entity start) + comments = list(re.finditer(r'/\*\*(.*?)\*/', preceding, re.DOTALL)) + if comments: + # Use the last one + last_comment = comments[-1] + raw_comment = last_comment.group(1) + + # Clean comment + lines = raw_comment.split('\n') + desc_lines = [] + for line in lines: + line = line.strip() + # Remove comment markers * + line = re.sub(r'^\*+', '', line).strip() + + if not line: + continue + if line.startswith("@"): + continue + desc_lines.append(line) + + description = " ".join(desc_lines) + + # Escape pipes + description = description.replace("|", "\\|") + + if table_name: + print(f"| `{table_name}` | `{class_name}` | {description} |") diff --git a/sfu-server/imurs_mediasoup/lunqin.iml b/sfu-server/imurs_mediasoup/lunqin.iml new file mode 100644 index 0000000..1daccae --- /dev/null +++ b/sfu-server/imurs_mediasoup/lunqin.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/mapping_with_desc.md b/sfu-server/imurs_mediasoup/mapping_with_desc.md new file mode 100644 index 0000000..371d784 Binary files /dev/null and b/sfu-server/imurs_mediasoup/mapping_with_desc.md differ diff --git a/sfu-server/imurs_mediasoup/mapping_with_desc_v2.md b/sfu-server/imurs_mediasoup/mapping_with_desc_v2.md new file mode 100644 index 0000000..593d8fa Binary files /dev/null and b/sfu-server/imurs_mediasoup/mapping_with_desc_v2.md differ diff --git a/sfu-server/imurs_mediasoup/pom.xml b/sfu-server/imurs_mediasoup/pom.xml new file mode 100644 index 0000000..5ee70db --- /dev/null +++ b/sfu-server/imurs_mediasoup/pom.xml @@ -0,0 +1,537 @@ + + 4.0.0 + com.imurs + lunqin + 0.0.1-SNAPSHOT + jar + + imurs + Demo project for Spring Boot + + org.springframework.boot + spring-boot-starter-parent + 2.3.7.RELEASE + + + + + + + + + + org.springframework.boot + spring-boot-starter-cache + + + com.alibaba + easyexcel + 1.1.2-beta5 + + + org.projectlombok + lombok + 1.18.30 + true + + + org.elasticsearch + elasticsearch + 7.6.2 + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.6.2 + + + + org.springframework.boot + spring-boot-starter-web + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.apache.tomcat + tomcat-servlet-api + 8.0.36 + provided + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.1 + + + mybatis-spring + org.mybatis + + + mybatis + org.mybatis + + + + + + mysql + mysql-connector-java + 5.1.26 + + + io.agora + agora-rest-client-core + 0.1.3-BETA + + + io.agora + authentication + 2.1.2 + + + + com.alibaba + druid + 1.0.29 + + + + com.baomidou + mybatis-plus + 2.0.7 + + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + commons-logging + commons-logging + + + + + + + org.springframework.boot + spring-boot-starter-test + + + + + com.alibaba + fastjson + 1.2.13 + + + + + org.jsoup + jsoup + 1.10.2 + + + + + org.apache.shiro + shiro-spring + 1.3.2 + + + + + org.apache.shiro + shiro-ehcache + 1.3.2 + + + + + org.apache.commons + commons-lang3 + 3.1 + + + + + de.codecentric + spring-boot-admin-starter-client + 2.2.4 + + + + commons-lang + commons-lang + 2.4 + + + commons-beanutils + commons-beanutils + 1.9.3 + + + org.apache.commons + commons-collections4 + 4.4 + + + commons-logging + commons-logging + 1.2 + + + + org.springframework.boot + spring-boot-devtools + true + + + + com.aliyun.oss + aliyun-sdk-oss + 2.8.2 + + + commons-lang + commons-lang + + + commons-logging + commons-logging + + + + + + com.aliyun + aliyun-java-sdk-core + 3.3.1 + + + + com.baomidou + mybatisplus-spring-boot-starter + 1.0.4 + + + + com.thoughtworks.xstream + xstream + 1.4.20 + + + + + net.sourceforge.jexcelapi + jxl + 2.6.12 + + + + log4j + log4j + + + + + + com.xiaoleilu + hutool-all + 3.2.3 + + + + + org.apache.poi + poi + 3.17 + + + com.alibaba + easyexcel + 2.2.11 + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + + + org.dom4j + dom4j + 2.1.1 + + + + org.apache.poi + poi-ooxml + 3.17 + + + org.json + json + 20160810 + + + net.coobird + thumbnailator + 0.4.8 + + + jaxen + jaxen + + + + org.jsoup + jsoup + 1.8.3 + + + org.apache.pdfbox + pdfbox + 1.8.13 + + + commons-logging + commons-logging + + + + + cn.licoy + encrypt-body-spring-boot-starter + 1.0.2.RELEASE + + + + org.bouncycastle + bcprov-ext-jdk15on + 1.59 + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 2.1.2 + + + + org.springframework.boot + spring-boot-starter-aop + + + + nl.bitwalker + UserAgentUtils + 1.2.4 + + + + + com.aliyun + aliyun-java-sdk-live + 2.3.0 + + + + + + cn.smallbun.screw + screw-core + 1.0.3 + + + fastjson + com.alibaba + + + commons-lang + commons-lang + + + + + + + com.zaxxer + HikariCP + 3.4.5 + + + + + io.github.yedaxia + japidocs + 1.4.3 + + + fastjson + com.alibaba + + + + + + + org.springframework.boot + spring-boot-starter-websocket + + + + com.google.guava + guava + 28.1-jre + + + + com.google.code.gson + gson + 2.8.0 + + + + javax.websocket + javax.websocket-api + 1.1 + provided + + + + + com.google.guava + failureaccess + 1.0.1 + + + org.springframework.security + spring-security-crypto + 5.3.6.RELEASE + + + + + com.google.code.gson + gson + 2.10 + + + + com.aliyun + alibabacloud-ocr_api20210707 + 2.0.3 + + + + com.aliyun + ocr_api20210707 + 2.0.3 + + + com.aliyun + tea-openapi + 0.3.2 + + + com.aliyun + tea-console + 0.0.1 + + + com.aliyun + tea-util + 0.2.21 + + + com.aliyun + darabonba-stream + 0.0.1 + + + + + + compile + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.mybatis.generator + mybatis-generator-maven-plugin + 1.3.5 + + + true + + true + + ${basedir}/src/main/resources/mybatis-generator.xml + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + false + + + + org.springframework.boot + spring-boot-maven-plugin + + true + exec + + + + imurs + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/remove_spaces.py b/sfu-server/imurs_mediasoup/remove_spaces.py new file mode 100644 index 0000000..cbbac0a --- /dev/null +++ b/sfu-server/imurs_mediasoup/remove_spaces.py @@ -0,0 +1,18 @@ +import sys + +path = r'd:/Projects/洛川康复中医院/imurs/src/main/java/com/imurs/controller/ApplyBModeController.java' + +try: + with open(path, 'r', encoding='utf-8') as f: + content = f.read() + + # Remove spaces: { " -> {" and " } -> "} + new_content = content.replace('{ "', '{"').replace('" }', '"}') + + with open(path, 'w', encoding='utf-8') as f: + f.write(new_content) + + print("Successfully removed spaces from RequestMapping annotations.") +except Exception as e: + print(f"Error: {e}") + sys.exit(1) diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/Application.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/Application.java new file mode 100644 index 0000000..77b7af3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/Application.java @@ -0,0 +1,85 @@ + + +package com.imurs; + +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; + +import org.jasypt.encryption.StringEncryptor; +/** + *运行代码 + */ +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.imurs.util.MsgCode; + + +/** + * springboot口 + * + */ +// 扫描指定包下面的dao接口 +@MapperScan({"com.imurs.shiro","com.imurs.dao"}) +@ServletComponentScan +@SpringBootApplication +@EnableScheduling +@EnableTransactionManagement +@EnableCaching(proxyTargetClass = true) // 开启缓存功能 +public class Application extends SpringBootServletInitializer implements CommandLineRunner { + + + // 入口 + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + System.setProperty("es.set.netty.runtime.available.processors", "false"); + } + + // Java EE应用服务器配置, + // 如果要使用tomcat来加载jsp的话就必须继承SpringBootServletInitializer类并且重写其中configure方法 + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + // springboot运行后此方法首先被调用 + // 实现CommandLineRunner抽象类中的run方法 + @Override + public void run(String... args) throws Exception { + System.out.println("springboot启动完成!"); + System.out.println(" _____ ______ __ __ _____ \r\n" + + " / ____| |___ / \\ \\ / / | __ \\ \r\n" + + " | | __ / / \\ \\_/ / | | | |\r\n" + + " | | |_ | / / \\ / | | | |\r\n" + + " | |__| | / /__ | | | |__| |\r\n" + + " \\_____| /_____| |_| |_____/ \r\n" + + " \r\n" + + " "); + } + /** + * 配置StringEncryptor + */ + @Bean("jasyptStringEncryptor") + public StringEncryptor stringEncryptor() { + PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); + SimpleStringPBEConfig config = new SimpleStringPBEConfig(); + config.setPassword(MsgCode.MYSQL_PUBLICKEY_BD_TEST); + config.setAlgorithm("PBEWithMD5AndDES"); + config.setKeyObtentionIterations("1000"); + config.setPoolSize("1"); + config.setProviderName("SunJCE"); + config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); + config.setStringOutputType("base64"); + encryptor.setConfig(config); + return encryptor; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/AgoreApiController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/AgoreApiController.java new file mode 100644 index 0000000..f96f59b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/AgoreApiController.java @@ -0,0 +1,223 @@ +package com.imurs.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.dto.AgoraLoginUserDTO; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author wdh + */ +@RestController +@RequestMapping("agoraApi") +public class AgoreApiController { + @Autowired + UserService userService; + + /** + * 客户 ID + */ + final String customerKey = "b85a527055eb4b82b06f34d95edcf21c"; + /** + * 客户密钥 + */ + final String customerSecret = "0cc3f5806c6445e69ee233098c7aa78a"; + + /** + * 拼接客户 ID 和客户密钥并使用 base64 编码 + */ + String plainCredentials = customerKey + ":" + customerSecret; + String base64Credentials = new String(Base64.getEncoder().encode(plainCredentials.getBytes())); + /** + * 创建 authorization header + */ + String authorizationHeader = "Basic " + base64Credentials; + + @RequestMapping("getChannel") + public Map test(String appId) throws IOException { + Map map = new HashMap<>(); + //建立URL连接对象 + String httpUrl = "https://api.agora.io/dev/v1/channel/" + appId; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("GET"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + //conn.getOutputStream().write(dataJson.getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("response",data); + return map; + } + + /** + * @param appId appId + * @param cname 频道名 + * @return 踢出该频道的用户 + */ + @RequestMapping("leftChannel") + public Map leftChannel(String appId, String cname) { + Map map = new HashMap<>(8); + // 封禁为加入频道封禁 + String[] privileges = new String[1]; + privileges[0] = "join_channel"; + JSONObject dataJson = new JSONObject(); + dataJson.put("appid",appId); + dataJson.put("cname",cname); + dataJson.put("time",0); + dataJson.put("privileges",privileges); + try { + //建立URL连接对象 + String httpUrl = "https://api.agora.io/dev/v1/kicking-rule"; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("POST"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + conn.getOutputStream().write(dataJson.toString().getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("response",data); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + @RequestMapping("byTime") + public Map byTime() throws IOException { + Map map = new HashMap<>(); + long startTime = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) + .parse("2020-01-30 20:00:00", new ParsePosition(0)).getTime() / 1000; + long endTime= (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) + .parse("2021-02-10 20:00:00", new ParsePosition(0)).getTime() / 1000; + String appid = "dbe6c79f3c8045b4abbf8429838189db"; + String metric = "userCount"; + //建立URL连接对象 + String httpUrl = "https://api.agora.io/beta/live/experience/by_time?start_ts=" + startTime + +"&end_ts=" + endTime + "&appid=" + appid + "&metric=" + metric; + URL url = new URL(httpUrl); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("GET"); + //设置请求头 + conn.setRequestProperty("Content-Type","application/json"); + conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setRequestProperty("Authorization", authorizationHeader); + + //post请求不能使用缓存 + conn.setUseCaches(false); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + //conn.getOutputStream().write(dataJson.getBytes()); + + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容并返回 + String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject data = JSON.parseObject(response); + //关闭连接 + conn.disconnect(); + map.put("data",data); + return map; + } + + @RequestMapping("getHospitalNameByPhone") + public Map getHospitalNameByPhone(String phone) { + Map map = new HashMap<>(8); + try { + User user = userService.selectUserByPhone(phone); + if (user != null) { + map.put("name",user.getHospitalName()); + map.put("msg","1"); + } else { + map.put("msg","2"); + } + } catch (Exception e) { + map.put("msg","4"); + } + return map; + } + + /** + * @param userDTO 用户名 密码 权限id + * @return 监控平台的登录验证 + */ + @RequestMapping("login") + public Map login(@RequestBody AgoraLoginUserDTO userDTO) { + Map map = new HashMap<>(8); + try { + User user = userService.selectOne(new EntityWrapper() + .eq("phone", userDTO.getUsername()) + .eq("password", userDTO.getPassword()) + .eq("rid", userDTO.getRid())); + if (user != null) { + map.put("status","200"); + } else { + map.put("status","404"); + } + } catch (Exception e) { + map.put("status","4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/ApiController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/ApiController.java new file mode 100644 index 0000000..c9afd9e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/api/ApiController.java @@ -0,0 +1,64 @@ +package com.imurs.api; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.jasypt.util.text.BasicTextEncryptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import com.imurs.util.MD5; +import com.imurs.util.MsgCode; + + +@RestController +@RequestMapping("api") +public class ApiController { + + @Autowired + UserService userService; + + + /** + * 查询医生详情 + * sign= MD5(MD5(uid +timestamp)+ secretKey) + */ + @RequestMapping(value = "selectDoctorByPhone",method=RequestMethod.POST) + public Map selectDoctorByPhone(String phone,String timestamp,String sign) { + Map map = new HashMap(); + try { + if(StringUtils.isNotEmpty(phone)&& StringUtils.isNotEmpty(timestamp) && StringUtils.isNotEmpty(sign)){ + //加密判断 + String signServer=MD5.GetMD5Code(MD5.GetMD5Code(phone +timestamp)+ "X8O2b79XiZFVQOX5X049Sw=="); + if(signServer.equals(sign)){ + User user = userService.selectUserByPhone(phone); + if(user!=null){ + BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); + textEncryptor.setPassword(MsgCode.API); + map.put("user",textEncryptor.encrypt(JSON.toJSONString(user))); + + }else{ + map.put("msg", "3"); + } + }else{ + map.put("msg", "1004"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/CorsFilter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/CorsFilter.java new file mode 100644 index 0000000..66c2470 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/CorsFilter.java @@ -0,0 +1,65 @@ +package com.imurs.config; + +import org.springframework.stereotype.Component; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +@Component +public class CorsFilter implements Filter { + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + // 解决跨域问题 + HttpServletResponse res1 = (HttpServletResponse) res; + HttpServletRequest req1 = (HttpServletRequest) req; + res1.setContentType("html;charset=UTF-8"); + // request.setCharacterEncoding("UTF-8"); + res1.setCharacterEncoding("UTF-8"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Origin", "*"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Methods", "POST, GET, + // OPTIONS, DELETE"); + // ((HttpServletResponse) response).setHeader("Access-Control-Max-Age", + // "3600"); + // ((HttpServletResponse) + // response).setHeader("Access-Control-Allow-Headers","x-requested-with,content-type"); + String[] allowdomain = { "http://192.168.1.111:8020", "http://192.168.1.120:8080", "http://192.168.1.3", + "http://127.0.0.1:1002", "http://localhost:8080", "http://localhost:5050" }; + Set allowOrigins = new HashSet(Arrays.asList(allowdomain)); + String origionHeader = req1.getHeader("origin"); + // System.out.println("origin" + req1.getHeader("origin")); + + if (origionHeader != null && allowOrigins.contains(origionHeader)) { + //// 指定允许其他域名访问 + res1.setHeader("Access-Control-Allow-Origin", origionHeader); + } else { + res1.setHeader("Access-Control-Allow-Origin", "*"); + } + res1.setHeader("Content-type", "text/html;charset=UTF-8"); + // 响应类型 + res1.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); + res1.setHeader("Access-Control-Max-Age", "3600"); + // 响应头设置 + res1.setHeader("Access-Control-Allow-Headers", + "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token,Authorization"); + res1.setHeader("Access-Control-Allow-Credentials", "true"); + res1.setHeader("XDomainRequestAllowed", "1"); + + // System.out.println("*********************************过滤器被使用**************************"); + chain.doFilter(req, res); + } + + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/ElasticSearchConfig.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/ElasticSearchConfig.java new file mode 100644 index 0000000..e576438 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/ElasticSearchConfig.java @@ -0,0 +1,31 @@ +package com.imurs.config; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author laier + * @date 2022-12-12 14:21 + */ + +@Configuration +public class ElasticSearchConfig { + + @Value("${es.url}") + private String url; + + @Value("${es.port}") + private Integer port; + + public static String index="es_lunqin"; + + @Bean + public RestHighLevelClient client(){ + RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(url, port))); + return client; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/MybatisPlusConfig.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/MybatisPlusConfig.java new file mode 100644 index 0000000..d3a2cab --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/config/MybatisPlusConfig.java @@ -0,0 +1,105 @@ +package com.imurs.config; + +import javax.sql.DataSource; + +import com.baomidou.mybatisplus.mapper.ISqlInjector; +import com.baomidou.mybatisplus.mapper.LogicSqlInjector; +import org.apache.ibatis.logging.stdout.StdOutImpl; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.plugin.Interceptor; +//import org.apache.log4j.Logger; +import org.mybatis.spring.boot.autoconfigure.MybatisProperties; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ResourceLoader; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import com.baomidou.mybatisplus.MybatisConfiguration; +import com.baomidou.mybatisplus.MybatisXMLLanguageDriver; +import com.baomidou.mybatisplus.entity.GlobalConfiguration; +import com.baomidou.mybatisplus.enums.DBType; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean; + +@Configuration +public class MybatisPlusConfig { + @Autowired + private DataSource dataSource; + + @Autowired + private MybatisProperties properties; + + @Autowired + private ResourceLoader resourceLoader = new DefaultResourceLoader(); + + @Autowired(required = false) + private Interceptor[] interceptors; + + @Autowired(required = false) + private DatabaseIdProvider databaseIdProvider; + + // @Autowired + // private MyMetaObjectHandler myMetaObjectHandler; + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor page = new PaginationInterceptor(); + page.setDialectType("mysql"); +// Logger.getLogger(getClass()).info("PaginationInterceptor注入成功!!"); + return page; + } + + /** + * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 配置文件和mybatis-boot的配置文件同步 + * + * @return + */ + @Bean + public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() { + MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean(); + mybatisPlus.setDataSource(dataSource); + mybatisPlus.setVfs(SpringBootVFS.class); + if (StringUtils.hasText(this.properties.getConfigLocation())) { + mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation())); + } + mybatisPlus.setConfiguration(properties.getConfiguration()); + if (!ObjectUtils.isEmpty(this.interceptors)) { + mybatisPlus.setPlugins(this.interceptors); + } + // MP 全局配置,更多内容进入类看注释 + GlobalConfiguration globalConfig = new GlobalConfiguration(); + // 配置公共字段自动填写 + // globalConfig.setMetaObjectHandler(myMetaObjectHandler); + globalConfig.setDbType(DBType.MYSQL.name()); + // ID 策略 AUTO->`0`("数据库ID自增") INPUT->`1`(用户输入ID") + // ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID") + globalConfig.setIdType(3); + mybatisPlus.setGlobalConfig(globalConfig); + MybatisConfiguration mc = new MybatisConfiguration(); + //配置sql日志打印 + mc.setLogImpl(StdOutImpl.class); + mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); + mybatisPlus.setConfiguration(mc); + if (this.databaseIdProvider != null) { + mybatisPlus.setDatabaseIdProvider(this.databaseIdProvider); + } + if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) { + mybatisPlus.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); + } + if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) { + mybatisPlus.setTypeHandlersPackage(this.properties.getTypeHandlersPackage()); + } + if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) { + mybatisPlus.setMapperLocations(this.properties.resolveMapperLocations()); + } + return mybatisPlus; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/constant/ModelActiveConstant.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/constant/ModelActiveConstant.java new file mode 100644 index 0000000..74de726 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/constant/ModelActiveConstant.java @@ -0,0 +1,27 @@ +package com.imurs.constant; + +/** + * @author wang + * @date 2021年08月17日 15:51 + * 超声病例的会诊状态 + */ +public class ModelActiveConstant { + /** + * 超声病例正在进行 + */ + public final static int ACTIVE_DOING = 3; + /** + * 超声病例待审核报告 + */ + public final static int ACTIVE_CHECKING = 2; + /** + * 超声病例未开始会诊 + */ + public final static int ACTIVE_NOT_BEGIN = 1; + /** + * 超声病例已结束 + */ + public final static int ACTIVE_FINISH = 0; + + private ModelActiveConstant() {} +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraController.java new file mode 100644 index 0000000..f74d333 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraController.java @@ -0,0 +1,157 @@ +/* +package com.imurs.controller; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.AgoraRecord; +import com.imurs.oss.AliyunOSSClientUtil; +import com.imurs.service.AgoraRecordService; + + +import io.agora.recording.RecordingSDK; +import io.agora.recording.test.RecordingSample; + +@RestController +@RequestMapping("agora") +public class AgoraController { + private static String isSucess = null; + @Autowired + AgoraRecordService agoraRecordService; + + @RequestMapping("Record") + public String AgnoraRecord(String esrdNumber,String id ){ + + String[] s= {"--appId", "7bbabfd2f5a84a6591fc7b863e2c901e","--uid","0","--channel","1000","--appliteDir","/usr/Agorao/Agorao_Linux_FULL/bin","--isAudioOnly","1","--isVideoOnly","0","--isMixingEnabled","1","--mixedVideoAudio","0","--recordFileRootDir","/usr/recording_output","--idle","10"}; + s[5] = id; + */ +/* RecordingSDK RecordingSdk = new RecordingSDK(); + RecordingSample ars = new RecordingSample(RecordingSdk); + String dir= ars.createChannel(s); + ars.unRegister(); + // + System.out.println("zp AgoraController dir..."+dir);//file directory + File des = new File(dir); + File[] sub =des.listFiles(); + for(File file:sub) { + if(file.isFile()&&file.getName().endsWith(".aac")) { + System.out.println("now exiting .aac...!"+dir+file.getName()); + String s2=excle(dir+file.getName()); + AgoraRecord arec =new AgoraRecord(); + arec.setEsrdNumber(esrdNumber); + arec.setRegDir(s2+".acc");//加文件目录 + boolean isSave=agoraRecordService.insert(arec); + System.out.println("s2"+s2+"保存是否成功"+isSave); + } + }*//* + + excuteAsync(s,esrdNumber); + return "isok"; + } + //需要异步处理的业务方法 + @Async + public String excuteAsync(String[] param,String esrdNumber){ + // do something; + // final String isSucess=""; + Timer timer = new Timer();// 实例化Timer类 + timer.schedule(new TimerTask() { + public void run() { + //System.out.println("退出"); + isSucess=parseAgiao(param,esrdNumber); + this.cancel(); + } + }, 1000);// 这里百毫秒 + return isSucess; + + } + + public String parseAgiao(String[] parms,String esrdNumber ){ + RecordingSDK RecordingSdk = new RecordingSDK(); + RecordingSample ars = new RecordingSample(RecordingSdk); + String dir= ars.createChannel(parms); + ars.unRegister(); + // + // System.out.println("zp AgoraController dir..."+dir);//file directory + boolean isSave=false; + File des = new File(dir); + File[] sub =des.listFiles(); + if(sub.length<0){ + return "无录音文件"; + } + for(File file:sub) { + if(file.isFile()&&file.getName().endsWith(".aac")) { + // System.out.println("now exiting .aac...!"+dir+file.getName()); + String s2=excle(dir+file.getName()); + AgoraRecord arec =new AgoraRecord(); + arec.setEsrdNumber(esrdNumber); + arec.setRegDir(s2+".aac");//加文件目录 + isSave=agoraRecordService.insert(arec); + // System.out.println("s2"+s2+"保存是否成功"+isSave); + } + } + return isSave==true?"保存成功":"保存失败"; + } + public String excle(String fileName) { + AliyunOSSClientUtil.FOLDER = "gansu/record/"; + AliyunOSSClientUtil ossClient = new AliyunOSSClientUtil();// oss上传工具类 + // 文件名称 + String img =fileName; + String fileName1=null; + try { + // 将图片转换输入流 + InputStream is = new FileInputStream(img); + fileName1 =String.valueOf(UUID.randomUUID());//String.valueOf(UUID.randomUUID()); + //System.out.println(fileName1); + // 获取图片后缀名 + URL url = ossClient.uploadObject3OSS(is,fileName1+".aac"); + //System.out.println("url的网址"+url); + is.close(); + // 删除本地文件 + */ +/*File files = new File(img); + if (files.exists()) { + System.gc(); + files.delete(); + }*//* + + //将数据文件保存到数据库里去,按病案号。日期201804011205 到分。id 做主健,可以一个病案号插入多个文件。 + } catch (IOException e) { + e.printStackTrace(); + return "error"; + } + return "gansu/record/"+fileName1; + } + //录音文件查询 + @RequestMapping("selectAgoraById") + public Map selectAgoraById(String id){ + Map map=new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List RecordFileList=new ArrayList(); + try { + wrapper.eq("esrd_number", id); + RecordFileList=agoraRecordService.selectList(wrapper); + map.put("recordlist", RecordFileList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} +*/ diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraRecordController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraRecordController.java new file mode 100644 index 0000000..69d0b91 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AgoraRecordController.java @@ -0,0 +1,433 @@ +package com.imurs.controller; + +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; + +import com.imurs.entity.LayoutConfig; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.*; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.google.gson.JsonArray; +import com.imurs.sound.ConnUtil; + +/** + * 云端录制 + */ +@RestController +@RequestMapping("Agora") +public class AgoraRecordController { + @RequestMapping(method = RequestMethod.POST,value="/StartRecord") + public Map StartRecord(@RequestBody List LayoutConfigList) throws Exception{ + LayoutConfig layoutConfig = LayoutConfigList.get(0); + String appid = layoutConfig.getAppid(); + Integer streamTypes = layoutConfig.getStreamTypes(); + String cname = layoutConfig.getCname(); + Integer channelType = layoutConfig.getChannelType(); + String rdirectory = layoutConfig.getRdirectory(); + String sdirectory = layoutConfig.getSdirectory(); + Integer twidth = layoutConfig.getTwidth(); + JSONObject recordingFileConfig = new JSONObject(); + org.json.JSONArray avFileType = new org.json.JSONArray(); + avFileType.put("hls"); + avFileType.put("mp4"); + recordingFileConfig.put("avFileType",avFileType); + //System.out.println(twidth+"!!!"); + Integer theight = layoutConfig.getTheight(); + Integer fps = layoutConfig.getFps(); + Integer bitrate = layoutConfig.getBitrate(); + Integer mixedVideoLayout = layoutConfig.getMixedVideoLayout(); + + Map map=new HashMap(); + JSONObject nullObj = new JSONObject(); + //合流模式下录制 + String reasourceId = reasourceId(cname,appid); + //System.out.println("查询到的id值"+reasourceId); + String durl = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+reasourceId+"/mode/mix/start"; + //测试超声//测试超声59109db67051428f96346260bda5654b + //正式超声7bbabfd2f5a84a6591fc7b863e2c901e + //System.out.println("请求网站"+durl); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(durl);///inoneagent/bloodoxygen + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject clientRequest = new JSONObject(); + JSONObject recordingConfig = new JSONObject(); + recordingConfig.put("channelType", channelType);//0,通信模式,1,直播模式 + //recordingConfig.put("maxIdleTime", 6);//频道内最长6秒 + //recordingConfig.put("streamTypes", streamTypes);//0,仅录制音频,1,仅录制视频,2,同时录制音视频 + JSONObject transcodingConfig = new JSONObject(); +// transcodingConfig.put("width", width);//宽度 +// transcodingConfig.put("height", height);//高度 + transcodingConfig.put("width", twidth);//宽度 + transcodingConfig.put("height", theight);//高度 + transcodingConfig.put("fps", fps);//帧率 + transcodingConfig.put("bitrate", bitrate);//码率 + + //2020.10.28修改xfh + transcodingConfig.put("mixedVideoLayout",mixedVideoLayout);//0、1、2 为预设的合流布局,3 为自定义合流布局 + //System.out.println(transcodingConfig+"~~~~~~~~~~~~~~~"); + org.json.JSONArray config = new org.json.JSONArray(); + for (int i=1;i StopRecord(String appid,String cname,String resourceid,String sid,String uid ) throws Exception{ + Map map=new HashMap(); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + String STOPURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+resourceid+"/sid/"+sid+"/mode/mix/stop"; + URL url = new URL(STOPURL);///inoneagent/bloodoxygen + // System.out.println("结束网址"+url); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + // System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + JSONObject clientRequest = new JSONObject(); + clientRequest.put("async_stop",true); + params.put("cname",cname);//待录制的频道名 + params.put("uid","16555"); + params.put("clientRequest",clientRequest); + //params.put("clientRequest",storageConfig); + // System.out.println("打印参数"+params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ""; + try{ + result = ConnUtil.getResponseString(conn); + // map.put("error", result); + }catch (Exception e){ + String s= e.toString(); + + // e.printStackTrace(); + //System.out.println(s); + map.put("error", s); + return map ; + } + + //System.out.println("收到的结果"+result); + //获取存储文件列表名字。 + JSONObject jsonObject = new JSONObject(result); + // String bsid = jsonObject.getString("serverResponse"); + JSONObject sr= (JSONObject) jsonObject.get("serverResponse"); + org.json.JSONArray fileList = sr.getJSONArray("fileList"); + + /* + * for (int i = 0; i < fileList.length(); i++) { JSONObject fileObj = + * fileList.getJSONObject(i); fileNameList.add(fileObj.getString("fileName"));; + * } + */ + JSONObject fileObj = fileList.getJSONObject(0); + String flie= fileObj.getString("fileName"); + //pfile.p + //System.out.println("文件列表"+flie); + map.put("recordfile", flie); + return map; + + } + //query请求,不需要等待15秒就可以返回文件 + @RequestMapping(method = RequestMethod.POST,value="/QueryRecord") + public Map QueryRecord(String appid,String resourceid,String sid ) throws Exception{ + Map map=new HashMap(); + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + String STOPURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/resourceid/"+resourceid+"/sid/"+sid+"/mode/mix/query"; + URL url = new URL(STOPURL);///inoneagent/bloodoxygen + // System.out.println("结束网址"+url+"网址结束了"); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + JSONObject clientRequest = new JSONObject(); + //params.put("cname","1000");//待录制的频道名 + //params.put("uid","98765"); + // params.put("clientRequest",clientRequest); + // params.put("clientRequest",storageConfig); + System.out.println(params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + //conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + JSONObject sr= (JSONObject) jsonObject.get("serverResponse"); + String flie= sr.getString("fileList"); + map.put("recordfile", flie); + return map; + + } + //获取请求ID + private String reasourceId(String cname,String appid) throws Exception, Exception{ + String RIDURL = "https://api.sd-rtn.com/v1/apps/"+appid+"/cloud_recording/acquire"; + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(RIDURL); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + JSONObject params = new JSONObject(); + //待录制的频道名 + JSONObject clientRequestObj = new JSONObject(); + clientRequestObj.put("resourceExpiredHour",24); + clientRequestObj.put("scene",0); + params.put("cname",cname); + params.put("uid","16555"); + params.put("clientRequest",clientRequestObj); + //System.out.println("参数呃呃呃id"+params); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + //basic 后面的值是通过客户ID 和证书 通过BASE64认证生成的 + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result =""; + try{ + result = ConnUtil.getResponseString(conn); + }catch (Exception e){ + return "获取reasourceId失败"; + } + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + return jsonObject.get("resourceId").toString(); + } + + @PostMapping("/startPageRecord") + public Map startPageRecord(@RequestBody List LayoutConfigList) throws Exception{ + LayoutConfig layoutConfig = LayoutConfigList.get(0); + String appid = layoutConfig.getAppid(); + String cname = layoutConfig.getCname(); + String rdirectory = layoutConfig.getRdirectory(); + String sdirectory = layoutConfig.getSdirectory(); + Integer twidth = layoutConfig.getTwidth(); + Integer theight = layoutConfig.getTheight(); + String url = layoutConfig.getUrl(); + + Map map = new HashMap<>(8); + JSONObject clientRequestObj = new JSONObject(); + clientRequestObj.put("resourceExpiredHour",24); + clientRequestObj.put("scene",1); + + String resourceId = reasourceId(cname,appid); + + String pageUrl = "https://api.sd-rtn.com/v1/apps/" + appid + "/cloud_recording/resourceid/" + resourceId + "/mode/web/start"; + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL postUrl = new URL(pageUrl); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + + JSONObject serviceParam = new JSONObject(); + JSONObject extensionServicesObj = new JSONObject(); + org.json.JSONArray extensionServices = new org.json.JSONArray(); + JSONObject extensionServiceConfig = new JSONObject(); + + serviceParam.put("url",url); + serviceParam.put("audioProfile",0); + serviceParam.put("videoWidth",twidth); + serviceParam.put("videoHeight",theight); + serviceParam.put("maxRecordingHour",72); + + extensionServicesObj.put("serviceName","web_recorder_service"); + extensionServicesObj.put("errorHandlePolicy","error_abort"); + extensionServicesObj.put("serviceParam",serviceParam); + + extensionServices.put(extensionServicesObj); + + extensionServiceConfig.put("errorHandlePolicy","error_abort"); + extensionServiceConfig.put("extensionServices",extensionServices); + + JSONObject recordingFileConfig = new JSONObject(); + org.json.JSONArray avFileType = new org.json.JSONArray(); + avFileType.put("hls"); + avFileType.put("mp4"); + recordingFileConfig.put("avFileType",avFileType); + + JSONObject storageConfig = new JSONObject(); + org.json.JSONArray fileNamePrefix = new org.json.JSONArray(); + fileNamePrefix.put(rdirectory); + fileNamePrefix.put(sdirectory); + storageConfig.put("vendor",2); + storageConfig.put("region",6); + storageConfig.put("bucket","ydlqcs"); + storageConfig.put("accessKey","LTAImVN6wtEJLfH1"); + storageConfig.put("secretKey","lO7FsV3pxSaP6lcd8KP9SsfBIeFhPw"); + storageConfig.put("fileNamePrefix",fileNamePrefix); + + JSONObject clientRequest = new JSONObject(); + //clientRequest.put("token",""); + clientRequest.put("extensionServiceConfig",extensionServiceConfig); + clientRequest.put("recordingFileConfig",recordingFileConfig); + clientRequest.put("storageConfig",storageConfig); + + JSONObject params = new JSONObject(); + params.put("cname",cname); + params.put("uid","16555"); + params.put("clientRequest",clientRequest); + System.out.println("======格式======>" + params); + + HttpsURLConnection conn= (HttpsURLConnection) postUrl.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json;charset=utf-8"); + conn.addRequestProperty("Authorization", "Basic M2Q5NzY0NzYyNTEwNGNmODg0YjAyM2Q0MWU1NzYzNDQ6MzFjZGFhNWU4Njk0NDJlYzg0YWZmMGI0NTM1NGE5NTA="); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result =""; + try{ + result = ConnUtil.getResponseString(conn); + }catch (Exception e){ + String s= e.toString(); + map.put("error", s); + return map; + } + //获取成功录制后得SID + JSONObject jsonObject = new JSONObject(result); + System.out.println(jsonObject); + String bsid = jsonObject.getString("sid"); + map.put("sid", bsid); + map.put("resourceid", resourceId); + return map; + } + /* + * private String Toeknid(String cname,String appid,String uid) throws + * Exception, Exception{ String appCertificate + * ="c2809b8ba09e431e84097d60b4406e0a"; int tokenExpirationInSeconds = 3600; int + * privilegeExpirationInSeconds = 3600; RtcTokenBuilder2 token = new + * RtcTokenBuilder2(); String result = token.buildTokenWithUserAccount(appid, + * appCertificate, cname, uid, Role.ROLE_PUBLISHER, tokenExpirationInSeconds, + * privilegeExpirationInSeconds); System.out.printf("Token with uid: %s\n", + * result); return uid; + * + * } + */ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AiQcController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AiQcController.java new file mode 100644 index 0000000..d06d620 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/AiQcController.java @@ -0,0 +1,47 @@ +package com.imurs.controller; + +import com.imurs.entity.AiQcVocabulary; +import com.imurs.service.AiQcVocabularyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.Map; + +/** + * AI 质控词库管理接口 + */ +@RestController +@RequestMapping("/ai/vocab") +public class AiQcController { + + @Autowired + private AiQcVocabularyService aiQcVocabularyService; + + /** + * 专家提交纠错建议 + */ + @PostMapping("/suggest") + public Map suggestVocab(@RequestBody AiQcVocabulary vocab) { + Map res = new HashMap<>(); + try { + // 设置初始状态为待审核 + vocab.setStatus("draft"); + vocab.setFrequency(1); + if (vocab.getVocabType() == null) + vocab.setVocabType("L3"); + + boolean success = aiQcVocabularyService.insert(vocab); + if (success) { + res.put("msg", 1); + res.put("data", "提交成功,感谢您的反馈!"); + } else { + res.put("msg", 0); + res.put("data", "提交失败"); + } + } catch (Exception e) { + res.put("msg", 0); + res.put("data", "服务器错误: " + e.getMessage()); + } + return res; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Aliocr.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Aliocr.java new file mode 100644 index 0000000..1dd168c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Aliocr.java @@ -0,0 +1,27 @@ +package com.imurs.controller; + +import java.io.InputStream; +import java.util.Map; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.imurs.ocr.Sample; + +@RestController +@RequestMapping(value="aocr") +public class Aliocr { + @RequestMapping(value = "/aliocr") + public String saveImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + String s =Sample.aliocr(is); + return s; + } + @RequestMapping(value = "/bocr") + public Map bImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + Map s =Sample.BaiduOcrRecognition("1"); + return s; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeController.java new file mode 100644 index 0000000..103cfe9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeController.java @@ -0,0 +1,757 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.dto.SpecialistSubmitDto; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyBModeSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.BModeReportService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.service.impl.ApplyBModeServiceImpl; +import com.imurs.service.impl.BmodeMachineModelServiceImpl; +import com.imurs.util.DateUtils; +import com.imurs.util.page.Pagetion; + +import io.netty.util.internal.StringUtil; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Controller +@RestController +@RequestMapping({ "bmode" }) +public class ApplyBModeController { + @Autowired + ApplyBModeService applyBModeService; + + @Autowired + ApplyBModeServiceImpl applyBModeServiceImpl; + + @Autowired + PatientService patientService; + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + + @Autowired + UserService userService; + + @Autowired + BmodeMachineModelServiceImpl bmodeMachineModelServiceImpl; + @Autowired + BModeReportService bModeReportService; + + @Transactional + @RequestMapping({ "insertBmodeImg" }) + public Map insertBmodeImg(@RequestBody List abmiList) { + Map map = new HashMap<>(); + try { + if (!abmiList.isEmpty()) { + boolean result = this.applyBModeImgService.insertBatch(abmiList); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({ "insertBmodeold" }) + public Map insertBmodeold(@RequestBody List abmList) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!abmList.isEmpty() && abmList.get(0) != null) { + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()) + .eq("category_hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()).and() + .ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and() + .le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + abm.setBtype(DateUtils.format(date, "yyyyMMdd") + "0" + abmNo); + // abm.setGroupDate(new Timestamp(date.getTime())); + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (result == true) { + map.put("id", ((ApplyBMode) abmList.get(0)).getId()); + map.put("msg", "1"); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getHisEsrdNumber())) { + wrapper.eq("his_esrd_number", ((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + } else { + wrapper.eq("out_patien", ((ApplyBMode) abmList.get(0)).getOutPatien()); + wrapper2.eq("out_patien", ((ApplyBMode) abmList.get(0)).getOutPatien()); + } + wrapper.eq("hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()); + Patient patient2 = (Patient) this.patientService.selectOne((Wrapper) wrapper); + wrapper2.eq("hospital_id", ((ApplyBMode) abmList.get(0)).getGroupHospitalId()); + Patient patient3 = (Patient) this.patientService.selectOne((Wrapper) wrapper2); + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtCard())) + patient.setCard(((ApplyBMode) abmList.get(0)).getPtCard()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getSex())) + patient.setSex(((ApplyBMode) abmList.get(0)).getSex()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPatientName())) + patient.setPatientName(((ApplyBMode) abmList.get(0)).getPatientName()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtCity())) + patient.setFamily(((ApplyBMode) abmList.get(0)).getPtCity()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getPtPhone())) + patient.setPhone(((ApplyBMode) abmList.get(0)).getPtPhone()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getHisEsrdNumber())) + patient.setHisEsrdNumber(((ApplyBMode) abmList.get(0)).getHisEsrdNumber()); + if (StringUtils.isNotEmpty(((ApplyBMode) abmList.get(0)).getOutPatien())) + patient.setOutPatien(((ApplyBMode) abmList.get(0)).getOutPatien()); + if (patient2 == null) { + patient.setHospitalId(((ApplyBMode) abmList.get(0)).getCategoryHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = "yd03" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(((ApplyBMode) abmList.get(0)).getGroupHospitalId()); + result = this.patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber : ("yd03" + patient.getId()); + patient.setEsrdNumber(ptEsrdNumber); + this.patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + Long id = ((ApplyBMode) abmList.get(0)).getId(); + ((ApplyBMode) abmList.get(0)).setEsrdNumber(ptEsrdNumber); + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) + ((ApplyBModeImg) ImgList.get(i)).setbId(id); + this.applyBModeImgService.insertBatch(ImgList); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = Exception.class) + @RequestMapping({ "insertBmode" }) + public Map insertBmode(@RequestBody List abmList) { + Map map = new HashMap<>(); + + try { + if (abmList == null || abmList.isEmpty() || abmList.get(0) == null) { + map.put("msg", "3"); + return map; + } + + Date date = new Date(); + Wrapper bModeWrapper = (new EntityWrapper()) + .eq("category_hospital_id", ((ApplyBMode) abmList.get(0)).getCategoryHospitalId()).and() + .ge("group_date", DateUtils.formatDateTime(DateUtils.getDateStart(date))).and() + .le("group_date", DateUtils.formatDateTime(DateUtils.getDateEnd(date))); + Integer size = Integer.valueOf(this.applyBModeService.selectCount(bModeWrapper)); + Integer abmNo = Integer.valueOf(size.intValue() + 1); + ApplyBMode abm = abmList.get(0); + // New ID Generation Logic: Hex(CRC32(4)) + yyyyMMddHHmmss + Seq(2) + String categoryHospitalId = abm.getCategoryHospitalId(); + java.util.zip.CRC32 crc32 = new java.util.zip.CRC32(); + crc32.update(categoryHospitalId.getBytes()); + String hexCrc = Long.toHexString(crc32.getValue()).toUpperCase(); + // Ensure CRC is exactly 4 characters + if (hexCrc.length() > 4) { + hexCrc = hexCrc.substring(0, 4); + } else { + hexCrc = String.format("%-4s", hexCrc).replace(' ', '0'); + } + + String dateStr = DateUtils.format(date, "yyyyMMddHHmmss"); + String sequence = String.format("%02d", abmNo % 100); // 2-digit sequence + + String eid = hexCrc + dateStr + sequence; + abm.setEsrdNumber(eid); + // 如果医生填了就用医生的,如果没填就用系统生成的 + if (StringUtils.isEmpty(abm.getBtype())) { + abm.setBtype(eid); // 只有在前端没传值(为空)的时候,才把系统生成的号给它 + } + boolean result = this.applyBModeService.insert(abmList.get(0)); + if (!result) { + throw new RuntimeException("主表插入失败"); // 触发回滚 + } + + map.put("id", ((ApplyBMode) abmList.get(0)).getId()); + + Long id = ((ApplyBMode) abmList.get(0)).getId(); + + this.applyBModeService.updateById(abmList.get(0)); + ApplyBMode applyBMode = abmList.get(0); + List ImgList = applyBMode.getAbmList(); + if (!ImgList.isEmpty()) { + for (int i = 0; i < ImgList.size(); i++) { + ((ApplyBModeImg) ImgList.get(i)).setbId(id); + // ImgList.forEach(img -> img.setbId(abm.getId())); + + } + boolean iresult = this.applyBModeImgService.insertBatch(ImgList); + if (!iresult) { + throw new RuntimeException("图像表插入失败"); // 触发回滚 + } + + } + map.put("msg", "1"); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateBmode" }) + public Map updateBmode(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(8); + boolean result = false; + try { + if (applyBMode != null) + result = this.applyBModeService.updateBmodeById(applyBMode); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateBmodeImg" }) + public Map updateBmodeImg(@RequestBody List acList) { + ApplyBMode applyBMode = acList.get(0); + Map map = new HashMap<>(); + try { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", applyBMode.getId()); + List idList = this.applyBModeImgService.selectList((Wrapper) wrapper); + List abmList = applyBMode.getAbmList(); + if (!idList.isEmpty()) { + if (!abmList.isEmpty()) { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } else { + for (ApplyBModeImg applyBModeImg : idList) { + if (applyBModeImg.getType().intValue() != 32) + this.applyBModeImgService.deleteById(applyBModeImg.getId()); + } + } + } else if (!abmList.isEmpty()) { + for (int i = 0; i < abmList.size(); i++) { + ApplyBModeImg applyBModeImg = abmList.get(i); + applyBModeImg.setbId(applyBMode.getId()); + this.applyBModeImgService.insert(applyBModeImg); + } + } + boolean result = this.applyBModeService.updateById(applyBMode); + map.put("msg", (result == true) ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional + @RequestMapping({ "deleteBmodeById" }) + public Map deleteBmodeById(Long id) { + Map map = new HashMap<>(); + try { + boolean result = this.applyBModeService.deleteById(id); + if (result == true) { + map.put("b_id", id); + this.applyBModeImgService.deleteByMap(map); + bModeReportService.deleteByMap(map); + applyBModeSpecialistService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeByIdnew" }) + public Map selectBmodeByIdnew(Long id, HttpSession session) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode) this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User) this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist) abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist) abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist) abmSp.get(0)).getSpeId(); + // 医生删了 那user 就为null 2025 0211 + User selectById = (User) this.userService.selectById(speId); + if (selectById != null) + phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + // 锁定的机制,查询的时候 保存,而且只有状态status为40的 + String status = applyBMode.getStatus(); + if (status.equals("40")) { + System.out.println("状态为" + status); + String name = (String) session.getAttribute("name"); + // System.out.println("用户"+usr); + EntityWrapper wrapperu = new EntityWrapper(); + User u = userService.selectOne(wrapperu); + long rid = u.getRid(); + if (rid == 6) {// 如果是专家操作,就保存对应的操作者医生名字。 + ApplyBMode applyBMode2 = new ApplyBMode(); + applyBMode2.setLoginDoc(name); + // System.out.println("数据为"+applyBMode2.getLoginDoc()); + EntityWrapper wrapper4 = new EntityWrapper(); + wrapper4.eq("id", id); + if (applyBMode2.getLoginDoc() != null) { + boolean issucess = applyBModeService.update(applyBMode2, wrapper4); + } + + } + // System.out.println("更新是否成功"+issucess); + + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeById" }) + public Map selectBmodeById(Long id) { + Map map = new HashMap<>(); + String account = ""; + String phone = ""; + ApplyBMode applyBMode = new ApplyBMode(); + List abmList = new ArrayList<>(); + List abmSp = new ArrayList<>(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + try { + applyBMode = (ApplyBMode) this.applyBModeService.selectById(id); + if (applyBMode != null) { + map.put("patientType", applyBMode.getPatientType()); + User user = (User) this.userService.selectById(applyBMode.getDocId()); + if (user != null) + account = user.getPhone(); + wrapper2.eq("b_id", id); + abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper2); + map.put("b_id", id); + wrapper.eq("b_id", id); + abmList = this.applyBModeImgService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty() && abmSp.get(0) != null) { + applyBMode.setSpecialist(((ApplyBModeSpecialist) abmSp.get(0)).getSpeName()); + applyBMode.setSpecialistId(((ApplyBModeSpecialist) abmSp.get(0)).getSpeId()); + Long speId = ((ApplyBModeSpecialist) abmSp.get(0)).getSpeId(); + User selectById = (User) this.userService.selectById(speId); + if (selectById != null) + phone = selectById.getPhone(); + + // phone = selectById.getPhone(); + } + } + map.put("abmSp", abmSp); + map.put("applyBMode", applyBMode); + map.put("abmList", abmList); + map.put("contactPhone", account); + map.put("phone", phone); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodePage" }) + public Map selectBmodePage(String categoryHospitalId, String groupHospitalId, + String startTime, String endTime, + String patientName, Integer pageNo, Integer pageSize, + String conditions, Integer type, String part, Long docId, Integer cureType, + String diagnosisType, String status, String isRemote, + String groupAlias, Long active) { + Map map = new HashMap<>(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + map.put("isRemote", isRemote); + map.put("diagnosisType", diagnosisType); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("status", status); + map.put("groupAlias", groupAlias); + map.put("active", active); + if (!StringUtil.isNullOrEmpty(conditions)) { + map.put("conditions", Arrays.asList(conditions.split(","))); + } + + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + try { + Pagetion pagetion = this.applyBModeService.selectBmodePage(map, pageNo, pageSize); + map.clear(); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((ApplyBMode) pagetion.getList().get(i)).getId()).ne("state", "80"); + List abmSp = this.applyBModeSpecialistService.selectList((Wrapper) wrapper); + if (!abmSp.isEmpty()) + ((ApplyBMode) pagetion.getList().get(i)).setAbmSp(abmSp); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + map.remove("cureType"); + map.remove("status"); + } + return map; + } + + @RequestMapping({ "insertBModeSpecialist" }) + public Map insertBModeSpecialist(@RequestBody List acList) { + Map map = new HashMap<>(); + boolean insert = false; + try { + Long bId = ((ApplyBModeSpecialist) acList.get(0)).getbId(); + EntityWrapper bModeWrapper = new EntityWrapper(); + bModeWrapper.eq("id", bId); + ApplyBMode bMode = (ApplyBMode) this.applyBModeService.selectOne((Wrapper) bModeWrapper); + for (ApplyBModeSpecialist applyBModeSpecialist : acList) { + EntityWrapper wrapper = new EntityWrapper(); + if (applyBModeSpecialist.getbId() != null && applyBModeSpecialist.getSpeId() != null) { + wrapper.eq("b_id", applyBModeSpecialist.getbId()) + .eq("spe_id", applyBModeSpecialist.getSpeId()); + ApplyBModeSpecialist queryApply = (ApplyBModeSpecialist) this.applyBModeSpecialistService + .selectOne((Wrapper) wrapper); + if (queryApply != null) { + applyBModeSpecialist.setId(queryApply.getId()); + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.updateById(applyBModeSpecialist); + } else { + applyBModeSpecialist.setGroupDate(bMode.getGroupDate()); + insert = this.applyBModeSpecialistService.insert(applyBModeSpecialist); + } + } + if (!insert) + break; + } + map.put("msg", insert ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "updateConSpecialist" }) + public Map updateConSpecialist(ApplyBModeSpecialist abmSp) { + ApplyBMode bmode = (ApplyBMode) this.applyBModeService.selectById(abmSp.getbId()); + Map map = new HashMap<>(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + EntityWrapper wrapper = new EntityWrapper(); + String status = ""; + try { + if (abmSp != null) { + abmSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", abmSp.getSpeId()).eq("b_id", abmSp.getbId()); + boolean result = this.applyBModeSpecialistService.update(abmSp, (Wrapper) wrapper); + if (result == true) { + if ("1".equals(bmode.getConsultationWay())) { + status = abmSp.getState() + ""; + } else { + map.put("b_id", abmSp.getbId()); + List accList = this.applyBModeSpecialistService.selectByMap(map); + if (!accList.isEmpty()) { + Map collect = (Map) accList.stream() + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getState, Collectors.counting())); + int sum30 = (collect.get(Integer.valueOf(30)) != null) + ? ((Long) collect.get(Integer.valueOf(30))).intValue() + : 0; + int sum40 = (collect.get(Integer.valueOf(40)) != null) + ? ((Long) collect.get(Integer.valueOf(40))).intValue() + : 0; + int sum80 = (collect.get(Integer.valueOf(80)) != null) + ? ((Long) collect.get(Integer.valueOf(80))).intValue() + : 0; + if (sum40 != 0 && sum30 == 0 && sum80 == 0) { + status = "40"; + } else if (sum80 != 0 && sum40 == 0 && sum30 == 0) { + status = "20"; + } else { + status = "30"; + } + } + } + if (StringUtils.isNotEmpty(status)) { + ApplyBMode ab = new ApplyBMode(); + ab.setStatus(status); + ab.setId(abmSp.getbId()); + ab.setDismissReason(abmSp.getDismissReason()); + this.applyBModeService.updateById(ab); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping({ "selectBmodeSpePage" }) + public Map selectBmodeSpePage(Integer pageNo, String categoryHospitalId, String conditions, + Integer pageSize, String patientName, String startTime, String endTime, String specialistId, Integer cureType, + String diagnosisType, Integer part, Integer type, String status) { + Map map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + map.put("patientName", patientName); + map.put("categoryHospitalId", categoryHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId", specialistId); + map.put("cureType", Integer.valueOf((cureType == null) ? 1 : cureType.intValue())); + map.put("diagnosisType", diagnosisType); + map.put("part", part); + map.put("type", type); + map.put("status", status); + map.put("conditions", conditions); + try { + Pagetion> pagetion = this.applyBModeService.selectBmodeSpePage(map, pageNo, pageSize); + if (pagetion != null) + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("b_id", ((Map) pagetion.getList().get(i)).get("id")); + List applyBModeSpecialists = this.applyBModeSpecialistService + .selectList((Wrapper) wrapper); + pagetion.getList().get(i).put("abmSp", applyBModeSpecialists); + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("cureType"); + map.remove("part"); + map.remove("type"); + map.remove("status"); + } + return map; + } + + @RequestMapping({ "selectMachineModel" }) + public Map selectMachineModel() { + Map map = this.bmodeMachineModelServiceImpl.selectMachineModel(); + return map; + } + + @RequestMapping({ "DataStatistics" }) + public Map DataStatistics() { + Map dataStatistics = this.applyBModeServiceImpl.DataStatistics(); + return dataStatistics; + } + + @RequestMapping({ "categoryHospitalStatistics" }) + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = this.applyBModeService.categoryHospitalStatistics(id, startTime, endTime); + return map; + } + + @RequestMapping({ "manageHospitalDataStatistics" }) + public Map dataStatisticsForHospital(String startTime, String endTime) { + Map map = this.applyBModeService.dataStatisticsForHospital(startTime, endTime); + return map; + } + + @RequestMapping({ "queuing" }) + public Map getQueuing(Long id) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper(); + int people = 0; + int waitTime = 0; + int active = 1; + try { + wrapper.eq("status", "40").eq("active", Integer.valueOf(3)); + wrapper.orderBy("active", false); + List applyBModes = this.applyBModeService.selectList((Wrapper) wrapper); + if (!applyBModes.isEmpty()) + for (int i = 0; i < applyBModes.size(); i++) { + ApplyBMode bMode = applyBModes.get(i); + if (bMode.getId().equals(id)) { + people = i; + waitTime = i * 15; + active = bMode.getActive().intValue(); + break; + } + } + map.put("msg", "1"); + map.put("people", Integer.valueOf(people)); + map.put("waitTime", Integer.valueOf(waitTime)); + map.put("active", Integer.valueOf(active)); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @Transactional(rollbackFor = { Exception.class }) + @RequestMapping({ "updateSpecialistBySubmit" }) + public Map updateSpecialistBySubmit(@RequestBody List submitDtos) { + Map map = new HashMap<>(4); + SpecialistSubmitDto submitDto = submitDtos.get(0); + EntityWrapper speWrapper = new EntityWrapper(); + speWrapper.eq("spe_id", submitDto.getContactsId()); + speWrapper.eq("b_id", submitDto.getbId()); + try { + Long bId = null; + String type = null; + int successCount = 0; + ApplyBModeSpecialist bModeSpecialist = (ApplyBModeSpecialist) this.applyBModeSpecialistService + .selectOne((Wrapper) speWrapper); + if (bModeSpecialist != null) { + bId = bModeSpecialist.getbId(); + type = bModeSpecialist.getDiagnosisType(); + bModeSpecialist.setSpeId(submitDto.getUserId()); + bModeSpecialist.setSpeName(submitDto.getUserName()); + bModeSpecialist.setState(Integer.valueOf(70)); + boolean updateResult = this.applyBModeSpecialistService.updateById(bModeSpecialist); + if (updateResult) + successCount++; + } + if (submitDtos.size() > 1) + for (int i = 1; i < submitDtos.size(); i++) { + ApplyBModeSpecialist addSpecialist = new ApplyBModeSpecialist(); + addSpecialist.setSpeId(((SpecialistSubmitDto) submitDtos.get(i)).getUserId()); + addSpecialist.setSpeName(((SpecialistSubmitDto) submitDtos.get(i)).getUserName()); + addSpecialist.setState(Integer.valueOf(70)); + if (bId != null && type != null) { + addSpecialist.setbId(bId); + addSpecialist.setDiagnosisType(type); + } + boolean addResult = this.applyBModeSpecialistService.insert(addSpecialist); + if (addResult) + successCount++; + } + if (successCount == submitDtos.size()) + map.put("msg", "1"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeImageController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeImageController.java new file mode 100644 index 0000000..7142ecd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyBModeImageController.java @@ -0,0 +1,68 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.controller.ApplyBModeImageController; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.service.ApplyBModeImgService; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"modeImage"}) +public class ApplyBModeImageController { + Logger logger = LoggerFactory.getLogger(ApplyBModeImageController.class); + + @Autowired + ApplyBModeImgService applyBModeImgService; + + @PostMapping({"insertBModeImage"}) + public Map insertBModeImage(@RequestBody ApplyBModeImg applyBModeImg) { + Map resultMap = new HashMap<>(8); + try { + this.applyBModeImgService.insert(applyBModeImg); + resultMap.put("msg", "1"); + resultMap.put("applyBModeImg", applyBModeImg); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } + + @RequestMapping({"deleteBmodeById"}) + public Map deleteBmodeById(Long imageId) { + Map resultMap = new HashMap<>(8); + try { + this.applyBModeImgService.deleteById(imageId); + resultMap.put("msg", "1"); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } + + @GetMapping({"selectBModeImageByBId"}) + public Map selectBModeImageByBId(Long bId) { + Map resultMap = new HashMap<>(8); + try { + List bModeImgs = this.applyBModeImgService.selectList((new EntityWrapper()) + .eq("b_id", bId)); + resultMap.put("bModeImgs", bModeImgs); + resultMap.put("msg", "1"); + } catch (Exception e) { + //this.logger.error(", e); + resultMap.put("msg", "4"); + } + return resultMap; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyCaseController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyCaseController.java new file mode 100644 index 0000000..35a4335 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyCaseController.java @@ -0,0 +1,477 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyCase; +import com.imurs.entity.ApplyCaseImg; +import com.imurs.entity.Patient; +import com.imurs.service.ApplyCaseImgService; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.util.page.Pagetion; + +/** + * + * @author Server + * 就诊表 + */ +@RestController +@RequestMapping("case") +public class ApplyCaseController { + + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyCaseImgService applyCaseImgService; + @Autowired + PatientService patientService; + @Autowired + ApplyInformationService applyInformationService; + + /** + * 批量新增 + * @param acList + * @return + */ + @Transactional + @RequestMapping("insertCase") + public Map insertCase(@RequestBody List acList){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if(!acList.isEmpty() && acList.get(0)!=null){ + //双向转诊数据 + boolean result=applyCaseService.insert(acList.get(0)); + if(result==true){ + map.put("msg", "1"); + //第一次新增时患者表新增 + if(acList.get(0).getHisEsrdNumber()!=null){ + wrapper.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", acList.get(0).getOutPatien()); + wrapper2.eq("out_patien", acList.get(0).getOutPatien()); + } + wrapper.eq("hospital_id", acList.get(0).getHospitalId());; + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", acList.get(0).getPlanHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(acList.get(0).getPtSex())){ + patient.setSex(acList.get(0).getPtSex()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCard())){ + patient.setCard(acList.get(0).getPtCard()); + //patient.setBirthDate(acList.get(0).getPtCard().substring(6, 14)); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtName())){ + patient.setPatientName(acList.get(0).getPtName()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCity())){ + patient.setFamily(acList.get(0).getPtCity()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtPhone())){ + patient.setPhone(acList.get(0).getPtPhone()); + } + if(StringUtils.isNotEmpty(acList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(acList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(acList.get(0).getOutPatien())){ + patient.setOutPatien(acList.get(0).getOutPatien()); + } + + if(patient2==null){ + patient.setHospitalId(acList.get(0).getHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 + ptEsrdNumber="yd02"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + + } + if(patient3==null){ + patient.setHospitalId(acList.get(0).getPlanHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd02"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + Long id=acList.get(0).getId(); + acList.get(0).setEsrdNumber(ptEsrdNumber); + applyCaseService.updateById(acList.get(0)); + + if(!acList.get(0).getAciList().isEmpty()){ + for (int i = 0; i < acList.get(0).getAciList().size(); i++) { + acList.get(0).getAciList().get(i).setCaseId(id); + } + applyCaseImgService.insertBatch(acList.get(0).getAciList()); + } + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 批量修改 + * @param acList + * @return + */ + @RequestMapping("updateCase") + public Map updateCase(ApplyCase applyCase){ + Map map=new HashMap(); + try { + boolean result=applyCaseService.updateById(applyCase); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 发送HIS 系统数据 + * @param acList + * @return + * @throws Exception + */ + /*@RequestMapping("SendHisdate") + public String SendHisdate(String id) throws Exception{ + Map map=new HashMap(); + //msg==1 表示那个确定按钮提交了, + if(!msg.equals("1")||!statu.equals("4")){ + // throw new Exception("双向转诊数据保存失败,或已经是已就诊或已住院状态无法发送信息给HIS"); + return "不是已接受状态或"; + } + //查询患者基本数据 + map.put("id", id); + + Map patientmap = applyCaseService.selectPatientById(map); + if(patientmap==null){ + return "数据库无此人信息"; + } + //取出数据保存在ID还是 数据表里暂时是限定statu=4 + String uniid =patientmap.get("id")+"";//唯一主健值 + String pt_name = patientmap.get("pt_name")+"";//姓名 + String pt_sex = patientmap.get("pt_sex")+"";//性别 + if(pt_sex.equals("男")){ + pt_sex="M"; + }else{ + pt_sex="F"; + } + String pt_card = patientmap.get("pt_card")+"";//身份证 不能为NULL值,由于前端已经做判断,所以不做判断 + String pt_city = patientmap.get("pt_city")+"";//家庭地址 + String pt_phone = patientmap.get("pt_phone")+"";//家庭电话 + String prote_type = patientmap.get("protect_type")+"";//医保类型 + //System.out.println(prote_type); + String protect_type=""; + switch(prote_type){ + case "1": + protect_type="省医保"; + break; + case "2": + protect_type="市职工医保"; + break; + case "3": + protect_type="市居民医保"; + break; + case "4": + protect_type="新农合"; + break; + case "5": + protect_type="自费"; + break; + case "6": + protect_type="异地医保"; + break; + default: + protect_type="其他"; + break; + } + String hospital_name = patientmap.get("hospital_name")+"";//医院名字 + String plan_time = patientmap.get("plan_time")+"";//预约时间 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date tim=simpleDateFormat.parse(plan_time); + String date =new SimpleDateFormat("yyyyMMdd").format(tim); + // System.out.println(date); + String soap = "\n" + + "\n" + + " \n" + + " \n" + + " "+ + ""+pt_name+"^"+pt_sex+"^"+pt_card+"^"+pt_city+"^"+pt_phone+"^"+protect_type+"^"+hospital_name+"^"+date+"^"+uniid+ + "]]> \n"+ + " \n" + + " \n" + + ""; + //地址 + String urlString = "http://220.168.26.57:1001/Service.asmx";//57 + // System.out.println(soap); + //String urlString=""; + //方法 + String soapActionString = "http://cardtest.com/DoInterconnectSave"; + URL url = new URL(urlString); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + + byte[] buf = soap.getBytes(); + // System.out.println(soap); + //设置一些头参数 + httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length)); + httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); + httpConn.setRequestProperty("soapActionString", soapActionString); + httpConn.setRequestMethod("POST"); + //输入参数和输出结果 + + + OutputStream out=null; + try{ + httpConn.setConnectTimeout(30000); + httpConn.setReadTimeout(30000); + httpConn.setDoOutput(true); + httpConn.setDoInput(true); + out = httpConn.getOutputStream(); + out.write(buf); + out.close(); + }catch (Exception e){ + //System.out.println("连接不成功"); + DualReferral_His.sendErrorNotice("15602395710", pt_name+pt_card+"建立连接,不成功,数据未发送成功"); + } + + // int responseCode = httpConn.getResponseCode(); + + if(responseCode!=200){ + //说明网络异常需要重新请求 + //throw new Exception("msg"); + + return "4004";//网络异常,再次请求发送 + } + // new DualReferral_His(); + byte[] datas = DualReferral_His.readInputStream(httpConn.getInputStream()); + String result = new String(datas); + // System.out.println("result:" + result); + //new DualReferral_His(); + //接受返回的数据并解析出 + String result2= DualReferral_His.strToHtml(result); + // System.out.println("解析后的结果"+result2); + String[] ss= parxml2(result2); + System.out.println("ErrorMSg"+ss[0]+"Errorcode"+ss[1]); + if(ss[1].equals("1")){ + //信息保存失败,将患者ID。错误信息发送出去 + // sendNotice("15602395710",ss[0],ss[1]); + DualReferral_His.sendErrorNotice("15602395710", pt_name+pt_card+ss[0]); + } + return ""; + } + + //解析XML格式 + public static String[] parxml2(String xml) throws JDOMException, IOException, DocumentException{ + String reg = "<\\?xml\\s+version=\"1.0\"\\s+encoding=\"(.*?)\"\\?>"; + String result = xml.replaceAll(reg,""); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(result.getBytes())); + String[] paresu =new String[2]; + Element out = + document.getRootElement().element("Body").element("DoInterconnectSaveResponse").element("DoInterconnectSaveResult").element("Response"); + //取2个数据.element("ErrorMsg") + Element out2 = out.element("ErrorMsg"); + Element out3 = out.element("ResultCode"); + paresu[0]=out2.getText(); + paresu[1]=out3.getText(); + System.out.println("return 解析ErrorMsg:"+out2.getText()); + System.out.println("return 解析ResultCode:"+out3.getText()); + return paresu; + + + + }*/ + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteCaseById") + public Map deleteCaseById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyCaseService.deleteById(id); + if(result==true){ + map.put("case_id", id); + applyCaseImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectCaseById") + public Map selectCaseById(Long id){ + Map map=new HashMap(); + ApplyCase applyCase=new ApplyCase(); + List imgList=new ArrayList(); + try { + applyCase=applyCaseService.selectCaseById(id); + if(applyCase!=null){ + map.put("case_id", id); + imgList=applyCaseImgService.selectByMap(map); + } + map.put("applyCase", applyCase); + map.put("imgList", imgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("case_id"); + } + return map; + } + + + /** + * 管理医院转诊列表 + * 基层转出,管理转出 + */ + @RequestMapping("selectCasePage") + public Map selectCasePage(String planHospitalId,String type,String ptName, + String startTime,String endTime,Integer pageNo,Integer pageSize,String hospitalId,Long applyUserId, + Long docUserId,Integer state){ + Map map=new HashMap(); + map.put("planHospitalId", planHospitalId); + map.put("type", type); + map.put("ptName", ptName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + map.put("applyUserId", applyUserId); + map.put("docUserId", docUserId); + map.put("state", state); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion list=applyCaseService.selectCasePage(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("planHospitalId"); + map.remove("type"); + map.remove("ptName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + map.remove("applyUserId"); + map.remove("docUserId"); + map.remove("state"); + } + return map; + } + + /** + * 管理医院转诊列表 + * 管理转入 + */ + @RequestMapping("selectAdminCasePage") + public Map selectAdminCasePage(String planHospitalId,String type,String ptName, + String startTime,String endTime,Integer pageNo,Integer pageSize,String hospitalId, + Long applyUserId,Long docUserId,Integer state,String ptCard,String hisId,String esrdNumber){ + Map map=new HashMap(); + map.put("planHospitalId", planHospitalId); + map.put("type", type); + map.put("ptName", ptName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + map.put("applyUserId", applyUserId); + map.put("docUserId", docUserId); + map.put("state", state); + map.put("hisId", hisId); + map.put("ptCard", ptCard); + map.put("esrdNumber", esrdNumber); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion list=applyCaseService.selectAdminCasePage(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("planHospitalId"); + map.remove("type"); + map.remove("ptName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + map.remove("applyUserId"); + map.remove("docUserId"); + map.remove("state"); + map.remove("hisId"); + map.remove("ptCard"); + map.remove("esrdNumber"); + } + return map; + } + + /** + * 根据身份证号码查看患者信息 + * ORDER BY FIELD(c.statu,1,2,3,4,5,6,7,8,9),c.plan_time DESC + */ + @RequestMapping("selectCaseByCard") + public Map selectCaseByCard(String card){ + Map map=new HashMap(); + List acList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("pt_card", card).orderBy("plan_time",false); + try { + acList=applyCaseService.selectList(wrapper); + map.put("acList", acList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyConsultationController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyConsultationController.java new file mode 100644 index 0000000..2b760b9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyConsultationController.java @@ -0,0 +1,703 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyConsulationSpecialist; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyConsulationSpecialistService; +import com.imurs.service.ApplyConsultationImgService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyLisService; +import com.imurs.service.ApplyPathologyFileService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping(value = "con") +public class ApplyConsultationController { + + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyConsultationImgService applyConsultationImgService; + @Autowired + PatientService patientService; + @Autowired + UserService userService; + @Autowired + ApplyConsulationSpecialistService applyConsulationSpecialistService; + @Autowired + ApplyPathologyFileService applyPathologyFileService; + @Autowired + ApplyLisService applyLisService; + @Autowired + ApplyPathologyService applyPathologyService; + @Autowired + ApplyPathologyImgService applyPathologyImgService; + + + /** + * 批量新增 + * + * @param acList + * @return + */ + @Transactional + @RequestMapping("insertConsultation") + public Map insertConsultation(@RequestBody List acList) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if (!acList.isEmpty() && acList.get(0) != null) { + // 双向转诊数据 + boolean result = applyConsultationService.insert(acList.get(0)); + if (result == true) { + //9.8新增 + map.put("id",acList.get(0).getId()); + map.put("msg", "1"); + + //第一次新增时患者表新增 + if(acList.get(0).getHisEsrdNumber()!=null){ + wrapper.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", acList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", acList.get(0).getOutPatien()); + wrapper2.eq("out_patien", acList.get(0).getOutPatien()); + } + + wrapper.eq("hospital_id", acList.get(0).getCategoryHospitalId()); + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", acList.get(0).getGroupHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(acList.get(0).getSex())){ + patient.setSex(acList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCard())){ + patient.setCard(acList.get(0).getPtCard()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPatientName())){ + patient.setPatientName(acList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtCity())){ + patient.setFamily(acList.get(0).getPtCity()); + } + if(StringUtils.isNotEmpty(acList.get(0).getPtPhone())){ + patient.setPhone(acList.get(0).getPtPhone()); + } + if(StringUtils.isNotEmpty(acList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(acList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(acList.get(0).getOutPatien())){ + patient.setOutPatien(acList.get(0).getOutPatien()); + } + + if(patient2==null){ + patient.setHospitalId(acList.get(0).getCategoryHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 + ptEsrdNumber="yd01"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + if(patient3==null){ + patient.setHospitalId(acList.get(0).getGroupHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd01"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + //修改会诊数据 + Long id = acList.get(0).getId(); + acList.get(0).setEsrdNumber(ptEsrdNumber); + applyConsultationService.updateById(acList.get(0)); + + if (!acList.get(0).getAciList().isEmpty()) { + for (int i = 0; i < acList.get(0).getAciList().size(); i++) { + acList.get(0).getAciList().get(i).setConId(id); + } + applyConsultationImgService.insertBatch(acList.get(0).getAciList()); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家医院远程会诊 + */ + @RequestMapping("selectConsultationSpe") + public Map selectConsultationSpe(Integer pageNo, Integer pageSize, String patientName,String part, + String startTime, String endTime, String categoryHospitalId, Integer type,String ptCard,String hisId,String conditions, + String specialistId, String diagnosisType) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("categoryHospitalId", categoryHospitalId); + map.put("type", type); + map.put("diagnosisType", diagnosisType); + map.put("ptCard", ptCard); + map.put("hisId", hisId); + map.put("part", part); + map.put("specialistId",specialistId); + map.put("conditions",conditions); + try { + Pagetion pagetion = applyConsultationService.selectConsultationSpe(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 管理医院远程会诊 + */ + @RequestMapping("selectConByCategory") + public Map selectConByCategory(Integer pageNo, Integer pageSize, String patientName,String part, + String startTime, String endTime, String categoryHospitalId, Integer type, String docId,String ptCard,String hisId, + String specialistId, String diagnosisType,String conditions,String groupHospitalId,String esrdNumber) { + Map map = new HashMap<>(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("categoryHospitalId", categoryHospitalId); + map.put("type", type); + map.put("docId", docId); + map.put("specialistId", specialistId); + map.put("diagnosisType", diagnosisType); + map.put("ptCard", ptCard); + map.put("hisId", hisId); + map.put("part", part); + map.put("conditions", conditions); + map.put("groupHospitalId", groupHospitalId); + map.put("esrdNumber", esrdNumber); + try { + Pagetion pagetion = applyConsultationService.selectConByCategory(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + List acssList=new ArrayList(); + + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("con_id", pagetion.getList().get(i).getId()).ne("state","80"); + acssList=applyConsulationSpecialistService.selectList(wrapper); + if(!acssList.isEmpty()){ + pagetion.getList().get(i).setAcsList(acssList); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +/* + *//** + * 基层医院远程会诊 + *//* + @RequestMapping("selectConByPage") + public Map selectConByPage(Integer pageNo, Integer pageSize, String patientName, String startTime, + String endTime, Integer type, String diagnosisType, String categoryHospitalId, Long docId,String conditions,String groupHospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + + if (docId != null) { + wrapper.eq("doc_id", docId); + } + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + wrapper.between("group_date", startTime, endTime); + } + if (StringUtils.isNotEmpty(patientName)) { + wrapper.like("patient_name", patientName); + } + if (StringUtils.isNotEmpty(diagnosisType)) { + wrapper.eq("diagnosis_type", diagnosisType); + } + if (StringUtils.isNotEmpty(categoryHospitalId)) { + wrapper.eq("category_hospital_id", categoryHospitalId); + } + if (StringUtils.isNotEmpty(groupHospitalId)) { + wrapper.eq("group_hospital_id", groupHospitalId); + } + if (StringUtils.isNotEmpty(conditions)) { + wrapper.eq("conditions", conditions); + } + // 状态 1:待分配专家 2:已分配专家 3:已结束 + if (type != null && type == 1) { + wrapper.ne("status", "70"); + wrapper.orderBy("status,group_date", true); + } else if (type != null && type == 3) { + wrapper.eq("status", "70"); + wrapper.orderBy("group_date", false); + } + try { + Page list = applyConsultationService.selectPage(page.getPagePlusTwo(), wrapper); + if (list != null) { + CustomPage customPage = new CustomPage(list); + + List acssList=new ArrayList(); + for (int i = 0; i < customPage.getRows().size(); i++) { + EntityWrapper wrapper2=new EntityWrapper(); + //查看分配专家 + wrapper2.eq("con_id", customPage.getRows().get(i).getId()).ne("state","80"); + acssList=applyConsulationSpecialistService.selectList(wrapper2); + if(!acssList.isEmpty()){ + customPage.getRows().get(i).setAcsList(acssList); + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + }*/ + + //从写 + /** 9.7重写此方法 + * 基层医院远程会诊 + */ + @RequestMapping("selectConByPage") + public Map selectConByPage(Integer pageNo, Integer pageSize, String patientName, String startTime, + String endTime, Integer type, String diagnosisType, String categoryHospitalId, + Long docId, String conditions, String groupHospitalId) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName",patientName); + map.put("startTime",startTime); + map.put("endTime",endTime); + map.put("type",type); + map.put("diagnosisType",diagnosisType); + map.put("categoryHospitalId",categoryHospitalId); + map.put("docId",docId); + map.put("conditions",conditions); + map.put("groupHospitalId",groupHospitalId); + try { + CustomPage customPage = applyConsultationService.selectConByPage(map,pageNo,pageSize); + map.clear(); + if (customPage != null) { + for (int i = 0; i < customPage.getRows().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("con_id", customPage.getRows().get(i).getId()).ne("state","80"); + List acssList = applyConsulationSpecialistService.selectList(wrapper); + if(!acssList.isEmpty()){ + customPage.getRows().get(i).setAcsList(acssList); + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 会诊查看详情 + * + * @param + * @return + */ + @RequestMapping("selectConsultationById") + public Map selectConsultationById(Long id,Integer status,Long speId) { + Map map = new HashMap(); + List imgList=new ArrayList(); + String docPhone=""; + String contactPhone=""; + StringBuffer sctPhone=new StringBuffer(); + StringBuffer sctName=new StringBuffer(); + StringBuffer sctState=new StringBuffer(); + List apfList=new ArrayList(); + try { + ApplyConsultation applyConsultation = applyConsultationService.selectById(id); + if (applyConsultation != null) { + + User user=new User(); + if(applyConsultation.getDocId()!=null){ + user=userService.selectById(applyConsultation.getDocId()); + if(user!=null){ + docPhone=user.getPhone(); + contactPhone=user.getContactPhone(); + } + } + + //管理医院显示专家状态 + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.eq("con_id", applyConsultation.getId()).ne("state", "80"); + List accsList=applyConsulationSpecialistService.selectList(wrapper2); + for (int i = 0; i < accsList.size(); i++) { + user=userService.selectById(accsList.get(i).getSpeId()); + if(user!=null){ + //专家显示自己当前的状态 + if(speId!=null && accsList.get(i).getSpeId().equals(speId)){ + applyConsultation.setStatus(String.valueOf(accsList.get(i).getState())); + } + sctPhone=sctPhone.append(user.getPhone()+","); + sctName=sctName.append(user.getUserName()+","); + sctState=sctState.append(accsList.get(i).getState()+","); + } + } + //专家现在本人自己状态 + if(speId!=null){ + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.eq("con_id", applyConsultation.getId()).eq("spe_id", speId); + ApplyConsulationSpecialist accs=applyConsulationSpecialistService.selectOne(wrapper3); + if(accs!=null){ + applyConsultation.setStatus(String.valueOf(accs.getState())); + } + } + map.clear(); + map.put("con_id", id); + imgList = applyConsultationImgService.selectByMap(map); + apfList=applyPathologyFileService.selectByMap(map); + } + map.put("apfList", apfList); + map.put("applyConsultation", applyConsultation); + map.put("imgList", imgList); + map.put("docPhone", docPhone);//医生账号 + map.put("contactPhone", contactPhone);//医生联系电话 + map.put("sctPhone", sctPhone.length()>0?sctPhone.substring(0,sctPhone.length() - 1):"");//专家账号 + map.put("sctName", sctName.length()>0?sctName.substring(0,sctName.length() - 1):"");//专家姓名 + map.put("sctState",sctState.length()>0?sctState.substring(0,sctState.length() - 1):"");//专家姓名 + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 会诊图意见 + * @param + * @return + */ + @RequestMapping("updateConImgOpinion") + public Map updateConImgOpinion(ApplyConsultationImg applyConsultationImg) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + wrapper.eq("type", applyConsultationImg.getType()); + wrapper.eq("con_id", applyConsultationImg.getConId()); + boolean result = applyConsultationImgService.update(applyConsultationImg, wrapper); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改会诊信息 + * + * @param + * @return + */ + @RequestMapping("updateConsultation") + public Map updateConsultation(ApplyConsultation applyConsultation) { + Map map = new HashMap(); + try { + boolean result = applyConsultationService.updateById(applyConsultation); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @Transactional + @RequestMapping("insertConSpecialist") + public Map insertConSpecialist(@RequestBody List accList) { + Map map = new HashMap(); + List aspList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + Integer speNumber=1; + try { + if(!accList.isEmpty() && accList.get(0).getConId()!=null){ + if(accList.get(0).getSpeNumber()!=null){ + //获取分配专家的个数 + wrapper.eq("con_id", accList.get(0).getConId()).ne("state", "80"); + aspList=applyConsulationSpecialistService.selectList(wrapper); + if(aspList.size()>0){ + speNumber=2; + } + } + + boolean result = applyConsulationSpecialistService.insertBatch(accList); + if(result){ + + ApplyConsultation con=new ApplyConsultation(); + con.setGroupDate(accList.get(0).getConTime()); + con.setId(accList.get(0).getConId()); + + if(speNumber==2){ + map.put("con_id", accList.get(0).getConId()); + aspList=applyConsulationSpecialistService.selectByMap(map); + for (int i = 0; i < aspList.size(); i++) { + aspList.get(i).setSpeNumber(2); + applyConsulationSpecialistService.updateById(aspList.get(i)); + } + //修改总状态 + con.setStatus("30"); + applyConsultationService.updateById(con); + }else{ + //修改会诊时间 + applyConsultationService.updateById(con); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateConSpecialist") + public Map updateConSpecialist(ApplyConsulationSpecialist acss) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(acss!=null){ + acss.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", acss.getSpeId()).eq("con_id", acss.getConId()); + //.eq("spe_name",acss.getSpeName()).eq("contact_phone",acss.getContactPhone()); + boolean result = applyConsulationSpecialistService.update(acss, wrapper); + if(result == true){ + map.put("con_id", acss.getConId()); + List accList=applyConsulationSpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + int speNumber=accList.get(0).getSpeNumber(); + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyConsulationSpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(speNumber==1){ + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + }else if(speNumber==2){ + if(sum40!=0 && sum40==2){ + status="40"; + }else if(sum40<2 && sum30!=0){ + status="30"; + }else if(sum40<2 && sum30==0 && sum80!=0){ + status="20"; + } + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyConsultation ac=new ApplyConsultation(); + ac.setStatus(status); + ac.setId(acss.getConId()); + applyConsultationService.updateById(ac); + } + map.put("msg","1"); + } else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateConSpecialistInfo") + public Map updateConSpecialistInfo(ApplyConsulationSpecialist acss) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(acss!=null){ + acss.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("con_id", acss.getConId()); + boolean result = applyConsulationSpecialistService.update(acss, wrapper); + if(result == true){ + map.put("msg","1"); + } else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 删除 + */ + @Transactional//事务回滚 + @RequestMapping("deleteConsultation") + public Map deleteConsultation(Long id,String code) { + Map map = new HashMap(); + try { + ApplyConsultation con=applyConsultationService.selectById(id); + if(con!=null){ + code=con.getCode(); + boolean result = applyConsultationService.deleteById(id); + if(result == true){ + map.put("con_id", id); + applyConsultationImgService.deleteByMap(map); + applyConsulationSpecialistService.deleteByMap(map); + applyPathologyFileService.deleteByMap(map); + map.clear(); + map.put("code", code); + applyLisService.deleteByMap(map); + applyPathologyService.deleteByMap(map); + applyPathologyImgService.deleteByMap(map); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据身份证号码查看患者信息 + */ + @RequestMapping("selectConsultationByCard") + public Map selectConsultationByCard(String card) { + Map map = new HashMap(); + List acList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("pt_card", card).orderBy("group_date", false); + try { + acList=applyConsultationService.selectList(wrapper); + map.put("acList",acList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + +} + + + + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java new file mode 100644 index 0000000..144079f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyDoctorPromoteController.java @@ -0,0 +1,193 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.entity.User; +import com.imurs.service.ApplyDoctorPromoteService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 医生进修申请控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "promote") +public class ApplyDoctorPromoteController { + + @Autowired + ApplyDoctorPromoteService applyDoctorPromoteService; + + @Autowired + UserService userService; + /** + * 新增医生进修申请 + */ + @RequestMapping(value = "insertPromote") + public Map insertPromote(ApplyDoctorPromote applyDoctorPromote) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + + try { + if(applyDoctorPromote.getAccount()!=null){ + wrapper.eq("phone", applyDoctorPromote.getAccount()); + User user = userService.selectOne(wrapper); + if(user!=null){ + applyDoctorPromote.setDocId(user.getId()); + }else{ + map.put("msg", "6");//账号不存在account + return map; + } + } + boolean result = applyDoctorPromoteService.insert(applyDoctorPromote); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + map.remove("account"); + return map; + + } + + /** + * 修改医生进修申请 + */ + @RequestMapping(value = "updatePromote") + public Map updatePromote(ApplyDoctorPromote applyDoctorPromote) { + Map map = new HashMap(); + try { + boolean result = applyDoctorPromoteService.updateById(applyDoctorPromote); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 删除医生进修申请 + */ + @RequestMapping(value = "deletePromote") + public Map deletePromote(Long id) { + Map map = new HashMap(); + try { + boolean result = applyDoctorPromoteService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 查看医生进修申请详情 + */ + @RequestMapping(value = "selectPromoteById") + public Map selectPromoteById(Long id) { + Map map = new HashMap(); + try { + ApplyDoctorPromote promote = applyDoctorPromoteService.selectById(id); + map.put("promote", promote); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + + /** + * 医生进修列表分页 + */ + @RequestMapping(value = "selectPromotePage") + public Map selectPromotePage(String applyStartTime,String applyEndTime,String isSuper,String hospitalId , + String hospitalName,String docId,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?6:pageSize); + + if(StringUtils.isNotEmpty(applyStartTime)){ + wrapper.ge("apply_start_time", applyStartTime); + } + if(StringUtils.isNotEmpty(applyEndTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(applyEndTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("apply_start_time",dateFormat.format(cal.getTime())); + } + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(isSuper)){//上级医院/基层医院、基层医生看全部状态 + wrapper.ne("status", "A").ne("status", "J"); + } + wrapper.orderBy("status", true); + try { + Page pageList=applyDoctorPromoteService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理医院进修列表分页 + */ + @RequestMapping(value = "selectAdminPromote") + public Map selectAdminPromote(String applyStartTime,String applyEndTime,String isSuper,String hospitalId , + Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?12:pageSize; + map.put("applyStartTime", applyStartTime); + map.put("applyEndTime", applyEndTime); + map.put("isSuper", isSuper); + map.put("hospitalId", hospitalId); + try { + Pagetion pageList=applyDoctorPromoteService.selectAdminPromote(map,pageNo,pageSize); + map.put("customPage", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("applyStartTime"); + map.remove("applyEndTime"); + map.remove("isSuper"); + map.remove("hospitalId"); + } + return map; + + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyEcgController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyEcgController.java new file mode 100644 index 0000000..412bdd7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyEcgController.java @@ -0,0 +1,420 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyEcg; +import com.imurs.entity.ApplyEcgSpecialist; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.service.ApplyEcgImgService; +import com.imurs.service.ApplyEcgService; +import com.imurs.service.ApplyEcgSpecialistService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping("ecg") +public class ApplyEcgController { + + @Autowired + ApplyEcgService applyEcgService; + + @Autowired + ApplyEcgImgService applyEcgImgService; + + @Autowired + PatientService patientService; + + @Autowired + ApplyEcgSpecialistService applyEcgSpecialistService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + UserService userService; + + + /** + * 批量新增心电图片 + */ + @Transactional + @RequestMapping("insertEcgImg") + public Map insertEcgImg(@RequestBody List ecgImgList){ + Map map=new HashMap(); + boolean result=false; + try { + if(!ecgImgList.isEmpty() && ecgImgList.get(0)!=null){ + for (int i = 0; i < ecgImgList.size(); i++) { + result=applyEcgImgService.insert(ecgImgList.get(i)); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 新增 + */ + @Transactional + @RequestMapping("inserEcg") + public Map inserEcg(@RequestBody List ecgList) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + String ptEsrdNumber = ""; + try { + if (!ecgList.isEmpty() && ecgList.get(0) != null) { + // 双向转诊数据 + boolean result = applyEcgService.insert(ecgList.get(0)); + if (result == true) { + map.put("msg", "1"); + + if(StringUtils.isNotEmpty(ecgList.get(0).getHisEsrdNumber())){ + wrapper.eq("his_esrd_number", ecgList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", ecgList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", ecgList.get(0).getOutPatien()); + wrapper2.eq("out_patien", ecgList.get(0).getOutPatien()); + } + // 第一次新增时患者表新增 + wrapper.eq("hospital_id",ecgList.get(0).getCategoryHospitalId()); + Patient patient2 = patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id",ecgList.get(0).getGroupHospitalId()); + Patient patient3 = patientService.selectOne(wrapper); + + if (patient2 == null || patient3 == null) { + Patient patient = new Patient(); + if(StringUtils.isNotEmpty(ecgList.get(0).getSex())){ + patient.setSex(ecgList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getPatientName())){ + patient.setPatientName(ecgList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(ecgList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(ecgList.get(0).getOutPatien())){ + patient.setOutPatien(ecgList.get(0).getOutPatien()); + } + if (patient2 == null) { + patient.setHospitalId(ecgList.get(0).getCategoryHospitalId()); + result = patientService.insert(patient); + if (result == true) { + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 03:B超 04:心电 + ptEsrdNumber = "yd04" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + if (patient3 == null) { + patient.setHospitalId(ecgList.get(0).getGroupHospitalId()); + result = patientService.insert(patient); + if (result == true) { + ptEsrdNumber = StringUtils.isNotEmpty(ptEsrdNumber) ? ptEsrdNumber + : "yd04" + patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + } else { + ptEsrdNumber = patient2.getEsrdNumber(); + } + + // 修改会诊数据 + Long id = ecgList.get(0).getId(); + ecgList.get(0).setEsrdNumber(ptEsrdNumber); + applyEcgService.updateById(ecgList.get(0)); + + if (!ecgList.get(0).getEcgImgList().isEmpty()) { + for (int i = 0; i < ecgList.get(0).getEcgImgList().size(); i++) { + ecgList.get(0).getEcgImgList().get(i).seteId(id); + } + applyEcgImgService.insertBatch(ecgList.get(0).getEcgImgList()); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改 + */ + @RequestMapping("updateEcg") + public Map updateEcg(ApplyEcg applyEcg){ + Map map=new HashMap(); + try { + boolean result=applyEcgService.updateById(applyEcg); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteEcgById") + public Map deleteEcgById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyEcgService.deleteById(id); + if(result==true){ + map.put("e_id", id); + applyEcgImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectEcgById") + public Map selectEcgById(Long id){ + Map map=new HashMap(); + ApplyEcg applyEcg=new ApplyEcg(); + String contactPhone=""; + List ecgImgList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + try { + applyEcg=applyEcgService.selectById(id); + if(applyEcg!=null){ + User user=userService.selectById(applyEcg.getDocId()); + if(user!=null){ + contactPhone=user.getContactPhone(); + } + //查看分配专家 + wrapper2.eq("e_id",id).ne("state","80"); + ApplyEcgSpecialist ecgSp=applyEcgSpecialistService.selectOne(wrapper2); + if(ecgSp!=null){ + applyEcg.setSpecialist(ecgSp.getSpeName()); + applyEcg.setSpecialistId(ecgSp.getSpeId()); + } + + //查看医院名字 + wrapper.eq("id", applyEcg.getCategoryHospitalId()).or().eq("id", applyEcg.getGroupHospitalId()); + List aifList=applyInformationService.selectList(wrapper); + if(!aifList.isEmpty()){ + for (int i = 0; i < aifList.size(); i++) { + if(aifList.get(i).getId().equals(applyEcg.getCategoryHospitalId())){ + applyEcg.setCategoryHospital(aifList.get(i).getHospitalName()); + } + if(aifList.get(i).getId().equals(applyEcg.getGroupHospitalId())){ + applyEcg.setGroupHospital(aifList.get(i).getHospitalName()); + } + } + } + map.put("e_id", id); + ecgImgList=applyEcgImgService.selectByMap(map); + } + map.put("applyEcg", applyEcg); + map.put("ecgImgList", ecgImgList); + map.put("contactPhone", contactPhone); + } catch (Exception e ) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @RequestMapping("insertEcgSpecialist") + public Map insertEcgSpecialist(ApplyEcgSpecialist ecgSp) { + Map map = new HashMap(); + try { + boolean result = applyEcgSpecialistService.insert(ecgSp); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateEcgSpecialist") + public Map updateEcgSpecialist(ApplyEcgSpecialist ecgSp) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(ecgSp!=null){ + ecgSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", ecgSp.getSpeId()).eq("e_id", ecgSp.geteId()); + boolean result = applyEcgSpecialistService.update(ecgSp, wrapper); + if(result == true){ + map.put("e_id", ecgSp.geteId()); + List accList=applyEcgSpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyEcgSpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyEcg ab=new ApplyEcg(); + ab.setStatus(status); + ab.setId(ecgSp.geteId()); + applyEcgService.updateById(ab); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理/申请专家医院心电列表 + */ + @RequestMapping("selectEcgPage") + public Map selectEcgPage(String categoryHospitalId,String groupHospitalId,String startTime, + String endTime,String patientName,Integer pageNo,Integer pageSize,Integer type,String part,Long docId){ + Map map=new HashMap(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = applyEcgService.selectEcgPage(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + ApplyEcgSpecialist ecgSp=new ApplyEcgSpecialist(); + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("e_id", pagetion.getList().get(i).getId()).ne("state","80"); + ecgSp=applyEcgSpecialistService.selectOne(wrapper); + if(ecgSp!=null){ + pagetion.getList().get(i).setSpecialist(ecgSp.getSpeName()); + pagetion.getList().get(i).setSpecialistId(ecgSp.getSpeId()); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + } + return map; + } + + /** + * 专家心电 + */ + @RequestMapping("selectEcgSpePage") + public Map selectEcgSpePage(Integer pageNo, Integer pageSize, String patientName, + String startTime, String endTime, String specialistId,Integer part,Integer type) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId",specialistId); + map.put("part",part); + map.put("type",type); + try { + Pagetion pagetion = applyEcgService.selectEcgSpePage(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("part"); + map.remove("type"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyInforMationController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyInforMationController.java new file mode 100644 index 0000000..1d31329 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyInforMationController.java @@ -0,0 +1,376 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.TotalInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationImgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.TotalInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +import javax.print.DocFlavor; + +/** + * 基层医院申请表 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "infor") +public class ApplyInforMationController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyInformationImgService applyInformationImgService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + UserService userService; + @Autowired + TotalInformationService totalInformationService; + + + + /** + * 查询指定角色的医院 + */ + /** + * 查询管理医院的名称 + */ + @RequestMapping(value = "selectInforByRid") + public Map selectInforByRid(String rid) { + Map map = new HashMap(); + try { + if(StringUtils.isNotEmpty(rid)){ + map.put("rid", rid); + map.put("state", "1"); + List inforList = applyInformationService.selectByMap(map); + map.put("inforList", inforList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 查询管理医院的名称 + */ + @RequestMapping(value = "selectInforName") + public Map selectInforName() { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.setSqlSelect("id as id,hospital_name as hospitalName").where("rid=1"); + try { + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper); + map.put("applyInformation",applyInformation); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 新增基层医院申请信息 + */ + @RequestMapping(value = "insertInfor") + public Map insertInfor(ApplyInformation applyInformation) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + try { + String uuid=MD5.GetMD5Code(dateFormat.format(date)); + // 医院id按照时间日期生成 + applyInformation.setId(uuid); + applyInformation.setAccount(applyInformation.getId()); + boolean result = applyInformationService.insert(applyInformation); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改基层医院申请信息/审核医院为通过 + */ + @RequestMapping(value = "updateInfor") + public Map updateInfor(ApplyInformation applyInformation) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper totalWrapper = new EntityWrapper(); + + try { + if(applyInformation!=null && StringUtils.isNotEmpty(applyInformation.getId())){ + wrapper.eq("id", applyInformation.getId()); + boolean result = applyInformationService.update(applyInformation, wrapper); + if(result == true && applyInformation.getState()!=null + && applyInformation.getState()==1){//修改医院状态为审核通过 + totalWrapper.eq("hospital_id", applyInformation.getId()); + TotalInformation totalIfo = totalInformationService.selectOne(totalWrapper); + if(totalIfo==null){ + TotalInformation totalInformation = new TotalInformation(); + totalInformation.setHospitalId(applyInformation.getId());//医院id + totalInformation.setType(applyInformation.getRid().intValue());//医院注册类型 + totalInformationService.insert(totalInformation); + } + } + map.put("msg", result == true ? "1" : "2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 批量修改医院数据 + */ + @RequestMapping(value = "updateInforBatch") + public Map updateUserBatch(@RequestBody List ApplyInformation) { + Map map = new HashMap<>(); + try { + boolean result = applyInformationService.updateBatchByIds(ApplyInformation); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改基层医院数据和图片信息 + */ + @Transactional + @RequestMapping(value="updateInforImg") + public Map updateInforImg(ApplyInformation applyInformation,String imgUrls,String imgType) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + if(applyInformation!=null && StringUtils.isNotEmpty(applyInformation.getId())){ + String id=applyInformation.getId(); + wrapper.eq("id", id); + boolean result = applyInformationService.update(applyInformation, wrapper); + //修改图片 + if(result==true){ + if(StringUtils.isNotEmpty(imgUrls) && StringUtils.isNotEmpty(imgType)){ + String[] strImg=imgUrls.split(","); + String[] strType=imgType.split(","); + map.put("hospital_id",id); + List imgList=applyInformationImgService.selectByMap(map); + if(!imgList.isEmpty()){ + applyInformationImgService.deleteByMap(map); + } + for (int i = 0; i < strType.length; i++) { + ApplyInformationImg apImg=new ApplyInformationImg(); + apImg.setHospitalId(id); + apImg.setImgUrl(strImg[i]); + apImg.setImgType(Integer.valueOf(strType[i])); + applyInformationImgService.insert(apImg); + } + } + map.remove("hospital_id"); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + + /** + * 删除基层医院申请信息 + */ + @Transactional + @RequestMapping(value = "deleteInfor") + public Map deleteInfor(String id) { + Map map = new HashMap(); + map.put("id", id); + try { + boolean result = applyInformationService.deleteByMap(map); + map.clear(); + if(result == true){ + map.put("hospital_id", id); + applyInformationImgService.deleteByMap(map); + map.put("msg","1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询单条基层医院申请信息 + */ + @RequestMapping(value = "findAifmById") + public Map findAifmById(String id,String rid) { + Map map = new HashMap(); + Map map1 = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + ApplyInformation applyInformation = applyInformationService.selectById(id); + if (applyInformation != null) { + // 医院图片 + wrapper.eq("hospital_id", id); + if(rid!=null){ + wrapper.ne("img_type","1").ne("img_type","2"); + } + List imgList = applyInformationImgService.selectList(wrapper); + map.put("imgList", imgList); + map.put("information", applyInformation); + //查出管理员信息 + if(applyInformation.getPrincipalId()!=null){ + User user=userService.selectById(applyInformation.getPrincipalId()); + map.put("user", user); + } + if(!StringUtils.isEmpty(rid)){ + map1.put("hospitalId", id); + List doctorArrangeList = doctorArrangeService.homeShowArrange(map1); + //List doctorArrangeList = doctorArrangeService.selectArrangeByRhId(id); + map.put("doctorArrangeList", doctorArrangeList); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医院信息分页显示(申请信息管理) + */ + @RequestMapping(value = "findAifmPage") + public Map findAifmPage(Integer pageSize, Integer pageNo, Integer state, Long hospitalId, + String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + if (StringUtils.isNotEmpty(hospitalName)) { + wrapper.like("hospital_name", hospitalName); + } + try { + wrapper.eq("state", state).eq("hospital_id", hospitalId).orderBy("create_time", false); + Page pageList = applyInformationService.selectPage(page.getPagePlusTwo(), wrapper); + if (pageList != null) { + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医院信息分页显示(合作医院信息) + */ + @RequestMapping(value = "findAifmAdminPage") + public Map findAifmAdminPage(Integer pageSize, Integer pageNo, Integer state, Long hospitalId, + String hospitalName) { + Map map = new HashMap(); + pageNo=pageNo == null ? 1 : pageNo; + pageSize=pageSize == null ? 10 : pageSize; + map.put("hospitalName", hospitalName); + try { + Pagetion pageList = applyInformationService.findAifmAdminPage(map, pageNo, pageSize); + map.put("pageList", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalName"); + } + return map; + } + + /** + * 分组查出所有医院名称 + */ + @RequestMapping(value = "findAifmGroup") + public Map findAifmGroup(Integer state, String rid,String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.setSqlSelect("hospital_name as hospitalName,id as id,rid as rid,allocate_doctor as allocateDoctor "); + if (state == null) { + wrapper.eq("state", "1"); + }else if(state==4){ + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid",rid); + }else{ + wrapper.ne("rid", "1").ne("rid","9"); + if(StringUtils.isNotEmpty(hospitalName)){ + wrapper.eq("hospital_name", hospitalName); + } + wrapper.orderBy("if(id='68729a2d87075bd616f7339940227f46',0,1),if(id='97561c8ecc660a36a3cdad29abd4ae3f',0,1)," + + "if(id='07cdf216c7a7eb0e1dd5d7fc568d9285',0,1),if(id='4f74e5c6659354e6eca2d4658bf57777',0,1)"); + } + } + try { + List list = applyInformationService.selectList(wrapper); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyParameterController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyParameterController.java new file mode 100644 index 0000000..2a8b79a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyParameterController.java @@ -0,0 +1,630 @@ +package com.imurs.controller; + +import static org.mockito.Matchers.intThat; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.entity.ApplyEcg; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyLis; +import com.imurs.entity.ApplyPathology; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.entity.ApplySpecialist; +import com.imurs.entity.Patient; +import com.imurs.entity.User; +import com.imurs.parameter.ApplyParameter; +import com.imurs.service.ApplyConsultationImgService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyEcgImgService; +import com.imurs.service.ApplyEcgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.ApplyLisService; +import com.imurs.service.ApplyPathologyFileService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.ApplySpecialistService; +import com.imurs.service.PatientService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +import net.sf.json.JSONObject; + +@RestController +@RequestMapping("apply") +public class ApplyParameterController { + + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyConsultationImgService applyConsultationImgService; + @Autowired + ApplyLisService applyLisService; + @Autowired + ApplyPathologyService applyPathologyService; + @Autowired + ApplyPathologyImgService applyPathologyImgService; + @Autowired + ApplyEcgService applyEcgService; + @Autowired + ApplyEcgImgService applyEcgImgService; + @Autowired + PatientService patientService; + @Autowired + ApplySpecialistService applySpecialistService; + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + @Autowired + ApplyPathologyFileService applyPathologyFileService; + + /** + * 批量新增 + * + * @param apList + * @return + */ + @Transactional + @RequestMapping("insertApply") + public Map insertApply(@RequestBody List parameterList) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + EntityWrapper wrapper2 = new EntityWrapper(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + String code=MD5.GetMD5Code(dateFormat.format(date)); + String ptEsrdNumber = ""; + boolean result = false; + Long id = null; + Patient patient2 = new Patient(); + Patient patient3 = new Patient(); + for(int i = 0; i ecgImgList = parameterList.get(0).getEcgList().get(0).getEcgImgList(); + if (ecgImgList != null) { + result =applyEcgImgService.insertBatch(ecgImgList); + } + } + map.put("msg", result == true ? "1" : "2"); + + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping("selectApply") + public Map selectApply() { + Map map = new HashMap(); + List aciList=new ArrayList(); + ApplyConsultationImg aci=new ApplyConsultationImg(); + aci.setConId(1L); + aci.setImgUrl("ur///////"); + aciList.add(aci); + List acList=new ArrayList(); + ApplyConsultation ac=new ApplyConsultation(); + ac.setAge(22); + ac.setAciList(aciList); + acList.add(ac); + + + + List ecgImgList=new ArrayList(); + ApplyEcgImg ecgImg=new ApplyEcgImg(); + ecgImg.seteId(1L); + ecgImg.setImgUrl("11111"); + ecgImgList.add(ecgImg); + + List ecgList=new ArrayList(); + ApplyEcg ae=new ApplyEcg(); + ae.setAge(22); + ae.setEcgImgList(ecgImgList); + ecgList.add(ae); + + List apImgList=new ArrayList(); + ApplyPathologyImg img=new ApplyPathologyImg(); + img.setId(32L); + apImgList.add(img); + + ApplyPathology ap=new ApplyPathology(); + ap.setAge(233); + ap.setAphImgList(apImgList); + List apList=new ArrayList(); + apList.add(ap); + + + ApplyParameter applyParameter=new ApplyParameter(acList, new ApplyLis(), apList, + ecgList, new Patient(),"1", "2", "3", "4"); + try { + JSONObject json = JSONObject.fromObject(applyParameter);//将java对象转换为json对象 + //String str = json.toString();//将json对象转换为字符串 + //map.put("apply",str); + map.put("applyParameter",applyParameter); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分配专家 + */ + @Transactional + @RequestMapping("insertApplySpecialist") + public Map insertApplySpecialist(@RequestBody List asList) { + Map map = new HashMap(); + List aspList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + Integer speNumber=1; + EntityWrapper wrapper1=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + EntityWrapper wrapper3=new EntityWrapper(); + ApplyConsultation con=new ApplyConsultation(); + ApplyLis lis=new ApplyLis(); + ApplyEcg ecg=new ApplyEcg(); + ApplyPathology pathology=new ApplyPathology(); + List apList=new ArrayList(); + String code=""; + try { + if(!asList.isEmpty() && StringUtils.isNotEmpty(asList.get(0).getCode())){ + code=asList.get(0).getCode(); + if(asList.get(0).getSpeNumber()!=null){ + //获取分配专家的个数 + wrapper.eq("code",code).ne("state", "80"); + aspList=applySpecialistService.selectList(wrapper); + if(aspList.size()>0){ + speNumber=2; + } + } + boolean result = applySpecialistService.insertBatch(asList); + if(result == true){ + if(speNumber==2){ + map.put("code", code); + aspList=applySpecialistService.selectByMap(map); + for (int i = 0; i < aspList.size(); i++) { + aspList.get(i).setSpeNumber(2); + applySpecialistService.updateById(aspList.get(i)); + } + //修改总状态 + wrapper1.eq("code",code); + wrapper2.eq("code",code); + wrapper3.eq("code",code); + con.setStatus("30"); + lis.setStatus("30"); + ecg.setStatus("30"); + + applyConsultationService.update(con, wrapper1); + applyLisService.update(lis, wrapper2); + applyEcgService.update(ecg, wrapper3); + apList=applyPathologyService.selectByMap(map); + for (int i = 0; i < apList.size(); i++) { + pathology.setId(apList.get(i).getId()); + pathology.setStatus("30"); + applyPathologyService.updateById(pathology); + } + + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateSpecialist") + public Map updateSpecialist(ApplySpecialist as) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + EntityWrapper wrapper1=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + EntityWrapper wrapper3=new EntityWrapper(); + ApplyConsultation con=new ApplyConsultation(); + ApplyLis lis=new ApplyLis(); + ApplyEcg ecg=new ApplyEcg(); + ApplyPathology pathology=new ApplyPathology(); + List apList=new ArrayList(); + String code=""; + try { + if(as!=null && StringUtils.isNotEmpty(as.getCode())){ + code=as.getCode(); + as.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", as.getSpeId()).eq("code", code); + boolean result = applySpecialistService.update(as, wrapper); + if(result == true){ + map.put("code", code); + List accList=applySpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + int speNumber=accList.get(0).getSpeNumber(); + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplySpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(speNumber==1){ + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + }else if(speNumber==2){ + if(sum40!=0 && sum40==2){ + status="40"; + }else if(sum40<2 && sum30!=0){ + status="30"; + }else if(sum40<2 && sum30==0 && sum80!=0){ + status="20"; + } + } + } + if(StringUtils.isNotEmpty(status)){ + //修改总状态 + wrapper1.eq("code",code); + wrapper2.eq("code",code); + wrapper3.eq("code",code); + con.setStatus(status); + lis.setStatus(status); + ecg.setStatus(status); + pathology.setStatus(status); + applyConsultationService.update(con, wrapper1); + applyLisService.update(lis, wrapper2); + applyEcgService.update(ecg, wrapper3); + + apList=applyPathologyService.selectByMap(map); + for (int i = 0; i < apList.size(); i++) { + pathology.setId(apList.get(i).getId()); + pathology.setStatus(status); + applyPathologyService.updateById(pathology); + } + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 会诊查看详情 + */ + @RequestMapping("selectConsultationByCode") + public Map selectConsultationByCode(Long id,Integer status,Long speId) { + Map map = new HashMap(); + String docPhone=""; + String contactPhone=""; + StringBuffer sctPhone=new StringBuffer(); + StringBuffer sctName=new StringBuffer(); + StringBuffer sctState=new StringBuffer(); + ApplyInformation applyInformation=new ApplyInformation(); + try { + if(id!=null){ + ApplyConsultation applyConsultation = applyConsultationService.selectById(id); + if (applyConsultation != null) { + applyInformation = applyInformationService + .selectById(applyConsultation.getCategoryHospitalId());// 所属医院 + applyConsultation.setCategoryHospital(applyInformation.getHospitalName()); + applyInformation = applyInformationService + .selectById(applyConsultation.getGroupHospitalId());// 会诊医院 + applyConsultation.setGroupHospital(applyInformation.getHospitalName()); + + User user=new User(); + if(applyConsultation.getDocId()!=null){ + user=userService.selectById(applyConsultation.getDocId()); + if(user!=null){ + docPhone=user.getPhone(); + contactPhone=user.getContactPhone(); + } + } + + //管理医院显示专家状态 + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.eq("code", applyConsultation.getCode()).ne("state", "80"); + List accsList=applySpecialistService.selectList(wrapper2); + for (int i = 0; i < accsList.size(); i++) { + user=userService.selectById(accsList.get(i).getSpeId()); + if(user!=null){ + //专家显示自己当前的状态 + if(speId!=null && accsList.get(i).getSpeId().equals(speId)){ + applyConsultation.setStatus(String.valueOf(accsList.get(i).getState())); + } + sctPhone=sctPhone.append(user.getPhone()+","); + sctName=sctName.append(user.getUserName()+","); + sctState=sctState.append(accsList.get(i).getState()+","); + } + } + //专家现在本人自己状态 + if(speId!=null){ + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.eq("code", applyConsultation.getCode()).eq("spe_id", speId); + ApplySpecialist accs=applySpecialistService.selectOne(wrapper3); + if(accs!=null){ + applyConsultation.setStatus(String.valueOf(accs.getState())); + } + } + } + map.put("applyConsultation", applyConsultation); + map.put("docPhone", docPhone);//医生账号 + map.put("contactPhone", contactPhone);//医生联系电话 + map.put("sctPhone", sctPhone.length()>0?sctPhone.substring(0,sctPhone.length() - 1):"");//专家账号 + map.put("sctName", sctName.length()>0?sctName.substring(0,sctName.length() - 1):"");//专家姓名 + map.put("sctState",sctState.length()>0?sctState.substring(0,sctState.length() - 1):"");//专家姓名 + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 心电查看详情 + */ + @RequestMapping("selectEcgByCode") + public Map selectEcgByCode(String code) { + Map map = new HashMap(); + EntityWrapper ecgWrapper = new EntityWrapper(); + List imgList=new ArrayList(); + try { + if(StringUtils.isNotEmpty(code)){ + ecgWrapper.eq("code", code); + ApplyEcg applyEcg = applyEcgService.selectOne(ecgWrapper); + if (applyEcg != null) { + map.put("e_id", applyEcg.getId()); + imgList = applyEcgImgService.selectByMap(map); + } + map.put("imgList", imgList); + map.put("applyEcg", applyEcg); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * lis查看详情 + */ + @RequestMapping("selectLisByCode") + public Map selectLisByCode(String code) { + Map map = new HashMap(); + EntityWrapper lisWrapper = new EntityWrapper(); + try { + if(StringUtils.isNotEmpty(code)){ + lisWrapper.eq("code", code); + ApplyLis applyLis = applyLisService.selectOne(lisWrapper); + map.put("applyLis", applyLis); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 影像查看详情 + */ + @RequestMapping("selectPathologyByCode") + public Map selectPathologyByCode(String code) { + Map map = new HashMap(); + List apList = new ArrayList(); + List imgList=new ArrayList(); + //ApplyInformation applyInformation=new ApplyInformation(); + try { + if(StringUtils.isNotEmpty(code)){ + map.put("code", code); + apList = applyPathologyService.selectByMap(map); + if (!apList.isEmpty()) { + for (int i = 0; i < apList.size(); i++) { + map.clear(); + map.put("p_id", apList.get(i).getId()); + imgList = applyPathologyImgService.selectByMap(map); + apList.get(i).setAphImgList(imgList); + + } + + } + map.put("apList", apList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 上传影像文件 + */ + @Transactional + @RequestMapping("insertPathologyFile") + public Map insertPathologyFile(@RequestBody List apfList) { + Map map=new HashMap(); + boolean result=false; + try { + if(apfList.isEmpty()){ + map.put("msg", "3"); + }else{ + for (int i = 0; i < apfList.size(); i++) { + result=applyPathologyFileService.insert(apfList.get(i)); + } + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 删除影像文件 + */ + @Transactional + @RequestMapping("deletePathologyFile") + public Map deletePathologyFile(Long id) { + Map map=new HashMap(); + boolean result=false; + try { + if(id==null){ + map.put("msg", "3"); + }else{ + result=applyPathologyFileService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyPathologyContrller.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyPathologyContrller.java new file mode 100644 index 0000000..635da88 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ApplyPathologyContrller.java @@ -0,0 +1,419 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyPathology; +import com.imurs.entity.ApplyPathologySpecialist; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.entity.Patient; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.ApplyPathologyImgService; +import com.imurs.service.ApplyPathologyService; +import com.imurs.service.ApplyPathologySpecialistService; +import com.imurs.service.PatientService; +import com.imurs.util.page.Pagetion; + +/** + * 影像控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "icon") +public class ApplyPathologyContrller { + + @Autowired + ApplyPathologyService applyPathologyService; + + @Autowired + ApplyPathologyImgService applyPathologyImgService; + + @Autowired + ApplyPathologySpecialistService applyPathologySpecialistService; + + @Autowired + PatientService patientService; + + @Autowired + ApplyInformationService applyInformationService; + + + /** + * 批量新增影像图片 + */ + @Transactional + @RequestMapping("insertAphImg") + public Map insertAphImg(@RequestBody List apImgList){ + Map map=new HashMap(); + boolean result=false; + try { + if(!apImgList.isEmpty() && apImgList.get(0)!=null){ + for (int i = 0; i < apImgList.size(); i++) { + result=applyPathologyImgService.insert(apImgList.get(i)); + } + map.put("msg", result==true?"1":"2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 批量新增影像 + */ + @Transactional + @RequestMapping("insertAph") + public Map insertAph(@RequestBody List aphList){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + String ptEsrdNumber=""; + try { + if(!aphList.isEmpty() && aphList.get(0)!=null){ + //双向转诊数据 + boolean result=applyPathologyService.insert(aphList.get(0)); + if(result==true){ + map.put("msg", "1"); + + //第一次新增时患者表新增 + if(StringUtils.isNotEmpty(aphList.get(0).getHisEsrdNumber())){ + wrapper.eq("his_esrd_number", aphList.get(0).getHisEsrdNumber()); + wrapper2.eq("his_esrd_number", aphList.get(0).getHisEsrdNumber()); + }else{ + wrapper.eq("out_patien", aphList.get(0).getOutPatien()); + wrapper2.eq("out_patien", aphList.get(0).getOutPatien()); + } + + wrapper.eq("hospital_id", aphList.get(0).getCategoryHospitalId());; + Patient patient2=patientService.selectOne(wrapper); + + wrapper2.eq("hospital_id", aphList.get(0).getGroupHospitalId()); + Patient patient3=patientService.selectOne(wrapper); + + if(patient2==null || patient3==null){ + Patient patient=new Patient(); + if(StringUtils.isNotEmpty(aphList.get(0).getPtCard())){ + patient.setCard(aphList.get(0).getPtCard()); + //patient.setBirthDate(aphList.get(0).getPtCard().substring(6, 14)); + } + if(StringUtils.isNotEmpty(aphList.get(0).getSex())){ + patient.setSex(aphList.get(0).getSex()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getPatientName())){ + patient.setPatientName(aphList.get(0).getPatientName()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getHisEsrdNumber())){ + patient.setHisEsrdNumber(aphList.get(0).getHisEsrdNumber()); + } + if(StringUtils.isNotEmpty(aphList.get(0).getOutPatien())){ + patient.setOutPatien(aphList.get(0).getOutPatien()); + } + if(patient2==null){ + patient.setHospitalId(aphList.get(0).getCategoryHospitalId()); + result=patientService.insert(patient); + if(result==true){ + //yd:公司简称 01:远程会诊新增 02:双休转诊新增 03:B超/病理 04 心电 05影像 + ptEsrdNumber="yd05"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + + } + if(patient3==null){ + patient.setHospitalId(aphList.get(0).getGroupHospitalId()); + result=patientService.insert(patient); + if(result==true){ + ptEsrdNumber=StringUtils.isNotEmpty(ptEsrdNumber)?ptEsrdNumber:"yd05"+patient.getId(); + patient.setEsrdNumber(ptEsrdNumber); + patientService.updateById(patient); + } + } + }else{ + ptEsrdNumber=patient2.getEsrdNumber(); + } + + Long id=aphList.get(0).getId(); + aphList.get(0).setEsrdNumber(ptEsrdNumber); + applyPathologyService.updateById(aphList.get(0)); + + if(!aphList.get(0).getAphImgList().isEmpty()){ + for (int i = 0; i < aphList.get(0).getAphImgList().size(); i++) { + aphList.get(0).getAphImgList().get(i).setpId(id); + } + applyPathologyImgService.insertBatch(aphList.get(0).getAphImgList()); + } + }else{ + map.put("msg", "2"); + } + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改 + */ + @RequestMapping("updateAph") + public Map updateAph(ApplyPathology applyPathology){ + Map map=new HashMap(); + try { + boolean result=applyPathologyService.updateById(applyPathology); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @Transactional + @RequestMapping("deleteAphById") + public Map deleteAphById(Long id){ + Map map=new HashMap(); + try { + boolean result=applyPathologyService.deleteById(id); + if(result==true){ + map.put("p_id", id); + applyPathologyImgService.deleteByMap(map); + map.clear(); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询 + */ + @RequestMapping("selectAphById") + public Map selectAphById(Long id){ + Map map=new HashMap(); + ApplyPathology applyPathology=new ApplyPathology(); + List aphImgList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + try { + applyPathology=applyPathologyService.selectById(id); + if(applyPathology!=null){ + //查看分配专家 + wrapper2.eq("p_id",id).ne("state","80"); + ApplyPathologySpecialist aphSp=applyPathologySpecialistService.selectOne(wrapper2); + if(aphSp!=null){ + applyPathology.setSpecialist(aphSp.getSpeName()); + applyPathology.setSpecialistId(aphSp.getSpeId()); + } + + //查看医院名字 + wrapper.eq("id", applyPathology.getCategoryHospitalId()).or().eq("id", applyPathology.getGroupHospitalId()); + List aifList=applyInformationService.selectList(wrapper); + if(!aifList.isEmpty()){ + for (int i = 0; i < aifList.size(); i++) { + if(aifList.get(i).getId().equals(applyPathology.getCategoryHospitalId())){ + applyPathology.setCategoryHospital(aifList.get(i).getHospitalName()); + } + if(aifList.get(i).getId().equals(applyPathology.getGroupHospitalId())){ + applyPathology.setGroupHospital(aifList.get(i).getHospitalName()); + } + } + } + map.put("p_id", id); + aphImgList=applyPathologyImgService.selectByMap(map); + } + map.put("applyPathology", applyPathology); + map.put("aphImgList", aphImgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 管理医院影像列表 + */ + @RequestMapping("selectAphPage") + public Map selectAphPage(String categoryHospitalId,String groupHospitalId,String startTime, + String endTime,String patientName,Integer pageNo,Integer pageSize,Integer type,String part,Long docId,Integer cureType,String diagnosisType){ + Map map=new HashMap(); + map.put("categoryHospitalId", categoryHospitalId); + map.put("groupHospitalId", groupHospitalId); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("patientName", patientName); + map.put("type", type); + map.put("part", part); + map.put("docId", docId); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = applyPathologyService.selectAphPage(map, pageNo, pageSize); + map.clear(); + if(pagetion!=null){ + ApplyPathologySpecialist aphSp=new ApplyPathologySpecialist(); + for (int i = 0; i < pagetion.getList().size(); i++) { + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("p_id", pagetion.getList().get(i).getId()).ne("state","80"); + aphSp=applyPathologySpecialistService.selectOne(wrapper); + if(aphSp!=null){ + pagetion.getList().get(i).setSpecialist(aphSp.getSpeName()); + pagetion.getList().get(i).setSpecialistId(aphSp.getSpeId()); + } + } + } + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + map.remove("groupHospitalId"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("patientName"); + map.remove("type"); + map.remove("part"); + map.remove("docId"); + } + return map; + } + + /** + * 分配专家 + */ + @RequestMapping("insertAphSpecialist") + public Map insertAphSpecialist(ApplyPathologySpecialist aphSp) { + Map map = new HashMap(); + try { + boolean result = applyPathologySpecialistService.insert(aphSp); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家修改状态 + */ + @Transactional + @RequestMapping("updateAphSpecialist") + public Map updateAphSpecialist(ApplyPathologySpecialist aphSp) { + Map map = new HashMap(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + EntityWrapper wrapper=new EntityWrapper(); + String status = ""; + try { + if(aphSp!=null){ + aphSp.setUpdateTime(dateFormat.parse(dateFormat.format(date))); + wrapper.eq("spe_id", aphSp.getSpeId()).eq("p_id", aphSp.getpId()); + boolean result = applyPathologySpecialistService.update(aphSp, wrapper); + if(result == true){ + map.put("p_id", aphSp.getpId()); + List accList=applyPathologySpecialistService.selectByMap(map); + if(!accList.isEmpty()){ + // 分组 + Map collect=accList.stream().collect(Collectors.groupingBy(ApplyPathologySpecialist::getState,Collectors.counting())); + int sum30=collect.get(30)!=null?collect.get(30).intValue():0; + int sum40=collect.get(40)!=null?collect.get(40).intValue():0; + int sum80=collect.get(80)!=null?collect.get(80).intValue():0; + // 状态20 30 40 50 60 70 待分配专家、待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 + // 状态 30 40 50 60 70 80待专家接收、已接收、本医院撤销、上级医院撤销 、已结束 拒接 + + //全部同意则总状态改为 + if(sum40!=0){ + status="40"; + }else if(sum30!=0){ + status="30"; + }else if(sum80!=0 && sum40==0 && sum30==0){ + status="20"; + } + } + if(StringUtils.isNotEmpty(status)){ + ApplyPathology ap=new ApplyPathology(); + ap.setStatus(status); + ap.setId(aphSp.getpId()); + applyPathologyService.updateById(ap); + } + map.put("msg","1"); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 专家影像 + */ + @RequestMapping("selectAphSpePage") + public Map selectAphSpePage(Integer pageNo, Integer pageSize, String patientName, + String startTime, String endTime, String specialistId,Integer part,Integer type) { + Map map = new HashMap(); + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 10 : pageSize; + map.put("patientName", patientName); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("specialistId",specialistId); + map.put("part",part); + map.put("type",type); + try { + Pagetion pagetion = applyPathologyService.selectAphSpePage(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("patientName"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("specialistId"); + map.remove("part"); + map.remove("type"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BModeReportController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BModeReportController.java new file mode 100644 index 0000000..136f8f0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BModeReportController.java @@ -0,0 +1,281 @@ +package com.imurs.controller; + +import com.imurs.entity.ApplyBModeImg; +import com.imurs.entity.BModeHistory; +import com.imurs.entity.BModeReport; +import com.imurs.service.ApplyBModeImgService; +import com.imurs.service.BModeHistoryService; +import com.imurs.service.BModeReportService; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author laier + * @date 2022-12-05 10:01 + */ +@RestController +@RequestMapping("report") +public class BModeReportController { + Logger logger = LoggerFactory.getLogger(BModeReportController.class); + + @Autowired + BModeReportService bModeReportService; + @Autowired + ApplyBModeImgService applyBModeImgService; + @Autowired + BModeHistoryService bModeHistoryService; + /** + * 基层批量新增超声报告,并修改病例状态为待审核报告 + * @param modeReports + * @return + */ + @PostMapping("insertModeReportList") + public Map insertModeReportList(@RequestBody List modeReports) { + Map resultMap = new HashMap<>(8); + try { + if (!CollectionUtils.isEmpty(modeReports)) { + // 同一个病例的报告,bId一致 + Long bId = modeReports.get(0).getbId(); + List resultReports = bModeReportService.insertModeReportList(bId,modeReports); + if (resultReports == null) { + resultMap.put("msg","2"); + } + resultMap.put("msg","1"); + resultMap.put("resultReports",resultReports); + } else { + resultMap.put("msg","2"); + } + } catch (Exception e) { + logger.error("基层批量新增超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + +// /** +// * 专家提交报告,省略审核流程,提交即为完成报告,修改状态,增加签名等 +// * @param modeReports 报告列表 +// * @return resultMap +// */ +// @RequestMapping("insertReportBySpecialist") +// public Map insertReportBySpecialist(@RequestBody List modeReports) { +// Map resultMap = new HashMap<>(8); +// if (!CollectionUtils.isEmpty(modeReports)) { +// try { +// // 同一个病例的报告,bId一致 +// Long bId = modeReports.get(0).getbId(); +// Long speId = modeReports.get(0).getSpeId(); +// // 新增报告 +// List resultReports = bModeReportService.insertModeReportList(bId,modeReports); +// // 修改报告状态、病例状态、新增专家签名 +// resultReports = bModeReportService.finishModeReport(bId,speId,resultReports); +// if (resultReports == null) { +// resultMap.put("msg","2"); +// } +// resultMap.put("msg","1"); +// resultMap.put("resultReports",resultReports); +// } catch (Exception e) { +// logger.error("专家批量新增超声报告异常:",e); +// resultMap.put("msg","4"); +// } +// } else { +// resultMap.put("msg","2"); +// } +// return resultMap; +// } + + /** + * 根据bId查询报告列表 + * @param bId 报告所属病例id + * @return + */ + @GetMapping("selectModeReportListByBId") + public Map selectModeReportList(Long bId) { + Map resultMap = new HashMap<>(8); + try { + List modeReportList = bModeReportService.selectModeReportListByBId(bId); + resultMap.put("msg","1"); + resultMap.put("modeReportList",modeReportList); + } catch (Exception e) { + logger.error("查询超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 根据报告id查询报告详情 + * @param reportId 报告id + * @return + */ + @GetMapping("selectModeReportByReportId") + public Map selectModeReportByReportId(Long reportId) { + Map resultMap = new HashMap<>(8); + List bModeImgList = new ArrayList<>(); + try { + BModeReport modeReport = bModeReportService.selectModeReportByReportId(reportId); + if (!StringUtils.isEmpty(modeReport.getImageIds())) { + String[] split = modeReport.getImageIds().split(","); + bModeImgList = applyBModeImgService.selectBatchIds(Arrays.asList(split)); + } + resultMap.put("msg","1"); + resultMap.put("modeReport",modeReport); + resultMap.put("bModeImgList",bModeImgList); + } catch (Exception e) { + logger.error("查询报告详情异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 根据id删除超声报告 + * @param reportId 报告id + * @return + */ + @RequestMapping("deleteReportById") + public Map deleteReportById(Long reportId) { + Map resultMap = new HashMap<>(8); + try { + bModeReportService.deleteById(reportId); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("删除超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 基层医生修改超声报告 + * @param modeReport + * @return + */ + @PostMapping("updateModeReportByReportId") + public Map updateModeReportByReportId(@RequestBody BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + // 图片id由list转string + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + bModeReportService.updateById(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("基层医生修改超声报告异常:",e); + resultMap.put("msg","4"); + } + return resultMap; + } + + /** + * 专家审核报告,判断该病例所有病例是否审核完毕,是则改变病例状态,会诊状态以及专家表状态。 + * @param modeReport + * @return + */ + @PostMapping("checkReportBySpecialist") + public Map checkRepostBySpecialist(@RequestBody BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + bModeReportService.checkReportAndChangeModelState(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("专家审核报告异常",e); + resultMap.put("msg","4"); + } + return resultMap; + } + //主表存储当前最新记录。 + //历史表存储所有历史记录,每次更新都会生成一条新历史记录 + // + @RequestMapping(value="UpdateAndSaveHisBmodeReport") + // @PostMapping("UpdateAndSaveHisBmodeReport") + public Map UpdateAndSaveBmodeReport(BModeReport modeReport) { + Map resultMap = new HashMap<>(8); + try { + //第一步存历史记录 一个是病例id 一个是表主键ID ,那修改的时候,是应该按主键id的 病例ID 有可能是多张报告,不清楚是不是 + //多张一起修改的,所以我默认它是一张张修改保存的 + BModeReport oldBmodeRe=bModeReportService.selectModeReportByReportId(modeReport.getId()); + //查到这个数据以后 把这份数据存进去 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + BModeHistory bH =new BModeHistory(); + bH.setbId(oldBmodeRe.getbId()); + bH.setbHint(oldBmodeRe.getbHint()); + bH.setbSee(oldBmodeRe.getbSee()); + //bH.setCriticalValue(oldBmodeRe.getCriticalValue()); + bH.setUpdateTime(oldBmodeRe.getUpdateTime()); + bH.setReportId(oldBmodeRe.getId()); + bH.setExaminePart(oldBmodeRe.getExaminePart()); + bH.setSpeId(oldBmodeRe.getSpeId()); + bH.setNature(oldBmodeRe.getNature()); + //System.out.println("报告医生"+oldBmodeRe.getUpdateDoc()+modeReport.getId()); + bH.setUpdateDoc(oldBmodeRe.getUpdateDoc()); + bH.setUpdateTime(oldBmodeRe.getUpdateTime()); + //System.out.println("报告时间"+oldBmodeRe.getUpdateTime()+modeReport.getId()); + //System.out.println("参数"+updateDoc+"---"+oldBmodeRe.getUpdateTime()); + bH.setGroupDate(oldBmodeRe.getGroupDate()); + bH.setInitial(oldBmodeRe.getInitial()==null?"":oldBmodeRe.getInitial()); + bH.setOpinion(oldBmodeRe.getOpinion()==null?"":oldBmodeRe.getOpinion()); + + bH.setImageIds(oldBmodeRe.getImageIds()==null?"":oldBmodeRe.getImageIds()); + /* + * if (!CollectionUtils.isEmpty(oldBmodeRe.getImageIds())) { String[] split = + * modeReport.getImageIds().split(","); + * + * String imageIds = StringUtils.join(oldBmodeRe.getImageIdList(), ","); + * System.out.println("图片字符串"+imageIds); bH.setImageIds(imageIds); } + */ + + boolean issucess=bModeHistoryService.insert(bH); + if(!issucess) { + resultMap.put("msg","插入历史数据不成功"); + + } + // + //根据id 把修改的记录存到主表去, + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + modeReport.setUpdateTime(updateTime); + bModeReportService.updateById(modeReport); + resultMap.put("msg","1"); + } catch (Exception e) { + logger.error("更新报告异常",e); + resultMap.put("msg","4"); + } + return resultMap; + } + //根据报告id查询历史记录, + + @PostMapping("selectModeHisReportListByBId") + public Map selectModeHisReportListByBId(Long bId,Long reportId) { + Map resultMap = new HashMap<>(8); + Map map = new HashMap(); + // System.out.println(reportId+"查询所有"+bId); + map.put("bId",bId); + map.put("reportId",reportId); + try { + List modeReportList = bModeHistoryService.selectBmodeHis(map); + /* + * for(BModeHistory b:modeReportList) { System.out.println("查看列表数据"+b); } + */ + resultMap.put("msg","1"); + resultMap.put("modeReportList",modeReportList); + } catch (Exception e) { + logger.error("查询超声报告异常:",e); + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BmodeSendMsgController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BmodeSendMsgController.java new file mode 100644 index 0000000..800f080 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BmodeSendMsgController.java @@ -0,0 +1,82 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + + +/** + * 预约超声短信提示 + * + * @author Server + * + */ +@RestController +@RequestMapping("/BmodeSendMsg") +public class BmodeSendMsgController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + @RequestMapping("/sendMsgYy") + public Map sendMsg(String hostName,String docName,Integer docId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + User user = userService.selectById(docId); + String contactPhone = user.getContactPhone(); + map.put("phone", contactPhone); + map.put("msg",hostName+docName+"医生,您好!你方预约的远程超声检查即将开始,请尽快登陆系统"); + //调用创蓝接口发送短信 + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + //Json格式化返回信息 + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + @RequestMapping("/sendMsg") + public Map sendMsg(String hostName,String docName,String patientName,Integer docId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + User user = userService.selectById(docId); + String contactPhone = user.getContactPhone(); + map.put("phone", contactPhone); + map.put("msg","尊敬的"+docName+"医生,"+hostName+patientName+"患者预约的远程超声已经上线,请您及时登陆。"); + //调用创蓝接口发送短信 + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + + //Json格式化返回信息 + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BrightnessmodeController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BrightnessmodeController.java new file mode 100644 index 0000000..5206e40 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/BrightnessmodeController.java @@ -0,0 +1,124 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import com.imurs.entity.*; +import com.imurs.service.*; +import org.apache.poi.hssf.record.OldFormulaRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.parameter.Bchao; +import com.imurs.parameter.Bchildren; +import com.imurs.parameter.Bmenu; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; + +@RestController +@RequestMapping(value = "Bscan") +public class BrightnessmodeController { + @Autowired + BmodelFrisService bmodelFrisService; + @Autowired + BmodelService bmodelService; + @Autowired + BmodelSecondService bmodelSecondService; + @Autowired + BdiagnosisService bDiagnosisService; + @Autowired + BdiagnosisNextService bDiagnosisNextService; + /** + * 查询所有B超模板数据 + */ + @RequestMapping(value = "selectInforByRid") + public Map selectInforByRid(String rid) { + Map map = new HashMap(); + try { + EntityWrapper wrapper=new EntityWrapper(); + //EntityWrapper wrapper1=new EntityWrapper(); + //EntityWrapper wrapper2=new EntityWrapper(); + List bmodel=bmodelService.selectList(wrapper.orderBy("first_id",true)); + // System.out.println("长度"+bmodel.size()+bmodel.toString()); + //三次单独的查询,将每级的菜单数据分别保存出来 + List tree = new ArrayList(); + // + for(Bmodel bm:bmodel){ + // m.put(bm.getId(), bm); + //根据这个循环 查出对应ID的二级目录 + // wrapper1.eq("bf_id", bm.getId()); + // System.out.println("一级子菜单的ID"+bm.getId()); + //List bmodelFris=bmodelFrisService.selectList(wrapper1); + List bmodelFris=bmodelFrisService.selectBmodelFris(bm.getId()); + Bchao bc =new Bchao(); + // System.out.println("查询到二级子菜单的内容"+bmodelFris.toString()); + List li= new ArrayList(); + bc.setName(bm.getFirstText()); + bc.setId(bm.getId()); + //二级菜单的数据保存 + for(BmodelFris bf:bmodelFris){ + Bchildren bd = new Bchildren(); + bd.setId(bf.getSecondId());//下一级的ID + bd.setThird_text(bf.getSecondText());//二级目录的文本 + li.add(bd); + + } + bc.setBchildren(li); + tree.add(bc); + } + //将三级菜单录进去 + + for(Bchao bc:tree){ + + List list =bc.getBchildren(); + //System.out.println("list的尺寸"+list.size()); + for(Bchildren b:list){ + //查询到第三级数据 + List chilList = bmodelSecondService.selectbmodelSecond(b.getId()); + b.setListbchildren(chilList); + } + + } + map.put("MENU", tree); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + @RequestMapping(value = "selectdiagnosisByRid") + public Map selectdiagnosisByRid(String rid) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapper2=new EntityWrapper(); + List Bdiagnosislist= bDiagnosisService.selectList(wrapper.orderBy("id",true)); + List tree = new ArrayList(); + + for(Bdiagnosis bd:Bdiagnosislist){ + List bdnlist =bDiagnosisNextService.selectDiagnosisList(bd.getId()); + Items bc =new Items(); + bc.setIcon(bd.getId()+""); + bc.setName(bd.getName()); + //System.out.println("打印出来的ID"+bd.getId()); + //System.out.println(bdnlist.toString()); + List li= new ArrayList(); + for(BdiagnosisNext bg:bdnlist){ + Children cd =new Children(); + cd.setName(bg.getName()); + cd.setPath(bg.getId()+""); + li.add(cd); + } + bc.setChildren(li); + tree.add(bc); + } + + map.put("tree", tree); + return map; + + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CaseTemplateController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CaseTemplateController.java new file mode 100644 index 0000000..407d571 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CaseTemplateController.java @@ -0,0 +1,179 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.CaseTemplate; +import com.imurs.service.CaseTemplateService; +import io.github.yedaxia.apidocs.ApiDoc; +import org.apache.ibatis.jdbc.Null; +import org.apache.ibatis.scripting.xmltags.ForEachSqlNode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping(value = "casetemp") +public class CaseTemplateController { + + @Autowired + CaseTemplateService caseTemplateService; + + /** + * @ + * @Author xfh + * @Date 2020/12/14 16:01 + * @Param + * @Return + * @Exception + * + */ + @RequestMapping(value = "selectCaseTemplateAll") + public Map SelectCaseTemplateAll(String name){ + HashMap map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("level","1"); + if(name!=null){ + wrapper.like("name", "%" + name + "%"); + } + List caseTemplates = caseTemplateService.selectList(wrapper); + if(!caseTemplates.isEmpty()){ + for (CaseTemplate caseTemplate : caseTemplates) { + EntityWrapper wrapper1 = new EntityWrapper<>(); + wrapper1.eq("parent_id",caseTemplate.getId()); + List caseTemplates1 = caseTemplateService.selectList(wrapper1); + caseTemplate.setCaseTemplateList(caseTemplates1); + if(!caseTemplates1.isEmpty()){ + for (CaseTemplate casetemplate:caseTemplates1) { + EntityWrapper wrapper2 = new EntityWrapper<>(); + wrapper2.eq("parent_id",casetemplate.getId()); + List caseTemplates2 = caseTemplateService.selectList(wrapper2); + casetemplate.setCaseTemplateList(caseTemplates2); + } + } + } + } + map.put("caseTemplates",caseTemplates); + return map; + } + + /** + * @ + * @Author xfh + * @Date 2020/12/14 16:02 + * @Param + * @Return + * @Exception + * + */ + @RequestMapping(value = "updateCaseTemplate") + public Map UpdateCaseTemplateAll(@RequestBody CaseTemplate caseTemplate){ + HashMap map = new HashMap<>(); + + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.updateById(caseTemplate); + map.put("msg", result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping(value = "saveCaseTemplate") + public Map saveCaseTemplate(@RequestBody CaseTemplate caseTemplate){ + + HashMap map = new HashMap<>(); + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.insert(caseTemplate); + map.put("id",caseTemplate.getId()); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "deleteCaseTemplateById") + public Map deleteCaseTemplateById(Long id){ + + HashMap map = new HashMap<>(); + try { + if(id!=null){ + boolean result = caseTemplateService.deleteById(id); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "deleteCaseTemplate") + public Map deleteCaseTemplate(@RequestBody CaseTemplate caseTemplate){ + + HashMap map = new HashMap<>(); + try { + if(caseTemplate!=null){ + boolean result = caseTemplateService.deleteById(caseTemplate); + map.put("msg",result==true?"1":"2"); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "selectCaseTemplateByName") + public Map deleteCaseTemplate(@RequestParam String name){ + + HashMap map = new HashMap<>(); + try { + if(name!=null){ + EntityWrapper wrapper = new EntityWrapper<>(); + List caseTemplateList = caseTemplateService.selectList(wrapper.like("name", "%" + name + "%")); + map.put("caseTemplateList",caseTemplateList); + } + } catch (Exception e) { + map.put("error",e.getMessage()); + map.put("msg","4"); + } + return map; + } + + @RequestMapping(value = "MySelectCaseTemplateAll") + public Map MySelectCaseTemplateAll(){ + HashMap map = new HashMap<>(); + List caseTemplates1 = caseTemplateService.selectList(new EntityWrapper<>()); + List collect = caseTemplates1.stream() + .filter(item -> item.getParentId() == 0) + .map(item->{ + item.setCaseTemplateList(getChildrens(item,caseTemplates1)); + return item; + }).collect(Collectors.toList()); + map.put("collect",collect); + return map; + } + public List getChildrens(CaseTemplate caseTemplate,List caseTemplateList){ + + List childrens = caseTemplateList.stream().filter(item -> { + return item.getParentId() == caseTemplate.getId(); + }).map(menu -> { + menu.setCaseTemplateList(getChildrens(menu, caseTemplateList)); + return menu; + }).collect(Collectors.toList()); + return childrens; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java new file mode 100644 index 0000000..18030e0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ClinicalGuidelinesController.java @@ -0,0 +1,227 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.entity.TotalClinicalGuidelines; +import com.imurs.service.ClinicalGuidelinesService; +import com.imurs.service.TotalClinicalGuidelinesService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping(value="cgs") +public class ClinicalGuidelinesController { + + @Autowired + ClinicalGuidelinesService clinicalGuidelinesService; + + @Autowired + TotalClinicalGuidelinesService totalClinicalGuidelinesService; + + + /** + * 新增 + */ + @RequestMapping("insertCg") + public Map insertCg(ClinicalGuidelines clinicalGuidelines){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.insert(clinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改 + */ + @RequestMapping("updateCg") + public Map updateCg(ClinicalGuidelines clinicalGuidelines){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.updateById(clinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @RequestMapping("deleteCg") + public Map deleteCg(Long id){ + Map map = new HashMap(); + try { + boolean result = clinicalGuidelinesService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 查看详情 + */ + @RequestMapping("selectCgById") + public Map selectCgById(Long id){ + Map map = new HashMap(); + try { + ClinicalGuidelines cg = clinicalGuidelinesService.selectById(id); + map.put("cg", cg); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示 + */ + @RequestMapping(value="selectGsPage") + public Map selectGsPage(String hospitalId,Integer pageNo,Integer pageSize,String startTime,String endTime,String cgName,String rid){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + + EntityWrapper wrapper2=new EntityWrapper(); + List totalList=new ArrayList(); + page.setRows(pageSize==null?10:pageSize); + page.setPage(pageNo==null?1:pageNo); + + wrapper2.isNotNull("hospital_id").isNotNull("clinical_id"); + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper2.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(startTime)){ + wrapper.ge("upload_date", startTime); + wrapper2.ge("create_time", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("upload_date",dateFormat.format(cal.getTime())); + wrapper2.lt("create_time",dateFormat.format(cal.getTime())); + } + + if(StringUtils.isNotEmpty(cgName)){ + wrapper.like("cg_name", cgName); + } + wrapper.orderBy("upload_date", false); + try { + Page pageList=clinicalGuidelinesService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + totalList=totalClinicalGuidelinesService.selectList(wrapper2); + if(totalList.isEmpty()){ + for (int i = 0; i < customPage.getRows().size(); i++) { + customPage.getRows().get(i).setPviews(0); + } + }else{ + Map result=totalList.stream().collect(Collectors.groupingBy(TotalClinicalGuidelines::getClinicalId,Collectors.counting())); + for (int i = 0; i < customPage.getRows().size(); i++) { + if(result!=null && result.get(customPage.getRows().get(i).getId())!=null){ + customPage.getRows().get(i).setPviews(result.get(customPage.getRows().get(i).getId()).intValue()); + }else{ + customPage.getRows().get(i).setPviews(0); + } + } + } + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看诊疗指南添加查看记录次数 + */ + @RequestMapping("insetTotCgByDocId") + public Map insetTotCgByDocId(TotalClinicalGuidelines totalClinicalGuidelines){ + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("clinical_id", totalClinicalGuidelines.getClinicalId()); + wrapper.eq("doc_id", totalClinicalGuidelines.getDocId()); + TotalClinicalGuidelines totCg = totalClinicalGuidelinesService.selectOne(wrapper); + if(totCg==null){ + Boolean result = totalClinicalGuidelinesService.insert(totalClinicalGuidelines); + map.put("msg", result == true ? "1" : "2"); + } + map.put("msg", "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 诊疗指南分页显示列表 + @RequestMapping("selectGsPage") + public Map selectGsPage(String startTime,String endTime,String cgName,String docId, + Integer pageNo ,Integer pageSize){ + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + if(StringUtils.isNotEmpty(startTime)){ + map.put("startTime", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + map.put("endTime",endTime); + } + if(StringUtils.isNotEmpty(docId)){ + map.put("docId",docId); + } + + if(StringUtils.isNotEmpty(cgName)){ + map.put("cgName", cgName); + } + Pagetion totalCgList = clinicalGuidelinesService.selectCgsOrByDocIdPage(map, pageNo, pageSize); + map.put("totalCgList", totalCgList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("startTime"); + map.remove("endTime"); + map.remove("docId"); + map.remove("cgName"); + } + return map; + }**/ +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CloudImageController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CloudImageController.java new file mode 100644 index 0000000..0bebe35 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/CloudImageController.java @@ -0,0 +1,84 @@ +package com.imurs.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.imurs.sound.ConnUtil; +import com.imurs.util.MD5; +import org.json.JSONObject; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author wdh + */ +@RestController +@RequestMapping("cloud") +public class CloudImageController { + + /** + * 调用易联云影像的接口返回报告数据 + * @param hospitalName 医院名称 + * @param identificationNumber 病人身份证号码 + * @param beginDate 开始时间 + * @param endDate 结束时间 + * @return + */ + @RequestMapping("getreport") + public Map getReport(String hospitalName,String identificationNumber, + String beginDate,String endDate) { + Map map = new HashMap<>(); + String key = "test"; + String sign = MD5.GetMD5Code(MD5.GetMD5Code(hospitalName + identificationNumber + + beginDate + endDate) + key); + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("HospitalName",hospitalName); + jsonObject.put("IdentificationNumber",identificationNumber); + jsonObject.put("BeginDate",beginDate); + jsonObject.put("EndDate",endDate); + jsonObject.put("Key",key); + jsonObject.put("Sign",sign); + + //建立URL连接对象 + URL url = new URL("http://cloud.elincloud.cn:8013/YDService/GetReport"); + //创建连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置请求的方式(需要是大写的) + conn.setRequestMethod("POST"); + //设置需要输出 + conn.setDoOutput(true); + //设置超时 + conn.setConnectTimeout(5000); + //写入参数. + conn.getOutputStream().write(jsonObject.toString().getBytes()); + //发送请求到服务器 + conn.connect(); + //获取远程响应的内容. + String responseContent = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("utf-8")); + com.alibaba.fastjson.JSONObject response = JSON.parseObject(responseContent); + conn.disconnect(); + map.put("response",response); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DataSummarizationController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DataSummarizationController.java new file mode 100644 index 0000000..917a2cb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DataSummarizationController.java @@ -0,0 +1,323 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyCase; +import com.imurs.entity.ApplyConsultation; +import com.imurs.entity.ApplyInformation; +import com.imurs.parameter.DataSummarization; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.ApplyConsultationService; +import com.imurs.service.ApplyInformationService; + +/** + * 数据汇总 + * @author D140 + * + */ +@RestController +@RequestMapping("data") +public class DataSummarizationController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + ApplyBModeService applyBModeService; + + + /** + * 基层医院远程会诊汇总表 + */ + @RequestMapping("/basicHospitalData") + public Map basicHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper<>(); + EntityWrapper caseAWrapper=new EntityWrapper(); + EntityWrapper caseBWrapper=new EntityWrapper(); + EntityWrapper conWrapper=new EntityWrapper(); + DataSummarization dataSum=new DataSummarization(); + try { + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + //医院 + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id").where("").eq("id", id); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + dataSum.setId(id); + dataSum.setHospitalName(infor.getHospitalName()); + dataSum.setSetupTime(infor.getSetupTime()); + + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 plan_time + if (StringUtils.isNotEmpty(startTime)) { + caseAWrapper.ge("plan_time",startTime); + caseBWrapper.ge("plan_time",startTime); + conWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + caseAWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + caseBWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + caseAWrapper.in("statu", "4,5,6,7").eq("hospital_id", id); + int typeA=applyCaseService.selectCount(caseAWrapper); + dataSum.setTypeA(typeA); + + caseBWrapper.in("statu", "4,5,6,7").eq("plan_hospital_id", id); + int typeB=applyCaseService.selectCount(caseBWrapper); + dataSum.setTypeB(typeB); + + //视频会诊 status:70 + //LX SP category_hospital_id + conWrapper.eq("status", "70").eq("category_hospital_id",id); + List conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + Map result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCountyLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCountySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + map.clear(); + map.put("dataSum", dataSum); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 白银市人民医院远程会诊汇总表 + */ + @RequestMapping("/cityHospitalData") + public Map cityHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper<>(); + EntityWrapper conWrapper=new EntityWrapper(); + EntityWrapper modeWrapper=new EntityWrapper(); + //EntityWrapper ecgWrapper=new EntityWrapper(); + //EntityWrapper pathologyWrapper=new EntityWrapper(); + DataSummarization dataSum=new DataSummarization(); + try { + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + //医院 + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id").where("").eq("id", id); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + dataSum.setId(id); + dataSum.setHospitalName(infor.getHospitalName()); + dataSum.setSetupTime(infor.getSetupTime()); + + //视频会诊 status:70 LX SP group_hospital_id + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 plan_time + if (StringUtils.isNotEmpty(startTime)) { + conWrapper.ge("group_date",startTime); + modeWrapper.ge("group_date", startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + modeWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + conWrapper.eq("status", "70").eq("group_hospital_id", id); + List conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + Map result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCityLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCitySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + + //远程b超 远程病理 state:1:b超 2:病理 状态70 已结束 group_hospital_id + modeWrapper.eq("status", "70").eq("group_hospital_id", id); + List bModeList=applyBModeService.selectList(modeWrapper); + if(!bModeList.isEmpty()){ + Map result=bModeList.stream().collect(Collectors.groupingBy(ApplyBMode::getState,Collectors.counting())); + dataSum.setBmode(result.get(1)!=null?result.get(1).intValue():0); + dataSum.setBl(result.get(2)!=null?result.get(2).intValue():0); + } + //远程心电 + //ecgWrapper.eq("status", "70").eq("group_hospital_id", id); + //dataSum.setEcg(applyEcgService.selectCount(ecgWrapper)); + + //远程影像 + //pathologyWrapper.eq("status", "70").eq("group_hospital_id", id); + //dataSum.setShadow(applyPathologyService.selectCount(pathologyWrapper)); + + map.clear(); + map.put("dataSum", dataSum); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 靖远县人民医院远程会诊汇总表 + */ + @RequestMapping("/adminHospitalData") + public Map adminHospitalData(String id,String startTime,String endTime){ + Map map=new HashMap(); + List conList=new ArrayList(); + List dataSumList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper<>(); + String acount; + Map result=null; + try { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + + wrapper.setSqlSelect("hospital_name as hospitalName,setup_time as setupTime,id,rid").where(""); + if(org.apache.commons.lang.StringUtils.isNotEmpty(id)){ + wrapper.eq("id", id); + } + wrapper.orderBy("FIELD(rid,9,1),setupTime",false); + List inforList=applyInformationService.selectList(wrapper); + if(!inforList.isEmpty()){ + for (int i = 0; i < inforList.size(); i++) { + DataSummarization dataSum=new DataSummarization(); + acount=inforList.get(i).getId(); + dataSum.setHospitalName(inforList.get(i).getHospitalName()); + dataSum.setId(acount); + dataSum.setSetupTime(inforList.get(i).getSetupTime()); + + if(inforList.get(i).getRid().intValue()!=1 && inforList.get(i).getRid().intValue()!=9){ + EntityWrapper caseAWrapper=new EntityWrapper(); + EntityWrapper caseBWrapper=new EntityWrapper(); + EntityWrapper conWrapper=new EntityWrapper(); + + if (StringUtils.isNotEmpty(startTime)) { + caseAWrapper.ge("plan_time",startTime); + caseBWrapper.ge("plan_time",startTime); + conWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + caseAWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + caseBWrapper.lt("plan_time",dateFormat.format(cal.getTime())); + conWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } + //双向转诊 4:已接收,5:已就诊,6:已住院,7:未就诊 + //hospital_id:向上 plan_hospital_id:向下 + caseAWrapper.in("statu", "4,5,6,7").eq("hospital_id", acount); + dataSum.setTypeA(applyCaseService.selectCount(caseAWrapper)); + + caseBWrapper.in("statu", "4,5,6,7").eq("plan_hospital_id", acount); + dataSum.setTypeB(applyCaseService.selectCount(caseBWrapper)); + + //离线/视频会诊 基层到县医院(靖远县) + conWrapper.eq("status", "70").eq("category_hospital_id", acount); + conList=applyConsultationService.selectList(conWrapper); + if(!conList.isEmpty()){ + result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCountyLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCountySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + dataSumList.add(dataSum); + + //市级医院 + }else if(inforList.get(i).getRid().intValue()==9){ +// EntityWrapper ecgWrapper=new EntityWrapper(); +// EntityWrapper pathologyWrapper=new EntityWrapper(); + EntityWrapper consWrapper=new EntityWrapper(); + EntityWrapper modeWrapper=new EntityWrapper(); + if (StringUtils.isNotEmpty(startTime)) { + modeWrapper.ge("group_date",startTime); + consWrapper.ge("group_date",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + consWrapper.lt("group_date",dateFormat.format(cal.getTime())); + modeWrapper.lt("group_date",dateFormat.format(cal.getTime())); + } +// //视频会诊 status:70 LX SP group_hospital_id + consWrapper.eq("status", "70").eq("group_hospital_id", acount); + conList=applyConsultationService.selectList(consWrapper); + if(!conList.isEmpty()){ + result=conList.stream().collect(Collectors.groupingBy(ApplyConsultation::getDiagnosisType,Collectors.counting())); + dataSum.setCityLX(result.get("LX")!=null?result.get("LX").intValue():0); + dataSum.setCitySP(result.get("SP")!=null?result.get("SP").intValue():0); + } + + //远程b超 远程病理 state:1:b超 2:病理 状态70 已结束 group_hospital_id + modeWrapper.eq("status", "70").eq("group_hospital_id", acount); + List bModeList=applyBModeService.selectList(modeWrapper); + + if(!bModeList.isEmpty()){ + Map result2=bModeList.stream().collect(Collectors.groupingBy(ApplyBMode::getState,Collectors.counting())); + dataSum.setBmode(result2.get(1)!=null?result2.get(1).intValue():0); + dataSum.setBl(result2.get(2)!=null?result2.get(2).intValue():0); + } + dataSumList.add(dataSum); +// //远程心电 +// ecgWrapper.eq("status", "70").eq("group_hospital_id", acount); +// dataSum.setEcg(applyEcgService.selectCount(ecgWrapper)); +// +// //远程影像 +// pathologyWrapper.eq("status", "70").eq("group_hospital_id", acount); +// dataSum.setShadow(applyPathologyService.selectCount(pathologyWrapper)); +// + + //靖远医院数据汇总 + }else if(inforList.get(i).getRid().intValue()==1){ + dataSum.setTypeA(dataSumList.stream().mapToInt(DataSummarization::getTypeA).sum()); + dataSum.setTypeB(dataSumList.stream().mapToInt(DataSummarization::getTypeB).sum()); + dataSum.setCountyLX(dataSumList.stream().mapToInt(DataSummarization::getCountyLX).sum()); + dataSum.setCountySP(dataSumList.stream().mapToInt(DataSummarization::getCountySP).sum()); + dataSum.setCityLX(dataSumList.stream().mapToInt(DataSummarization::getCityLX).sum()); + dataSum.setCitySP(dataSumList.stream().mapToInt(DataSummarization::getCitySP).sum()); + dataSum.setBmode(dataSumList.stream().mapToInt(DataSummarization::getBmode).sum()); + dataSum.setBl(dataSumList.stream().mapToInt(DataSummarization::getBl).sum()); + //dataSum.setEcg(dataSumList.stream().mapToInt(DataSummarization::getEcg).sum()); + //dataSum.setShadow(dataSumList.stream().mapToInt(DataSummarization::getShadow).sum()); + dataSum.setEcg(0); + dataSum.setShadow(0); + dataSumList.add(dataSum); + } + } + //靖远医院数据汇总 + map.clear(); + map.put("dataSum", dataSumList); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorArrangeController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorArrangeController.java new file mode 100644 index 0000000..24b49c2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorArrangeController.java @@ -0,0 +1,281 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.ImgArrange; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.ImgArrangeService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 医生下乡排班控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "arrange") +public class DoctorArrangeController { + + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + ImgArrangeService imgArrangeService; + + + + /** + * 新增医生下乡排班 + * + * @return + */ + @RequestMapping(value = "insertArrange") + public Map insertArrange(DoctorArrange doctorArrange) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.insert(doctorArrange); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改医生下乡排班 + * + * @return + */ + @Transactional + @RequestMapping(value = "updateArrangeById") + public Map updateArrangeById(@RequestBody List adList) { + Map map = new HashMap(); + try { + if (!adList.isEmpty()) { + boolean result = doctorArrangeService.updateById(adList.get(0)); + if (result == true && !adList.get(0).getIaList().isEmpty()) { + Long id = adList.get(0).getId(); + map.put("msg", "1"); + for (int i = 0; i < adList.get(0).getIaList().size(); i++) { + adList.get(0).getIaList().get(i).setArrangeId(id); + imgArrangeService.insert(adList.get(0).getIaList().get(i)); + } + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改医生下乡排班 + * + * @return + */ + @RequestMapping(value = "updateArrange") + public Map updateArrange(DoctorArrange doctorArrange) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.updateById(doctorArrange); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除医生下乡排班 + * + * @return + */ + @Transactional + @RequestMapping(value = "deleteArrange") + public Map deleteArrange(Long id) { + Map map = new HashMap(); + try { + boolean result = doctorArrangeService.deleteById(id); + if(result == true){ + map.put("arrange_id", id); + imgArrangeService.deleteByMap(map); + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看医生排班详情(关联查询) + */ + @RequestMapping(value = "selectArrangeById") + public Map selectArrangeById(Long id) { + Map map = new HashMap(); + try { + DoctorArrange arange = doctorArrangeService.selectArrangeByUser(id); + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看医生排班详情及工作照(关联查询) + */ + @RequestMapping(value = "selectArrangeByImg") + public Map selectArrangeByImg(Long id) { + Map map = new HashMap(); + map.put("arrange_id", id); + map.put("type", "B"); + try { + DoctorArrange arange = doctorArrangeService.selectArrangeByUser(id); + if(arange!=null){ + List iaList=imgArrangeService.selectByMap(map); + map.put("iaList", iaList); + } + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("arrange_id"); + map.remove("type"); + } + return map; + } + + + /** + * 查看医生排班详情及工作照(非关联查询) + */ + @RequestMapping(value = "selectArrangeImg") + public Map selectArrangeImg(Long id) { + Map map = new HashMap(); + map.put("arrange_id", id); + map.put("type", "B"); + try { + DoctorArrange arange = doctorArrangeService.selectById(id); + if(arange!=null){ + List iaList=imgArrangeService.selectByMap(map); + map.put("iaList", iaList); + } + map.put("arange", arange); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("arrange_id"); + map.remove("type"); + } + return map; + } + + + /** + * 医生排班列表分页显示 + */ + @RequestMapping(value = "selectArrangePage") + public Map selectArrangePage(Integer pageNo, Integer pageSize, String startTime,String endTime, + String receiveHospitalId, String doctorName, String status) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + page.setRows(pageSize == null ? 6 : pageSize); + page.setPage(pageNo == null ? 1 : pageNo); + + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("status", status).eq("receive_hospital_id", receiveHospitalId); + if (StringUtils.isNotEmpty(doctorName)) { + wrapper.like("doctor_name", doctorName); + } + try { + if (StringUtils.isNotEmpty(startTime)) { + wrapper.ge("start_time",startTime); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("end_time",dateFormat.format(cal.getTime())); + } + wrapper.orderBy("start_time", false); + Page pageList = doctorArrangeService.selectPage(page.getPagePlusTwo(), wrapper); + if (pageList == null) { + map.put("msg", "3"); + } else { + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医生排班列表分页显示 关联查询 + */ + @RequestMapping(value = "selectArrangeByPage") + public Map selectArrangeByPage(Integer pageNo, Integer pageSize, String startTime,String endTime, + String receiveHospitalId, String status, Long docId) { + Map map = new HashMap(); + + pageSize = pageSize == null ? 10 : pageSize; + pageNo = pageNo == null ? 1 : pageNo; + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("status", status); + map.put("receiveHospitalId", receiveHospitalId); + if (docId != null) { + map.put("docId", docId); + } + try { + Pagetion pageList = doctorArrangeService.selectByArrangePage(map, pageNo, pageSize); + map.put("customPage", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("status"); + map.remove("startTime"); + map.remove("endTime"); + map.remove("receiveHospitalId"); + map.remove("docId"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorGroupController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorGroupController.java new file mode 100644 index 0000000..e6c48aa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DoctorGroupController.java @@ -0,0 +1,228 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.DoctorGroup; +import com.imurs.entity.User; +import com.imurs.service.DoctorGroupService; +import com.imurs.service.UserService; +import com.imurs.util.LetterIncrementor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/doctorGroup") +public class DoctorGroupController { + @Autowired + DoctorGroupService doctorGroupService; + + @Autowired + UserService userService; + + //增加医生组 + @RequestMapping("/insertDoctorGroup") + public Map insertDoctorGroup(@RequestBody DoctorGroup doctorGroup) { + HashMap map = new HashMap<>(); + try { + //判断添加的组名是否已存在 + if (doctorGroup.getGroupName() != null && doctorGroup.getGroupAlias() != null) { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.eq("group_name", doctorGroup.getGroupName()); + DoctorGroup doctorGroupName = doctorGroupService.selectOne(doctorGroupEntityWrapper); + if (doctorGroupName != null) { + map.put("msg", "5"); + map.put("errorInfo", "组名已存在"); + return map; + } + EntityWrapper doctorGroupEntityWrapper1 = new EntityWrapper<>(); + doctorGroupEntityWrapper1.eq("group_alias", doctorGroup.getGroupAlias()); + DoctorGroup doctorGroupAlias = doctorGroupService.selectOne(doctorGroupEntityWrapper1); + if (doctorGroupAlias != null) { + map.put("msg", "5"); + map.put("errorInfo", "组别名已存在"); + return map; + } + } + //查询最新一条组消息的组别名 + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.orderBy( "create_time", false); + DoctorGroup doctorGroupBestNew = doctorGroupService.selectOne(doctorGroupEntityWrapper); + //如果查询结果为空 + String groupAliasBestNew = null; + if (doctorGroupBestNew != null) { + groupAliasBestNew = doctorGroupBestNew.getGroupAlias(); + } + System.out.println("groupAliasBestNew=" + groupAliasBestNew); + String next = LetterIncrementor.getNext(groupAliasBestNew, 10); + doctorGroup.setGroupAlias(next); + boolean insert = doctorGroupService.insert(doctorGroup); + map.put("msg", insert ? "1" : "2"); + map.put("result", doctorGroup.getId()); + + + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + + //模糊查询全部医生组 + @RequestMapping("/selectDoctorGroup") + //groupName可以为不传项 + public Map selectDoctorGroup(@RequestParam(required = false) String groupName) { + HashMap map = new HashMap<>(); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + + doctorGroupEntityWrapper.eq("status", "1"); + + if (groupName != null) { + doctorGroupEntityWrapper.like("group_name", groupName); + map.put("result", doctorGroupService.selectList(doctorGroupEntityWrapper)); + map.put("msg", "1"); + } else { + map.put("result", doctorGroupService.selectList(doctorGroupEntityWrapper)); + map.put("msg", "1"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + //分页查询全部医生组 + @RequestMapping("/selectDoctorGroupPage") + public Map selectDoctorGroupPage(@RequestParam String groupName, @RequestParam Integer pageNo, @RequestParam Integer pageSize) { + HashMap map = new HashMap<>(); + pageNo = Integer.valueOf((pageNo == null) ? 1 : pageNo.intValue()); + pageSize = Integer.valueOf((pageSize == null) ? 10 : pageSize.intValue()); + + Page page = new Page<>(pageNo, pageSize); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + if (groupName != null) { + doctorGroupEntityWrapper.like("group_name", groupName); + map.put("result", doctorGroupService.selectPage(page,doctorGroupEntityWrapper)); + map.put("msg", "1"); + } else { + map.put("result", doctorGroupService.selectPage(page,doctorGroupEntityWrapper)); + map.put("msg", "1"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + + + //删除医生组并删除组内医生 + @Transactional + @RequestMapping("/deleteDoctorGroup/{id}") + public Map deleteDoctorGroup(@PathVariable Long id) { + HashMap map = new HashMap<>(); + try { + EntityWrapper doctorGroupEntityWrapper = new EntityWrapper<>(); + doctorGroupEntityWrapper.eq("id", id); + DoctorGroup doctorGroup = doctorGroupService.selectOne(doctorGroupEntityWrapper); + if (doctorGroup != null) { + EntityWrapper userEntityWrapper = new EntityWrapper<>(); + userEntityWrapper.eq("group_alias", doctorGroup.getGroupAlias()); + List users = userService.selectList(userEntityWrapper); + if (users != null && !users.isEmpty()) { + for (User user : users) { + //将用户组别名置空 + user.setGroupAlias(""); + } + userService.updateBatchById(users); + } + + boolean result = doctorGroupService.deleteById(id); + map.put("msg", result ? "1" : "2"); + map.put("result", result ? "删除成功" : "删除失败"); + } else { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + return map; + } + + // 修改医生组 + @RequestMapping("/updateDoctorGroup") + public Map updateDoctorGroup(@RequestBody DoctorGroup doctorGroup) { + HashMap map = new HashMap<>(); + + try { + if (doctorGroup == null || doctorGroup.getId() == null) { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + return map; + } + + // 1. 先查询出原始的医生组信息 + DoctorGroup originalGroup = doctorGroupService.selectById(doctorGroup.getId()); + if (originalGroup == null) { + map.put("msg", "3"); + map.put("errorInfo", "未找到该组"); + return map; + } + + // 2. 检查组名是否重复(排除当前记录) + // 只有当组名真正发生变化时才检查重复 + if (!originalGroup.getGroupName().equals(doctorGroup.getGroupName())) { + EntityWrapper nameWrapper = new EntityWrapper<>(); + nameWrapper.eq("group_name", doctorGroup.getGroupName()) + .ne("id", doctorGroup.getId()); // 排除当前记录 + + DoctorGroup existByName = doctorGroupService.selectOne(nameWrapper); + if (existByName != null) { + map.put("msg", "5"); + map.put("errorInfo", "组名重复"); + return map; + } + } + + // 3. 检查组别名是否重复(排除当前记录) + // 只有当组别名真正发生变化时才检查重复 + if (!originalGroup.getGroupAlias().equals(doctorGroup.getGroupAlias())) { + EntityWrapper aliasWrapper = new EntityWrapper<>(); + aliasWrapper.eq("group_alias", doctorGroup.getGroupAlias()) + .ne("id", doctorGroup.getId()); // 排除当前记录 + + DoctorGroup existByAlias = doctorGroupService.selectOne(aliasWrapper); + if (existByAlias != null) { + map.put("msg", "5"); + map.put("errorInfo", "组别名重复"); + return map; + } + } + + // 4. 执行更新 + boolean update = doctorGroupService.updateById(doctorGroup); + map.put("msg", update ? "1" : "2"); + map.put("result", update ? "修改成功" : "修改失败"); + + } catch (Exception e) { + map.put("msg", "4"); + map.put("errorInfo", "系统错误: " + e.getMessage()); + // 或者记录日志 + // log.error("修改医生组失败", e); + } + + return map; + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferral_His.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferral_His.java new file mode 100644 index 0000000..cdd5159 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferral_His.java @@ -0,0 +1,277 @@ +/*package com.imurs.controller; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.jdom.JDOMException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.entity.User; +import com.imurs.service.ApplyCaseService; +import com.imurs.service.UserService; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +@Component +public class DualReferral_His { + @Autowired + private ApplyCaseService applyCaseService; + @Autowired + private UserService userService; + @Autowired + public static DualReferral_His dualReferral_His; + @PostConstruct + public void init(){ + dualReferral_His = this; + dualReferral_His.applyCaseService=this.applyCaseService; + dualReferral_His.userService=this.userService; + } + public static String translate(String FeeDate ) throws Exception { + //地址 + String urlString = "http://220.168.26.57:1001/Service.asmx"; + //方法 + String soapActionString = "http://cardtest.com/GetInterconnect"; + URL url = new URL(urlString); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + String soap = "\n" + + "\n" + + " \n" + + " \n" + + " "+ + ""+FeeDate+"]]> \n"+ + " \n" + + " \n" + + ""; + byte[] buf = soap.getBytes(); + System.out.println(soap); + //设置一些头参数 + httpConn.setRequestProperty("Content-Length", String.valueOf(buf.length)); + httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); + httpConn.setRequestProperty("soapActionString", soapActionString); + httpConn.setRequestMethod("POST"); + //输入参数和输出结果 + + OutputStream out = null; + try{ + httpConn.setConnectTimeout(30000); + httpConn.setReadTimeout(30000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + httpConn.setDoOutput(true); + httpConn.setDoInput(true); + out = httpConn.getOutputStream(); + out.write(buf); + out.close(); + }catch (Exception e){ + DualReferral_His.sendErrorNotice("15602395710", FeeDate+"建立连接,不成功,数据未接受成功"); + } + //获取网站状态码200 + int responseCode = httpConn.getResponseCode(); + String responseMsg = httpConn.getResponseMessage(); + if(responseCode!=200){ + //说明网络异常需要重新请求 + //throw new Exception("msg"); + return "4004";//网络异常,再次请求发送 + } + byte[] datas = readInputStream(httpConn.getInputStream()); + String result = new String(datas); + // System.out.println("result:" + result); + String result2= strToHtml(result); + System.out.println("解析后的结果"+result2); + String IsUpdate= splitXml(result2,FeeDate); + return IsUpdate; + } + + *//** + * 从输入流中读取数据 + * + * @param inStream + * @return + * @throws Exception + *//* + public static byte[] readInputStream(InputStream inStream) throws Exception { + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outStream.write(buffer, 0, len); + } + byte[] data = outStream.toByteArray(); + outStream.close(); + inStream.close(); + return data; + } + public static String splitXml(String s,String date) throws Exception{ + String reg = "<\\?xml\\s+version=\"1.0\"\\s+encoding=\"(.*?)\"\\?>"; + String result = s.replaceAll(reg,""); + List> list = new ArrayList>(); + + String[] esg = parxml2(result); + //需要正则匹配去除字段才可以 + //按^切割得到每个患者身份 + if(!esg[0].equals("0")){ + //发送短信信息查询吧 + // return "返回结果代码失误"; + + sendErrorNotice("15602395710","日期"+date+":"+esg[1]); + // throw new Exception("返回结果代码错误"); + return "返回结果代码错误"; + } + if(esg[1].isEmpty()){ + //throw new Exception("没有返回参数,无更新状态"); + return "没有返回参数,无更新状态"; + } + String[] s2 = esg[1].split("\\^"); + for(int i =0;i map = new HashMap(); + //对其按|切割 + String[] s3=s2[i].split("\\|"); + map.put("pt_card", s3[0]);//身份证号 + map.put("inpatient", s3[1]);//住院号 + map.put("statu", s3[2]);//状态 + map.put("ID", s3[3]);//这个是患者ID值,为了区分患者在同家医院多次双向转诊的 + if(s3.length>4){ + map.put("plan_time", s3[4]);//返回就诊日期 + } + list.add(map); + + } + //System.out.println(list); + //对此数据模板进行发送 + //状态 1:已申请审批 2:已住院 3:已就诊 + // + Boolean Istrue =null; + for(int i =0;i map2 = new HashMap(); + map2.put("id", list.get(i).get("ID"));//唯一值 + //map2.put("status", list.get(i).get("statu")==null?0:list.get(i).get("statu"));//状态 为1的要进行更新吗 + map2.put("inpatient", list.get(i).get("inpatient"));//住院号 + map2.put("consultation_time", list.get(i).get("plan_time"));//实际日期,不是转诊日期 + map2.put("pt_card", list.get(i).get("pt_card"));//身份证号 + //user 表里查询基层医生手机号 + Long id= Long.parseLong(list.get(i).get("ID").toString());//(Long) list.get(i).get("ID"); + //System.out.println("id "+id);//申请医生IO + Map user = dualReferral_His.userService.selectByappuserID(id);//患者主健关联查询医生ID + String doctorname = user.get("user_name")==null?"":user.get("user_name").toString(); + String doctorphone = user.get("phone")==null?"":user.get("phone").toString();//pt_name + String patientname = user.get("pt_name")==null?"":user.get("pt_name").toString(); + if(list.get(i).get("statu").equals("1")){ + + } + if(list.get(i).get("statu")==null){ + map2.put("statu", "0");//处理null值 + } + if(list.get(i).get("statu")!=null&&list.get(i).get("statu").equals("2")){ + // System.out.println("身份证号为:"+list.get(i).get("pt_card")+"已住院"+list.get(i).get("statu")); + //对应着statu 6,查询基层医生手机号,根据它返回的主健值ID去查的 + map2.put("statu", "6"); + Istrue =dualReferral_His.applyCaseService.updateByHis(map2); + sendNotice(doctorphone,doctorname,patientname);//先不发短信 + } + if(list.get(i).get("statu")!=null&&list.get(i).get("statu").equals("3")){ + // System.out.println("身份证号为:"+list.get(i).get("pt_card")+"已就诊"+list.get(i).get("statu")); + //对应着statu 5 + map2.put("statu", "5"); + Istrue =dualReferral_His.applyCaseService.updateByHis(map2); + sendNotice(doctorphone,doctorname,patientname); + } + //保存患者得住院号和状态,数据库里。如果发送短信失败,还要保存数据吗? + //Istrue =dualReferral_His.applyCaseService.updateByHis(map2);//更新状态是否成功 + + } + return Istrue==true?"1":"0"; + } + public static String strToHtml(String s) + { + if (s==null||s.equals("")) return ""; + s = s.replaceAll("&","&"); + s = s.replaceAll("<","<"); + s = s.replaceAll(">",">"); + s = s.replaceAll(" "," "); + return s; + } + //解析XML格式 + public static String[] parxml2(String xml) throws JDOMException, IOException, DocumentException{ + + String[] paresu =new String[2]; + // 1.创建SAXReader的对象reader + SAXReader reader = new SAXReader(); + // 2.通过reader对象的read()方法加载books.xml文件,获取document对象 + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + // 3.通过document对象获取根节点bookstore + Element root = document.getRootElement(); + Element out = + document.getRootElement().element("Body").element("GetInterconnectResponse").element("GetInterconnectResult").element("Response"); + //取2个数据.element("ErrorMsg") + Element out2 = out.element("ErrorMsg"); + Element out3 = out.element("ResultCode"); + System.out.println("return 解析ErrorMsg:"+out2.getText()); + System.out.println("return 解析ResultCode:"+out3.getText()); + paresu[0]=out3.getText(); + paresu[1]=out2.getText(); + return paresu; + } + public static Map sendNotice(String phone,String applydoctor,String patientname){ + + Map resultMap=new HashMap(); + Map map=new HashMap(); + //不如将患者ID保存下来 + map.put("account","N9903806"); + map.put("password","9nr02dhiK"); + map.put("msg",applydoctor+"医生,您好!您转诊的"+patientname+"患者已经如期就诊,请尽快为患者办理医保结算手续。"); + // User userApplyPhone = userService.selectById(applyUserId); + map.put("phone",phone); + String res = ChuangLanSmsUtil.sendSmsByPost("http://smssh1.253.com/msg/send/json",JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if(!jsStr.getString("code").equals("0")){ + resultMap.put("msg", "发送失败"); + return resultMap; + } + resultMap.put("msg", "发送成功"); + return resultMap; + + } + public static Map sendErrorNotice(String phone,String errormsg){ + + Map resultMap=new HashMap(); + Map map=new HashMap(); + //不如将患者ID保存下来 + map.put("account","N9903806"); + map.put("password","9nr02dhiK"); + map.put("msg","开发者,您好!长沙市第一医院DualReferral_His接口报错,错误信息"+errormsg+"请及时处理"); + // User userApplyPhone = userService.selectById(applyUserId); + map.put("phone",phone); + String res = ChuangLanSmsUtil.sendSmsByPost("http://smssh1.253.com/msg/send/json",JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if(!jsStr.getString("code").equals("0")){ + resultMap.put("msg", "发送失败"); + return resultMap; + } + resultMap.put("msg", "发送成功"); + return resultMap; + +} + +} +*/ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferraltime.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferraltime.java new file mode 100644 index 0000000..5cb4009 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/DualReferraltime.java @@ -0,0 +1,77 @@ +/*package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@EnableAsync +public class DualReferraltime { + static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");// + static String date =df.format(new Date()); + static boolean IsRun =false; + @Async + @Scheduled(cron = "0 30 07 * * ?")//暂时不启动定时器 + public void autoDividend() throws Exception { + + 建立2个并发任务不会互相影响,即使一个报错,另外一个也会执行,并取30分钟间隔,用同一变量 + if(!responsecode.equals("4004")){ + //没有网络异常直接结束语句 + return ""; + } + // new DualReferral_His().translate("20181223"); + String s =""+ + ""+ + ""+ + ""+ + "0"+ + "430104196210101036|ZY010000705565|3|58|20190125"+ + ""; + try { + Calendar cal=Calendar.getInstance(); + cal.add(Calendar.DATE,-1); + Date time1=cal.getTime(); + String date= new SimpleDateFormat("yyyyMMdd").format(time1); + // System.out.println("=2==>"); + // String msg= DualReferral_His.translate(date); + IsRun=true; + System.out.println(); + } catch (Exception e) { + e.printStackTrace(); + + } + + + } + @Async + @Scheduled(cron = "0 45 07 * * ?") + public void autoDividend2() throws Exception { + //得到当天日期格式为yymmdd + // System.out.println("===========2=>"); + String date=null; + try { + Calendar cal=Calendar.getInstance(); + cal.add(Calendar.DATE,-1); + Date time1=cal.getTime(); + date= new SimpleDateFormat("yyyyMMdd").format(time1); + if(IsRun==false){ + System.out.println("=2==>"); + String msg= DualReferral_His.translate(date); + } + + } catch (Exception e) { + e.printStackTrace(); + //发送短信 报告异常, + DualReferral_His.sendErrorNotice("15602395710", date+"定时查询任务失败"); + } + finally{ + IsRun = false; + } + } +} +*/ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/EsController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/EsController.java new file mode 100644 index 0000000..b081b66 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/EsController.java @@ -0,0 +1,25 @@ +package com.imurs.controller; + +import com.imurs.entity.BMDReportInfo; +import com.imurs.util.EsUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Controller +@RestController +@RequestMapping("es") +public class EsController { + + @Autowired + EsUtils esUtils; + + @RequestMapping("findAll") + public List findAll(){ + return esUtils.findAll(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GeneralpractController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GeneralpractController.java new file mode 100644 index 0000000..79ebed3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GeneralpractController.java @@ -0,0 +1,577 @@ +package com.imurs.controller; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BinaryOperator; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.imurs.entity.InoneagentBlood; +import com.imurs.entity.InoneagentEcg; +import com.imurs.entity.InoneagentPersion; +import com.imurs.entity.InoneagentUrine; +import com.imurs.parameter.AllinoneApi; +import com.imurs.sound.ConnUtil; +import com.imurs.util.MD5; + +@RestController +@RequestMapping(value="AllinOne") +public class GeneralpractController { + +/* public static void main(String[] args) throws Exception { + // TODO Auto-generated method stub + //InoneagentBlood f =bp("3","120106197006083031"); + //System.out.println(f); + //基本信息获取 + //InoneagentPersion in =inoneBasic("3","120106197006083031"); + //System.out.println("设置"+in.toString()); + //InoneagentEcg ec= inoneEcg("120106197006083031"); + //System.out.println(ec.toString()); + //InoneagentBlood bloodpressure + //InoneagentUrine iu=inoneUrine("120106197006083031"); + //System.out.println(iu.toString()); + + }*/ + //基本信息id 1,基本信息,2,体温,3,身高 + @RequestMapping(value ="InoneInfo",method = RequestMethod.POST) + public InoneagentPersion InoneagentInfo(String card,String id) throws Exception { + InoneagentPersion in=inoneBasic(id,card); + if(in.getSex()!=null){ + String sex=in.getSex(); + switch (sex){ + case "0": + in.setSex("未知的性别"); + break; + case "1": + in.setSex("男"); + break; + case "2": + in.setSex("女"); + break; + default : + in.setSex("未说明的性别"); + } + + + + } + + return in; + + } + //id 1,血压 2,血氧,3,血糖 + @RequestMapping(value ="InoneageBloodInfo",method = RequestMethod.POST) + public InoneagentBlood InoneagentBloodInfo(String card,String id) throws Exception { + InoneagentBlood IB= bp(id,card); + if(IB.getExamtype()!=null){ + + String s= IB.getExamtype().equals("0")==true?"餐前":"餐后"; + IB.setExamtype(s); + + } + + + return IB; + + } + //心电InoneagentEcg ec= inoneEcg + @RequestMapping(value ="InoneageEcgInfo",method = RequestMethod.POST) + public Map InoneageEcgInfo(String card) throws Exception { + InoneagentEcg IB= inoneEcg(card); + Map map = new HashMap(); + List> list = null; + if(IB.getFilename()!=null&&!IB.getFilename().isEmpty()){ + //文件路径不为空 , + try{ + String urlpath="https://d.xzhealth.cn//"+IB.getFilename(); + String xml=drawEcg(urlpath); + list= parECGxml(xml); + }catch(Exception e){ + map.put("msg", "解析异常或无波形数据"); + } + } + map.put("list", list==null?"":list); + map.put("IB", IB); + return map; + + } + // + @RequestMapping(value ="InoneageEcgDate",method = RequestMethod.POST) + public Map InoneageEcgDate(String card) throws Exception { + //InoneagentEcg IB= inoneEcg(card); + Map map = new HashMap(); + //当心电路径不为空 时,解析心电数据 + List> list = null; + if(card!=null&&!card.isEmpty()){ + //true 表示路径存在值 + String urlpath="https://d.xzhealth.cn//"+card; + String xml=drawEcg(urlpath); + list= parECGxml(xml); + } + //map.put("Ecgbasic", IB); + map.put("list", list); + return map; + + } + //尿常规 + @RequestMapping(value ="InoneageUrineInfo",method = RequestMethod.POST) + public InoneagentUrine InoneageurineInfo(String card) throws Exception { + InoneagentUrine IB= inoneUrine(card); + return IB; + + } + //尿常规 + private InoneagentUrine inoneUrine(String IDcard) throws Exception{ + InoneagentUrine InU = new InoneagentUrine(); + String url = AllinoneApi.URINE_API; + JSONArray json=comon(url); + if(null==json){ + return InU ; + }else{ + InU= InonebasicUrine(json,IDcard); + return InU; + } + + + } + //尿常规 + private InoneagentUrine InonebasicUrine(JSONArray json, String iDcard) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + for(int i=0;i byHeight= Comparator.comparing(InoneagentUrine::getExamtime); + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + InoneagentUrine res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + //心电 + private InoneagentEcg inoneEcg(String IDcard) throws Exception{ + InoneagentEcg Ine = new InoneagentEcg(); + String url=AllinoneApi.ECG_API; + JSONArray json=comon(url); + if(null==json){ + return Ine ; + }else{ + //String IDcard ="440582199203026695"; + Ine= InonebasicEcg(json,IDcard); + // System.out.println(f); + return Ine; + } + + + + } + private InoneagentEcg InonebasicEcg(JSONArray json, String iDcard) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + for(int i=0;i byHeight= Comparator.comparing(InoneagentEcg::getExamtime); + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).filter(IB->!IB.getHr().equals("0")).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + // InoneagentEcg res= fbp.get(); + InoneagentEcg res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + // 居民健康信息,体温,身高体重 + private InoneagentPersion inoneBasic(String grade,String IDcard) throws Exception{ + //String grade="1"; + InoneagentPersion Inp = new InoneagentPersion(); + String url=null; + if(grade==null){ + throw new Exception("类型不匹配"); + } + switch(grade){ + case "1": + url=AllinoneApi.PERSON_API; + break; + case "2": + url=AllinoneApi.TEMPERATIURE_API; + break; + case "3": + url=AllinoneApi.HEIGHTWEI_API; + break; + default : + throw new Exception("类型不匹配"); + // return Inp; + } + JSONArray json=comon(url); + + if(null==json){ + return Inp ; + }else{ + //String IDcard ="440582199203026695"; + Inp= Inonebasicdate(json,IDcard,grade); + // System.out.println(f); + return Inp; + } + + } + private InoneagentPersion Inonebasicdate(JSONArray json, String iDcard, String grade) throws Exception { + // TODO Auto-generated method stub + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight=null; + if("1".equals(grade)){ + byHeight = Comparator.comparing(InoneagentPersion::getArchivedate); + }else if("2".equals(grade)){ + //System.out.println("wwe"); + byHeight = Comparator.comparing(InoneagentPersion::getTepExamtime); + }else if("3".equals(grade)){ + byHeight = Comparator.comparing(InoneagentPersion::getHwExamtime); + }else{ + throw new Exception("grade 为非指定的类型"); + } + + Optional fbp= BpStreamList.stream().filter(IB->IB.getIdnumber().equals(iDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + // InoneagentPersion res= fbp.get(); + // Optional os= Optional.ofNullable(fbp.get()); + InoneagentPersion res=null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + + } + private InoneagentBlood bp(String grade,String IDcard) throws Exception{ + //String grade="1"; + InoneagentBlood f = new InoneagentBlood(); + String url=null; + if(grade==null){ + throw new Exception("未指定类型"); + } + switch(grade){ + case "1": + url=AllinoneApi.BLOODP_API; + break; + case "2": + url=AllinoneApi.BLOODOXY_API; + break; + case "3": + url=AllinoneApi.BLOODGLUC_API; + break; + default : + throw new Exception("类型不匹配"); + + } + JSONArray json=comon(url); + + if(null==json){ + return f ; + }else{ + //String IDcard ="440582199203026695"; + f= blood(json,IDcard,grade); + // System.out.println(f); + return f; + } + + } + + private JSONArray comon(String durl) throws Exception, Exception{ + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(durl);///inoneagent/bloodoxygen + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + String ap1 = "b9e34120-7c02-4d96-8825-37f5ae5bcc9c";//这个是机器设备密钥 + String key1 ="9410b975-9f33-44b3-8b19-00fe189191c5";//需要厂家提供 + // String URL ="https://d.xzhealth.cn"; + // String ap=MD5.GetMD5Code(ap1); + String key =MD5.GetMD5Code(key1); + JSONObject params = new JSONObject(); + params.put("ap", ap1); + params.put("sig", key); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + // System.out.println(result); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result); + String sucess=jsonObject.get("success").toString(); + JSONArray json = null; + if(sucess.equals("0")){ + json = JSONArray.parseArray(jsonObject.get("datas").toString()); + } + + return json; + } + //处理数据过程 //血压 + /*public static InoneagentBlood bloodpressure(JSONArray json,String IDcard) throws Exception{ + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight = Comparator.comparing(InoneagentBlood::getPressureExamtime); + Optional fbp= BpStreamList.stream().filter(BP->BP.getIdnumber().equals(IDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + //下面的为根据检查部位不同 选择各自的最新日期 + Map> li2= BpStreamList.stream().filter(BP->BP.getIDNumber().equals("120106197006083031")).collect(Collectors.groupingBy(BP::getExamType, + Collectors.reducing(BinaryOperator.maxBy(byHeight)))); + Collection> cb= li2.values(); + Iterator> ib= cb.iterator(); + while(ib.hasNext()){ + Optional obp= ib.next(); + fresult.add(obp.get()); + } + InoneagentBlood res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + //InoneagentBlood res= fbp.get(); + return res; + }*/ + private InoneagentBlood blood(JSONArray json,String IDcard,String id) throws Exception{ + List BpStreamList = new ArrayList(); + // + for(int i=0;i byHeight =null; + if(id.equals("1")){ + byHeight = Comparator.comparing(InoneagentBlood::getPressureExamtime); + } + else if(id.equals("2")){ + byHeight = Comparator.comparing(InoneagentBlood::getOxygExamtime); + } + else if(id.equals("3")){ + byHeight = Comparator.comparing(InoneagentBlood::getGlucoseExamtime); + }else{ + throw new Exception("id 值为非识别类型"); + } + + Optional fbp= BpStreamList.stream().filter(BP->BP.getIdnumber().equals(IDcard)).collect(Collectors.reducing(BinaryOperator.maxBy(byHeight))); + //InoneagentBlood res= fbp.get(); + InoneagentBlood res= null; + if(fbp.isPresent()){ + res=fbp.get(); + }else{ + throw new Exception("无此人信息"); + } + return res; + } + //下面为心电12导联数据 + private String drawEcg(String urlPath) throws GeneralSecurityException, Exception{ + //https 下载 + SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); + sslcontext.init(null, new TrustManager[]{new com.imurs.parameter.MyX509TrustManager()}, new java.security.SecureRandom()); + URL url = new URL(urlPath); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + //System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + HttpsURLConnection conn= (HttpsURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Content-Type", "application/octet-stream; charset=utf-8"); + conn.setDoOutput(true); + BufferedInputStream bin = new BufferedInputStream(conn.getInputStream()); + //解压成流 + ZipInputStream Zin=new ZipInputStream(bin);// + BufferedInputStream Bin=new BufferedInputStream(Zin); + ZipEntry entry; + ByteArrayOutputStream result=null; + //解压文件下的多个文件,按照对方提供的文档是只存在一个文件的 + while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ + result = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + while ((length = Bin.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + } + String finallyResult =result.toString("UTF-8"); + + return finallyResult; + + } + //解析解压后的字符串 + private List> parECGxml(String xml) throws DocumentException{ + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + //Element root = document.getRootElement(); + //System.out.println(root); + //Element out = + // document.getRootElement().element("Institution"); + //String s=out.getTextTrim(); + //System.out.println("??? "+s); + // + Element ecglist = document.getRootElement().element("EcgLeadList"); + //String sample=ecglist.element("Sample").getText(); + //System.out.println(sample); + Iterator it=ecglist.elementIterator(); + List> list = new LinkedList>(); + while(it.hasNext()){ + //Node node1 =it.next(); + Map hashEcg = new HashMap(); + Element el =it.next(); + + String leadtype =el.elementText("LeadType");//出现了null 值 + String leadDate =el.elementText("LeadData"); + //System.out.println(""+leadtype+" "); + if(leadtype!=null){ + hashEcg.put(leadtype, leadDate); + list.add(hashEcg); + } + + } + return list; + + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GsHisController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GsHisController.java new file mode 100644 index 0000000..6d9be00 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/GsHisController.java @@ -0,0 +1,943 @@ +package com.imurs.controller; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.apache.commons.io.IOUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; +import org.jdom.JDOMException; +import org.jsoup.Jsoup; +import org.jsoup.select.Elements; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import com.imurs.parameter.LIS; +import com.imurs.parameter.PACS; + + +@RestController +@RequestMapping(value="JyHiS") +public class GsHisController { + /** + * HIS_PatientInfo接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="PatientInfo",method = RequestMethod.POST) + public Map PatientInfo(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + Map map = new HashMap(); + String s = new String();//GetPatientInfo + + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetPatientInfo"); + conn.setRequestMethod("POST"); + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//15S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + //定义输出流 + + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + Map resultmap =PatientInfofoxml(s1); + return resultmap; + } + /** + * HIS_LISRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="LisResult",method = RequestMethod.POST) + public Map LisResult(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map map = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetLisResult"); + conn.setRequestMethod("POST"); + //定义输出流 + + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println(s1); + map=parLis(s1); + return map; + + } + /** + * HIS_PACSRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="PacsResult",method = RequestMethod.POST) + public MapPacsResult(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map map = new HashMap(); + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetPacsResult"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + map.put("ResultCode","3" ); + return map; + } + //OutputStream output = conn.getOutputStream(); + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + map=ParPacsResultfoxml(s1); + return map; + + } + /** + * HIS_PACSRESULT接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="MedicalRecord",method = RequestMethod.POST) + public MapMedicalRecord(String InpatientNo,String PatientType) throws IOException, JDOMException, DocumentException{ + String s = new String();//GetPatientInfo + Map maph = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("]]>") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:10746/HsRcsWebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:10746"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetMedicalRecord"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + //请求失败,可能网络不好,或工作站未打开 + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + maph.put("ResultCode","3" ); + return maph; + } + //OutputStream output = conn.getOutputStream(); + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + + + //String s1=strToHtml(s); + ///和上面无关的,解析的字符串先不用做strToHtml(),下面这几句提取出HTML代码 + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(s.getBytes("UTF-8"))); + Element out = + document.getRootElement().element("Body").element("GetMedicalRecordResponse").element("GetMedicalRecordResult"); + org.jsoup.nodes.Document doc=null; + org.jsoup.nodes.Element table =null; + String s2=null; + Elements rowr=null; + try{ + doc = Jsoup.parse(out.getText(),"gb2312"); + table =doc.getElementById("table1"); + s2=table.select("td[cellid=B1]").select("span").text(); + rowr=doc.select("p[align=left]"); + }catch(Exception e){ + maph.put("ResultCode1", "2");//入院记录无此人信息 + return maph; + } + + + + Map map = new HashMap(); + + //姓名,性别,科室,住院号,床位 + //System.out.println("有记录吗"+rows2.text());//姓名 + //org.jsoup.nodes.Element table =doc.getElementById("table1"); + //String s1=table.select("td[cellid=A1]").select("span").text(); + //String s2=table.select("td[cellid=B1]").select("span").text(); + //System.out.println("获取的文本"+s+":"+s2); + //Elements rows = doc.select("p[align=left]").get(1).select("span"); + + //Elements rowr=doc.select("p[align=left]"); + + //利用:分割对应数据 + + map.put("pname", s2); + + String xl=rowr.get(2).text(); + String[] x2=xl.split(":"); + String p=rowr.get(3).text(); + String[] ph=p.split(":"); + if(x2.length>1){ + map.put("present", x2[1]); + + }else{ + map.put("present", ""); + } + if(ph.length>1){ + map.put("past", ph[1]); + + }else{ + map.put("past", ""); + } + return map; + + } + /** + * EcgInfo接口 + * @throws IOException + * @throws DocumentException + * @throws JDOMException + */ + @RequestMapping(value ="EcgInfo",method = RequestMethod.POST) + public Map soapRequestEcgInfoConnection(String InpatientNo,String PatientType) throws Exception{ + String s = new String();//GetPatientInfo + Map maph = new HashMap(); + + StringBuilder sendmsg=new StringBuilder(""); + sendmsg.append("") + .append("") + .append("") + .append("") + .append("") + + .append("") + .append(PatientType) + .append(" ") + .append(InpatientNo) + .append("") + .append("") + .append("") + .append(""); + //字符串转发出去 + + //System.out.println("soapHeader="+sendmsg); + //设置soap请求报文的相关属性 + //url从soapUI的request1的RAW标签的POST获取,url中不要有空格 + String url="http://2484x4726z.qicp.vip:46235/WebService.asmx"; + URL u = new URL(url); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.setDefaultUseCaches(false); + //Host,Content-Type,SOAPAction从soapUI的request1的RAW标签的Host,Content-Typ,SOAPActione获取 + conn.setRequestProperty("Host", "2484x4726z.qicp.vip:46235"); + conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); + conn.setRequestProperty("Content-Length", String.valueOf(sendmsg.length())); + conn.setRequestProperty("SOAPAction", "http://tempuri.org/GetReportMessage"); + conn.setRequestMethod("POST"); + //定义输出流 + OutputStream output = null; + try{ + conn.setConnectTimeout(10000); + conn.setReadTimeout(10000);//30S连接不成功则直接抛错,防止对方服务器挂了,程序一直挂着 + output =conn.getOutputStream(); + }catch (Exception e){ + maph.put("ResultCode","3" ); + return maph; + } + if (null != sendmsg) { + byte[] b = sendmsg.toString().getBytes("utf-8"); + //发送soap请求报文 + output.write(b, 0, b.length);} + output.flush(); + output.close(); + //定义输入流,获取soap响应报文 + InputStream input = conn.getInputStream(); + //需设置编码格式,否则会乱码 + s=IOUtils.toString(input, "UTF-8"); + input.close(); + String s1=strToHtml(s); + //System.out.println("输出的xml="+s1); + // + Map map=ParseEcGRecordxml(s1); + return map; + +} + //解析心电记录 + public Map ParseEcGRecordxml(String xml) throws JDOMException, IOException, DocumentException{ + + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element out = + document.getRootElement().element("Body").element("GetReportMessageResponse").element("GetReportMessageResult"); + String result = out.getText(); + //System.out.println("return 解析ErrorMsg:"+result); + //String 转json + Map rowData = new HashMap(); + JSONObject jsonObject = JSON.parseObject(result); + Object jsonObject1 =null; + JSONObject json= JSON.parseObject(jsonObject.get("Response").toString()); + String re= json.get("ResultCode").toString(); + if(re.equals("-1")){ + rowData.put("ResultCode", "1");//错误 + } + if(re.equals("0")&&json.get("EcgInfo")==null){ + rowData.put("ResultCode", "2");//无信息 + } + // System.out.println("错误值"+re);//等于-1 中断处理 + if(re.equals("0")&&json.get("EcgInfo")!=null){ + /// System.out.println("有错误吗"+re); + // System.out.println("识别正常情况"); + jsonObject1 = json.get("EcgInfo"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + // System.out.println("这是什么"+jsonObject2.toString()); + //取出其中一个值 + //String s= jsonObject2.get("Address").toString(); + //System.out.println("..."+s); + rowData.put("patientName", jsonObject2.get("PatName")==null?"":jsonObject2.get("PatName").toString()); + rowData.put("sex", jsonObject2.get("PGender")==null?"":jsonObject2.get("PGender").toString()); + rowData.put("age", jsonObject2.get("PatientAge")==null?"":jsonObject2.get("PatientAge").toString()); + rowData.put("examineDocName", jsonObject2.get("ApplyDocName")==null?"":jsonObject2.get("ApplyDocName").toString()); + rowData.put("chamber", jsonObject2.get("ApplyDepartMent")==null?"":jsonObject2.get("ApplyDepartMent").toString()); + rowData.put("ptCard", jsonObject2.get("IDCard")==null?"":jsonObject2.get("IDCard").toString());//身份证号 + rowData.put("outPatien", jsonObject2.get("ClinicCode")==null?"":jsonObject2.get("ClinicCode").toString());//门诊号 + rowData.put("reportDocName", jsonObject2.get("Reporter")==null?"":jsonObject2.get("Reporter").toString());//报告医生 + rowData.put("auditDocName", jsonObject2.get("RepAudit")==null?"":jsonObject2.get("RepAudit").toString());//审核医生 + rowData.put("auditDate", jsonObject2.get("RepAuditTime")==null?"":jsonObject2.get("RepAuditTime").toString());//审核日期 + rowData.put("electricAxis", jsonObject2.get("QRSaxis")==null?"":jsonObject2.get("QRSaxis").toString());//电轴 + rowData.put("qrs", jsonObject2.get("QRS")==null?"":jsonObject2.get("QRS").toString());//QPS时限 + rowData.put("pr", jsonObject2.get("PR")==null?"":jsonObject2.get("PR").toString());//P-R间期 + rowData.put("qt", jsonObject2.get("QT")==null?"":jsonObject2.get("QT").toString());//P-R间期 + rowData.put("qtc", jsonObject2.get("QTC")==null?"":jsonObject2.get("QTC").toString());//P-R间期 + rowData.put("sv1", jsonObject2.get("SV1")==null?"":jsonObject2.get("SV1").toString());//P-R间期 + rowData.put("rv5", jsonObject2.get("RV5")==null?"":jsonObject2.get("RV5").toString());//P-R间期 + rowData.put("rs", jsonObject2.get("RSamp")==null?"":jsonObject2.get("RSamp").toString());//R+S + rowData.put("hr", jsonObject2.get("HR")==null?"":jsonObject2.get("HR").toString());//P-R间期 + rowData.put("diagnos", jsonObject2.get("ClincDiagnose")==null?"":jsonObject2.get("ClincDiagnose").toString());//诊断 + rowData.put("clinicDiagnos", jsonObject2.get("RepDiagnose")==null?"":jsonObject2.get("RepDiagnose").toString());//临床诊断 + rowData.put("complain", jsonObject2.get("RepDescription")==null?"":jsonObject2.get("RepDescription").toString());//描述 + rowData.put("url", jsonObject2.get("URL")==null?"":jsonObject2.get("URL").toString()); + rowData.put("reportDate", jsonObject2.get("RepCreateDate")==null?"":jsonObject2.get("RepCreateDate").toString()); + rowData.put("hisEsrdNumber", jsonObject2.get("HospCode")==null?"":jsonObject2.get("HospCode").toString()); + } + return rowData; + } + + //解析PatientInfoXML格式 + public Map PatientInfofoxml(String xml) throws JDOMException, IOException, DocumentException{ + + Map map = new HashMap(); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element out = + document.getRootElement().element("Body").element("GetPatientInfoResponse").element("GetPatientInfoResult").element("Response"); + Map mapf = new HashMap(); + Map mapr = new HashMap(); + + String text =document.getRootElement().element("Body").element("GetPatientInfoResponse").element("GetPatientInfoResult").getText(); + Map mape=new HashMap(); + String ResultCode=""; + try{ + ResultCode= out.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//无信息就写2 + return map; + } + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息 + return map; + } + map.put("ResultCode", ResultCode); + + Iterator patientout =out.element("PatInfo").elementIterator(); + while(patientout.hasNext()){ + Node node1 =patientout.next(); + + mapf.put(node1.getName(), node1.getText()); + } + mapr.put("patientName", mapf.get("NAME")==null?"":mapf.get("NAME")); + mapr.put("sex", mapf.get("SEX")==null?"":mapf.get("SEX")); + mapr.put("age", mapf.get("AGE")==null?"":mapf.get("AGE")); + mapr.put("ptPhone", mapf.get("TELEPHONE")==null?"":mapf.get("TELEPHONE")); + mapr.put("marry", mapf.get("MARRY")==null?"":mapf.get("MARRY")); + mapr.put("ptCity", mapf.get("ADDRESS")==null?"":mapf.get("ADDRESS")); + mapr.put("outPatien", mapf.get("PATIENTNO")==null?"":mapf.get("PATIENTNO"));//病人编号 + mapr.put("hisEsrdNumber", mapf.get("INPATIENTNO")==null?"":mapf.get("INPATIENTNO"));//住院号 + mapr.put("ptCard", mapf.get("IDCARD")==null?"":mapf.get("IDCARD")); + mapr.put("doctor", mapf.get("DOCTOR")==null?"":mapf.get("DOCTOR")); + mapr.put("changeDeptid", mapf.get("CHANGE_DEPTID")==null?"":mapf.get("CHANGE_DEPTID"));//转科科别 + mapr.put("bedid", mapf.get("BEDID")==null?"":mapf.get("BEDID")); + mapr.put("initial", mapf.get("CLINICDIAGNOSE")==null?"":mapf.get("CLINICDIAGNOSE"));//初步诊断 + mapr.put("fDiagnose", mapf.get("F_DIAGNOSE")==null?"":mapf.get("F_DIAGNOSE"));//病理诊断 + mapr.put("allergy", mapf.get("ALLERGIC")==null?"":mapf.get("ALLERGIC"));//过敏药品 + mapr.put("nuhTime", mapf.get("IN_DATE")==null?"":mapf.get("IN_DATE"));//入院时间 + mapr.put("nuhSection", mapf.get("INDEPTID")==null?"":mapf.get("INDEPTID"));//入院科别 + mapr.put("examine", mapf.get("EXAM_ITEM")==null?"":mapf.get("EXAM_ITEM"));//检查 + //System.out.println(mapr.toString()); + + return mapr; + } + + public Map parLis(String xml) throws JDOMException, IOException, DocumentException{ + Map map = new HashMap(); + List> hisList = new ArrayList>(); + SAXReader reader = new SAXReader(); + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + Element root = document.getRootElement().element("Body").element("GetLisResultResponse").element("GetLisResultResult").element("Response"); + String text=document.getRootElement().element("Body").element("GetLisResultResponse").element("GetLisResultResult").getText(); + + // Map mape=new HashMap(); + String ResultCode=""; + try{ + ResultCode= root.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + //String recode=root.element("ResultCode").getText(); + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息 + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//ResultCode不是0,1 其他说明异常 + return map; + } + map.put("ResultCode", ResultCode); + Iterator out = + root.elementIterator(); + //取2个数据.element("ErrorMsg") + int i=0; + while(out.hasNext()){ + i++; + Node node = out.next(); + + + Element element1 = (Element)node; + Iterator out1 = element1.elementIterator(); + Map mapt=new HashMap(); + while(out1.hasNext()){ + Node node1 = out1.next(); + + //if(!node1.getName().equals("SUNDRY_FEE_NAME")) + mapt.put(node1.getName(), node1.getText()); + // + + // + } + + hisList.add(mapt); + } + for(int j=0;j> o= hisList.stream().filter(map1->!map1.isEmpty()).distinct().collect(Collectors.toList()); + /* for(int k=0;k hisStreamList = new ArrayList(); + + for(int j=0;j=1){ + LIS re= hisStreamList.get(0); + map.put("name", re.getName()); + map.put("gender", re.getGender()); + map.put("age", re.getAge()); + map.put("hisEsrdNumber", re.getHisEsrdNumber());//改成HIS_esrd + map.put("printOrder", re.getPrintOrder()); + map.put("sampleNo", re.getSampleNo()); + map.put("sampleType", re.getSampleType()); + map.put("resultDateTime", re.getResultDateTime()); + map.put("updateDate", re.getUpdateDate()); + } + /* for(int i1=0;i1> result = new ArrayList>(); + + + //按项目分组 + /* Map> partiem= hisStreamList.stream().collect(Collectors.groupingBy(LIS::getSundryFeeName)); + Set>> s2=partiem.entrySet(); + int p=0; + for(Entry> s:s2){ + Map> ll= new HashMap>(); + //System.out.println(s.getKey()+"项目指: "+s.getValue()); + ll.put(""+p++, s.getValue()); + result.add(ll); + + }*/ + //按项目,日期分组 + Map>> collect= hisStreamList.stream().collect(Collectors.groupingBy(LIS::getSundryFeeName,Collectors.groupingBy(LIS::getUpdateDate))); + + Set>>> set= collect.entrySet(); + List>> palis = new ArrayList>>(); + for (Entry>> en : set) { + // System.out.println("按键="+en.getKey()+"值="+en.getValue()); + //对每个键的值,进行排序 + Map> map1 =en.getValue(); + palis.add(map1); + + } + //打印出来这个分组后的数据。 + for(int i2=0;i2> mk =palis.get(i2); + //建立排序MAP + TreeMap> tm=new TreeMap>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.compareTo(o1); + } + }); + for(String k:mk.keySet()){ + //System.out.println(i2+"日期值"+k+"ffff"+mk.get(k)); + //比较K值,选择最大K值进行输出 + tm.put(k, mk.get(k)); + } + //在这次循环中,取出最大值 + //System.out.println(i2+"排序后的值"+"ffff"+tm.get(tm.firstKey())); + result.add(tm.get(tm.firstKey())); + } + Map amp =new HashMap(); + amp.put("basic", map); + amp.put("list", result); + // System.out.println(amp.toString()); + return amp; + } + //解析PACSRESULT格式 + public Map ParPacsResultfoxml(String xml) throws JDOMException, IOException, DocumentException{ + + List> hisList = new ArrayList>(); + //soapUI自动生成的request xml路径,写入传入参数 + Map map = new HashMap(); + //String s= strToHtml(soapHeader); + // 1.创建SAXReader的对象reader + SAXReader reader = new SAXReader(); + // 2.通过reader对象的read()方法加载books.xml文件,获取document对象 + Document document = reader.read(new ByteArrayInputStream(xml.getBytes())); + + // 3.通过document对象获取根节点bookstore + // Element root = document.getRootElement(); + //System.out.println(root); + Element out = + document.getRootElement().element("Body").element("GetPacsResultResponse").element("GetPacsResultResult").element("Response"); + //Element ErrorMsg = out.element("ErrorMsg"); + // Element ResultCode = out.element("ResultCode"); + String text=document.getRootElement().element("Body").element("GetPacsResultResponse").element("GetPacsResultResult").getText(); + //System.out.println("文本内容"+text); + String ResultCode=""; + try{ + ResultCode= out.element("ResultCode").getText(); + }catch(Exception e){ + map.put("ResultCode", "2"); + return map; + } + if(ResultCode.equals("1")||!ResultCode.matches("[0-1]")){ + map.put("ResultCode", "1");//错误代码 + return map; + } + //String ResultCode = out.element("ResultCode").getText()==null?"1":out.element("ResultCode").getText(); + if(text.equals("1")){ + map.put("ResultCode", "2");//无信息就写2 + return map; + } + + map.put("ResultCode", ResultCode); + Iterator out1 = + out.elementIterator(); + int i=0; + while(out1.hasNext()){ + i++; + Node node = out1.next(); + + + Element element1 = (Element)node; + Iterator out2 = element1.elementIterator(); + Map mapt=new HashMap(); + while(out2.hasNext()){ + Node node1 = out2.next(); + // System.out.println("---"+node1.getName()+":"+node1.getText()); + mapt.put(node1.getName(), node1.getText()); + } + hisList.add(mapt); + } + for(int j=0;j> o= hisList.stream().filter(map1->!map1.isEmpty()).distinct().collect(Collectors.toList()); + /*for(int k=0;k pacsStreamList = new ArrayList(); + + for(int j=0;j=1){ + PACS re= pacsStreamList.get(0); + map.put("name", re.getPatientName()); + map.put("sex", re.getSex()); + map.put("age", re.getAge()); + //map.put("esrdNumber", re.getEsrdNumber()); + + } + List>> result = new ArrayList>>(); + List> fresult = new ArrayList>(); + //按项目,日期进行分组 + Map>> collect= pacsStreamList.stream().collect(Collectors.groupingBy(PACS::getExamineName,Collectors.groupingBy(PACS::getReportDate))); + Set>>> set= collect.entrySet(); + for (Entry>> en : set) { + // System.out.println("按键="+en.getKey()+"值="+en.getValue()); + //对每个键的值,进行排序 + Map> map1 =en.getValue(); + result.add(map1); + + } + //打印出来这个分组后的数据。 + for(int i2=0;i2> mk =result.get(i2); + //建立排序MAP + TreeMap> tm=new TreeMap>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.compareTo(o1); + } + }); + for(String k:mk.keySet()){ + //System.out.println(i2+"日期值"+k+"ffff"+mk.get(k)); + //比较K值,选择最大K值进行输出 + tm.put(k, mk.get(k)); + } + //在这次循环中,取出最大值 + // System.out.println(i2+"排序后的值"+"ffff"+tm.get(tm.firstKey())); + fresult.add(tm.get(tm.firstKey())); + } + //上面是按项目日期进行分组 + /* //按项目分组 + Map> partiem= pacsStreamList.stream().collect(Collectors.groupingBy(PACS::getExamineName)); + Set>> s2=partiem.entrySet(); + int p=0; + for(Entry> s:s2){ + Map> ll= new HashMap>(); + //System.out.println(s.getKey()+"项目指: "+s.getValue()); + ll.put(""+p++, s.getValue()); + result.add(ll); + + }*/ + /* //再次按日期划分 + for(int l=0;l> lk =result.get(l).values(); + //取出0,1,2,3的数据 做列表,然后对日期进行排序。//https://cloud.tencent.com/developer/ask/179473 + Iterator> pa= lk.iterator(); + int o1=0; + while(pa.hasNext()){ + List ls= pa.next(); + Iterator pac= ls.iterator(); + List reresult =new ArrayList(); + while(pac.hasNext()){ + //System.out.println("分开"+pac.next()); + PACS P1= pac.next(); + reresult.add(P1); + } + // List S= reresult.stream().collect(Collectors.maxBy(Comparator.comparing(PACS::getReport_date)), Optional::get); + Optional S= reresult.stream().sorted(Comparator.comparing(PACS::getReportDate).reversed()).findFirst(); + //System.out.println(o1+"分开"+reresult.toString()); + // System.out.println("不好"+S.get()); + fresult.add(S.get()); + o1++; + } + //System.out.println(o1+"看下P2指"+lk.size()); + }*/ + //上面是按日期处理 + Map amp =new HashMap(); + amp.put("basic", map); + amp.put("list", fresult); + // System.out.println(amp.toString()); + return amp; + } + public static String strToHtml(String s) + { + if (s==null||s.equals("")) return ""; + s = s.replaceAll("&","&"); + s = s.replaceAll("<","<"); + s = s.replaceAll(">",">"); + s = s.replaceAll(" "," "); + s = s.replaceAll(" ", " "); + return s; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageHtmlController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageHtmlController.java new file mode 100644 index 0000000..d1222cb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageHtmlController.java @@ -0,0 +1,107 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.DoctorArrange; +import com.imurs.entity.HomePageShow; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.DoctorArrangeService; +import com.imurs.service.HomePageShowService; + +/** + * 首页Html + * @author Server + * + */ +@RestController +@RequestMapping(value="html") +public class HomePageHtmlController { + + @Autowired + HomePageShowService homePageShowService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + ApplyInformationService applyInformationService; + + + /** + * 首页显示 + * @return + * type:类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 D医联体合作单位) + */ + @RequestMapping(value="homePage") + public Map homePage(){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper inforWrapper=new EntityWrapper(); + wrapper.isNotNull("type").orderBy("create_time", false); + + inforWrapper.eq("state", "1"); + //map.put("state", "1"); + //map.put("credit_type", "1"); + + List hmList=new ArrayList(); + List daList=new ArrayList(); + List aiList=new ArrayList(); + try { + //医联体合作单位 + inforWrapper.orderBy("if(id='68729a2d87075bd616f7339940227f46',0,1),if(id='97561c8ecc660a36a3cdad29abd4ae3f',0,1)," + + "if(id='07cdf216c7a7eb0e1dd5d7fc568d9285',0,1),if(id='4f74e5c6659354e6eca2d4658bf57777',0,1)"); + aiList=applyInformationService.selectList(inforWrapper); + map.put("aiList", aiList); + + hmList=homePageShowService.selectList(wrapper); + if(hmList.isEmpty()){ + map.put("hmListA", hmList); + map.put("hmListB", hmList); + map.put("hmListC", hmList); + }else{ + //分组显示 + Map> collect = hmList.stream().collect(Collectors.groupingBy(HomePageShow::getType)); + map.put("hmListA", collect.get("A"));//国家/市区政策 + map.put("hmListB", collect.get("B"));//消息通知 + map.put("hmListC", collect.get("C"));//长沙市第一医院风采 + } + //下派专家一览 + daList=doctorArrangeService.selectHonmeShowArrange(); + map.put("daList", daList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("apply_statu"); + //map.remove("credit_type"); + } + return map; + } + + /** + * 首页排班列表分类显示 + * @return + */ + @RequestMapping(value="homePageArrange") + public Map homePageArrange(@RequestParam Map jsonMap){ + Map map=new HashMap(); + List daList=new ArrayList(); + try { + daList=doctorArrangeService.homeShowArrange(jsonMap); + map.put("daList", daList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageShowController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageShowController.java new file mode 100644 index 0000000..9c07322 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/HomePageShowController.java @@ -0,0 +1,158 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.HomePageShow; +import com.imurs.service.HomePageShowService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 医院首页控制器 + * @author Server + * + */ +@RestController +@RequestMapping(value="home") +public class HomePageShowController { + + @Autowired + HomePageShowService homePageShowService; + + /** + * 新增医院首页信息 + */ + @RequestMapping(value="insertHome") + public Map insertHome(HomePageShow homePageShow){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.insert(homePageShow); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 修改医院首页信息 + */ + @RequestMapping(value="updateHome") + public Map updateHome(HomePageShow homePageShow){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.updateById(homePageShow); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 查询医院首页信息 + */ + @RequestMapping(value="findHomeList") + public Map findHomeList(){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.isNotNull("type").orderBy("create_time", false); + List hmList=homePageShowService.selectList(wrapper); + if(hmList.isEmpty()){ + map.put("msg", "3"); + }else{ + //分组显示 + Map> collect = hmList.stream().collect(Collectors.groupingBy(HomePageShow::getType)); + map.put("hmListA", collect.get("A")); + map.put("hmListB", collect.get("B")); + map.put("hmListC", collect.get("C")); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 删除医院首页信息 + */ + @RequestMapping(value="deleteHome") + public Map deleteHome(Long id){ + Map map=new HashMap(); + try { + boolean result=homePageShowService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 首页信息分页显示 + * type:类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 ) + * + */ + @RequestMapping(value="findHomeListPage") + public Map findHomeListPage(String type,Integer pageSize,Integer pageNo){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setRows(pageSize == null ? 6 : pageSize); + page.setPage(pageNo == null ? 1 : pageNo); + try { + wrapper.eq("type", StringUtils.isEmpty(type)?"A":type).isNotNull("type").orderBy("create_time", false); + Page pageList = homePageShowService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList==null){ + map.put("msg", "3"); + }else{ + CustomPage customPage = new CustomPage(pageList); + map.put("customPage", customPage); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 查询首页信息详情 + */ + @RequestMapping(value="findHomeListById") + public Map findHomeListById(Long id){ + Map map=new HashMap(); + try { + HomePageShow hm=homePageShowService.selectById(id); + map.put("hm", hm); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ImageProcess.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ImageProcess.java new file mode 100644 index 0000000..5e19f34 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/ImageProcess.java @@ -0,0 +1,234 @@ +/*package com.imurs.controller; + + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.Base64; +import java.util.Iterator; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; + +import org.apache.commons.io.IOUtils; +import org.opencv.core.Core; +import org.opencv.core.CvType; +import org.opencv.core.Mat; +import org.opencv.core.MatOfByte; +import org.opencv.core.MatOfInt; +import org.opencv.core.Size; +import org.opencv.imgcodecs.Imgcodecs; +import org.opencv.imgproc.Imgproc; +import org.opencv.photo.Photo; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + + +import com.imurs.ocr.AuthService; +import com.imurs.ocr.FileUtil; +import com.imurs.ocr.HttpUtil; +import com.imurs.ocr.PicUtils; +import com.imurs.util.Opencvload; + +import net.sf.json.JSONObject; +import sun.misc.BASE64Decoder; + + + + +@RestController +@RequestMapping(value="ImageProcess") +public class ImageProcess { + @RequestMapping(value = "/contrastimg") + public String saveImage(MultipartFile filelSavePath,String id) throws Exception { + InputStream is =filelSavePath.getInputStream(); + //限制在4M内 + String url = null; + //Map json =ocrdemo.OcrRecognition(is); + *//* byte[] imgData = FileUtil.readInputStreamByBytes(is); + //文件路径 + String imgStr = base64Encode(imgData); + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + + String param = "image=" + imgParam; + AuthService as = new AuthService();//每个应用的密钥是不一样的,所以需要重新 + String accessToken = as.getAuth("2"); + String result = HttpUtil.post(url, accessToken, param); + // JSONObject IMG = new JSONObject(); + JSONObject json=JSONObject.fromObject(result); + String base64r= json.getString("image"); + System.out.println("结果是什么"+json.getString("image")); + BASE64Decoder decoder = new BASE64Decoder(); + try { + FileOutputStream write = new FileOutputStream(new File("D://qr.png")); + byte[] decodeBytes = decoder.decodeBuffer(base64r); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + + // return result; + String base64r=null; + if("1".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/contrast_enhance"; + base64r= commonImageInputStream(is,url); + }else if("2".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_quality_enhance"; + base64r= commonImageInputStream(is,url); + }else if("3".equals(id)){ + url = "https://aip.baidubce.com/rest/2.0/image-process/v1/dehaze"; + base64r= commonImageInputStream(is,url); + }else{ + throw new Exception("不匹配"); + } + + return base64r; + + + } +//图像去噪功能,中值滤波5*5,需要使用的opencv + @RequestMapping(value = "/denoise") + public String denoiseImage(MultipartFile filelSavePath,String id) throws Exception { + //Opencvload o= new Opencvload(); + // System.load("I://opencv3.4.4//opencv//build//java//x64//opencv_java344.dll");//win + System.load("/usr/local/cvdemo/libopencv_java344.so");//centos7 64 + InputStream input =filelSavePath.getInputStream(); + //System.out.println("13434"); + // System.out.println("sds"+input.available()); + //因为截图的格式是JPG,所以只对jpg 做了处理。,也会有BMP + + // System.load("/usr/local/cvdemo/libopencv_java344.so");//centos7 + // System.out.println("s2ds"+input.available()); + BufferedImage img =(BufferedImage)ImageIO.read(input); + + Mat source =bufferedImageToMat(img); + Mat destination = new Mat(); + MatOfByte destination1 = new MatOfByte(); + switch(id) + { + case "1": + //System.out.println("1"); + //Photo.fastNlMeansDenoisingColored(source,destination, 10, 10, 7, 21);//非局部平均去噪,使用彩色图像 + Imgproc.medianBlur(source,destination,5);//中值滤波 高斯噪声 + break; + case "2": + //System.out.println("2"); + Imgproc.medianBlur(source,destination,3);//中值滤波 椒盐噪声 + break; + *//* case "3": + System.out.println("3"); + Size s =new Size(3,3); + Imgproc.GaussianBlur(source, destination, s, 0);//高斯滤波 + break;*//* + default : + return "参数不对"; + + } + + // ,默认是压缩的95,修改成百分百不压缩 + int quilatly= Imgcodecs.CV_IMWRITE_JPEG_QUALITY; + int num =100; + MatOfInt parm = new MatOfInt(quilatly,num); + // + *//* + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + IOUtils.copy(input, outputStream ); + //转换成字节数组 + byte[] byteArray = outputStream .toByteArray(); + ByteArrayInputStream inputStreamClone = new ByteArrayInputStream(byteArray); + ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStreamClone);//JPEG ,bmp + // 获取ImageReader对象的迭代器 + //默认只有一张 + String formatNameList=null; + Iterator iterator = ImageIO.getImageReaders(imageInputStream); + while(iterator.hasNext()){ + formatNameList=iterator.next().getFormatName(); + }*//* + + //if("JPEG".equals(formatNameList)){ + Imgcodecs.imencode(".jpg", destination, destination1,parm);//mat 转成matofbyte + *//* }else if("bmp".equals(formatNameList)){ + Imgcodecs.imencode(".bmp", destination, destination1);//mat 转成matofbyte + }*//* + //Imgcodecs.imencode(regx, destination, destination1,parm);//mat 转成matofbyte + byte[] d= destination1.toArray(); + //字节数组转成BASE64流,给前端返回这个流 + String img1= base64Encode(d); + //base64流,写成图片 + *//* BASE64Decoder decoder = new BASE64Decoder(); + try { + FileOutputStream write = new FileOutputStream(new File("I://TEST//2.jpg")); + byte[] decodeBytes = decoder.decodeBuffer(img1); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + + return img1; + } + //基本工具 + public static Mat bufferedImageToMat(BufferedImage bi) { + Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3); + byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData(); + mat.put(0, 0, data); + return mat; + } + private String commonImageInputStream(InputStream is,String url) throws Exception{ + + byte[] imgData1 = FileUtil.readInputStreamByBytes(is); + byte[] imgData = PicUtils.compressPicForScale(imgData1, 4000, "x1"); + //文件路径 + String imgStr = base64Encode(imgData); + + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + + String param = "image=" + imgParam; + AuthService as = new AuthService();//每个应用的密钥是不一样的,所以需要重新 + String accessToken = as.getAuth("2"); + String result=null; + try{ + result = HttpUtil.post(url, accessToken, param); + }catch (Exception e){ + e.printStackTrace(); + } + // JSONObject IMG = new JSONObject(); + JSONObject json=JSONObject.fromObject(result); + String base64r= json.getString("image"); + *//* System.out.println("结果是什么"+json.getString("image")); + BASE64Decoder decoder = new BASE64Decoder(); + try { + Random ra =new Random(); + String file ="D://"+ra.nextInt(10)+".png"; + FileOutputStream write = new FileOutputStream(new File(file)); + byte[] decodeBytes = decoder.decodeBuffer(base64r); + write.write(decodeBytes); + write.close(); + }catch (IOException e) { + e.printStackTrace(); + }*//* + return base64r; + + } + private static String base64Encode(byte[] content) { + + Base64.Encoder encoder = Base64.getEncoder(); // JDK 1.8 推荐方法 + String str = encoder.encodeToString(content); + + + // char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库 + // String str = new String(chars); + + return str; + } +}*/ +//工具类读流成字节 diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/InstallModelController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/InstallModelController.java new file mode 100644 index 0000000..17439e4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/InstallModelController.java @@ -0,0 +1,139 @@ +package com.imurs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.InstallModel; +import com.imurs.service.InstallModelService; +import com.imurs.service.impl.InstallModelServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("install") +public class InstallModelController { + + @Autowired + InstallModelServiceImpl installModelService; + + + /** + * 增加医院设备的型号数据 + * @param installModel + */ + + @RequestMapping("addInstallModel") + public Map addInstallModel(InstallModel installModel) { + Map resultMap = new HashMap<>(4); + try { + boolean result = installModelService.insert(installModel); + if (result) { + resultMap.put("msg","1"); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } + + + /** + * 更新医院的设备型号 + * @param installModel + */ + + @RequestMapping("updateInstallModel") + public Map updateInstallModel(InstallModel installModel) { + Map resultMap = new HashMap<>(2); + try { + boolean result = installModelService.updateById(installModel); + if (result) { + resultMap.put("msg",1); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 删除医院的设备型号 + * @param id + */ + + @RequestMapping("deleteInstallModel") + public Map deleteInstallModel(Integer id) { + Map resultMap = new HashMap<>(2); + try { + boolean result = installModelService.deleteById(id); + if (result) { + resultMap.put("msg",1); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 根据id查询设备型号 + * @param id + */ + + @RequestMapping("findInstallModelById") + public Map findInstallModel(Integer id) { + Map resultMap = new HashMap<>(2); + try { + InstallModel installModel = installModelService.selectById(id); + if (installModel != null) { + resultMap.put("installModel",installModel); + resultMap.put("msg","1"); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg",4); + } + return resultMap; + } + + + /** + * 通过医院id与会诊类型查找设备型号 + * @param hospitalId 医院id + * @param type 会诊类型 超声视频:BMODEL 远程会诊视频:CON + * @return + */ + + @RequestMapping("findInstallMode") + public Map findInstallMode(String hospitalId,String type) { + Map resultMap = new HashMap<>(2); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("hospital_id",hospitalId); + if(type!=null) { + wrapper.eq("type",type); + } + try { + List installModels = installModelService.selectList(wrapper); + + resultMap.put("installModels",installModels); + resultMap.put("msg",1); + + + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("msg","4"); + } + return resultMap; + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LiveController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LiveController.java new file mode 100644 index 0000000..68054d5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LiveController.java @@ -0,0 +1,190 @@ +package com.imurs.controller; + +import com.imurs.dao.LiveMapper; +import com.imurs.entity.Live; +import com.imurs.service.LiveService; +import com.imurs.service.impl.LiveServiceImpl; +import com.imurs.util.page.Pagetion; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping(value="live") +public class LiveController { + + @Autowired + private LiveService liveService; + + + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("updateLive") + public Map updateLive(Live live){ + Map map=new HashMap(); + boolean result = false; + try { + if(live != null) { + result=liveService.updateById(live); + liveService.updateById(live); + } + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 插入直播地址 + */ + @Transactional + @RequestMapping("insertLive") + public Map insertLive(Live live){ + Map map=new HashMap(); + boolean result = false; + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + try { + if(live != null) { + result=liveService.insert(live); + liveService.updateById(live); + } + live.setApplicationTime(dateFormat.parse(dateFormat.format(date))); + map.put("id",live.getId()); + map.put("applicationTime",live.getApplicationTime()); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("deleteLive") + public Map deleteLive(Live live){ + Map map=new HashMap(); + boolean result = false; + try { + if(live != null) { + result=liveService.deleteById(live); + } + map.put("msg", result ?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改直播地址 + */ + @Transactional + @RequestMapping("selectLiveById") + public Map selectLive(Long id){ + Map map=new HashMap(); + try { + Live live = liveService.selectById(id); + map.put("live",live); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 管理医院B超列表 + */ + @RequestMapping("selectLivePage") + public Map selectBmodePage(String state, + Integer pageNo,Integer pageSize){ + Map map=new HashMap(); + map.put("state",state); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + Pagetion pagetion = liveService.selectLivePage(map, pageNo, pageSize); + map.clear(); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("categoryHospitalId"); + } + return map; + } +// /*********************************** +// * 批量删除直播地址 +// */ +// @Transactional +// @RequestMapping("deleteBatchLive") +// public Map deleteBatchLive(@RequestBody List aList){ +// Live live = aList.get(0); +// Map map=new HashMap(); +// boolean result = false; +// try { +// if(live != null) { +// result=liveService.deleteBatchIds(aList); +// } +// map.put("msg", result==true?"1":"2"); +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } +// /** +// * 批量新增直播地址 +// */ +// @Transactional +// @PostMapping("insertBatchLive") +// public Map insertLive(@RequestBody List aList){ +// Map map=new HashMap(); +// try { +// if(!aList.isEmpty()){ +// boolean result = liveService.insertBatch(aList); +// map.put("msg", result==true?"1":"2"); +// }else{ +// map.put("msg", "3"); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } +// /** +// * 批量修改直播地址 +// */ +// @Transactional +// @RequestMapping("updateBatchLive") +// public Map updateLive(List aList){ +// Live live = aList.get(0); +// Map map=new HashMap(); +// boolean result = false; +// try { +// if(live != null) { +// result=liveService.updateBatchById(aList); +// } +// map.put("msg", result==true?"1":"2"); +// } catch (Exception e) { +// e.printStackTrace(); +// map.put("msg", "4"); +// } +// return map; +// } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginController.java new file mode 100644 index 0000000..f643e31 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginController.java @@ -0,0 +1,171 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import com.imurs.shiro.ShiroUtils; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +/** + * 登录 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "login") +public class LoginController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + private static String privateKey = MsgCode.privateKeyString; + + + /** + * 医生修改密码(没有使用) + */ + @RequestMapping(value = "updateUserPassword") + public Map updateUserPassword(String phone, String oidPassword, String newPassword) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(oidPassword) + && StringUtils.isNotEmpty(newPassword)) { + wrapper.eq("phone", phone); + // 查询这个用户是否存在 + User user = userService.selectOne(wrapper); + if (user != null) { + if (user.getPassword().equals(MD5.GetMD5Code(oidPassword))) { + user.setPassword(MD5.GetMD5Code(newPassword)); + Boolean b = userService.update(user, wrapper); + map.put("msg", b == true ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 管理员重置医生密码(没有使用) + */ + @RequestMapping(value = "resetUserPassword") + public Map resetUserPassword(String phone, String password) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(password)) { + // 查询这个用户是否存在 + User user = userService.selectOne(new EntityWrapper().eq("phone", phone)); + if (user != null) { + user.setPassword(MD5.GetMD5Code(password)); + Boolean b = userService.updateById(user); + map.put("msg", b == true ? "1" : "2"); + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 医院修改密码 + */ + @RequestMapping(value = "informationUpdatePassword") + public Map informationUpdatePassword(String hospitalId, String oldPassword, String newPassword) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(hospitalId) && StringUtils.isNotEmpty(oldPassword) + && StringUtils.isNotEmpty(newPassword)) { + // 查询这个用户是否存在 + + oldPassword = RSAUtil.decrypt(oldPassword,privateKey); + newPassword = RSAUtil.decrypt(newPassword,privateKey); + + ApplyInformation applyInformation = applyInformationService + .selectOne(new EntityWrapper().eq("id", hospitalId)); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (passwordEncoder.matches(oldPassword,applyInformation.getPassword())) { + applyInformation.setPassword(passwordEncoder.encode(newPassword)); + Boolean b = applyInformationService.updateById(applyInformation); + map.put("msg", b ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 管理员重置医院密码 + */ + @RequestMapping(value = "resetInformationPassword") + public Map resetInformationPassword(String hospitalId, String password) { + Map map = new HashMap(); + try { + if (StringUtils.isNotEmpty(hospitalId) && StringUtils.isNotEmpty(password)) { + // 查询这个用户是否存在 + ApplyInformation applyInformation = applyInformationService + .selectOne(new EntityWrapper().eq("id", hospitalId)); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + applyInformation.setPassword(passwordEncoder.encode(password)); + Boolean b = applyInformationService.updateById(applyInformation); + map.put("msg", b ? "1" : "2"); + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginRecordController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginRecordController.java new file mode 100644 index 0000000..83b1543 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/LoginRecordController.java @@ -0,0 +1,112 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.LoginRecord; +import com.imurs.service.LoginRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 登录记录 + * @author Server + * + */ +@RestController +@RequestMapping(value="loginRecord") +public class LoginRecordController { + + @Autowired + LoginRecordService loginRecordService; + + /** + * 新增登录记录 + * @param loginRecord + * @return + */ + @RequestMapping(value="addLoginRecord") + public Map addLoginRecord(LoginRecord loginRecord,HttpServletRequest request) throws Exception { + Map map=new HashMap(); + + try { + /** + * 获取访问用户的客户端IP(适用于公网与局域网). + */ + if (request == null) { + throw (new Exception("getIpAddr method HttpServletRequest Object is null")); + } + String ipString = request.getHeader("x-forwarded-for"); + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getRemoteAddr(); + } + + // 多个路由时,取第一个非unknown的ip + final String[] arr = ipString.split(","); + for (final String str : arr) { + if (!"unknown".equalsIgnoreCase(str)) { + ipString = str; + break; + } + } + + loginRecord.setIp(ipString);//获取登录ip + boolean result=loginRecordService.insert(loginRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示登录记录信息 + */ + @RequestMapping(value="selectLoginRecordPage") + public Map selectLoginRecordPage(Integer pageNo,Integer pageSize,String loginId,String loginName){ + Map map=new HashMap(); + FrontPage page=new FrontPage(); + EntityWrapper wrapper=new EntityWrapper(); + + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?12:pageSize); + + if(StringUtils.isNotEmpty(loginId)){ + wrapper.eq("login_id", loginId); + }if(StringUtils.isNotEmpty(loginName)){ + wrapper.like("login_name", loginName); + } + wrapper.orderBy("create_time",false); + try { + Page loginRecord=loginRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(loginRecord!=null){ + CustomPage customPage=new CustomPage(loginRecord); + map.put("customPage", customPage); + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/OcrDemoController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/OcrDemoController.java new file mode 100644 index 0000000..ddcb948 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/OcrDemoController.java @@ -0,0 +1,109 @@ +package com.imurs.controller; +import java.io.BufferedInputStream; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.metadata.Sheet; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.imurs.ocr.ocrdemo; +@RestController +@RequestMapping(value = "/Ocrcontroller") +public class OcrDemoController { + @RequestMapping(value = "/saveimg") + public Map saveImage(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + Map json =ocrdemo.OcrRecognition(is); + + + return json; + } + @RequestMapping(value = "/aliExcel") + public JSONObject aliExcel(MultipartFile filelSavePath) throws Exception { + InputStream is =filelSavePath.getInputStream(); + InputStream inputStream = new BufferedInputStream(is); + List data = EasyExcelFactory.read(inputStream, new Sheet(1, 0)); + inputStream.close(); + Map m= print2(data); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(m)); + // Object o = JSONObject.toJSON(m); + return JSONObj; + + + } + public Map print2(List datas){ + + Map m = new HashMap(); + /* for(int i=4;i insertPatient(Patient patient) { + Map map = new HashMap(); + try { + boolean result = patientService.insert(patient); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改患者信息 + */ + @RequestMapping(value = "updatePatient") + public Map updatePatient(Patient patient) { + Map map = new HashMap(); + try { + boolean result = patientService.updateById(patient); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除患者信息 + */ + @Transactional + @RequestMapping(value = "deletePatientByCard") + public Map deletePatientByCard(String card) { + Map map = new HashMap(); + try { + if(StringUtils.isEmpty(card)){ + map.put("msg", "3"); + }else{ + map.put("card", card); + boolean result = patientService.deleteByMap(map); + map.put("msg", result == true ? "1" : "2"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除患者信息 + */ + @RequestMapping(value = "deletePatientById") + public Map deletePatientById(Long id) { + Map map = new HashMap(); + try { + boolean result = patientService.deleteById(id); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据患者病例号码查询 + */ + @RequestMapping(value = "seletePatientByCard") + public Map seletePatientById(String esrdNumber,String hospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(StringUtils.isEmpty(esrdNumber)){ + map.put("msg", "3"); + }else{ + wrapper.eq("esrd_number", esrdNumber).eq("hospital_id", hospitalId);; + Patient patient = patientService.selectOne(wrapper); + map.put("patient", patient); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 分页显示患者信息 + */ + @RequestMapping(value = "seletePatientPage") + public Map seletePatientPage(Integer pageNo, Integer pageSize,String card,String ptName,Integer type,String hospitalId,String esrdNumber) { + Map map = new HashMap(); + map.put("hospitalId", hospitalId); + map.put("card", card); + map.put("esrdNumber", esrdNumber); + map.put("ptName", ptName); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + try { + if(type!=null && type==1){ + Pagetion acList=applyCaseService.selectCasePatient(map, pageNo, pageSize); + map.put("acList", acList); + }else if(type!=null && type==2){ + Pagetion conList=applyConsultationService.selectConPatient(map, pageNo, pageSize); + map.put("acList", conList); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalId"); + map.remove("card"); + map.remove("ptName"); + map.remove("esrdNumber"); + } + return map; + } + + /** + * 患者列表 + */ + @RequestMapping(value = "seletePatientByPage") + public Map seletePatientPage(Integer pageNo, Integer pageSize,String card,String patientName,String hospitalId,String esrdNumber) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 10 : pageSize); + + if(StringUtils.isNotEmpty(esrdNumber)){ + wrapper.eq("esrd_number", esrdNumber); + } + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(card)){ + wrapper.eq("card", card); + } + if(StringUtils.isNotEmpty(patientName)){ + wrapper.like("patient_name", patientName); + } + wrapper.orderBy("create_time", false); + try { + Page ptList = patientService.selectPage(page.getPagePlusTwo(), wrapper); + if(ptList!=null){ + CustomPage customPage=new CustomPage(ptList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/PdfReaderController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/PdfReaderController.java new file mode 100644 index 0000000..3bfa16f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/PdfReaderController.java @@ -0,0 +1,269 @@ +package com.imurs.controller; + + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.apache.pdfbox.pdfparser.PDFParser; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.util.PDFTextStripper; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +@RestController +@RequestMapping(value = "/pdfcontroller") +public class PdfReaderController { + + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + @RequestMapping(value = "/recpdf") + public Map saveImage(MultipartFile filelSavePath,String id) throws Exception { + InputStream is =filelSavePath.getInputStream(); + //Map json =ocrdemo.OcrRecognition(is); + + String s =getTextFromPdf (is,0,1 ) ;//0,1 没有用 + boolean IsAdmissionNote = s.contains("入院记录"); + boolean isBingChen = s.contains("病程记录"); + boolean isFirstBC =s.contains("首次病程"); + JSONObject json=null; + if(IsAdmissionNote&&"1".equals(id)){ + json=parseriuan(s);//入院记录 1 + } + else if(isBingChen&&isFirstBC&&"2".equals(id)){ + json=parsefirst(s);//第一次检查2 + } + else if(isBingChen&&!isFirstBC){ + json=parsebingchen(s);//日常检查3 + }else{ + return JSONObject.parseObject("not match"); + } + return json; + } + public String getTextFromPdf (InputStream filePath,int pageStartValue,int pageEndValue ) { + String result = null; + InputStream is = null; + PDDocument document = null; + try { + is = filePath; + PDFParser parser = new PDFParser(is); + parser.parse(); + document = parser.getPDDocument(); + PDFTextStripper stripper = new PDFTextStripper(); + /* stripper.setStartPage(0); + stripper.setEndPage(1);//设置解读页数 + */ + + result = stripper.getText(document); + } catch (IOException e1) { + e1.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (document != null) { + try { + document.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public JSONObject parseriuan(String s){ + Map map = new HashMap(); + int i=s.indexOf("姓名:"); + int j=s.indexOf("性别:"); + String name=s.substring(i+3, j); + int s1=s.indexOf("科室:"); + String sex=s.substring(j+3, s1); + int depn =s.indexOf("住院号:"); + int cw= s.indexOf("床位:"); + String dept =s.substring(s1+3, depn); + String deptNo =s.substring(depn+4, cw);//住院号 + //System.out.println(deptNo); + //籍贯 + int jg =s.indexOf("籍 贯:"); + int jg1 = s.indexOf("性 别:",j); + //String Birthplace=s.substring(jg+3, jg1); + //System.out.println(s); + String Birthplace=s.substring(jg+10,jg1);//籍 贯 + + int c1 = s.indexOf("住 址:"); + int c2 =s.indexOf("民 族: "); + String ptCity =s.substring(c1+10,c2); + int hd=s.indexOf("入院日期:"); + int age =s.indexOf("年 龄:"); + String mj = s.substring(c2+10,hd);//民 族 + String nuh_time=s.substring(hd+6,age);//入院日期 + + int hd1=s.indexOf("记录日期:"); + int mj1=s.indexOf("职 业:"); + String agen = s.substring(age+10, hd1); + String date=s.substring(hd1+6, mj1);//记录日期 + int bs=s.indexOf("病史陈述者:"); + String major= s.substring(mj1+10,bs);//职 业 + int mar=s.indexOf("婚 否:"); + String ismarry =s.substring(bs+7, mar);// + + int ke =s.indexOf("可靠程度:"); + String ismar =s.substring(mar+10, ke); + int com =s.indexOf("主诉:"); + String c=s.substring(ke+5, com);//可靠程度 + + int pre=s.indexOf("现病史:"); + String complain=s.substring(com+4, pre);//主诉 + int pas =s.indexOf("既往史:"); + String present =s.substring(pre+4, pas);//现病史 + int gh=s.indexOf("个人史:"); + int yh=s.indexOf("月经史:"); + String past =s.substring(pas+4, gh); + String perhis =s.substring(gh+4, yh);//个人史 + int med=s.indexOf("婚育史:"); + int fah=s.indexOf("家族史:"); + String yueh=s.substring(yh+4, med);//月经史 + String medhis= s.substring(med+4, fah);//家族史 + + int geche =s.indexOf("体 格 检 查 "); + int zkq = s.indexOf("专科情况:"); + String fh=s.substring(fah+4, geche); + int jy= s.indexOf("靖远县", geche); + int cw2=s.indexOf("床位:",geche); + int fzjc = s.indexOf("辅助检查:"); + String specialistCase =s.substring(zkq+5, jy-6)+s.substring(cw2+5, fzjc).trim();//专科情况 + String gecheck =s.substring(geche+7, zkq); + int cyzd=s.indexOf("出院诊断:"); + String fzck =s.substring(fzjc+5, cyzd);//辅助检查 + int chubuzd =s.indexOf("初步诊断:"); + int dn =s.indexOf("医生签名:"); + int rz =s.indexOf("补充诊断:"); + int xz =s.indexOf("修正诊断:"); + String chzd=s.substring(cyzd+5, chubuzd);//出院诊断 + String initial =s.substring(chubuzd+5, dn);//初步诊断: + String docname=s.substring(dn+5, rz);//医生签名 + String buchzd=s.substring(rz+5,xz);//补充诊断 + String xiuzzd=s.substring(xz+5);//修正诊断: + map.put("ptName", name);//姓名 + map.put("ptSex", sex); + map.put("nuhSection", dept);//科室 + map.put("inpatient", deptNo);//住院号 + map.put("birthplace", Birthplace);//籍贯 + map.put("ptCity", ptCity);//住址 + map.put("nation", mj);//民族 + map.put("nuhTime", nuh_time);//入院日期 + map.put("age", agen);//年龄 + map.put("recordDate", date);//记录日期 + map.put("profession", major);//职业 + map.put("statement", ismarry);//病史陈述者 + map.put("marriage", ismar);//婚 否 + map.put("confidence", c);//可靠程度 + map.put("complain", complain);//主诉 + map.put("present", present);//现病史 + map.put("past", past);//既往史 + map.put("personalHistory", perhis);//个人史 + map.put("fh", fh);//家族史 + map.put("pmp", yueh);//月经史 + map.put("obstetricalHistory", medhis);//婚育史 + map.put("physicalExamination", gecheck);//体 格 检 查assistant examination + map.put("assistantExamination", fzck);//辅助检查 + map.put("finalDiagnosis", chzd);//出院诊断 initial + map.put("initial", initial);//初步诊断 + map.put("addDiagnosis", buchzd);//补充诊断 + map.put("correctingDiagnosis", xiuzzd);//修正诊断 + map.put("docName", docname);//医生签名 + map.put("specialistCase", specialistCase); + //System.out.println(map.toString()); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + return JSONObj; + } + public JSONObject parsebingchen(String s){//日常病程 + Map map = new HashMap(); + + //日常记录 + int n1=s.indexOf("姓名:"); + int n2=s.indexOf("性别:"); + int k1=s.indexOf("科室:"); + int k2 =s.indexOf("住院号:"); + int cw =s.indexOf("床位:"); + String name =s.substring(n1+3, n2); + String sex =s.substring(n2+3, k1); + String dept =s.substring(k1+3,k2); + String inpatient=s.substring(k2+4, cw); + //病程记录了啊 + int bc=s.indexOf("病 程 记 录",cw); + int dn1 =s.indexOf("医师签名:"); + //第一次病程记录 + String fbin=s.substring(bc+7, dn1); + //System.out.println("第一次"+fbin); + map.put("0", fbin); + int index=dn1; + int prindex=dn1; + int i=0; + String dari=null; + while((index=s.indexOf("医师签名:",index+1))!=-1){// + dari=s.substring(prindex, index);//上次的 + prindex=index;//上次的 + index = index + 5; + //System.out.println("888"+i++); + map.put(i+"", dari); + } + map.put("name", name); + map.put("sex", sex); + map.put("chamber", dept); + map.put("inpatient", inpatient); + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + return JSONObj; + + } + //首次记录 + public JSONObject parsefirst(String s){ + //首次记录 + Map map = new HashMap(); + int n1=s.indexOf("姓名:"); + int n2=s.indexOf("性别:"); + int k1=s.indexOf("科室:"); + int k2 =s.indexOf("住院号:"); + int cw =s.indexOf("床位:"); + String name =s.substring(n1+3, n2); + String sex =s.substring(n2+3, k1); + String dept =s.substring(k1+3,k2); + String inpatient=s.substring(k2+4, cw); + // + int f= s.indexOf("首次病程"); + int bl =s.indexOf("病例特点"); + int cb =s.indexOf("初步诊断:"); + int zd= s.indexOf("诊断依据:"); + int jq= s.indexOf("鉴别诊断:"); + int pl= s.indexOf("诊疗计划:"); + int qm= s.indexOf("签名:"); + String fis=s.substring(f+4, bl); + map.put("fis", fis);// 首次病程 + map.put("name", name); + map.put("sex", sex); + map.put("nuhSection", dept); + map.put("inpatient", inpatient); + map.put("characteristic", s.substring(bl+5, cb));//病例特点 + map.put("initial", s.substring(cb+5, zd));//初步诊断 + map.put("dsm", s.substring(zd+5, jq));//诊断依据 + map.put("antidiastole", s.substring(jq+5, pl));//鉴别诊断 + map.put("assessandplan", s.substring(pl+5, qm));//诊疗计划 + //int + JSONObject JSONObj = JSONObject.parseObject(JSON.toJSONString(map)); + //System.out.println(map.toString()); + return JSONObj; + + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/RegisterController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/RegisterController.java new file mode 100644 index 0000000..7efea62 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/RegisterController.java @@ -0,0 +1,237 @@ +package com.imurs.controller; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.shiro.ShiroUtils; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.entity.Role; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationImgService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.RoleService; +import com.imurs.service.TotalInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +import static com.imurs.shiro.ShiroUtils.generateSalt; + +/** + * 注册 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "register") +public class RegisterController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + ApplyInformationImgService applyInformationImgService; + @Autowired + UserService userService; + @Autowired + TotalInformationService totalInformationService; + @Autowired + RoleService roleService; + + private static String password = MsgCode.Password; + + private static String privateKey = MsgCode.privateKeyString; + + /** + * 新增基层医院申请信息 + */ + @RateLimiterAspect + @Transactional + @RequestMapping(value = "registerInfor") + public Map registerInfor(ApplyInformation applyInformation, String imgUrl2, String imgType) { + Map map = new HashMap(); + List imgList = new ArrayList(); + Role role = new Role(); + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + Date date=new Date(); + try { + String uuid=MD5.GetMD5Code(dateFormat.format(date)); + if (applyInformation != null) { + // 判断医院名字是否已经注册,如果已经注册就不能再注册 + Wrapper wrapper = new EntityWrapper() + .eq("hospital_name",applyInformation.getHospitalName()); + List informationList = applyInformationService.selectList(wrapper); + if (!informationList.isEmpty()) { + map.put("msg","5"); + return map; + } + role = roleService.selectById(applyInformation.getRid()); + if (role != null) { + applyInformation.setRpId(role.getRpId()); + } + // 医院id按照时间日期生成 + applyInformation.setId(uuid); + applyInformation.setAccount(uuid); + //9.16新增默认密码 前台默认不传 + /*if(!applyInformation.getPassword().isEmpty()&&applyInformation.getPassword()!=null){ + }*/ + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + applyInformation.setPassword(passwordEncoder.encode(password)); + //applyInformation.setPassword(MD5.GetMD5Code(applyInformation.getPassword())); + boolean result = applyInformationService.insert(applyInformation); + if (result == true) { + if (StringUtils.isNotEmpty(imgUrl2) && StringUtils.isNotEmpty(imgType)) { + String str[] = imgUrl2.split(","); + String str2[] = imgType.split(","); + for (int i = 0; i < str2.length; i++) { + ApplyInformationImg img = new ApplyInformationImg(); + img.setImgUrl(str[i]); + img.setImgType(Integer.valueOf(str2[i])); + img.setHospitalId(uuid); + imgList.add(img); + } + applyInformationImgService.insertBatch(imgList); + } + map.put("msg", "1"); + } else { + map.put("msg", "2"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 医生注册 + * + * @param user + * @return + */ + @RateLimiterAspect + @RequestMapping(value = "registerUser") + public Map insertUser(User user) { + Map map = new HashMap(); + Role role = new Role(); + try { + if (user != null && user.getRid() != null) { + // 如果该账号存在直接返回,不能继续注册 + Map existMap = selectPhone(user.getPhone()); + if (existMap.get("msg").equals("5")) { + map.put("msg","5"); + return map; + } + role = roleService.selectById(user.getRid()); + if (role != null) { + user.setRpId(role.getRpId()); + } + user.setContactPhone(user.getPhone()); + //9.16修改 + String password = RSAUtil.decrypt(user.getPassword(), privateKey); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + user.setPassword(passwordEncoder.encode(password)); + boolean result = userService.insert(user); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectPhone") + public Map selectPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + int count = userService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 判断当前联系手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectContactPhone") + public Map selectContactPhone(String contactPhone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("contact_phone", contactPhone); + try { + int count = userService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 获得手机号码的角色 + */ + @RequestMapping(value = "selectPhoneRid") + public Map selectPhoneRid(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + User user = userService.selectOne(wrapper); + map.put("msg", user == null ? "1003" :user.getRid()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 判断医联体负责人手机号码 + */ + @RequestMapping(value = "selectHospitalPhone") + public Map selectHospitalPhone(String deanPhone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("dean_phone", deanPhone); + try { + int count = applyInformationService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SaveRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SaveRecord.java new file mode 100644 index 0000000..e285af5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SaveRecord.java @@ -0,0 +1,82 @@ +/*package com.imurs.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.exceptions.ServerException; +import com.aliyuncs.profile.DefaultProfile; +//import com.google.gson.Gson; +import com.aliyuncs.live.model.v20161101.RealTimeRecordCommandRequest; +import com.aliyuncs.live.model.v20161101.RealTimeRecordCommandResponse; +import com.imurs.parameter.Bcall; +import com.imurs.parameter.Socket; +@RestController +@RequestMapping(value="SaveRecord") +public class SaveRecord { + + @Autowired + private Socket socket; + + @RequestMapping(value="/call") + @ResponseBody + public Map userMenu(@RequestBody Bcall user){ + //录制视频时 我需要前端传我患者信息 方便保存 + Map map=new HashMap(); + // String app = request.getParameter("app"); + System.out.println("回调成功了吗"+user.getApp()+user.getUri()+"录制事件是否成功"+user.getEvent()+"录制 时长"+user.getDuration()); + try { + socket.sendMessage(user.getEvent()+":"+user.getUri()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //System.out.println("保存地址"+dualr.getUri()); + //System.out.println("保存时间"+dualr.getDuration()); + return map; + } + *//** + * 录音 + * @return + *//* + @RequestMapping(value="/video") + public Map video(String rpId){ + Map map=new HashMap(); + //String[] str=null; + DefaultProfile profile = DefaultProfile.getProfile("cn-shenzhen", "LTAIvXeYf3fuMvDZ", "GGRbUL2hNdZBPWnGh0xkkwtQgqN7Yq"); + IAcsClient client = new DefaultAcsClient(profile); + + RealTimeRecordCommandRequest request = new RealTimeRecordCommandRequest(); + request.setRegionId("cn-shenzhen"); + request.setDomainName("yiduliveplay.jysmyy.com"); + request.setAppName("AppName"); + request.setStreamName("StreamName"); + request.setCommand(rpId);//start + // System.out.println("自动录制"); + //调用AddLiveAppRecordConfig接口配置录制规则。设置ondemand=7,表示推流后不自动录制。 + //推流 + //调用RealTimeRecordCommand接口启动录制。 + //(如果需要)调用RealTimeRecordCommand接口停止录制 + try { + RealTimeRecordCommandResponse response = client.getAcsResponse(request); + //System.out.println(new Gson().toJson(response)); + } catch (ServerException e) { + e.printStackTrace(); + } catch (ClientException e) { + //System.out.println("ErrCode:" + e.getErrCode()); + //System.out.println("ErrMsg:" + e.getErrMsg()); + //System.out.println("RequestId:" + e.getRequestId()); + map.put("ErrMsg:", e.getErrMsg()); + } + + return map; + } +} +*/ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SectionController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SectionController.java new file mode 100644 index 0000000..dd76690 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SectionController.java @@ -0,0 +1,160 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.Section; +import com.imurs.service.SectionService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +/** + * 科室管理 + * @author Server + * + */ +@RestController +@RequestMapping(value="section") +public class SectionController { + + @Autowired + SectionService sectionService; + + + /** + * 新增科室 + * @param section + * @return + */ + @RequestMapping(value="insertSection") + public Map insertSection(Section section){ + Map map=new HashMap(); + try { + boolean result=sectionService.insert(section); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 修改科室 + * @param section + * @return + */ + @RequestMapping(value="updateSection") + public Map updateSection(Section section){ + Map map=new HashMap(); + try { + boolean result=sectionService.updateById(section); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除科室 + * @param section + * @return + */ + @RequestMapping(value="deleteSection") + public Map updateSection(Long id){ + Map map=new HashMap(); + try { + boolean result=sectionService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前科室是否存在 + */ + @RequestMapping(value="selectSectionByName") + public Map updateSection(String seName,String hospitalId){ + Map map=new HashMap(); + EntityWrapper
    wrapper=new EntityWrapper
    (); + wrapper.eq("se_name", seName).eq("hospital_id", hospitalId); + try { + int count=sectionService.selectCount(wrapper); + map.put("msg",count); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询当前医院下面的所有科室名称 + */ + @RequestMapping(value="selectSectionById") + public Map selectSectionById(String hospitalId){ + Map map=new HashMap(); + EntityWrapper
    wrapper=new EntityWrapper
    (); + wrapper.setSqlSelect("se_name as seName").eq("hospital_id", hospitalId); + wrapper.orderBy("if(se_name='超声科',0,1),if(se_name='信息科',0,1)," + + "if(se_name='外科',0,1),if(se_name='内科',0,1)"); + try { + List
    stList=sectionService.selectList(wrapper); + map.put("stList",stList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally{ + map.remove("hospital_id"); + } + return map; + } + + + + + /** + * 科室列表分页 + */ + @RequestMapping(value="selectSectionPage") + public Map selectSectionPage(String hospitalId,Integer pageNo,Integer pageSize,String seName){ + Map map=new HashMap(); + EntityWrapper
    wrapper=new EntityWrapper
    (); + wrapper.eq("hospital_id", hospitalId); + if(StringUtils.isNotEmpty(seName)){ + wrapper.like("se_name", seName); + } + wrapper.orderBy("create_time,id",false); + FrontPage
    page=new FrontPage
    (); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?6:pageSize); + try { + Page
    pageList=sectionService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage
    customPage=new CustomPage
    (pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendMsgController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendMsgController.java new file mode 100644 index 0000000..344d8e8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendMsgController.java @@ -0,0 +1,113 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; +import net.sf.json.JSONObject; + +/** + * 短信发送 + * + * @author dgg + * + */ +@RestController +@RequestMapping(value = "send") +public class SendMsgController { + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + UserService userService; + + /** + * 忘记密码、修改密码 + */ + @RateLimiterAspect + @RequestMapping("/forgetPwd") + public Map forgetPwd(String phone, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + // 根据ip来限制访问次数,防止恶意攻击 + String ipAddress = "forgetPwd" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ipAddress,10)) { + map.put("msg", "您好,您正在修改密码,本次验证码为:"+flag+",验证码1分钟内有效,过时需要重新获取。如非本人操作,请勿理会。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "2"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(60); + resultMap.put("msg", "1"); + } else { + resultMap.put("msg","13"); + } + return resultMap; + } + + + /** + * 登录验证码 + */ + @RequestMapping("/loginCode") + public Map loginCode(String phone, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + map.put("msg", "您的短信验证码为"+flag+",请本人及时输入,切勿向他人泄漏。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "2"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(1 * 60); + resultMap.put("msg", "1"); + return resultMap; + } + + + + @RequestMapping("/checkmsg") + public Boolean checksms(String code, HttpServletRequest request) throws Exception { + HttpSession session = request.getSession(); + Boolean flag = code.equals(session.getAttribute("xllmsg").toString()); + return flag; + + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteController.java new file mode 100644 index 0000000..fcb7098 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteController.java @@ -0,0 +1,139 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 短信验证码控制器 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "note") +public class SendNoteController { + + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + + /** + * 获取短信验证码 + * @param phone + * @param request + * @return + * @throws Exception + */ + @RateLimiterAspect + @RequestMapping("/sendmsg") + public Map sendsms(HttpServletRequest request, String phone) throws Exception { + HttpSession session = request.getSession(); + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account", MsgCode.account); + map.put("password", MsgCode.password); + int flag = 0; + flag = new Random().nextInt(999999); + while (flag < 100000) { + flag = new Random().nextInt(999999); + } + String ipAddress = "sendmsg" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ipAddress,10)) { + map.put("msg", "欢迎注册"+MsgCode.hospitalName+"分级诊疗平台,验证码是:"+ flag +", 1分钟内有效,过时需要重新获取。无需回复"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + session.setAttribute("xllmsg", flag); + session.setMaxInactiveInterval(1*60);//设置过期时间为1分钟 + resultMap.put("msg", "1"); + } else { + resultMap.put("msg","13"); + } + return resultMap; + } + + + /** + * 判断当前医生是否已经注册 + */ + @RequestMapping("selectUserPhone") + public Map selectUserPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("phone", phone); + try { + User user = userService.selectOne(wrapper); + map.put("msg", user == null ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前医院是否已经注册 + */ + @RequestMapping("selectHospitalName") + public Map selectHospitalName(String hospitalName) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("hospital_name", hospitalName); + try { + ApplyInformation infor = applyInformationService.selectOne(wrapper); + map.put("msg", infor == null ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断验证码是否正确 + * + * @param code + * @param request + * @return + * @throws Exception + */ + @RequestMapping("/checkmsg") + public Map checksms(String code, HttpServletRequest request) throws Exception { + Map map=new HashMap(); + HttpSession session = request.getSession(); + Boolean flag = code.equals(session.getAttribute("xllmsg").toString()); + if(flag){ + map.put("msg", "1"); + }else{ + map.put("msg", "2"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteJyController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteJyController.java new file mode 100644 index 0000000..4bcc7a2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteJyController.java @@ -0,0 +1,300 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.service.impl.UserServiceImpl; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 远程会诊 + * @author D140 + * + */ +@RestController +//@RequestMapping("jyNote") +public class SendNoteJyController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + + + /** + *远程病理通知/铱度 + */ + @RequestMapping("/sendPathologyYd") + public Map sendPathologyYd(String patientName,String docName, String chamber,String userName, + String phone, String hotName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",userName+"老师,您好!"+hotName+"的"+chamber+"科室"+docName+"专家为"+patientName+"患者发起远程病理的申请,请及时完成病理切割工作,谢谢。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 远程会诊分配成功/分配专家 + * 由基层上转给管理医院/分配专家/远程B超/远程心电/远程影像 + */ + @RequestMapping("/jyNote/sendSpeGenre") + public Map sendSpeGenre(String patientName,String docName,String phone, String hotName, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,医务科分配贵科负责首诊,请您尽快登录远程会诊平台进行会诊,谢谢!"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * + * @param docName 要发送的专家名字 + * @param seName 申请科室 + * @param applyDoc 申请医生 + * @param phone 要发送的手机号 + * @param applyDocPhone 申请医生电话 + * @return + */ + @RequestMapping("/jyNote/sendConsultationUrgent") + public Map sendConsultationUrgent(String docName,String seName,String applyDoc,String phone, + String applyDocPhone) { + Map resultMap = new HashMap<>(); + Map map = new HashMap<>(); + + map.put("account",MsgCode.ydAccount); + map.put("password", MsgCode.ydPassword); + map.put("phone", phone); + map.put("msg",docName + "医生,您好!" + seName + "的" + applyDoc + + "医生向您发起了紧急会诊视频申请,请尽快登录系统参与,谢谢!" + applyDoc + "医生联系电话:" + applyDocPhone); + + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.ydUrl,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 远程会诊分配成功/基层医生 + * 由基层上转给管理医院/基层医生/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendDocGenre") + public Map sendDocGenre(String patientName,String docName,String phone,String time, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"医生您好!您为"+patientName+"患者发起的"+genre+"会诊申请已经得到上级医院专家会诊同意,请在"+time+"时间准时登录远程会诊平台参加会诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 远程会诊分配成功/患者 + * 由基层上转给管理医院/患者/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendPtGenre") + public Map sendPtGenre(String patientName,String docName,String phone,String time, + String genre,String hotName,String applyDoc,String hname,String chamber,String appHotName, + String appDocName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",patientName+",您好!"+hotName+"的"+applyDoc+"医生为您发起的"+genre+"会诊申请已经通过审核," + + "接诊医生是"+hname+""+chamber+"的"+docName+"医生,请在"+time+"时间准时到"+appHotName+"的"+appDocName+"医生办公室参加会诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + /** + * 会诊完成/基层医生 + * 由基层上转给管理医院/基层医生/远程B超/远程心电/远程影像 + */ + @RequestMapping("/sendDocGenreDone") + public Map sendDocGenreDone(String patientName,String docName,String phone, + String genre) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",docName+"医生您好!您为"+patientName+"患者发起的"+genre+"会诊申请已经得到上级医院专家的回复,请您登录平台查看参考意见!"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 基层兵团医院申请远程超声时发送的短信 + * @param patientName 患者姓名 + * @param hotName 兵团医院名称 + * @param genre 会诊的名称 + * @return + * @throws Exception + */ + @RequestMapping("/jyNote/sendAdminGenre") + public Map sendAdminGenre(String patientName,String hotName,String genre, + String doctorName,String docPhone) throws Exception { + Map resultMap = new HashMap<>(); + + Map noteMap = new HashMap<>(); + noteMap.put("account",MsgCode.account); + noteMap.put("password", MsgCode.password); + + noteMap.put("msg",doctorName+"医生您好!"+hotName+"为患者"+patientName+"发起一例"+genre+"会诊申请,请协助安排专家上线会诊,谢谢!"); + noteMap.put("phone", docPhone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(noteMap)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!"0".equals(jsStr.getString("code"))) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + /** + * 远程会诊申请/管理医院(管理员) + * 由基层上转给管理医院/管理医院(管理员)/远程B超/远程心电/远程影像 + */ + @RequestMapping("/jyNote/sendConsultation") + public Map sendConsultation(String fid,String hotName,String patientName,String genre,String groupChamber){ + Map resultMap = new HashMap(); + if (fid != null) { + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation applyInformation=applyInformationService.selectOne(wrapper); + EntityWrapper wrapper1=new EntityWrapper(); + wrapper1.eq("hospital_id", fid).eq("se_name", groupChamber).eq("rid", 2); + User user = userService.selectOne(wrapper1); + if (user != null) { + Map map = new HashMap(); + String contactPhone = user.getContactPhone(); + String userName = user.getUserName(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + map.put("msg", userName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,请尽快安排专家进行会诊,谢谢!"); + map.put("phone",user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else { + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + map.put("msg", applyInformation.getChamberName()+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,请尽快安排专家进行会诊,谢谢!"); + map.put("phone",applyInformation.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url, JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + } + }else{ + resultMap.put("msg", "9"); + } + + return resultMap; + } + + /** + * 基层医院撤销远程会诊超声时发送的短信 + * @param patientName 患者姓名 + * @param hotName 医院名称 + * @param genre 会诊的名称 + * @param doctorName 医生姓名 + * @param docPhone 发送短信者号码 + * @return + * @throws Exception + */ + @RequestMapping("/GsNote/sendUndoGenre") + public Map sendUndoGenre(String patientName,String hotName,String genre, + String doctorName,String docPhone) throws Exception { + Map resultMap = new HashMap<>(); + + Map noteMap = new HashMap<>(); + noteMap.put("account",MsgCode.account); + noteMap.put("password", MsgCode.password); + + noteMap.put("msg",doctorName+"老师您好!"+hotName+"为"+patientName+"患者发起一例"+genre+"会诊申请,已撤销,谢谢! "); + noteMap.put("phone", docPhone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(noteMap)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!"0".equals(jsStr.getString("code"))) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteMsgController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteMsgController.java new file mode 100644 index 0000000..0bb6a35 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SendNoteMsgController.java @@ -0,0 +1,265 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.druid.support.json.JSONUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.UserService; +import com.imurs.util.MsgCode; +import com.imurs.util.note.ChuangLanSmsUtil; + +import net.sf.json.JSONObject; + +/** + * 双向转诊 + * @author D140 + * + */ +@RestController +@RequestMapping("jyNoteTest") +public class SendNoteMsgController { + + @Autowired + ApplyInformationService applyInformationService; + @Autowired + UserService userService; + + + /** + * 由下转上/提交转诊/管理员 + */ + @RequestMapping("/sendAdminCase") + public Map sendAdminCase(String patientName, String hotName,String applyDoc, + String ptPhone,Long fid) throws Exception { + Map resultMap = new HashMap(); + if(fid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + if(infor!=null){ + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",infor.getChamberName()+"老师,您好!"+hotName+"的"+applyDoc+"医生,向您发起了一例转诊申请,患者姓名:"+patientName+";患者联系电话:"+ptPhone+",请及时处理。"); + map.put("phone", infor.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + + /** + * 由下转上/转诊成功/基层医生 + */ + @RequestMapping("/sendDocCase") + public Map sendDocCase(String patientName,String docName,String hotName,String applyDoc, + String chamber,String time,Long applyUserId) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + if(applyUserId!=null){ + User user=userService.selectById(applyUserId); + if(user!=null){ + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",applyDoc+"医生,您好!您为"+patientName+"患者发起的转诊申请已经接收。接诊科室:"+chamber+";接诊医师:"+docName+",接诊时间:" + +time+",请通知患者携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由下转上/转诊成功/患者 + * docName:患者 + */ + @RequestMapping("/sendPtCase") + public Map sendPtCase(String ptName,String phone, String hotName,String applyDoc, + String chamber,String time,String hospitalName) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",ptName+",您好!"+hospitalName+"的"+applyDoc+"医生为您发起的转诊申请已经通过审核,接诊科室:"+chamber+";接诊时间:" + +time+",请携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 由下转上/转诊成功/专家 + */ + @RequestMapping("/sendSpeCase") + public Map sendSpeCase(String docName,String phone, String hotName, + String patientName,Long fid) throws Exception { + String applyDoc=""; + String applyDocPhone=""; + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + if(fid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", fid); + ApplyInformation infro=applyInformationService.selectOne(wrapper); + if(infro!=null){ + applyDoc=infro.getChamberName(); + applyDocPhone=infro.getChamberPhone(); + } + } + map.put("msg",docName+"医生,您好!"+hotName+"通过医务科转诊"+patientName+"患者,请贵科室接待首诊,谢谢!医务科"+applyDoc+",联系电话:"+applyDocPhone); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + + + /** + * 由上到下/转诊申请/基层医院 + * fid:管理医院id + * jid:基层医院id + */ + @RequestMapping("/sendHotNameCaseBelow") + public Map sendHotNameCaseBelow(String applyDoc,String hotName, + String chamber,String patientName,Long fid,Long jid) throws Exception { + Map resultMap = new HashMap(); + String adminDoc=""; + String adminDocPhone=""; + if(fid!=null && jid!=null){ + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", jid); + ApplyInformation infor=applyInformationService.selectOne(wrapper); + if(infor!=null){ + + EntityWrapper wrapper2=new EntityWrapper(); + wrapper2.eq("id", fid); + ApplyInformation infor2=applyInformationService.selectOne(wrapper2); + if(infor2!=null){ + adminDoc=infor2.getChamberName(); + adminDocPhone=infor2.getChamberPhone(); + } + + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",infor.getChamberName()+"医生,您好!"+hotName+""+chamber+"的"+applyDoc+"医生为"+patientName+"患者发起转诊,请您登录远程会诊平台接收!医务科"+adminDoc+",联系电话:"+adminDocPhone); + map.put("phone", infor.getChamberPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + } + + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由上到下/转诊成功/临床医生 + */ + @RequestMapping("/sendDocCaseBelow") + public Map sendDocCaseBelow(String hotName,String patientName,Long applyUserId) throws Exception { + Map resultMap = new HashMap(); + if(applyUserId!=null){ + User user=userService.selectById(applyUserId); + if(user!=null){ + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",user.getUserName()+"医生,您好!您为"+patientName+"患者发起的转诊,"+hotName+"已经接收,请提醒病人尽快去基层医院就诊,同时为病人开出院医嘱。谢谢!"); + map.put("phone", user.getContactPhone()); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + }else{ + resultMap.put("msg", "3"); + } + }else{ + resultMap.put("msg", "9"); + } + return resultMap; + } + + /** + * 由上到下/转诊成功/患者 + */ + @RequestMapping("/sendPtCaseBelow") + public Map sendPtCaseBelow(String docName,String phone,String hotName,String applyDoc, + String chamber,String patientName,String appHotName,String time) throws Exception { + Map resultMap = new HashMap(); + Map map = new HashMap(); + map.put("account",MsgCode.account); + map.put("password", MsgCode.password); + + map.put("msg",patientName+",您好!"+appHotName+""+chamber+"的"+applyDoc+"医生为您发起的转诊申请已经通过审核," + + "接收医院:"+hotName+";接诊医师:"+docName+",接诊时间:"+time+",请携带检查结果复印件、社保卡、本人身份证到"+hotName+"就诊。"); + map.put("phone", phone); + String res = ChuangLanSmsUtil.sendSmsByPost(MsgCode.url,JSONUtils.toJSONString(map)); + JSONObject jsStr = JSONObject.fromObject(res); + if (!jsStr.getString("code").equals("0")) { + resultMap.put("msg", "4"); + return resultMap; + } + resultMap.put("msg", "1"); + return resultMap; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SvsController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SvsController.java new file mode 100644 index 0000000..f3c4fdf --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SvsController.java @@ -0,0 +1,79 @@ +package com.imurs.controller; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping(value="SVS") +public class SvsController { + private static String isSucess = null; + @RequestMapping(value ="splitsvs") + public String splitsvs(String imgurl) throws InterruptedException { + Map map = new HashMap(); + + + //Get the result produced by executing the above commands + excuteAsync(imgurl); + return "ok"; + } + @Async + public String excuteAsync(String imgurl){ + // do something; + // final String isSucess=""; + Timer timer = new Timer();// 实例化Timer类 + timer.schedule(new TimerTask() { + public void run() { + //System.out.println("退出"); + try { + isSucess=parseSvs(imgurl); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.cancel(); + } + }, 1000);// 这里百毫秒 + return isSucess; + + } + public String parseSvs(String imgurl) throws InterruptedException{ + //String t = imgurl; + //System.out.println("dizi..."+imgurl); + String[] args1=new String[]{"python","/usr/svs/3.py",imgurl}; + //Create a Process instance and execute commands + Process pr; + try { + pr = Runtime.getRuntime().exec(args1); + BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); + String line = null; + String result = ""; + while ((line = in.readLine()) != null) + { + result += line + "\r\n"; + } + // System.out.println("什么结果"+result); + + in.close(); + int endFlag = pr.waitFor(); + if (endFlag == 0) + { + //System.out.println("The process is ended normally."); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ""; + + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SysMenuController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SysMenuController.java new file mode 100644 index 0000000..0c4c358 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/SysMenuController.java @@ -0,0 +1,149 @@ +package com.imurs.controller; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.SysMenu; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; +import com.imurs.service.SysMenuService; + +@RestController +@RequestMapping(value="menu") +public class SysMenuController { + + @Autowired + SysMenuService sysMenuService; + + + /** + * 查询当前登录的用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/userMenu") + public Map userMenu(String rpId,Long rid){ + Map map=new HashMap(); + String[] str=null; + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + try { + if(StringUtils.isNotEmpty(rpId)){ + str=rpId.split(","); + for (int i = 0; i < str.length; i++) { + if(str.length-i==1){ + wrapper.eq("id", str[i]).eq("rid", rid); + }else{ + wrapper.eq("id", str[i]).eq("rid", rid).or(); + } + } + smList=sysMenuService.selectList(wrapper); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).collect(Collectors.toList()); + Set set=new HashSet(tableNames); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : set) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + }else{ + map.put("msg", "3"); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "2"); + } + return map; + } + /** + * 查询rid用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/ridMenu") + public Map ridMenu(Long rid){ + Map map=new HashMap(); + + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + wrapper.eq("rid", rid).eq("menu_state",1); + + + + smList=sysMenuService.selectList(wrapper); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).collect(Collectors.toList()); + Set set=new HashSet(tableNames); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : set) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setId(s.getId()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + } + + + return map; + } + /** + * 修改用户所拥有的菜单权限 + * @return + */ + @RequestMapping(value="/updateMenu") + public Map updateMenu(Long rid,Integer menuState){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("id", rid); + SysMenu s= new SysMenu(); + s.setMenuState(menuState); + Boolean result=sysMenuService.update(s, wrapper); + map.put("msg", result ? "1" : "2"); + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Tessocr.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Tessocr.java new file mode 100644 index 0000000..cd1969c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/Tessocr.java @@ -0,0 +1,120 @@ +package com.imurs.controller; + +import java.awt.image.BufferedImage; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +import javax.imageio.ImageIO; + +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.imurs.ocr.AuthService; +import com.imurs.ocr.Base64Util; +import com.imurs.ocr.HttpUtil; + + +@RestController +@RequestMapping(value="tess") +public class Tessocr { + @RequestMapping(value ="splitocr") + public Map splitsvs(MultipartFile filelSavePath) throws InterruptedException, IOException { + InputStream is =filelSavePath.getInputStream(); + BufferedImage image=(BufferedImage)ImageIO.read(is); + BufferedImage newImg= image.getSubimage(0, 300, 97, 28);//大图坐标15, 600, 222, 50//小图坐标3, 279, 97, 47 + //转成字节流 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + try { + ImageIO.write(newImg, "jpg", out); + } catch (IOException e) { + //log.error(e.getMessage()); + } + byte[] simgdata= out.toByteArray(); + Map map= generalBasic(simgdata); + return map; + //Map map = new HashMap(); + //图片放大2倍后处理 + + +} + public static Map generalBasic(byte[] simgdata) { + // 请求url + Map map = new HashMap(); + // String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"; + String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting"; + try { + byte[] imgData = simgdata;//FileUtil.readFileByBytes(filePath); + String imgStr = Base64Util.encode(imgData); + String imgParam = URLEncoder.encode(imgStr, "UTF-8"); + // + String param = "image=" + imgParam+"&language_type=ENG"; + AuthService as = new AuthService();//V93fFRRnuNU1Ymr8Q0Fg3g8G Dvx22p8j3xAL95waXKfWOseLtpIu1EvZ + String accessToken = as.getAuth("SGzN5e2ZbGRMEaIhNe40sVxU","h4DsOUieXpKfvyXf6vWvRNx4qqWSX1Pl"); + String result = HttpUtil.post(url, accessToken, param); + //System.out.println(result); + //result json数组取出c/a + JSONObject jsonObject = JSON.parseObject(result); + //System.out.println("2"+jsonObject.toString()); + if(jsonObject.get("error_code") != null){ + return (Map) map.put("errorCode", "0"); + } + JSONArray jsonArray = jsonObject.getJSONArray("words_result"); + //System.out.println("识别结果"+jsonArray);//错误识别 + int size = jsonArray.size(); + String jsonObject3 = null; + /* for(int i=0;i selectTotalInformationAll(TotalInformation totalInformation,ApplyInformation apyInformation) { + Map map = new HashMap(); + Map map1 = new HashMap(); + Map map2 = new HashMap(); + Map map3 = new HashMap(); + Map map4 = new HashMap(); + + + DoctorArrange doctorArrangeTotaNumDay =new DoctorArrange(); + TotalInformation totInformation=new TotalInformation(); + TotalTraining totalTraining=new TotalTraining(); + TotalInformation informationTotal=new TotalInformation(); + List doctorArrangeList =new ArrayList(); + List doctorArrangeListNumber=new ArrayList(); + List totalInformationList=new ArrayList(); + + Set numbers = new HashSet<>(); + + int inspect = 0; + int newprojectNum = 0; + int adp=0; + int totalTopicNum=0; + int conNumber = 0; + boolean flag; + String workType; + String[] str; + try { + /** + * 查找所有通过审核的医院 + */ + map1.put("state","1"); + map1.put("rid",totalInformation.getType()); + List applyInformationlList = applyInformationService.selectByMap(map1); + map1.clear(); + + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + map1.put("status", "Y"); + map1.put("receive_hospital_id",applyInformation.getId()); + //wrapperB.eq("type", totalInformation.getType()); + doctorArrangeList = doctorArrangeService.selectByMap(map1); + map1.clear(); + + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + workType = doctorArrange.getDevelopWork(); + str = workType.split("、"); + flag= Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + workType = doctorArrange.getArrangeChamber(); + str = workType.split("、"); + for(int i = 0;i wrapperC = new EntityWrapper(); + wrapperC.eq("hospital_id", applyInformation.getId()); + adp = applyDoctorPromoteService.selectCount(wrapperC); //进修人数 + + //map1.put("type", totalInformation.getType()); + map1.put("basicsHospitalId", applyInformation.getId()); + doctorArrangeTotaNumDay = doctorArrangeService.selectTotanumberDay(map1);//总人数 总服务天数 + map1.clear(); + + + map2.put("hospitalId", applyInformation.getId()); + totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + map2.clear(); + //if(!StringUtils.isEmpty(applyInformation.getId())){ + // wrapperA.eq("id", apyInformation.getId()); + //} + //ApplyInformation applyInformationl1 = applyInformationService.selectOne(wrapperA);//根据Id查找医院 + + EntityWrapper wrappeOne = new EntityWrapper(); + wrappeOne.eq("hospital_id", applyInformation.getId()); + totInformation = totalInformationService.selectOne(wrappeOne);//查询本条数据 + if(inspect>0){ + totInformation.setMedicalNumber(Long.valueOf(inspect));//医疗质量控制检查 + }else{ + totInformation.setMedicalNumber(0l);//医疗质量控制检查 + } + + numbers = new HashSet<>(listChamber); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + //合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null){ + if(2==applyInformation.getCoOp()){ + totInformation.setCoLoose(1);//合作模式 1:相对松散型 + totInformation.setCoTension(0); + }else if(1==applyInformation.getCoOp()){ + totInformation.setCoTension(1);//合作模式 1:相对紧密型 + totInformation.setCoLoose(0); + } + } + //帮扶协议 1:是 2:否 + if(applyInformation.getHelpProtocol()!=null){ + if(2==applyInformation.getHelpProtocol()){ + totInformation.setHelpProtocol(0);//totInformation表 帮扶协议 1:是0:否 + totInformation.setCoTension(0); + }else if(1==applyInformation.getHelpProtocol()){ + totInformation.setHelpProtocol(1);//totInformation表 帮扶协议 1:是0:否 + } + } + totInformation.setUpArrangeNumber(adp==0?0:Long.valueOf(adp));//进修培训安排人数 + totInformation.setCooperationTime(applyInformation.getSetupTime());//签约时间 + if(doctorArrangeTotaNumDay!=null){ + if(doctorArrangeTotaNumDay.getDocId()!=null){ + totInformation.setBelowArrangeNumber(doctorArrangeTotaNumDay.getDocId());//排班下派总人数 + }else{ + totInformation.setBelowArrangeNumber(0L); + } + if(doctorArrangeTotaNumDay.getDay()!=null){ + totInformation.setServeDay(Long.valueOf(doctorArrangeTotaNumDay.getDay()));//总服务天数 + }else{ + totInformation.setServeDay(0L); + } + } + if(totalTraining!=null){ + totInformation.setSubjectNumber(totalTraining.getTrainingId()); + if(totalTraining.getNumber()!=null){ + totInformation.setTrainingNumber(Long.valueOf(totalTraining.getNumber()));//培训人次 + }else{ + totInformation.setTrainingNumber(0L); + } + + } + + +// EntityWrapper wrapperApplyCaseA = new EntityWrapper(); +// EntityWrapper wrapperApplyCaseB = new EntityWrapper(); +// wrapperApplyCaseA.eq("hospital_id", applyInformation.getId()); +// wrapperApplyCaseA.in("statu", "4,5,6"); +// +// wrapperApplyCaseB.eq("plan_hospital_id", applyInformation.getId()); +// wrapperApplyCaseB.in("statu", "4,5,6"); +// wrapperApplyCaseB.eq("type", "B"); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + + EntityWrapper applyConsultation = new EntityWrapper(); + applyConsultation.eq("category_hospital_id", applyInformation.getId()); + applyConsultation.eq("status", "3"); + conNumber = applyConsultationService.selectCount(applyConsultation); + + totInformation.setConsulNumber(Long.valueOf(conNumber));//开展远程诊疗人次 + totInformation.setHospitalName(applyInformation.getHospitalName()); + totInformation.setType(applyInformation.getRid().intValue()); + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + workType = applyInformation.getCoOpExplain(); + str = workType.split(","); + for(int i = 0;i wrapperHospitalId = new EntityWrapper(); +// wrapperHospitalId.eq("hospital_id", applyInformation.getId()); + totalInformationService.update(totInformation, wrappeOne); + } + + + + map3.put("type", totalInformation.getType()); + doctorArrangeListNumber = doctorArrangeService.selectTotaDay(map3); + map.put("doctorNumber",doctorArrangeListNumber.size());//派驻医疗人员 + + totalTopicNum = trainingService.selectCount(null); + map.put("totalTopicNum", totalTopicNum);//总课题数 + + map1.put("type", totalInformation.getType());//所有医院 + totalInformationList = totalInformationService.selectByMap(map1); + map1.clear(); + map.put("totalInformationList", totalInformationList); + + + map4.put("type", totalInformation.getType()); + if(totalInformation.getType()!=null){ + informationTotal = totalInformationService.totaTotalInformation(map4); + map.put("informationTotal", informationTotal); + } + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 基层医院 合作类型汇总表 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "selectBasicTotalInformation") + public Map selectBasicTotalInformation(TotalInformation totalInformation) { + Map map = new HashMap(); + Map map1 = new HashMap(); + + EntityWrapper wrapperC = new EntityWrapper(); + EntityWrapper wrapper1 = new EntityWrapper(); + EntityWrapper wrapper = new EntityWrapper(); + + List listChamber = new ArrayList(); + + boolean flag; + String workType; + String[] str; + try { + wrapper1.eq("id", totalInformation.getHospitalId()); + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper1); + + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + map1.put("status", "Y"); + map1.put("receive_hospital_id", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectByMap(map1); + map1.clear(); + + int inspect = 0; + int newprojectNum = 0; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + workType = doctorArrange.getDevelopWork(); + str= workType.split("、"); + flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + workType = doctorArrange.getArrangeChamber(); + str = workType.split("、"); + for(int i = 0;i0){ + totInformation.setMedicalNumber(Long.valueOf(inspect));//医疗质量控制检查 + } + Set numbers = new HashSet<>(listChamber); + if(numbers.size()>0){ + totInformation.setJuniorNumber(Long.valueOf(numbers.size()));//支持专科建设 + } + if(newprojectNum>0){ + totInformation.setTechniqueNumber(Long.valueOf(newprojectNum));//新技术新项目推广应用 + } + //合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null){ + if(2==applyInformation.getCoOp()){ + totInformation.setCoLoose(1);//合作模式 1:相对松散型 + totInformation.setCoTension(0); + }else if(1==applyInformation.getCoOp()){ + totInformation.setCoTension(1);//合作模式 1:相对紧密型 + totInformation.setCoLoose(0); + } + } + totInformation.setHelpProtocol(applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + totInformation.setUpArrangeNumber(Long.valueOf(adp));//进修培训安排人数 + totInformation.setCooperationTime(applyInformation.getSetupTime());//签约时间 + if(doctorArrangeTotaNumDay!=null){ + if(doctorArrangeTotaNumDay.getDocId()!=null){ + totInformation.setBelowArrangeNumber(doctorArrangeTotaNumDay.getDocId());//排班下派总人数 + }else{ + totInformation.setBelowArrangeNumber(0L); + } + if(doctorArrangeTotaNumDay.getDay()!=null){ + totInformation.setServeDay(Long.valueOf(doctorArrangeTotaNumDay.getDay()));//总服务天数 + }else{ + totInformation.setServeDay(0L); + } + } + if(totalTraining!=null){ + totInformation.setSubjectNumber(totalTraining.getTrainingId()); + if(totalTraining.getNumber()!=null){ + totInformation.setTrainingNumber(Long.valueOf(totalTraining.getNumber()));//培训人次 + }else{ + totInformation.setTrainingNumber(0L); + } + + } + int csUp = 0,csDo = 0,conNumber = 0; + EntityWrapper wrapperApplyCaseA = new EntityWrapper(); + EntityWrapper wrapperApplyCaseB = new EntityWrapper(); + wrapperApplyCaseA.eq("hospital_id", applyInformation.getId()); + wrapperApplyCaseA.in("statu", "4,5,6"); + wrapperApplyCaseB.eq("plan_hospital_id", applyInformation.getId()); + wrapperApplyCaseB.in("statu", "4,5,6"); + wrapperApplyCaseB.eq("type", "B"); + csUp = applyCaseService.selectCount(wrapperApplyCaseA); + csDo = applyCaseService.selectCount(wrapperApplyCaseB); + if(csDo>0){ + totInformation.setCaseDownNumber(Long.valueOf(csDo));//双向转诊向上人次 + } + if(csUp>0){ + totInformation.setCaseUpwardNumber(Long.valueOf(csUp));//双向转诊向下人次 + } + + + EntityWrapper applyConsultation = new EntityWrapper(); + applyConsultation.eq("category_hospital_id", applyInformation.getId()); + applyConsultation.eq("status", "3"); + conNumber = applyConsultationService.selectCount(applyConsultation); + totInformation.setConsulNumber(Long.valueOf(conNumber));//开展远程诊疗人次 + + totInformation.setHospitalName(applyInformation.getHospitalName()); + totInformation.setType(applyInformation.getRid().intValue()); + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + workType = applyInformation.getCoOpExplain(); + str = workType.split(","); + for(int i = 0;i wrapperHospitalId = new EntityWrapper(); + wrapperHospitalId.eq("hospital_id", applyInformation.getId());*/ + totalInformationService.updateById(totInformation); + + + /*Map map3 = new HashMap(); + map3.put("type", totalInformation.getType()); + List doctorArrangeListNumber = doctorArrangeService.selectTotaDay(map); + map.put("doctorNumber",doctorArrangeListNumber.size());//派驻医疗人员 + + int totalTopicNum = trainingService.selectCount(null); + map.put("totalTopicNum", totalTopicNum);//总课题数 + + wrapper.eq("type", totalInformation.getType());//所有医院 + List totalInformationList = totalInformationService.selectList(wrapper); + map.put("totalInformationList", totalInformationList); +*/ + //TotalInformation informationTotal = totalInformationService.selectOne(wrapper); + map.put("informationTotal", totInformation); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 查询市直医院医联体建设情况汇总表 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "selectSumMedicalAssociation", method = RequestMethod.POST) + @ResponseBody public Map selectSumMedicalAssociation(@RequestParam Map params)throws Exception { + Map map = new HashMap(); + + /** + * + */ + + String startTime =params.get("startTime"); + String endTime =params.get("endTime"); + String hospitalName =params.get("hospitalName"); + String rid = params.get("type"); + Map doctorArrangmap = new HashMap(); + //doctorArrangmap.put("type", '3');//医连体类型 + doctorArrangmap.put("start_time", startTime); + doctorArrangmap.put("end_time", endTime); + int totalDoctorNumber = doctorArrangeService.selectdoctorTotaDay(doctorArrangmap);//派驻医疗人员总数// + //TrainingWrapper.eq("create_time", applyInformation.getId()); + Map totalTopicNumMap = new HashMap(); + totalTopicNumMap.put("start_time", startTime); + totalTopicNumMap.put("end_time", endTime); + //int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);// + int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);//直接从Total_train 查train id + //map.put("totalTopicNum", totalTopicNum);//总课题数 + //通过医院名字找到医院ID + Map InfromationMap = new HashMap(); + InfromationMap.put("rid", rid); + //InfromationMap.put("start", 1);//分页 + //InfromationMap.put("end", 5); + if(StringUtils.isNotEmpty(hospitalName)){ + //applyInformatioWrapper.eq("hospital_name", hospitalName); + InfromationMap.put("hospital_name", hospitalName); + } + + List applyInformationlList = applyInformationService.selectInfromationList(InfromationMap); + List> list2=new ArrayList>(); + + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + List listTechnique = new ArrayList(); + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + //时间判断, + Map doctorArrang = new HashMap(); + doctorArrang.put("start_time", startTime); + doctorArrang.put("end_time", endTime); + doctorArrang.put("hosptialId", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectDoctorArrangeList(doctorArrang); + int inspect = 0; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + String workType = doctorArrange.getDevelopWork(); + String str[] = workType.split("、"); + boolean flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + String arrnge = doctorArrange.getArrangeChamber(); + String str3[] = arrnge.split("、"); + for(int i = 0;i refresherNumerMap = new HashMap(); + refresherNumerMap.put("start_time", startTime); + refresherNumerMap.put("end_time", endTime); + refresherNumerMap.put("hosptialId", applyInformation.getId()); + //refresherNumerMap.put("type", applyInformation.);进修学习类型 + int adp = applyDoctorPromoteService.selectrefresherCount(refresherNumerMap); //进修人数 + Map map1 = new HashMap(); + //map1.put("type", totalInformation.getType()); + map1.put("receive_hospital_id", applyInformation.getId()); + map1.put("start_time", startTime); + map1.put("end_time", endTime); + //单家派驻医疗人数数 服务天数 ?? 真是奇怪?非得将医院ID + Map doctorArrangemap = doctorArrangeService.selectAccreditedMedicalNumber(map1); + //测试 + //System.out.println("查询到的数据"+maptest); + //System.out.println("单家派驻医疗人数"+doctorArrangeTotaNumDay.toString()); + //专题讲座人/次 课题数 + Map map2 = new HashMap(); + map2.put("hospital_id", applyInformation.getId()); + map2.put("start_time", startTime); + map2.put("end_time", endTime); + //TotalTraining totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + Map totalTraining = totalTrainingService.selectLectureTrainingAndNember(map2); + //双向转诊上转人次,下转人次 + Map UpWayReferralMap = new HashMap(); + UpWayReferralMap.put("hospital_id", applyInformation.getId()); + UpWayReferralMap.put("start_time", startTime);// + UpWayReferralMap.put("end_time", endTime); + int UpWayReferral = applyCaseService.selectUpWayReferralNumer(UpWayReferralMap); + Map DownWayReferralMap = new HashMap(); + DownWayReferralMap.put("plan_hospital_id", applyInformation.getId()); + DownWayReferralMap.put("start_time", startTime);//向下转诊 + DownWayReferralMap.put("end_time", endTime); + int DownWayReferral = applyCaseService.selectDownWayReferralNumer(DownWayReferralMap); + //开展远程诊疗 + Map ConsultationMap = new HashMap(); + ConsultationMap.put("category_hospital_id", applyInformation.getId()); + ConsultationMap.put("start_time", startTime);//远程会诊 + ConsultationMap.put("end_time", endTime); + int ConsultationSingleMap = applyConsultationService.selectConsultationNumer(ConsultationMap); + Map resultmap = new HashMap(); + //TotalInformation totInformation = new TotalInformation(); + resultmap.put("hospitalName", applyInformation.getHospitalName());//医院名字 + resultmap.put("medicalNumber", inspect);//医疗质量控制检查 + //totInformation.setMedicalNumber(Long.valueOf(inspect)); + Set numbers = new HashSet<>(listChamber);// + resultmap.put("juniorNumber", numbers.size());////支持专科建设 + //totInformation.setJuniorNumber(Long.valueOf(numbers.size())); + Set Techniquenumbers = new HashSet<>(listTechnique);// + resultmap.put("techniqueNumber", Techniquenumbers.size());//新技术新项目推广应用修改为不重复 + //totInformation.setTechniqueNumber(Long.valueOf(newprojectNum)); + //resultmap.put("coOp", applyInformation.getCoOp()==null?0:applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + + //totInformation.setCoOp(applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(2)){ + resultmap.put("coLoose", "1"); + } + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(1)){ + resultmap.put("coTension", "1"); + } + + resultmap.put("helpProtocol", applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + //totInformation.setHelpProtocol(applyInformation.getHelpProtocol());// + resultmap.put("upArrangeNumber", adp);//进修培训安排人数 + //totInformation.setUpArrangeNumber(Long.valueOf(adp));// + Date data= applyInformation.getSetupTime(); + String SetupTime=new SimpleDateFormat("yyyy-MM-dd").format(data); + resultmap.put("cooperationTime", SetupTime);//签约时间 + + + //totInformation.setCooperationTime(); + //Object talId = doctorArrangemap.get("talId"); + //Object tatolDay= doctorArrangemap.get("tatolDay"); + //Long id =Long.parseLong(talId); + resultmap.put("belowArrangeNumber", doctorArrangemap.get("talId")==null?0:doctorArrangemap.get("talId"));//单家排班下派总人数 talId + resultmap.put("serveDay", doctorArrangemap.get("tatolDay")==null?0:((doctorArrangemap.get("tatolDay"))));//单家医院总服务天数 tatolDay + //totInformation.setBelowArrangeNumber(Long.valueOf(String.valueOf(talId)));// + //totInformation.setServeDay(Long.valueOf(String.valueOf(((Double)tatolDay).intValue())));//单家医院总服务天数 tatolDay + //totalTraining.get("number");// + resultmap.put("subjectNumber", totalTraining.get("training_id")==null?0:totalTraining.get("training_id"));////课题数 + //totInformation.setSubjectNumber(Long.valueOf(String.valueOf(totalTraining.get("number"))));// + //totInformation.setTrainingNumber(Long.valueOf(totalTraining.get("number")));//。。。 + resultmap.put("trainingNumber",totalTraining.get("number")==null?0:totalTraining.get("number") );//专题讲座培训人/次 + resultmap.put("coCounty", "0"); + resultmap.put("coUniorCoalition", "0");//专科联盟默认为 非jiacaseUpwardNumber + resultmap.put("coTeleMedicine", "0");//远程医疗协作 + resultmap.put("caseUpwardNumber", UpWayReferral);//向上转诊人数 + resultmap.put("caseDownNumber", DownWayReferral);//向下转诊人数 + resultmap.put("consulNumber", ConsultationSingleMap);//远程诊疗人数 + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + String arrnge = applyInformation.getCoOpExplain(); + String str3[] = arrnge.split(","); + for(int i = 0;i totalInformationList + list2.add(resultmap); + }//for 循环结束 + //汇总所有参数 + Map totalmap = new HashMap(); + int coTension=0; + int coLoose=0; + int coCounty=0; + int coUniorCoalition=0; + int coTeleMedicine=0; + int helpProtocol=0; + //int belowArrangeNumber =0;//派驻医疗人员人数从总的获取 + int serveDay = 0;//派驻服务天数 + int upArrangeNumber =0; + //int totalSubjectNumber =0;//课题数从总的获取 + int trainingNumber=0; + int medicalNumber =0; + int juniorNumber=0; + int techniqueNumber=0;//caseDownNumber + int caseDownNumber=0; + int consulNumber=0; + int caseUpwardNumber=0; + for(int i =0;i tmap= list2.get(i); + + coTension+=Integer.parseInt(tmap.get("coTension")==null?"0":(String) tmap.get("coTension")); + coLoose+=Integer.parseInt(tmap.get("coLoose")==null?"0":(String) tmap.get("coLoose") ); + coCounty+=Integer.parseInt( tmap.get("coCounty")==null?"0":(String) tmap.get("coCounty")); + coUniorCoalition+=Integer.parseInt((String) tmap.get("coUniorCoalition")==null?"0":(String) tmap.get("coUniorCoalition")); + coTeleMedicine+=Integer.parseInt((String) tmap.get("coTeleMedicine")==null?"0":(String) tmap.get("coTeleMedicine")); + helpProtocol+= tmap.get("helpProtocol")==null?0:(int)tmap.get("helpProtocol");// + serveDay+=Integer.parseInt(tmap.get("serveDay").toString()); + upArrangeNumber+=(int)tmap.get("upArrangeNumber"); + trainingNumber+= Integer.parseInt(tmap.get("trainingNumber").toString());//((Long)tmap.get("TrainingNumber")).intValue(); + medicalNumber+= (int)tmap.get("medicalNumber"); + juniorNumber+=(int) tmap.get("juniorNumber"); + techniqueNumber+= (int)tmap.get("techniqueNumber"); + caseUpwardNumber+=(int)tmap.get("caseUpwardNumber"); + caseDownNumber+=(int)tmap.get("caseDownNumber"); + consulNumber+=(int)tmap.get("consulNumber"); + } + totalmap.put("coTension", coTension);//紧密型 + totalmap.put("coLoose", coLoose);//松散 + totalmap.put("coCounty", coCounty);//县域医共体 + totalmap.put("coUniorCoalition", coUniorCoalition);//专科联盟 + totalmap.put("coTeleMedicine", coTeleMedicine);//远程医疗协作 + totalmap.put("helpProtocol", helpProtocol);//帮扶协议 + totalmap.put("belowArrangeNumber", totalDoctorNumber);//派驻医疗人员人数 + totalmap.put("serveDay",serveDay);//派驻服务天数 + totalmap.put("upArrangeNumber",upArrangeNumber);//进修安排人数 + totalmap.put("subjectNumber",totalTopicNum);//课题数 + totalmap.put("trainingNumber",trainingNumber);//培训人/次 + totalmap.put("medicalNumber",medicalNumber);//医疗质量控制检查(次数) + totalmap.put("juniorNumber",juniorNumber);//支持专科建设(个数) + totalmap.put("techniqueNumber",techniqueNumber);//新技术新项目推广应用(项数) + totalmap.put("caseUpwardNumber",caseUpwardNumber);//向上转诊) + totalmap.put("caseDownNumber",caseDownNumber);//向下转诊) + totalmap.put("consulNumber",consulNumber);//远程会诊 + map.put("data", list2); + map.put("totalMap", totalmap); + // System.out.println("map"+map); + //System.out.println("totalMap"+totalmap); + return map; + } + /** + * 市直医院医联体建设情况汇总表导出 + * @param totalInformation + * @param apyInformation + * @return + */ + @RequestMapping(value = "downSumMedicalAssociation", method = RequestMethod.GET) + @ResponseBody public Map dowmSumMedicalAssociation(@RequestParam Map params,HttpServletResponse response)throws Exception { + Map map = new HashMap(); + + /** + * + */ + + String startTime =params.get("startTime"); + String endTime =params.get("endTime"); + String hospitalName =params.get("hospitalName"); + String rid = params.get("type"); + Map doctorArrangmap = new HashMap(); + //doctorArrangmap.put("type", '3');//医连体类型 + doctorArrangmap.put("start_time", startTime); + doctorArrangmap.put("end_time", endTime); + int totalDoctorNumber = doctorArrangeService.selectdoctorTotaDay(doctorArrangmap);//派驻医疗人员总数// + //TrainingWrapper.eq("create_time", applyInformation.getId()); + Map totalTopicNumMap = new HashMap(); + totalTopicNumMap.put("start_time", startTime); + totalTopicNumMap.put("end_time", endTime); + //int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);// + int totalTopicNum = trainingService.selectTotalTopicNumber(totalTopicNumMap);//直接从Total_train 查train id + //map.put("totalTopicNum", totalTopicNum);//总课题数 + //通过医院名字找到医院ID + Map InfromationMap = new HashMap(); + InfromationMap.put("rid", rid); + //InfromationMap.put("start", 1);//分页 + //InfromationMap.put("end", 5); + if(StringUtils.isNotEmpty(hospitalName)){ + //applyInformatioWrapper.eq("hospital_name", hospitalName); + InfromationMap.put("hospital_name", hospitalName); + } + + List applyInformationlList = applyInformationService.selectInfromationList(InfromationMap); + List> list2=new ArrayList>(); + for(ApplyInformation applyInformation: applyInformationlList){ + List listChamber = new ArrayList(); + List listTechnique = new ArrayList(); + /** + * 医疗质量控制检查、支持专科建设、新技术新项目推广应用 + */ + //时间判断, + Map doctorArrang = new HashMap(); + doctorArrang.put("start_time", startTime); + doctorArrang.put("end_time", endTime); + doctorArrang.put("hosptialId", applyInformation.getId()); + List doctorArrangeList = doctorArrangeService.selectDoctorArrangeList(doctorArrang); + int inspect = 0; + String newtechnoly[]=null; + for(DoctorArrange doctorArrange :doctorArrangeList){ + if(!StringUtils.isEmpty(doctorArrange.getDevelopWork())){ + String workType = doctorArrange.getDevelopWork(); + String str[] = workType.split("、"); + boolean flag = Arrays.asList(str).contains("医疗质量控制检查"); + if(flag){ + inspect ++; + } + } + if(!StringUtils.isEmpty(doctorArrange.getArrangeChamber())){ + String arrnge = doctorArrange.getArrangeChamber(); + String str3[] = arrnge.split("、"); + for(int i = 0;i refresherNumerMap = new HashMap(); + refresherNumerMap.put("start_time", startTime); + refresherNumerMap.put("end_time", endTime); + refresherNumerMap.put("hosptialId", applyInformation.getId()); + //refresherNumerMap.put("type", applyInformation.);进修学习类型 + int adp = applyDoctorPromoteService.selectrefresherCount(refresherNumerMap); //进修人数 + Map map1 = new HashMap(); + //map1.put("type", totalInformation.getType()); + map1.put("receive_hospital_id", applyInformation.getId()); + map1.put("start_time", startTime); + map1.put("end_time", endTime); + //单家派驻医疗人数数 服务天数 ?? 真是奇怪?非得将医院ID + Map doctorArrangemap = doctorArrangeService.selectAccreditedMedicalNumber(map1); + //测试 + //System.out.println("查询到的数据"+maptest); + //System.out.println("单家派驻医疗人数"+doctorArrangeTotaNumDay.toString()); + //专题讲座培训人/次 课题数 + Map map2 = new HashMap(); + map2.put("hospital_id", applyInformation.getId()); + map2.put("start_time", startTime); + map2.put("end_time", endTime); + //TotalTraining totalTraining = totalTrainingService.selectTotanNumberTraining(map2);//课题数 培训人/次 + Map totalTraining = totalTrainingService.selectLectureTrainingAndNember(map2); + //双向转诊上转人次,下转人次 + Map UpWayReferralMap = new HashMap(); + UpWayReferralMap.put("hospital_id", applyInformation.getId()); + UpWayReferralMap.put("start_time", startTime);// + UpWayReferralMap.put("end_time", endTime); + int UpWayReferral = applyCaseService.selectUpWayReferralNumer(UpWayReferralMap); + Map DownWayReferralMap = new HashMap(); + DownWayReferralMap.put("plan_hospital_id", applyInformation.getId()); + DownWayReferralMap.put("start_time", startTime);//向下转诊 + DownWayReferralMap.put("end_time", endTime); + int DownWayReferral = applyCaseService.selectDownWayReferralNumer(DownWayReferralMap); + //开展远程诊疗 + Map ConsultationMap = new HashMap(); + ConsultationMap.put("category_hospital_id", applyInformation.getId()); + ConsultationMap.put("start_time", startTime);//远程会诊 + ConsultationMap.put("end_time", endTime); + int ConsultationSingleMap = applyConsultationService.selectConsultationNumer(ConsultationMap); + Map resultmap = new HashMap(); + //TotalInformation totInformation = new TotalInformation(); + resultmap.put("hospitalName", applyInformation.getHospitalName());//医院名字 + resultmap.put("medicalNumber", inspect);//医疗质量控制检查 + //totInformation.setMedicalNumber(Long.valueOf(inspect)); + Set numbers = new HashSet<>(listChamber);// + resultmap.put("juniorNumber", numbers.size());////支持专科建设 + //totInformation.setJuniorNumber(Long.valueOf(numbers.size())); + Set listTechniquenum = new HashSet<>(listTechnique);// + resultmap.put("techniqueNumber", listTechniquenum);//新技术新项目推广应用,改成中文数组 + resultmap.put("newtechniqueNumber", listTechniquenum.size());//新技术新项目推广应用,原始数字不变 + //totInformation.setTechniqueNumber(Long.valueOf(newprojectNum)); + //resultmap.put("coOp", applyInformation.getCoOp()==null?0:applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + + //totInformation.setCoOp(applyInformation.getCoOp());//合作模式 1:相对紧密型 2:相对松散型 + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(2)){ + resultmap.put("coLoose", "1"); + } + if(applyInformation.getCoOp()!=null&&applyInformation.getCoOp().equals(1)){ + resultmap.put("coTension", "1"); + } + + resultmap.put("helpProtocol", applyInformation.getHelpProtocol()==null?0:applyInformation.getHelpProtocol());//帮扶协议 1:是 0:否 + //totInformation.setHelpProtocol(applyInformation.getHelpProtocol());// + resultmap.put("upArrangeNumber", adp);//进修培训安排人数 + //totInformation.setUpArrangeNumber(Long.valueOf(adp));// + Date data= applyInformation.getSetupTime(); + String SetupTime=new SimpleDateFormat("yyyy-MM-dd").format(data); + resultmap.put("cooperationTime", SetupTime);//签约时间 + + + //totInformation.setCooperationTime(); + //Object talId = doctorArrangemap.get("talId"); + //Object tatolDay= doctorArrangemap.get("tatolDay"); + //Long id =Long.parseLong(talId); + resultmap.put("belowArrangeNumber", doctorArrangemap.get("talId")==null?0:doctorArrangemap.get("talId"));//单家排班下派总人数 talId + resultmap.put("serveDay", doctorArrangemap.get("tatolDay")==null?0:((doctorArrangemap.get("tatolDay"))));//单家医院总服务天数 tatolDay + //totInformation.setBelowArrangeNumber(Long.valueOf(String.valueOf(talId)));// + //totInformation.setServeDay(Long.valueOf(String.valueOf(((Double)tatolDay).intValue())));//单家医院总服务天数 tatolDay + //totalTraining.get("number");// + resultmap.put("subjectNumber", totalTraining.get("training_id")==null?0:totalTraining.get("training_id"));////课题数 + //totInformation.setSubjectNumber(Long.valueOf(String.valueOf(totalTraining.get("number"))));// + //totInformation.setTrainingNumber(Long.valueOf(totalTraining.get("number")));//。。。 + resultmap.put("trainingNumber",totalTraining.get("number")==null?0:totalTraining.get("number") );//专题讲座培训人/次 + resultmap.put("coCounty", "0"); + resultmap.put("coUniorCoalition", "0");//专科联盟默认为 非jiacaseUpwardNumber + resultmap.put("coTeleMedicine", "0");//远程医疗协作 + resultmap.put("caseUpwardNumber", UpWayReferral);//向上转诊人数 + resultmap.put("caseDownNumber", DownWayReferral);//向下转诊人数 + resultmap.put("consulNumber", ConsultationSingleMap);//远程诊疗人数 + if(!StringUtils.isEmpty(applyInformation.getCoOpExplain())){ + String arrnge = applyInformation.getCoOpExplain(); + String str3[] = arrnge.split(","); + for(int i = 0;i totalInformationList + list2.add(resultmap); + }//for 循环结束 + //汇总所有参数 + Map totalmap = new HashMap(); + int coTension=0; + int coLoose=0; + int coCounty=0; + int coUniorCoalition=0; + int coTeleMedicine=0; + int helpProtocol=0; + //int belowArrangeNumber =0;//派驻医疗人员人数从总的获取 + int serveDay = 0;//派驻服务天数 + int upArrangeNumber =0; + //int totalSubjectNumber =0;//课题数从总的获取 + int trainingNumber=0; + int medicalNumber =0; + int juniorNumber=0; + int caseDownNumber=0; + int consulNumber=0; + int caseUpwardNumber=0; + int newtechniqueNumber=0; + for(int i =0;i tmap= list2.get(i); + + coTension+=Integer.parseInt(tmap.get("coTension")==null?"0":(String) tmap.get("coTension")); + coLoose+=Integer.parseInt(tmap.get("coLoose")==null?"0":(String) tmap.get("coLoose") ); + coCounty+=Integer.parseInt( tmap.get("coCounty")==null?"0":(String) tmap.get("coCounty")); + coUniorCoalition+=Integer.parseInt((String) tmap.get("coUniorCoalition")==null?"0":(String) tmap.get("coUniorCoalition")); + coTeleMedicine+=Integer.parseInt((String) tmap.get("coTeleMedicine")==null?"0":(String) tmap.get("coTeleMedicine")); + helpProtocol+= tmap.get("helpProtocol")==null?0:(int)tmap.get("helpProtocol");// + serveDay+=Integer.parseInt(tmap.get("serveDay").toString()); + upArrangeNumber+=(int)tmap.get("upArrangeNumber"); + trainingNumber+= Integer.parseInt(tmap.get("trainingNumber").toString());//((Long)tmap.get("TrainingNumber")).intValue(); + medicalNumber+= (int)tmap.get("medicalNumber"); + juniorNumber+=(int) tmap.get("juniorNumber"); + //techniqueNumber.append(tmap.get("techniqueNumber")==null?"":tmap.get("techniqueNumber")); + newtechniqueNumber+=(int)tmap.get("newtechniqueNumber");//新技术新项目的数字显示 + //listTechnique.add(e); + // Set numbers = new HashSet<>(listTechnique);// + /*if(!tmap.get("techniqueNumber").toString().isEmpty()){ + int ch = tmap.get("techniqueNumber").toString().lastIndexOf("]"); + TotalTechnique.add(tmap.get("techniqueNumber").toString().substring(1, ch)); + }*/ + caseUpwardNumber+=(int)tmap.get("caseUpwardNumber"); + caseDownNumber+=(int)tmap.get("caseDownNumber"); + consulNumber+=(int)tmap.get("consulNumber"); + } + totalmap.put("coTension", coTension);//紧密型 + totalmap.put("coLoose", coLoose);//松散 + totalmap.put("coCounty", coCounty);//县域医共体 + totalmap.put("coUniorCoalition", coUniorCoalition);//专科联盟 + totalmap.put("coTeleMedicine", coTeleMedicine);//远程医疗协作 + totalmap.put("helpProtocol", helpProtocol);//帮扶协议 + totalmap.put("belowArrangeNumber", totalDoctorNumber);//派驻医疗人员人数 + totalmap.put("serveDay",serveDay);//派驻服务天数 + totalmap.put("upArrangeNumber",upArrangeNumber);//进修安排人数 + totalmap.put("subjectNumber",totalTopicNum);//课题数 + totalmap.put("trainingNumber",trainingNumber);//培训人/次 + totalmap.put("medicalNumber",medicalNumber);//医疗质量控制检查(次数) + totalmap.put("juniorNumber",juniorNumber);//支持专科建设(个数) + // totalmap.put("techniqueNumber",newtechniqueNumber);//新技术新项目推广应用(项数) + totalmap.put("caseUpwardNumber",caseUpwardNumber);//向上转诊) + totalmap.put("caseDownNumber",caseDownNumber);//向下转诊) + totalmap.put("consulNumber",consulNumber);//远程会诊 + map.put("data", list2); + map.put("totalMap", totalmap); + // System.out.println("map"+map); + //System.out.println("totalMap"+totalmap); + //System.out.println("查询map"+map); + //System.out.println("查询totalMap"+totalmap); + //导出查询列表 + String fileName = "数据汇总表"+System.currentTimeMillis()+".xls"; + String sheetName = "数据汇总表"; + String[][] content = new String[list2.size()+1][20]; + //列表的数据遍历出来保存到EXCEL 里去 + for(int i=0;i1){ + content[lastl][1]=coTension+""; + content[lastl][2]=coLoose+""; + content[lastl][3]=coCounty+""; + content[lastl][4]=coUniorCoalition+""; + content[lastl][5]=coTeleMedicine+""; + + content[lastl][7]=helpProtocol+""; + content[lastl][8]=totalDoctorNumber+""; + content[lastl][9]=serveDay+""; + content[lastl][10]=upArrangeNumber+""; + content[lastl][11]=totalTopicNum+""; + content[lastl][12]=trainingNumber+""; + content[lastl][13]=caseUpwardNumber+""; + content[lastl][14]=caseDownNumber+""; + content[lastl][15]=consulNumber+""; + content[lastl][16]=medicalNumber+""; + content[lastl][17]=juniorNumber+""; + /* for(int i=0;i list1 =new ArrayList(); + for(int i=0;i totalnewlist = new HashSet<>(list1);//汇总后的数据去重 + content[lastl][19]=totalnewlist.toString().substring(1,totalnewlist.toString().lastIndexOf("]"));*/ + content[lastl][18]=newtechniqueNumber+""; + } + HSSFWorkbook wb = com.imurs.excelderive.ExcelDown2.getHSSFWorkbook1(sheetName, content, null, list2.size(),params.get("hospitalName"),startTime,endTime); + try { + this.setResponseHeader(response, fileName); + // response.reset();// + OutputStream os = response.getOutputStream(); + wb.write(os); + os.flush(); + os.close(); + wb.close();//临时加的关闭表格 + } catch(Exception e){ + e.printStackTrace(); + } + return map; + } + //发送响应流方法 + public void setResponseHeader(HttpServletResponse response, String fileName) { + try { + try { + fileName = new String(fileName.getBytes(),"ISO8859-1"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + response.setContentType("application/octet-stream;charset=ISO8859-1"); + response.setHeader("Content-Disposition", "attachment;filename="+ fileName); + response.addHeader("Pargam", "no-cache"); + response.addHeader("Cache-Control", "no-cache"); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TotalTrainingController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TotalTrainingController.java new file mode 100644 index 0000000..838eced --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TotalTrainingController.java @@ -0,0 +1,197 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.TotalTraining; +import com.imurs.entity.Training; +import com.imurs.entity.TrainingFlower; +import com.imurs.entity.User; +import com.imurs.service.TotalTrainingService; +import com.imurs.service.TrainingFlowerService; +import com.imurs.service.TrainingService; +import com.imurs.service.UserService; + + +/** + * 远程培训视频(列表统计) + * @author Server + * totaltraining 统计 + */ +@RestController +@RequestMapping(value="totalTraining") +public class TotalTrainingController { + + @Autowired + TotalTrainingService totalTrainingService; + + @Autowired + TrainingService trainingService; + @Autowired + UserService userService; + + @Autowired + TrainingFlowerService trainingFlowerService; + + /** + * 视频课件播放次数增加 + * @param section + * @return + */ + @RequestMapping(value="insertTotalTraining") + public Map insertSection(TotalTraining totalTraining){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("doc_id", totalTraining.getDocId()); + wrapper.eq("training_id", totalTraining.getTrainingId()); + TotalTraining totalTrainingOne = totalTrainingService.selectOne(wrapper); + if(totalTrainingOne==null){ + boolean result=totalTrainingService.insert(totalTraining); + if(result==true){ + map.put("msg","1"); + Training training = trainingService.selectById(totalTraining.getTrainingId()); + training.setNumber(training.getNumber()+totalTraining.getNumber()); + trainingService.updateById(training); + }else{ + map.put("msg","2"); + } + }else{ + map.put("msg", "5"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件点赞与取消点赞 + * @param section + * @return + *//* + @RequestMapping(value="updateTotisPraise") + public Map updateTotIsPraise(TotalTraining totalTraining,Integer isPraise){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("doc_id", totalTraining.getDocId()); + wrapper.eq("training_id", totalTraining.getTrainingId()); + Boolean result = totalTrainingService.update(totalTraining, wrapper); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + *//** + * 视频课件点赞总数 + * @param section + * @return + *//* + @RequestMapping(value="totalTrainingTotalPraise") + public Map totalTrainingTotalPraise(TotalTraining totalTraining){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + EntityWrapper wrapperA=new EntityWrapper(); + try { + wrapper.eq("training_id", totalTraining.getTrainingId()); + wrapper.setSqlSelect("sum(flower) as flower"); + TotalTraining totTraining = totalTrainingService.selectOne(wrapper); + wrapperA.eq("training_id", totalTraining.getTrainingId()); + int count = totalTrainingService.selectCount(wrapperA); + map.put("isPraiseNum", totTraining.getFlower()/count); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + }*/ + + /** + * 新增送花朵数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlower") + public Map trainingFlower(TrainingFlower trainingFlower){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingFlower.getTrainingId()); + wrapper.eq("give_id", trainingFlower.getGiveId()); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower==null){ + Boolean result = trainingFlowerService.insert(trainingFlower); + map.put("msg", result == true?1:2); + }else{ + map.put("msg", "5");//已经送过花朵 + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看自己的送花朵数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlowerBytId") + public Map trainingFlowerBytId(TrainingFlower trainingFlower){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingFlower.getTrainingId()); + wrapper.eq("give_id", trainingFlower.getGiveId()); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower!=null){ + map.put("myFlower", tgFlower.getFlowerNum()==null?0:tgFlower.getFlowerNum()); + }else{ + map.put("myFlower", "0"); + } + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 送花总数 + * @param section + * @return + */ + @RequestMapping(value="trainingFlowerTotal") + public Map trainingFlowerTotal(Long trainingId){ + Map map=new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + wrapper.eq("training_id", trainingId); + wrapper.setSqlSelect("sum(flower_num) as flowerNum"); + TrainingFlower tgFlower = trainingFlowerService.selectOne(wrapper); + if(tgFlower!=null){ + map.put("sumFlower", tgFlower.getFlowerNum()==null?0:tgFlower.getFlowerNum()); + }else{ + map.put("sumFlower", "0"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingController.java new file mode 100644 index 0000000..c11212a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingController.java @@ -0,0 +1,291 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TotalTraining; +import com.imurs.entity.Training; +import com.imurs.entity.TrainingOpinion; +import com.imurs.entity.User; +import com.imurs.service.TotalTrainingService; +import com.imurs.service.TrainingOpinionService; +import com.imurs.service.TrainingService; +import com.imurs.service.UserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * 远程培训视频(列表统计) + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "training") +public class TrainingController { + + @Autowired + TrainingService trainingService; + + @Autowired + TotalTrainingService totalTrainingService; + + @Autowired + UserService userService; + + @Autowired + TrainingOpinionService trainingOpinionService; + + /** + * 新增上传视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "insertTraining") + public Map insertSection(Training training) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + wrapper.eq("phone", training.getPhone());//phone 为user表账号 通过账号查找手机号码 手机号码可以修改的 + User user = userService.selectOne(wrapper); + training.setPhone(user.getContactPhone()); + boolean result = trainingService.insert(training); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "updateTraining") + public Map updateSection(Training training) { + Map map = new HashMap(); + try { + boolean result = trainingService.updateById(training); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据id查找视频课件 + * @param section + * @return + */ + @RequestMapping(value = "selectTrainingById") + public Map selectTrainingById(Long id) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + try { + Training training = trainingService.selectById(id); + User user = userService.selectById(training.getDocId()); + wrapper.eq("training_id", id); + map.put("user", user); + map.put("training", training); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除视频课件 + * + * @param section + * @return + */ + @RequestMapping(value = "deleteTraining") + public Map updateSection(Long id) { + Map map = new HashMap(); + try { + boolean result = trainingService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件列表分页 + */ + @RequestMapping(value = "selectTrainingPage") + public Map selectSectionPage(Map map) { + Map mapList = new HashMap(); + try { + List listTraining = trainingService.selectTraining(map); + if (listTraining != null) { + mapList.put("listTraining", listTraining); + } else { + mapList.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + mapList.put("msg", "4"); + } + return mapList; + } + + /** + * 视频课件列表分页列表显示 + */ + @RequestMapping(value = "selectTrainingPageByType") + public Map selectSectionPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker,String hospitalId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(title)) { + wrapper.like("title", title); + } + if (StringUtils.isNotEmpty(speaker)) { + wrapper.like("speaker", speaker); + } + if (type != null) { + wrapper.eq("type", type); + } + wrapper.orderBy("create_time", false); + try { + Page tiList = trainingService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + if(StringUtils.isNotEmpty(hospitalId)){ + map.put("hospital_id", hospitalId); + List totalList=totalTrainingService.selectByMap(map); + map.remove("hospital_id"); + if(!totalList.isEmpty()){ + Map result=totalList.stream().collect(Collectors.groupingBy(TotalTraining::getTrainingId,Collectors.counting())); + for (int i = 0; i < customPage.getRows().size(); i++) { + if(result!=null && result.get(customPage.getRows().get(i).getId())!=null){ + customPage.getRows().get(i).setNumber(result.get(customPage.getRows().get(i).getId()).intValue()); + }else{ + customPage.getRows().get(i).setNumber(0); + } + } + }else{ + for (int i = 0; i < customPage.getRows().size(); i++) { + customPage.getRows().get(i).setNumber(0); + } + } + } + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 视频课件列表基层医院分页列表显示 + */ + @RequestMapping(value = "selectBasicSectionPage") + public Map selectBasicSectionPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker,String hospitalId) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + map.put("hospitalId", hospitalId); + map.put("speaker", speaker); + map.put("type", type); + map.put("title", title); + try{ + Pagetion tiList=trainingService.selectBasePage(map,pageNo,pageSize); + if (tiList != null) { + map.put("customPage", tiList); + } else { + map.put("msg", "3"); + } + }catch(Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("hospitalId"); + map.remove("speaker"); + map.remove("type"); + map.remove("title"); + } + return map; + } + + /** + * 新增评论回复 + * @param section + * @return + */ + @RequestMapping(value = "addTrainingOpinion") + public Map addTrainingOpinion(TrainingOpinion trainingOpinion) { + Map map = new HashMap(); + try { + boolean result = trainingOpinionService.insert(trainingOpinion); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 评论列表分页 + */ + @RequestMapping(value = "selectTrainingOpinionPage") + public Map selectTrainingOpinionPage(Integer pageNo, Integer pageSize, String trainingId) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(trainingId)) { + wrapper.eq("training_id", trainingId); + } + //wrapper.groupBy("reply_id"); + wrapper.orderBy("create_time", false); + try { + Page tiList = trainingOpinionService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + map.put("customPage", customPage); + /*List trainingOpinionList = trainingOpinionService.selectList(wrapper); + map.put("msg",trainingOpinionList);//视频评论及回复列表数据 +*/ } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingPlanController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingPlanController.java new file mode 100644 index 0000000..376e9c3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingPlanController.java @@ -0,0 +1,130 @@ +package com.imurs.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TrainingPlan; +import com.imurs.service.TrainingOpinionService; +import com.imurs.service.TrainingPlanService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping("trainingPlan") +public class TrainingPlanController { + + @Autowired + TrainingPlanService trainingPlanService; + + @Autowired + TrainingOpinionService trainingOpinionService; + /** + * 新增培训计划 + */ + @RequestMapping("insertTrainingPlan") + public Map insertTrainingPlan(TrainingPlan trainingPlan){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.insert(trainingPlan); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改培训计划 + */ + @RequestMapping("updateTrainingPlan") + public Map updateTrainingPlan(TrainingPlan trainingPlan){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.updateById(trainingPlan); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查看计划详情 + */ + @RequestMapping("selectTrainingPlan") + public Map selectTrainingPlan(Long id,Long docId){ + Map map=new HashMap(); + try { + TrainingPlan trainingPlan=trainingPlanService.selectById(id); + map.put("trainingPlan",trainingPlan); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 删除 + */ + @RequestMapping("deleteTrainingPlan") + public Map deleteTrainingPlan(Long id){ + Map map=new HashMap(); + try { + boolean result=trainingPlanService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 视频课件列表分页列表显示 + */ + @RequestMapping(value = "selectTrainingPlayPage") + public Map selectTrainingPlayPage(Integer pageNo, Integer pageSize, Integer type, String title, + String speaker) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + FrontPage page = new FrontPage(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(title)) { + wrapper.like("title", title); + } + if (StringUtils.isNotEmpty(speaker)) { + wrapper.like("speaker", speaker); + } + if (type != null) { + wrapper.eq("type", type); + } + + wrapper.orderBy("lecture_time", false); + try { + Page tiList = trainingPlanService.selectPage(page.getPagePlusTwo(), wrapper); + if (tiList != null) { + CustomPage customPage = new CustomPage(tiList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingRecordController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingRecordController.java new file mode 100644 index 0000000..91df6d0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/TrainingRecordController.java @@ -0,0 +1,173 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.TrainingRecord; +import com.imurs.service.TrainingRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +/** + * + * @author Server + * + */ +@RestController +@RequestMapping(value="trainingRecord") +public class TrainingRecordController { + + @Autowired + TrainingRecordService trainingRecordService; + + /** + * 新增培训记录表 + * @param loginRecord + * @return + */ + @RequestMapping(value="addTrainingRecord") + public Map addTrainingRecord(TrainingRecord trainingRecord) throws Exception { + Map map=new HashMap(); + + try { + boolean result=trainingRecordService.insert(trainingRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 修改培训记录 + * @param section + * @return + */ + @RequestMapping(value="updateTrainingRecord") + public Map updateTrainingRecord(TrainingRecord training){ + Map map=new HashMap(); + try { + boolean result=trainingRecordService.updateById(training); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 管理医院关联查询医院名称 + */ + @RequestMapping(value="selectTrainingRecordById") + public Map selectTrainingRecordById(Long trainingId){ + Map map=new HashMap(); + try { + TrainingRecord training = trainingRecordService.selectTrainingRecordById(trainingId); + map.put("training",training); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 删除视频课件 + * @param section + * @return + */ + @RequestMapping(value="deleteTrainingRecord") + public Map deleteTrainingRecord(Long id){ + Map map=new HashMap(); + try { + boolean result=trainingRecordService.deleteById(id); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示登录记录信息 + */ + @RequestMapping(value="selectTrainingRecordPage") + public Map selectTrainingRecordPage(Integer pageNo,Integer pageSize,String title,String hospitalId,String startTime,String endTime){ + Map map=new HashMap(); + FrontPage page=new FrontPage(); + EntityWrapper wrapper=new EntityWrapper(); + + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?10:pageSize); + + if(StringUtils.isNotEmpty(hospitalId)){ + wrapper.eq("hospital_id", hospitalId); + } + if(StringUtils.isNotEmpty(title)){ + wrapper.like("title", title); + } + if(StringUtils.isNotEmpty(startTime)){ + wrapper.ge("training_time", startTime); + } + if(StringUtils.isNotEmpty(endTime)){ + SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE,1);//增加一天 + wrapper.lt("training_time",dateFormat.format(cal.getTime())); + + } + wrapper.orderBy("training_time",false); + try { + Page trainingRecord=trainingRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(trainingRecord!=null){ + CustomPage customPage=new CustomPage(trainingRecord); + map.put("customPage", customPage); + }else{ + map.put("msg","3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 管理医院显示培训记录 + */ + @RequestMapping(value="selectAdminRecordPage") + public Map selectAdminRecordPage(Integer pageNo,Integer pageSize,String hospitalId,String startTime,String endTime){ + Map map=new HashMap(); + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("hospitalId", hospitalId); + try { + Pagetion list=trainingRecordService.selectAdminRecord(map, pageNo, pageSize); + map.put("list", list); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("startTime"); + map.remove("endTime"); + map.remove("hospitalId"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/UserController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/UserController.java new file mode 100644 index 0000000..9c5e19f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/UserController.java @@ -0,0 +1,644 @@ +package com.imurs.controller; + +import java.sql.Date; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import com.imurs.entity.*; +import com.imurs.service.*; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.helpers.SubstituteLogger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.parameter.SysMenusParameter; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + + +/** + * 医生登录表 + * + * @author Server + * + */ +@RestController +@RequestMapping(value = "user") +public class UserController { + + @Autowired + UserService userService; + @Autowired + SysMenuService sysMenuService; + @Autowired + ApplyCaseService applyCaseService; + @Autowired + ApplyConsultationService applyConsultationService; + @Autowired + DoctorArrangeService doctorArrangeService; + @Autowired + TrainingService trainingService; + @Autowired + TotalTrainingService totalTrainingService; + @Autowired + ApplyConsulationSpecialistService applyConsulationSpecialistService; + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + @Autowired + ApplyPathologySpecialistService applyPathologySpecialistService; + @Autowired + ApplyEcgSpecialistService applyEcgSpecialistService; + @Autowired + RoleService roleService; + @Autowired + ApplyBModeService applyBModeService; + + private final Logger logger = LoggerFactory.getLogger(UserController.class); + + private static String privateKey = MsgCode.privateKeyString; + private static String password = MsgCode.Password; + /** + * 新增医生信息 + * + * @param user + * @return + */ + @RequestMapping(value = "insertUser") + public Map insertUser(User user) { + Map map = new HashMap(); + try { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (user.getPassword() != null) { + user.setPassword(RSAUtil.decrypt(user.getPassword(),privateKey)); + } else { + user.setPassword(password); + } + user.setPassword(passwordEncoder.encode(user.getPassword())); + boolean result = userService.insert(user); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改密码 + */ + @RequestMapping(value = "updateUserPassword") + public Map updateUserPassword(Long id, String oldPassword, String newPassword) { + Map map = new HashMap(); + try { + if (id != null && StringUtils.isNotEmpty(oldPassword) && StringUtils.isNotEmpty(newPassword)) { + // 判断旧密码是否相同 + oldPassword = RSAUtil.decrypt(oldPassword,privateKey); + newPassword = RSAUtil.decrypt(newPassword,privateKey); + User user = userService.selectById(id); + if (user != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (passwordEncoder.matches(oldPassword,user.getPassword())) { + user.setPassword(passwordEncoder.encode(newPassword)); + boolean result = userService.updateById(user); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg", "11"); + } + } else { + map.put("msg", "6"); + } + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * @param phone 电话号码 + * @param password 密码 + * @return 通过一个固定账号查出该医院所有医生账号 + */ + @RequestMapping("getAllDocByCategoryHospital") + public Map getAllDocByCategoryHospital(String phone, String password) { + Map map = new HashMap<>(8); + try { + User user = userService.selectOne(new EntityWrapper() + .eq("phone", phone)); + if (user == null) { + map.put("msg","6"); + return map; + } + String decryptPassword = RSAUtil.decrypt(password,privateKey); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + if (!passwordEncoder.matches(decryptPassword,user.getPassword())) { + map.put("msg","2"); + return map; + } + List users = userService.selectList(new EntityWrapper() + .eq("hospital_id", user.getHospitalId()) + .notIn("phone", phone)); + map.put("users",users); + map.put("msg","1"); + } catch (Exception e) { + logger.error("查询基层医院所有医生出现异常",e); + map.put("msg","4"); + } + return map; + } + + /** + * 修改医生信息 + * + * @param user + * @return + */ + @RequestMapping(value = "updateUser") + public Map updateUser(User user) { + Map map = new HashMap(); + try { + boolean result = userService.updateById(user); + String username = user.getUserName(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("doc_id",user.getId()); + List applyBModeList = applyBModeService.selectList(wrapper); + if (!CollectionUtils.isEmpty(applyBModeList)) { + for (ApplyBMode applybmode: applyBModeList) { + applybmode.setDoctorName(username); + } + applyBModeService.updateBatchById(applyBModeList); + } + +// applyBModeService.updateByMyId(id,username); + + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + /** + * 多医生批量修改 + * + * @param users + * @return + */ + + @RequestMapping(value = "updateUserBatch") + public Map updateUserBatch(@RequestBody List users) { + Map map = new HashMap<>(); + try { + boolean result = userService.updateBatchByIds(users); + map.put("msg", result ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据groupAlias字段查询医生 + * @param groupAlias + * @return + */ + @RequestMapping(value = "selectUserByGroupAlias") + public Map selectUserByGroupAlias(@RequestParam String groupAlias) { + Map map = new HashMap<>(); + try { + List users = userService.selectList(new EntityWrapper() + .eq("group_alias", groupAlias) + .eq("state", 1) + .eq("rid", 6) + ); + map.put("doctorList", users); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生groupAlias字段为空的医生 + * @param + * @return + */ + @RequestMapping(value = "selectUserByGroupAliasIsNull") + public Map selectUserByGroupAliasIsNull() { + Map map = new HashMap<>(); + try { + List users = userService.selectList(new EntityWrapper() + .andNew("(group_alias IS NULL OR group_alias = '')") + .eq("state", 1) + .eq("rid", 6)); // 空字符串; + map.put("doctorList", users); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 根据手机号码查询医生 + */ + @RequestMapping(value = "selectUserByPhone") + public Map selectUserByPhone(String phone, String rid) { + Map map = new HashMap<>(); + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("phone", phone); + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid", rid); + } + try { + User user = userService.selectOne(wrapper); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生详情 + */ + @RequestMapping(value = "selectUserById") + public Map selectUserById(Long id) { + Map map = new HashMap(); + try { + User user = userService.selectById(id); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生所有权限 + */ + @RequestMapping(value = "selectUserAllRpId") + public Map selectUserAllRpId(String rid) { + // 查询角色所有权限使用 + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List list = new ArrayList(); + // 查询该角色拥有的所有权限 + wrapper.eq("rid", rid).eq("menu_state", "1"); + List selectList = sysMenuService.selectList(wrapper); + Map> collect1 = selectList.stream().collect( + Collectors.groupingBy(SysMenu::getMenuStair, Collectors.mapping(SysMenu::getId, Collectors.toList()))); + Set>> entrySet = collect1.entrySet(); + for (Entry> entry : entrySet) { + SysMenusParameter st = new SysMenusParameter(); + st.setMenuStair(entry.getKey()); + st.setMenuId(entry.getValue().toString().replace("[", "").replace("]", "")); + // buffer1="{name:"+"\""+entry.getKey()+"\""+","+"content:"+"\""+entry.getValue()+"\""+"}"; + list.add(st); + } + map.put("AllPermissions", list); + return map; + } + + /** + * 查询医生所有权限(dxy) + */ + @RequestMapping(value = "selectUserSysMenue") + public Map selectUserSysMenue(String rid) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List smList = new ArrayList(); + List sysList = new ArrayList(); + Set keySet; + try { + wrapper.eq("rid", rid).eq("menu_state", "1").ne("menu_vfp", "管理员列表"); + smList = sysMenuService.selectList(wrapper); + Map> collect = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair, + Collectors.mapping(SysMenu::getId, Collectors.toList()))); + keySet = collect.keySet(); + for (String menuStair : keySet) { + SysMenusParameter st = new SysMenusParameter(); + st.setMenuStair(menuStair); + st.setMenuId(collect.get(menuStair).toString().replace("[", "").replace("]", "")); + sysList.add(st); + } + map.put("sysList", sysList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询医生详情及权限 + */ + @RequestMapping(value = "selectUserRpId") + public Map selectUserRpId(Long id) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List smList = new ArrayList(); + try { + User user = userService.selectById(id); + if (user != null) { + String[] str = user.getRpId().split(","); + for (int i = 0; i < str.length; i++) { + if (str.length - i == 1) { + wrapper.eq("id", str[i]).eq("rid", "1,2").eq("menu_state", "1"); + } else { + wrapper.eq("id", str[i]).eq("rid", "1,2").eq("menu_state", "1").or(); + } + } + smList = sysMenuService.selectList(wrapper); + if (smList.isEmpty()) { + map.put("rpId", null); + } else { + // 分组求出所有名称 + // 分组显示 + Map> collect = smList.stream().collect(Collectors.groupingBy( + SysMenu::getMenuStair, Collectors.mapping(SysMenu::getId, Collectors.toList()))); + map.put("limits", collect.keySet().toArray()); + } + } + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示医生信息 + */ + @RequestMapping(value = "selectUserPage") + public Map selectUserPage(Integer pageNo, Integer pageSize, String contactPhone, String userName, + String startTime, String endTime, String isSucceed, String phone, String seName, Integer state, + String hospitalId, String rid, String isFamily) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + EntityWrapper wrapper = new EntityWrapper(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + if (StringUtils.isNotEmpty(contactPhone)) { + wrapper.eq("contact_phone", contactPhone); + } + if (StringUtils.isNotEmpty(seName)) { + wrapper.eq("se_name", seName); + } + if (StringUtils.isNotEmpty(phone)) { + wrapper.eq("phone", phone); + } + if (StringUtils.isNotEmpty(userName)) { + wrapper.like("user_name", userName); + } + if (state != null) { + wrapper.eq("state", state); + } + if (hospitalId != null) { + wrapper.eq("hospital_id", hospitalId); + } + if (StringUtils.isNotEmpty(rid)) { + wrapper.eq("rid", rid); + } + if (StringUtils.isNotEmpty(endTime)) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + cal.setTime(Date.valueOf(endTime)); + cal.add(Calendar.DATE, 1);// 增加一天 + endTime = dateFormat.format(cal.getTime()); + } + if (StringUtils.isNotEmpty(isFamily)) { + wrapper.eq("is_family", isFamily); + } + if (StringUtils.isNotEmpty(isSucceed)) { + wrapper.eq("is_succeed", isSucceed); + } + wrapper.orderBy("job_level", false); + + try { + Page userList = userService.selectPage(page.getPagePlusTwo(), wrapper); + if (userList != null) { + CustomPage customPage = new CustomPage(userList); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 关联医院表分页显示医生信息 + */ + @RequestMapping(value = "selectUserPageByDoc") + public Map selectUserPageByDoc(Integer pageNo, Integer pageSize, String phone, String userName, + Integer state, String hospitalId, String rid) { + Map map = new HashMap(); + map.put("phone", phone); + map.put("userName", userName); + map.put("state", state); + map.put("hospitalId", hospitalId); + map.put("rid", rid); + + pageNo = pageNo == null ? 1 : pageNo; + pageSize = pageSize == null ? 12 : pageSize; + + try { + Pagetion pagetion = userService.selectUserPageByDoc(map, pageNo, pageSize); + map.put("pagetion", pagetion); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("phone"); + map.remove("userName"); + map.remove("state"); + map.remove("hospitalId"); + map.remove("rid"); + } + return map; + } + + /** + * 删除医生 + */ + @RequestMapping(value = "deleteUser") + public Map deleteUser(Long id) { + Map map = new HashMap(); + try { + boolean result = userService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 关联医院表查出医院名称 + */ + @RequestMapping("selectUserByUid") + public Map selectUserByUid(Long uid) { + Map map = new HashMap(); + try { + User user = userService.selectUserByUid(uid); + map.put("user", user); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 根据科室查询医生 ty:1 + */ + @RequestMapping("selectUserBySeName") + public Map selectUserBySeName(String hospitalId, String seName, String rid, Integer status, + Long conId, Long bId, Long pId, Long eId) { + Map map = new HashMap(); + + if (StringUtils.isNotEmpty(seName)) { + map.put("se_name", seName); + } + if (StringUtils.isNotEmpty(hospitalId)) { + map.put("hospital_id", hospitalId); + map.put("rid", rid); + map.put("state", "1"); + } else { + map.put("msg", "9"); + return map; + } + try { + List userList = userService.selectByMap(map); + if (!userList.isEmpty() && status != null) { + if (conId != null) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.setSqlSelect("spe_id as speId").where("").eq("con_id", conId); + // 查询当前专家是否已经分配过 + List accsList = applyConsulationSpecialistService.selectList(wrapper); + map.put("accsList", accsList); + } else if (bId != null) { + EntityWrapper wrapper1 = new EntityWrapper(); + wrapper1.setSqlSelect("spe_id as speId").where("").eq("b_id", bId); + // 查询当前专家是否已经分配过 + List accsList = applyBModeSpecialistService.selectList(wrapper1); + map.put("accsList", accsList); + } else if (pId != null) { + EntityWrapper wrapper2 = new EntityWrapper(); + wrapper2.setSqlSelect("spe_id as speId").where("").eq("p_id", pId); + // 查询当前专家是否已经分配过 + List accsList = applyPathologySpecialistService.selectList(wrapper2); + map.put("accsList", accsList); + } else if (eId != null) { + EntityWrapper wrapper3 = new EntityWrapper(); + wrapper3.setSqlSelect("spe_id as speId").where("").eq("e_id", eId); + // 查询当前专家是否已经分配过 + List accsList = applyEcgSpecialistService.selectList(wrapper3); + map.put("accsList", accsList); + } + } + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 查询所有管理员子账号 + */ + @RequestMapping("selectUserByAdmin") + public Map selectUserByAdmin(Long rid) { + Map map = new HashMap(); + map.put("rid", rid); + try { + List userList = userService.selectByMap(map); + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 靖远医院专家一览表 + */ + @RequestMapping("selectUserJy") + public Map selectUserJy(String seName, String userName) { + Map map = new HashMap(); + List userList = new ArrayList(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("rid", "6").eq("state", "1"); + if (StringUtils.isNotEmpty(seName)) { + wrapper.eq("se_name", seName); + } + if (StringUtils.isNotEmpty(userName)) { + wrapper.like("user_name", userName); + } + wrapper.orderBy("create_time", false); + try { + userList = userService.selectList(wrapper); + map.put("userList", userList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } finally { + map.remove("rid"); + map.remove("state"); + } + return map; + } + + /** + * 查询权限 + */ + @RequestMapping("selectSysMenuByRid") + public Map selectRoleByRid(Long rid) { + Map map = new HashMap(); + try { + Role sys = roleService.selectById(rid); + map.put("rpId", sys.getRpId()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VideoRecordController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VideoRecordController.java new file mode 100644 index 0000000..c3d1cc5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VideoRecordController.java @@ -0,0 +1,87 @@ +package com.imurs.controller; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.VideoRecord; +import com.imurs.service.VideoRecordService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; + +@RestController +@RequestMapping(value="video") +public class VideoRecordController { + + @Autowired + VideoRecordService videoRecordService; + + + /** + * 新增视频记录 + * @return + */ + @RequestMapping(value="/startVideo") + public Map startVideo(VideoRecord videoRecord){ + Map map=new HashMap(); + try { + boolean result = videoRecordService.insert(videoRecord); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 新增视频记录 + * @return + */ + @RequestMapping(value="/deleteVideo") + public Map deleteVideo(Long id){ + Map map=new HashMap(); + try { + boolean result = videoRecordService.deleteById(id); + map.put("msg", result == true ? "1" : "2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 分页显示医生信息 + */ + @RequestMapping(value = "selectVideoRecordPage") + public Map selectVideoRecordPage(Integer pageNo, Integer pageSize, String phone, String userName, + Integer state, String hospitalId) { + Map map = new HashMap(); + FrontPage page = new FrontPage(); + EntityWrapper wrapper = new EntityWrapper(); + + page.setPage(pageNo == null ? 1 : pageNo); + page.setRows(pageSize == null ? 12 : pageSize); + + wrapper.orderBy("create_time", false); + try { + Page videoRecord = videoRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if (videoRecord != null) { + CustomPage customPage = new CustomPage(videoRecord); + map.put("customPage", customPage); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VoiceTransform.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VoiceTransform.java new file mode 100644 index 0000000..e0b88a3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/VoiceTransform.java @@ -0,0 +1,68 @@ +package com.imurs.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; +import javax.sound.sampled.UnsupportedAudioFileException; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.multipart.MultipartFile; + +import com.imurs.sound.AsrMain; + +import net.sf.json.JSONObject; +@Controller +@RequestMapping(value = "/sound") +public class VoiceTransform { + /** + * 获取二进制数据 + * + * @param model + * @param params + * @param response + * @return + */ + + + //百度通用语音识别 + @RequestMapping(value = "/bRecogniteSound") + public void baidusoundsound(MultipartFile audioData,HttpServletResponse response) throws UnsupportedAudioFileException, IOException, Exception { + + // long startTime=System.currentTimeMillis(); //获取开始时间 + InputStream in=audioData.getInputStream(); + + //获取结束时间 + //long startTime2=System.currentTimeMillis(); + // System.out.println(startTime2-startTime+"获取数据的时间"); + + + AsrMain demo = new AsrMain(in); + //String path = "D:\\16k.pcm"; + //AsrMain demo = new AsrMain(path); + // demo.runJsonPostMethodIns(token) + String result = demo.runins(); + // String result =demo.run(); + // long endTime=System.currentTimeMillis(); + // System.out.println(endTime-startTime2+"上传服务器时间"); + // long processtime =(endTime-startTime2); + Map map =new HashMap(); + map.put("result", result); + // map.put("time", processtime+" ms"); + //System.out.println(result); + String json=JSONObject.fromObject(map).toString(); + response.getWriter().write(json); + // System.out.println("json格式:"+json); + //if(result != null) { + //System.out.println("识别结果:\n" + result); + //System.out.println(processtime); + + //} + } + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserController.java new file mode 100644 index 0000000..1f70e2c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserController.java @@ -0,0 +1,151 @@ +package com.imurs.controller.maternity; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.PatientUser; +import com.imurs.service.PatientUserService; +import com.imurs.util.MD5; + + +@RestController +@RequestMapping("ptUser") +public class PatientUserController { + + @Autowired + PatientUserService patientUserService; + + + /** + * 患者注册 + */ + @RequestMapping(value = "registerPtUser") + public Map registerPtUser(PatientUser ptUser) { + Map map = new HashMap(); + try { + if (ptUser != null) { + ptUser.setAccount(ptUser.getPhone()); + ptUser.setPhone(ptUser.getPhone()); + ptUser.setPassword(MD5.GetMD5Code(ptUser.getPassword())); + ptUser.setPtIccid(UUID.randomUUID().toString()); + boolean result = patientUserService.insert(ptUser); + map.put("msg", result == true ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 判断当前手机号码是否已经注册 + * + */ + @RequestMapping(value = "selectPtPhone") + public Map selectPtPhone(String phone) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("account", phone); + try { + int count = patientUserService.selectCount(wrapper); + map.put("msg", count == 0 ? "6" : "5"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + /** + * 修改密码 + */ + @RequestMapping(value = "updatePtUserPassword") + public Map updatePtUserPassword(PatientUser patientUser) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(patientUser!=null && (StringUtils.isNotEmpty(patientUser.getAccount()) && StringUtils.isNotEmpty(patientUser.getPassword()))){ + wrapper.eq("account", patientUser.getAccount()); + //判断旧密码是否相同 + patientUser.setPassword(MD5.GetMD5Code(patientUser.getPassword())); + boolean result = patientUserService.update(patientUser, wrapper); + map.put("msg", result == true ? "1" : "2"); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + /** + * 个人信息 + */ + @RequestMapping(value = "selectPtUser") + public Map selectPtUser(String account,String ptCard) { + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + if(StringUtils.isNotEmpty(account)){ + wrapper.eq("account", account); + }else if(StringUtils.isNotEmpty(ptCard)){ + wrapper.eq("card", ptCard); + } + + try { + if (StringUtils.isNotEmpty(account) || StringUtils.isNotEmpty(ptCard)) { + PatientUser patientUser=patientUserService.selectOne(wrapper); + map.put("patientUser", patientUser); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "updatePtUser") + public Map updatePtUser(PatientUser ptUser) { + Map map = new HashMap(); + try { + if (ptUser != null) { + if(StringUtils.isNotEmpty(ptUser.getPtName())){ + ptUser.setPtName(ptUser.getPtName()); + } + if(StringUtils.isNotEmpty(ptUser.getCard())){ + ptUser.setCard(ptUser.getCard()); + } + if(StringUtils.isNotEmpty(ptUser.getPhone())){ + ptUser.setPhone(ptUser.getPhone()); + } + + boolean result = patientUserService.updateById(ptUser); + map.put("msg", result == true ? "1" : "2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java new file mode 100644 index 0000000..e83bd27 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/controller/maternity/PatientUserRecordController.java @@ -0,0 +1,191 @@ +package com.imurs.controller.maternity; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.imurs.entity.PatientUser; +import com.imurs.entity.PatientUserRecord; +import com.imurs.entity.PatientUserRecordImg; +import com.imurs.service.PatientUserRecordImgService; +import com.imurs.service.PatientUserRecordService; +import com.imurs.service.PatientUserService; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.FrontPage; +import com.imurs.util.page.Pagetion; + +@RestController +@RequestMapping("record") +public class PatientUserRecordController { + + @Autowired + PatientUserRecordService patientUserRecordService; + @Autowired + PatientUserRecordImgService patientUserRecordImgService; + @Autowired + PatientUserService patientUserService; + + + /** + *资料上传 + */ + @Transactional + @RequestMapping("inserRecord") + public Map inserRecord(@RequestBody List rdList) { + Map map = new HashMap(); + boolean result=false; + try { + if (!rdList.isEmpty() && rdList.get(0) != null) { + result = patientUserRecordService.insert(rdList.get(0)); + if (result == true) { + Integer id=rdList.get(0).getId(); + for (int i = 0; i < rdList.get(0).getImgList().size(); i++) { + rdList.get(0).getImgList().get(i).setRdId(id); + patientUserRecordImgService.insert(rdList.get(0).getImgList().get(i)); + } + } + map.put("msg", result == true?"1":"2"); + } else { + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RequestMapping(value = "selectRecordPage") + public Map selectRecordPage(Integer uid,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + FrontPage page=new FrontPage(); + page.setPage(pageNo==null?1:pageNo); + page.setRows(pageSize==null?10:pageSize); + + if(uid!=null){ + wrapper.eq("pt_uid", uid); + } + wrapper.orderBy("id",false); + try { + Page pageList=patientUserRecordService.selectPage(page.getPagePlusTwo(), wrapper); + if(pageList!=null){ + CustomPage customPage=new CustomPage(pageList); + map.put("customPage", customPage); + }else{ + map.put("msg", "3"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "selectRecordPtUserPage") + public Map selectRecordPtUserPage(String startTime,String endTime,String ptName,Integer pageNo,Integer pageSize) { + Map map = new HashMap(); + pageNo=pageNo==null?1:pageNo; + pageSize=pageSize==null?10:pageSize; + map.put("startTime", startTime); + map.put("endTime", endTime); + map.put("ptName", ptName); + + try { + Pagetion pageList=patientUserRecordService.selectRecordPtUserPage(map,pageNo, pageSize); + map.put("pageList", pageList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + }finally { + map.remove("ptName"); + map.remove("endTime"); + map.remove("startTime"); + } + return map; + } + + + /** + * 数据统计 + */ + @RequestMapping(value = "selectRecordCount") + public Map selectRecordCount(Integer ptUid) { + Map map = new HashMap(); + List rdList=new ArrayList(); + EntityWrapper wrapper=new EntityWrapper(); + try { + if(ptUid!=null){ + wrapper.eq("pt_uid", ptUid).orderBy("id", false); + rdList=patientUserRecordService.selectList(wrapper); + if(!rdList.isEmpty()){ + map.put("rdList", rdList); + } + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + + return map; + } + + + @RequestMapping(value = "selectRecordImg") + public Map selectRecordImg(Integer rdId) { + Map map = new HashMap(); + List imgList=new ArrayList(); + try { + if(rdId!=null){ + map.put("rd_id", rdId); + imgList=patientUserRecordImgService.selectByMap(map); + map.remove("rd_id"); + map.put("imgList", imgList); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping(value = "selectRecordById") + public Map selectRecordById(Integer id) { + Map map = new HashMap(); + PatientUserRecord patientUserRecord=new PatientUserRecord(); + PatientUser patientUser=new PatientUser(); + List imgList=new ArrayList(); + map.put("rd_id", id); + try { + if(id!=null){ + patientUserRecord=patientUserRecordService.selectById(id); + patientUser=patientUserService.selectById(patientUserRecord.getPtUid()); + imgList=patientUserRecordImgService.selectByMap(map); + map.put("patientUser", patientUser); + map.put("imgList", imgList); + map.put("patientUserRecord", patientUserRecord); + }else{ + map.put("msg", "9"); + } + } catch (Exception e) { + map.put("msg", "4"); + }finally { + map.remove("rd_id"); + } + return map; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AgoraRecordMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AgoraRecordMapper.java new file mode 100644 index 0000000..4a73144 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AgoraRecordMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.AgoraRecord; + +public interface AgoraRecordMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java new file mode 100644 index 0000000..3e00aa1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/AiQcVocabularyMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.AiQcVocabulary; + +public interface AiQcVocabularyMapper extends BaseMapper { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApiUrlMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApiUrlMapper.java new file mode 100644 index 0000000..a9531bc --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApiUrlMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApiUrl; + +public interface ApiUrlMapper extends BaseMapper{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java new file mode 100644 index 0000000..36c57f0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBModeImg; + +public interface ApplyBModeImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeMapper.java new file mode 100644 index 0000000..8db139d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeMapper.java @@ -0,0 +1,23 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.utils.Excelvo; + +public interface ApplyBModeMapper extends BaseMapper{ + + public List selectBmodePage(Map map); + + public List> selectBmodeSpePage(Map map); + + public List> diagnosisTypeNumber(); + + public List> hospitalApplyNumber(); + List selectWorkTotalByTime(@Param("startTime")String startTime, @Param("endTime")String endTime, @Param("conditions")String conditions,@Param("consultationMode")String consultationMode, @Param("categoryHospitalId")String categoryHospitalId ); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java new file mode 100644 index 0000000..8c09456 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyBModeSpecialistMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyBModeSpecialist; + +public interface ApplyBModeSpecialistMapper extends BaseMapper{ + + List> selectbySpe(@Param("startTime")String startTime, @Param("endTime")String endTime); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java new file mode 100644 index 0000000..1f44329 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseImgMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyCaseImg; + + +public interface ApplyCaseImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseMapper.java new file mode 100644 index 0000000..fb3b6fa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyCaseMapper.java @@ -0,0 +1,35 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyCase; + +public interface ApplyCaseMapper extends BaseMapper{ + + public List export(Map map); + + public List getExport(Map map); + + public List arrangeOutExport(Map map); + + public List arrangeGetExport(Map map); + + public List selectCasePage(Map map); + + public ApplyCase selectCaseById(Long id); + + public List selectAdminCasePage(Map map); + + public int selectUpWayReferralNumer(Map upWayReferralMap); + + public int selectDownWayReferralNumer(Map upWayReferralMap); + + public List selectCasePatient(Map map); + + public Boolean updateByHis(Map map2); + + public Map selectPatientById(Map map); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java new file mode 100644 index 0000000..f8c9c3a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsulationSpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsulationSpecialist; + +public interface ApplyConsulationSpecialistMapper extends BaseMapper{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java new file mode 100644 index 0000000..0092b47 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsultationImg; + +public interface ApplyConsultationImgMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationMapper.java new file mode 100644 index 0000000..402eb51 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyConsultationMapper.java @@ -0,0 +1,21 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyConsultation; + + +public interface ApplyConsultationMapper extends BaseMapper{ + + public List selectConByCategory(Map map); + + public List selectConPatient(Map map); + + public int selectConsultationNumer(Map downWayReferralMap); + + public List selectConsultationSpe(Map map); + + public List selectConByPage(Map map); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java new file mode 100644 index 0000000..ff2b97a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyDoctorPromoteMapper.java @@ -0,0 +1,22 @@ +package com.imurs.dao; + + +import java.util.Map; + + +import java.util.List; + + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyDoctorPromote; + + +public interface ApplyDoctorPromoteMapper extends BaseMapper{ + + + int selectrefresherCount(Map refresherNumerMap); + + public List selectAdminPromote(Map map); + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java new file mode 100644 index 0000000..d95c076 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcgImg; + +public interface ApplyEcgImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgMapper.java new file mode 100644 index 0000000..170c942 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgMapper.java @@ -0,0 +1,16 @@ +package com.imurs.dao; + + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcg; + +public interface ApplyEcgMapper extends BaseMapper{ + + public List selectEcgPage(Map map); + + public List selectEcgSpePage(Map map); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java new file mode 100644 index 0000000..c750235 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyEcgSpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyEcgSpecialist; + +public interface ApplyEcgSpecialistMapper extends BaseMapper{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java new file mode 100644 index 0000000..078c3ed --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationImgMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyInformationImg; + + +public interface ApplyInformationImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationMapper.java new file mode 100644 index 0000000..852a742 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyInformationMapper.java @@ -0,0 +1,22 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyInformation; + + +public interface ApplyInformationMapper extends BaseMapper{ + + List selectHospitalList(String hospitalName); + + List selectInfromationList(Map infromationMap); + + + List findAifmAdminPage(Map map); + + + boolean updateByIds(List applyInformation); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyLisMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyLisMapper.java new file mode 100644 index 0000000..08eb295 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyLisMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyLis; + +public interface ApplyLisMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java new file mode 100644 index 0000000..8a9ad7d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyFileMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologyFile; + +public interface ApplyPathologyFileMapper extends BaseMapper{ + +} + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java new file mode 100644 index 0000000..c1dda8a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologyImg; + +public interface ApplyPathologyImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyMapper.java new file mode 100644 index 0000000..4dc24a2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologyMapper.java @@ -0,0 +1,17 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathology; + + +public interface ApplyPathologyMapper extends BaseMapper{ + + public List selectAphPage(Map map); + + public List selectAphSpePage(Map map); + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java new file mode 100644 index 0000000..44efc9d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplyPathologySpecialistMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplyPathologySpecialist; + + +public interface ApplyPathologySpecialistMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplySpecialistMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplySpecialistMapper.java new file mode 100644 index 0000000..6afd558 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ApplySpecialistMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ApplySpecialist; + +public interface ApplySpecialistMapper extends BaseMapper{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BModeReportMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BModeReportMapper.java new file mode 100644 index 0000000..8942dcc --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BModeReportMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BModeReport; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BModeReportMapper extends BaseMapper { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisMapper.java new file mode 100644 index 0000000..344c0ea --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Bdiagnosis; + +public interface BdiagnosisMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java new file mode 100644 index 0000000..38cdcb6 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BdiagnosisNextMapper.java @@ -0,0 +1,12 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BdiagnosisNext; + +public interface BdiagnosisNextMapper extends BaseMapper { + + List selectDiagnosisList(Integer id); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java new file mode 100644 index 0000000..7b998c8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodeMachineModelMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodeMachineModel; + +public interface BmodeMachineModelMapper extends BaseMapper{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelFrisMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelFrisMapper.java new file mode 100644 index 0000000..0734393 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelFrisMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodelFris; + +public interface BmodelFrisMapper extends BaseMapper { + Integer insert(BmodelFris record); + + int insertSelective(BmodelFris record); + + List selectBmodelFris(int id); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelHisotryMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelHisotryMapper.java new file mode 100644 index 0000000..48cb39a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelHisotryMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BModeHistory; + + + +public interface BmodelHisotryMapper extends BaseMapper { + + + public List selectBmodeHis(Map map); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelMapper.java new file mode 100644 index 0000000..e5a6600 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelMapper.java @@ -0,0 +1,19 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; + +import com.imurs.entity.Bmodel; + +public interface BmodelMapper extends BaseMapper { + int deleteByPrimaryKey(Integer id); + + Integer insert(Bmodel record); + + int insertSelective(Bmodel record); + + Bmodel selectByPrimaryKey(Integer id); + + int updateByPrimaryKeySelective(Bmodel record); + + int updateByPrimaryKey(Bmodel record); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelSecondMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelSecondMapper.java new file mode 100644 index 0000000..26235cc --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/BmodelSecondMapper.java @@ -0,0 +1,26 @@ +package com.imurs.dao; + +import java.util.List; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.BmodelSecond; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; + +public interface BmodelSecondMapper extends BaseMapper { + int deleteByPrimaryKey(Integer thirdId); + + Integer insert(BmodelSecondWithBLOBs record); + + int insertSelective(BmodelSecondWithBLOBs record); + + BmodelSecondWithBLOBs selectByPrimaryKey(Integer thirdId); + + int updateByPrimaryKeySelective(BmodelSecondWithBLOBs record); + + int updateByPrimaryKeyWithBLOBs(BmodelSecondWithBLOBs record); + + int updateByPrimaryKey(BmodelSecond record); + + List selectbmodelSecond(int id); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/CaseTemplateMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/CaseTemplateMapper.java new file mode 100644 index 0000000..063541f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/CaseTemplateMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.CaseTemplate; + +public interface CaseTemplateMapper extends BaseMapper { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java new file mode 100644 index 0000000..07a9d4d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ClinicalGuidelinesMapper.java @@ -0,0 +1,11 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ClinicalGuidelines; + +public interface ClinicalGuidelinesMapper extends BaseMapper{ + public List selectCgsOrByDocIdPage(Map map); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorArrangeMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorArrangeMapper.java new file mode 100644 index 0000000..8041ba5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorArrangeMapper.java @@ -0,0 +1,33 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.DoctorArrange; + +public interface DoctorArrangeMapper extends BaseMapper{ + + public List selectHonmeShowArrange(); + + public List homeShowArrange(Map map); + + public DoctorArrange selectTotanumberDay(Map map); + + public List selectTotaDay(Map map); + + + public List selectByArrangePage(Map map); + + + public DoctorArrange selectArrangeByUser(Long id); + + int selectdoctorTotaDay(Map map); + List selectDoctorArrangeList(Map map); + + Map selectAccreditedMedicalNumber(Map map1); + + + public List selectArrangeByRhId(String receiveHospitalId); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorGroupMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorGroupMapper.java new file mode 100644 index 0000000..9b7ecd4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/DoctorGroupMapper.java @@ -0,0 +1,19 @@ +package com.imurs.dao; + + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.DoctorGroup; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Mapper +* @createDate 2025-11-13 12:08:54 +* @Entity generator.entity.DoctorGroup +*/ +public interface DoctorGroupMapper extends BaseMapper { + +} + + + + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/EsRepository.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/EsRepository.java new file mode 100644 index 0000000..6c11922 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/EsRepository.java @@ -0,0 +1,13 @@ +package com.imurs.dao; + + + +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +import com.imurs.entity.BMDReportInfo; + +public interface EsRepository extends ElasticsearchRepository { + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/HomePageShowMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/HomePageShowMapper.java new file mode 100644 index 0000000..9d9ae6d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/HomePageShowMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.HomePageShow; + +public interface HomePageShowMapper extends BaseMapper{ + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ImgArrangeMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ImgArrangeMapper.java new file mode 100644 index 0000000..428805a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/ImgArrangeMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.ImgArrange; + + +public interface ImgArrangeMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentBloodMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentBloodMapper.java new file mode 100644 index 0000000..68edc66 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentBloodMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentBlood; + + +public interface InoneagentBloodMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentEcgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentEcgMapper.java new file mode 100644 index 0000000..b476d42 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentEcgMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentEcg; + + + +public interface InoneagentEcgMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentPersionMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentPersionMapper.java new file mode 100644 index 0000000..499fa3d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentPersionMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentPersion; + + + +public interface InoneagentPersionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentUrineMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentUrineMapper.java new file mode 100644 index 0000000..6bfbfa0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InoneagentUrineMapper.java @@ -0,0 +1,10 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InoneagentUrine; + + + +public interface InoneagentUrineMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InstallModelMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InstallModelMapper.java new file mode 100644 index 0000000..40cc59b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/InstallModelMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Repository; + +@Repository +public interface InstallModelMapper extends BaseMapper { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LiveMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LiveMapper.java new file mode 100644 index 0000000..1cf5413 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LiveMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Live; +import org.springframework.stereotype.Repository; + +@Repository +public interface LiveMapper extends BaseMapper { + + public List selectLivePage(Map map); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LoginRecordMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LoginRecordMapper.java new file mode 100644 index 0000000..93fe976 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/LoginRecordMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.LoginRecord; + + +public interface LoginRecordMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientMapper.java new file mode 100644 index 0000000..5aa8270 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Patient; + + +public interface PatientMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserMapper.java new file mode 100644 index 0000000..c4cb4d4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUser; + +public interface PatientUserMapper extends BaseMapper{ +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java new file mode 100644 index 0000000..c53a1b6 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordImgMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUserRecordImg; + +public interface PatientUserRecordImgMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordMapper.java new file mode 100644 index 0000000..e75fa2c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/PatientUserRecordMapper.java @@ -0,0 +1,12 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.PatientUserRecord; + +public interface PatientUserRecordMapper extends BaseMapper{ + + public List selectRecordPtUserPage(Map map); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/RoleMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/RoleMapper.java new file mode 100644 index 0000000..d9df22c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/RoleMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Role; + + +public interface RoleMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SectionMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SectionMapper.java new file mode 100644 index 0000000..1a579f9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SectionMapper.java @@ -0,0 +1,9 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Section; + + +public interface SectionMapper extends BaseMapper
    { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SysMenuMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SysMenuMapper.java new file mode 100644 index 0000000..360d076 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/SysMenuMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.SysMenu; + +public interface SysMenuMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java new file mode 100644 index 0000000..38bfad9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalClinicalGuidelinesMapper.java @@ -0,0 +1,7 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalClinicalGuidelines; +public interface TotalClinicalGuidelinesMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalInformationMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalInformationMapper.java new file mode 100644 index 0000000..f046e4d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalInformationMapper.java @@ -0,0 +1,13 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalInformation; + +public interface TotalInformationMapper extends BaseMapper { + + public List selectTotalInformationAll(Map map); + public TotalInformation totaTotalInformation(Map map); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalTrainingMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalTrainingMapper.java new file mode 100644 index 0000000..0958734 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TotalTrainingMapper.java @@ -0,0 +1,14 @@ +package com.imurs.dao; + + +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TotalTraining; + +public interface TotalTrainingMapper extends BaseMapper { + + public TotalTraining selectTotanNumberTraining (Map map); + + public Map selectLectureTrainingAndNember(Map map2); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingFlowerMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingFlowerMapper.java new file mode 100644 index 0000000..67c5606 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingFlowerMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingFlower; + +public interface TrainingFlowerMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingMapper.java new file mode 100644 index 0000000..7659102 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.Training; + +public interface TrainingMapper extends BaseMapper { + public List selectTraining(Map map); + + int selectTotalTopicNumber(Map map); + + public List selectBasePage(Map map); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingOpinionMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingOpinionMapper.java new file mode 100644 index 0000000..505a8ec --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingOpinionMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingOpinion; + +public interface TrainingOpinionMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingPlanMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingPlanMapper.java new file mode 100644 index 0000000..49b5c98 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingPlanMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingPlan; + +public interface TrainingPlanMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingRecordMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingRecordMapper.java new file mode 100644 index 0000000..94fd5e7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/TrainingRecordMapper.java @@ -0,0 +1,15 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.TrainingRecord; + +public interface TrainingRecordMapper extends BaseMapper{ + + public List selectAdminRecord(Map map); + + public TrainingRecord selectTrainingRecordById(Long id); + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/UserMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/UserMapper.java new file mode 100644 index 0000000..d468c39 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/UserMapper.java @@ -0,0 +1,21 @@ +package com.imurs.dao; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.User; + + +public interface UserMapper extends BaseMapper{ + + public List selectUserPageByDoc(Map map); + + public User selectUserByUid(Long uid); + + public Map selectByappuserID(Long id); + + public User selectUserByPhone(String phone); + + boolean updateByIds(List users); +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/VideoRecordMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/VideoRecordMapper.java new file mode 100644 index 0000000..19d4495 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/VideoRecordMapper.java @@ -0,0 +1,8 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.VideoRecord; + +public interface VideoRecordMapper extends BaseMapper{ + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/WebLogMapper.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/WebLogMapper.java new file mode 100644 index 0000000..7bac12b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dao/WebLogMapper.java @@ -0,0 +1,20 @@ +package com.imurs.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.imurs.entity.WebLog; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.Date; + +@Mapper +@Repository +public interface WebLogMapper extends BaseMapper { + + /** + * 根据时间差删除表中的数据 + * @param date 当前时间 + * @return + */ + int deleteWebLog(Date date); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java new file mode 100644 index 0000000..1201e76 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/AgoraLoginUserDTO.java @@ -0,0 +1,45 @@ +package com.imurs.dto; + +/** + * @author wang + * @date 2021年05月19日 12:07 + * 监控平台登录用户 + */ +public class AgoraLoginUserDTO { + String username; + String password; + String rid; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + @Override + public String toString() { + return "AgoraLoginUser{" + + "username='" + username + '\'' + + ", password='" + password + '\'' + + ", rid='" + rid + '\'' + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/SpecialistSubmitDto.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/SpecialistSubmitDto.java new file mode 100644 index 0000000..b6f262f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/dto/SpecialistSubmitDto.java @@ -0,0 +1,72 @@ +package com.imurs.dto; + +import java.io.Serializable; + +/** + * 接口bmode/updateSpecialistBySubmit所用的dto类 + */ +public class SpecialistSubmitDto implements Serializable { + + /** + * 联系人id + */ + private Long contactsId; + + /** + * 超声id + */ + private Long bId; + + /** + * 提交报告人id + */ + private Long userId; + + /** + * 提交报告人名字 + */ + private String userName; + + + public Long getContactsId() { + return contactsId; + } + + public void setContactsId(Long contactsId) { + this.contactsId = contactsId; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Override + public String toString() { + return "SpecialistSubmitDto{" + + "contactsId=" + contactsId + + ", bId=" + bId + + ", userId=" + userId + + ", userName='" + userName + '\'' + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AgoraRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AgoraRecord.java new file mode 100644 index 0000000..5a016f9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AgoraRecord.java @@ -0,0 +1,65 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +@TableName("agora_record") +public class AgoraRecord implements Serializable { + @TableId(value = "id", type = IdType.AUTO) + private Long id;; + @TableField("esrd_number") + private String esrdNumber; + @TableField("create_time") + private Date createTime; + @TableField("reg_dir") + private String regDir; + + private static final long serialVersionUID = 1L; + + public AgoraRecord(Long id, String esrdNumber, Date createTime, String regDir) { + this.id = id; + this.esrdNumber = esrdNumber; + this.createTime = createTime; + this.regDir = regDir; + } + + public AgoraRecord() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getRegDir() { + return regDir; + } + + public void setRegDir(String regDir) { + this.regDir = regDir == null ? null : regDir.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AiQcVocabulary.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AiQcVocabulary.java new file mode 100644 index 0000000..643edac --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/AiQcVocabulary.java @@ -0,0 +1,108 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import java.io.Serializable; +import java.util.Date; + +/** + * AI 质控词库实体类 + */ +@TableName("ai_qc_vocabulary") +public class AiQcVocabulary implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String rawText; // 原始文本/错词 + private String correctText; // 正确词 + private String vocabType; // L1/L2/L3/Pinyin + private String status; // draft/approved + private String creatorId; // 提交人ID + private String creatorName; // 提交人姓名 + private Integer frequency; // 出现频次 + private String examineType; // US/CT/MRI + private Date createTime; // 创建时间 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getRawText() { + return rawText; + } + + public void setRawText(String rawText) { + this.rawText = rawText; + } + + public String getCorrectText() { + return correctText; + } + + public void setCorrectText(String correctText) { + this.correctText = correctText; + } + + public String getVocabType() { + return vocabType; + } + + public void setVocabType(String vocabType) { + this.vocabType = vocabType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatorId() { + return creatorId; + } + + public void setCreatorId(String creatorId) { + this.creatorId = creatorId; + } + + public String getCreatorName() { + return creatorName; + } + + public void setCreatorName(String creatorName) { + this.creatorName = creatorName; + } + + public Integer getFrequency() { + return frequency; + } + + public void setFrequency(Integer frequency) { + this.frequency = frequency; + } + + public String getExamineType() { + return examineType; + } + + public void setExamineType(String examineType) { + this.examineType = examineType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApiUrl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApiUrl.java new file mode 100644 index 0000000..118de40 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApiUrl.java @@ -0,0 +1,82 @@ +package com.imurs.entity; + +import java.io.Serializable; + + +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("api_url") +public class ApiUrl implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + private String url; + + private String uname; + + private String state; + + private String usable; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getUsable() { + return usable; + } + + public void setUsable(String usable) { + this.usable = usable; + } + + public ApiUrl(Integer id, String url, String uname, String state, String usable) { + super(); + this.id = id; + this.url = url; + this.uname = uname; + this.state = state; + this.usable = usable; + } + + public ApiUrl() { + super(); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBMode.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBMode.java new file mode 100644 index 0000000..854bb0b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBMode.java @@ -0,0 +1,926 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * b超 + * + * @author D140 + * + */ +@TableName("apply_b_mode") +public class ApplyBMode implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("group_alias") + private String groupAlias; + + @TableField("report_status") + private Long reportStatus; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + private String past; + + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String opinion; + + @TableField("b_see") + private String bSee; + + @TableField("b_hint") + private String bHint; + + private String status; + + private String sex; + + private Integer age; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private List abmSp; + + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + private String conditions; + + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_part_type") + private String examinePartType; + + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("examine_doc_name") + private String examineDocName; + + private Integer state; + + @TableField("enter_date") + private Date enterDate; + + @TableField("enter_chamber") + private String enterChamber; + + @TableField("diagnosis_type") + private String diagnosisType; + + @TableField("out_patien") + private String outPatien; + + @TableField("category_hospital") + private String categoryHospital; + + @TableField("group_hospital") + private String groupHospital; + + @TableField(exist = false) + private List abmList; + + private String btype; + + @TableField("nuh_section") + private String nuhSection; + + @TableField("nuh_time") + private Date nuhTime; + + private String allergy; + + private String present; + + private String examine; + + @TableField("patient_type") + private String patientType; + + @TableField("initial_diagnoses") + private String initialDiagnoses; + + private String section; + + @TableField("dismiss_reason") + private String dismissReason; + + @TableField("consultation_way") + private String consultationWay; + + + @TableField("overall_opinion") + private String overallOpinion; + + @TableField("report_doctor") + private String reportDoctor; + + private Integer active; + + private String modifier; + + @TableField("update_time") + private Date updateTime; + + @TableField("report_time") + private Date reportTime; + + @TableField("login_doc") + private String loginDoc; + + @TableField("nature") + private Integer nature; + + @TableField("examine_part_num") + private Integer examinePartNum; + + /** + * 专家签名的图片地址 + */ + @TableField("specialist_signature") + private String specialistSignature; + + /** + * 基层医生的签名图片地址 + */ + @TableField("doctor_signature") + private String doctorSignature; + + + + + public String getLoginDoc() { + return loginDoc; + } + + public void setLoginDoc(String loginDoc) { + this.loginDoc = loginDoc; + } + + /** + * 超声类型 本地:0 远程:1 + */ + @TableField("is_remote") + private String isRemote; + + /** + * 婚育史 + */ + @TableField("hys") + private String hys; + /** + * 分娩方式栏位: 剖宫产/ 顺产 两项选择 0:剖宫产 1:顺产 + */ + @TableField("fmfs") + private String fmfs; + + /** + * 末次月经时间 + */ + @TableField("lmp") + private Date lmp; + public String getHys() { + return hys; + } + + public void setHys(String hys) { + this.hys = hys; + } + + public String getFmfs() { + return fmfs; + } + + public void setFmfs(String fmfs) { + this.fmfs = fmfs; + } + + public Date getLmp() { + return lmp; + } + + public void setLmp(Date lmp) { + this.lmp = lmp; + } + + public Integer getExaminePartNum() { + return examinePartNum; + } + + public void setExaminePartNum(Integer examinePartNum) { + this.examinePartNum = examinePartNum; + } + + private static final long serialVersionUID = 1L; + + public ApplyBMode() { + } + + public ApplyBMode(Long id, Long docId, Date applyDate, String doctorName, String patientName, String complain, String past, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, String groupType, String initial, String opinion, String bSee, String bHint, String status, String sex, Integer age, String specialist, Long specialistId, List abmSp, String operator, String ptPhone, String ptCard, String ptCity, String esrdNumber, String conditions, Date examineDate, String examinePart, String examinePartType, String hisEsrdNumber, String examineDocName, Integer state, Date enterDate, String enterChamber, String diagnosisType, String outPatien, String categoryHospital, String groupHospital, List abmList, String btype, String nuhSection, Date nuhTime, String allergy, String present, String examine, String patientType, String initialDiagnoses, String section, String dismissReason, String consultationWay, String overallOpinion, String reportDoctor, Integer active, String modifier, Date updateTime, Date reportTime, Integer nature, String specialistSignature, String doctorSignature, String isRemote,Long reportStatus,String groupAlias){ + this.id = id; + this.reportStatus = reportStatus; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.past = past; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.opinion = opinion; + this.bSee = bSee; + this.bHint = bHint; + this.status = status; + this.sex = sex; + this.age = age; + this.specialist = specialist; + this.specialistId = specialistId; + this.abmSp = abmSp; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.conditions = conditions; + this.examineDate = examineDate; + this.examinePart = examinePart; + this.examinePartType = examinePartType; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDocName = examineDocName; + this.state = state; + this.enterDate = enterDate; + this.enterChamber = enterChamber; + this.diagnosisType = diagnosisType; + this.outPatien = outPatien; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.abmList = abmList; + this.btype = btype; + this.nuhSection = nuhSection; + this.nuhTime = nuhTime; + this.allergy = allergy; + this.present = present; + this.examine = examine; + this.patientType = patientType; + this.initialDiagnoses = initialDiagnoses; + this.section = section; + this.dismissReason = dismissReason; + this.consultationWay = consultationWay; + this.overallOpinion = overallOpinion; + this.reportDoctor = reportDoctor; + this.active = active; + this.modifier = modifier; + this.updateTime = updateTime; + this.reportTime = reportTime; + this.nature = nature; + this.specialistSignature = specialistSignature; + this.doctorSignature = doctorSignature; + this.isRemote = isRemote; + this.groupAlias = groupAlias; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public Long getReportStatus() { + return reportStatus; + } + + public void setReportStatus(Long reportStatus) { + this.reportStatus = reportStatus; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public List getAbmSp() { + return abmSp; + } + + public void setAbmSp(List abmSp) { + this.abmSp = abmSp; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getConditions() { + return conditions; + } + + public void setConditions(String conditions) { + this.conditions = conditions; + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getExaminePartType() { + return examinePartType; + } + + public void setExaminePartType(String examinePartType) { + this.examinePartType = examinePartType; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getExamineDocName() { + return examineDocName; + } + + public void setExamineDocName(String examineDocName) { + this.examineDocName = examineDocName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getEnterDate() { + return enterDate; + } + + public void setEnterDate(Date enterDate) { + this.enterDate = enterDate; + } + + public String getEnterChamber() { + return enterChamber; + } + + public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getAbmList() { + return abmList; + } + + public void setAbmList(List abmList) { + this.abmList = abmList; + } + + public String getBtype() { + return btype; + } + + public void setBtype(String btype) { + this.btype = btype; + } + + public String getNuhSection() { + return nuhSection; + } + + public void setNuhSection(String nuhSection) { + this.nuhSection = nuhSection; + } + + public Date getNuhTime() { + return nuhTime; + } + + public void setNuhTime(Date nuhTime) { + this.nuhTime = nuhTime; + } + + public String getAllergy() { + return allergy; + } + + public void setAllergy(String allergy) { + this.allergy = allergy; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getExamine() { + return examine; + } + + public void setExamine(String examine) { + this.examine = examine; + } + + public String getPatientType() { + return patientType; + } + + public void setPatientType(String patientType) { + this.patientType = patientType; + } + + public String getInitialDiagnoses() { + return initialDiagnoses; + } + + public void setInitialDiagnoses(String initialDiagnoses) { + this.initialDiagnoses = initialDiagnoses; + } + + public String getSection() { + return section; + } + + public void setSection(String section) { + this.section = section; + } + + public String getDismissReason() { + return dismissReason; + } + + public void setDismissReason(String dismissReason) { + this.dismissReason = dismissReason; + } + + public String getConsultationWay() { + return consultationWay; + } + + public void setConsultationWay(String consultationWay) { + this.consultationWay = consultationWay; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public String getReportDoctor() { + return reportDoctor; + } + + public void setReportDoctor(String reportDoctor) { + this.reportDoctor = reportDoctor; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public String getModifier() { + return modifier; + } + + public void setModifier(String modifier) { + this.modifier = modifier; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getSpecialistSignature() { + return specialistSignature; + } + + public void setSpecialistSignature(String specialistSignature) { + this.specialistSignature = specialistSignature; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getDoctorSignature() { + return doctorSignature; + } + + public void setDoctorSignature(String doctorSignature) { + this.doctorSignature = doctorSignature; + } + + public String getIsRemote() { + return isRemote; + } + + public void setIsRemote(String isRemote) { + this.isRemote = isRemote; + } + + @Override + public String toString() { + return "ApplyBMode{" + + "id=" + id + + ", docId=" + docId + + ", applyDate=" + applyDate + + ", doctorName='" + doctorName + '\'' + + ", patientName='" + patientName + '\'' + + ", complain='" + complain + '\'' + + ", past='" + past + '\'' + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", chamber='" + chamber + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", groupType='" + groupType + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", status='" + status + '\'' + + ", sex='" + sex + '\'' + + ", age=" + age + + ", specialist='" + specialist + '\'' + + ", specialistId=" + specialistId + + ", abmSp=" + abmSp + + ", operator='" + operator + '\'' + + ", ptPhone='" + ptPhone + '\'' + + ", ptCard='" + ptCard + '\'' + + ", ptCity='" + ptCity + '\'' + + ", esrdNumber='" + esrdNumber + '\'' + + ", conditions='" + conditions + '\'' + + ", examineDate=" + examineDate + + ", examinePart='" + examinePart + '\'' + + ", examinePartType='" + examinePartType + '\'' + + ", hisEsrdNumber='" + hisEsrdNumber + '\'' + + ", examineDocName='" + examineDocName + '\'' + + ", state=" + state + + ", enterDate=" + enterDate + + ", enterChamber='" + enterChamber + '\'' + + ", diagnosisType='" + diagnosisType + '\'' + + ", outPatien='" + outPatien + '\'' + + ", categoryHospital='" + categoryHospital + '\'' + + ", groupHospital='" + groupHospital + '\'' + + ", abmList=" + abmList + + ", btype='" + btype + '\'' + + ", nuhSection='" + nuhSection + '\'' + + ", nuhTime=" + nuhTime + + ", allergy='" + allergy + '\'' + + ", present='" + present + '\'' + + ", examine='" + examine + '\'' + + ", patientType='" + patientType + '\'' + + ", initialDiagnoses='" + initialDiagnoses + '\'' + + ", section='" + section + '\'' + + ", dismissReason='" + dismissReason + '\'' + + ", consultationWay='" + consultationWay + '\'' + + ", overallOpinion='" + overallOpinion + '\'' + + ", reportDoctor='" + reportDoctor + '\'' + + ", active=" + active + + ", modifier='" + modifier + '\'' + + ", updateTime=" + updateTime + + ", reportTime=" + reportTime + + ", nature=" + nature + + ", specialistSignature='" + specialistSignature + '\'' + + ", doctorSignature='" + doctorSignature + '\'' + + ", isRemote='" + isRemote + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeImg.java new file mode 100644 index 0000000..04db013 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeImg.java @@ -0,0 +1,172 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +/*** + * b超图片表 + * @author D140 + * + */ +@TableName("apply_b_mode_img") +public class ApplyBModeImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("b_id") + private Long bId; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("new_imgurl") + private String newImgurl; + + @TableField("img_width") + private String imgWidth; + + @TableField("img_length") + private String imgLength; + + @TableField("file_name") + private String fileName; + + @TableField("img_id") + private Long imgId; + + @TableField("father_id") + private Long fatherId; + + private String status; + + private static final long serialVersionUID = 1L; + + public ApplyBModeImg() { + } + + public ApplyBModeImg(Long id, Long bId, Integer type, String imgUrl, Date createTime, String newImgurl, String imgWidth, String imgLength, String fileName, Long imgId, Long fatherId, String status) { + this.id = id; + this.bId = bId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.newImgurl = newImgurl; + this.imgWidth = imgWidth; + this.imgLength = imgLength; + this.fileName = fileName; + this.imgId = imgId; + this.fatherId = fatherId; + this.status = status; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getNewImgurl() { + return newImgurl; + } + + public void setNewImgurl(String newImgurl) { + this.newImgurl = newImgurl; + } + + public String getImgWidth() { + return imgWidth; + } + + public void setImgWidth(String imgWidth) { + this.imgWidth = imgWidth; + } + + public String getImgLength() { + return imgLength; + } + + public void setImgLength(String imgLength) { + this.imgLength = imgLength; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Long getImgId() { + return imgId; + } + + public void setImgId(Long imgId) { + this.imgId = imgId; + } + + public Long getFatherId() { + return fatherId; + } + + public void setFatherId(Long fatherId) { + this.fatherId = fatherId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java new file mode 100644 index 0000000..1f8bbee --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyBModeSpecialist.java @@ -0,0 +1,165 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_b_mode_specialist") +public class ApplyBModeSpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("b_id") + private Long bId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("diagnosis_type") + private String diagnosisType; + + @TableField("group_date") + private Date groupDate; + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + /** + * 专家号码 + */ + @TableField("contact_phone") + private String contactPhone; + + @TableField(exist = false) + private String dismissReason; + + private static final long serialVersionUID = 1L; + + public String getDismissReason() { + return dismissReason; + } + + public void setDismissReason(String dismissReason) { + this.dismissReason = dismissReason; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public ApplyBModeSpecialist(Long id, Long speId, String speName, Integer state, Long bId, Date createTime, + Date updateTime, String diagnosisType, String dismissReason, String contactPhone, + Date groupDate) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.bId = bId; + this.createTime = createTime; + this.updateTime = updateTime; + this.diagnosisType = diagnosisType; + this.dismissReason = dismissReason; + this.contactPhone = contactPhone; + this.groupDate = groupDate; + } + + public ApplyBModeSpecialist() { + super(); + // TODO Auto-generated constructor stub + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCase.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCase.java new file mode 100644 index 0000000..785fbaa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCase.java @@ -0,0 +1,853 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊表 + * + * @author Server + * + */ +@TableName("apply_case") +public class ApplyCase implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 患者Id + */ + @TableField("patient_id") + private Long patientId; + + /** + * 2:复诊/1:出诊 + */ + private Integer diagnose; + + /** + * 1:急病/2:慢病 + */ + private Integer illness; + + /** + * 主述 + */ + private String complain; + + /** + * 现病史 + */ + private String present; + + /** + * 既往史 + */ + private String past; + + /** + * 初步诊断 + */ + private String initial; + + /** + * 初步治疗计划 + */ + @TableField("cure_plan") + private String curePlan; + + /** + * 患者Id + */ + private String programme; + + /** + * 申请时间 + */ + @TableField("apply_date") + private Date applyDate; + + /** + * 申请医生姓名 + */ + @TableField("apply_name") + private String applyName; + + /** + * 申请医生科室 + */ + private String chamber; + + /** + * 申请医生职称 + */ + @TableField("apply_job") + private String applyJob; + + /** + * 申请医院编号 + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 申请医生id + */ + @TableField("apply_user_id") + private Long applyUserId; + + /** + * 申请医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 转诊理由 + */ + @TableField("change_reason") + private String changeReason; + + /** + * 拟转诊医院 + */ + @TableField("plan_hospital") + private String planHospital; + + /** + * 拟转诊时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("plan_time") + private Date planTime; + + /** + * 拟转诊科室 + */ + @TableField("plan_chamber") + private String planChamber; + + /** + * 拟转诊医院id + */ + @TableField("plan_hospital_id") + private String planHospitalId; + + /** + * 状态 + */ + private String statu; + + /** + * 分配专家编号 + */ + @TableField("specialist_id") + private Long specialistId; + + /** + * 经办人意见 + */ + private String opinion; + + /** + * 受理医生职称 + */ + @TableField("doc_job") + private String docJob; + + /** + * 受理医生意见 + */ + @TableField("doc_explaination") + private String docExplaination; + + /** + * 受理医生的科室 + */ + @TableField("doc_section") + private String docSection; + + /** + * 受理医生id + */ + @TableField("doc_user_id") + private Long docUserId; + + /** + * 受理医生姓名 + */ + @TableField("doc_user_name") + private String docUserName; + + /** + * 最终确认时间 + */ + @TableField("final_date") + private Date finalDate; + + /** + * 下转意见 + */ + private String pronation; + + /** + * 向上转诊还是向下转诊(A、上 B、下) + */ + private String type; + + /** + * 操作人 + */ + private String operator; + + /** + * 基层医院id + */ + @TableField("base_id") + private String baseId; + + /** + * 基层医院暂存字段 + */ + @TableField("plan_base_id") + private String planBaseId; + + /** + * 住院号 + */ + private String inpatient; + + /** + * 医保类型 1:省医保 2:市职工医保 3:市居民医保 4:新农合 5:自费 6:异地医保 7:其他 + */ + @TableField("protect_type") + private Integer protectType; + + /** + * 第一诊断 + */ + @TableField("one_initial") + private String oneInitial; + + /** + * 第二诊断 + */ + @TableField("two_initial") + private String twoInitial; + + /** + * 出院诊断 + */ + @TableField("out_diagnosis") + private String outDiagnosis; + + /** + * 是否双向转诊(Y/N)是否 + */ + @TableField("is_double") + private String isDouble; + + /** + * 患者姓名 + */ + @TableField("pt_name") + private String ptName; + + @TableField("pt_age") + private Integer ptAge; + + @TableField("pt_sex") + private String ptSex; + + /** + * 患者表身份证 + */ + @TableField("pt_card") + private String ptCard; + + /** + * 患者表手机号码 + */ + @TableField("pt_phone") + private String ptPhone; + + /** + * 患者家庭住址 + */ + @TableField("pt_city") + private String ptCity; + + /** + * 病情摘要 + */ + private String digest; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + @TableField(exist = false) + private String planHospitalName; + + @TableField(exist = false) + private String hospitalNames; + + @TableField(exist = false) + private List aciList; + + private static final long serialVersionUID = 1L; + + public ApplyCase() { + super(); + } + + public ApplyCase(Long id, Long patientId, Integer diagnose, Integer illness, String complain, String present, + String past, String initial, String curePlan, String programme, Date applyDate, String applyName, + String chamber, String applyJob, String hospitalId, Long applyUserId, String hospitalName, + String changeReason, String planHospital, Date planTime, String planChamber, String planHospitalId, + String statu, Long specialistId, String opinion, String docJob, String docExplaination, String docSection, + Long docUserId, String docUserName, Date finalDate, String pronation, String type, String operator, + String baseId, String planBaseId, String inpatient, Integer protectType, String oneInitial, + String twoInitial, String outDiagnosis, String isDouble, String ptName, Integer ptAge, String ptSex, + String ptCard, String ptPhone, String ptCity, String digest, String esrdNumber, String hisEsrdNumber, + String outPatien, String planHospitalName, String hospitalNames, List aciList) { + super(); + this.id = id; + this.patientId = patientId; + this.diagnose = diagnose; + this.illness = illness; + this.complain = complain; + this.present = present; + this.past = past; + this.initial = initial; + this.curePlan = curePlan; + this.programme = programme; + this.applyDate = applyDate; + this.applyName = applyName; + this.chamber = chamber; + this.applyJob = applyJob; + this.hospitalId = hospitalId; + this.applyUserId = applyUserId; + this.hospitalName = hospitalName; + this.changeReason = changeReason; + this.planHospital = planHospital; + this.planTime = planTime; + this.planChamber = planChamber; + this.planHospitalId = planHospitalId; + this.statu = statu; + this.specialistId = specialistId; + this.opinion = opinion; + this.docJob = docJob; + this.docExplaination = docExplaination; + this.docSection = docSection; + this.docUserId = docUserId; + this.docUserName = docUserName; + this.finalDate = finalDate; + this.pronation = pronation; + this.type = type; + this.operator = operator; + this.baseId = baseId; + this.planBaseId = planBaseId; + this.inpatient = inpatient; + this.protectType = protectType; + this.oneInitial = oneInitial; + this.twoInitial = twoInitial; + this.outDiagnosis = outDiagnosis; + this.isDouble = isDouble; + this.ptName = ptName; + this.ptAge = ptAge; + this.ptSex = ptSex; + this.ptCard = ptCard; + this.ptPhone = ptPhone; + this.ptCity = ptCity; + this.digest = digest; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.planHospitalName = planHospitalName; + this.hospitalNames = hospitalNames; + this.aciList = aciList; + } + + + public String getOutPatien() { + return outPatien; + } + + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHospitalNames() { + return hospitalNames; + } + + public void setHospitalNames(String hospitalNames) { + this.hospitalNames = hospitalNames; + } + + public String getDocUserName() { + return docUserName; + } + + public void setDocUserName(String docUserName) { + this.docUserName = docUserName; + } + + public String getPlanHospitalName() { + return planHospitalName; + } + + public void setPlanHospitalName(String planHospitalName) { + this.planHospitalName = planHospitalName; + } + + public void setPlanHospitalId(String planHospitalId) { + this.planHospitalId = planHospitalId; + } + + public String getDigest() { + return digest; + } + + public void setDigest(String digest) { + this.digest = digest; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPatientId() { + return patientId; + } + + public void setPatientId(Long patientId) { + this.patientId = patientId; + } + + public Integer getDiagnose() { + return diagnose; + } + + public void setDiagnose(Integer diagnose) { + this.diagnose = diagnose; + } + + public Integer getIllness() { + return illness; + } + + public void setIllness(Integer illness) { + this.illness = illness; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getCurePlan() { + return curePlan; + } + + public void setCurePlan(String curePlan) { + this.curePlan = curePlan; + } + + public String getProgramme() { + return programme; + } + + public void setProgramme(String programme) { + this.programme = programme; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getApplyName() { + return applyName; + } + + public void setApplyName(String applyName) { + this.applyName = applyName; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getApplyJob() { + return applyJob; + } + + public void setApplyJob(String applyJob) { + this.applyJob = applyJob; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Long getApplyUserId() { + return applyUserId; + } + + public void setApplyUserId(Long applyUserId) { + this.applyUserId = applyUserId; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getChangeReason() { + return changeReason; + } + + public void setChangeReason(String changeReason) { + this.changeReason = changeReason; + } + + public String getPlanHospital() { + return planHospital; + } + + public void setPlanHospital(String planHospital) { + this.planHospital = planHospital; + } + + public Date getPlanTime() { + return planTime; + } + + public void setPlanTime(Date planTime) { + this.planTime = planTime; + } + + public String getPlanChamber() { + return planChamber; + } + + public void setPlanChamber(String planChamber) { + this.planChamber = planChamber; + } + + public String getPlanHospitalId() { + return planHospitalId; + } + + public void setPlayHospitalId(String planHospitalId) { + this.planHospitalId = planHospitalId; + } + + public String getStatu() { + return statu; + } + + public void setStatu(String statu) { + this.statu = statu; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getDocJob() { + return docJob; + } + + public void setDocJob(String docJob) { + this.docJob = docJob; + } + + public String getDocExplaination() { + return docExplaination; + } + + public void setDocExplaination(String docExplaination) { + this.docExplaination = docExplaination; + } + + public String getDocSection() { + return docSection; + } + + public void setDocSection(String docSection) { + this.docSection = docSection; + } + + public Long getDocUserId() { + return docUserId; + } + + public void setDocUserId(Long docUserId) { + this.docUserId = docUserId; + } + + public Date getFinalDate() { + return finalDate; + } + + public void setFinalDate(Date finalDate) { + this.finalDate = finalDate; + } + + public String getPronation() { + return pronation; + } + + public void setPronation(String pronation) { + this.pronation = pronation; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getBaseId() { + return baseId; + } + + public void setBaseId(String baseId) { + this.baseId = baseId; + } + + public String getPlanBaseId() { + return planBaseId; + } + + public void setPlanBaseId(String planBaseId) { + this.planBaseId = planBaseId; + } + + public String getInpatient() { + return inpatient; + } + + public void setInpatient(String inpatient) { + this.inpatient = inpatient; + } + + public Integer getProtectType() { + return protectType; + } + + public void setProtectType(Integer protectType) { + this.protectType = protectType; + } + + public String getOneInitial() { + return oneInitial; + } + + public void setOneInitial(String oneInitial) { + this.oneInitial = oneInitial; + } + + public String getTwoInitial() { + return twoInitial; + } + + public void setTwoInitial(String twoInitial) { + this.twoInitial = twoInitial; + } + + public String getOutDiagnosis() { + return outDiagnosis; + } + + public void setOutDiagnosis(String outDiagnosis) { + this.outDiagnosis = outDiagnosis; + } + + public String getIsDouble() { + return isDouble; + } + + public void setIsDouble(String isDouble) { + this.isDouble = isDouble; + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName; + } + + public Integer getPtAge() { + return ptAge; + } + + public void setPtAge(Integer ptAge) { + this.ptAge = ptAge; + } + + public String getPtSex() { + return ptSex; + } + + public void setPtSex(String ptSex) { + this.ptSex = ptSex; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public List getAciList() { + return aciList; + } + + public void setAciList(List aciList) { + this.aciList = aciList; + } + + @Override + public String toString() { + return "ApplyCase [id=" + id + ", patientId=" + patientId + ", diagnose=" + diagnose + ", illness=" + illness + + ", complain=" + complain + ", present=" + present + ", past=" + past + ", initial=" + initial + + ", curePlan=" + curePlan + ", programme=" + programme + ", applyDate=" + applyDate + ", applyName=" + + applyName + ", chamber=" + chamber + ", applyJob=" + applyJob + ", hospitalId=" + hospitalId + + ", applyUserId=" + applyUserId + ", hospitalName=" + hospitalName + ", changeReason=" + changeReason + + ", planHospital=" + planHospital + ", planTime=" + planTime + ", planChamber=" + planChamber + + ", planHospitalId=" + planHospitalId + ", statu=" + statu + ", specialistId=" + specialistId + + ", opinion=" + opinion + ", docJob=" + docJob + ", docExplaination=" + docExplaination + + ", docSection=" + docSection + ", docUserId=" + docUserId + ", docUserName=" + docUserName + + ", finalDate=" + finalDate + ", pronation=" + pronation + ", type=" + type + ", operator=" + operator + + ", baseId=" + baseId + ", planBaseId=" + planBaseId + ", inpatient=" + inpatient + ", protectType=" + + protectType + ", oneInitial=" + oneInitial + ", twoInitial=" + twoInitial + ", outDiagnosis=" + + outDiagnosis + ", isDouble=" + isDouble + ", ptName=" + ptName + ", ptAge=" + ptAge + ", ptSex=" + + ptSex + ", ptCard=" + ptCard + ", ptPhone=" + ptPhone + ", ptCity=" + ptCity + ", digest=" + digest + + ", planHospitalName=" + planHospitalName + ", hospitalNames=" + hospitalNames + ", aciList=" + aciList + + "]"; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCaseImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCaseImg.java new file mode 100644 index 0000000..f4edbf9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyCaseImg.java @@ -0,0 +1,130 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊图片表 + * @author Server + * + */ +@TableName("apply_case_img") +public class ApplyCaseImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 医生id + */ +// @TableField("doc_id") +// private Long docId; + + /** + * 患者id + */ +// @TableField("patient_id") +// private Long patientId; + + /** + * 就诊表id + */ + @TableField("case_id") + private Long caseId; + + /** + * 类型 1:病历资料 2:检查资料 3:B超资料 4:病理资料 5:DR资料 6:CT/MR资料 + */ + private Integer type; + + /** + * 图片地址 + */ + @TableField("img_url") + private String imgUrl; + + + @TableField("create_time") + private Date createTime; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public ApplyCaseImg(Long id, Long caseId, Integer type, String imgUrl, Date createTime, String fileName) { + super(); + this.id = id; + this.caseId = caseId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.fileName = fileName; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public void setType(Integer type) { + this.type = type; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public ApplyCaseImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCaseId() { + return caseId; + } + + public void setCaseId(Long caseId) { + this.caseId = caseId; + } + + public Integer getType() { + return type; + } + + public void setiType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setiImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java new file mode 100644 index 0000000..c6a783d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsulationSpecialist.java @@ -0,0 +1,221 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 远程会诊专家表 + * + * @author Server + * + */ +@TableName("apply_consulation_specialist") +public class ApplyConsulationSpecialist implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 视频意见 + */ + @TableField("video_idea") + private String videoIdea; + + /** + * 综合意见 + */ + @TableField("opinion_all") + private String opinionAll; + + /** + * 专家姓名 + */ + @TableField("spe_name") + private String speName; + + /** + * 状态 + */ + private Integer state; + + /** + * 远程会诊id + */ + @TableField("con_id") + private Long conId; + + /** + * 创建日期 + */ + @TableField("create_time") + private Date createTime; + + /** + * 修改日期 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 专家id + */ + @TableField("spe_id") + private Long speId; + + /** + * 可分配专家个数 + */ + @TableField("spe_number") + private Integer speNumber; + + /** + * 会诊时间 + */ + @TableField(exist = false) + private Date conTime; + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + /** + * 专家号码 + */ + @TableField("contact_phone") + private String contactPhone; + + + public Integer getSpeNumber() { + return speNumber; + } + + public void setSpeNumber(Integer speNumber) { + this.speNumber = speNumber; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getVideoIdea() { + return videoIdea; + } + + public void setVideoIdea(String videoIdea) { + this.videoIdea = videoIdea; + } + + public String getOpinionAll() { + return opinionAll; + } + + public void setOpinionAll(String opinionAll) { + this.opinionAll = opinionAll; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getConTime() { + return conTime; + } + + public void setConTime(Date conTime) { + this.conTime = conTime; + } + + public ApplyConsulationSpecialist() { + super(); + } + + public ApplyConsulationSpecialist(Long id, String videoIdea, String opinionAll, String speName, Integer state, + Long conId, Date createTime, Date updateTime, Long speId, Integer speNumber, Date conTime ,String contactPhone) { + super(); + this.id = id; + this.videoIdea = videoIdea; + this.opinionAll = opinionAll; + this.speName = speName; + this.state = state; + this.conId = conId; + this.createTime = createTime; + this.updateTime = updateTime; + this.speId = speId; + this.speNumber = speNumber; + this.conTime = conTime; + this.contactPhone = contactPhone; + + } + + @Override + public String toString() { + return "ApplyConsulationSpecialist [id=" + id + ", videoIdea=" + videoIdea + ", opinionAll=" + opinionAll + + ", speName=" + speName + ", state=" + state + ", conId=" + conId + ", createTime=" + createTime + + ", updateTime=" + updateTime + ", speId=" + speId + ", speNumber=" + speNumber + ", conTime=" + + conTime + "]"; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultation.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultation.java new file mode 100644 index 0000000..6849443 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultation.java @@ -0,0 +1,826 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 会诊申请id + * + * @author Server + * + */ +@TableName("apply_consultation") +public class ApplyConsultation implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 医生编号 + */ + @TableField("doc_id") + private Long docId; + + /** + * 申请日期 + */ + @TableField("apply_date") + private Date applyDate; + + /** + * 医生姓名 + */ + @TableField("doctor_name") + private String doctorName; + + /** + * 患者姓名 + */ + @TableField("patient_name") + private String patientName; + + /** + * 主述 + */ + private String complain; + + /** + * 过敏史 + */ + private String allergy; + + /** + * 既往史 + */ + private String past; + + /** + * 鉴别诊断 + */ + private String identify; + + /** + * + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + /** + * 所属医院 + */ + @TableField("category_hospital") + private String categoryHospital; + + /** + * 所属医院id + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + + /** + * 申请专科 + */ + private String chamber; +// /** +// * 会诊科室 +// * / + @TableField("group_chamber") + private String groupChamber; + /** + * 会诊医院 + */ + @TableField("group_hospital") + private String groupHospital; + + /** + * 会诊医院id + */ + @TableField("group_hospital_id") + private String groupHospitalId; + + /** + * 会诊类型 + */ + @TableField("group_type") + private String groupType; + + /** + * 初步诊断 + */ + private String initial; + + /** + * 现病史 + */ + private String present; + + /** + * 治疗计划 + */ + @TableField("cure_plan") + private String curePlan; + + /** + * 意见 + */ + private String opinion; + + /** + * 检查 + */ + private String examine; + + /** + * 状态 + */ + private String status; + + private String sex; + + private Integer age; + + /** + * 分配专家 + */ + private String specialist; + + /** + * 专家编号 + */ + @TableField("specialist_id") + private Long specialistId; + + /** + * 视频意见 + */ + @TableField("video_idea") + private String videoIdea; + + /** + * 椅旁意见 + */ + @TableField("cerec_idea") + private String cerecIdea; + + /** + * 申请诊疗类型(YP为椅旁会诊 SP为视频会诊 LX 为远程阅片) + */ + @TableField("diagnosis_type") + private String diagnosisType; + + /** + * 综合意见 + */ + @TableField("opinion_all") + private String opinionAll; + + /** + * 操作人 + */ + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + /** + * 家庭住址 + */ + @TableField("pt_city") + private String ptCity; + + /** + * 病情摘要 + */ + private String digest; + + @TableField("nuh_time") + private Date nuhTime; + + @TableField("nuh_section") + private String nuhSection; + + /** + * type:向上转诊还是向下转诊(A、上 B、下) + */ + private String conditions; + + /** + * 患者病案号 + */ + @TableField("esrd_number") + private String esrdNumber; + + /** + * 患者病案号 + */ + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + private String code; + + @TableField("ecg_opinion") + private String ecgOpinion; + + @TableField("lis_opinion") + private String lisOpinion; + + @TableField("pathology_opinion") + private String pathologyOpinion; + + @TableField("patient_type") + private Integer patientType; + + @TableField("report_doctor") + private String reportDoctor; + + @TableField(exist = false) + private String state; + + @TableField("case_analysis") + private String caseAnalysis; + + @TableField("primary_diagnosis") + private String primaryDiagnosis; + + @TableField("diagnosis_plan") + private String diagnosisPlan; + + @TableField("diagnosis_idea") + private String diagnosisIdea; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_see") + private String examineSee; + + @TableField("examine_hint") + private String examineHint; + + @TableField(exist = false) + private List aciList; + + @TableField(exist = false) + private List acsList; + + private static final long serialVersionUID = 1L; + + public String getExamineSee() { + return examineSee; + } + + public void setExamineSee(String examineSee) { + this.examineSee = examineSee; + } + public String getExamineHint() { + return examineHint; + } + + public void setExamineHint(String examineHint) { + this.examineHint = examineHint; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getPathologyOpinion() { + return pathologyOpinion; + } + + public void setPathologyOpinion(String pathologyOpinion) { + this.pathologyOpinion = pathologyOpinion; + } + + public String getLisOpinion() { + return lisOpinion; + } + + public void setLisOpinion(String lisOpinion) { + this.lisOpinion = lisOpinion; + } + + public String getEcgOpinion() { + return ecgOpinion; + } + + public void setEcgOpinion(String ecgOpinion) { + this.ecgOpinion = ecgOpinion; + } + + public ApplyConsultation() { + super(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getConditions() { + return conditions; + } + + public void setConditions(String conditions) { + this.conditions = conditions; + } + + public List getAcsList() { + return acsList; + } + + public void setAcsList(List acsList) { + this.acsList = acsList; + } + + public Date getNuhTime() { + return nuhTime; + } + + public void setNuhTime(Date nuhTime) { + this.nuhTime = nuhTime; + } + + public String getNuhSection() { + return nuhSection; + } + + public void setNuhSection(String nuhSection) { + this.nuhSection = nuhSection; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName; + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain; + } + + public String getAllergy() { + return allergy; + } + + public void setAllergy(String allergy) { + this.allergy = allergy; + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past; + } + + public String getIdentify() { + return identify; + } + + public void setIdentify(String identify) { + this.identify = identify; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getPresent() { + return present; + } + + public void setPresent(String present) { + this.present = present; + } + + public String getCurePlan() { + return curePlan; + } + + public void setCurePlan(String curePlan) { + this.curePlan = curePlan; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getExamine() { + return examine; + } + + public void setExamine(String examine) { + this.examine = examine; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getVideoIdea() { + return videoIdea; + } + + public void setVideoIdea(String videoIdea) { + this.videoIdea = videoIdea; + } + + public String getCerecIdea() { + return cerecIdea; + } + + public void setCerecIdea(String cerecIdea) { + this.cerecIdea = cerecIdea; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public String getOpinionAll() { + return opinionAll; + } + + public void setOpinionAll(String opinionAll) { + this.opinionAll = opinionAll; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard; + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity; + } + + public String getDigest() { + return digest; + } + + public void setDigest(String digest) { + this.digest = digest; + } + + public List getAciList() { + return aciList; + } + + public void setAciList(List aciList) { + this.aciList = aciList; + } + + public Integer getPatientType() { + return patientType; + } + + public void setPatientType(Integer patientType) { + this.patientType = patientType; + } + + public String getReportDoctor() { + return reportDoctor; + } + + public void setReportDoctor(String reportDoctor) { + this.reportDoctor = reportDoctor; + } + + public String getCaseAnalysis() { + return caseAnalysis; + } + + public void setCaseAnalysis(String caseAnalysis) { + this.caseAnalysis = caseAnalysis; + } + + public String getPrimaryDiagnosis() { + return primaryDiagnosis; + } + + public void setPrimaryDiagnosis(String primaryDiagnosis) { + this.primaryDiagnosis = primaryDiagnosis; + } + + public String getDiagnosisPlan() { + return diagnosisPlan; + } + + public void setDiagnosisPlan(String diagnosisPlan) { + this.diagnosisPlan = diagnosisPlan; + } + + public String getDiagnosisIdea() { + return diagnosisIdea; + } + + public void setDiagnosisIdea(String diagnosisIdea) { + this.diagnosisIdea = diagnosisIdea; + } + + public String getGroupChamber() { + return groupChamber; + } + + public void setGroupChamber(String groupChamber) { + this.groupChamber = groupChamber; + } + + public ApplyConsultation(Long id, Long docId, Date applyDate, String doctorName, String patientName, + String complain, String allergy, String past, String identify, Date groupDate, String categoryHospital, + String categoryHospitalId, String chamber, String groupHospital, String groupHospitalId, String groupType, + String initial, String present, String curePlan, String opinion, String examine, String status, String sex, + Integer age, String specialist, Long specialistId, String videoIdea, String cerecIdea, String diagnosisType, + String opinionAll, String operator, String ptPhone, String ptCard, String ptCity, String digest, + Date nuhTime, String nuhSection, String conditions, String esrdNumber, String hisEsrdNumber, + String outPatien, String code, String ecgOpinion, String lisOpinion, String pathologyOpinion, + Integer patientType, String reportDoctor, String state, String caseAnalysis, String primaryDiagnosis, + String diagnosisPlan, String diagnosisIdea,String examinePart,String examineSee,String examineHint, List aciList, + List acsList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.allergy = allergy; + this.past = past; + this.identify = identify; + this.groupDate = groupDate; + this.categoryHospital = categoryHospital; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospital = groupHospital; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.present = present; + this.curePlan = curePlan; + this.opinion = opinion; + this.examine = examine; + this.status = status; + this.sex = sex; + this.age = age; + this.specialist = specialist; + this.specialistId = specialistId; + this.videoIdea = videoIdea; + this.cerecIdea = cerecIdea; + this.diagnosisType = diagnosisType; + this.opinionAll = opinionAll; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.digest = digest; + this.nuhTime = nuhTime; + this.nuhSection = nuhSection; + this.conditions = conditions; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.code = code; + this.ecgOpinion = ecgOpinion; + this.lisOpinion = lisOpinion; + this.pathologyOpinion = pathologyOpinion; + this.patientType = patientType; + this.reportDoctor = reportDoctor; + this.state = state; + this.caseAnalysis = caseAnalysis; + this.primaryDiagnosis = primaryDiagnosis; + this.diagnosisPlan = diagnosisPlan; + this.diagnosisIdea = diagnosisIdea; + this.examinePart = examinePart; + this.examineSee=examineSee; + this.examineHint=examineHint; + this.aciList = aciList; + this.acsList = acsList; + } + + @Override + public String toString() { + return "ApplyConsultation [groupChamber=" + groupChamber + "]"; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultationImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultationImg.java new file mode 100644 index 0000000..ebbf506 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyConsultationImg.java @@ -0,0 +1,158 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 就诊图片表 + * + * @author Server + * + */ +@TableName("apply_consultation_img") +public class ApplyConsultationImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 患者id + */ + @TableField("patient_id") + private Long patientId; + + /** + * 就诊表id + */ + @TableField("con_id") + private Long conId; + + /** + * 类型 1:病历资料 2:检查资料 3:B超资料 4:病理资料 5:DR资料 6:CT/MR资料 + */ + private Integer type; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 图片类型诊断意见 + */ + private String opinion; + + /** + * 创建时间 + */ + @TableField("create_time") + private String createTime; + + @TableField("file_name") + private String fileName; + + + private static final long serialVersionUID = 1L; + + public ApplyConsultationImg() { + super(); + } + + public ApplyConsultationImg(Long id, Long docId, Long patientId, Long conId, Integer type, String imgUrl, + String opinion, String createTime, String fileName) { + super(); + this.id = id; + this.docId = docId; + this.patientId = patientId; + this.conId = conId; + this.type = type; + this.imgUrl = imgUrl; + this.opinion = opinion; + this.createTime = createTime; + this.fileName = fileName; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getPatientId() { + return patientId; + } + + public void setPatientId(Long patientId) { + this.patientId = patientId; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyDoctorPromote.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyDoctorPromote.java new file mode 100644 index 0000000..b638a97 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyDoctorPromote.java @@ -0,0 +1,661 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医生进修申请表 + * + * @author Server + * + */ +@TableName("apply_doctor_promote") +public class ApplyDoctorPromote implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 医生账号(用于基层添加进修申请)医生登陆后可以查看到记录 + */ + private Long account; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 医生姓名 + */ + @TableField("doctor_name") + private String doctorName; + + private String sex; + + private Integer age; + + /** + * 籍贯 + */ + private String nationality; + + /** + * 名族 + */ + private String nation; + + /** + * 省 + */ + private String province; + + /** + * 市/区 + */ + private String city; + + /** + * 政治面貌 + */ + @TableField("political_outlook") + private String politicalOutlook; + + /** + * 文化程度 + */ + @TableField("cultural_level") + private String culturalLevel; + + /** + * 健康状况 + */ + private String health; + + /** + * 职称、职务 + */ + private String job; + + /** + * 工作单位 + */ + @TableField("work_company") + private String workCompany; + + /** + * 邮政编码 + */ + private String code; + + /** + * 电话号码 + */ + @TableField("phone_number") + private String phoneNumber; + + /** + * 手机号码 + */ + private String phone; + + /** + * 执业情况 + */ + private String practice; + + /** + * 申请进修专业 + */ + @TableField("apply_major") + private String applyMajor; + + /** + * 进修开始时间 + */ + @TableField("apply_start_time") + private Date applyStartTime; + + /** + * 进修结束时间 + */ + @TableField("apply_end_time") + private Date applyEndTime; + + /** + * 进修天数(月份) + */ + @TableField("apply_day") + private String applyDay; + + /** + * 拟联系进修科室 + */ + @TableField("apply_chamber") + private String applyChamber; + + /** + * 入校开始时间 和毕业时间 + */ + @TableField("school_start_end_time") + private String schoolStartEndTime; + + /** + * 学校名称 + */ + @TableField("school_name") + private String schoolName; + + /** + * 学校备注 + */ + @TableField("school_remark") + private String schoolRemark; + + /** + * 工作开始时间以及结束时间 + */ + @TableField("work_start_end_time") + private String workStartEndTime; + + /** + * 工作职称 + */ + @TableField("work_chamber") + private String workChamber; + + /** + * 工作单位名称 + */ + @TableField("work_chamber_name") + private String workChamberName; + + /** + * 本人表现及工作能力 + */ + @TableField("work_remark") + private String workRemark; + + /** + * 进修专业要求 + */ + @TableField("apply_rule") + private String applyRule; + + /** + * 本人外语水平 + */ + private String language; + + /** + * 推荐(选送)单位意见 + */ + private String opinion; + + /** + * 填写意见时间 + */ + @TableField("opinion_time") + private Date opinionTime; + + /** + * 进修单位意见 + */ + @TableField("apply_opinion") + private String applyOpinion; + + /** + * 进修单位意见填写时间 + */ + @TableField("apply_opinion_time") + private Date applyOpinionTime; + + /** + * 医生头像 + */ + @TableField("doctor_img") + private String doctorImg; + + /** + * + * 待医院处理D 、待进修医院处理DS、医院撤销N、进修医院撤销NS、进修医院同意Y + * D DS N NS Y + */ + private String status; + + /** + * 进修申请单位Id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 进修申请单位名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 进修申请单位科室名称 + */ + @TableField("hospital_section") + private String hospitalSection; + + /** + * 医院类型(医联体、对口资源、远程协助、名医工作室)3/4/5/8 + */ + private Integer type; + + + private static final long serialVersionUID = 1L; + + public ApplyDoctorPromote() { + super(); + } + + public ApplyDoctorPromote(Long id, Long account, Long docId, String doctorName, String sex, Integer age, + String nationality, String nation, String province, String city, String politicalOutlook, + String culturalLevel, String health, String job, String workCompany, String code, String phoneNumber, + String phone, String practice, String applyMajor, Date applyStartTime, Date applyEndTime, String applyDay, + String applyChamber, String schoolStartEndTime, String schoolName, String schoolRemark, + String workStartEndTime, String workChamber, String workChamberName, String workRemark, String applyRule, + String language, String opinion, Date opinionTime, String applyOpinion, Date applyOpinionTime, + String doctorImg, String status, String hospitalId, String hospitalName, String hospitalSection, + Integer type) { + super(); + this.id = id; + this.account = account; + this.docId = docId; + this.doctorName = doctorName; + this.sex = sex; + this.age = age; + this.nationality = nationality; + this.nation = nation; + this.province = province; + this.city = city; + this.politicalOutlook = politicalOutlook; + this.culturalLevel = culturalLevel; + this.health = health; + this.job = job; + this.workCompany = workCompany; + this.code = code; + this.phoneNumber = phoneNumber; + this.phone = phone; + this.practice = practice; + this.applyMajor = applyMajor; + this.applyStartTime = applyStartTime; + this.applyEndTime = applyEndTime; + this.applyDay = applyDay; + this.applyChamber = applyChamber; + this.schoolStartEndTime = schoolStartEndTime; + this.schoolName = schoolName; + this.schoolRemark = schoolRemark; + this.workStartEndTime = workStartEndTime; + this.workChamber = workChamber; + this.workChamberName = workChamberName; + this.workRemark = workRemark; + this.applyRule = applyRule; + this.language = language; + this.opinion = opinion; + this.opinionTime = opinionTime; + this.applyOpinion = applyOpinion; + this.applyOpinionTime = applyOpinionTime; + this.doctorImg = doctorImg; + this.status = status; + this.hospitalId = hospitalId; + this.hospitalName = hospitalName; + this.hospitalSection = hospitalSection; + this.type = type; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAccount() { + return account; + } + + public void setAccount(Long account) { + this.account = account; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getNationality() { + return nationality; + } + + public void setNationality(String nationality) { + this.nationality = nationality; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getPoliticalOutlook() { + return politicalOutlook; + } + + public void setPoliticalOutlook(String politicalOutlook) { + this.politicalOutlook = politicalOutlook; + } + + public String getCulturalLevel() { + return culturalLevel; + } + + public void setCulturalLevel(String culturalLevel) { + this.culturalLevel = culturalLevel; + } + + public String getHealth() { + return health; + } + + public void setHealth(String health) { + this.health = health; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getWorkCompany() { + return workCompany; + } + + public void setWorkCompany(String workCompany) { + this.workCompany = workCompany; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPractice() { + return practice; + } + + public void setPractice(String practice) { + this.practice = practice; + } + + public String getApplyMajor() { + return applyMajor; + } + + public void setApplyMajor(String applyMajor) { + this.applyMajor = applyMajor; + } + + public Date getApplyStartTime() { + return applyStartTime; + } + + public void setApplyStartTime(Date applyStartTime) { + this.applyStartTime = applyStartTime; + } + + public Date getApplyEndTime() { + return applyEndTime; + } + + public void setApplyEndTime(Date applyEndTime) { + this.applyEndTime = applyEndTime; + } + + public String getApplyDay() { + return applyDay; + } + + public void setApplyDay(String applyDay) { + this.applyDay = applyDay; + } + + public String getApplyChamber() { + return applyChamber; + } + + public void setApplyChamber(String applyChamber) { + this.applyChamber = applyChamber; + } + + public String getSchoolStartEndTime() { + return schoolStartEndTime; + } + + public void setSchoolStartEndTime(String schoolStartEndTime) { + this.schoolStartEndTime = schoolStartEndTime; + } + + public String getSchoolName() { + return schoolName; + } + + public void setSchoolName(String schoolName) { + this.schoolName = schoolName; + } + + public String getSchoolRemark() { + return schoolRemark; + } + + public void setSchoolRemark(String schoolRemark) { + this.schoolRemark = schoolRemark; + } + + public String getWorkStartEndTime() { + return workStartEndTime; + } + + public void setWorkStartEndTime(String workStartEndTime) { + this.workStartEndTime = workStartEndTime; + } + + public String getWorkChamber() { + return workChamber; + } + + public void setWorkChamber(String workChamber) { + this.workChamber = workChamber; + } + + public String getWorkChamberName() { + return workChamberName; + } + + public void setWorkChamberName(String workChamberName) { + this.workChamberName = workChamberName; + } + + public String getWorkRemark() { + return workRemark; + } + + public void setWorkRemark(String workRemark) { + this.workRemark = workRemark; + } + + public String getApplyRule() { + return applyRule; + } + + public void setApplyRule(String applyRule) { + this.applyRule = applyRule; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getApplyOpinion() { + return applyOpinion; + } + + public void setApplyOpinion(String applyOpinion) { + this.applyOpinion = applyOpinion; + } + + public Date getApplyOpinionTime() { + return applyOpinionTime; + } + + public void setApplyOpinionTime(Date applyOpinionTime) { + this.applyOpinionTime = applyOpinionTime; + } + + public String getDoctorImg() { + return doctorImg; + } + + public void setDoctorImg(String doctorImg) { + this.doctorImg = doctorImg; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalSection() { + return hospitalSection; + } + + public void setHospitalSection(String hospitalSection) { + this.hospitalSection = hospitalSection; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcg.java new file mode 100644 index 0000000..134fbe4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcg.java @@ -0,0 +1,586 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg") +public class ApplyEcg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("apply_chamber") + private String applyChamber; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String status; + + private String sex; + + private Integer age; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_doc_name") + private String examineDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("report_date") + private Date reportDate; + + @TableField("report_doc_name") + private String reportDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("audit_date") + private Date auditDate; + + @TableField("audit_doc_name") + private String auditDocName; + + @TableField("out_patient") + private String outPatient; + + @TableField("clinic_diagnos") + private String clinicDiagnos; + + private String diagnos; + + @TableField("electric_axis") + private String electricAxis; + + private String qrs; + + private String pr; + + private String qt; + + private String qtc; + + private String sv1; + + private String rv5; + + private String rs; + + private String hr; + + @TableField("out_patien") + private String outPatien; + + private String code; + + @TableField("pdf_url") + private String pdfUrl; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + @TableField(exist = false) + private List ecgImgList; + + private static final long serialVersionUID = 1L; + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getEcgImgList() { + return ecgImgList; + } + + public void setEcgImgList(List ecgImgList) { + this.ecgImgList = ecgImgList; + } + + public ApplyEcg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getApplyChamber() { + return applyChamber; + } + + public void setApplyChamber(String applyChamber) { + this.applyChamber = applyChamber == null ? null : applyChamber.trim(); + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain == null ? null : complain.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial == null ? null : initial.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone == null ? null : ptPhone.trim(); + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity == null ? null : ptCity.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExamineDocName() { + return examineDocName; + } + + public void setExamineDocName(String examineDocName) { + this.examineDocName = examineDocName == null ? null : examineDocName.trim(); + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + + public String getReportDocName() { + return reportDocName; + } + + public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName == null ? null : reportDocName.trim(); + } + + public Date getAuditDate() { + return auditDate; + } + + public void setAuditDate(Date auditDate) { + this.auditDate = auditDate; + } + + public String getAuditDocName() { + return auditDocName; + } + + public void setAuditDocName(String auditDocName) { + this.auditDocName = auditDocName == null ? null : auditDocName.trim(); + } + + public String getOutPatient() { + return outPatient; + } + + public void setOutPatient(String outPatient) { + this.outPatient = outPatient == null ? null : outPatient.trim(); + } + + public String getClinicDiagnos() { + return clinicDiagnos; + } + + public void setClinicDiagnos(String clinicDiagnos) { + this.clinicDiagnos = clinicDiagnos == null ? null : clinicDiagnos.trim(); + } + + public String getDiagnos() { + return diagnos; + } + + public void setDiagnos(String diagnos) { + this.diagnos = diagnos == null ? null : diagnos.trim(); + } + + public String getElectricAxis() { + return electricAxis; + } + + public void setElectricAxis(String electricAxis) { + this.electricAxis = electricAxis == null ? null : electricAxis.trim(); + } + + public String getQrs() { + return qrs; + } + + public void setQrs(String qrs) { + this.qrs = qrs == null ? null : qrs.trim(); + } + + public String getPr() { + return pr; + } + + public void setPr(String pr) { + this.pr = pr == null ? null : pr.trim(); + } + + public String getQt() { + return qt; + } + + public void setQt(String qt) { + this.qt = qt == null ? null : qt.trim(); + } + + public String getQtc() { + return qtc; + } + + public void setQtc(String qtc) { + this.qtc = qtc == null ? null : qtc.trim(); + } + + public String getSv1() { + return sv1; + } + + public void setSv1(String sv1) { + this.sv1 = sv1 == null ? null : sv1.trim(); + } + + public String getRv5() { + return rv5; + } + + public void setRv5(String rv5) { + this.rv5 = rv5 == null ? null : rv5.trim(); + } + + public String getRs() { + return rs; + } + + public void setRs(String rs) { + this.rs = rs == null ? null : rs.trim(); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getPdfUrl() { + return pdfUrl; + } + + public void setPdfUrl(String pdfUrl) { + this.pdfUrl = pdfUrl; + } + + public ApplyEcg(Long id, Long docId, Date applyDate, String applyChamber, String doctorName, String patientName, + String complain, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String initial, String status, String sex, Integer age, String ptPhone, String ptCard, + String ptCity, String esrdNumber, String hisEsrdNumber, Date examineDate, String examineDocName, + Date reportDate, String reportDocName, Date auditDate, String auditDocName, String outPatient, + String clinicDiagnos, String diagnos, String electricAxis, String qrs, String pr, String qt, String qtc, + String sv1, String rv5, String rs, String hr, String outPatien, String code, String pdfUrl, + String specialist, Long specialistId, String categoryHospital, String groupHospital, + List ecgImgList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.applyChamber = applyChamber; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.status = status; + this.sex = sex; + this.age = age; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDate = examineDate; + this.examineDocName = examineDocName; + this.reportDate = reportDate; + this.reportDocName = reportDocName; + this.auditDate = auditDate; + this.auditDocName = auditDocName; + this.outPatient = outPatient; + this.clinicDiagnos = clinicDiagnos; + this.diagnos = diagnos; + this.electricAxis = electricAxis; + this.qrs = qrs; + this.pr = pr; + this.qt = qt; + this.qtc = qtc; + this.sv1 = sv1; + this.rv5 = rv5; + this.rs = rs; + this.hr = hr; + this.outPatien = outPatien; + this.code = code; + this.pdfUrl = pdfUrl; + this.specialist = specialist; + this.specialistId = specialistId; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.ecgImgList = ecgImgList; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgImg.java new file mode 100644 index 0000000..a922bf0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgImg.java @@ -0,0 +1,97 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg_img") +public class ApplyEcgImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("e_id") + private Long eId; + + @TableField("file_name") + private String fileName; + + + private static final long serialVersionUID = 1L; + + + public ApplyEcgImg(Long id, Integer type, String imgUrl, Date createTime, Long eId, String fileName) { + super(); + this.id = id; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.eId = eId; + this.fileName = fileName; + } + + public ApplyEcgImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long geteId() { + return eId; + } + + public void seteId(Long eId) { + this.eId = eId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java new file mode 100644 index 0000000..c7c0d54 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyEcgSpecialist.java @@ -0,0 +1,107 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_ecg_specialist") +public class ApplyEcgSpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("e_id") + private Long eId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private static final long serialVersionUID = 1L; + + public ApplyEcgSpecialist() { + super(); + } + + public ApplyEcgSpecialist(Long id, Long speId, String speName, Integer state, Long eId, Date createTime, + Date updateTime) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.eId = eId; + this.createTime = createTime; + this.updateTime = updateTime; + } + + public Long geteId() { + return eId; + } + + public void seteId(Long eId) { + this.eId = eId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName == null ? null : speName.trim(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformation.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformation.java new file mode 100644 index 0000000..dbcac4e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformation.java @@ -0,0 +1,900 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 基层医院申请表 + * + * @author Server + * + */ +/** + * @author dgg + * + */ +@TableName("apply_information") +public class ApplyInformation implements Serializable { + + private String id; + + /** + * 手机号码/账号 + */ + private String account; + + private String password; + private String layout; + + private Long rid; + + /** + * 医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + /** + * 医生组别名 + */ + @TableField("group_alias") + private String groupAlias; + + /** + * 医院地址 + */ + @TableField("hospital_site") + private String hospitalSite; + + /** + * 上级 + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 成立时间 + */ + @TableField("setup_time") + private Date setupTime; + + /** + * 主要科室 + */ + private String chamber; + + /** + * 在职人数 + */ + @TableField("be_jobs") + private Integer beJobs; + + /** + * 高级职称人数 + */ + @TableField("advanced_job") + private Integer advancedJob; + + /** + * 中级职称人数 + */ + @TableField("middle_job") + private Integer middleJob; + + /** + * 院长姓名 + */ + @TableField("dean_name") + private String deanName; + + /** + * 院长学历 + */ + @TableField("dean_education") + private String deanEducation; + + /** + * 院长专业 + */ + @TableField("dean_major") + private String deanMajor; + + /** + * 院长职称 + */ + @TableField("dean_job") + private String deanJob; + + /** + * 院长电话 + */ + @TableField("dean_phone") + private String deanPhone; + + /** + * 科室负责人 + */ + @TableField("chamber_name") + private String chamberName; + + /** + * 科室负责人学历 + */ + @TableField("chamber_education") + private String chamberEducation; + + /** + * 科室负责人专业 + */ + @TableField("chamber_major") + private String chamberMajor; + + /** + * 科室负责人职称 + */ + @TableField("chamber_job") + private String chamberJob; + + /** + * 科室负责人电话 + */ + @TableField("chamber_phone") + private String chamberPhone; + + /** + * 财务负责人 + */ + @TableField("finance_name") + private String financeName; + + /** + * 财务负责人学历 + */ + @TableField("finance_education") + private String financeEducation; + + /** + * 财务负责人专业 + */ + @TableField("finance_major") + private String financeMajor; + + /** + * 财务负责人职称 + */ + @TableField("finance_job") + private String financeJob; + + /** + * 财务负责人电话 + */ + @TableField("finance_phone") + private String financePhone; + + /** + * 开户银行 + */ + @TableField("acc_bank") + private String accBank; + + /** + * 开户账号 + */ + @TableField("accn_nmber") + private String accnNmber; + + /** + * 开户名称 + */ + @TableField("acc_name") + private String accName; + + /** + * 性质 1:公办 2:民办 3:公办兼民办 + */ + private Integer nature; + + /** + * 等级 1:一级 2:二级 3:三级 + */ + private Integer grade; + + /** + * 特色专科 + */ + private String feature; + + /** + * 医院电话 + */ + private String phone; + + /** + * 合作模式 1:相对紧密型 2:相对松散型 + */ + @TableField("co_op") + private Integer coOp; + + /** + * 合作模式说明 1:县域医共体 2:专科联盟 3:远程医疗协作 + */ + @TableField("co_op_explain") + private String coOpExplain; + + /** + * 帮扶协议 1:是 2:否 + */ + @TableField("help_protocol") + private Integer helpProtocol; + + /** + * 医院形式: 1:综合 2:专科 3:健康管理 4:医养结合 + */ + @TableField("synthe_size") + private Integer syntheSize; + + /** + * 1:激活 2:冻结 3撤销 + */ + private Integer state; + + /** + * 账户类型 + */ + @TableField("credit_type") + private String creditType; + + /** + * 封面图片 + */ + private String img; + + /** + * 权限菜单id + */ + @TableField("rp_id") + private String rpId; + + /** + * 印章名称 + */ + @TableField("seal_name") + private String sealName; + + /** + * 科室简介 + */ + @TableField("se_name_intro") + private String seNameIntro; + + /** + * 医院简介 + */ + @TableField("hospital_intro") + private String hospitalIntro; + + /** + * 责任人id(上级医院安排负责人) + */ + @TableField("principal_id") + private Long principalId; + + @TableField("create_time") + private Date createTime; + + /** + * 分配的专家 + */ + @TableField("allocate_doctor") + private String allocateDoctor; + + + public String getAllocateDoctor() { + return allocateDoctor; + } + + public void setAllocateDoctor(String allocateDoctor) { + this.allocateDoctor = allocateDoctor; + } + + /** + * 撤销原因 + */ + private String reason; + + @TableField(exist = false) + private String userName; + + + @TableField("bmode_name") + private String bmodeName; + + @TableField("bmode_phone") + private String bmodePhone; + + private static final long serialVersionUID = 1L; + + public ApplyInformation() { + super(); + } + /** + * 夜班开始时间 + */ + + @TableField("night_start_time") + private String nightStartTime; + + /** + * 夜班结束时间 + */ + + @TableField("night_stop_time") + private String nightStopTime; + + + + + public String getNightStartTime() { + return nightStartTime; + } + + public void setNightStartTime(String nightStartTime) { + this.nightStartTime = nightStartTime; + } + + public String getNightStopTime() { + return nightStopTime; + } + + public void setNightStopTime(String nightStopTime) { + this.nightStopTime = nightStopTime; + } + + public ApplyInformation(String id, String account, String password, Long rid, String hospitalName, + String hospitalSite, String hospitalId, Date setupTime, String chamber, Integer beJobs, Integer advancedJob, + Integer middleJob, String deanName, String deanEducation, String deanMajor, String deanJob, + String deanPhone, String chamberName, String chamberEducation, String chamberMajor, String chamberJob, + String chamberPhone, String financeName, String financeEducation, String financeMajor, String financeJob, + String financePhone, String accBank, String accnNmber, String accName, Integer nature, Integer grade, + String feature, String phone, Integer coOp, String coOpExplain, Integer helpProtocol, Integer syntheSize, + Integer state, String creditType, String img, String rpId, String sealName, String seNameIntro, + String hospitalIntro, Long principalId, Date createTime, String reason, String userName,String salt, + String bmodeName, String bmodePhone,String groupAlias) { + super(); + this.id = id; + this.account = account; + this.password = password; + this.rid = rid; + this.hospitalName = hospitalName; + this.hospitalSite = hospitalSite; + this.hospitalId = hospitalId; + this.setupTime = setupTime; + this.chamber = chamber; + this.beJobs = beJobs; + this.advancedJob = advancedJob; + this.middleJob = middleJob; + this.deanName = deanName; + this.deanEducation = deanEducation; + this.deanMajor = deanMajor; + this.deanJob = deanJob; + this.deanPhone = deanPhone; + this.chamberName = chamberName; + this.chamberEducation = chamberEducation; + this.chamberMajor = chamberMajor; + this.chamberJob = chamberJob; + this.chamberPhone = chamberPhone; + this.financeName = financeName; + this.financeEducation = financeEducation; + this.financeMajor = financeMajor; + this.financeJob = financeJob; + this.financePhone = financePhone; + this.accBank = accBank; + this.accnNmber = accnNmber; + this.accName = accName; + this.nature = nature; + this.grade = grade; + this.feature = feature; + this.phone = phone; + this.coOp = coOp; + this.coOpExplain = coOpExplain; + this.helpProtocol = helpProtocol; + this.syntheSize = syntheSize; + this.state = state; + this.creditType = creditType; + this.img = img; + this.rpId = rpId; + this.sealName = sealName; + this.seNameIntro = seNameIntro; + this.hospitalIntro = hospitalIntro; + this.principalId = principalId; + this.createTime = createTime; + this.reason = reason; + this.userName = userName; + this.bmodeName = bmodeName; + this.bmodePhone = bmodePhone; + this.groupAlias = groupAlias; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Long getRid() { + return rid; + } + + public void setRid(Long rid) { + this.rid = rid; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalSite() { + return hospitalSite; + } + + public void setHospitalSite(String hospitalSite) { + this.hospitalSite = hospitalSite; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Date getSetupTime() { + return setupTime; + } + + public void setSetupTime(Date setupTime) { + this.setupTime = setupTime; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public Integer getBeJobs() { + return beJobs; + } + + public void setBeJobs(Integer beJobs) { + this.beJobs = beJobs; + } + + public Integer getAdvancedJob() { + return advancedJob; + } + + public void setAdvancedJob(Integer advancedJob) { + this.advancedJob = advancedJob; + } + + public Integer getMiddleJob() { + return middleJob; + } + + public void setMiddleJob(Integer middleJob) { + this.middleJob = middleJob; + } + + public String getDeanName() { + return deanName; + } + + public void setDeanName(String deanName) { + this.deanName = deanName; + } + + public String getDeanEducation() { + return deanEducation; + } + + public void setDeanEducation(String deanEducation) { + this.deanEducation = deanEducation; + } + + public String getDeanMajor() { + return deanMajor; + } + + public void setDeanMajor(String deanMajor) { + this.deanMajor = deanMajor; + } + + public String getDeanJob() { + return deanJob; + } + + public void setDeanJob(String deanJob) { + this.deanJob = deanJob; + } + + public String getDeanPhone() { + return deanPhone; + } + + public void setDeanPhone(String deanPhone) { + this.deanPhone = deanPhone; + } + + public String getChamberName() { + return chamberName; + } + + public void setChamberName(String chamberName) { + this.chamberName = chamberName; + } + + public String getChamberEducation() { + return chamberEducation; + } + + public void setChamberEducation(String chamberEducation) { + this.chamberEducation = chamberEducation; + } + + public String getChamberMajor() { + return chamberMajor; + } + + public void setChamberMajor(String chamberMajor) { + this.chamberMajor = chamberMajor; + } + + public String getChamberJob() { + return chamberJob; + } + + public void setChamberJob(String chamberJob) { + this.chamberJob = chamberJob; + } + + public String getChamberPhone() { + return chamberPhone; + } + + public void setChamberPhone(String chamberPhone) { + this.chamberPhone = chamberPhone; + } + + public String getFinanceName() { + return financeName; + } + + public void setFinanceName(String financeName) { + this.financeName = financeName; + } + + public String getFinanceEducation() { + return financeEducation; + } + + public void setFinanceEducation(String financeEducation) { + this.financeEducation = financeEducation; + } + + public String getFinanceMajor() { + return financeMajor; + } + + public void setFinanceMajor(String financeMajor) { + this.financeMajor = financeMajor; + } + + public String getFinanceJob() { + return financeJob; + } + + public void setFinanceJob(String financeJob) { + this.financeJob = financeJob; + } + + public String getFinancePhone() { + return financePhone; + } + + public void setFinancePhone(String financePhone) { + this.financePhone = financePhone; + } + + public String getAccBank() { + return accBank; + } + + public void setAccBank(String accBank) { + this.accBank = accBank; + } + + public String getAccnNmber() { + return accnNmber; + } + + public void setAccnNmber(String accnNmber) { + this.accnNmber = accnNmber; + } + + public String getAccName() { + return accName; + } + + public void setAccName(String accName) { + this.accName = accName; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public String getFeature() { + return feature; + } + + public void setFeature(String feature) { + this.feature = feature; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getCoOp() { + return coOp; + } + + public void setCoOp(Integer coOp) { + this.coOp = coOp; + } + + public String getCoOpExplain() { + return coOpExplain; + } + + public void setCoOpExplain(String coOpExplain) { + this.coOpExplain = coOpExplain; + } + + public Integer getHelpProtocol() { + return helpProtocol; + } + + public void setHelpProtocol(Integer helpProtocol) { + this.helpProtocol = helpProtocol; + } + + public Integer getSyntheSize() { + return syntheSize; + } + + public void setSyntheSize(Integer syntheSize) { + this.syntheSize = syntheSize; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCreditType() { + return creditType; + } + + public void setCreditType(String creditType) { + this.creditType = creditType; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getSealName() { + return sealName; + } + + public void setSealName(String sealName) { + this.sealName = sealName; + } + + public String getSeNameIntro() { + return seNameIntro; + } + + public void setSeNameIntro(String seNameIntro) { + this.seNameIntro = seNameIntro; + } + + public String getHospitalIntro() { + return hospitalIntro; + } + + public void setHospitalIntro(String hospitalIntro) { + this.hospitalIntro = hospitalIntro; + } + + public Long getPrincipalId() { + return principalId; + } + + public void setPrincipalId(Long principalId) { + this.principalId = principalId; + } + + public String getBmodeName() { + return bmodeName; + } + + public void setBmodeName(String bmodeName) { + this.bmodeName = bmodeName; + } + + public String getBmodePhone() { + return bmodePhone; + } + + public void setBmodePhone(String bmodePhone) { + this.bmodePhone = bmodePhone; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + @Override + public String toString() { + return "ApplyInformation{" + + "id='" + id + '\'' + + ", account='" + account + '\'' + + ", password='" + password + '\'' + + ", rid=" + rid + + ", hospitalName='" + hospitalName + '\'' + + ", hospitalSite='" + hospitalSite + '\'' + + ", hospitalId='" + hospitalId + '\'' + + ", setupTime=" + setupTime + + ", chamber='" + chamber + '\'' + + ", beJobs=" + beJobs + + ", advancedJob=" + advancedJob + + ", middleJob=" + middleJob + + ", deanName='" + deanName + '\'' + + ", deanEducation='" + deanEducation + '\'' + + ", deanMajor='" + deanMajor + '\'' + + ", deanJob='" + deanJob + '\'' + + ", deanPhone='" + deanPhone + '\'' + + ", chamberName='" + chamberName + '\'' + + ", chamberEducation='" + chamberEducation + '\'' + + ", chamberMajor='" + chamberMajor + '\'' + + ", chamberJob='" + chamberJob + '\'' + + ", chamberPhone='" + chamberPhone + '\'' + + ", financeName='" + financeName + '\'' + + ", financeEducation='" + financeEducation + '\'' + + ", financeMajor='" + financeMajor + '\'' + + ", financeJob='" + financeJob + '\'' + + ", financePhone='" + financePhone + '\'' + + ", accBank='" + accBank + '\'' + + ", accnNmber='" + accnNmber + '\'' + + ", accName='" + accName + '\'' + + ", nature=" + nature + + ", grade=" + grade + + ", feature='" + feature + '\'' + + ", phone='" + phone + '\'' + + ", coOp=" + coOp + + ", coOpExplain='" + coOpExplain + '\'' + + ", helpProtocol=" + helpProtocol + + ", syntheSize=" + syntheSize + + ", state=" + state + + ", creditType='" + creditType + '\'' + + ", img='" + img + '\'' + + ", rpId='" + rpId + '\'' + + ", sealName='" + sealName + '\'' + + ", seNameIntro='" + seNameIntro + '\'' + + ", hospitalIntro='" + hospitalIntro + '\'' + + ", principalId=" + principalId + + ", createTime=" + createTime + + ", reason='" + reason + '\'' + + ", userName='" + userName + '\'' + + '}'; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformationImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformationImg.java new file mode 100644 index 0000000..0fde6a4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyInformationImg.java @@ -0,0 +1,99 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 基层医院申请表图片 + * @author Server + * + */ +@TableName("apply_information_img") +public class ApplyInformationImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 基层医院申请表Id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + *图片地址 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 基层医院申请表Id + */ + @TableField("create_time") + private Date createTime; + + /** + * 图片类型 1:医疗机构执业许可证 2:开户许可证 3:其它 + */ + @TableField("img_type") + private Integer imgType; + + private static final long serialVersionUID = 1L; + + public ApplyInformationImg(Long id, String hospitalId, String imgUrl, Date createTime, Integer imgType) { + this.id = id; + this.hospitalId = hospitalId; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.imgType = imgType; + } + + public ApplyInformationImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId == null ? null : hospitalId.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyLis.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyLis.java new file mode 100644 index 0000000..17b0d6c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyLis.java @@ -0,0 +1,360 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_lis") +public class ApplyLis implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String name; + + private String gender; + + private Integer age; + + private String residentid; + + @TableField("sample_no") + private String sampleNo; + + @TableField("sample_type") + private String sampleType; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("sample_type") + private Date resultDateTime; + + @TableField("result_doc") + private String resultDoc; + + private String status; + + @TableField("doc_id") + private Long docId; + + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("out_patien") + private String outPatien; + + @TableField("clinic_diagnose") + private String clinicDiagnose; + + private String handlers; + + private String auditor; + + @TableField("result_data") + private String resultData; + + private String code; + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + private static final long serialVersionUID = 1L; + + public ApplyLis(Long id, String name, String gender, Integer age, String residentid, String sampleNo, + String sampleType, Date resultDateTime, String resultDoc, String status, Long docId, Date applyDate, + String doctorName, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String hisEsrdNumber, String esrdNumber, String outPatien, String clinicDiagnose, + String handlers, String auditor, String resultData, String code, String categoryHospital, + String groupHospital) { + super(); + this.id = id; + this.name = name; + this.gender = gender; + this.age = age; + this.residentid = residentid; + this.sampleNo = sampleNo; + this.sampleType = sampleType; + this.resultDateTime = resultDateTime; + this.resultDoc = resultDoc; + this.status = status; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.hisEsrdNumber = hisEsrdNumber; + this.esrdNumber = esrdNumber; + this.outPatien = outPatien; + this.clinicDiagnose = clinicDiagnose; + this.handlers = handlers; + this.auditor = auditor; + this.resultData = resultData; + this.code = code; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ApplyLis() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender == null ? null : gender.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getResidentid() { + return residentid; + } + + public void setResidentid(String residentid) { + this.residentid = residentid == null ? null : residentid.trim(); + } + + public String getSampleNo() { + return sampleNo; + } + + public void setSampleNo(String sampleNo) { + this.sampleNo = sampleNo == null ? null : sampleNo.trim(); + } + + public String getSampleType() { + return sampleType; + } + + public void setSampleType(String sampleType) { + this.sampleType = sampleType == null ? null : sampleType.trim(); + } + + public Date getResultDateTime() { + return resultDateTime; + } + + public void setResultDateTime(Date resultDateTime) { + this.resultDateTime = resultDateTime; + } + + public String getResultDoc() { + return resultDoc; + } + + public void setResultDoc(String resultDoc) { + this.resultDoc = resultDoc == null ? null : resultDoc.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien == null ? null : outPatien.trim(); + } + + public String getClinicDiagnose() { + return clinicDiagnose; + } + + public void setClinicDiagnose(String clinicDiagnose) { + this.clinicDiagnose = clinicDiagnose == null ? null : clinicDiagnose.trim(); + } + + public String getHandlers() { + return handlers; + } + + public void setHandlers(String handlers) { + this.handlers = handlers == null ? null : handlers.trim(); + } + + public String getAuditor() { + return auditor; + } + + public void setAuditor(String auditor) { + this.auditor = auditor == null ? null : auditor.trim(); + } + + public String getResultData() { + return resultData; + } + + public void setResultData(String resultData) { + this.resultData = resultData == null ? null : resultData.trim(); + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathology.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathology.java new file mode 100644 index 0000000..4e816ff --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathology.java @@ -0,0 +1,521 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology") +public class ApplyPathology implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("doc_id") + private Long docId; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("apply_date") + private Date applyDate; + + @TableField("doctor_name") + private String doctorName; + + @TableField("patient_name") + private String patientName; + + private String complain; + + private String past; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("group_date") + private Date groupDate; + + @TableField("category_hospital_id") + private String categoryHospitalId; + + private String chamber; + + @TableField("group_hospital_id") + private String groupHospitalId; + + @TableField("group_type") + private String groupType; + + private String initial; + + private String opinion; + + @TableField("b_hint") + private String bHint; + + private String status; + + private String sex; + + private Integer age; + + private String operator; + + @TableField("pt_phone") + private String ptPhone; + + @TableField("pt_card") + private String ptCard; + + @TableField("pt_city") + private String ptCity; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("examine_date") + private Date examineDate; + + @TableField("examine_part") + private String examinePart; + + @TableField("examine_name") + private String examineName; + + @TableField("report_doc_name") + private String reportDocName; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("report_date") + private Date reportDate; + + @TableField("enter_chamber") + private String enterChamber; + + @TableField("check_doc_name") + private String checkDocName; + + @TableField("examine_type") + private String examineType; + + @TableField("b_see") + private String bSee; + + @TableField("out_patien") + private String outPatien; + + @TableField("img_type") + private Integer imgType; + + private String code; + + + @TableField(exist = false) + private String categoryHospital; + + @TableField(exist = false) + private String groupHospital; + + @TableField(exist = false) + private String specialist; + + @TableField(exist = false) + private Long specialistId; + + @TableField(exist = false) + private List aphImgList; + + private static final long serialVersionUID = 1L; + + public ApplyPathology(Long id, Long docId, Date applyDate, String doctorName, String patientName, String complain, + String past, Date groupDate, String categoryHospitalId, String chamber, String groupHospitalId, + String groupType, String initial, String opinion, String bHint, String status, String sex, Integer age, + String operator, String ptPhone, String ptCard, String ptCity, String esrdNumber, String hisEsrdNumber, + Date examineDate, String examinePart, String examineName, String reportDocName, Date reportDate, + String enterChamber, String checkDocName, String examineType, String bSee, String outPatien, + Integer imgType, String code, String categoryHospital, String groupHospital, + String specialist, Long specialistId, List aphImgList) { + super(); + this.id = id; + this.docId = docId; + this.applyDate = applyDate; + this.doctorName = doctorName; + this.patientName = patientName; + this.complain = complain; + this.past = past; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.chamber = chamber; + this.groupHospitalId = groupHospitalId; + this.groupType = groupType; + this.initial = initial; + this.opinion = opinion; + this.bHint = bHint; + this.status = status; + this.sex = sex; + this.age = age; + this.operator = operator; + this.ptPhone = ptPhone; + this.ptCard = ptCard; + this.ptCity = ptCity; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.examineDate = examineDate; + this.examinePart = examinePart; + this.examineName = examineName; + this.reportDocName = reportDocName; + this.reportDate = reportDate; + this.enterChamber = enterChamber; + this.checkDocName = checkDocName; + this.examineType = examineType; + this.bSee = bSee; + this.outPatien = outPatien; + this.imgType = imgType; + this.code = code; + this.categoryHospital = categoryHospital; + this.groupHospital = groupHospital; + this.specialist = specialist; + this.specialistId = specialistId; + this.aphImgList = aphImgList; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getImgType() { + return imgType; + } + + public void setImgType(Integer imgType) { + this.imgType = imgType; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getSpecialist() { + return specialist; + } + + public void setSpecialist(String specialist) { + this.specialist = specialist; + } + + public Long getSpecialistId() { + return specialistId; + } + + public void setSpecialistId(Long specialistId) { + this.specialistId = specialistId; + } + + public String getCategoryHospital() { + return categoryHospital; + } + + public void setCategoryHospital(String categoryHospital) { + this.categoryHospital = categoryHospital; + } + + public String getGroupHospital() { + return groupHospital; + } + + public void setGroupHospital(String groupHospital) { + this.groupHospital = groupHospital; + } + + public List getAphImgList() { + return aphImgList; + } + + public void setAphImgList(List aphImgList) { + this.aphImgList = aphImgList; + } + + public ApplyPathology() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getApplyDate() { + return applyDate; + } + + public void setApplyDate(Date applyDate) { + this.applyDate = applyDate; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName == null ? null : doctorName.trim(); + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public String getComplain() { + return complain; + } + + public void setComplain(String complain) { + this.complain = complain == null ? null : complain.trim(); + } + + public String getPast() { + return past; + } + + public void setPast(String past) { + this.past = past == null ? null : past.trim(); + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId == null ? null : categoryHospitalId.trim(); + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId == null ? null : groupHospitalId.trim(); + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType == null ? null : groupType.trim(); + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial == null ? null : initial.trim(); + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion == null ? null : opinion.trim(); + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint == null ? null : bHint.trim(); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status == null ? null : status.trim(); + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator == null ? null : operator.trim(); + } + + public String getPtPhone() { + return ptPhone; + } + + public void setPtPhone(String ptPhone) { + this.ptPhone = ptPhone == null ? null : ptPhone.trim(); + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getPtCity() { + return ptCity; + } + + public void setPtCity(String ptCity) { + this.ptCity = ptCity == null ? null : ptCity.trim(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber == null ? null : esrdNumber.trim(); + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber == null ? null : hisEsrdNumber.trim(); + } + + public Date getExamineDate() { + return examineDate; + } + + public void setExamineDate(Date examineDate) { + this.examineDate = examineDate; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart == null ? null : examinePart.trim(); + } + + public String getExamineName() { + return examineName; + } + + public void setExamineName(String examineName) { + this.examineName = examineName == null ? null : examineName.trim(); + } + + public String getReportDocName() { + return reportDocName; + } + + public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName == null ? null : reportDocName.trim(); + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } + + public String getEnterChamber() { + return enterChamber; + } + + public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber == null ? null : enterChamber.trim(); + } + + public String getCheckDocName() { + return checkDocName; + } + + public void setCheckDocName(String checkDocName) { + this.checkDocName = checkDocName == null ? null : checkDocName.trim(); + } + + public String getExamineType() { + return examineType; + } + + public void setExamineType(String examineType) { + this.examineType = examineType; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee == null ? null : bSee.trim(); + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyFile.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyFile.java new file mode 100644 index 0000000..535fa8b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyFile.java @@ -0,0 +1,84 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_file") +public class ApplyPathologyFile implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("file_url") + private String fileUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("con_id") + private Long conId; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public ApplyPathologyFile() { + super(); + } + + public ApplyPathologyFile(Long id, String fileUrl, Date createTime, Long conId, String fileName) { + super(); + this.id = id; + this.fileUrl = fileUrl; + this.createTime = createTime; + this.conId = conId; + this.fileName = fileName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getConId() { + return conId; + } + + public void setConId(Long conId) { + this.conId = conId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyImg.java new file mode 100644 index 0000000..e17ba7d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologyImg.java @@ -0,0 +1,94 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_img") +public class ApplyPathologyImg implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("p_id") + private Long pId; + + private String code; + + private static final long serialVersionUID = 1L; + + public ApplyPathologyImg() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getpId() { + return pId; + } + + public void setpId(Long pId) { + this.pId = pId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public ApplyPathologyImg(Long id, Integer type, String imgUrl, Date createTime, Long pId, String code) { + super(); + this.id = id; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.pId = pId; + this.code = code; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java new file mode 100644 index 0000000..9865cbf --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplyPathologySpecialist.java @@ -0,0 +1,105 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_pathology_specialist") +public class ApplyPathologySpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + @TableField("p_id") + private Long pId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private static final long serialVersionUID = 1L; + + public ApplyPathologySpecialist(Long id, Long speId, String speName, Integer state, Long pId, Date createTime, Date updateTime) { + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.pId = pId; + this.createTime = createTime; + this.updateTime = updateTime; + } + + public ApplyPathologySpecialist() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName == null ? null : speName.trim(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Long getpId() { + return pId; + } + + public void setpId(Long pId) { + this.pId = pId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplySpecialist.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplySpecialist.java new file mode 100644 index 0000000..689bcbe --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ApplySpecialist.java @@ -0,0 +1,119 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("apply_specialist") +public class ApplySpecialist implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("spe_id") + private Long speId; + + @TableField("spe_name") + private String speName; + + private Integer state; + + private String code; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("spe_number") + private Integer speNumber; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public String getSpeName() { + return speName; + } + + public void setSpeName(String speName) { + this.speName = speName; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getSpeNumber() { + return speNumber; + } + + public void setSpeNumber(Integer speNumber) { + this.speNumber = speNumber; + } + + public ApplySpecialist(Long id, Long speId, String speName, Integer state, String code, Date createTime, + Date updateTime, Integer speNumber) { + super(); + this.id = id; + this.speId = speId; + this.speName = speName; + this.state = state; + this.code = code; + this.createTime = createTime; + this.updateTime = updateTime; + this.speNumber = speNumber; + } + + public ApplySpecialist() { + super(); + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BMDReportInfo.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BMDReportInfo.java new file mode 100644 index 0000000..80b6617 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BMDReportInfo.java @@ -0,0 +1,339 @@ +package com.imurs.entity; + +import java.util.Date; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Data; + + + + + +/* + * @author laier + * @date 2022-12-13 15:44 + */ +@Data +@Document(indexName = "es_lunqin", shards = 5, replicas = 1) +public class BMDReportInfo { + + @Id + private Long id; + /* + + * 检查部位 + */ +@Field(type = FieldType.Keyword) + private String examinePart; + + /** + * 临床诊断 + */ + @Field(type = FieldType.Keyword) + private String initial; + + /** + * 医生意见 + */ + @Field(type = FieldType.Keyword) + private String opinion; + + /** + * 超声所见 + */ + @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") + private String bSee; + + /** + * 超声提示 + */ + @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") + private String bHint; + + /** + * 诊断结果阴阳性 + 0:阴 + 1:阳 + */ + @Field(type = FieldType.Integer) + private Integer nature; + + /** + * 专家综合诊断意见 + */ + @Field(type = FieldType.Keyword) + private String overallOpinion; + + /** + * 超声病例id + */ + @Field(type = FieldType.Keyword) + private Long bId; + + /** + * 超声图片(id集合) + */ + @Field(type = FieldType.Keyword) + private String imageIds; + + /** + * 会诊类型 + SP:视频会诊 + LX:离线会诊 + */ + @Field(type = FieldType.Keyword) + private String diagnosisType; + + /** + * 会诊医生 + */ + @Field(type = FieldType.Keyword) + private Long docId; + + /** + * 会诊专家 + */ + @Field(type = FieldType.Keyword) + private Long speId; + + /** + * 会诊时间 + */ + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date groupDate; + + /** + * 申请医院 + */ + @Field(type = FieldType.Keyword) + private String categoryHospitalId; + + /** + * 会诊医院 + */ + @Field(type = FieldType.Keyword) + private String groupHospitalId; + + /** + * 报告状态 + 2:待审核 + 0:已审核 + */ + @Field(type = FieldType.Integer) + private Integer active; + + /** + * 修改时间 + */ + @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + + private static final long serialVersionUID = 1L; + + + public BMDReportInfo() { + } + + public BMDReportInfo(Long id, String examinePart, String initial, String opinion, String bSee, String bHint, Integer nature, String overallOpinion, Long bId, String imageIds, String diagnosisType, Long docId, Long speId, Date groupDate, String categoryHospitalId, String groupHospitalId, Integer active, Date updateTime) { + this.id = id; + this.examinePart = examinePart; + this.initial = initial; + this.opinion = opinion; + this.bSee = bSee; + this.bHint = bHint; + this.nature = nature; + this.overallOpinion = overallOpinion; + this.bId = bId; + this.imageIds = imageIds; + this.diagnosisType = diagnosisType; + this.docId = docId; + this.speId = speId; + this.groupDate = groupDate; + this.categoryHospitalId = categoryHospitalId; + this.groupHospitalId = groupHospitalId; + this.active = active; + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BMDReportInfo{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active=" + active + + ", updateTime=" + updateTime + + '}'; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeHistory.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeHistory.java new file mode 100644 index 0000000..ee204c9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeHistory.java @@ -0,0 +1,352 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author wang + * @date 2024年11月21日 15:21 + */ +@TableName("b_model_history") +public class BModeHistory implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 报告id + */ + @TableField("report_id") + private Long reportId; + + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + /** + * 更新医生名字 + */ + @TableField("update_doc") + private String updateDoc; + public String getUpdateDoc() { + return updateDoc; + } + + public void setUpdateDoc(String updateDoc) { + this.updateDoc = updateDoc; + } + + /** + * 检查部位 + */ + @TableField("examine_part") + private String examinePart; + /** + * 临床诊断 + */ + @TableField("initial") + private String initial; + /** + * 医生意见 + */ + @TableField("opinion") + private String opinion; + /** + * 超声所见 + */ + @TableField("b_see") + private String bSee; + /** + * 超声提示 + */ + @TableField("b_hint") + private String bHint; + /** + * 诊断结果 1:阳性 0:阴性 + */ + @TableField("nature") + private Integer nature; + /** + * 专家诊断综合意见 + */ + @TableField("overall_opinion") + private String overallOpinion; + /** + * 超声id + */ + @TableField("b_id") + private Long bId; + /** + * 超声图片(id集合) + */ + @TableField("image_ids") + private String imageIds; + /** + * 前端提交的id集合 + */ + @TableField(exist = false) + private List imageIdList; + /** + * 会诊类型 SP:视频会诊 LX:离线会诊 + */ + @TableField("diagnosis_Type") + private String diagnosisType; + /** + * 申请医生 + */ + @TableField("doc_id") + private Long docId; + /** + * 会诊专家 + */ + @TableField("spe_id") + private Long speId; + /** + * 会诊时间 + */ + @TableField("group_date") + private Date groupDate; + /** + * 申请医院 + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + /** + * 会诊医院 + */ + @TableField("group_hospital_id") + private String groupHospitalId; + /** + * 报告状态 2:待审核 0:已审核 + */ + @TableField("active") + private Integer active; + /** + * 修改时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 报告时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("report_time") + private Date reportTime; + + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 危急值 + * + */ + @TableField("critical_value") + private String criticalValue; + + public String getCriticalValue() { + return criticalValue; + } + + public void setCriticalValue(String criticalValue) { + this.criticalValue = criticalValue; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public List getImageIdList() { + return imageIdList; + } + + public void setImageIdList(List imageIdList) { + this.imageIdList = imageIdList; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BModeHistory{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", imageIdList=" + imageIdList + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active=" + active + + ", updateTime=" + updateTime + + ", criticalValue='" + criticalValue + '\'' + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeReport.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeReport.java new file mode 100644 index 0000000..8657867 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BModeReport.java @@ -0,0 +1,365 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; +import java.util.List; + +/** + * @author Laier + * @date 2022-11-23 13:57 + */ +@TableName("b_mode_report") +public class BModeReport implements Serializable { + @TableId(value = "id",type = IdType.AUTO) + private Long id; + /** + * 检查部位 + */ + @TableField("examine_part") + private String examinePart; + /** + * 临床诊断 + */ + @TableField("initial") + private String initial; + /** + * 医生意见 + */ + @TableField("opinion") + private String opinion; + /** + * 超声所见 + */ + @TableField("b_see") + private String bSee; + /** + * 超声提示 + */ + @TableField("b_hint") + private String bHint; + /** + * 诊断结果 1:阳性 0:阴性 + */ + @TableField("nature") + private Integer nature; + /** + * 专家诊断综合意见 + */ + @TableField("overall_opinion") + private String overallOpinion; + /** + * 超声id + */ + @TableField("b_id") + private Long bId; + /** + * 超声图片(id集合) + */ + @TableField("image_ids") + private String imageIds; + /** + * 前端提交的id集合 + */ + @TableField(exist = false) + private List imageIdList; + /** + * 会诊类型 SP:视频会诊 LX:离线会诊 + */ + @TableField("diagnosis_Type") + private String diagnosisType; + /** + * 申请医生 + */ + @TableField("doc_id") + private Long docId; + /** + * 会诊专家 + */ + @TableField("spe_id") + private Long speId; + /** + * 会诊时间 + */ + @TableField("group_date") + private Date groupDate; + /** + * 申请医院 + */ + @TableField("category_hospital_id") + private String categoryHospitalId; + /** + * 会诊医院 + */ + @TableField("group_hospital_id") + private String groupHospitalId; + /** + * 报告状态 2:待审核 0:已审核 + */ + @TableField("active") + private Integer active; + /** + * 修改时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("update_time") + private Date updateTime; + + + /** + * 间隔时间 + */ + @TableField("interval_time") + private String intervalTime; + + /** + * 修改医生 + */ + @TableField("update_doc") + private String updateDoc; + + /** + * 报告时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("report_time") + private Date reportTime; + + + public Date getReportTime() { + return reportTime; + } + + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 审核医生 + */ + @TableField("audit_doc") + private String auditDoc; + /** + * 审核时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @TableField("audit_time") + private Date auditTime; + + public String getAuditDoc() { + return auditDoc; + } + + public void setAuditDoc(String auditDoc) { + this.auditDoc = auditDoc; + } + + + + public Date getAuditTime() { + return auditTime; + } + + public void setAuditTime(Date auditTime) { + this.auditTime = auditTime; + } + + public String getUpdateDoc() { + return updateDoc; + } + + public void setUpdateDoc(String updateDoc) { + this.updateDoc = updateDoc; + } + + public String getIntervalTime() { + return intervalTime; + } + + public void setIntervalTime(String intervalTime) { + this.intervalTime = intervalTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getExaminePart() { + return examinePart; + } + + public void setExaminePart(String examinePart) { + this.examinePart = examinePart; + } + + public String getInitial() { + return initial; + } + + public void setInitial(String initial) { + this.initial = initial; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getbSee() { + return bSee; + } + + public void setbSee(String bSee) { + this.bSee = bSee; + } + + public String getbHint() { + return bHint; + } + + public void setbHint(String bHint) { + this.bHint = bHint; + } + + public Integer getNature() { + return nature; + } + + public void setNature(Integer nature) { + this.nature = nature; + } + + public String getOverallOpinion() { + return overallOpinion; + } + + public void setOverallOpinion(String overallOpinion) { + this.overallOpinion = overallOpinion; + } + + public Long getbId() { + return bId; + } + + public void setbId(Long bId) { + this.bId = bId; + } + + public String getImageIds() { + return imageIds; + } + + public void setImageIds(String imageIds) { + this.imageIds = imageIds; + } + + public List getImageIdList() { + return imageIdList; + } + + public void setImageIdList(List imageIdList) { + this.imageIdList = imageIdList; + } + + public String getDiagnosisType() { + return diagnosisType; + } + + public void setDiagnosisType(String diagnosisType) { + this.diagnosisType = diagnosisType; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Long getSpeId() { + return speId; + } + + public void setSpeId(Long speId) { + this.speId = speId; + } + + public Date getGroupDate() { + return groupDate; + } + + public void setGroupDate(Date groupDate) { + this.groupDate = groupDate; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public Integer getActive() { + return active; + } + + public void setActive(Integer active) { + this.active = active; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "BModeReport{" + + "id=" + id + + ", examinePart='" + examinePart + '\'' + + ", initial='" + initial + '\'' + + ", opinion='" + opinion + '\'' + + ", bSee='" + bSee + '\'' + + ", bHint='" + bHint + '\'' + + ", nature=" + nature + + ", overallOpinion='" + overallOpinion + '\'' + + ", bId=" + bId + + ", imageIds='" + imageIds + '\'' + + ", imageIdList=" + imageIdList + + ", diagnosisType='" + diagnosisType + '\'' + + ", docId=" + docId + + ", speId=" + speId + + ", groupDate=" + groupDate + + ", categoryHospitalId='" + categoryHospitalId + '\'' + + ", groupHospitalId='" + groupHospitalId + '\'' + + ", active='" + active + '\'' + + ", updateTime='" + updateTime + '\'' + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bdiagnosis.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bdiagnosis.java new file mode 100644 index 0000000..fced5cd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bdiagnosis.java @@ -0,0 +1,45 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_diagnosis") +public class Bdiagnosis implements Serializable { + @Override + public String toString() { + return "Bdiagnosis [id=" + id + ", name=" + name + "]"; + } + + private Integer id; + + private String name; + + private static final long serialVersionUID = 1L; + + public Bdiagnosis(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Bdiagnosis() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BdiagnosisNext.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BdiagnosisNext.java new file mode 100644 index 0000000..6dcf7e4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BdiagnosisNext.java @@ -0,0 +1,55 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_diagnosis_next") +public class BdiagnosisNext implements Serializable { + @Override + public String toString() { + return "BdiagnosisNext [id=" + id + ", firstId=" + firstId + ", name=" + name + "]"; + } + + private Integer id; + @TableField("first_id") + private Integer firstId; + + private String name; + + private static final long serialVersionUID = 1L; + + public BdiagnosisNext(Integer id, Integer firstId, String name) { + this.id = id; + this.firstId = firstId; + this.name = name; + } + + public BdiagnosisNext() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getFirstId() { + return firstId; + } + + public void setFirstId(Integer firstId) { + this.firstId = firstId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodeMachineModel.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodeMachineModel.java new file mode 100644 index 0000000..8e3250d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodeMachineModel.java @@ -0,0 +1,69 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; + + +@TableName("b_mode_machine_model") +public class BmodeMachineModel implements Serializable { + + /** + * @author: WDY + * @date: 2020/5/12 + * @description: 超声机设备实体类 + */ + private static final long serialVersionUID = 1L; + @TableField("third_id") + private int id; //设备id + @TableField("hospital_id") + private String hospitalId;//医院id + @TableField("machine_model") + private String machineModel;//设备型号 + @TableField("machine_resolution") + private String machineResolution;//设备分辨率 + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getHospitalId() { + return hospitalId; + } + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + public String getMachineModel() { + return machineModel; + } + public void setMachineModel(String machineModel) { + this.machineModel = machineModel; + } + public String getMachineResolution() { + return machineResolution; + } + public void setMachineResolution(String machineResolution) { + this.machineResolution = machineResolution; + } + @Override + public String toString() { + return "BmodeMachineModel [id=" + id + ", hospitalId=" + hospitalId + ", machineModel=" + machineModel + + ", machineResolution=" + machineResolution + "]"; + } + public BmodeMachineModel(int id, String hospitalId, String machineModel, String machineResolution) { + super(); + this.id = id; + this.hospitalId = hospitalId; + this.machineModel = machineModel; + this.machineResolution = machineResolution; + } + public BmodeMachineModel() { + super(); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bmodel.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bmodel.java new file mode 100644 index 0000000..9bf1d1d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Bmodel.java @@ -0,0 +1,55 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model") +public class Bmodel implements Serializable { + private Integer id; + @TableField("first_id") + private Integer firstId; + @Override + public String toString() { + return "Bmodel [id=" + id + ", firstId=" + firstId + ", firstText=" + firstText + "]"; + } + + @TableField("first_text") + private String firstText; + + private static final long serialVersionUID = 1L; + + public Bmodel(Integer id, Integer firstId, String firstText) { + this.id = id; + this.firstId = firstId; + this.firstText = firstText; + } + + public Bmodel() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getFirstId() { + return firstId; + } + + public void setFirstId(Integer firstId) { + this.firstId = firstId; + } + + public String getFirstText() { + return firstText; + } + + public void setFirstText(String firstText) { + this.firstText = firstText == null ? null : firstText.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelFris.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelFris.java new file mode 100644 index 0000000..0ee6fb4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelFris.java @@ -0,0 +1,56 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_fris") +public class BmodelFris implements Serializable { + @Override + public String toString() { + return "BmodelFris [bfId=" + bfId + ", secondId=" + secondId + ", secondText=" + secondText + "]"; + } + + @TableField("bf_id") + private Integer bfId; + @TableField("second_id") + private Integer secondId; + @TableField("second_text") + private String secondText; + + private static final long serialVersionUID = 1L; + + public BmodelFris(Integer bfId, Integer secondId, String secondText) { + this.bfId = bfId; + this.secondId = secondId; + this.secondText = secondText; + } + + public BmodelFris() { + super(); + } + + public Integer getBfId() { + return bfId; + } + + public void setBfId(Integer bfId) { + this.bfId = bfId; + } + + public Integer getSecondId() { + return secondId; + } + + public void setSecondId(Integer secondId) { + this.secondId = secondId; + } + + public String getSecondText() { + return secondText; + } + + public void setSecondText(String secondText) { + this.secondText = secondText == null ? null : secondText.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecond.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecond.java new file mode 100644 index 0000000..2dbad92 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecond.java @@ -0,0 +1,68 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_second") +public class BmodelSecond implements Serializable { + @TableField("third_id") + private Integer thirdId; + @Override + public String toString() { + return "BmodelSecond [thirdId=" + thirdId + ", bsecondId=" + bsecondId + ", thirdText=" + thirdText + + ", fouthId=" + fouthId + "]"; + } + + @TableField("bsecond_id") + private Integer bsecondId; + @TableField("third_text") + private String thirdText; + @TableField("fouth_id") + private Integer fouthId; + + private static final long serialVersionUID = 1L; + + public BmodelSecond(Integer thirdId, Integer bsecondId, String thirdText, Integer fouthId) { + this.thirdId = thirdId; + this.bsecondId = bsecondId; + this.thirdText = thirdText; + this.fouthId = fouthId; + } + + public BmodelSecond() { + super(); + } + + public Integer getThirdId() { + return thirdId; + } + + public void setThirdId(Integer thirdId) { + this.thirdId = thirdId; + } + + public Integer getBsecondId() { + return bsecondId; + } + + public void setBsecondId(Integer bsecondId) { + this.bsecondId = bsecondId; + } + + public String getThirdText() { + return thirdText; + } + + public void setThirdText(String thirdText) { + this.thirdText = thirdText == null ? null : thirdText.trim(); + } + + public Integer getFouthId() { + return fouthId; + } + + public void setFouthId(Integer fouthId) { + this.fouthId = fouthId; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java new file mode 100644 index 0000000..38831c9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/BmodelSecondWithBLOBs.java @@ -0,0 +1,46 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("b_model_second") +public class BmodelSecondWithBLOBs extends BmodelSecond implements Serializable { + @TableField("ultrasound_find") + private String ultrasoundFind; + @TableField("ultrasound_hint") + private String ultrasoundHint; + + private static final long serialVersionUID = 1L; + + public BmodelSecondWithBLOBs(Integer thirdId, Integer bsecondId, String thirdText, Integer fouthId, String ultrasoundFind, String ultrasoundHint) { + super(thirdId, bsecondId, thirdText, fouthId); + this.ultrasoundFind = ultrasoundFind; + this.ultrasoundHint = ultrasoundHint; + } + + public BmodelSecondWithBLOBs() { + super(); + } + + public String getUltrasoundFind() { + return ultrasoundFind; + } + + @Override + public String toString() { + return "BmodelSecondWithBLOBs [ultrasoundFind=" + ultrasoundFind + ", ultrasoundHint=" + ultrasoundHint + "]"; + } + + public void setUltrasoundFind(String ultrasoundFind) { + this.ultrasoundFind = ultrasoundFind == null ? null : ultrasoundFind.trim(); + } + + public String getUltrasoundHint() { + return ultrasoundHint; + } + + public void setUltrasoundHint(String ultrasoundHint) { + this.ultrasoundHint = ultrasoundHint == null ? null : ultrasoundHint.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/CaseTemplate.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/CaseTemplate.java new file mode 100644 index 0000000..fdac3bc --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/CaseTemplate.java @@ -0,0 +1,129 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@TableName("case_template") +public class CaseTemplate implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 分类名字 + */ + @TableField("name") + private String name; + /** + * 父级分类id + */ + @TableField("parent_id") + private Long parentId; + /** + * 分类级别 + */ + @TableField("level") + private Long level; + /** + * ultrasound_find + */ + @TableField("ultrasound_find") + private String ultrasoundFind; + /** + * ultrasound_hint + */ + @TableField("ultrasound_hint") + private String ultrasoundHint; + + public List getCaseTemplateList() { + return caseTemplateList; + } + + public void setCaseTemplateList(List caseTemplateList) { + this.caseTemplateList = caseTemplateList; + } + + @TableField(exist = false) + private List caseTemplateList; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Long getLevel() { + return level; + } + + public void setLevel(Long level) { + this.level = level; + } + + public String getUltrasoundFind() { + return ultrasoundFind; + } + + public void setUltrasoundFind(String ultrasoundFind) { + this.ultrasoundFind = ultrasoundFind; + } + + public String getUltrasoundHint() { + return ultrasoundHint; + } + + public void setUltrasoundHint(String ultrasoundHint) { + this.ultrasoundHint = ultrasoundHint; + } + + + public CaseTemplate(Long id, String name, Long parentId, Long level, String ultrasoundFind, String ultrasoundHint) { + this.id = id; + this.name = name; + this.parentId = parentId; + this.level = level; + this.ultrasoundFind = ultrasoundFind; + this.ultrasoundHint = ultrasoundHint; + } + + public CaseTemplate() { + } + + @Override + public String toString() { + return "CaseTemplate{" + + "id=" + id + + ", name='" + name + '\'' + + ", parentId=" + parentId + + ", level=" + level + + ", ultrasoundFind='" + ultrasoundFind + '\'' + + ", ultrasoundHint='" + ultrasoundHint + '\'' + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ClinicalGuidelines.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ClinicalGuidelines.java new file mode 100644 index 0000000..6771b90 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ClinicalGuidelines.java @@ -0,0 +1,187 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 诊疗指南 + * + * @author Server + * + */ +@TableName("clinical_guidelines") +public class ClinicalGuidelines implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("cg_name") + private String cgName; + + @TableField("create_time") + private Date createTime; + + @TableField("doc_id") + private Long docId; + + @TableField("doc_name") + private String docName; + + private Integer pviews; + + @TableField("file_url") + private String fileUrl; + + @TableField("hospital_id") + private String hospitalId; + + @DateTimeFormat(pattern="yyyy-MM-dd") + @TableField("upload_date") + private Date uploadDate; + + private Integer state; + + @TableField(exist=false) + private Integer number; + + private static final long serialVersionUID = 1L; + + + public ClinicalGuidelines() { + super(); + } + + public ClinicalGuidelines(Long id, String cgName, Date createTime, Long docId, String docName, Integer pviews, + String fileUrl, String hospitalId, Date uploadDate, Integer state, Integer number) { + super(); + this.id = id; + this.cgName = cgName; + this.createTime = createTime; + this.docId = docId; + this.docName = docName; + this.pviews = pviews; + this.fileUrl = fileUrl; + this.hospitalId = hospitalId; + this.uploadDate = uploadDate; + this.state = state; + this.number = number; + } + + public Long getId() { + return id; + } + + + public void setId(Long id) { + this.id = id; + } + + + public String getCgName() { + return cgName; + } + + + public void setCgName(String cgName) { + this.cgName = cgName; + } + + + public Date getCreateTime() { + return createTime; + } + + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + + public Long getDocId() { + return docId; + } + + + public void setDocId(Long docId) { + this.docId = docId; + } + + + public String getDocName() { + return docName; + } + + + public void setDocName(String docName) { + this.docName = docName; + } + + + public Integer getPviews() { + return pviews; + } + + + public void setPviews(Integer pviews) { + this.pviews = pviews; + } + + + public String getFileUrl() { + return fileUrl; + } + + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + + public String getHospitalId() { + return hospitalId; + } + + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + + public Date getUploadDate() { + return uploadDate; + } + + + public void setUploadDate(Date uploadDate) { + this.uploadDate = uploadDate; + } + + + public Integer getState() { + return state; + } + + + public void setState(Integer state) { + this.state = state; + } + + + public Integer getNumber() { + return number; + } + + + public void setNumber(Integer number) { + this.number = number; + } + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorArrange.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorArrange.java new file mode 100644 index 0000000..dd20eba --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorArrange.java @@ -0,0 +1,575 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医生下乡排班表 + * + * @author Server + * + */ +@TableName("doctor_arrange") +public class DoctorArrange implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 手机号码唯一标识 + */ + private String phone; + + /** + * 医生名字 + */ + @TableField("doctor_name") + private String doctorName; + + private String job; + + /** + * 天数 + */ + private Integer day; + + /** + * 排班单位(受援单位) + */ + @TableField("receive_hospital_name") + private String receiveHospitalName; + + /** + * 排班单位Id + */ + @TableField("receive_hospital_id") + private String receiveHospitalId; + + /** + * 安排科室 + */ + private String chamber; + + /** + * 上传纸质帮扶反馈表(图片) + */ + @TableField("feedback_img") + private String feedbackImg; + + /** + * 开展工作(工作类型) + */ + @TableField("work_type") + private String workType; + + /** + * 开展工作 + */ + @TableField("develop_work") + private String developWork; + + /** + * 医生简介 + */ + @TableField("doctor_tntroduce") + private String doctorTntroduce; + + /** + * 开始日期 + */ + @TableField("start_time") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束日期 + */ + @TableField("end_time") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endTime; + + /** + * 结束日期 + */ + @TableField("create_time") + private Date createTime; + + /** + * 下乡反馈时间 + */ + @TableField("feedback_time") + private Date feedbackTime; + + /** + * 医生是否到达医院(D、H 、Y、Z、 (D等待帮扶 Y帮扶完成 H帮扶中 Z 拒绝帮扶) + */ + private String status; + + /** + * 下级医院安排科室 + */ + @TableField("arrange_chamber") + private String arrangeChamber; + + /** + * 医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 评价 A:优秀 B:良好 C:不及格 + */ + private String evaluate; + + /** + * 新技术,开发新项目 + */ + @TableField("new_project") + private String newProject; + + /** + * 帮扶计划 + */ + @TableField("help_plan") + private String helpPlan; + + /** + * 劳动纪律得分 + */ + @TableField("labour_grade") + private String labourGrade; + + /** + * 工作态度得分 + */ + @TableField("manner_grade") + private String mannerGrade; + + /** + * 协助医院得分 + */ + @TableField("assist_grade") + private String assistGrade; + + /** + * 工作作风得分 + */ + @TableField("woke_grade") + private String wokeGrade; + + /** + * 帮扶效果得分 + */ + @TableField("bangfu_grade") + private String bangfuGrade; + + /** + * 考核总分 + */ + @TableField("total_grade") + private String totalGrade; + + /** + * 帮扶绩效 + */ + @TableField("perfor_mance") + private String perforMance; + + /** + * 每天补助 + */ + @TableField("day_money") + private String dayMoney; + + /** + * 总金额 + */ + @TableField("total_money") + private String totalMoney; + + /** + * 交通补助 + */ + @TableField("traffic_money") + private String trafficMoney; + + /** + * 是否自驾(0/否 1/是) + */ + @TableField("is_drive") + private String isDrive; + + /** + * 排班医院类型(医联体、对口支援、名医工作室、远程协作)3/4/5/8 + */ + private String type; + + /** + * 头像 + */ + private String photo; + + @TableField(exist = false) + private String sealName; + + @TableField(exist = false) + private List iaList; + + private static final long serialVersionUID = 1L; + + public DoctorArrange() { + super(); + } + + public DoctorArrange(Long id, String phone, String doctorName, String job, Integer day, String receiveHospitalName, + String receiveHospitalId, String chamber, String feedbackImg, String workType, String developWork, + String doctorTntroduce, Date startTime, Date endTime, Date createTime, Date feedbackTime, String status, + String arrangeChamber, Long docId, String evaluate, String newProject, String helpPlan, String labourGrade, + String mannerGrade, String assistGrade, String wokeGrade, String bangfuGrade, String totalGrade, + String perforMance, String dayMoney, String totalMoney, String trafficMoney, String isDrive, String type, + String photo, String sealName, List iaList) { + super(); + this.id = id; + this.phone = phone; + this.doctorName = doctorName; + this.job = job; + this.day = day; + this.receiveHospitalName = receiveHospitalName; + this.receiveHospitalId = receiveHospitalId; + this.chamber = chamber; + this.feedbackImg = feedbackImg; + this.workType = workType; + this.developWork = developWork; + this.doctorTntroduce = doctorTntroduce; + this.startTime = startTime; + this.endTime = endTime; + this.createTime = createTime; + this.feedbackTime = feedbackTime; + this.status = status; + this.arrangeChamber = arrangeChamber; + this.docId = docId; + this.evaluate = evaluate; + this.newProject = newProject; + this.helpPlan = helpPlan; + this.labourGrade = labourGrade; + this.mannerGrade = mannerGrade; + this.assistGrade = assistGrade; + this.wokeGrade = wokeGrade; + this.bangfuGrade = bangfuGrade; + this.totalGrade = totalGrade; + this.perforMance = perforMance; + this.dayMoney = dayMoney; + this.totalMoney = totalMoney; + this.trafficMoney = trafficMoney; + this.isDrive = isDrive; + this.type = type; + this.photo = photo; + this.sealName = sealName; + this.iaList = iaList; + } + + public String getSealName() { + return sealName; + } + + public void setSealName(String sealName) { + this.sealName = sealName; + } + + public List getIaList() { + return iaList; + } + + public void setIaList(List iaList) { + this.iaList = iaList; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getDoctorName() { + return doctorName; + } + + public void setDoctorName(String doctorName) { + this.doctorName = doctorName; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public Integer getDay() { + return day; + } + + public void setDay(Integer day) { + this.day = day; + } + + public String getReceiveHospitalName() { + return receiveHospitalName; + } + + public void setReceiveHospitalName(String receiveHospitalName) { + this.receiveHospitalName = receiveHospitalName; + } + + public String getReceiveHospitalId() { + return receiveHospitalId; + } + + public void setReceiveHospitalId(String receiveHospitalId) { + this.receiveHospitalId = receiveHospitalId; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getFeedbackImg() { + return feedbackImg; + } + + public void setFeedbackImg(String feedbackImg) { + this.feedbackImg = feedbackImg; + } + + public String getWorkType() { + return workType; + } + + public void setWorkType(String workType) { + this.workType = workType; + } + + public String getDevelopWork() { + return developWork; + } + + public void setDevelopWork(String developWork) { + this.developWork = developWork; + } + + public String getDoctorTntroduce() { + return doctorTntroduce; + } + + public void setDoctorTntroduce(String doctorTntroduce) { + this.doctorTntroduce = doctorTntroduce; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getFeedbackTime() { + return feedbackTime; + } + + public void setFeedbackTime(Date feedbackTime) { + this.feedbackTime = feedbackTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getArrangeChamber() { + return arrangeChamber; + } + + public void setArrangeChamber(String arrangeChamber) { + this.arrangeChamber = arrangeChamber; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getEvaluate() { + return evaluate; + } + + public void setEvaluate(String evaluate) { + this.evaluate = evaluate; + } + + public String getNewProject() { + return newProject; + } + + public void setNewProject(String newProject) { + this.newProject = newProject; + } + + public String getHelpPlan() { + return helpPlan; + } + + public void setHelpPlan(String helpPlan) { + this.helpPlan = helpPlan; + } + + public String getLabourGrade() { + return labourGrade; + } + + public void setLabourGrade(String labourGrade) { + this.labourGrade = labourGrade; + } + + public String getMannerGrade() { + return mannerGrade; + } + + public void setMannerGrade(String mannerGrade) { + this.mannerGrade = mannerGrade; + } + + public String getAssistGrade() { + return assistGrade; + } + + public void setAssistGrade(String assistGrade) { + this.assistGrade = assistGrade; + } + + public String getWokeGrade() { + return wokeGrade; + } + + public void setWokeGrade(String wokeGrade) { + this.wokeGrade = wokeGrade; + } + + public String getBangfuGrade() { + return bangfuGrade; + } + + public void setBangfuGrade(String bangfuGrade) { + this.bangfuGrade = bangfuGrade; + } + + public String getTotalGrade() { + return totalGrade; + } + + public void setTotalGrade(String totalGrade) { + this.totalGrade = totalGrade; + } + + public String getPerforMance() { + return perforMance; + } + + public void setPerforMance(String perforMance) { + this.perforMance = perforMance; + } + + public String getDayMoney() { + return dayMoney; + } + + public void setDayMoney(String dayMoney) { + this.dayMoney = dayMoney; + } + + public String getTotalMoney() { + return totalMoney; + } + + public void setTotalMoney(String totalMoney) { + this.totalMoney = totalMoney; + } + + public String getTrafficMoney() { + return trafficMoney; + } + + public void setTrafficMoney(String trafficMoney) { + this.trafficMoney = trafficMoney; + } + + public String getIsDrive() { + return isDrive; + } + + public void setIsDrive(String isDrive) { + this.isDrive = isDrive; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorGroup.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorGroup.java new file mode 100644 index 0000000..e3fdee5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/DoctorGroup.java @@ -0,0 +1,248 @@ +package com.imurs.entity; + + + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.util.Date; + +/** + * + * @TableName doctor_group + */ +@TableName(value ="doctor_group") +public class DoctorGroup { + /** + * + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 分组名称 + */ + @TableField(value = "group_name") + private String groupName; + + /** + * 是否可转诊 + */ + @TableField(value = "referrable") + private Integer referrable; + + /** + * 分组别名 + */ + @TableField(value = "group_alias") + private String groupAlias; + + /** + * 分组描述 + */ + + @TableField(value = "description") + private String description; + + /** + * 组长医生ID + */ + @TableField(value = "leader_doctor_id") + private Long leaderDoctorId; + + /** + * 状态 1-启用 0-停用 + */ + @TableField(value = "status") + private Integer status; + + /** + * + */ + @TableField(value = "create_time") + private Date createTime; + + /** + * + */ + @TableField(value = "update_time") + private Date updateTime; + + /** + * + */ + public Long getId() { + return id; + } + + /** + * + */ + public void setId(Long id) { + this.id = id; + } + + public Integer getReferrable() { + return referrable; + } + + public void setReferrable(Integer referrable) { + this.referrable = referrable; + } + + /** + * 分组名称 + */ + public String getGroupName() { + return groupName; + } + + /** + * 分组名称 + */ + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + /** + * 分组别名 + */ + public String getGroupAlias() { + return groupAlias; + } + + /** + * 分组别名 + */ + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + /** + * 分组描述 + */ + public String getDescription() { + return description; + } + + /** + * 分组描述 + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 组长医生ID + */ + public Long getLeaderDoctorId() { + return leaderDoctorId; + } + + /** + * 组长医生ID + */ + public void setLeaderDoctorId(Long leaderDoctorId) { + this.leaderDoctorId = leaderDoctorId; + } + + /** + * 状态 1-启用 0-停用 + */ + public Integer getStatus() { + return status; + } + + /** + * 状态 1-启用 0-停用 + */ + public void setStatus(Integer status) { + this.status = status; + } + + /** + * + */ + public Date getCreateTime() { + return createTime; + } + + /** + * + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + DoctorGroup other = (DoctorGroup) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getGroupName() == null ? other.getGroupName() == null : this.getGroupName().equals(other.getGroupName())) + && (this.getGroupAlias() == null ? other.getGroupAlias() == null : this.getGroupAlias().equals(other.getGroupAlias())) + && (this.getDescription() == null ? other.getDescription() == null : this.getDescription().equals(other.getDescription())) + && (this.getLeaderDoctorId() == null ? other.getLeaderDoctorId() == null : this.getLeaderDoctorId().equals(other.getLeaderDoctorId())) + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())) && (this.getReferrable() == null ? other.getReferrable() == null : this.getReferrable().equals(other.getReferrable())) + && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getGroupName() == null) ? 0 : getGroupName().hashCode()); + result = prime * result + ((getGroupAlias() == null) ? 0 : getGroupAlias().hashCode()); + result = prime * result + ((getDescription() == null) ? 0 : getDescription().hashCode()); + result = prime * result + ((getLeaderDoctorId() == null) ? 0 : getLeaderDoctorId().hashCode()); + result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getReferrable() == null) ? 0 : getReferrable().hashCode()); + result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); + result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode()); + return result; + } + + @Override + public String toString() { + String sb = getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", groupName=" + groupName + + ", groupAlias=" + groupAlias + + ", description=" + description + + ", leaderDoctorId=" + leaderDoctorId + + ", status=" + status + + ", referrable=" + referrable + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + "]"; + return sb; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/HomePageShow.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/HomePageShow.java new file mode 100644 index 0000000..172c402 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/HomePageShow.java @@ -0,0 +1,129 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 首页信息表 + * + * @author Server + * + */ +@TableName("home_page_show") +public class HomePageShow implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 标题/医院名称 + */ + private String title; + + /** + * 特殊简介(医院特色描述)/科室简介 + */ + private String special; + + /** + * 内容/医院简介 + */ + private String content; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + /** + * 类型(A、政策宣导、领导关怀 B、长沙市政策宣导 C、长沙市第一医院风采 D医联体合作单位) + */ + private String type; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + + public HomePageShow(Long id, String title, String special, String content, String imgUrl, String type, + Date createTime) { + super(); + this.id = id; + this.title = title; + this.special = special; + this.content = content; + this.imgUrl = imgUrl; + this.type = type; + this.createTime = createTime; + } + + public HomePageShow() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public String getSpecial() { + return special; + } + + public void setSpecial(String special) { + this.special = special == null ? null : special.trim(); + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content == null ? null : content.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ImgArrange.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ImgArrange.java new file mode 100644 index 0000000..ec35cd9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/ImgArrange.java @@ -0,0 +1,92 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * (医生排班表图片) + * @author Server + * + */ +@TableName("img_arrange") +public class ImgArrange implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + @TableField("arrange_id") + private Long arrangeId; + + /** + * 图片类型A、医生照片 B、工作照片 + */ + private String type; + + /** + * 图片路径 + */ + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public ImgArrange(Long id, Long arrangeId, String type, String imgUrl, Date createTime) { + this.id = id; + this.arrangeId = arrangeId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + } + + public ImgArrange() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getArrangeId() { + return arrangeId; + } + + public void setArrangeId(Long arrangeId) { + this.arrangeId = arrangeId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type == null ? null : type.trim(); + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentBlood.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentBlood.java new file mode 100644 index 0000000..4f24c4d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentBlood.java @@ -0,0 +1,173 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_blood") +public class InoneagentBlood implements Serializable { + @Override + public String toString() { + return "InoneagentBlood [id=" + id + ", idnumber=" + idnumber + ", oxygen=" + oxygen + ", pulserate=" + + pulserate + ", examtype=" + examtype + ", glucose=" + glucose + ", machineno=" + machineno + + ", oxygExamtime=" + oxygExamtime + ", glucoseExamtime=" + glucoseExamtime + ", pressureExamtime=" + + pressureExamtime + ", pressureExamtype=" + pressureExamtype + ", systolic=" + systolic + + ", diastolic=" + diastolic + "]"; + } + + private Integer id; + //身份证号 + private String idnumber; + //血氧饱和度 + private String oxygen; + //脉率 + private String pulserate; + // + private String examtype; +//血糖值 + private String glucose; +//设备编号 + private String machineno; + //血氧 检查时间 + @TableField("oxyg_examtime") + private String oxygExamtime; + //血糖 检查时间 + @TableField("glucose_examtime") + private String glucoseExamtime; + //血压 检查时间 + @TableField("pressure_examtime") + private String pressureExamtime; + //血压检查类型 1:左 2:右 检查类型 + @TableField("pressure_examtype") + private String pressureExamtype; + //收缩压 + private String systolic; +//舒张压 + private String diastolic; + + private static final long serialVersionUID = 1L; + + public InoneagentBlood(Integer id, String idnumber, String oxygen, String pulserate, String examtype, String glucose, String machineno, String oxygExamtime, String glucoseExamtime, String pressureExamtime, String pressureExamtype, String systolic, String diastolic) { + this.id = id; + this.idnumber = idnumber; + this.oxygen = oxygen; + this.pulserate = pulserate; + this.examtype = examtype; + this.glucose = glucose; + this.machineno = machineno; + this.oxygExamtime = oxygExamtime; + this.glucoseExamtime = glucoseExamtime; + this.pressureExamtime = pressureExamtime; + this.pressureExamtype = pressureExamtype; + this.systolic = systolic; + this.diastolic = diastolic; + } + + public InoneagentBlood() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getOxygen() { + return oxygen; + } + + public void setOxygen(String oxygen) { + this.oxygen = oxygen == null ? null : oxygen.trim(); + } + + public String getPulserate() { + return pulserate; + } + + public void setPulserate(String pulserate) { + this.pulserate = pulserate == null ? null : pulserate.trim(); + } + + public String getExamtype() { + return examtype; + } + + public void setExamtype(String examtype) { + this.examtype = examtype == null ? null : examtype.trim(); + } + + public String getGlucose() { + return glucose; + } + + public void setGlucose(String glucose) { + this.glucose = glucose == null ? null : glucose.trim(); + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getOxygExamtime() { + return oxygExamtime; + } + + public void setOxygExamtime(String oxygExamtime) { + this.oxygExamtime = oxygExamtime == null ? null : oxygExamtime.trim(); + } + + public String getGlucoseExamtime() { + return glucoseExamtime; + } + + public void setGlucoseExamtime(String glucoseExamtime) { + this.glucoseExamtime = glucoseExamtime == null ? null : glucoseExamtime.trim(); + } + + public String getPressureExamtime() { + return pressureExamtime; + } + + public void setPressureExamtime(String pressureExamtime) { + this.pressureExamtime = pressureExamtime == null ? null : pressureExamtime.trim(); + } + + public String getPressureExamtype() { + return pressureExamtype; + } + + public void setPressureExamtype(String pressureExamtype) { + this.pressureExamtype = pressureExamtype == null ? null : pressureExamtype.trim(); + } + + public String getSystolic() { + return systolic; + } + + public void setSystolic(String systolic) { + this.systolic = systolic == null ? null : systolic.trim(); + } + + public String getDiastolic() { + return diastolic; + } + + public void setDiastolic(String diastolic) { + this.diastolic = diastolic == null ? null : diastolic.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentEcg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentEcg.java new file mode 100644 index 0000000..cb44677 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentEcg.java @@ -0,0 +1,211 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_ecg") +public class InoneagentEcg implements Serializable { + private Integer id; + + private String machineno; + + private String idnumber; + //心率 + private String hr; +//P轴 + private String paxis; + //T轴 + private String taxis; +//QRS轴 + private String qrsaxis; + + @Override + public String toString() { + return "InoneagentEcg [id=" + id + ", machineno=" + machineno + ", idnumber=" + idnumber + ", hr=" + hr + + ", paxis=" + paxis + ", taxis=" + taxis + ", qrsaxis=" + qrsaxis + ", pr=" + pr + ", qt=" + qt + + ", qtc=" + qtc + ", qrs=" + qrs + ", rv5=" + rv5 + ", sv1=" + sv1 + ", diagnosis=" + diagnosis + + ", filename=" + filename + ", examtime=" + examtime + ", createtime=" + createtime + "]"; + } + //PR间期 + private String pr; +//QT间期 + private String qt; +//QTc间期 + private String qtc; +//QRS时限 + private String qrs; +//RV5值 + private String rv5; +//SV1值 + private String sv1; +//诊断结果 + private String diagnosis; +//心电文件路径 + private String filename; +//检查日期 + private String examtime; +//创建时间 + private String createtime; + + private static final long serialVersionUID = 1L; + + public InoneagentEcg(Integer id, String machineno, String idnumber, String hr, String paxis, String taxis, String qrsaxis, String pr, String qt, String qtc, String qrs, String rv5, String sv1, String diagnosis, String filename, String examtime, String createtime) { + this.id = id; + this.machineno = machineno; + this.idnumber = idnumber; + this.hr = hr; + this.paxis = paxis; + this.taxis = taxis; + this.qrsaxis = qrsaxis; + this.pr = pr; + this.qt = qt; + this.qtc = qtc; + this.qrs = qrs; + this.rv5 = rv5; + this.sv1 = sv1; + this.diagnosis = diagnosis; + this.filename = filename; + this.examtime = examtime; + this.createtime = createtime; + } + + public InoneagentEcg() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getHr() { + return hr; + } + + public void setHr(String hr) { + this.hr = hr == null ? null : hr.trim(); + } + + public String getPaxis() { + return paxis; + } + + public void setPaxis(String paxis) { + this.paxis = paxis == null ? null : paxis.trim(); + } + + public String getTaxis() { + return taxis; + } + + public void setTaxis(String taxis) { + this.taxis = taxis == null ? null : taxis.trim(); + } + + public String getQrsaxis() { + return qrsaxis; + } + + public void setQrsaxis(String qrsaxis) { + this.qrsaxis = qrsaxis == null ? null : qrsaxis.trim(); + } + + public String getPr() { + return pr; + } + + public void setPr(String pr) { + this.pr = pr == null ? null : pr.trim(); + } + + public String getQt() { + return qt; + } + + public void setQt(String qt) { + this.qt = qt == null ? null : qt.trim(); + } + + public String getQtc() { + return qtc; + } + + public void setQtc(String qtc) { + this.qtc = qtc == null ? null : qtc.trim(); + } + + public String getQrs() { + return qrs; + } + + public void setQrs(String qrs) { + this.qrs = qrs == null ? null : qrs.trim(); + } + + public String getRv5() { + return rv5; + } + + public void setRv5(String rv5) { + this.rv5 = rv5 == null ? null : rv5.trim(); + } + + public String getSv1() { + return sv1; + } + + public void setSv1(String sv1) { + this.sv1 = sv1 == null ? null : sv1.trim(); + } + + public String getDiagnosis() { + return diagnosis; + } + + public void setDiagnosis(String diagnosis) { + this.diagnosis = diagnosis == null ? null : diagnosis.trim(); + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename == null ? null : filename.trim(); + } + + public String getExamtime() { + return examtime; + } + + public void setExamtime(String examtime) { + this.examtime = examtime == null ? null : examtime.trim(); + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime == null ? null : createtime.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentPersion.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentPersion.java new file mode 100644 index 0000000..c6f64b3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentPersion.java @@ -0,0 +1,194 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_persion") +public class InoneagentPersion implements Serializable { + private Integer id; + //姓名 + private String personname; +//身份证号 + private String idnumber; +//出生日期 + private String birthday; +//性别 + private String sex; +//民族 + private String nation; +//电话 + private String tel; +//户籍地 + private String domicile; +//住址 + private String address; +//建档日期 + private String archivedate; + + private String createtime; +//体温 + private String temperature; +//身高 + private String height; + // + private String machineno; + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno; + } +//体重 + private String weight; + //体温检查时间 + @TableField("tep_examtime")// + private String tepExamtime; + //身高体重时间 + @TableField("hw_examtime") + private String hwExamtime; + + private static final long serialVersionUID = 1L; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getPersonname() { + return personname; + } + + public void setPersonname(String personname) { + this.personname = personname; + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getDomicile() { + return domicile; + } + + public void setDomicile(String domicile) { + this.domicile = domicile; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getArchivedate() { + return archivedate; + } + + public void setArchivedate(String archivedate) { + this.archivedate = archivedate; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getTepExamtime() { + return tepExamtime; + } + + public void setTepExamtime(String tepExamtime) { + this.tepExamtime = tepExamtime; + } + + public String getHwExamtime() { + return hwExamtime; + } + + public void setHwExamtime(String hwExamtime) { + this.hwExamtime = hwExamtime; + } + + @Override + public String toString() { + return "InoneagentPersion [id=" + id + ", personname=" + personname + ", idnumber=" + idnumber + ", birthday=" + + birthday + ", sex=" + sex + ", nation=" + nation + ", tel=" + tel + ", domicile=" + domicile + + ", address=" + address + ", archivedate=" + archivedate + ", createtime=" + createtime + + ", temperature=" + temperature + ", height=" + height + ", machineno=" + machineno + ", weight=" + + weight + ", tepExamtime=" + tepExamtime + ", hwExamtime=" + hwExamtime + "]"; + } + + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentUrine.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentUrine.java new file mode 100644 index 0000000..117da6f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InoneagentUrine.java @@ -0,0 +1,200 @@ +package com.imurs.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotations.TableName; +@TableName("inoneagent_urine") +public class InoneagentUrine implements Serializable { + @Override + public String toString() { + return "InoneagentUrine [id=" + id + ", machineno=" + machineno + ", idnumber=" + idnumber + ", uro=" + uro + + ", bld=" + bld + ", bil=" + bil + ", ket=" + ket + ", glu=" + glu + ", pro=" + pro + ", ph=" + ph + + ", nit=" + nit + ", wbc=" + wbc + ", sg=" + sg + ", vc=" + vc + ", examtime=" + examtime + + ", createtime=" + createtime + "]"; + } + + private Integer id; + + private String machineno; + + private String idnumber; + //尿胆原 + private String uro; + //潜血 + private String bld; + //胆红素 + private String bil; + //酮体 + private String ket; + //葡萄糖 + private String glu; + //蛋白质 + private String pro; + //PH + private String ph; + //亚硝酸盐 + private String nit; + //白细胞 + private String wbc; + //比重 + private String sg; + //维生素C + private String vc; + //检查日期 + private String examtime; + //尿胆原 + private String createtime; + + private static final long serialVersionUID = 1L; + + public InoneagentUrine(Integer id, String machineno, String idnumber, String uro, String bld, String bil, String ket, String glu, String pro, String ph, String nit, String wbc, String sg, String vc, String examtime, String createtime) { + this.id = id; + this.machineno = machineno; + this.idnumber = idnumber; + this.uro = uro; + this.bld = bld; + this.bil = bil; + this.ket = ket; + this.glu = glu; + this.pro = pro; + this.ph = ph; + this.nit = nit; + this.wbc = wbc; + this.sg = sg; + this.vc = vc; + this.examtime = examtime; + this.createtime = createtime; + } + + public InoneagentUrine() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMachineno() { + return machineno; + } + + public void setMachineno(String machineno) { + this.machineno = machineno == null ? null : machineno.trim(); + } + + public String getIdnumber() { + return idnumber; + } + + public void setIdnumber(String idnumber) { + this.idnumber = idnumber == null ? null : idnumber.trim(); + } + + public String getUro() { + return uro; + } + + public void setUro(String uro) { + this.uro = uro == null ? null : uro.trim(); + } + + public String getBld() { + return bld; + } + + public void setBld(String bld) { + this.bld = bld == null ? null : bld.trim(); + } + + public String getBil() { + return bil; + } + + public void setBil(String bil) { + this.bil = bil == null ? null : bil.trim(); + } + + public String getKet() { + return ket; + } + + public void setKet(String ket) { + this.ket = ket == null ? null : ket.trim(); + } + + public String getGlu() { + return glu; + } + + public void setGlu(String glu) { + this.glu = glu == null ? null : glu.trim(); + } + + public String getPro() { + return pro; + } + + public void setPro(String pro) { + this.pro = pro == null ? null : pro.trim(); + } + + public String getPh() { + return ph; + } + + public void setPh(String ph) { + this.ph = ph == null ? null : ph.trim(); + } + + public String getNit() { + return nit; + } + + public void setNit(String nit) { + this.nit = nit == null ? null : nit.trim(); + } + + public String getWbc() { + return wbc; + } + + public void setWbc(String wbc) { + this.wbc = wbc == null ? null : wbc.trim(); + } + + public String getSg() { + return sg; + } + + public void setSg(String sg) { + this.sg = sg == null ? null : sg.trim(); + } + + public String getVc() { + return vc; + } + + public void setVc(String vc) { + this.vc = vc == null ? null : vc.trim(); + } + + public String getExamtime() { + return examtime; + } + + public void setExamtime(String examtime) { + this.examtime = examtime == null ? null : examtime.trim(); + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime == null ? null : createtime.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InstallModel.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InstallModel.java new file mode 100644 index 0000000..4c07c6d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/InstallModel.java @@ -0,0 +1,134 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; + +@TableName("install_model") +public class InstallModel implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id",type = IdType.AUTO) + private Integer id; + + /** + * 麦克风型号 + */ + @TableField("micro") + private String micro; + + /** + * 扬声器型号 + */ + @TableField("speaker") + private String speaker; + + /** + * 摄像头型号 + */ + @TableField("camera") + private String camera; + + /** + * 分辨率 + */ + @TableField("resolution") + private String resolution; + + /** + * 视频类别 + * 超声视频:BMODEL + * 远程会诊视频:CON + */ + @TableField("type") + private String type; + + /** + * 所属医院id + */ + @TableField("hospital_id") + private String hospitalId; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getMicro() { + return micro; + } + + public void setMicro(String micro) { + this.micro = micro; + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker; + } + + public String getCamera() { + return camera; + } + + public void setCamera(String camera) { + this.camera = camera; + } + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + public InstallModel() {} + + public InstallModel(Integer id, String micro, String speaker, String camera, String resolution, + String type, String hospitalId) { + this.id = id; + this.micro = micro; + this.speaker = speaker; + this.camera = camera; + this.resolution = resolution; + this.type = type; + this.hospitalId = hospitalId; + } + + @Override + public String toString() { + return "InstallModel [id=" + id + ", micro=" + micro + ", speaker=" + speaker + ", camera=" + camera + + ", resolution=" + resolution + ", type=" + type + ", hospitalId=" + hospitalId + "]"; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LayoutConfig.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LayoutConfig.java new file mode 100644 index 0000000..b87e82a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LayoutConfig.java @@ -0,0 +1,253 @@ +package com.imurs.entity; + +import java.io.Serializable; +/** + * @ + * @Author xfh + * @Date 2020/10/28 16:07 + * @Param + * @Return + * @Exception + * //当 mixedVideoLayout 设为 3 时,可以通过该参数自定义合流布局 + */ +public class LayoutConfig implements Serializable { + + //(选填)String 类型 + private String uid; + + //(必填)Float 类型。屏幕里该画面左上角的横坐标的相对值 + private Float x_axis; + + //(必填)Float 类型。屏幕里该画面左上角的纵坐标的相对值 + private Float y_axis; + + //(必填)Float 类型。该画面宽度的相对值 + private Float width; + + //(必填)Float 类型。该画面高度的相对值 + private Float height; + + //(选填)Float 类型。图像的透明度 + private Float alpha; + + //(选填)Number 类型。画面显示模式(0:(默认)裁剪模式 1:缩放模式) + private Float render_mode; + + private String url; + + private String appid; + private Integer streamTypes; + private String cname; + private Integer channelType; + private String rdirectory; + private String sdirectory; + private Integer twidth; + private Integer theight; + private Integer fps; + private Integer bitrate; + private Integer mixedVideoLayout; + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public Float getX_axis() { + return x_axis; + } + + public void setX_axis(Float x_axis) { + this.x_axis = x_axis; + } + + public Float getY_axis() { + return y_axis; + } + + public void setY_axis(Float y_axis) { + this.y_axis = y_axis; + } + + public Float getWidth() { + return width; + } + + public void setWidth(Float width) { + this.width = width; + } + + public Float getHeight() { + return height; + } + + public void setHeight(Float height) { + this.height = height; + } + + public Float getAlpha() { + return alpha; + } + + public void setAlpha(Float alpha) { + this.alpha = alpha; + } + + public Float getRender_mode() { + return render_mode; + } + + public void setRender_mode(Float render_mode) { + this.render_mode = render_mode; + } + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public Integer getStreamTypes() { + return streamTypes; + } + + public void setStreamTypes(Integer streamTypes) { + this.streamTypes = streamTypes; + } + + public String getCname() { + return cname; + } + + public void setCname(String cname) { + this.cname = cname; + } + + public Integer getChannelType() { + return channelType; + } + + public void setChannelType(Integer channelType) { + this.channelType = channelType; + } + + public String getRdirectory() { + return rdirectory; + } + + public void setRdirectory(String rdirectory) { + this.rdirectory = rdirectory; + } + + public String getSdirectory() { + return sdirectory; + } + + public void setSdirectory(String sdirectory) { + this.sdirectory = sdirectory; + } + + public Integer getTwidth() { + return twidth; + } + + public void setTwidth(Integer twidth) { + this.twidth = twidth; + } + + public Integer getTheight() { + return theight; + } + + public void setTheight(Integer theight) { + this.theight = theight; + } + + public Integer getFps() { + return fps; + } + + public void setFps(Integer fps) { + this.fps = fps; + } + + public Integer getBitrate() { + return bitrate; + } + + public void setBitrate(Integer bitrate) { + this.bitrate = bitrate; + } + + public Integer getMixedVideoLayout() { + return mixedVideoLayout; + } + + public void setMixedVideoLayout(Integer mixedVideoLayout) { + this.mixedVideoLayout = mixedVideoLayout; + } + + public LayoutConfig() { + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public LayoutConfig(String uid, Float x_axis, Float y_axis, Float width, Float height, Float alpha, Float render_mode, String appid, + Integer streamTypes, String cname, Integer channelType, String rdirectory, String sdirectory, Integer twidth, + Integer theight, Integer fps, Integer bitrate, Integer mixedVideoLayout,String url) { + this.uid = uid; + this.x_axis = x_axis; + this.y_axis = y_axis; + this.width = width; + this.height = height; + this.alpha = alpha; + this.render_mode = render_mode; + this.appid = appid; + this.streamTypes = streamTypes; + this.cname = cname; + this.channelType = channelType; + this.rdirectory = rdirectory; + this.sdirectory = sdirectory; + this.twidth = twidth; + this.theight = theight; + this.fps = fps; + this.bitrate = bitrate; + this.mixedVideoLayout = mixedVideoLayout; + this.url = url; + } + + @Override + public String toString() { + return "LayoutConfig{" + + "uid='" + uid + '\'' + + ", x_axis=" + x_axis + + ", y_axis=" + y_axis + + ", width=" + width + + ", height=" + height + + ", alpha=" + alpha + + ", render_mode=" + render_mode + + ", url='" + url + '\'' + + ", appid='" + appid + '\'' + + ", streamTypes=" + streamTypes + + ", cname='" + cname + '\'' + + ", channelType=" + channelType + + ", rdirectory='" + rdirectory + '\'' + + ", sdirectory='" + sdirectory + '\'' + + ", twidth=" + twidth + + ", theight=" + theight + + ", fps=" + fps + + ", bitrate=" + bitrate + + ", mixedVideoLayout=" + mixedVideoLayout + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Live.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Live.java new file mode 100644 index 0000000..38fe985 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Live.java @@ -0,0 +1,148 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableLogic; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +public class Live implements Serializable { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField("r_id") + private Long rId; + + private Integer state; + + @TableField("live_url") + private String liveUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("end_time") + private Date endTime; + + @TableField("all_time") + private Integer allTime; + + private String title ; + + private String doctor; + + private String departments; + + @TableField("application_time") + private Date applicationTime; + + public String getDoctor() { + return doctor; + } + + public void setDoctor(String doctor) { + this.doctor = doctor; + } + + public String getDepartments() { + return departments; + } + + public void setDepartments(String departments) { + this.departments = departments; + } + + public Date getApplicationTime() { + return applicationTime; + } + + public void setApplicationTime(Date applicationTime) { + this.applicationTime = applicationTime; + } + + + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getrId() { + return rId; + } + + public void setrId(Long rId) { + this.rId = rId; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getLiveUrl() { + return liveUrl; + } + + public void setLiveUrl(String liveUrl) { + this.liveUrl = liveUrl; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Integer getAllTime() { + return allTime; + } + + public void setAllTime(Integer allTime) { + this.allTime = allTime; + } + + public Live() { + } + + public Live(Long id, Long rId, Integer state, String liveUrl, Date createTime, Date endTime, Integer allTime, String title, String doctor, + String departments, Date applicationTime) { + this.id = id; + this.rId = rId; + this.state = state; + this.liveUrl = liveUrl; + this.createTime = createTime; + this.endTime = endTime; + this.allTime = allTime; + this.title = title; + this.doctor = doctor; + this.departments = departments; + this.applicationTime = applicationTime; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LoginRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LoginRecord.java new file mode 100644 index 0000000..e8d9069 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/LoginRecord.java @@ -0,0 +1,115 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 用户登录记录表 + * + * @author dgg + * + */ +@TableName("login_record") +public class LoginRecord implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 登录id + */ + @TableField("login_id") + private String loginId; + + /** + * 登录名称 + */ + @TableField("login_name") + private String loginName; + + /** + * 登录ip + */ + private String ip; + + /** + * 登录角色 + */ + private String rid; + + /** + * 登录时间 + */ + @TableField("create_time") + private Date createTime; + + public LoginRecord() { + super(); + } + + public LoginRecord(Integer id, String loginId, String loginName, String ip, String rid, Date createTime) { + super(); + this.id = id; + this.loginId = loginId; + this.loginName = loginName; + this.ip = ip; + this.rid = rid; + this.createTime = createTime; + } + + private static final long serialVersionUID = 1L; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getLoginName() { + return loginName; + } + + public void setLoginName(String loginName) { + this.loginName = loginName; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Patient.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Patient.java new file mode 100644 index 0000000..de12e4c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Patient.java @@ -0,0 +1,313 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient") +public class Patient implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 患者姓名 + */ + @TableField("patient_name") + private String patientName; + + private Integer age; + + private String sex; + + /** + * 出生日期 + */ + @TableField("birth_date") + private String birthDate; + + /** + * 婚姻状况 + */ + private String marriage; + + /** + * 出生日期 + */ + @TableField("patient_job") + private String patientJob; + + /** + * 家庭住址 + */ + private String family; + + /** + * 家庭电话 + */ + @TableField("family_phone") + private String familyPhone; + + /** + * 紧急联系人 + */ + private String urgency; + + /** + * 紧急联系人关系 + */ + private String relation; + + /** + * 紧急联系人电话 + */ + @TableField("urgency_phone") + private String urgencyPhone; + + /** + * 身份证号码 + */ + private String card; + + /** + * 医生id/第一次输入的医生id + */ + @TableField("doc_id") + private Long docId; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + private String phone; + + @TableField("hospital_id") + private String hospitalId; + + @TableField("esrd_number") + private String esrdNumber; + + @TableField("his_esrd_number") + private String hisEsrdNumber; + + @TableField("out_patien") + private String outPatien; + + private static final long serialVersionUID = 1L; + + public Patient(Long id, String patientName, Integer age, String sex, String birthDate, String marriage, + String patientJob, String family, String familyPhone, String urgency, String relation, String urgencyPhone, + String card, Long docId, Date createTime, Date updateTime, String phone, String hospitalId, + String esrdNumber, String hisEsrdNumber, String outPatien) { + super(); + this.id = id; + this.patientName = patientName; + this.age = age; + this.sex = sex; + this.birthDate = birthDate; + this.marriage = marriage; + this.patientJob = patientJob; + this.family = family; + this.familyPhone = familyPhone; + this.urgency = urgency; + this.relation = relation; + this.urgencyPhone = urgencyPhone; + this.card = card; + this.docId = docId; + this.createTime = createTime; + this.updateTime = updateTime; + this.phone = phone; + this.hospitalId = hospitalId; + this.esrdNumber = esrdNumber; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public Patient() { + super(); + } + + public String getEsrdNumber() { + return esrdNumber; + } + + public void setEsrdNumber(String esrdNumber) { + this.esrdNumber = esrdNumber; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPatientName() { + return patientName; + } + + public void setPatientName(String patientName) { + this.patientName = patientName == null ? null : patientName.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex == null ? null : sex.trim(); + } + + public String getBirthDate() { + return birthDate; + } + + public void setBirthDate(String string) { + this.birthDate = string; + } + + public String getMarriage() { + return marriage; + } + + public void setMarriage(String marriage) { + this.marriage = marriage == null ? null : marriage.trim(); + } + + public String getPatientJob() { + return patientJob; + } + + public void setPatientJob(String patientJob) { + this.patientJob = patientJob == null ? null : patientJob.trim(); + } + + public String getFamily() { + return family; + } + + public void setFamily(String family) { + this.family = family == null ? null : family.trim(); + } + + public String getFamilyPhone() { + return familyPhone; + } + + public void setFamilyPhone(String familyPhone) { + this.familyPhone = familyPhone == null ? null : familyPhone.trim(); + } + + public String getUrgency() { + return urgency; + } + + public void setUrgency(String urgency) { + this.urgency = urgency == null ? null : urgency.trim(); + } + + public String getRelation() { + return relation; + } + + public void setRelation(String relation) { + this.relation = relation == null ? null : relation.trim(); + } + + public String getUrgencyPhone() { + return urgencyPhone; + } + + public void setUrgencyPhone(String urgencyPhone) { + this.urgencyPhone = urgencyPhone == null ? null : urgencyPhone.trim(); + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card == null ? null : card.trim(); + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "Patient [id=" + id + ", patientName=" + patientName + ", age=" + age + ", sex=" + sex + ", birthDate=" + + birthDate + ", marriage=" + marriage + ", patientJob=" + patientJob + ", family=" + family + + ", familyPhone=" + familyPhone + ", urgency=" + urgency + ", relation=" + relation + ", urgencyPhone=" + + urgencyPhone + ", card=" + card + ", docId=" + docId + ", createTime=" + createTime + ", updateTime=" + + updateTime + ", phone=" + phone + ", hospitalId=" + hospitalId + ", esrdNumber=" + esrdNumber + "]"; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUser.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUser.java new file mode 100644 index 0000000..9c11138 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUser.java @@ -0,0 +1,224 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user") +public class PatientUser implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String account; + + @TableField("pt_name") + private String ptName; + + private Integer age; + + private String phone; + + private String password; + + @TableField("pt_img") + private String ptImg; + + private Integer parity; + + private Integer ectroma; + + private String card; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("pt_iccid") + private String ptIccid; + + private Integer rid; + + @TableField("rp_id") + private String rpId; + + private Integer state; + + private String salt; + + + + public PatientUser(Integer id, String account, String ptName, Integer age, String phone, String password, + String ptImg, Integer parity, Integer ectroma, String card, Date createTime, Date updateTime, + String ptIccid, Integer rid, String rpId, Integer state,String salt) { + super(); + this.id = id; + this.account = account; + this.ptName = ptName; + this.age = age; + this.phone = phone; + this.password = password; + this.ptImg = ptImg; + this.parity = parity; + this.ectroma = ectroma; + this.card = card; + this.createTime = createTime; + this.updateTime = updateTime; + this.ptIccid = ptIccid; + this.rid = rid; + this.rpId = rpId; + this.state = state; + this.salt = salt; + } + + public PatientUser() { + super(); + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account == null ? null : account.trim(); + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName == null ? null : ptName.trim(); + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone == null ? null : phone.trim(); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password == null ? null : password.trim(); + } + + public String getPtImg() { + return ptImg; + } + + public void setPtImg(String ptImg) { + this.ptImg = ptImg == null ? null : ptImg.trim(); + } + + public Integer getParity() { + return parity; + } + + public void setParity(Integer parity) { + this.parity = parity; + } + + public Integer getEctroma() { + return ectroma; + } + + public void setEctroma(Integer ectroma) { + this.ectroma = ectroma; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card == null ? null : card.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getPtIccid() { + return ptIccid; + } + + public void setPtIccid(String ptIccid) { + this.ptIccid = ptIccid == null ? null : ptIccid.trim(); + } + + public Integer getRid() { + return rid; + } + + public void setRid(Integer rid) { + this.rid = rid; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecord.java new file mode 100644 index 0000000..a7106f2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecord.java @@ -0,0 +1,427 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user_record") +public class PatientUserRecord implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + @TableField("pt_uid") + private Integer ptUid; + + @TableField("pt_card") + private String ptCard; + + private String hbp; + + private String idh; + + private String glu; + + private String bgs; + + private String temp; + + private String hrrest; + + private String weight; + + private String ua; + + private String tcho; + + private String trig; + + private String fhr; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("pt_name") + private String ptName; + + private Integer uro; + + @TableField("glu_two") + private Integer gluTwo; + + private Integer ket; + + private Integer bil; + + private Integer pro; + + private Integer nit; + + private Integer ph; + + private Integer bld; + + private Integer sg; + + private Integer leu; + + private Integer vc; + + private Integer cr; + + private Integer ca; + + private Integer ma; + + @TableField(exist=false) + private List imgList; + + @TableField(exist=false) + private String account; + + @TableField(exist=false) + private Integer age; + + @TableField(exist=false) + private String parity; + + private static final long serialVersionUID = 1L; + + + public PatientUserRecord(Integer id, Integer ptUid, String ptCard, String hbp, String idh, String glu, String bgs, + String temp, String hrrest, String weight, String ua, String tcho, String trig, String fhr, Date createTime, + Date updateTime, String ptName, Integer uro, Integer gluTwo, Integer ket, Integer bil, Integer pro, + Integer nit, Integer ph, Integer bld, Integer sg, Integer leu, Integer vc, Integer cr, Integer ca, + Integer ma, List imgList, String account, Integer age, String parity) { + super(); + this.id = id; + this.ptUid = ptUid; + this.ptCard = ptCard; + this.hbp = hbp; + this.idh = idh; + this.glu = glu; + this.bgs = bgs; + this.temp = temp; + this.hrrest = hrrest; + this.weight = weight; + this.ua = ua; + this.tcho = tcho; + this.trig = trig; + this.fhr = fhr; + this.createTime = createTime; + this.updateTime = updateTime; + this.ptName = ptName; + this.uro = uro; + this.gluTwo = gluTwo; + this.ket = ket; + this.bil = bil; + this.pro = pro; + this.nit = nit; + this.ph = ph; + this.bld = bld; + this.sg = sg; + this.leu = leu; + this.vc = vc; + this.cr = cr; + this.ca = ca; + this.ma = ma; + this.imgList = imgList; + this.account = account; + this.age = age; + this.parity = parity; + } + + public PatientUserRecord() { + super(); + } + + public Integer getUro() { + return uro; + } + + public void setUro(Integer uro) { + this.uro = uro; + } + + public Integer getGluTwo() { + return gluTwo; + } + + public void setGluTwo(Integer gluTwo) { + this.gluTwo = gluTwo; + } + + public Integer getKet() { + return ket; + } + + public void setKet(Integer ket) { + this.ket = ket; + } + + public Integer getBil() { + return bil; + } + + public void setBil(Integer bil) { + this.bil = bil; + } + + public Integer getPro() { + return pro; + } + + public void setPro(Integer pro) { + this.pro = pro; + } + + public Integer getNit() { + return nit; + } + + public void setNit(Integer nit) { + this.nit = nit; + } + + public Integer getPh() { + return ph; + } + + public void setPh(Integer ph) { + this.ph = ph; + } + + public Integer getBld() { + return bld; + } + + public void setBld(Integer bld) { + this.bld = bld; + } + + public Integer getSg() { + return sg; + } + + public void setSg(Integer sg) { + this.sg = sg; + } + + public Integer getLeu() { + return leu; + } + + public void setLeu(Integer leu) { + this.leu = leu; + } + + public Integer getVc() { + return vc; + } + + public void setVc(Integer vc) { + this.vc = vc; + } + + public Integer getCr() { + return cr; + } + + public void setCr(Integer cr) { + this.cr = cr; + } + + public Integer getCa() { + return ca; + } + + public void setCa(Integer ca) { + this.ca = ca; + } + + public Integer getMa() { + return ma; + } + + public void setMa(Integer ma) { + this.ma = ma; + } + + public List getImgList() { + return imgList; + } + + public void setImgList(List imgList) { + this.imgList = imgList; + } + + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getParity() { + return parity; + } + + public void setParity(String parity) { + this.parity = parity; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getPtUid() { + return ptUid; + } + + public void setPtUid(Integer ptUid) { + this.ptUid = ptUid; + } + + public String getPtCard() { + return ptCard; + } + + public void setPtCard(String ptCard) { + this.ptCard = ptCard == null ? null : ptCard.trim(); + } + + public String getHbp() { + return hbp; + } + + public void setHbp(String hbp) { + this.hbp = hbp == null ? null : hbp.trim(); + } + + public String getIdh() { + return idh; + } + + public void setIdh(String idh) { + this.idh = idh == null ? null : idh.trim(); + } + + public String getGlu() { + return glu; + } + + public void setGlu(String glu) { + this.glu = glu == null ? null : glu.trim(); + } + + public String getBgs() { + return bgs; + } + + public void setBgs(String bgs) { + this.bgs = bgs == null ? null : bgs.trim(); + } + + public String getTemp() { + return temp; + } + + public void setTemp(String temp) { + this.temp = temp == null ? null : temp.trim(); + } + + public String getHrrest() { + return hrrest; + } + + public void setHrrest(String hrrest) { + this.hrrest = hrrest == null ? null : hrrest.trim(); + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight == null ? null : weight.trim(); + } + + public String getUa() { + return ua; + } + + public void setUa(String ua) { + this.ua = ua == null ? null : ua.trim(); + } + + public String getTcho() { + return tcho; + } + + public void setTcho(String tcho) { + this.tcho = tcho == null ? null : tcho.trim(); + } + + public String getTrig() { + return trig; + } + + public void setTrig(String trig) { + this.trig = trig == null ? null : trig.trim(); + } + + public String getFhr() { + return fhr; + } + + public void setFhr(String fhr) { + this.fhr = fhr == null ? null : fhr.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getPtName() { + return ptName; + } + + public void setPtName(String ptName) { + this.ptName = ptName; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecordImg.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecordImg.java new file mode 100644 index 0000000..333dd98 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/PatientUserRecordImg.java @@ -0,0 +1,105 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("patient_user_record_img") +public class PatientUserRecordImg implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + @TableField("rd_id") + private Integer rdId; + + private Integer type; + + @TableField("img_url") + private String imgUrl; + + @TableField("create_time") + private Date createTime; + + @TableField("update_time") + private Date updateTime; + + @TableField("file_name") + private String fileName; + + private static final long serialVersionUID = 1L; + + public PatientUserRecordImg(Integer id, Integer rdId, Integer type, String imgUrl, Date createTime, Date updateTime, String fileName) { + this.id = id; + this.rdId = rdId; + this.type = type; + this.imgUrl = imgUrl; + this.createTime = createTime; + this.updateTime = updateTime; + this.fileName = fileName; + } + + public PatientUserRecordImg() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRdId() { + return rdId; + } + + public void setRdId(Integer rdId) { + this.rdId = rdId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl == null ? null : imgUrl.trim(); + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName == null ? null : fileName.trim(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Role.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Role.java new file mode 100644 index 0000000..8f53e6e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Role.java @@ -0,0 +1,81 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("role") +public class Role implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String rname; + + private Integer rstate; + + @TableField("rp_id") + private String rpId; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public Role(Long id, String rname, Integer rstate, String rpId, Date createTime) { + super(); + this.id = id; + this.rname = rname; + this.rstate = rstate; + this.rpId = rpId; + this.createTime = createTime; + } + + public Role() { + super(); + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRname() { + return rname; + } + + public void setRname(String rname) { + this.rname = rname == null ? null : rname.trim(); + } + + public Integer getRstate() { + return rstate; + } + + public void setRstate(Integer rstate) { + this.rstate = rstate; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Section.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Section.java new file mode 100644 index 0000000..827d9ae --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Section.java @@ -0,0 +1,76 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 科室表 + * @author Server + * + */ +@TableName("section") +public class Section implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + @TableField("se_name") + private String seName; + + @TableField("hospital_id") + private String hospitalId; + + @TableField("create_time") + private Date createTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSeName() { + return seName; + } + + public void setSeName(String seName) { + this.seName = seName == null ? null : seName.trim(); + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Section(Long id, String seName, String hospitalId, Date createTime) { + super(); + this.id = id; + this.seName = seName; + this.hospitalId = hospitalId; + this.createTime = createTime; + } + + public Section() { + super(); + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/SysMenu.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/SysMenu.java new file mode 100644 index 0000000..402e989 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/SysMenu.java @@ -0,0 +1,144 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +@TableName("sys_menu") +public class SysMenu implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 菜单栏一级名称 + */ + @TableField("menu_stair") + private String menuStair; + + /** + * 菜单栏二级名称 + */ + @TableField("menu_vfp") + private String menuVfp; + + /** + * 菜单栏图片 + */ + @TableField("menu_image") + private String menuImage; + + /** + * 菜单栏地址 + */ + @TableField("menu_url") + private String menuUrl; + + /** + * 菜单栏状态 1:激活 2:冻结 + */ + @TableField("menu_state") + private Integer menuState; + + /** + * 角色id + */ + private String rid; + + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public SysMenu(Long id, String menuStair, String menuVfp, String menuImage, String menuUrl, Integer menuState, + String rid, Date createTime) { + super(); + this.id = id; + this.menuStair = menuStair; + this.menuVfp = menuVfp; + this.menuImage = menuImage; + this.menuUrl = menuUrl; + this.menuState = menuState; + this.rid = rid; + this.createTime = createTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public SysMenu() { + super(); + } + + public String getRid() { + return rid; + } + + public void setRid(String rid) { + this.rid = rid; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMenuStair() { + return menuStair; + } + + public void setMenuStair(String menuStair) { + this.menuStair = menuStair == null ? null : menuStair.trim(); + } + + public String getMenuVfp() { + return menuVfp; + } + + public void setMenuVfp(String menuVfp) { + this.menuVfp = menuVfp == null ? null : menuVfp.trim(); + } + + public String getMenuImage() { + return menuImage; + } + + public void setMenuImage(String menuImage) { + this.menuImage = menuImage == null ? null : menuImage.trim(); + } + + public String getMenuUrl() { + return menuUrl; + } + + public void setMenuUrl(String menuUrl) { + this.menuUrl = menuUrl == null ? null : menuUrl.trim(); + } + + public Integer getMenuState() { + return menuState; + } + + public void setMenuState(Integer menuState) { + this.menuState = menuState; + } + + @Override + public String toString() { + return "SysMenu [id=" + id + ", menuStair=" + menuStair + ", menuVfp=" + menuVfp + ", menuImage=" + menuImage + + ", menuUrl=" + menuUrl + ", menuState=" + menuState + ", rid=" + rid + "]"; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java new file mode 100644 index 0000000..8391db2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalClinicalGuidelines.java @@ -0,0 +1,98 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 诊疗指南汇总表查看次数 + * + * @author dgg + * + */ +@TableName("total_clinical_guidelines") +public class TotalClinicalGuidelines implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 诊疗指南id + */ + @TableField(value = "clinical_id") + private Long clinicalId; + + /** + * 专家查看id + */ + @TableField(value = "doc_id") + private Long docId; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + @TableField(value = "hospital_id") + private Long hospitalId; + + private static final long serialVersionUID = 1L; + + public TotalClinicalGuidelines(Integer id, Long clinicalId, Long docId, Date createTime, Long hospitalId) { + super(); + this.id = id; + this.clinicalId = clinicalId; + this.docId = docId; + this.createTime = createTime; + this.hospitalId = hospitalId; + } + + public TotalClinicalGuidelines() { + super(); + } + + public Long getHospitalId() { + return hospitalId; + } + + public void setHospitalId(Long hospitalId) { + this.hospitalId = hospitalId; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Long getClinicalId() { + return clinicalId; + } + + public void setClinicalId(Long clinicalId) { + this.clinicalId = clinicalId; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalInformation.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalInformation.java new file mode 100644 index 0000000..befc763 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalInformation.java @@ -0,0 +1,358 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医联体等汇总表 + * @author dgg + * + */ +@TableName("total_information") +public class TotalInformation implements Serializable { + @TableId(value="id",type=IdType.AUTO) + private Integer id; + + /** + * 医院名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 合作模式 1:相对松散型 0否 + */ + @TableField("co_loose") + private Integer coLoose; + /** + * 合作模式 1:相对紧密型 0否 + */ + @TableField("co_tension") + private Integer coTension; + /** + * 县域医共体 + */ + @TableField("co_county") + private Integer coCounty; + + /** + * 专科联盟 + */ + @TableField("co_unior_coalition") + private Integer coUniorCoalition; + + /** + * 远程医疗协作 + */ + @TableField("co_tele_medicine") + private Integer coTeleMedicine; + + /** + * 帮扶协议 1:是 0:否 + */ + @TableField("help_protocol") + private Integer helpProtocol; + + /** + * 排班安排人数 + */ + @TableField("below_arrange_number") + private Long belowArrangeNumber; + + /** + * 服务天数 + */ + @TableField("serve_day") + private Long serveDay; + + /** + * 进修培训安排人数 + */ + @TableField("up_arrange_number") + private Long upArrangeNumber; + + /** + * 课题数 + */ + @TableField("subject_number") + private Long subjectNumber; + + /** + * 培训人次 + */ + @TableField("training_number") + private Long trainingNumber; + + /** + * 双向转诊 向上转诊 + */ + @TableField("case_upward_number") + private Long caseUpwardNumber; + + /** + * 开展远程诊疗人次 + */ + @TableField("consul_number") + private Long consulNumber; + + /** + * 双向转诊 向下转诊 + */ + @TableField("case_down_number") + private Long caseDownNumber; + + /** + * 医疗质量检查(次数) + */ + @TableField("medical_number") + private Long medicalNumber; + + /** + * 支持专科建设(个数) + */ + @TableField("junior_number") + private Long juniorNumber; + + /** + * 新技术项目推广应用 + */ + @TableField("technique_number") + private Long techniqueNumber; + + /** + * 合作时间(同市级医院合作) + */ + @TableField("cooperation_time") + private Date cooperationTime; + + /** + * 医院类型(医联体、对口资源、远程协助、名医工作室)3/4/5/8 + */ + private Integer type; + + private static final long serialVersionUID = 1L; + + public TotalInformation() { + super(); + } + + public TotalInformation(Integer id, String hospitalName, String hospitalId, Integer coLoose, Integer coTension, + Integer coCounty, Integer coUniorCoalition, Integer coTeleMedicine, Integer helpProtocol, + Long belowArrangeNumber, Long serveDay, Long upArrangeNumber, Long subjectNumber, Long trainingNumber, + Long caseUpwardNumber, Long consulNumber, Long caseDownNumber, Long medicalNumber, Long juniorNumber, + Long techniqueNumber, Date cooperationTime, Integer type) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.hospitalId = hospitalId; + this.coLoose = coLoose; + this.coTension = coTension; + this.coCounty = coCounty; + this.coUniorCoalition = coUniorCoalition; + this.coTeleMedicine = coTeleMedicine; + this.helpProtocol = helpProtocol; + this.belowArrangeNumber = belowArrangeNumber; + this.serveDay = serveDay; + this.upArrangeNumber = upArrangeNumber; + this.subjectNumber = subjectNumber; + this.trainingNumber = trainingNumber; + this.caseUpwardNumber = caseUpwardNumber; + this.consulNumber = consulNumber; + this.caseDownNumber = caseDownNumber; + this.medicalNumber = medicalNumber; + this.juniorNumber = juniorNumber; + this.techniqueNumber = techniqueNumber; + this.cooperationTime = cooperationTime; + this.type = type; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Integer getCoLoose() { + return coLoose; + } + + public void setCoLoose(Integer coLoose) { + this.coLoose = coLoose; + } + + public Integer getCoTension() { + return coTension; + } + + public void setCoTension(Integer coTension) { + this.coTension = coTension; + } + + public Integer getCoCounty() { + return coCounty; + } + + public void setCoCounty(Integer coCounty) { + this.coCounty = coCounty; + } + + public Integer getCoUniorCoalition() { + return coUniorCoalition; + } + + public void setCoUniorCoalition(Integer coUniorCoalition) { + this.coUniorCoalition = coUniorCoalition; + } + + public Integer getCoTeleMedicine() { + return coTeleMedicine; + } + + public void setCoTeleMedicine(Integer coTeleMedicine) { + this.coTeleMedicine = coTeleMedicine; + } + + public Integer getHelpProtocol() { + return helpProtocol; + } + + public void setHelpProtocol(Integer helpProtocol) { + this.helpProtocol = helpProtocol; + } + + public Long getBelowArrangeNumber() { + return belowArrangeNumber; + } + + public void setBelowArrangeNumber(Long belowArrangeNumber) { + this.belowArrangeNumber = belowArrangeNumber; + } + + public Long getServeDay() { + return serveDay; + } + + public void setServeDay(Long serveDay) { + this.serveDay = serveDay; + } + + public Long getUpArrangeNumber() { + return upArrangeNumber; + } + + public void setUpArrangeNumber(Long upArrangeNumber) { + this.upArrangeNumber = upArrangeNumber; + } + + public Long getSubjectNumber() { + return subjectNumber; + } + + public void setSubjectNumber(Long subjectNumber) { + this.subjectNumber = subjectNumber; + } + + public Long getTrainingNumber() { + return trainingNumber; + } + + public void setTrainingNumber(Long trainingNumber) { + this.trainingNumber = trainingNumber; + } + + public Long getCaseUpwardNumber() { + return caseUpwardNumber; + } + + public void setCaseUpwardNumber(Long caseUpwardNumber) { + this.caseUpwardNumber = caseUpwardNumber; + } + + public Long getConsulNumber() { + return consulNumber; + } + + public void setConsulNumber(Long consulNumber) { + this.consulNumber = consulNumber; + } + + public Long getCaseDownNumber() { + return caseDownNumber; + } + + public void setCaseDownNumber(Long caseDownNumber) { + this.caseDownNumber = caseDownNumber; + } + + public Long getMedicalNumber() { + return medicalNumber; + } + + public void setMedicalNumber(Long medicalNumber) { + this.medicalNumber = medicalNumber; + } + + public Long getJuniorNumber() { + return juniorNumber; + } + + public void setJuniorNumber(Long juniorNumber) { + this.juniorNumber = juniorNumber; + } + + public Long getTechniqueNumber() { + return techniqueNumber; + } + + public void setTechniqueNumber(Long techniqueNumber) { + this.techniqueNumber = techniqueNumber; + } + + public Date getCooperationTime() { + return cooperationTime; + } + + public void setCooperationTime(Date cooperationTime) { + this.cooperationTime = cooperationTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalTraining.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalTraining.java new file mode 100644 index 0000000..e9eb28b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TotalTraining.java @@ -0,0 +1,117 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 医院课程培训统计表 + * + * @author dgg + * + */ +@TableName("total_training") +public class TotalTraining implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 培训课程id + */ + @TableField("training_id") + private Long trainingId; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 查看医生id + */ + @TableField("doc_id") + private Long docId; + + /** + * 参加人次(查看次数) + */ + private Integer number; + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TotalTraining() { + super(); + } + + public TotalTraining(Long id, Long trainingId, String hospitalId, Long docId, Integer number, Date createTime) { + super(); + this.id = id; + this.trainingId = trainingId; + this.hospitalId = hospitalId; + this.docId = docId; + this.number = number; + this.createTime = createTime; + } + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getTrainingId() { + return trainingId; + } + + public void setTrainingId(Long trainingId) { + this.trainingId = trainingId; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Training.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Training.java new file mode 100644 index 0000000..698061e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/Training.java @@ -0,0 +1,252 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 上传视频表 + * + * @author Server + * + */ +@TableName("training") +public class Training implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 科室 + */ + private String chamber; + /** + * 主讲人 演讲人 上传者姓名 + */ + private String speaker; + /** + * 标题 + */ + private String title; + /** + * 职位 + */ + private String job; + /** + * 医院 + */ + private String hospital; + /** + * 时长 + */ + private String duration; + /** + * 视频路径 + */ + private String url; + /** + * 开播日期(创建时间) + */ + @TableField("create_time") + private Date createTime; + /** + * 视频类型(课题类型) + */ + private Integer type; + /** + * 上传者头像 + */ + @TableField("img_url") + private String imgUrl; + /** + * 介绍(简介) + */ + private String introduce; + /** + * 上传者姓名 + */ + @TableField("doc_id") + private Long docId; + /** + * 电话号码 + */ + private String phone; + + /** + * 培训人数 + */ + private Integer number; + + /** + * 查看总人数(实体类特有) + */ + @TableField(exist = false) + private String totalNumber; + + private static final long serialVersionUID = 1L; + + public Training() { + super(); + } + + public Training(Long id, String chamber, String speaker, String title, String job, String hospital, String duration, + String url, Date createTime, Integer type, String imgUrl, String introduce, Long docId, String phone, + Integer number, String totalNumber) { + super(); + this.id = id; + this.chamber = chamber; + this.speaker = speaker; + this.title = title; + this.job = job; + this.hospital = hospital; + this.duration = duration; + this.url = url; + this.createTime = createTime; + this.type = type; + this.imgUrl = imgUrl; + this.introduce = introduce; + this.docId = docId; + this.phone = phone; + this.number = number; + this.totalNumber = totalNumber; + } + + public Integer getNumber() { + return number; + } + + public void setNumber(Integer number) { + this.number = number; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber; + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getHospital() { + return hospital; + } + + public void setHospital(String hospital) { + this.hospital = hospital; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getIntroduce() { + return introduce; + } + + public void setIntroduce(String introduce) { + this.introduce = introduce; + } + + public Long getDocId() { + return docId; + } + + public void setDocId(Long docId) { + this.docId = docId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getTotalNumber() { + return totalNumber; + } + + public void setTotalNumber(String totalNumber) { + this.totalNumber = totalNumber; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingFlower.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingFlower.java new file mode 100644 index 0000000..59820b7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingFlower.java @@ -0,0 +1,102 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 视频送花表 + * @author dgg + * + */ +@TableName("training_flower") +public class TrainingFlower implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 视频课件id + */ + @TableField("training_id") + private Integer trainingId; + + /** + * 送花人id + */ + @TableField("give_id") + private String giveId; + + @TableField("flower_num") + private Integer flowerNum; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + + public TrainingFlower() { + super(); + } + + public TrainingFlower(Integer id, Integer trainingId, String giveId, Integer flowerNum, Date createTime) { + super(); + this.id = id; + this.trainingId = trainingId; + this.giveId = giveId; + this.flowerNum = flowerNum; + this.createTime = createTime; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTrainingId() { + return trainingId; + } + + public void setTrainingId(Integer trainingId) { + this.trainingId = trainingId; + } + + public String getGiveId() { + return giveId; + } + + public void setGiveId(String giveId) { + this.giveId = giveId; + } + + public Integer getFlowerNum() { + return flowerNum; + } + + public void setFlowerNum(Integer flowerNum) { + this.flowerNum = flowerNum; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingOpinion.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingOpinion.java new file mode 100644 index 0000000..b642497 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingOpinion.java @@ -0,0 +1,163 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 回复表 + * @author Server + * + */ +@TableName("training_opinion") +public class TrainingOpinion implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 回复内容 + */ + private String content; + + /** + * 回复id + */ + @TableField("reply_id") + private String replyId; + + /** + * 回复人 + */ + @TableField("reply_name") + private String replyName; + + /** + * 视频id + */ + @TableField("training_id") + private Long trainingId; + + /** + * 谁评论誰 誰回复誰 + */ + @TableField("huifu_or_pinglun") + private String huifuOrPinglun; + + /** + * 发布人所属人 + */ + @TableField("training_belong") + private String trainingBelong; + + /** + * 头像照片 + */ + @TableField("photo") + private String photo; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + + public TrainingOpinion() { + super(); + } + + public TrainingOpinion(Long id, String content, String replyId, String replyName, Long trainingId, + String huifuOrPinglun, String trainingBelong, String photo, Date createTime) { + super(); + this.id = id; + this.content = content; + this.replyId = replyId; + this.replyName = replyName; + this.trainingId = trainingId; + this.huifuOrPinglun = huifuOrPinglun; + this.trainingBelong = trainingBelong; + this.photo = photo; + this.createTime = createTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getReplyId() { + return replyId; + } + + public void setReplyId(String replyId) { + this.replyId = replyId; + } + + public String getReplyName() { + return replyName; + } + + public void setReplyName(String replyName) { + this.replyName = replyName; + } + + public Long getTrainingId() { + return trainingId; + } + + public void setTrainingId(Long trainingId) { + this.trainingId = trainingId; + } + + public String getHuifuOrPinglun() { + return huifuOrPinglun; + } + + public void setHuifuOrPinglun(String huifuOrPinglun) { + this.huifuOrPinglun = huifuOrPinglun; + } + + public String getTrainingBelong() { + return trainingBelong; + } + + public void setTrainingBelong(String trainingBelong) { + this.trainingBelong = trainingBelong; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingPlan.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingPlan.java new file mode 100644 index 0000000..1502336 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingPlan.java @@ -0,0 +1,172 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * trainingplan(培训计划课题表) + * @author Server + * + */ +@TableName("training_plan") +public class TrainingPlan implements Serializable { + + @TableId(value="id",type=IdType.AUTO) + private Long id; + + /** + * 科室 + */ + private String chamber; + + /** + * 主讲人 + */ + private String speaker; + + /** + * 职称 + */ + private String job; + + /** + * 课程类别、PX教学培训、JZ健康讲座 + */ + @TableField("train_type") + private Integer trainType; + + /** + * 责任人 + */ + private String principal; + + /** + *创建人 + */ + @TableField("create_name") + private String createName; + + /** + * 课题 + */ + private String title; + + /** + * 讲课时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @TableField("lecture_time") + private Date lectureTime; + + /** + * 讲课时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TrainingPlan(Long id, String chamber, String speaker, String job, Integer trainType, String principal, String createName, String title, Date lectureTime, Date createTime) { + this.id = id; + this.chamber = chamber; + this.speaker = speaker; + this.job = job; + this.trainType = trainType; + this.principal = principal; + this.createName = createName; + this.title = title; + this.lectureTime = lectureTime; + this.createTime = createTime; + } + + public TrainingPlan() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getChamber() { + return chamber; + } + + public void setChamber(String chamber) { + this.chamber = chamber == null ? null : chamber.trim(); + } + + public String getSpeaker() { + return speaker; + } + + public void setSpeaker(String speaker) { + this.speaker = speaker == null ? null : speaker.trim(); + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job == null ? null : job.trim(); + } + + public Integer getTrainType() { + return trainType; + } + + public void setTrainType(Integer trainType) { + this.trainType=trainType; + } + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal == null ? null : principal.trim(); + } + + public String getCreateName() { + return createName; + } + + public void setCreateName(String createName) { + this.createName = createName == null ? null : createName.trim(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public Date getLectureTime() { + return lectureTime; + } + + public void setLectureTime(Date lectureTime) { + this.lectureTime = lectureTime; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingRecord.java new file mode 100644 index 0000000..f718d55 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/TrainingRecord.java @@ -0,0 +1,163 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +/** + * 培训记录表 + * + * @author dgg + * + */ +@TableName("training_record") +public class TrainingRecord implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 单位名称 + */ + @TableField("hospital_name") + private String hospitalName; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 课题名称 + */ + private String title; + + /** + * 培训时间 + */ + @DateTimeFormat(pattern="yyyy-MM-dd") + @TableField("training_time") + private Date trainingTime; + + /** + * 培训人数 + */ + @TableField("training_number") + private Integer trainingNumber; + + /** + * 培训照片 + */ + @TableField("training_img") + private String trainingImg; + + /** + * 培训照片 + */ + @TableField("training_two_img") + private String trainingTwoImg; + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public TrainingRecord(Long id, String hospitalName, String hospitalId, String title, Date trainingTime, + Integer trainingNumber, String trainingImg, String trainingTwoImg, Date createTime) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.hospitalId = hospitalId; + this.title = title; + this.trainingTime = trainingTime; + this.trainingNumber = trainingNumber; + this.trainingImg = trainingImg; + this.trainingTwoImg = trainingTwoImg; + this.createTime = createTime; + } + + public TrainingRecord() { + super(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName == null ? null : hospitalName.trim(); + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId == null ? null : hospitalId.trim(); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null ? null : title.trim(); + } + + public Date getTrainingTime() { + return trainingTime; + } + + public void setTrainingTime(Date trainingTime) { + this.trainingTime = trainingTime; + } + + public Integer getTrainingNumber() { + return trainingNumber; + } + + public void setTrainingNumber(Integer trainingNumber) { + this.trainingNumber = trainingNumber; + } + + public String getTrainingImg() { + return trainingImg; + } + + public void setTrainingImg(String trainingImg) { + this.trainingImg = trainingImg == null ? null : trainingImg.trim(); + } + + public String getTrainingTwoImg() { + return trainingTwoImg; + } + + public void setTrainingTwoImg(String trainingTwoImg) { + this.trainingTwoImg = trainingTwoImg; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/User.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/User.java new file mode 100644 index 0000000..dc4c4b0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/User.java @@ -0,0 +1,634 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +//import com.fasterxml.jackson.annotation.JsonView; +//import com.xiaoleilu.hutool.system.UserInfo; + +/** + * 用户表 + * + * @author Server + * + */ +@TableName("user") +public class User implements Serializable { + + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户姓名 + */ + @TableField("user_name") + private String userName; + + /** + * 医生分组别名 + */ + @TableField("group_alias") + private String groupAlias; + + /** + * 医院id + */ + @TableField("hospital_id") + private String hospitalId; + + /** + * 科室id + */ + @TableField("se_name") + private String seName; + + /** + * 角色表id + */ + private Long rid; + + /** + * 出生日期 + */ + private Date birthdate; + + private String job; + + private String sex; + + private String phone; + + private String email; + + private String wechat; + + /** + * 微信密钥 + */ + @TableField("wechat_key") + private String wechatKey; + + /** + * 状态 1:激活 2:冻结 3:撤销 + */ + private Integer state; + + private String photo; + + /** + * 身份证号码 + */ + private String card; + + //@JsonView(UserInfo.class) + private String password; + + /** + * 身份证正面照片 + */ + @TableField("card_front_img") + private String cardFrontImg; + + /** + * 身份证反面照片 + */ + @TableField("card_verso_img") + private String cardVersoImg; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 具体家庭地址 + */ + private String site; + + /** + * 医师执证 + */ + @TableField("licensed_img") + private String licensedImg; + + /** + * 医师资格证 + */ + @TableField("cgfns_img") + private String cgfnsImg; + + /** + * 技术资格证 + */ + @TableField("skill_img") + private String skillImg; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 修改时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 管理员id + */ + @TableField("admin_id") + private Long adminId; + + @TableField("rp_id") + private String rpId; + + @TableField("contact_phone") + private String contactPhone; + + /** + * 登录次数 + */ + @TableField("login_number") + private Integer loginNumber; + + /** + * 最后登录时间 + */ + @TableField("last_time") + private String lastTime; + + /** + * 医生简介 + */ + private String intro; + + /** + * 主攻方向 + */ + @TableField("main_attack") + private String mainAttack; + + /** + * 医院名称 + */ + @TableField(exist = false) + private String hospitalName; + + + /** + * 是否家庭医生: 1 是 : 0 否 + */ + @TableField("is_family") + private Integer isFamily; + + /** + * 是否家庭医生: 1 是 : 0 否 + */ + @TableField("is_succeed") + private Integer isSucceed; + + @TableField("job_level") + private Integer jobLevel; + + private Integer head; + + /** + * 专家签名的图片地址 + */ + @TableField("specialist_signature") + private String specialistSignature; + + + private static final long serialVersionUID = 1L; + + public User() { + super(); + } + + public User(Long id, String userName, String hospitalId, String seName, Long rid, Date birthdate, String job, + String sex, String phone, String email, String wechat, String wechatKey, Integer state, String photo, + String card, String password, String cardFrontImg, String cardVersoImg, String province, String city, + String site, String licensedImg, String cgfnsImg, String skillImg, Date createTime, Date updateTime, + Long adminId, String rpId, String contactPhone, Integer loginNumber, String lastTime, String intro, + String mainAttack, String hospitalName, Integer isFamily, Integer isSucceed ,String salt,Integer head, + Integer jobLevel,String specialistSignature, String groupAlias) { + super(); + this.id = id; + this.userName = userName; + this.hospitalId = hospitalId; + this.seName = seName; + this.rid = rid; + this.birthdate = birthdate; + this.job = job; + this.sex = sex; + this.phone = phone; + this.email = email; + this.wechat = wechat; + this.wechatKey = wechatKey; + this.state = state; + this.photo = photo; + this.card = card; + this.password = password; + this.cardFrontImg = cardFrontImg; + this.cardVersoImg = cardVersoImg; + this.province = province; + this.city = city; + this.site = site; + this.licensedImg = licensedImg; + this.cgfnsImg = cgfnsImg; + this.skillImg = skillImg; + this.createTime = createTime; + this.updateTime = updateTime; + this.adminId = adminId; + this.rpId = rpId; + this.contactPhone = contactPhone; + this.loginNumber = loginNumber; + this.lastTime = lastTime; + this.intro = intro; + this.mainAttack = mainAttack; + this.hospitalName = hospitalName; + this.isFamily = isFamily; + this.isSucceed = isSucceed; + this.jobLevel = jobLevel; + this.head = head; + this.specialistSignature = specialistSignature; + this.groupAlias = groupAlias; + } + + public String getGroupAlias() { + return groupAlias; + } + + public void setGroupAlias(String groupAlias) { + this.groupAlias = groupAlias; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getHospitalId() { + return hospitalId; + } + + public void setHospitalId(String hospitalId) { + this.hospitalId = hospitalId; + } + + public String getSeName() { + return seName; + } + + public void setSeName(String seName) { + this.seName = seName; + } + + public Long getRid() { + return rid; + } + + public void setRid(Long rid) { + this.rid = rid; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public String getJob() { + return job; + } + + public void setJob(String job) { + this.job = job; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getWechat() { + return wechat; + } + + public void setWechat(String wechat) { + this.wechat = wechat; + } + + public String getWechatKey() { + return wechatKey; + } + + public void setWechatKey(String wechatKey) { + this.wechatKey = wechatKey; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public String getCard() { + return card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCardFrontImg() { + return cardFrontImg; + } + + public void setCardFrontImg(String cardFrontImg) { + this.cardFrontImg = cardFrontImg; + } + + public String getCardVersoImg() { + return cardVersoImg; + } + + public void setCardVersoImg(String cardVersoImg) { + this.cardVersoImg = cardVersoImg; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getSite() { + return site; + } + + public void setSite(String site) { + this.site = site; + } + + public String getLicensedImg() { + return licensedImg; + } + + public void setLicensedImg(String licensedImg) { + this.licensedImg = licensedImg; + } + + public String getCgfnsImg() { + return cgfnsImg; + } + + public void setCgfnsImg(String cgfnsImg) { + this.cgfnsImg = cgfnsImg; + } + + public String getSkillImg() { + return skillImg; + } + + public void setSkillImg(String skillImg) { + this.skillImg = skillImg; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Long getAdminId() { + return adminId; + } + + public void setAdminId(Long adminId) { + this.adminId = adminId; + } + + public String getRpId() { + return rpId; + } + + public void setRpId(String rpId) { + this.rpId = rpId; + } + + public String getContactPhone() { + return contactPhone; + } + + public void setContactPhone(String contactPhone) { + this.contactPhone = contactPhone; + } + + public Integer getLoginNumber() { + return loginNumber; + } + + public void setLoginNumber(Integer loginNumber) { + this.loginNumber = loginNumber; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getIntro() { + return intro; + } + + public void setIntro(String intro) { + this.intro = intro; + } + + public String getMainAttack() { + return mainAttack; + } + + public void setMainAttack(String mainAttack) { + this.mainAttack = mainAttack; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public Integer getIsFamily() { + return isFamily; + } + + public void setIsFamily(Integer isFamily) { + this.isFamily = isFamily; + } + + public Integer getIsSucceed() { + return isSucceed; + } + + public void setIsSucceed(Integer isSucceed) { + this.isSucceed = isSucceed; + } + + public Integer getJobLevel() { + return jobLevel; + } + + public void setJobLevel(Integer jobLevel) { + this.jobLevel = jobLevel; + } + + public Integer getHead() { + return head; + } + + public void setHead(Integer head) { + this.head = head; + } + + public String getSpecialistSignature() { + return specialistSignature; + } + + public void setSpecialistSignature(String specialistSignature) { + this.specialistSignature = specialistSignature; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", userName='" + userName + '\'' + + ", hospitalId='" + hospitalId + '\'' + + ", seName='" + seName + '\'' + + ", rid=" + rid + + ", birthdate=" + birthdate + + ", job='" + job + '\'' + + ", sex='" + sex + '\'' + + ", phone='" + phone + '\'' + + ", email='" + email + '\'' + + ", wechat='" + wechat + '\'' + + ", wechatKey='" + wechatKey + '\'' + + ", state=" + state + + ", photo='" + photo + '\'' + + ", card='" + card + '\'' + + ", password='" + password + '\'' + + ", cardFrontImg='" + cardFrontImg + '\'' + + ", cardVersoImg='" + cardVersoImg + '\'' + + ", province='" + province + '\'' + + ", city='" + city + '\'' + + ", site='" + site + '\'' + + ", licensedImg='" + licensedImg + '\'' + + ", cgfnsImg='" + cgfnsImg + '\'' + + ", skillImg='" + skillImg + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", adminId=" + adminId + + ", rpId='" + rpId + '\'' + + ", contactPhone='" + contactPhone + '\'' + + ", loginNumber=" + loginNumber + + ", lastTime='" + lastTime + '\'' + + ", intro='" + intro + '\'' + + ", mainAttack='" + mainAttack + '\'' + + ", hospitalName='" + hospitalName + '\'' + + ", isFamily=" + isFamily + + ", isSucceed=" + isSucceed + + ", specialistSignature='" + specialistSignature + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/VideoRecord.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/VideoRecord.java new file mode 100644 index 0000000..5b7da40 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/VideoRecord.java @@ -0,0 +1,131 @@ +package com.imurs.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +/** + * 视频记录表 + * @author dgg + * + */ +@TableName("video_record") +public class VideoRecord implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 发起方id + */ + @TableField("initiator_id") + private String initiatorId; + + /** + * 接收方id + */ + @TableField("acceptor_id") + private String acceptorId; + + /** + * 会诊id + */ + @TableField("conultation_id") + private String conultationId; + + + /** + * 1/2/3 同意、拒绝 + */ + private String state; + + + /** + * 类型(A/B)视频会诊、椅旁会诊 + */ + private String type; + + + @TableField("createTime") + private Date createTime; + + private static final long serialVersionUID = 1L; + + public VideoRecord(Integer id, String initiatorId, String acceptorId, String conultationId, String state, + String type, Date createTime) { + super(); + this.id = id; + this.initiatorId = initiatorId; + this.acceptorId = acceptorId; + this.conultationId = conultationId; + this.state = state; + this.type = type; + this.createTime = createTime; + } + + public VideoRecord() { + super(); + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getInitiatorId() { + return initiatorId; + } + + public void setInitiatorId(String initiatorId) { + this.initiatorId = initiatorId; + } + + public String getAcceptorId() { + return acceptorId; + } + + public void setAcceptorId(String acceptorId) { + this.acceptorId = acceptorId; + } + + public String getConultationId() { + return conultationId; + } + + public void setConultationId(String conultationId) { + this.conultationId = conultationId; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/WebLog.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/WebLog.java new file mode 100644 index 0000000..463ef8c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/entity/WebLog.java @@ -0,0 +1,166 @@ +package com.imurs.entity; + +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; +import java.util.Date; + +/** + * 日志表 + * @author wdh + */ +@TableName("web_log") +public class WebLog implements Serializable { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 操作用户 + */ + private String username; + + /** + * 操作时间 + */ + @TableField("start_time") + private Date startTime; + + /** + * 消耗时间(毫秒) + */ + @TableField("spend_time") + private Long spendTime; + + /** + * URL + */ + private String url; + + /** + * 请求类型 + */ + @TableField("http_method") + private String httpMethod; + + /** + * 请求的类路径 + */ + @TableField("class_method") + private String classMethod; + + /** + * IP地址 + */ + private String ip; + + /** + * 请求参数 + */ + private String parameter; + + /** + * 请求是否成功 + * 1:成功 2:失败 + */ + private Integer success; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Long getSpendTime() { + return spendTime; + } + + public void setSpendTime(Long spendTime) { + this.spendTime = spendTime; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(String httpMethod) { + this.httpMethod = httpMethod; + } + + public String getClassMethod() { + return classMethod; + } + + public void setClassMethod(String classMethod) { + this.classMethod = classMethod; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public String getParameter() { + return parameter; + } + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + public Integer getSuccess() { + return success; + } + + public void setSuccess(Integer success) { + this.success = success; + } + + @Override + public String toString() { + return "WebLog{" + + "id=" + id + + ", username='" + username + '\'' + + ", startTime=" + startTime + + ", spendTime=" + spendTime + + ", url='" + url + '\'' + + ", httpMethod='" + httpMethod + '\'' + + ", classMethod='" + classMethod + '\'' + + ", ip='" + ip + '\'' + + ", parameter='" + parameter + '\'' + + ", success=" + success + + '}'; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/Easyexcel.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/Easyexcel.java new file mode 100644 index 0000000..4a61840 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/Easyexcel.java @@ -0,0 +1,127 @@ +package com.imurs.excelderive; + + + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; + + +import com.imurs.service.ApplyBModeService; +import com.imurs.utils.Dateutil; +import com.imurs.utils.PositiveResult; +import com.imurs.utils.positiveCount; + +import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.filters.SetCharacterEncodingFilter; +import org.springframework.core.io.ClassPathResource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequestMapping(value = "/excelExport") +@Slf4j +public class Easyexcel { + @Resource + private ApplyBModeService applyBModeService; + + + @GetMapping(value = "easyexcel") + public void easyexcel(HttpServletResponse response, String startTime, String endTime,String conditions,String consultationMode,String categoryHospitalId) { + + List> result = null; + + response.reset(); + // System.out.println("时间"+startTime+";;;"+endTime); + + try { + + setResponseHeader(response, "工作量数据报告.xlsx"); + + result = applyBModeService.selectWorkTotalByTime(startTime, endTime,conditions, consultationMode,categoryHospitalId); + + PositiveResult positiveResult = positiveCount.countPositive(result); + + + //templates/ + ClassPathResource templateResource = new ClassPathResource("export-template.xlsx"); + + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) + .withTemplate(templateResource.getInputStream()) + .build(); + + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); + + excelWriter.fill(result, fillConfig, writeSheet); + + Map map = new HashMap(); + + String sTime = Dateutil.exchangeDate(startTime); + String eTime = Dateutil.exchangeDate(endTime); + + map.put("date",sTime + "至" + eTime); + map.put("positive",positiveResult.getPositive()); + map.put("yangCount",positiveResult.getYangCount()); + map.put("totalCount",positiveResult.getTotalCount()); + excelWriter.fill(map, writeSheet); + + + + List> totalListList = new ArrayList>(); + List totalList = new ArrayList(); + totalListList.add(totalList); + // 添加空单元格,用于对齐 + for (int i = 0; i < 8; i++) { + totalList.add(null); + } + totalList.add(positiveResult.getYangCount()); + totalList.add(positiveResult.getTotalCount()); + // 第四列 + totalList.add(positiveResult.getPositive()); + // 这里是write 别和fill 搞错了 + excelWriter.write(totalListList, writeSheet); + + excelWriter.finish(); + + + } catch (Exception e) { + log.error("导出excel失败"); + throw new RuntimeException("导出excel失败", e); + } + + + } + + private void setResponseHeader(HttpServletResponse response, String fileName) { + try { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + response.setCharacterEncoding("utf-8"); + + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName); + } catch (UnsupportedEncodingException e) { + log.error("设置响应头失败", e); + } + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDerive.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDerive.java new file mode 100644 index 0000000..54ed303 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDerive.java @@ -0,0 +1,1534 @@ +package com.imurs.excelderive; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.controller.ApplyBModeController; +import com.imurs.entity.*; +import com.imurs.service.*; +//import com.sun.xml.internal.xsom.impl.scd.Iterators; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRichTextString; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.alibaba.druid.util.StringUtils; +import com.baomidou.mybatisplus.mapper.EntityWrapper; + + +@RestController +@RequestMapping(value = "/exce") +public class ExcelDerive { + + @Autowired + ApplyCaseService applyCaseService; + + @Autowired + DoctorArrangeService doctorArrangeService; + + @Autowired + UserService userService; + + @Autowired + ApplyInformationService applyInformationService; + + @Autowired + private ApplyBModeService applyBModeService; + + @Autowired + private ApplyBModeSpecialistService applyBModeSpecialistService; + + + + /** + * 管理医院B超列表 + */ + @RequestMapping("Excel") + public Map selectBmodePage(HttpServletRequest request, HttpServletResponse response,String callback,@RequestParam Map params)throws IOException{ + Map map=new HashMap(); + //新增Excel + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院远程超声列表"); + List> listMap = new ArrayList>(); + Map map1 = null; + String state = ""; + try { + String fileName = System.currentTimeMillis() + ".xls"; + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + String[] headers = { "序号", "申请日期", "申请医院", "申请医生", "患者姓名", "会诊时间", "会诊医院", "会诊医生", "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院远程超声列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,4560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,3560); + sheet.setColumnWidth(5,4560); + sheet.setColumnWidth(6,7560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,3560); + //sheet.setColumnWidth(9,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + //在表中存放查询到的数据放入对应的列 + List applyBModeList = applyBModeService.selectBmodePage(params); + + int xulie = 1; + for (ApplyBMode applyBMode:applyBModeList) { + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(1).setCellValue(sdf.format(applyBMode.getApplyDate())); + row1.createCell(2).setCellValue(applyBMode.getCategoryHospital()); + row1.createCell(3).setCellValue(applyBMode.getDoctorName()); + row1.createCell(4).setCellValue(applyBMode.getPatientName()); + SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm"); + row1.createCell(5).setCellValue(format.format(applyBMode.getGroupDate())); + row1.createCell(6).setCellValue(applyBMode.getGroupHospital()); + //查询医生分配 + EntityWrapper wrapper=new EntityWrapper(); + //查看分配专家 + wrapper.eq("b_id", applyBMode.getId()).ne("state","80"); + List applyBModeSpecialists = applyBModeSpecialistService.selectList(wrapper); + if(!applyBModeSpecialists.isEmpty()){ + for (int i=0;i export(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map map = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("基层医院转出列表"); + try { + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊科室", "转诊人", "转诊时间", "接诊单位", "是否享受双向转诊优惠政策", "初步诊断", + "状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("基层医院转出列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,2560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + int xulie = 1; + /* + if(params){ + + }*/ + List applyCaseList = applyCaseService.export(params); + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getChamber()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + //row1.createCell(6).setCellValue(applyCase.getPlanTime()); + row1.createCell(7).setCellValue(applyCase.getHospitalName()); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + + + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + + /** + * 基层转入转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "getExport") + public Map getExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map map = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("基层医院转入列表"); + try { + + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊单位", "转诊科室","转诊人", "转诊时间", "是否享受双向转诊优惠政策", "第一诊断", + "状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("基层医院转入列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,7560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.getExport(params); + //Pagetion list=applyCaseService.selectCasePage(params, 0, 0); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getHospitalName()); + row1.createCell(5).setCellValue(applyCase.getChamber()); + row1.createCell(6).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(7).setCellValue(sdf.format(applyCase.getPlanTime())); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getOneInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + + /** + * 管理医院转出转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "arrangeOutExport") + public Map arrangeOutExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map jsonMap = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院转出列表"); + + List> listMap = new ArrayList>(); + Map map = null; + + try{ + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "病人姓名", "身份证号码", "联系方式", "转诊科室", "转诊医生", "转出时间", "接诊医院", "是否享受双向转诊优惠政策", "第一诊断", + "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,10)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院转出列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,2560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,7560); + sheet.setColumnWidth(8,2560); + sheet.setColumnWidth(9,6560); + sheet.setColumnWidth(10,3560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.arrangeOutExport(params); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getPtName()); + row1.createCell(2).setCellValue(applyCase.getPtCard()); + row1.createCell(3).setCellValue(applyCase.getPtPhone()); + row1.createCell(4).setCellValue(applyCase.getChamber()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + row1.createCell(7).setCellValue(applyCase.getPlanHospitalName()); + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(8).setCellValue("是"); + }else{ + row1.createCell(8).setCellValue("否"); + } + row1.createCell(9).setCellValue(applyCase.getOneInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(10).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + /** + * 管理医院转入转诊导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "arrangeGetExport") + public Map arrangeGetExport(HttpServletRequest request, HttpServletResponse response,String callback, @RequestParam Map params) throws IOException { + Map jsonMap = new HashMap(); + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("管理医院转入列表"); + List> listMap = new ArrayList>(); + Map map = null; + + try { + + String fileName = System.currentTimeMillis() + ".xls"; + + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "住院号", "病人姓名","身份证号码","转诊单位","转诊人", "入院时间", "接诊科室", "联系人", "是否享受双向转诊优惠政策", "初步诊断", + "当前状态" }; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + //font.setFontHeightInPoints((short) 12); + style.setFont(font); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,11)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + cell1= row0.createCell(0); + cell1.setCellValue("管理医院转入列表"); + cell1.setCellStyle(style); + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,3560); + sheet.setColumnWidth(4,7560); + sheet.setColumnWidth(5,2560); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,3560); + sheet.setColumnWidth(9,2560); + sheet.setColumnWidth(10,6560); + sheet.setColumnWidth(11,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style); + } + + // 在表中存放查询到的数据放入对应的列 + List applyCaseList = applyCaseService.arrangeGetExport(params); + int xulie = 1; + for(ApplyCase applyCase:applyCaseList){ + HSSFRow row1 = sheet.createRow(rowNum); + row1.setRowStyle(style); + row1.setHeight((short) 400); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(applyCase.getInpatient()); + row1.createCell(2).setCellValue(applyCase.getPtName()); + row1.createCell(3).setCellValue(applyCase.getPtCard()); + row1.createCell(4).setCellValue(applyCase.getHospitalName()); + row1.createCell(5).setCellValue(applyCase.getApplyName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(applyCase.getPlanTime())); + row1.createCell(7).setCellValue(applyCase.getPlanChamber()); + if(!StringUtils.isEmpty(applyCase.getOperator())){ + User user = userService.selectById(applyCase.getOperator()); + if(user!=null){ + row1.createCell(8).setCellValue(user.getUserName()); + }else{ + ApplyInformation applyInformation = applyInformationService.selectById(applyCase.getOperator()); + row1.createCell(8).setCellValue(applyInformation.getHospitalName()); + } + }else{ + row1.createCell(8).setCellValue(applyCase.getOperator()); + } + + if(applyCase.getIsDouble().equals("Y")){ + row1.createCell(9).setCellValue("是"); + }else{ + row1.createCell(9).setCellValue("否"); + } + row1.createCell(10).setCellValue(applyCase.getInitial()); + if("1".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("待医院审核"); + }else if("2".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("等待接收"); + }else if("3".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("待专家接收"); + }else if("4".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已接收"); + }else if("5".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已就诊"); + }else if("6".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已住院"); + }else if("7".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("未就诊"); + }else if("8".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("已撤销"); + }else if("9".equals(applyCase.getStatu())){ + row1.createCell(11).setCellValue("管理医院撤销"); + } + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + + } + + /** + * 管理医院帮扶专家导出excel + * + * @return + * @throws IOException + */ + @RequestMapping(value = "assistOutExport") + public Map assistOutExport(HttpServletRequest request, HttpServletResponse response, + String callback, @RequestParam Map params) throws IOException { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFCell cell1 = null; + HSSFSheet sheet = workbook.createSheet("长沙市第一医院下乡帮扶专家绩效考核汇总表"); + Map map = new HashMap<>(); + try { + String fileName = System.currentTimeMillis() + ".xls"; + // 新增数据行,并且设置单元格数据 + int rowNum = 2; + + String[] headers = { "序号", "专家姓名", "职称","科室","受援单位","帮扶日期", "帮扶类别", "帮扶天数", "每天补助", "交通补助", "考核得分", + "帮扶绩效" ,"合计 (元)"}; + // headers表示excel表中第一行的表头 + HSSFRow row = sheet.createRow(1); + // 在excel表中添加表头 + // cell1=row.createCell(0); + // cell1.setCellValue("sds"); + HSSFCellStyle style = workbook.createCellStyle(); + //设置背景 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(IndexedColors.AQUA.index); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font = workbook.createFont(); + font.setFontName("微软雅黑"); + //font.setBold(true);//粗体显示 + font.setFontHeightInPoints((short) 14); + //font.setColor(IndexedColors.RED.index);//设置字体颜色 + style.setFont(font); + + HSSFCellStyle style1 = workbook.createCellStyle(); + //设置背景色 + style1.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style1.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + style1.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style1.setVerticalAlignment(VerticalAlignment.CENTER); + style1.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font1 = workbook.createFont(); + font1.setFontName("微软雅黑"); + font1.setBold(true);//粗体显示 + font1.setFontHeightInPoints((short) 10.5); + style1.setFont(font1); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short + //HSSFRow row2 = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,12)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeightInPoints(65); + cell1= row0.createCell(0); + cell1.setCellValue("长沙市第一医院下乡帮扶专家绩效考核汇总表"); + cell1.setCellStyle(style); + + + + // row0.createCell(0).setCellStyle(style); + sheet.setColumnWidth(0,2560); + sheet.setColumnWidth(1,2560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,5560); + sheet.setColumnWidth(4,10060); + sheet.setColumnWidth(5,8060); + sheet.setColumnWidth(6,4560); + sheet.setColumnWidth(7,2560); + sheet.setColumnWidth(8,3560); + sheet.setColumnWidth(9,2560); + sheet.setColumnWidth(10,2560); + sheet.setColumnWidth(11,2560); + sheet.setColumnWidth(12,2560); + for (int i1 = 0; i1 < headers.length; i1++) { + HSSFCell cell = row.createCell(i1); + row.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i1]); + cell.setCellValue(text); + cell.setCellStyle(style1); + } + + HSSFCellStyle style2 = workbook.createCellStyle(); + style2.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style2.setVerticalAlignment(VerticalAlignment.CENTER); + //设置背景色 + //style2.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //style2.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + //style2.setWrapText(true);//自动换行 + //设置背景色 + HSSFFont font2 = workbook.createFont(); + font2.setFontName("微软雅黑"); + //font2.setBold(true);//粗体显示 + font2.setFontHeightInPoints((short) 11); + style2.setFont(font2); + // 在表中存放查询到的数据放入对应的列 + int xulie = 1; + EntityWrapper wrapper=new EntityWrapper(); + if(!StringUtils.isEmpty(params.get("receiveHospitalId"))){ + wrapper.eq("receive_hospital_id", params.get("receiveHospitalId")); + } + if(!StringUtils.isEmpty(params.get("status"))){ + wrapper.eq("status", params.get("status")); + } + if(!StringUtils.isEmpty(params.get("type"))){ + wrapper.eq("type", params.get("type")); + } + + if(!StringUtils.isEmpty(params.get("startTime"))){ + wrapper.ge("start_time", params.get("startTime")); + } + if(!StringUtils.isEmpty(params.get("endTime"))){ + DateFormat df = new SimpleDateFormat("yyyy-MM-dd");/*** 加一天*/ + try { + Date dd = df.parse(params.get("endTime")); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(dd); + calendar.add(Calendar.DAY_OF_MONTH, 1);//加一天 + wrapper.lt("start_time", df.format(calendar.getTime())); + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + } + List doctorArrangeList = doctorArrangeService.selectList(wrapper); + for(DoctorArrange doctorArrange :doctorArrangeList){ + //HSSFCell cell; + HSSFRow row1 = sheet.createRow(rowNum); + //row1.setRowStyle(style2); + + row1.setHeightInPoints(25); + row1.createCell(0).setCellValue(xulie); + row1.createCell(1).setCellValue(doctorArrange.getDoctorName()); + row1.createCell(2).setCellValue(doctorArrange.getJob()); + row1.createCell(3).setCellValue(doctorArrange.getChamber()); + ApplyInformation applyInformation= applyInformationService.selectById(doctorArrange.getReceiveHospitalId());//查出医院名称 + row1.createCell(4).setCellValue(applyInformation.getHospitalName()); + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(5).setCellValue(sdf.format(doctorArrange.getStartTime())+"——"+sdf.format(doctorArrange.getEndTime())); + /*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); + row1.createCell(6).setCellValue(sdf.format(sdf.parse(rs.getString("a.planTime"))));*/ + if(doctorArrange.getType().equals("3")){ + row1.createCell(6).setCellValue("医联体"); + }else if(doctorArrange.getType().equals("8")){ + row1.createCell(6).setCellValue("名医工作室"); + }else if(doctorArrange.getType().equals("4")){ + row1.createCell(6).setCellValue("对口支援"); + }else if(doctorArrange.getType().equals("5")){ + row1.createCell(6).setCellValue("远程协助"); + } + row1.createCell(7).setCellValue(doctorArrange.getDay()); + row1.createCell(8).setCellValue(doctorArrange.getDayMoney()); + if(doctorArrange.getTrafficMoney().equals("0")){ + row1.createCell(9).setCellValue("/"); + }else{ + row1.createCell(9).setCellValue(doctorArrange.getTrafficMoney()); + } + row1.createCell(10).setCellValue(doctorArrange.getTotalGrade()); + row1.createCell(11).setCellValue(doctorArrange.getPerforMance()+"%"); + row1.createCell(12).setCellValue(doctorArrange.getTotalMoney()); + row1.getCell(0).setCellStyle(style2); + row1.getCell(1).setCellStyle(style2); + row1.getCell(2).setCellStyle(style2); + row1.getCell(3).setCellStyle(style2); + row1.getCell(4).setCellStyle(style2); + row1.getCell(5).setCellStyle(style2); + row1.getCell(6).setCellStyle(style2); + row1.getCell(7).setCellStyle(style2); + row1.getCell(8).setCellStyle(style2); + row1.getCell(9).setCellStyle(style2); + row1.getCell(10).setCellStyle(style2); + row1.getCell(11).setCellStyle(style2); + row1.getCell(12).setCellStyle(style2); + rowNum++; + xulie++; + } + + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename="+fileName);//Excel文件名 + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + + + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "系统异常"); + }finally{ + workbook=null; + sheet=null; + } + return map; + } + + /** + * 基层医院的超声统计导出excel表 + * @param response + * @param id 医院id + * @param startTime + * @param endTime + * @return + */ + @RequestMapping("getExcelForBmodelold") + public Map getExcelForCategoryHospital(HttpServletResponse response, + String id, String startTime, String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.创建一个工作表 + HSSFSheet sheet = workbook.createSheet("远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,6560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //3.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //4.创建表头 + String[] headers = {"序号","医院医生","离线会诊","实时会诊"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //5.填入表格的全部内容数据 + try { + // 在表中存放查询到的数据放入对应的列 + Map bModeMap = applyBModeService.categoryHospitalStatistics(id,startTime,endTime); + //定义序号 + int serialNumber = 1; + //定义表格内容的初始行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + List> docList = (List>) bModeMap.get("doctorCount"); + for (Map docMap : docList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) docMap.get("name")); + row.createCell(2).setCellValue((Long)docMap.get("lxCount")); + row.createCell(3).setCellValue((Long)docMap.get("spCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)bModeMap.get("totalLxCount")); + lastRow.createCell(3).setCellValue((Long)bModeMap.get("totalSpCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + String fileName = System.currentTimeMillis() + ".xls"; + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + /** + * 基层医院的超声统计导出excel表有部位的 + * @param response + * @param id 医院id + * @param startTime + * @param endTime + * @return + */ + @RequestMapping("getExcelForBmodel") + public Map getNExcelForCategoryHospital(HttpServletResponse response, + String id, String startTime, String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.创建一个工作表 + HSSFSheet sheet = workbook.createSheet("远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,6560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //3.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //4.创建表头 + String[] headers = {"序号","医院医生","超声会诊病例数","超声会诊部位数"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //5.填入表格的全部内容数据 + try { + // 在表中存放查询到的数据放入对应的列 + Map bModeMap = applyBModeService.categoryHospitalStatistics(id,startTime,endTime); + //定义序号 + int serialNumber = 1; + //定义表格内容的初始行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + List> docList = (List>) bModeMap.get("doctorCount"); + for (Map docMap : docList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) docMap.get("name")); + row.createCell(2).setCellValue((Long)docMap.get("lxCount")); + row.createCell(3).setCellValue((Long)docMap.get("partCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)bModeMap.get("totalLxCount")); + lastRow.createCell(3).setCellValue((Long)bModeMap.get("totalPartCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + String pdate=""; + if((startTime!=null&&!startTime.isEmpty())&&(endTime!=null&&!endTime.isEmpty())){ + //System.out.println("开始时间"+startTime+"..."+endTime); + + pdate = startTime + ":" + endTime; + }else { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + pdate = sdf.format(new Date()); + } + String fileName = pdate + ".xls"; + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + + + /** + * 管理医院超声统计表导出 + * @param response + * @return + */ + @RequestMapping("getBmodeManageHospitalsold") + public Map getBmodeManageHospitals(HttpServletResponse response, + String startTime,String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.1创建第一个工作表 + HSSFSheet sheet = workbook.createSheet("基层医院远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,7560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //2.2.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("基层医院远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //2.3.创建表头 + String[] headers = {"序号","基层医院","离线会诊","实时会诊"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //3.1创建第二个工作表 + HSSFSheet sheet2 = workbook.createSheet("管理医院远程超声统计表"); + //设置表的列宽 + sheet2.setColumnWidth(0,4560); + sheet2.setColumnWidth(1,6560); + sheet2.setColumnWidth(2,4560); + sheet2.setColumnWidth(3,4560); + + //3.2.创建标题的名字并设置样式 + sheet2.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow hosRow0 = sheet2.createRow(0); + hosRow0.setHeight((short) 1204); + HSSFCell hosCell00 = hosRow0.createCell(0); + hosCell00.setCellValue("管理医院远程超声统计表"); + hosCell00.setCellStyle(titleStyle); + + //3.3.创建表头 + String[] hosHeaders = {"序号","本医院专家","离线会诊","实时会诊"}; + //将表头写入excel表格的第二行 + HSSFRow hosRow1 = sheet2.createRow(1); + for (int i = 0; i < hosHeaders.length; i++) { + HSSFCell cell = hosRow1.createCell(i); + hosRow1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(hosHeaders[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //4.填充数据入表格 + try { + //5.填充基层医院的数据表 + Map dataStatistics = applyBModeService.dataStatisticsForHospital(startTime,endTime); + //获取基层医院的超声统计 + List> infomationList = (List>) dataStatistics.get("infomationList"); + //定义序列号 + int serialNumber = 1; + //定义表格的行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + for (Map hospitalMap : infomationList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) hospitalMap.get("hospitalName")); + row.createCell(2).setCellValue((Long)hospitalMap.get("lxCount")); + row.createCell(3).setCellValue((Long)hospitalMap.get("spCount")); + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)dataStatistics.get("lxCategoryCount")); + lastRow.createCell(3).setCellValue((Long)dataStatistics.get("spCategoryCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //6.填充管理医院的数据表 + List> specialists = (List>) dataStatistics.get("specialists"); + List> countLists = (List>) dataStatistics.get("countList"); + //定义序列号 + int serialNumber2 = 1; + //定义表格的行数 + int rowNum2 = 2; + for (Map specialist : specialists) { + HSSFRow row = sheet2.createRow(rowNum2); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber2); + row.createCell(1).setCellValue((String)specialist.get("userName")); + row.createCell(2).setCellValue((Long)specialist.get("lxCount")); + row.createCell(3).setCellValue((Long)specialist.get("spCount")); + + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber2++; + rowNum2++; + } + Map countMap = countLists.get(0); + //设置最后一行的总计 + HSSFRow lastRow2 = sheet2.createRow(rowNum2); + lastRow2.createCell(0).setCellValue("合计"); + lastRow2.createCell(1).setCellValue("-"); + lastRow2.createCell(2).setCellValue((Long)countMap.get("totalLxCount")); + lastRow2.createCell(3).setCellValue((Long)countMap.get("totalSpCount")); + + //设置每个单元格的样式 + lastRow2.getCell(0).setCellStyle(textStyle); + lastRow2.getCell(1).setCellStyle(textStyle); + lastRow2.getCell(2).setCellStyle(textStyle); + lastRow2.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + String fileName = new String(new String("管理医院超声统计表" + sdf.format(new Date()) + ".xls").getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + map.put("msg",1); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + /** + * 管理医院超声统计表按部位导出 没有离线实时区分 + * @param response + * @return + */ + @RequestMapping("getBmodeManageHospitals") + public void getBmodeManageHospitalsBypart(HttpServletResponse response, + String startTime,String endTime) { + Map map = new HashMap<>(); + //1.创建一个工作簿 + HSSFWorkbook workbook = new HSSFWorkbook(); + //2.1创建第一个工作表 + HSSFSheet sheet = workbook.createSheet("基层医院远程超声统计表"); + //设置表的列宽 + sheet.setColumnWidth(0,4560); + sheet.setColumnWidth(1,7560); + sheet.setColumnWidth(2,4560); + sheet.setColumnWidth(3,4560); + + //2.2.创建标题的名字并设置样式 + HSSFCellStyle titleStyle = getTitleStyle(workbook); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow row0 = sheet.createRow(0); + row0.setHeight((short) 1204); + HSSFCell cell00 = row0.createCell(0); + cell00.setCellValue("基层医院远程超声统计表"); + cell00.setCellStyle(titleStyle); + + //2.3.创建表头 + String[] headers = {"序号","基层医院","超声会诊病例数","超声会诊部位数"}; + //设置表头的格式样式 + HSSFCellStyle headStyle = getHeadStyle(workbook); + //将表头写入excel表格的第二行 + HSSFRow row1 = sheet.createRow(1); + for (int i = 0; i < headers.length; i++) { + HSSFCell cell = row1.createCell(i); + row1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(headers[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //3.1创建第二个工作表 + HSSFSheet sheet2 = workbook.createSheet("管理医院远程超声统计表"); + //设置表的列宽 + sheet2.setColumnWidth(0,4560); + sheet2.setColumnWidth(1,6560); + sheet2.setColumnWidth(2,4560); + sheet2.setColumnWidth(3,4560); + + //3.2.创建标题的名字并设置样式 + sheet2.addMergedRegion(new CellRangeAddress(0,0,0,3)); + HSSFRow hosRow0 = sheet2.createRow(0); + hosRow0.setHeight((short) 1204); + HSSFCell hosCell00 = hosRow0.createCell(0); + hosCell00.setCellValue("管理医院远程超声统计表"); + hosCell00.setCellStyle(titleStyle); + + //3.3.创建表头"序号","本医院专家","离线会诊","实时会诊" + String[] hosHeaders = {"序号","本医院专家","超声会诊病例数","超声会诊部位数"}; + //将表头写入excel表格的第二行 + HSSFRow hosRow1 = sheet2.createRow(1); + for (int i = 0; i < hosHeaders.length; i++) { + HSSFCell cell = hosRow1.createCell(i); + hosRow1.setHeightInPoints(25); + HSSFRichTextString text = new HSSFRichTextString(hosHeaders[i]); + cell.setCellValue(text); + cell.setCellStyle(headStyle); + } + + //4.填充数据入表格 + try { + //5.填充基层医院的数据表 + Map dataStatistics = applyBModeService.dataStatisticsForHospital(startTime,endTime); + //获取基层医院的超声统计 + List> infomationList = (List>) dataStatistics.get("infomationList"); + //定义序列号 + int serialNumber = 1; + //定义表格的行数 + int rowNum = 2; + //设置内容格式 + HSSFCellStyle textStyle = getTextStyle(workbook); + for (Map hospitalMap : infomationList) { + HSSFRow row = sheet.createRow(rowNum); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber); + row.createCell(1).setCellValue((String) hospitalMap.get("hospitalName")); + row.createCell(2).setCellValue((Long)hospitalMap.get("lxCount"));//病例数 + row.createCell(3).setCellValue((Long)hospitalMap.get("partCount"));//部位数 + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber++; + rowNum++; + } + //设置最后一行的总计 + HSSFRow lastRow = sheet.createRow(rowNum); + lastRow.createCell(0).setCellValue("合计"); + lastRow.createCell(1).setCellValue("-"); + lastRow.createCell(2).setCellValue((Long)dataStatistics.get("lxCategoryCount")); + lastRow.createCell(3).setCellValue((Long)dataStatistics.get("partCount")); + + //设置每个单元格的样式 + lastRow.getCell(0).setCellStyle(textStyle); + lastRow.getCell(1).setCellStyle(textStyle); + lastRow.getCell(2).setCellStyle(textStyle); + lastRow.getCell(3).setCellStyle(textStyle); + + //6.填充管理医院的数据表 + List> specialists = (List>) dataStatistics.get("specialists"); + List> countLists = (List>) dataStatistics.get("countList"); + //定义序列号 + int serialNumber2 = 1; + //定义表格的行数 + int rowNum2 = 2; + for (Map specialist : specialists) { + HSSFRow row = sheet2.createRow(rowNum2); + row.setHeight((short) 400); + //给每个单元格赋值 + row.createCell(0).setCellValue(serialNumber2); + row.createCell(1).setCellValue((String)specialist.get("userName")); + row.createCell(2).setCellValue((Long)specialist.get("lxCount")); + row.createCell(3).setCellValue((Long)specialist.get("partCount")); + + + //设置每个单元格的样式 + row.getCell(0).setCellStyle(textStyle); + row.getCell(1).setCellStyle(textStyle); + row.getCell(2).setCellStyle(textStyle); + row.getCell(3).setCellStyle(textStyle); + serialNumber2++; + rowNum2++; + } + Map countMap = countLists.get(0); + //设置最后一行的总计 + HSSFRow lastRow2 = sheet2.createRow(rowNum2); + lastRow2.createCell(0).setCellValue("合计"); + lastRow2.createCell(1).setCellValue("-"); + lastRow2.createCell(2).setCellValue((Long)countMap.get("totalLxCount")); + lastRow2.createCell(3).setCellValue((Long)countMap.get("totalpartCount")); + + //设置每个单元格的样式 + lastRow2.getCell(0).setCellStyle(textStyle); + lastRow2.getCell(1).setCellStyle(textStyle); + lastRow2.getCell(2).setCellStyle(textStyle); + lastRow2.getCell(3).setCellStyle(textStyle); + + //输出文档 + response.setContentType("application/octet-stream"); + //Excel文件名 + + //startTime,String endTime + String pdate=""; + if((startTime!=null&&!startTime.isEmpty())&&(endTime!=null&&!endTime.isEmpty())){ + //System.out.println("开始时间"+startTime+"..."+endTime); + + pdate = startTime + ":" + endTime; + }else { + SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd"); + pdate = sdf.format(new Date()); + } + String fileName = new String(new String("管理医院超声统计表" + pdate + ".xls").getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("Content-disposition", "attachment;filename="+fileName); + //将workbook中的内容写入输出流中 + workbook.write(response.getOutputStream()); + //map.put("msg",1); + } catch (Exception e) { + e.printStackTrace(); + //map.put("msg",4); + } + //return map; + } + /** + * 设置表格表头的样式 + * @param workbook + * @return + */ + private HSSFCellStyle getHeadStyle(HSSFWorkbook workbook) { + //设置表头的格式样式 + HSSFCellStyle headStyle = workbook.createCellStyle(); + //设置背景色 + headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.index); + // 创建一个居中格式 + headStyle.setAlignment(HorizontalAlignment.CENTER); + headStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //自动换行 + headStyle.setWrapText(true); + HSSFFont font1 = workbook.createFont(); + font1.setFontName("微软雅黑"); + //粗体显示 + font1.setBold(true); + //设置字体大小 + font1.setFontHeightInPoints((short) 10.5); + headStyle.setFont(font1); + return headStyle; + } + + /** + * 设置表格标题的样式 + * @param workbook + * @return + */ + private HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) { + HSSFCellStyle titleStyle = workbook.createCellStyle(); + // 创建一个居中格式 + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //自动换行 + titleStyle.setWrapText(true); + HSSFFont font = workbook.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + titleStyle.setFont(font); + return titleStyle; + } + + /** + * 设置表格内容的格式 + * @param workbook + * @return + */ + private HSSFCellStyle getTextStyle(HSSFWorkbook workbook) { + HSSFCellStyle style = workbook.createCellStyle(); + // 创建一个居中格式 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + //设置背景色 + HSSFFont font = workbook.createFont(); + font.setFontName("微软雅黑"); + font.setFontHeightInPoints((short) 11); + style.setFont(font); + return style; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDown2.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDown2.java new file mode 100644 index 0000000..8947ecd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/excelderive/ExcelDown2.java @@ -0,0 +1,453 @@ +package com.imurs.excelderive; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; + +public class ExcelDown2 { + + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + public static HSSFWorkbook getHSSFWorkbook1(String sheetName,String [][]values, HSSFWorkbook wb,int k,String hospitalname,String oiddate,String newdate){ + + // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 + if(wb == null){ + wb = new HSSFWorkbook(); + } + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + HSSFSheet sheet = wb.createSheet(sheetName); + HSSFRow row = sheet.createRow(0); + HSSFRow row1 = sheet.createRow(1); + HSSFRow row2 = sheet.createRow(2); + HSSFCell cell = null; + // 第四步,创建单元格,并设置值表头 设置表头居中 + HSSFCellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //字体黑色 + HSSFFont font = wb.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + // font.setColor(IndexedColors.RED.index);//设置字体颜色 + //设置背景 + // style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // style.setFillForegroundColor(IndexedColors.YELLOW.index); + /// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(true);//粗体显示 + style.setFont(font); + //上面为样式 + // 合并单元格 + /* sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("市直医院"); + cell.setCellStyle(style);*/ + //样式 + + sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("医疗机构名称"); + cell.setCellStyle(style); + row.setHeightInPoints(30);//设置行的高度 + sheet.setColumnWidth(0, 30 * 256);//设置列的宽度 + sheet.setColumnWidth(6, 12 * 256);//建立时间列的宽度 + sheet.setColumnWidth(10, 15 * 256);//建立时间列的宽度 + sheet.setColumnWidth(13, 15 * 256);// + sheet.setColumnWidth(14, 15 * 256);// + sheet.setColumnWidth(15, 15 * 256);// + sheet.addMergedRegion(new CellRangeAddress(0,0,1,5)); + cell=row.createCell(1); + cell.setCellValue("建立形式"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,1,2)); + cell= row1.createCell(1); + cell.setCellValue("城市医疗联合体"); + cell.setCellStyle(style); + cell= row2.createCell(1); + cell.setCellValue("相对紧密性"); + cell.setCellStyle(style); + cell= row2.createCell(2); + cell.setCellValue("相对松散性"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,3,3)); + cell= row1.createCell(3); + cell.setCellValue("县域医共体"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,4,4)); + cell= row1.createCell(4); + cell.setCellValue("专科联盟"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,5,5)); + cell= row1.createCell(5); + cell.setCellValue("远程医疗协作"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,6,6)); + cell= row.createCell(6); + cell.setCellValue("建立时间"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,7,7)); + cell= row.createCell(7); + cell.setCellValue("是否签订帮扶协议"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,0,8,15)); + cell= row.createCell(8); + cell.setCellValue("已采取具体帮扶措施"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,8,9)); + cell= row1.createCell(8); + cell.setCellValue("派驻医疗人员"); + cell.setCellStyle(style); + cell= row2.createCell(8); + cell.setCellValue("人数"); + cell.setCellStyle(style); + cell= row2.createCell(9); + cell.setCellValue("服务天数"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,10,10)); + cell= row1.createCell(10); + cell.setCellValue("进修培训安排(人数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,11,12)); + cell= row1.createCell(11); + cell.setCellValue("专题讲座"); + cell.setCellStyle(style); + cell= row2.createCell(11); + cell.setCellValue("课题数"); + cell.setCellStyle(style); + cell= row2.createCell(12); + cell.setCellValue("培训人/次"); + cell.setCellStyle(style); + //下面我 是双向转诊以及远程诊疗人数 + sheet.addMergedRegion(new CellRangeAddress(1,1,13,14)); + cell= row1.createCell(13); + cell.setCellValue("开展双向转诊"); + cell.setCellStyle(style); + cell= row2.createCell(13); + cell.setCellValue("上转人次"); + cell.setCellStyle(style); + cell= row2.createCell(14); + cell.setCellValue("下转人次"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,15,15)); + cell= row1.createCell(15); + cell.setCellValue("开展远程诊疗(人次)"); + cell.setCellStyle(style); + //上面是新加的 + sheet.addMergedRegion(new CellRangeAddress(1,2,16,16)); + cell= row1.createCell(16); + cell.setCellValue("医疗质量控制检查(次数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,17,17)); + cell= row1.createCell(17); + cell.setCellValue("支持专科建设(个数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,18,18)); + cell= row1.createCell(18); + cell.setCellValue("新技术新项目推广应用(项数)"); + cell.setCellStyle(style); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + // HSSFRow row = sheet.createRow(0); + + + //设置第一行样式。 + // row.setRowStyle(style); + // row1.setRowStyle(style); + //row2.setRowStyle(style); + //声明列对象 + // HSSFCell cell = null; + // 设置列宽 + + //创建标题 +// for(int i=0;i1){ + row.createCell(0).setCellValue("合计"); + } + return wb; + } + public static HSSFWorkbook getHSSFWorkbook2(String sheetName,String [][]values, HSSFWorkbook wb,int k,String hospitalname,String oiddate,String newdate){ + + // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 + if(wb == null){ + wb = new HSSFWorkbook(); + } + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + HSSFSheet sheet = wb.createSheet(sheetName); + HSSFRow row = sheet.createRow(0); + HSSFRow row1 = sheet.createRow(1); + HSSFRow row2 = sheet.createRow(2); + HSSFCell cell = null; + // 第四步,创建单元格,并设置值表头 设置表头居中 + HSSFCellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setWrapText(true);//自动换行 + //字体黑色 + HSSFFont font = wb.createFont(); + font.setFontName("黑体"); + font.setFontHeightInPoints((short) 12); + // font.setColor(IndexedColors.RED.index);//设置字体颜色 + //设置背景 + // style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + // style.setFillForegroundColor(IndexedColors.YELLOW.index); + /// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(HSSFFont.BOLDWEIGHT_BOLD); + // font.setBold(true);//粗体显示 + style.setFont(font); + //上面为样式 + // 合并单元格 + /* sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("市直医院"); + cell.setCellStyle(style);*/ + //样式 + + sheet.addMergedRegion(new CellRangeAddress(0,2,0,0)); + cell=row.createCell(0); + cell.setCellValue("医疗机构名称"); + cell.setCellStyle(style); + row.setHeightInPoints(30);//设置行的高度 + sheet.setColumnWidth(0, 30 * 256);//设置列的宽度 + sheet.setColumnWidth(6, 12 * 256);//建立时间列的宽度 + sheet.setColumnWidth(10, 15 * 256);//建立时间列的宽度 + sheet.setColumnWidth(13, 15 * 256);// + sheet.setColumnWidth(14, 15 * 256);// + sheet.setColumnWidth(15, 15 * 256);// + sheet.addMergedRegion(new CellRangeAddress(0,0,1,5)); + cell=row.createCell(1); + cell.setCellValue("建立形式"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,1,2)); + cell= row1.createCell(1); + cell.setCellValue("城市医疗联合体"); + cell.setCellStyle(style); + cell= row2.createCell(1); + cell.setCellValue("相对紧密性"); + cell.setCellStyle(style); + cell= row2.createCell(2); + cell.setCellValue("相对松散性"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,3,3)); + cell= row1.createCell(3); + cell.setCellValue("县域医共体"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,4,4)); + cell= row1.createCell(4); + cell.setCellValue("专科联盟"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,5,5)); + cell= row1.createCell(5); + cell.setCellValue("远程医疗协作"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,6,6)); + cell= row.createCell(6); + cell.setCellValue("建立时间"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,2,7,7)); + cell= row.createCell(7); + cell.setCellValue("是否签订帮扶协议"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(0,0,8,18)); + cell= row.createCell(8); + cell.setCellValue("已采取具体帮扶措施"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,8,9)); + cell= row1.createCell(8); + cell.setCellValue("派驻医疗人员"); + cell.setCellStyle(style); + cell= row2.createCell(8); + cell.setCellValue("人数"); + cell.setCellStyle(style); + cell= row2.createCell(9); + cell.setCellValue("服务天数"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,10,10)); + cell= row1.createCell(10); + cell.setCellValue("进修培训安排(人数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,1,11,12)); + cell= row1.createCell(11); + cell.setCellValue("专题讲座"); + cell.setCellStyle(style); + cell= row2.createCell(11); + cell.setCellValue("课题数"); + cell.setCellStyle(style); + cell= row2.createCell(12); + cell.setCellValue("培训人/次"); + cell.setCellStyle(style); + //开展双向转诊 + sheet.addMergedRegion(new CellRangeAddress(1,1,13,14)); + cell= row1.createCell(13); + cell.setCellValue("开展双向转诊"); + cell.setCellStyle(style); + cell= row2.createCell(13); + cell.setCellValue("上转人次"); + cell.setCellStyle(style); + cell= row2.createCell(14); + cell.setCellValue("下转人次"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,15,15)); + cell= row1.createCell(15); + cell.setCellValue("开展远程诊疗(人次)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,16,16));//修改了样式 + cell= row1.createCell(16); + cell.setCellValue("医疗质量控制检查(次数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,17,17)); + cell= row1.createCell(17); + cell.setCellValue("支持专科建设(个数)"); + cell.setCellStyle(style); + sheet.addMergedRegion(new CellRangeAddress(1,2,18,18)); + cell= row1.createCell(18); + cell.setCellValue("新技术新项目推广应用(项数)"); + cell.setCellStyle(style); + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + // HSSFRow row = sheet.createRow(0); + + + //设置第一行样式。 + // row.setRowStyle(style); + // row1.setRowStyle(style); + //row2.setRowStyle(style); + //声明列对象 + // HSSFCell cell = null; + // 设置列宽 + + //创建标题 +// for(int i=0;i1){ + row.createCell(0).setCellValue("合计"); + } + return wb; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/AuthService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/AuthService.java new file mode 100644 index 0000000..01ffd16 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/AuthService.java @@ -0,0 +1,100 @@ +package com.imurs.ocr; + + + + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + + +/** + * 获取token类 + */ +public class AuthService { + + /** + * 获取权限token + * @return 返回示例: + * { + * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", + * "expires_in": 2592000 + * } + */ + public static String getAuth(String type) { + // 官网获取的 API Key 更新为你注册的 + String ocrclientId = "h7yikrDhd3zmEBIpUp11N7e8";//ocr 的密钥 + // 官网获取的 Secret Key 更新为你注册的 + String ocrclientSecret = "h7yikrDhd3zmEBIpUp11N7e8";//ocr 的密钥 + + + // 官网获取的 Secret Key 更新为你注册的 图像的已经没有使用了 + String imgproclientId="h7yikrDhd3zmEBIpUp11N7e8"; + String imgclientSecret = "h7yikrDhd3zmEBIpUp11N7e8"; + String clientId = null; + String clientSecret =null; + if(type.equals("2")){ + clientId=imgproclientId; + clientSecret=imgclientSecret; + }else if(type.equals("1")){ + clientId=ocrclientId; + clientSecret=ocrclientSecret; + } + return getAuth(clientId, clientSecret); + } + + /** + * 获取API访问token + * 该token有一定的有效期,需要自行管理,当失效时需重新获取. + * @param ak - 百度云官网获取的 API Key + * @param sk - 百度云官网获取的 Securet Key + * @return assess_token 示例: + * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" + */ + public static String getAuth(String ak, String sk) { + // 获取token地址 + String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; + String getAccessTokenUrl = authHost + // 1. grant_type为固定参数 + + "grant_type=client_credentials" + // 2. 官网获取的 API Key + + "&client_id=" + ak + // 3. 官网获取的 Secret Key + + "&client_secret=" + sk; + try { + URL realUrl = new URL(getAccessTokenUrl); + // 打开和URL之间的连接 + HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); + connection.setRequestMethod("GET"); + connection.connect(); + // 获取所有响应头字段 + /* Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : map.keySet()) { + System.err.println(key + "--->" + map.get(key)); + }*/ + // 定义 BufferedReader输入流来读取URL的响应 + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String result = ""; + String line; + while ((line = in.readLine()) != null) { + result += line; + } + /** + * 返回结果示例 + */ + // System.err.println("result:" + result); + JSONObject jsonObject = new JSONObject(result); + String access_token = jsonObject.getString("access_token"); + return access_token; + } catch (Exception e) { + // System.err.printf("获取token失败!"); + e.printStackTrace(System.err); + } + return null; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Baiduoauth2.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Baiduoauth2.java new file mode 100644 index 0000000..34f694e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Baiduoauth2.java @@ -0,0 +1,59 @@ +package com.imurs.ocr; + +import okhttp3.*; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.*; + + +/** + * 需要添加依赖 + * + * + * com.squareup.okhttp3 + * okhttp + * 4.12.0 + * + */ + +class Baiduoauth2 { + + static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); + + public static void main(String []args) throws IOException, JSONException{ + /* + * MediaType mediaType = MediaType.parse("application/json"); RequestBody body = + * RequestBody.create(mediaType, ""); Request request = new Request.Builder() + * .url( + * "https://aip.baidubce.com/oauth/2.0/token?client_id=h7yikrDhd3zmEBIpUp11N7e8&client_secret=DfJYn2AANSEURPvmk4j12lpfmBi9QCcT&grant_type=client_credentials") + * .method("POST", body) .addHeader("Content-Type", "application/json") + * .addHeader("Accept", "application/json") .build(); Response response = + * HTTP_CLIENT.newCall(request).execute(); + * + * JSONObject jsonObject = new JSONObject(response.body().string()); String + * access_token = jsonObject.getString("access_token"); + * System.out.println(access_token); + */ + + } + public static String getAuth() throws IOException, JSONException { + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, ""); + Request request = new Request.Builder() + .url("https://aip.baidubce.com/oauth/2.0/token?client_id=h7yikrDhd3zmEBIpUp11N7e8&client_secret=DfJYn2AANSEURPvmk4j12lpfmBi9QCcT&grant_type=client_credentials") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + Response response = HTTP_CLIENT.newCall(request).execute(); + + JSONObject jsonObject = new JSONObject(response.body().string()); + String access_token = jsonObject.getString("access_token"); + return access_token; + + } + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Base64Util.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Base64Util.java new file mode 100644 index 0000000..44bc9ff --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Base64Util.java @@ -0,0 +1,92 @@ +package com.imurs.ocr; + + +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ public class Base64Util +/* */ { +/* 16 */ private static final char last2byte = (char)Integer.parseInt("00000011", 2); +/* */ +/* 18 */ private static final char last4byte = (char)Integer.parseInt("00001111", 2); +/* */ +/* 20 */ private static final char last6byte = (char)Integer.parseInt("00111111", 2); +/* */ +/* 22 */ private static final char lead6byte = (char)Integer.parseInt("11111100", 2); +/* */ +/* 24 */ private static final char lead4byte = (char)Integer.parseInt("11110000", 2); +/* */ +/* 26 */ private static final char lead2byte = (char)Integer.parseInt("11000000", 2); +/* */ +/* 28 */ private static final char[] encodeTable = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ public static String encode(byte[] from) +/* */ { +/* 43 */ StringBuilder to = new StringBuilder((int)(from.length * 1.34D) + 3); +/* 44 */ int num = 0; +/* 45 */ char currentByte = '\000'; +/* 46 */ for (int i = 0; i < from.length; i++) { +/* 47 */ num %= 8; +/* 48 */ while (num < 8) { +/* 49 */ switch (num) { +/* */ case 0: +/* 51 */ currentByte = (char)(from[i] & lead6byte); +/* 52 */ currentByte = (char)(currentByte >>> '\002'); +/* 53 */ break; +/* */ case 2: +/* 55 */ currentByte = (char)(from[i] & last6byte); +/* 56 */ break; +/* */ case 4: +/* 58 */ currentByte = (char)(from[i] & last4byte); +/* 59 */ currentByte = (char)(currentByte << '\002'); +/* 60 */ if (i + 1 < from.length) { +/* 61 */ currentByte = (char)(currentByte | (from[(i + 1)] & lead2byte) >>> 6); +/* */ } +/* */ break; +/* */ case 6: +/* 65 */ currentByte = (char)(from[i] & last2byte); +/* 66 */ currentByte = (char)(currentByte << '\004'); +/* 67 */ if (i + 1 < from.length) { +/* 68 */ currentByte = (char)(currentByte | (from[(i + 1)] & lead4byte) >>> 4); +/* */ } +/* */ +/* */ break; +/* */ } +/* */ +/* 74 */ to.append(encodeTable[currentByte]); +/* 75 */ num += 6; +/* */ } +/* */ } +/* 78 */ if (to.length() % 4 != 0) { +/* 79 */ for (int i = 4 - to.length() % 4; i > 0; i--) { +/* 80 */ to.append("="); +/* */ } +/* */ } +/* 83 */ return to.toString(); +/* */ } +/* */ } + +/* Location: D:\workspace\imurs_java\WebContent\WEB-INF\lib\aip-java-sdk-4.1.1.jar + * Qualified Name: com.baidu.aip.util.Base64Util + * Java Class Version: 5 (49.0) + * JD-Core Version: 0.7.1 + */ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/CustomNumberComparator.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/CustomNumberComparator.java new file mode 100644 index 0000000..4d407e4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/CustomNumberComparator.java @@ -0,0 +1,23 @@ +package com.imurs.ocr; +import java.util.Comparator; +public class CustomNumberComparator implements Comparator { + @Override + public int compare(String a1, String b1) { + int firstDigitA=Integer.valueOf(a1.charAt(0)); + int firstDigitB =Integer.valueOf(b1.charAt(0)); + + // 首先比较两个数字的第一位(十位数) + + int comparison = Integer.compare(firstDigitA, firstDigitB); + if (comparison != 0) { + return comparison; // 如果第一位不同,返回比较结果 + } + + // 如果第一位相同,则比较除第一位之外的其他数字 + // 不要第一位直接比大小就可以,百度的icor 中表格按键值不会为空,所以可以这样。 + + int remainingDigitsA = Integer.valueOf(a1.substring(1)); + int remainingDigitsB = Integer.valueOf(b1.substring(1)); + return Integer.compare(remainingDigitsA, remainingDigitsB); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/FileUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/FileUtil.java new file mode 100644 index 0000000..e7bb482 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/FileUtil.java @@ -0,0 +1,108 @@ +package com.imurs.ocr; + +import java.io.*; + +/** + * 文件读取工具类 + */ +public class FileUtil { + + /** + * 读取文件内容,作为字符串返回 + */ + public static String readFileAsString(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } + + if (file.length() > 1024 * 1024 * 1024) { + throw new IOException("File is too large"); + } + + StringBuilder sb = new StringBuilder((int) (file.length())); + // 创建字节输入流 + FileInputStream fis = new FileInputStream(filePath); + // 创建一个长度为10240的Buffer + byte[] bbuf = new byte[10240]; + // 用于保存实际读取的字节数 + int hasRead = 0; + while ( (hasRead = fis.read(bbuf)) > 0 ) { + sb.append(new String(bbuf, 0, hasRead)); + } + fis.close(); + return sb.toString(); + } + + /** + * 根据文件路径读取byte[] 数组 + */ + public static byte[] readFileByBytes(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } else { + ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length()); + BufferedInputStream in = null; + + try { + in = new BufferedInputStream(new FileInputStream(file)); + short bufSize = 1024; + byte[] buffer = new byte[bufSize]; + int len1; + while (-1 != (len1 = in.read(buffer, 0, bufSize))) { + bos.write(buffer, 0, len1); + } + + byte[] var7 = bos.toByteArray(); + return var7; + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + bos.close(); + } + } + } + /** + * 根据输入流读取byte[] 数组 + * @throws Exception + */ + public static byte[] readInputStreamByBytes(InputStream ins) throws Exception { + //File file = new File(filePath); + if (ins.available()<0) { + throw new Exception("流不存在"); + } else { + ByteArrayOutputStream bos = new ByteArrayOutputStream(ins.available()); + BufferedInputStream in = null; + + try { + in = new BufferedInputStream(ins); + short bufSize = 1024; + byte[] buffer = new byte[bufSize]; + int len1; + while (-1 != (len1 = in.read(buffer, 0, bufSize))) { + bos.write(buffer, 0, len1); + } + + byte[] var7 = bos.toByteArray(); + return var7; + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException var14) { + var14.printStackTrace(); + } + + bos.close(); + } + } + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/HttpUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/HttpUtil.java new file mode 100644 index 0000000..e2f39af --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/HttpUtil.java @@ -0,0 +1,76 @@ +package com.imurs.ocr; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + + +/** + * http 工具类 + */ +public class HttpUtil { + + public static String post(String requestUrl, String accessToken, String params) + throws Exception { + String contentType = "application/x-www-form-urlencoded"; + return HttpUtil.post(requestUrl, accessToken, contentType, params); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params) + throws Exception { + String encoding = "UTF-8"; + if (requestUrl.contains("nlp")) { + encoding = "GBK"; + } + return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding); + } + + public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding) + throws Exception { + String url = requestUrl + "?access_token=" + accessToken; + return HttpUtil.postGeneralUrl(url, contentType, params, encoding); + } + + public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding) + throws Exception { + URL url = new URL(generalUrl); + // 打开和URL之间的连接 + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + // 设置通用的请求属性 + connection.setRequestProperty("Content-Type", contentType); + connection.setRequestProperty("Connection", "Keep-Alive"); + connection.setUseCaches(false); + connection.setDoOutput(true); + connection.setDoInput(true); + + // 得到请求的输出流对象 + DataOutputStream out = new DataOutputStream(connection.getOutputStream()); + out.write(params.getBytes(encoding)); + out.flush(); + out.close(); + + // 建立实际的连接 + connection.connect(); + // 获取所有响应头字段 + /* Map> headers = connection.getHeaderFields(); + // 遍历所有的响应头字段 + for (String key : headers.keySet()) { + System.err.println(key + "--->" + headers.get(key)); + }*/ + // 定义 BufferedReader输入流来读取URL的响应 + BufferedReader in = null; + in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), encoding)); + String result = ""; + String getLine; + while ((getLine = in.readLine()) != null) { + result += getLine; + } + in.close(); + // System.err.println("result:" + result); + return result; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/PicUtils.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/PicUtils.java new file mode 100644 index 0000000..1377b41 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/PicUtils.java @@ -0,0 +1,77 @@ +package com.imurs.ocr; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.slf4j.LoggerFactory; + +import net.coobird.thumbnailator.Thumbnails; + +public class PicUtils { + + /*public static void main(String[] args) throws IOException { + // TODO Auto-generated method stub + + byte[] bytes = FileUtils.readFileToByteArray(new File("D:\\zp\\检验单图片数据集\\3.jpg")); + InputStream is = new ByteArrayInputStream(bytes); + String s =getPicType(is); + System.out.println(s+"它的格式是什么啊"); + long l = System.currentTimeMillis(); + byte[] bytes1 = PicUtils.compressPicForScale(bytes, 700, "x");// 图片小于300kb + InputStream is1 = new ByteArrayInputStream(bytes1); + String s1 =getPicType(is1); + System.out.println(s1+"22它的格式是什么啊"); + System.out.println(System.currentTimeMillis() - l); + FileUtils.writeByteArrayToFile(new File("D:\\dd3.jpg"), bytes1); + + }*/ + private static org.slf4j.Logger logger = LoggerFactory.getLogger(PicUtils.class); + + /** + * 根据指定大小压缩图片 + * + * @param imageBytes 源图片字节数组 + * @param desFileSize 指定图片大小,单位kb + * @param imageId 影像编号 + * @return 压缩质量后的图片字节数组 + */ + public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) { + if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) { + return imageBytes; + } + long srcSize = imageBytes.length; + double accuracy = getAccuracy(srcSize / 1024); + try { + while (imageBytes.length > desFileSize * 1024) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length); + Thumbnails.of(inputStream).scale(accuracy).outputQuality(accuracy).outputFormat("jpg").toOutputStream(outputStream); + imageBytes = outputStream.toByteArray(); + } + logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb", + imageId, srcSize / 1024, imageBytes.length / 1024); + } catch (Exception e) { + logger.error("【图片压缩】msg=图片压缩失败!", e); + } + return imageBytes; + } + /** + * 自动调节精度(经验数值) + * + * @param size 源图片大小 + * @return 图片压缩质量比 + */ + private static double getAccuracy(long size) { + double accuracy; + if (size < 900) { + accuracy = 0.85; + } else if (size < 2047) { + accuracy = 0.6; + } else if (size < 3275) { + accuracy = 0.44; + } else { + accuracy = 0.4; + } + return accuracy; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/RecognizeAllText.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/RecognizeAllText.java new file mode 100644 index 0000000..10daf43 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/RecognizeAllText.java @@ -0,0 +1,92 @@ +// This file is auto-generated, don't edit it. Thanks. +package com.imurs.ocr; + +import com.aliyun.auth.credentials.Credential; +import com.aliyun.auth.credentials.provider.StaticCredentialProvider; +import com.aliyun.core.http.HttpClient; +import com.aliyun.core.http.HttpMethod; +import com.aliyun.core.http.ProxyOptions; +import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder; +import com.aliyun.sdk.service.ocr_api20210707.models.*; +import com.aliyun.sdk.service.ocr_api20210707.*; +import com.google.gson.Gson; +import darabonba.core.RequestConfiguration; +import darabonba.core.client.ClientOverrideConfiguration; +import darabonba.core.utils.CommonUtil; +import darabonba.core.TeaPair; + +//import javax.net.ssl.KeyManager; +//import javax.net.ssl.X509TrustManager; +import java.net.InetSocketAddress; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.io.*; + +public class RecognizeAllText { + public static void main(String[] args) throws Exception { + + // HttpClient Configuration + /*HttpClient httpClient = new ApacheAsyncHttpClientBuilder() + .connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds + .responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds + .maxConnections(128) // Set the connection pool size + .maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds + // Configure the proxy + .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("", 9001)) + .setCredentials("", "")) + // If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true)) + .x509TrustManagers(new X509TrustManager[]{}) + .keyManagers(new KeyManager[]{}) + .ignoreSSL(false) + .build();*/ + + // Configure Credentials authentication information, including ak, secret, token + StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() + .accessKeyId("LTAI5tKHbUfLRA3QVMqJo5Ym")// LTAI5tKHbUfLRA3QVMqJo5Ym + .accessKeySecret("qP4jz3flazjp4CGmvjUdDLWpa022uU")//qP4jz3flazjp4CGmvjUdDLWpa022uU + //.securityToken(System.getenv("SECURITY_TOKEN")) // use STS token + .build()); + + // Configure the Client + AsyncClient client = AsyncClient.builder() + .region("cn-hangzhou") // Region ID + //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient) + .credentialsProvider(provider) + //.serviceConfiguration(Configuration.create()) // Service-level configuration + // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc. + .overrideConfiguration( + ClientOverrideConfiguration.create() + // Endpoint 请参考 https://api.aliyun.com/product/ocr-api + .setEndpointOverride("ocr-api.cn-hangzhou.aliyuncs.com") + //.setConnectTimeout(Duration.ofSeconds(30)) + ) + .build(); + + // Parameter settings for API request + InputStream bodyStream = new FileInputStream(new File("K://2.jpg")); + RecognizeAllTextRequest recognizeAllTextRequest = RecognizeAllTextRequest.builder() + .body(bodyStream) + .type("General") + // Request-level configuration rewrite, can set Http request parameters, etc. + // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders())) + .build(); + + // Asynchronously get the return value of the API request + CompletableFuture response = client.recognizeAllText(recognizeAllTextRequest); + // Synchronously get the return value of the API request + RecognizeAllTextResponse resp = response.get(); + System.out.println(new Gson().toJson(resp)); + // Asynchronous processing of return values + /*response.thenAccept(resp -> { + System.out.println(new Gson().toJson(resp)); + }).exceptionally(throwable -> { // Handling exceptions + System.out.println(throwable.getMessage()); + return null; + });*/ + + // Finally, close the client + client.close(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Sample.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Sample.java new file mode 100644 index 0000000..e0bf2a3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/Sample.java @@ -0,0 +1,258 @@ +// This file is auto-generated, don't edit it. Thanks. +package com.imurs.ocr; + +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody; +import com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody.RecognizeAllTextResponseBodyData; +import com.aliyun.tea.*; +import com.imurs.parameter.OcrResult; + +public class Sample { + + /** + * 使用AK&SK初始化账号Client + * @param accessKeyId + * @param accessKeySecret + * @return Client + * @throws Exception + */ + // 阿里云OCR统一识别 + public static com.aliyun.ocr_api20210707.Client createClient() throws Exception { + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。 + com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。 + .setAccessKeyId("LTAI5tKHbUfLRA3QVMqJo5Ym") + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + .setAccessKeySecret("qP4jz3flazjp4CGmvjUdDLWpa022uU"); + // Endpoint 请参考 https://api.aliyun.com/product/ocr-api + config.endpoint = "ocr-api.cn-hangzhou.aliyuncs.com"; + return new com.aliyun.ocr_api20210707.Client(config); + } + + public static void main(String[] args_) throws Exception { + + Map m=BaiduOcrRecognition("2"); + + for (Map.Entry entry : m.entrySet()) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + + + } + + } + public static String aliocr(InputStream body) throws Exception { + com.aliyun.ocr_api20210707.Client client = Sample.createClient(); + // 需要安装额外的依赖库,直接点击下载完整工程即可看到所有依赖。 + java.io.InputStream bodyStream = body; + //java.io.InputStream bodyStream = com.aliyun.darabonba.stream.Client.readFromFilePath("K://2.jpg"); + com.aliyun.ocr_api20210707.models.RecognizeAllTextRequest recognizeAllTextRequest = new com.aliyun.ocr_api20210707.models.RecognizeAllTextRequest() + .setType("General") + .setBody(bodyStream); + String con=""; + com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); + try { + com.aliyun.ocr_api20210707.models.RecognizeAllTextResponse resp = client.recognizeAllTextWithOptions(recognizeAllTextRequest, runtime); + //com.aliyun.teautil.Common.toJSONString(resp); + com.aliyun.ocr_api20210707.models.RecognizeAllTextResponseBody s=resp.getBody(); + RecognizeAllTextResponseBodyData data=s.getData(); + con=data.getContent();//Content识别出图片的文字块汇总 + Integer stauscode=resp.getStatusCode(); + System.out.println(stauscode); + if(stauscode==200) { + //System.out.println(con); + return con; + } + //com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp)); + } catch (TeaException error) { + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + System.out.println(error.getMessage()); + // 诊断地址 + System.out.println(error.getData().get("Recommend")); + + com.aliyun.teautil.Common.assertAsString(error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + System.out.println(error.getMessage()); + // 诊断地址 + System.out.println(error.getData().get("Recommend")); + com.aliyun.teautil.Common.assertAsString(error.message); + } + return con; + + } + public static Map BaiduOcrRecognition(String id) throws Exception{//InputStream is + String otherHost = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"; + //String jsonString = null;//C:\Users\ZP\Desktop\化验单扫描 + + + //上面是自定义按键值排序 + String filePath = "C://Users//ZP//Desktop//OCR//o1.jpg"; + Map umap = new HashMap(); + Map map =new HashMap(); + //只针对表格数据,所以wk开头的才用TreeMap + Map sortmap = new TreeMap(new CustomNumberComparator()); + byte[] imgData = FileUtil.readFileByBytes(filePath);// + //byte[] imgData = FileUtil.readInputStreamByBytes(is); + //byte[] bytes1 = PicUtils.compressPicForScale(imgData, 700, "x");//截图没有4M 不用压缩 + String imgStr = Base64Util.encode(imgData);// + String template=null;// + //8b4101cdc9dfcdd8719b63cfd15311da 鸿吉医院实验 + //万康医院 d7848a0f2cbe04ce5c60f520fff85899 + + switch(id) { + case "1"://鸿吉医院 + System.out.println("1"); + template="8b4101cdc9dfcdd8719b63cfd15311da"; + break; + case "2"://万康医院d7848a0f2cbe04ce5c60f520fff85899 + template="d7848a0f2cbe04ce5c60f520fff85899"; + break; + default: + umap.put("errcode","id未传"); + return umap; + + } + String params = "templateSign="+template+"&image="+URLEncoder.encode(imgStr, "UTF-8"); + // 请求分类器参数未加,多类别可以用 + + String accessToken = Baiduoauth2.getAuth(); + + String result = HttpUtil.post(otherHost, accessToken, params); + + // System.out.println("识别出的结果"+result); + + JSONObject jsonObject = JSON.parseObject(result); + //System.out.println("识别出的结果223"+jsonObject); + Object jsonObject1 =null; + //ArrayList list = new ArrayList<>(); + JSONArray jsonArray = null; + Map rowData = new HashMap(); + if(!jsonObject.get("error_code").equals(0)){ + // System.out.println("识别出的结果"+jsonObject.get("error_msg")); + return (Map) rowData.put("errorMsg", jsonObject.get("error_msg")); + } + + jsonObject1 = jsonObject.get("data"); + + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + + int size =jsonArray.size(); + String key = null; + String value = null; + for(int i=0;i entry : umap.entrySet()) { + // System.out.println(entry.getKey() + " = " + entry.getValue()); + + + // } + //表格处理 如果表格存在数据则进行下面处理这里变成万康医院的处理逻辑。 + /* + * for (Map.Entry entry : sortmap.entrySet()) { + * //System.out.println(entry.getKey() + " = " + entry.getValue()); //存到列表里去得去了 + * 反正key 值没有对应的键值 list.add(entry.getValue()); } //直接把表格排序好的给前端就行 前端怕少字分开三行给 + * //表格有三行,那我三个字段 排序存,每次第一个值为key 后面为数值 int msize= list.size(); String[] strings + * = {"VP", "Vm", "Vd", "PI","SD","RI","容积","深度","功率","频率","方向","心率","增益"}; + * //JSONArray jsonArray1 = new JSONArray(); //JSONArray jsonArray2 = new + * JSONArray(); //JSONArray jsonArray3 = new JSONArray(); Map + * rmap1 = new HashMap(); Map rmap2 = new + * HashMap(); Map rmap3 = new HashMap(); int row =msize/3; for(int i=1;i entry + * : umap.entrySet()) { System.out.println(entry.getKey() + " = " + + * entry.getValue()); + * + * + * } + */ +} + + + public static Map wankang(Map sortmap, Map umap) { + //表格处理 如果表格存在数据则进行下面处理这里变成万康医院的处理逻辑。 + ArrayList list = new ArrayList<>(); + for (Map.Entry entry : sortmap.entrySet()) { + // System.out.println(entry.getKey() + " = " + entry.getValue()); + //存到列表里去得去了 反正key 值没有对应的键值 + list.add(entry.getValue()); + // System.out.println("ssssff"); + } + //直接把表格排序好的给前端就行 前端怕少字分开三行给 + //表格有三行,那我三个字段 排序存,每次第一个值为key 后面为数值 + int msize= list.size(); + String[] strings = {"VP", "Vm", "Vd", "PI","SD","RI","RJ","DP","GL","PL","FX","XL","ZY"};//RJ容积","深度","功率","频率","方向","心率","增益 + + Map rmap1 = new HashMap(); + Map rmap2 = new HashMap(); + Map rmap3 = new HashMap(); + int row =msize/3; + for(int i=1;i map1 = new HashMap(); + Map map2 = new HashMap(); + Map map3 = new HashMap(); + //需要一个Tree map 把1# 2# 每行组合一起 + String s = "wk#2#10"; + String[] strArray = new String[] {"wk#1#1", "wk#1#10", "wk#2#10","wk#2#8","wk#3#8"}; + for (int i = 0; i < strArray.length; i++) { + // + String extractedNumber = extractNumberBetweenHashes(strArray[i]); + String temp= extractedNumber; + //如果相同则把他们放到一个map中 + // if() + System.out.println(extractedNumber); + } + //String s2=s.replaceAll("wk|#", ""); + //System.out.println(s2); + + } + public static String extractNumberBetweenHashes(String input) { + // 正则表达式匹配#开头,然后跟着一个或多个数字,再跟着一个# + Pattern pattern = Pattern.compile("#(\\d+)#"); + Matcher matcher = pattern.matcher(input); + + if (matcher.find()) { + // 如果找到匹配项,返回匹配的内容 + return matcher.group(1); + } else { + // 如果没有找到匹配项,返回null或空字符串 + return null; + // 或者 return ""; + } + } + public static void sort() { + Map map = new HashMap(); + map.put("19","12"); + map.put("28","1"); + map.put("17","13"); + map.put("29","1"); + map.put("210","1"); + map.put("18","1"); + map.put("110","1");//希望的排序是17 18 19 110 + + /* + * Map sortedMap = new TreeMap<>(new Comparator() { + * + * @Override public int compare(String o1, String o2) { return + * Integer.valueOf(o1) - Integer.valueOf(o2); } }); + */ + + Map sortedMap = new TreeMap<>(new CustomNumberComparator()); + sortedMap.putAll(map); + for (Map.Entry entry : sortedMap.entrySet()) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + } + } + + + +} + + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/ocrdemo.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/ocrdemo.java new file mode 100644 index 0000000..2f4b696 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/ocr/ocrdemo.java @@ -0,0 +1,218 @@ +package com.imurs.ocr; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.imurs.parameter.OcrResult; + + + +//化验单的识别 + +public class ocrdemo { + + /*public static void main(String[] args) throws Exception { + // TODO Auto-generated method stub + //generalOcrRecognition(); + OcrRecognition(); + }*/ + public static Map OcrRecognition(InputStream is) throws Exception{//InputStream is + String otherHost = "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"; + String jsonString = null;//C:\Users\ZP\Desktop\化验单扫描 + // String filePath = "C:\\Users\\ZP\\Desktop\\化验单扫描\\LIS-9.jpg";//D:\\zp\\1\\133.jpg D:\\dd3.jpg \\D:\\zp\\检验单图片数据集\\3.jpg + Map map = new HashMap(); + // byte[] imgData = FileUtil.readFileByBytes(filePath);//化验单238838bd04be88e19529f90ff1044f29 + byte[] imgData = FileUtil.readInputStreamByBytes(is); + byte[] bytes1 = PicUtils.compressPicForScale(imgData, 700, "x"); + String imgStr = Base64Util.encode(bytes1);//乙肝模板36ec1da79ed260ddd86410a269616e91 + String template="28f793e26d5338ff37dc4af04ff62236";// + + String params = "templateSign="+template+"&image="+URLEncoder.encode(imgStr, "UTF-8"); + // Long start =System.currentTimeMillis()/1000; + AuthService as = new AuthService(); + String accessToken = as.getAuth("1"); + // Long end = System.currentTimeMillis()/1000; + // System.out.println("第一次时间"+(end-start)/60); + // Long start1 =System.currentTimeMillis()/1000; + String result = HttpUtil.post(otherHost, accessToken, params); + // Long end1 = System.currentTimeMillis()/1000; + // System.out.println("第二次时间"+(end1-start1)/60); + // System.out.println(result); + // if() + JSONObject jsonObject = JSON.parseObject(result); + Object jsonObject1 =null; + + JSONArray jsonArray = null; + Map rowData = new HashMap(); + if(!jsonObject.get("error_code").equals(0)){ + return (Map) rowData.put("errorCode", "0"); + } + // System.out.println("识别正常情况"); + jsonObject1 = jsonObject.get("data"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + // System.out.println("原始数据"+jsonArray); + //将得到的数组提取出word_name值 + int size =jsonArray.size(); + String jsonObject3 = null; + Object jsonObject4 = null; + List LisList = new ArrayList(); + + OcrResult lis =null; + int num=0; + for(int i=0;i rowData = new HashMap(); + if(jsonObject.get("error_code").equals(0)){ + // System.out.println("识别正常情况"); + jsonObject1 = jsonObject.get("data"); + // List list=new LinkedList(); + // Map rowData = new HashMap(); + //获取这个RET数组 + JSONObject jsonObject2 = JSON.parseObject(jsonObject1.toString()); + jsonArray = jsonObject2.getJSONArray("ret"); + // System.out.println(jsonArray); + //将得到的数组提取出word_name值 + int size =jsonArray.size(); + String jsonObject3 = null; + Object jsonObject4 = null; + + for(int i=0;i applyConsultation; + + private ApplyLis applyLis; + + private List apList; + + private List ecgList; + + private Patient patient; + + private String hisEsrdNumber; + + private String outPatien; + + private String groupHospitalId; + + private String categoryHospitalId; + + public List getApplyConsultation() { + return applyConsultation; + } + + public void setApplyConsultation(List applyConsultation) { + this.applyConsultation = applyConsultation; + } + + public ApplyLis getApplyLis() { + return applyLis; + } + + public void setApplyLis(ApplyLis applyLis) { + this.applyLis = applyLis; + } + + public Patient getPatient() { + return patient; + } + + public void setPatient(Patient patient) { + this.patient = patient; + } + + public String getHisEsrdNumber() { + return hisEsrdNumber; + } + + public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; + } + + public String getOutPatien() { + return outPatien; + } + + public void setOutPatien(String outPatien) { + this.outPatien = outPatien; + } + + public String getGroupHospitalId() { + return groupHospitalId; + } + + public void setGroupHospitalId(String groupHospitalId) { + this.groupHospitalId = groupHospitalId; + } + + public String getCategoryHospitalId() { + return categoryHospitalId; + } + + public void setCategoryHospitalId(String categoryHospitalId) { + this.categoryHospitalId = categoryHospitalId; + } + + public List getApList() { + return apList; + } + + public void setApList(List apList) { + this.apList = apList; + } + + public List getEcgList() { + return ecgList; + } + + public void setEcgList(List ecgList) { + this.ecgList = ecgList; + } + + public ApplyParameter(List applyConsultation, ApplyLis applyLis, List apList, + List ecgList, Patient patient, String hisEsrdNumber, String outPatien, String groupHospitalId, + String categoryHospitalId) { + super(); + this.applyConsultation = applyConsultation; + this.applyLis = applyLis; + this.apList = apList; + this.ecgList = ecgList; + this.patient = patient; + this.hisEsrdNumber = hisEsrdNumber; + this.outPatien = outPatien; + this.groupHospitalId = groupHospitalId; + this.categoryHospitalId = categoryHospitalId; + } + + public ApplyParameter() { + super(); + } + + @Override + public String toString() { + return "ApplyParameter [applyConsultation=" + applyConsultation + ", applyLis=" + applyLis + ", apList=" + + apList + ", ecgList=" + ecgList + ", patient=" + patient + ", hisEsrdNumber=" + hisEsrdNumber + + ", outPatien=" + outPatien + ", groupHospitalId=" + groupHospitalId + ", categoryHospitalId=" + + categoryHospitalId + "]"; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bcall.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bcall.java new file mode 100644 index 0000000..db60f21 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bcall.java @@ -0,0 +1,67 @@ +package com.imurs.parameter; + +public class Bcall { + private String domain; + private String app; + private String stream; + private String uri; + private String duration; + private String start_time; + private String stop_time; + private String event; + public String getEvent() { + return event; + } + public void setEvent(String event) { + this.event = event; + } + @Override + public String toString() { + return "Bcall [domain=" + domain + ", app=" + app + ", stream=" + stream + ", uri=" + uri + ", duration=" + + duration + ", start_time=" + start_time + ", stop_time=" + stop_time + "]"; + } + public String getDomain() { + return domain; + } + public void setDomain(String domain) { + this.domain = domain; + } + public String getApp() { + return app; + } + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + public void setStream(String stream) { + this.stream = stream; + } + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + public String getDuration() { + return duration; + } + public void setDuration(String duration) { + this.duration = duration; + } + public String getStart_time() { + return start_time; + } + public void setStart_time(String start_time) { + this.start_time = start_time; + } + public String getStop_time() { + return stop_time; + } + public void setStop_time(String stop_time) { + this.stop_time = stop_time; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchao.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchao.java new file mode 100644 index 0000000..34f7915 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchao.java @@ -0,0 +1,39 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bchao { + + @Override + public String toString() { + return "Bchao [name=" + name + ", id=" + id + ", bchildren=" + bchildren + "]"; + } + /*public static void main(String[] args) { + // TODO Auto-generated method stub + + }*/ + private String name; + private Integer id; + private List bchildren; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public List getBchildren() { + return bchildren; + } + public void setBchildren(List bchildren) { + this.bchildren = bchildren; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchildren.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchildren.java new file mode 100644 index 0000000..cc7a403 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bchildren.java @@ -0,0 +1,48 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bchildren { + @Override + public String toString() { + return "Bchildren [ultrasound_hint=" + ultrasound_hint + ", id=" + id + ", third_text=" + third_text + + ", ultrasound_find=" + ultrasound_find + ", listbchildren=" + listbchildren + "]"; + } + public String getUltrasound_hint() { + return ultrasound_hint; + } + public void setUltrasound_hint(String ultrasound_hint) { + this.ultrasound_hint = ultrasound_hint; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getThird_text() { + return third_text; + } + public void setThird_text(String third_text) { + this.third_text = third_text; + } + public String getUltrasound_find() { + return ultrasound_find; + } + public void setUltrasound_find(String ultrasound_find) { + this.ultrasound_find = ultrasound_find; + } + private String ultrasound_hint; + private Integer id; + private String third_text; + private String ultrasound_find; + private List listbchildren; + + public List getListbchildren() { + return listbchildren; + } + public void setListbchildren(List listbchildren) { + this.listbchildren = listbchildren; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bmenu.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bmenu.java new file mode 100644 index 0000000..33bb472 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Bmenu.java @@ -0,0 +1,48 @@ +package com.imurs.parameter; + +import java.util.List; + +public class Bmenu { + + public String getUltrasound_hint() { + return ultrasound_hint; + } + public void setUltrasound_hint(String ultrasound_hint) { + this.ultrasound_hint = ultrasound_hint; + } + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getThird_text() { + return third_text; + } + public void setThird_text(String third_text) { + this.third_text = third_text; + } + public String getUltrasound_find() { + return ultrasound_find; + } + @Override + public String toString() { + return "Bmenu [ultrasound_hint=" + ultrasound_hint + ", id=" + id + ", third_text=" + third_text + + ", ultrasound_find=" + ultrasound_find + ", childMenus=" + childMenus + "]"; + } + public void setUltrasound_find(String ultrasound_find) { + this.ultrasound_find = ultrasound_find; + } + private String ultrasound_hint; + private Integer id; + private String third_text; + private String ultrasound_find; + private List childMenus; + public List getChildMenus() { + return childMenus; + } + public void setChildMenus(List childMenus) { + this.childMenus = childMenus; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Children.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Children.java new file mode 100644 index 0000000..cb0807f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Children.java @@ -0,0 +1,61 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +/** + * 菜单栏返回参数 + * @author Server + * + */ +public class Children implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String path; + + private String name; + private Long id; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Children(String path, String name) { + super(); + this.path = path; + this.name = name; + } + + public Children() { + super(); + } + + @Override + public String toString() { + return "Children [path=" + path + ", name=" + name + "]"; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/DataSummarization.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/DataSummarization.java new file mode 100644 index 0000000..3275cc3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/DataSummarization.java @@ -0,0 +1,194 @@ +package com.imurs.parameter; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 数据汇总 + * + * @author D140 + * + */ +public class DataSummarization implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String id; + + private String hospitalName; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy/MM/dd") + private Date setupTime; + + private Integer typeA = 0; + + private Integer typeB = 0; + + /** + * 基层到县医院 + */ + private Integer countyLX = 0; + + private Integer countySP = 0; + + /** + * 基层到市医院 + */ + private Integer cityLX = 0; + + private Integer citySP = 0; + + /** + * B超 + */ + private Integer bmode = 0; + + /** + * 心电 + */ + private Integer ecg = 0; + + /** + * 影像 + */ + private Integer shadow = 0; + + /** + * 病理 + */ + private Integer bl = 0; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getHospitalName() { + return hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public Date getSetupTime() { + return setupTime; + } + + public void setSetupTime(Date setupTime) { + this.setupTime = setupTime; + } + + public Integer getTypeA() { + return typeA; + } + + public void setTypeA(Integer typeA) { + this.typeA = typeA; + } + + public Integer getTypeB() { + return typeB; + } + + public void setTypeB(Integer typeB) { + this.typeB = typeB; + } + + public Integer getCountyLX() { + return countyLX; + } + + public void setCountyLX(Integer countyLX) { + this.countyLX = countyLX; + } + + public Integer getCountySP() { + return countySP; + } + + public void setCountySP(Integer countySP) { + this.countySP = countySP; + } + + public Integer getCityLX() { + return cityLX; + } + + public void setCityLX(Integer cityLX) { + this.cityLX = cityLX; + } + + public Integer getCitySP() { + return citySP; + } + + public void setCitySP(Integer citySP) { + this.citySP = citySP; + } + + public Integer getBmode() { + return bmode; + } + + public void setBmode(Integer bmode) { + this.bmode = bmode; + } + + public Integer getEcg() { + return ecg; + } + + public void setEcg(Integer ecg) { + this.ecg = ecg; + } + + public Integer getShadow() { + return shadow; + } + + public void setShadow(Integer shadow) { + this.shadow = shadow; + } + + + public Integer getBl() { + return bl; + } + + public void setBl(Integer bl) { + this.bl = bl; + } + + public DataSummarization(String id, String hospitalName, Date setupTime, Integer typeA, Integer typeB, + Integer countyLX, Integer countySP, Integer cityLX, Integer citySP, Integer bmode, Integer ecg, + Integer shadow, Integer bl) { + super(); + this.id = id; + this.hospitalName = hospitalName; + this.setupTime = setupTime; + this.typeA = typeA; + this.typeB = typeB; + this.countyLX = countyLX; + this.countySP = countySP; + this.cityLX = cityLX; + this.citySP = citySP; + this.bmode = bmode; + this.ecg = ecg; + this.shadow = shadow; + this.bl = bl; + } + + public DataSummarization() { + super(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Items.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Items.java new file mode 100644 index 0000000..37306af --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/Items.java @@ -0,0 +1,60 @@ +package com.imurs.parameter; + +import java.io.Serializable; +import java.util.List; + +/** + * 菜单栏返回参数 + * + * @author Server + * + */ +public class Items implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private String icon; + + private String name; + + private List children; + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public Items(String icon, String name, List children) { + super(); + this.icon = icon; + this.name = name; + this.children = children; + } + + public Items() { + super(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/LIS.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/LIS.java new file mode 100644 index 0000000..57a2e82 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/LIS.java @@ -0,0 +1,142 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +public class LIS implements Serializable { + +/** + * + */ + private static final long serialVersionUID = 1L; + private String name;//姓名 + private String gender;//性别 + private String age;//年龄 + private String hisEsrdNumber;//住院号 + private String printOrder;//序号 + private String reportItemName;//中文名称 + private String result;//结果 + private String sampleNo;//样本标号 + private String sampleType;//样本类型 + private String paritemName;//收费项目 + private String units ;//单位 + private String printContext;//参考值 + private String resultDateTime;//送检日期 + private String updateDate ;//报告日期 + private String sundryFeeName ;//杂项费用项目 + private String abnormalIndicator;//状态 +public String getName() { + return name; +} +public void setName(String name) { + this.name = name; +} +public String getGender() { + return gender; +} +public void setGender(String gender) { + this.gender = gender; +} +public String getAge() { + return age; +} +public void setAge(String age) { + this.age = age; +} + +public String getHisEsrdNumber() { + return hisEsrdNumber; +} +public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; +} +public String getPrintOrder() { + return printOrder; +} +public void setPrintOrder(String printOrder) { + this.printOrder = printOrder; +} +public String getReportItemName() { + return reportItemName; +} +public void setReportItemName(String reportItemName) { + this.reportItemName = reportItemName; +} +public String getResult() { + return result; +} +public void setResult(String result) { + this.result = result; +} +public String getSampleNo() { + return sampleNo; +} +public void setSampleNo(String sampleNo) { + this.sampleNo = sampleNo; +} +public String getSampleType() { + return sampleType; +} +public void setSampleType(String sampleType) { + this.sampleType = sampleType; +} +public String getParitemName() { + return paritemName; +} +public void setParitemName(String paritemName) { + this.paritemName = paritemName; +} +public String getUnits() { + return units; +} +public void setUnits(String units) { + this.units = units; +} +public String getPrintContext() { + return printContext; +} +public void setPrintContext(String printContext) { + this.printContext = printContext; +} +public String getResultDateTime() { + return resultDateTime; +} +public void setResultDateTime(String resultDateTime) { + this.resultDateTime = resultDateTime; +} +public String getUpdateDate() { + return updateDate; +} +public void setUpdateDate(String updateDate) { + this.updateDate = updateDate; +} + +public String getSundryFeeName() { + return sundryFeeName; +} +public void setSundryFeeName(String sundryFeeName) { + this.sundryFeeName = sundryFeeName; +} +public String getAbnormalIndicator() { + return abnormalIndicator; +} +public void setAbnormalIndicator(String abnormalIndicator) { + this.abnormalIndicator = abnormalIndicator; +} +public static long getSerialversionuid() { + return serialVersionUID; +} +@Override +public String toString() { + return "[name=" + name + ", gender=" + gender + ", age=" + age + ", hisEsrdNumber=" + hisEsrdNumber + ", printOrder=" + + printOrder + ", reportItemName=" + reportItemName + ", result=" + result + ", sampleNo=" + sampleNo + + ", sampleType=" + sampleType + ", paritemName=" + paritemName + ", units=" + units + ", printContext=" + + printContext + ", resultDateTime=" + resultDateTime + ", updateDate=" + updateDate + ", sundryFeeName=" + + sundryFeeName + ", abnormalIndicator=" + abnormalIndicator + "]"; +} + + + + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/MyX509TrustManager.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/MyX509TrustManager.java new file mode 100644 index 0000000..dee374d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/MyX509TrustManager.java @@ -0,0 +1,29 @@ +package com.imurs.parameter; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.X509TrustManager; + +public class MyX509TrustManager implements X509TrustManager{ + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // TODO Auto-generated method stub + + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // TODO Auto-generated method stub + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO Auto-generated method stub + return null; + } + +} + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/OcrResult.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/OcrResult.java new file mode 100644 index 0000000..be74461 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/OcrResult.java @@ -0,0 +1,81 @@ +package com.imurs.parameter; + +import java.io.Serializable; + +public class OcrResult implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; + private String paritemName;//收费项目 + private String result;//结果 + private String units ;//单位 + private String printContext;//参考值 + private String name;//姓名 + private String resultDateTime;//送检日期 + private String updateDate ;//报告日期 + private String auditor;//审核者 + private String handlers;//操作者 + public String getParitemName() { + return paritemName; + } + public void setParitemName(String paritemName) { + this.paritemName = paritemName; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getResultDateTime() { + return resultDateTime; + } + public void setResultDateTime(String resultDateTime) { + this.resultDateTime = resultDateTime; + } + public String getUpdateDate() { + return updateDate; + } + public void setUpdateDate(String updateDate) { + this.updateDate = updateDate; + } + public String getAuditor() { + return auditor; + } + public void setAuditor(String auditor) { + this.auditor = auditor; + } + public String getHandlers() { + return handlers; + } + public void setHandlers(String handlers) { + this.handlers = handlers; + } + public String getUnits() { + return units; + } + public void setUnits(String units) { + this.units = units; + } + public String getPrintContext() { + return printContext; + } + public void setPrintContext(String printContext) { + this.printContext = printContext; + } + public String getResult() { + return result; + } + public void setResult(String result) { + this.result = result; + } + @Override + public String toString() { + return "OcrResult [paritemName=" + paritemName + ", result=" + result + ", units=" + units + ", printContext=" + + printContext + ", name=" + name + ", resultDateTime=" + resultDateTime + ", updateDate=" + updateDate + + ", auditor=" + auditor + ", handlers=" + handlers + "]"; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/PACS.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/PACS.java new file mode 100644 index 0000000..02ae2db --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/PACS.java @@ -0,0 +1,162 @@ +package com.imurs.parameter; + +import java.io.Serializable; + + + +public class PACS implements Serializable { + +/** + * + */ + private static final long serialVersionUID = 1L; +private String patientName; +private String age; +private String sex; + +private String enterChamber;//科室 +private String hisEsrdNumber;//病案号 +private String examineType;//检查类型 +private String examineDate;//检查日期 +private String examinePart;//检查部位 +private String examineName;//检查名称 +private String reportDate;//报告日期 +private String reportDocName;//报告医生 +private String checkDocName;//审核医生 +private String bSee;//检查所见 +private String bHint;//影像结论 +private String reportUrl;//影像url地址 +public String getPatientName() { + return patientName; +} +public void setPatientName(String patientName) { + this.patientName = patientName; +} +public String getAge() { + return age; +} +public void setAge(String age) { + this.age = age; +} +public String getSex() { + return sex; +} +public void setSex(String sex) { + this.sex = sex; +} +public String getEnterChamber() { + return enterChamber; +} +public void setEnterChamber(String enterChamber) { + this.enterChamber = enterChamber; +} + +public String getHisEsrdNumber() { + return hisEsrdNumber; +} +public void setHisEsrdNumber(String hisEsrdNumber) { + this.hisEsrdNumber = hisEsrdNumber; +} +public static long getSerialversionuid() { + return serialVersionUID; +} +public String getExamineType() { + return examineType; +} +public void setExamineType(String examineType) { + this.examineType = examineType; +} +public String getExamineDate() { + return examineDate; +} +public void setExamineDate(String examineDate) { + this.examineDate = examineDate; +} +public String getExaminePart() { + return examinePart; +} +public void setExaminePart(String examinePart) { + this.examinePart = examinePart; +} +public String getExamineName() { + return examineName; +} +public void setExamineName(String examineName) { + this.examineName = examineName; +} +public String getReportDate() { + return reportDate; +} +public void setReportDate(String reportDate) { + this.reportDate = reportDate; +} +public String getReportDocName() { + return reportDocName; +} +public void setReportDocName(String reportDocName) { + this.reportDocName = reportDocName; +} +public String getCheckDocName() { + return checkDocName; +} +public void setCheckDocName(String checkDocName) { + this.checkDocName = checkDocName; +} +public String getbSee() { + return bSee; +} +public void setbSee(String bSee) { + this.bSee = bSee; +} +public String getbHint() { + return bHint; +} +public void setbHint(String bHint) { + this.bHint = bHint; +} +public String getReportUrl() { + return reportUrl; +} +public void setReportUrl(String reportUrl) { + this.reportUrl = reportUrl; +} +@Override +public String toString() { + return "[patientName=" + patientName + ", age=" + age + ", sex=" + sex + ", enterChamber=" + enterChamber + + ", hisEsrdNumber=" + hisEsrdNumber + ", examineType=" + examineType + ", examineDate=" + examineDate + + ", examinePart=" + examinePart + ", examineName=" + examineName + ", reportDate=" + reportDate + + ", reportDocName=" + reportDocName + ", checkDocName=" + checkDocName + ", bSee=" + bSee + ", bHint=" + + bHint + ", reportUrl=" + reportUrl + "]"; +} +@Override +public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((reportDate == null) ? 0 : reportDate.hashCode()); + return result; +} +@Override +public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PACS other = (PACS) obj; + if (reportDate == null) { + if (other.reportDate != null) + return false; + } else if (!reportDate.equals(other.reportDate)) + return false; + return true; +} + + +public int compareTo(PACS ob) { + return ob.getReportDate().compareTo(reportDate); +} + + + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/RsaSecurityParameter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/RsaSecurityParameter.java new file mode 100644 index 0000000..1ea2418 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/RsaSecurityParameter.java @@ -0,0 +1,30 @@ +/*package com.imurs.parameter; + +import java.lang.annotation.*; + +import org.springframework.web.bind.annotation.Mapping; + + +*//** + * @author monkey + * @desc 请求数据解密 + * @date 2018/10/29 20:17 + *//* +@Target({ElementType.METHOD,ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Mapping +@Documented +public @interface RsaSecurityParameter { + + *//** + * 入参是否解密,默认解密 + *//* + boolean inDecode() default true; + + *//** + * 出参是否加密,默认加密 + *//* + boolean outEncode() default true; + +} +*/ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/SysMenusParameter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/SysMenusParameter.java new file mode 100644 index 0000000..011bc90 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/parameter/SysMenusParameter.java @@ -0,0 +1,37 @@ +package com.imurs.parameter; + + +public class SysMenusParameter { + + private String menuId; + + private String menuStair; + + + public String getMenuId() { + return menuId; + } + + public String getMenuStair() { + return menuStair; + } + + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + public void setMenuStair(String menuStair) { + this.menuStair = menuStair; + } + + public SysMenusParameter(String menuId, String menuStair) { + super(); + this.menuId = menuId; + this.menuStair = menuStair; + } + + public SysMenusParameter() { + super(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AgoraRecordService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AgoraRecordService.java new file mode 100644 index 0000000..a7bebd0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AgoraRecordService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.AgoraRecord; + + +public interface AgoraRecordService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AiQcVocabularyService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AiQcVocabularyService.java new file mode 100644 index 0000000..ac376cf --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/AiQcVocabularyService.java @@ -0,0 +1,7 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.AiQcVocabulary; + +public interface AiQcVocabularyService extends IService { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApiUrlService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApiUrlService.java new file mode 100644 index 0000000..d24a06d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApiUrlService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApiUrl; + +public interface ApiUrlService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeImgService.java new file mode 100644 index 0000000..2dfef21 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBModeImg; + +public interface ApplyBModeImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeService.java new file mode 100644 index 0000000..44ce9de --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeService.java @@ -0,0 +1,39 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBMode; +import com.imurs.util.page.Pagetion; + +public interface ApplyBModeService extends IService{ + + public List selectBmodePage(Map map); + + public Pagetion selectBmodePage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion> selectBmodeSpePage(Map map,Integer pageNo,Integer pageSize); + + public Map DataStatistics(); + + /** + * 基层医院超声统计 + * @param id + * @param startTime + * @param endTime + * @return + */ + Map categoryHospitalStatistics(String id,String startTime,String endTime); + + Map dataStatisticsForHospital(String startTime,String endTime); + + /** + * 根据id修改病例搜索 + * @param applyBMode 超声病例 + * @return + */ + boolean updateBmodeById(ApplyBMode applyBMode); + List> selectWorkTotalByTime(String startTime, String endTime, String conditions,String consultationMode, String categoryHospitalId); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java new file mode 100644 index 0000000..d33b9c7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyBModeSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyBModeSpecialist; + +public interface ApplyBModeSpecialistService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseImgService.java new file mode 100644 index 0000000..aa23029 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyCaseImg; + +public interface ApplyCaseImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseService.java new file mode 100644 index 0000000..b274a23 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyCaseService.java @@ -0,0 +1,26 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyCase; +import com.imurs.util.page.Pagetion; + +public interface ApplyCaseService extends IService{ + public List export(Map map); + public List getExport(Map map); + public List arrangeOutExport(Map map); + public List arrangeGetExport(Map map); + + public Pagetion selectCasePage(Map map,Integer pageNo,Integer pageSize); + public Pagetion selectAdminCasePage(Map map,Integer pageNo,Integer pageSize); + + public ApplyCase selectCaseById(Long id); + public int selectUpWayReferralNumer(Map upWayReferralMap); + public int selectDownWayReferralNumer(Map upWayReferralMap); + + public Pagetion selectCasePatient(Map map,Integer pageNo,Integer pageSize); + public Boolean updateByHis(Map map2); + public Map selectPatientById(Map map); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java new file mode 100644 index 0000000..47c87fd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsulationSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsulationSpecialist; + +public interface ApplyConsulationSpecialistService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationImgService.java new file mode 100644 index 0000000..e8d594d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsultationImg; + +public interface ApplyConsultationImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationService.java new file mode 100644 index 0000000..53db73a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyConsultationService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyConsultation; +import com.imurs.util.page.CustomPage; +import com.imurs.util.page.Pagetion; + +public interface ApplyConsultationService extends IService{ + + public Pagetion selectConByCategory(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectConPatient(Map map,Integer pageNo,Integer pageSize); + + public int selectConsultationNumer(Map downWayReferralMap); + + public Pagetion selectConsultationSpe(Map map,Integer pageNo, Integer pageSize); + + public CustomPage selectConByPage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java new file mode 100644 index 0000000..bd663ae --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyDoctorPromoteService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.util.page.Pagetion; + +public interface ApplyDoctorPromoteService extends IService{ + + public Pagetion selectAdminPromote(Map map,Integer pageNo,Integer pageSize); + + int selectrefresherCount(Map refresherNumerMap); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgImgService.java new file mode 100644 index 0000000..f8d9907 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcgImg; + +public interface ApplyEcgImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgService.java new file mode 100644 index 0000000..61dd39b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcg; +import com.imurs.util.page.Pagetion; + +public interface ApplyEcgService extends IService{ + + public Pagetion selectEcgPage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectEcgSpePage(Map map,Integer pageNo,Integer pageSize); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java new file mode 100644 index 0000000..ebbc63e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyEcgSpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyEcgSpecialist; + +public interface ApplyEcgSpecialistService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationImgService.java new file mode 100644 index 0000000..b72346b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationImgService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyInformationImg; + +public interface ApplyInformationImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationService.java new file mode 100644 index 0000000..132bd06 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyInformationService.java @@ -0,0 +1,19 @@ +package com.imurs.service; + + +import java.util.List; +import java.util.Map; +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyInformation; +import com.imurs.util.page.Pagetion; + +public interface ApplyInformationService extends IService{ + + Pagetion findAifmAdminPage(Map map,Integer pageNo,Integer pageSize); + + List selectHospitalList(String hospitalName); + + List selectInfromationList(Map infromationMap); + + boolean updateBatchByIds(List applyInformation); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyLisService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyLisService.java new file mode 100644 index 0000000..2c9ca98 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyLisService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyLis; + +public interface ApplyLisService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyFileService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyFileService.java new file mode 100644 index 0000000..d5c0224 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyFileService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologyFile; + +public interface ApplyPathologyFileService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyImgService.java new file mode 100644 index 0000000..3a2416d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologyImg; + +public interface ApplyPathologyImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyService.java new file mode 100644 index 0000000..76ddc6b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologyService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathology; +import com.imurs.util.page.Pagetion; + +public interface ApplyPathologyService extends IService{ + + public Pagetion selectAphPage(Map map,Integer pageNo,Integer pageSize); + + public Pagetion selectAphSpePage(Map map,Integer pageNo,Integer pageSize); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java new file mode 100644 index 0000000..523d2c1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplyPathologySpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplyPathologySpecialist; + +public interface ApplyPathologySpecialistService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplySpecialistService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplySpecialistService.java new file mode 100644 index 0000000..37f5ccf --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ApplySpecialistService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ApplySpecialist; + +public interface ApplySpecialistService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeHistoryService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeHistoryService.java new file mode 100644 index 0000000..5a4b345 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeHistoryService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BModeHistory; + + + +import java.util.List; +import java.util.Map; + +public interface BModeHistoryService extends IService { + + + + + List selectBmodeHis(Map map); //Long bId, Long reportId + + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeReportService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeReportService.java new file mode 100644 index 0000000..27986e0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BModeReportService.java @@ -0,0 +1,23 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BModeReport; + +import java.text.ParseException; +import java.util.List; + +/** + * @author Laier + * @date 2022-11-23 14:14 + */ +public interface BModeReportService extends IService { + List insertModeReportList(Long bId, List modeReports) throws ParseException, Exception; + + List selectModeReportListByBId(Long bId); + + BModeReport selectModeReportByReportId(Long reportId); + + void checkReportAndChangeModelState(BModeReport modeReport) throws ParseException; + + List finishModeReport(Long bId,Long speId, List resultReports) throws ParseException; +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisNextService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisNextService.java new file mode 100644 index 0000000..92d256b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisNextService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BdiagnosisNext; + +public interface BdiagnosisNextService extends IService { + + List selectDiagnosisList(Integer id); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisService.java new file mode 100644 index 0000000..88e797f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BdiagnosisService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Bdiagnosis; + +public interface BdiagnosisService extends IService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodeMachineModelService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodeMachineModelService.java new file mode 100644 index 0000000..4719619 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodeMachineModelService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodeMachineModel; + +public interface BmodeMachineModelService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelFrisService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelFrisService.java new file mode 100644 index 0000000..89c3e83 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelFrisService.java @@ -0,0 +1,13 @@ +package com.imurs.service; + + + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodelFris; + + +public interface BmodelFrisService extends IService{ + public List selectBmodelFris(int id); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelSecondService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelSecondService.java new file mode 100644 index 0000000..8282a57 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelSecondService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + + + +import java.util.List; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; + + +public interface BmodelSecondService extends IService{ + public List selectbmodelSecond(int id); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelService.java new file mode 100644 index 0000000..0554f08 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/BmodelService.java @@ -0,0 +1,11 @@ +package com.imurs.service; + + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Bmodel; + + +public interface BmodelService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/CaseTemplateService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/CaseTemplateService.java new file mode 100644 index 0000000..4f87dbe --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/CaseTemplateService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.CaseTemplate; + +import java.util.List; + +public interface CaseTemplateService extends IService { + + List listWithTree(); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ClinicalGuidelinesService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ClinicalGuidelinesService.java new file mode 100644 index 0000000..e3b9186 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ClinicalGuidelinesService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.util.page.Pagetion; + +public interface ClinicalGuidelinesService extends IService{ + public Pagetion selectCgsOrByDocIdPage(Map map, Integer pageNo, Integer pageSize); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorArrangeService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorArrangeService.java new file mode 100644 index 0000000..a8968af --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorArrangeService.java @@ -0,0 +1,31 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.DoctorArrange; +import com.imurs.util.page.Pagetion; + +public interface DoctorArrangeService extends IService{ + + public List selectHonmeShowArrange(); + + public List homeShowArrange(Map map); + + public DoctorArrange selectTotanumberDay(Map map); + + public Pagetion selectByArrangePage(Map map,Integer pageNo, Integer pageSize); + + public List selectTotaDay(Map map); + + public DoctorArrange selectArrangeByUser(Long id); + int selectdoctorTotaDay(Map map); + + List selectDoctorArrangeList(Map doctorArrang); + + Map selectAccreditedMedicalNumber(Map map1); + + public List selectArrangeByRhId(String receiveHospitalId); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorGroupService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorGroupService.java new file mode 100644 index 0000000..ea20a9b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/DoctorGroupService.java @@ -0,0 +1,16 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.DoctorGroup; + +import java.util.List; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Service +* @createDate 2025-11-13 12:08:54 +*/ +public interface DoctorGroupService extends IService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/HomePageShowService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/HomePageShowService.java new file mode 100644 index 0000000..0196c56 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/HomePageShowService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.HomePageShow; + +public interface HomePageShowService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ImgArrangeService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ImgArrangeService.java new file mode 100644 index 0000000..fecc4a1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/ImgArrangeService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.ImgArrange; + +public interface ImgArrangeService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/InstallModelService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/InstallModelService.java new file mode 100644 index 0000000..5dd7ba1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/InstallModelService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Service; + +@Service +public interface InstallModelService extends IService { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LiveService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LiveService.java new file mode 100644 index 0000000..5f4a1f1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LiveService.java @@ -0,0 +1,12 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Live; +import com.imurs.util.page.Pagetion; + +import java.util.Map; + +public interface LiveService extends IService { + + public Pagetion selectLivePage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LoginRecordService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LoginRecordService.java new file mode 100644 index 0000000..67c1396 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/LoginRecordService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.LoginRecord; + +public interface LoginRecordService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientService.java new file mode 100644 index 0000000..eb621a3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Patient; + +public interface PatientService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordImgService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordImgService.java new file mode 100644 index 0000000..f46a937 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordImgService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUserRecordImg; + +public interface PatientUserRecordImgService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordService.java new file mode 100644 index 0000000..47c2920 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserRecordService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUserRecord; +import com.imurs.util.page.Pagetion; + +public interface PatientUserRecordService extends IService{ + + + public Pagetion selectRecordPtUserPage(Map map,Integer pageNo,Integer pageSize); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserService.java new file mode 100644 index 0000000..9572a7e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/PatientUserService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.PatientUser; + +public interface PatientUserService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/RoleService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/RoleService.java new file mode 100644 index 0000000..507e8b4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/RoleService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Role; + +public interface RoleService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SectionService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SectionService.java new file mode 100644 index 0000000..6bf83f0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SectionService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Section; + +public interface SectionService extends IService
    { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SysMenuService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SysMenuService.java new file mode 100644 index 0000000..d511052 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/SysMenuService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.SysMenu; + +public interface SysMenuService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java new file mode 100644 index 0000000..b7249ec --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalClinicalGuidelinesService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalClinicalGuidelines; + +public interface TotalClinicalGuidelinesService extends IService{ + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalInformationService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalInformationService.java new file mode 100644 index 0000000..234b04d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalInformationService.java @@ -0,0 +1,14 @@ +package com.imurs.service; + + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalInformation; + +public interface TotalInformationService extends IService{ + + public List selectTotalInformationAll(Map map); + public TotalInformation totaTotalInformation(Map map); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalTrainingService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalTrainingService.java new file mode 100644 index 0000000..8547c76 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TotalTrainingService.java @@ -0,0 +1,15 @@ +package com.imurs.service; + + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TotalTraining; + +public interface TotalTrainingService extends IService{ + + public TotalTraining selectTotanNumberTraining (Map map); + + public Map selectLectureTrainingAndNember(Map map2); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingFlowerService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingFlowerService.java new file mode 100644 index 0000000..d3b1b04 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingFlowerService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingFlower; + +public interface TrainingFlowerService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingOpinionService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingOpinionService.java new file mode 100644 index 0000000..5ca9331 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingOpinionService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingOpinion; + +public interface TrainingOpinionService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingPlanService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingPlanService.java new file mode 100644 index 0000000..67964b6 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingPlanService.java @@ -0,0 +1,8 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingPlan; + +public interface TrainingPlanService extends IService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingRecordService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingRecordService.java new file mode 100644 index 0000000..db477b0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingRecordService.java @@ -0,0 +1,17 @@ +package com.imurs.service; + + + +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.TrainingRecord; +import com.imurs.util.page.Pagetion; + +public interface TrainingRecordService extends IService{ + + public Pagetion selectAdminRecord(Map map,Integer pageNo,Integer pageSize); + + public TrainingRecord selectTrainingRecordById(Long id); + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingService.java new file mode 100644 index 0000000..0756815 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/TrainingService.java @@ -0,0 +1,17 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.Training; +import com.imurs.util.page.Pagetion; + +public interface TrainingService extends IService{ + + public List selectTraining(Map map); + + int selectTotalTopicNumber(Map totalTopicNumMap); + + public Pagetion selectBasePage(Map map, Integer pageNo, Integer pageSize); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/UserService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/UserService.java new file mode 100644 index 0000000..3989019 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/UserService.java @@ -0,0 +1,21 @@ +package com.imurs.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.User; +import com.imurs.util.page.Pagetion; + +public interface UserService extends IService{ + + public Pagetion selectUserPageByDoc(Map map,Integer pageNo,Integer pageSize); + + public User selectUserByUid(Long uid); + + public Map selectByappuserID(Long id); + + public User selectUserByPhone(String phone); + + boolean updateBatchByIds(List users); +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/VideoRecordService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/VideoRecordService.java new file mode 100644 index 0000000..ef4258b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/VideoRecordService.java @@ -0,0 +1,11 @@ +package com.imurs.service; + + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.VideoRecord; + +public interface VideoRecordService extends IService{ + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/WebLogService.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/WebLogService.java new file mode 100644 index 0000000..3fcb4fd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/WebLogService.java @@ -0,0 +1,9 @@ +package com.imurs.service; + +import com.baomidou.mybatisplus.service.IService; +import com.imurs.entity.WebLog; +import org.springframework.stereotype.Service; + +@Service +public interface WebLogService extends IService { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java new file mode 100644 index 0000000..371df7d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AgoraRecordServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.AgoraRecordMapper; +import com.imurs.entity.AgoraRecord; +import com.imurs.service.AgoraRecordService; +@Service +public class AgoraRecordServiceImpl extends ServiceImpl implements AgoraRecordService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java new file mode 100644 index 0000000..d4670bc --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/AiQcVocabularyServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.AiQcVocabularyMapper; +import com.imurs.entity.AiQcVocabulary; +import com.imurs.service.AiQcVocabularyService; +import org.springframework.stereotype.Service; + +@Service +public class AiQcVocabularyServiceImpl extends ServiceImpl + implements AiQcVocabularyService { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java new file mode 100644 index 0000000..bffad4c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApiUrlServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApiUrlMapper; +import com.imurs.entity.ApiUrl; +import com.imurs.service.ApiUrlService; + +@Service +public class ApiUrlServiceImpl extends ServiceImpl implements ApiUrlService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java new file mode 100644 index 0000000..b8f3b8d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeImgMapper; +import com.imurs.entity.ApplyBModeImg; +import com.imurs.service.ApplyBModeImgService; + +@Service +public class ApplyBModeImgServiceImpl extends ServiceImpl implements ApplyBModeImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java new file mode 100644 index 0000000..c3dd867 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeServiceImpl.java @@ -0,0 +1,665 @@ +package com.imurs.service.impl; + + +import static org.mockito.Matchers.intThat; + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.ApplyInformationMapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.BModeReport; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeMapper; +import com.imurs.dao.ApplyBModeSpecialistMapper; +import com.imurs.dao.UserMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.User; +import com.imurs.service.ApplyBModeService; +import com.imurs.util.page.Pagetion; +import com.imurs.utils.BodyPartCounter; +import com.imurs.utils.Excelvo; +import com.imurs.utils.handleDuplicate; + +@Service +public class ApplyBModeServiceImpl extends ServiceImpl implements ApplyBModeService{ + + @Autowired + ApplyBModeMapper applyBModeMapper; + @Autowired + ApplyBModeSpecialistMapper applyBModeSpecialistMapper; + @Autowired + UserMapper userMapper; + @Autowired + private ApplyInformationMapper applyInformationMapper; + + +// @Override +// public void updateByMyId(Long id,String username) { +// applyBModeMapper.updateByMyId(id,username); +// } + + @Override + public List selectBmodePage(Map map) { + return applyBModeMapper.selectBmodePage(map); + } + + @Override + public Pagetion selectBmodePage(Map map,Integer pageNo, Integer pageSize) { + int count=applyBModeMapper.selectBmodePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyBModeMapper.selectBmodePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion> selectBmodeSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyBModeMapper.selectBmodeSpePage(map).size(); + Pagetion> pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List> list= applyBModeMapper.selectBmodeSpePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Map DataStatistics() { + Map map = new HashMap(); + List> diagnosisTypeNumber = applyBModeMapper.diagnosisTypeNumber(); + List> hospitalApplyNumber = applyBModeMapper.hospitalApplyNumber(); + map.put("diagnosisTypeNumber", diagnosisTypeNumber); + map.put("hospitalApplyNumber", hospitalApplyNumber); + + Map map1 = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("state", 40).or().eq("state", 70); + List selectList = applyBModeSpecialistMapper.selectList(wrapper); + EntityWrapper wrapper1=new EntityWrapper(); + wrapper1.eq("hospital_id", 10001).eq("rid", 6); + List selectList2 = userMapper.selectList(wrapper1); + for (User user : selectList2) { + int i = 0; + for (ApplyBModeSpecialist applyBModeSpecialist : selectList) { + if (user.getUserName().equals(applyBModeSpecialist.getSpeName())) { + i++; + } + } + map1.put(user.getUserName(), i); + } + List> specialistUserNumber = new ArrayList>(); + specialistUserNumber.add(map1); + map.put("specialistUserNumber", specialistUserNumber); + + return map; + } + + //基层医院超声统计 以前的代码没有部位 + + public Map categoryHospitalStatistics2(String id, String startTime, String endTime) { + Map map = new HashMap<>(); + EntityWrapper wrapper1 = new EntityWrapper<>(); + EntityWrapper wrapper2 = new EntityWrapper<>(); + try { + wrapper1.eq("category_hospital_id",id); + wrapper1.eq("status","70"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper1.ge("group_date",startTime).le("group_date",endTime); + } + List abList = applyBModeMapper.selectList(wrapper1); + //医院实时超声会诊的总数 + long totalSpCount = abList.stream() + .filter(applyBMode -> "SP".equals(applyBMode.getDiagnosisType())) + .count(); + //医院离线超声会诊总数 + long totalLxCount = abList.stream() + .filter(applyBMode -> "LX".equals(applyBMode.getDiagnosisType())) + .count(); + //统计医生的超声总数 + Map spDoctorCount = abList.stream() + .filter(applyBMode -> "SP".equals(applyBMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + Map lxDoctorCount = abList.stream() + .filter(applyBMode -> "LX".equals(applyBMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + + wrapper2.eq("hospital_id",id); + List users = userMapper.selectList(wrapper2); + List> docList = new ArrayList<>(); + //遍历医生,如果该医生有实时会诊或者离线会诊则记录下来,如果没有则赋值为0 + for (User user : users) { + Map docMap = new HashMap<>(); + docMap.put("name",user.getUserName()); + docMap.put("spCount",spDoctorCount.get(user.getId()) == null + ? 0 : spDoctorCount.get(user.getId())); + docMap.put("lxCount",lxDoctorCount.get(user.getId()) == null + ? 0 : lxDoctorCount.get(user.getId())); + docList.add(docMap); + } + //放入map返回给前端 + map.put("totalSpCount",totalSpCount); + map.put("totalLxCount",totalLxCount); + map.put("doctorCount",docList); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg","4"); + } + return map; + } + //基层医院超声统计 改成病例数和实际部位数 + @Override + public Map categoryHospitalStatistics(String id, String startTime, String endTime) { + Map map = new HashMap<>(); + EntityWrapper wrapper1 = new EntityWrapper<>(); + EntityWrapper wrapper2 = new EntityWrapper<>(); + try { + wrapper1.eq("category_hospital_id",id); + wrapper1.eq("status","70"); + wrapper1.notLike("patient_name","%测试%"); + wrapper1.isNotNull("examine_part_num"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper1.ge("group_date",startTime).le("group_date",endTime); + } + List abList = applyBModeMapper.selectList(wrapper1); + //医院实时超声会诊的总数 + long totalLxCount = abList.size(); + //医院部位会诊总数 + long totalPartCount = abList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .mapToInt(bMode -> bMode.getExaminePartNum()).sum(); + //统计医生的超声总数,以前没有填部位数的不统计了 + Map spDoctorCount = abList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .collect(Collectors.groupingBy(ApplyBMode::getDocId,Collectors.counting())); + Map lxDoctorCount = abList.stream() + // .filter(bMode -> bMode.getExaminePartNum() != null) // 过滤掉examine_part_num为null的记录 + .collect(Collectors.groupingBy( + ApplyBMode::getDocId, // 按医院分类 + Collectors.summingLong(ApplyBMode::getExaminePartNum) // 统计每个医院的检查部位总数 + )); + + + wrapper2.eq("hospital_id",id); + wrapper1.notLike("user_name","%测试%"); + List users = userMapper.selectList(wrapper2); + List> docList = new ArrayList<>(); + //遍历医生,如果该医生有实时会诊或者离线会诊则记录下来,如果没有则赋值为0 + for (User user : users) { + Map docMap = new HashMap<>(); + docMap.put("name",user.getUserName()); + docMap.put("lxCount",spDoctorCount.get(user.getId()) == null + ? 0 : spDoctorCount.get(user.getId())); + docMap.put("partCount",lxDoctorCount.get(user.getId()) == null + ? 0 : lxDoctorCount.get(user.getId())); + docList.add(docMap); + } + //放入map返回给前端 + map.put("totalLxCount",totalLxCount); + map.put("totalPartCount",totalPartCount); + map.put("doctorCount",docList); + }catch (Exception e) { + e.printStackTrace(); + map.put("msg","4"); + } + return map; + } + + //管理医院超声统计 + //这是以前的代码 + public Map dataStatisticsForHospital2(String startTime,String endTime) { + Map map = new HashMap<>(); + + EntityWrapper bModeWrapper = new EntityWrapper<>(); + EntityWrapper informationWrapper = new EntityWrapper<>(); + + bModeWrapper.eq("group_hospital_id","10001"); + bModeWrapper.eq("status","70"); + bModeWrapper.ne("category_hospital_id","10001"); + bModeWrapper.notLike("patient_name","%测试%"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + bModeWrapper.ge("group_date",startTime).le("group_date",endTime); + } + + informationWrapper.eq("hospital_id","10001"); + informationWrapper.ne("account","10001"); + informationWrapper.notLike("hospital_name","%测试%"); + try { + //查询出管理医院下的基层医院所有的超声列表 + List bModeList = applyBModeMapper.selectList(bModeWrapper); + //基层医院实时会诊总数 + long totalCategorySpCount = bModeList.stream() + .filter(bMode -> "SP".equals(bMode.getDiagnosisType())).count(); + //基层医院离线会诊总数 + long totalCategoryLxCount = bModeList.stream() + .filter(bMode -> "LX".equals(bMode.getDiagnosisType())).count(); + //l基层医院的阳性病例总数 + long totalCategoryNatureCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()).count(); + + //统计基层医院的超声总数 + Map spCategoryCount = bModeList.stream() + .filter(bMode -> "SP".equals(bMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + Map lxCategoryCount = bModeList.stream() + .filter(bMode -> "LX".equals(bMode.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + //统计基层医院的阳性病例总数 + Map natureCategoryCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //查询所有的基层医院 + List informations = applyInformationMapper.selectList(informationWrapper); + + //查询每个医院的实时会诊次数与离线会诊次数 + List> infomationList = new ArrayList<>(); + for (ApplyInformation information : informations) { + Map inforMap = new HashMap<>(); + inforMap.put("hospitalName",information.getHospitalName()); + inforMap.put("spCount",spCategoryCount.get(information.getAccount()) + == null ? 0 : spCategoryCount.get(information.getAccount())); + inforMap.put("lxCount",lxCategoryCount.get(information.getAccount()) + == null ? 0 : lxCategoryCount.get(information.getAccount())); + inforMap.put("natureCount",natureCategoryCount.get(information.getAccount()) + == null ? 0 : natureCategoryCount.get(information.getAccount())); + infomationList.add(inforMap); + } + //统计阳性病例的百分比 + long total = totalCategorySpCount + totalCategoryLxCount; + String naturePercent = accuracy(totalCategoryNatureCount,total); + + map.put("spCategoryCount",totalCategorySpCount); + map.put("lxCategoryCount",totalCategoryLxCount); + map.put("natureCount",totalCategoryNatureCount); + map.put("naturePercent",naturePercent); + map.put("infomationList",infomationList); + + //统计专家的会诊列表 + List> specialists = querySpecialistStatistics(startTime,endTime).get("specialist"); + List> countList = querySpecialistStatistics(startTime,endTime).get("countList"); + map.put("specialists",specialists); + map.put("countList",countList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + //管理医院超声统计 按部位数统计 + @Override + public Map dataStatisticsForHospital(String startTime,String endTime) { + Map map = new HashMap<>(); + + EntityWrapper bModeWrapper = new EntityWrapper<>(); + EntityWrapper informationWrapper = new EntityWrapper<>(); + + bModeWrapper.eq("group_hospital_id","10001"); + bModeWrapper.eq("status","70"); + bModeWrapper.ne("category_hospital_id","10001"); + bModeWrapper.notLike("patient_name","%测试%"); + bModeWrapper.isNotNull("examine_part_num"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + bModeWrapper.ge("group_date",startTime).le("group_date",endTime); + } + + informationWrapper.eq("hospital_id","10001"); + informationWrapper.ne("account","10001"); + informationWrapper.notLike("hospital_name","%测试%"); + try { + //查询出管理医院下的基层医院所有的超声列表 + List bModeList = applyBModeMapper.selectList(bModeWrapper); + //基层医院实时会诊总数 + + // .filter(bMode -> "A".equals(bMode.getConditions())) 普通超声 B多普勒 + long totalCategoryPartCount = bModeList.stream() + //.filter(bMode -> bMode.getExaminePartNum() != null) + .mapToInt(bMode -> bMode.getExaminePartNum()).sum(); + + //l基层医院的阳性病例总数 + //l基层医院的阳性病例总数 + long totalCategoryNatureCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()).count(); + //long totalCategoryNatureCount = bModeList.stream() + // .filter(bMode -> 1 == bMode.getNature()).count(); + //不要阳性病例总数,改成病例总数 字段的名字前端要求的没有改totalCategoryLxCount + long totalCategoryLxCount = bModeList.size(); + + //统计基层医院的超声总数 + /* + * Map spCategoryCount = bModeList.stream() .filter(bMode -> + * "SP".equals(bMode.getDiagnosisType())) + * .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors. + * counting())); Map lxCategoryCount = bModeList.stream() + * .filter(bMode -> "LX".equals(bMode.getDiagnosisType())) + * .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors. + * counting())); + */ + //Map spCategoryCount = bModeList.stream() + //.collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + Map spCategoryCount = bModeList.stream() + // .filter(bMode -> bMode.getExaminePartNum() != null) // 过滤掉examine_part_num为null的记录 + .collect(Collectors.groupingBy( + ApplyBMode::getCategoryHospitalId, // 按医院分类 + Collectors.summingLong(ApplyBMode::getExaminePartNum) // 统计每个医院的检查部位总数 + )); + + //统计基层医院的阳性病例总数 + + Map natureCategoryCount = bModeList.stream() + .filter(bMode -> 1 == bMode.getNature()) + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //改成病例总数不统计阳性病例 + Map applyCategoryCount = bModeList.stream() + + .collect(Collectors.groupingBy(ApplyBMode::getCategoryHospitalId,Collectors.counting())); + + //查询所有的基层医院 + List informations = applyInformationMapper.selectList(informationWrapper); + + //查询每个医院的实时会诊次数与离线会诊次数 + List> infomationList = new ArrayList<>(); + for (ApplyInformation information : informations) { + Map inforMap = new HashMap<>(); + inforMap.put("hospitalName",information.getHospitalName()); + inforMap.put("partCount",spCategoryCount.get(information.getAccount()) + == null ? 0 : spCategoryCount.get(information.getAccount())); + inforMap.put("natureCount",natureCategoryCount.get(information.getAccount()) + == null ? 0 : natureCategoryCount.get(information.getAccount())); + //System.out.println(information.getHospitalName()+" :"+spCategoryCount.get(information.getAccount())); + inforMap.put("lxCount",applyCategoryCount.get(information.getAccount()) + == null ? 0 : applyCategoryCount.get(information.getAccount())); + infomationList.add(inforMap); + } + // + long total = totalCategoryLxCount ; + String naturePercent = accuracy(totalCategoryNatureCount,total); + + //map.put("spCategoryCount",totalCategorySpCount); + map.put("lxCategoryCount",totalCategoryLxCount); + map.put("partCount",totalCategoryPartCount); + map.put("natureCount",totalCategoryNatureCount); + map.put("naturePercent",naturePercent); + map.put("infomationList",infomationList); + + //统计专家的会诊列表 + List> specialists = querySpecialistStatisticsnew(startTime,endTime).get("specialist"); + List> countList = querySpecialistStatisticsnew(startTime,endTime).get("countList"); + map.put("specialists",specialists); + map.put("countList",countList); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg",4); + } + return map; + } + + /** + * 根据id修改病例信息 + * @param applyBMode 超声病例 + * @return + */ + @Override + public boolean updateBmodeById(ApplyBMode applyBMode) { + //判断原本病例的 active状态 + ApplyBMode activeModel = applyBModeMapper.selectById(applyBMode.getId()); + int active = activeModel.getActive(); + int changeActive = applyBMode.getActive() == null ? 1 : applyBMode.getActive(); + //0表示已结束,则该状态不能改变 + if (active == ModelActiveConstant.ACTIVE_FINISH) { + applyBMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + } + //2表示待审核,只能由专家提交报告改变为已结束,不能作其它改变 + if (active == ModelActiveConstant.ACTIVE_CHECKING && changeActive != ModelActiveConstant.ACTIVE_FINISH) { + applyBMode.setActive(ModelActiveConstant.ACTIVE_CHECKING); + } + Integer update = applyBModeMapper.updateById(applyBMode); + return update > 0; + } + + /** + * 统计管理医院专家的会诊次数 + * @return + */ + private Map>> querySpecialistStatistics(String startTime,String endTime) { + Map>> map = new HashMap<>(); + List> specialist = new ArrayList<>(); + List> countList = new ArrayList<>(); + + EntityWrapper wrapper = new EntityWrapper<>(); + wrapper.eq("state","70"); + if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) { + startTime = startTime + " 00:00:00"; + endTime = endTime + " 23:59:59"; + wrapper.ge("create_time",startTime).le("create_time",endTime); + } + + EntityWrapper userWrapper = new EntityWrapper<>(); + userWrapper.eq("hospital_id","10001").eq("rid","6") + .notLike("user_name","%测试%").eq("se_name","超声科"); + //wrapper.notLike("applybmode.pa_name", "%测试%"); + + try { + //查询专家超声会诊的列表 + List specialists = applyBModeSpecialistMapper.selectList(wrapper); + + //统计专家实时超声会诊的列表 + Map spSpecialistCount = specialists.stream() + .filter(applyBModeSpecialist -> "SP".equals(applyBModeSpecialist.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + //统计专家离线会诊的列表 + Map lxSpecialistCount = specialists.stream() + .filter(applyBModeSpecialist -> "LX".equals(applyBModeSpecialist.getDiagnosisType())) + .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + + //统计每个专家的会诊次数 + List userList = userMapper.selectList(userWrapper); + Map totalMap = new HashMap<>(); + Long totalSpCount = 0L; + Long totalLxCount = 0L; + for (User user : userList) { + Map userMap = new HashMap<>(); + Long spCount = spSpecialistCount.get(user.getId()) == null + ? 0L : spSpecialistCount.get(user.getId()); + Long lxCount = lxSpecialistCount.get(user.getId()) == null + ? 0L : lxSpecialistCount.get(user.getId()); + userMap.put("userName",user.getUserName()); + userMap.put("spCount",spCount); + userMap.put("lxCount",lxCount); + specialist.add(userMap); + totalSpCount = totalSpCount + spCount; + totalLxCount = totalLxCount + lxCount; + } + //统计专家会诊次数的总数 + totalMap.put("totalSpCount",totalSpCount); + totalMap.put("totalLxCount",totalLxCount); + countList.add(totalMap); + map.put("specialist",specialist); + map.put("countList", countList); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + // + private Map>> querySpecialistStatisticsnew(String startTime,String endTime) + { + //String s = "select *from apply_b_mode_specialist a LEFT JOIN apply_b_mode b ON a.b_id = a.id where a.state = '70' and b.patient_name NOT LIKE '%测试%' "; + //List specialists = applyBModeSpecialistMapper.selectList(new EntityWrapper()); + //先前查询的时候把患者带测试病人加上去了现在改一下 + List> specialist = new ArrayList<>(); + List> countList = new ArrayList<>(); + Map>> map = new HashMap<>(); + EntityWrapper userWrapper = new EntityWrapper<>(); + userWrapper.eq("hospital_id","10001").eq("rid","6") + .notLike("user_name","%测试%").eq("se_name","超声科"); + try { + + //查询专家超声会诊的列表 这里要继续改 把会诊的 + List> specialists =applyBModeSpecialistMapper.selectbySpe( startTime,endTime); + + //统计专家实时超声会诊的列表 + //Map spSpecialistCount = specialists.stream() + + // .collect(Collectors.groupingBy(ApplyBModeSpecialist::getSpeId,Collectors.counting())); + Map spSpecialistCount = specialists.stream() + .filter(entry -> entry.containsKey("speId")) // 确保每个 Map 都有 "speId" 键 + .map(entry -> (Long) entry.get("speId")) // 提取 speId + .filter(Objects::nonNull) // 过滤掉 null 值 + .collect(Collectors.groupingBy(speId -> speId, Collectors.counting())); + //检查部位会诊数量统计 + Map spSpecialistExaminePartSum = specialists.stream() + .filter(entry -> entry.containsKey("speId") && entry.containsKey("examinePartNum")) // 确保每个 Map 都有 "speId" 和 "examine_part_num" 键 + .filter(entry -> entry.get("speId") != null && entry.get("examinePartNum") != null) // 过滤掉 null 值 + .collect(Collectors.groupingBy( + entry -> (Long) entry.get("speId"), // 按 speId 分组 + Collectors.summingInt(entry -> (Integer) entry.get("examinePartNum")) // 累加每个 speId 对应的 examine_part_num + )); + //统计每个专家的会诊次数 + List userList = userMapper.selectList(userWrapper); + Map totalMap = new HashMap<>(); + Long totalSpCount = 0L; + Long totalpartCount = 0L; + //System.out.println("spSpecialistCount: " + spSpecialistCount); + //System.out.println("spSpecialistExaminePartSum: " + spSpecialistExaminePartSum); + for (User user : userList) { + Map userMap = new HashMap<>(); + Long spCount = spSpecialistCount.get(user.getId()) == null + ? 0L : spSpecialistCount.get(user.getId()); + //System.out.println("2Value from map: " + spSpecialistCount.get(user.getId())); + //System.out.println("Value from map: " + spSpecialistExaminePartSum.get(user.getId())); + Long partCount = spSpecialistExaminePartSum.get(user.getId()) == null + ? 0L : ((long)spSpecialistExaminePartSum.get(user.getId())); + userMap.put("userName",user.getUserName()); + userMap.put("lxCount",spCount); + userMap.put("partCount",partCount);//部位数 + //System.out.println(user.getUserName()+":"+spCount+"部位数:"+natureCount); + specialist.add(userMap); + totalSpCount = totalSpCount + spCount; + totalpartCount = totalpartCount + partCount; + } + //统计专家会诊次数的总数 + totalMap.put("totalLxCount",totalSpCount); + totalMap.put("totalpartCount",totalpartCount); + countList.add(totalMap); + map.put("specialist",specialist); + map.put("countList", countList); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + + } + + + private String accuracy(long num, long total) { + DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(); + //可以设置精确几位小数 + df.setMaximumFractionDigits(1); + //模式 例如四舍五入 + df.setRoundingMode(RoundingMode.HALF_UP); + double accuracyNum = 0.00; + if (total != 0) { + accuracyNum = (double) num / (double) total * 100; + } + return df.format(accuracyNum)+"%"; + } + @Override + public List> selectWorkTotalByTime(String startTime, String endTime,String conditions,String consultationMode,String categoryHospitalId) { + + + List results = applyBModeMapper.selectWorkTotalByTime(startTime + " 00:00:00",endTime + " 23:59:59",conditions,consultationMode,categoryHospitalId); + //特殊字段处理, + List excelvoList = results.stream().peek(result -> { + result.setNegativeAndPositive(convertGender(Long.valueOf(result.getNegativeAndPositive()))); + result.setConsultationMode(convertConsultationMode(result.getConsultationMode())); + result.setConditions(convertChaoshaoMode(result.getConditions())); + + }) + .collect(Collectors.toList()); + //log.info("所有数据"+excelvoList); + //处理重复数据 + List excelvos = handleDuplicate.handleDuplicateRecords(excelvoList); + + List> resultlist = excelvos.stream().map(a -> { + HashMap map = new HashMap<>(); + map.put("hospitalName", a.getHospitalName()); + map.put("consultationTime", a.getConsultationTime()); + map.put("consultationMode", a.getConsultationMode()); + map.put("imagingMethod", a.getImagingMethod()); + map.put("patientName", a.getPatientName()); + map.put("age", a.getAge()+"岁"); + map.put("gender", a.getGender()); + map.put("reportingTime", a.getReportingTime()); + map.put("reviewTime", a.getReviewTime()); + map.put("examinationSite", a.getExaminationSite()); + map.put("siteNumber", a.getSiteNumber()); + map.put("uploadDoctor", a.getUploadDoctor()); + map.put("reportingDoctor", a.getReportingDoctor()); + map.put("negativeAndPositive", a.getNegativeAndPositive()); + String timeStr = a.getDurationOfConsultation(); + double time = (double) Long.parseLong(timeStr) /60000; + String formatTime = String.format("%.2f", time); + String timeResult = formatHoursToHHMM(Double.parseDouble(formatTime)); + map.put("reportContent", a.getReportContent()); + map.put("durationOfConsultation", timeResult); + map.put("reviewedDoctorBegin","向爱清"); + map.put("reportingDoctorBegin","向爱清"); + map.put("esrdNumber", a.getEsrdNumber()); + map.put("conditions",a.getConditions()); + map.put("diagnosisConclusion", " "); + //如果数据库没有的话 + Integer siteNumber = a.getExaminePartNum() != null ? + a.getExaminePartNum() : + BodyPartCounter.countBodyPartCategories(a.getExaminationSite()); + map.put("siteNumber", siteNumber); + + return map; + }).collect(Collectors.toList()); + + + return resultlist; + } + private String convertGender(Long negative) { + return negative == 1 ? "阳" : (negative == 0 ? "阴" : "未知"); + } + + private String convertConsultationMode(String consultationMode) { + return consultationMode.equals("LX") ? "异步会诊" : (consultationMode.equals("YP") ? "椅旁会诊" : "视频会诊"); + } + private String convertChaoshaoMode(String consultationMode) { + return consultationMode.equals("A") ? "B超" : (consultationMode.equals("B") ? "经颅多普勒" : "骨密度"); + } + + public static String formatHoursToHHMM(double hours) { + int hourPart = (int) hours; + int minutes = (int) Math.round((hours - hourPart) * 60); + return hourPart + " 分钟 " + minutes + " 秒"; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java new file mode 100644 index 0000000..a1d27be --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyBModeSpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyBModeSpecialistMapper; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.service.ApplyBModeSpecialistService; + +@Service +public class ApplyBModeSpecialistServiceImpl extends ServiceImpl implements ApplyBModeSpecialistService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java new file mode 100644 index 0000000..bbc8f5a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyCaseImgMapper; +import com.imurs.entity.ApplyCaseImg; +import com.imurs.service.ApplyCaseImgService; + +@Service +public class ApplyCaseImgServiceImpl extends ServiceImpl implements ApplyCaseImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java new file mode 100644 index 0000000..12df9ea --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyCaseServiceImpl.java @@ -0,0 +1,97 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyCaseMapper; +import com.imurs.entity.ApplyCase; +import com.imurs.service.ApplyCaseService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyCaseServiceImpl extends ServiceImpl implements ApplyCaseService{ + + @Autowired + ApplyCaseMapper applyCaseMapper; + @Override + public List export(Map map) { + return applyCaseMapper.export(map); + } + @Override + public List getExport(Map map) { + return applyCaseMapper.getExport(map); + } + @Override + public List arrangeOutExport(Map map) { + return applyCaseMapper.arrangeOutExport(map); + } + @Override + public List arrangeGetExport(Map map) { + return applyCaseMapper.arrangeGetExport(map); + } + + @Override + public Pagetion selectCasePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectCasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectCasePage(map); + pagetion.setList(list); + return pagetion; + } + @Override + public ApplyCase selectCaseById(Long id) { + return applyCaseMapper.selectCaseById(id); + } + @Override + public Pagetion selectAdminCasePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectAdminCasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectAdminCasePage(map); + pagetion.setList(list); + return pagetion; + } + @Override + public int selectUpWayReferralNumer(Map upWayReferralMap) { + return applyCaseMapper.selectUpWayReferralNumer(upWayReferralMap); + } + @Override + public int selectDownWayReferralNumer(Map upWayReferralMap) { + return applyCaseMapper.selectDownWayReferralNumer(upWayReferralMap); + } + + @Override + public Pagetion selectCasePatient(Map map, Integer pageNo, Integer pageSize) { + int count=applyCaseMapper.selectCasePatient(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyCaseMapper.selectCasePatient(map); + pagetion.setList(list); + return pagetion; + } + @Override + public Boolean updateByHis(Map map2) { + // TODO Auto-generated method stub + return applyCaseMapper.updateByHis(map2); + } + @Override + public Map selectPatientById(Map map) { + // 根据ID 查询患者信息 + return applyCaseMapper.selectPatientById(map); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java new file mode 100644 index 0000000..31cb752 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsulationSpecialistServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsulationSpecialistMapper; +import com.imurs.entity.ApplyConsulationSpecialist; +import com.imurs.service.ApplyConsulationSpecialistService; + +@Service +public class ApplyConsulationSpecialistServiceImpl extends ServiceImpl implements ApplyConsulationSpecialistService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java new file mode 100644 index 0000000..22b589a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsultationImgMapper; +import com.imurs.entity.ApplyConsultationImg; +import com.imurs.service.ApplyConsultationImgService; + +@Service +public class ApplyConsultationImgServiceImpl extends ServiceImpl implements ApplyConsultationImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java new file mode 100644 index 0000000..2edd7bb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyConsultationServiceImpl.java @@ -0,0 +1,77 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import com.imurs.util.page.CustomPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyConsultationMapper; +import com.imurs.entity.ApplyConsultation; +import com.imurs.service.ApplyConsultationService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyConsultationServiceImpl extends ServiceImpl implements ApplyConsultationService{ + + @Autowired + ApplyConsultationMapper applyConsultationMapper; + + @Override + public Pagetion selectConByCategory(Map map, Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConByCategory(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConByCategory(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public int selectConsultationNumer(Map downWayReferralMap) { + // TODO Auto-generated method stub + return applyConsultationMapper.selectConsultationNumer(downWayReferralMap); + } + + @Override + public Pagetion selectConPatient(Map map, Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConPatient(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConPatient(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectConsultationSpe(Map map,Integer pageNo, Integer pageSize) { + int count=applyConsultationMapper.selectConsultationSpe(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyConsultationMapper.selectConsultationSpe(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public CustomPage selectConByPage(Map map, Integer pageNo, Integer pageSize){ + + int count = applyConsultationMapper.selectConByPage(map).size(); + Pagetion pagetion = new Pagetion<>(pageNo, pageSize, count); + CustomPage customPage = new CustomPage<>(pageNo, pageSize, count); + map.put("start",pagetion.getStartIndex()); + map.put("end",pageSize); + List list = applyConsultationMapper.selectConByPage(map); + customPage.setRows(list); + return customPage; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java new file mode 100644 index 0000000..71f127b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyDoctorPromoteServiceImpl.java @@ -0,0 +1,39 @@ +package com.imurs.service.impl; + + +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyDoctorPromoteMapper; +import com.imurs.entity.ApplyDoctorPromote; +import com.imurs.service.ApplyDoctorPromoteService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyDoctorPromoteServiceImpl extends ServiceImpl implements ApplyDoctorPromoteService{ + @Autowired + ApplyDoctorPromoteMapper applyDoctorPromoteMapper; + @Override + public int selectrefresherCount(Map refresherNumerMap) { + // TODO Auto-generated method stub + return applyDoctorPromoteMapper.selectrefresherCount(refresherNumerMap); + } + + + + @Override + public Pagetion selectAdminPromote(Map map, Integer pageNo, Integer pageSize) { + int count=applyDoctorPromoteMapper.selectAdminPromote(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyDoctorPromoteMapper.selectAdminPromote(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java new file mode 100644 index 0000000..14a786a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgImgMapper; +import com.imurs.entity.ApplyEcgImg; +import com.imurs.service.ApplyEcgImgService; + +@Service +public class ApplyEcgImgServiceImpl extends ServiceImpl implements ApplyEcgImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java new file mode 100644 index 0000000..e9b2ca6 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgServiceImpl.java @@ -0,0 +1,45 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgMapper; +import com.imurs.entity.ApplyEcg; +import com.imurs.service.ApplyEcgService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyEcgServiceImpl extends ServiceImpl implements ApplyEcgService{ + + @Autowired + ApplyEcgMapper applyEcgMapper; + + @Override + public Pagetion selectEcgPage(Map map, Integer pageNo, Integer pageSize) { + int count=applyEcgMapper.selectEcgPage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyEcgMapper.selectEcgPage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectEcgSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyEcgMapper.selectEcgSpePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyEcgMapper.selectEcgSpePage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java new file mode 100644 index 0000000..e06a797 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyEcgSpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyEcgSpecialistMapper; +import com.imurs.entity.ApplyEcgSpecialist; +import com.imurs.service.ApplyEcgSpecialistService; + +@Service +public class ApplyEcgSpecialistServiceImpl extends ServiceImpl implements ApplyEcgSpecialistService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java new file mode 100644 index 0000000..bb9f9f0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyInformationImgMapper; +import com.imurs.entity.ApplyInformationImg; +import com.imurs.service.ApplyInformationImgService; + +@Service +public class ApplyInformationImgServiceImpl extends ServiceImpl implements ApplyInformationImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java new file mode 100644 index 0000000..3ab64a0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyInformationServiceImpl.java @@ -0,0 +1,52 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import com.imurs.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyInformationMapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.service.ApplyInformationService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyInformationServiceImpl extends ServiceImpl implements ApplyInformationService { + + @Autowired + ApplyInformationMapper applyInformationMapper; + + @Override + public List selectHospitalList(String hospitalName) { + // TODO Auto-generated method stub + return applyInformationMapper.selectHospitalList(hospitalName); + } + + @Override + public List selectInfromationList(Map infromationMap) { + // TODO Auto-generated method stub + return applyInformationMapper.selectInfromationList(infromationMap); + } + + @Override + public boolean updateBatchByIds(List applyInformation) { + return applyInformationMapper.updateByIds(applyInformation); + } + + + @Override + public Pagetion findAifmAdminPage(Map map, Integer pageNo, Integer pageSize) { + int resultCount = applyInformationMapper.findAifmAdminPage(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, resultCount); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list = applyInformationMapper.findAifmAdminPage(map); + pagetion.setList(list); + return pagetion; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java new file mode 100644 index 0000000..0c8bf52 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyLisServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyLisMapper; +import com.imurs.entity.ApplyLis; +import com.imurs.service.ApplyLisService; + +@Service +public class ApplyLisServiceImpl extends ServiceImpl implements ApplyLisService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java new file mode 100644 index 0000000..2d11714 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyFileServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyFileMapper; +import com.imurs.entity.ApplyPathologyFile; +import com.imurs.service.ApplyPathologyFileService; + +@Service +public class ApplyPathologyFileServiceImpl extends ServiceImpl implements ApplyPathologyFileService{ + +} + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java new file mode 100644 index 0000000..e9e2050 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyImgServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyImgMapper; +import com.imurs.entity.ApplyPathologyImg; +import com.imurs.service.ApplyPathologyImgService; + +@Service +public class ApplyPathologyImgServiceImpl extends ServiceImpl implements ApplyPathologyImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java new file mode 100644 index 0000000..f0476c7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologyServiceImpl.java @@ -0,0 +1,45 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologyMapper; +import com.imurs.entity.ApplyPathology; +import com.imurs.service.ApplyPathologyService; +import com.imurs.util.page.Pagetion; + +@Service +public class ApplyPathologyServiceImpl extends ServiceImpl implements ApplyPathologyService{ + + @Autowired + ApplyPathologyMapper applyPathologyMapper; + + @Override + public Pagetion selectAphPage(Map map, Integer pageNo, Integer pageSize) { + int count=applyPathologyMapper.selectAphPage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyPathologyMapper.selectAphPage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public Pagetion selectAphSpePage(Map map, Integer pageNo, Integer pageSize) { + int count=applyPathologyMapper.selectAphSpePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=applyPathologyMapper.selectAphSpePage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java new file mode 100644 index 0000000..65682e9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplyPathologySpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplyPathologySpecialistMapper; +import com.imurs.entity.ApplyPathologySpecialist; +import com.imurs.service.ApplyPathologySpecialistService; + +@Service +public class ApplyPathologySpecialistServiceImpl extends ServiceImpl implements ApplyPathologySpecialistService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java new file mode 100644 index 0000000..eef7001 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ApplySpecialistServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ApplySpecialistMapper; +import com.imurs.entity.ApplySpecialist; +import com.imurs.service.ApplySpecialistService; + +@Service +public class ApplySpecialistServiceImpl extends ServiceImpl implements ApplySpecialistService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java new file mode 100644 index 0000000..6567e68 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeHistoryServiceImpl.java @@ -0,0 +1,46 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.BModeReportMapper; +import com.imurs.dao.BmodelHisotryMapper; +import com.imurs.dao.BmodelSecondMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.BModeHistory; +import com.imurs.entity.BModeReport; +import com.imurs.entity.User; +import com.imurs.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author wang + * @date 2022年02月23日 15:46 + */ +@Service +public class BModeHistoryServiceImpl extends ServiceImpl implements BModeHistoryService { + @Autowired + BModeHistoryService bModeHistoryService; + @Autowired + BmodelHisotryMapper bmodelHisotryMapper; + @Override + public List selectBmodeHis(Map map) { + // TODO Auto-generated method stub + return bmodelHisotryMapper.selectBmodeHis( map); + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java new file mode 100644 index 0000000..18e94e2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BModeReportServiceImpl.java @@ -0,0 +1,227 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.constant.ModelActiveConstant; +import com.imurs.dao.BModeReportMapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyBModeSpecialist; +import com.imurs.entity.BModeReport; +import com.imurs.entity.User; +import com.imurs.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.sql.Time; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author Laier + * @date 2022-11-23 14:14 + */ +@Service +public class BModeReportServiceImpl extends ServiceImpl implements BModeReportService { + @Autowired + ApplyBModeService applyBModeService; + @Autowired + ApplyBModeImgService applyBModeImgService; + @Autowired + ApplyBModeSpecialistService applyBModeSpecialistService; + @Autowired + BModeReportService bModeReportService; + @Autowired + UserService userService; + + /** + * 批量新增超声报告,并修改超声病例状态为待审核报告 + * @param bId 报告所属的病例id + * @param modeReports 报告信息列表 + * @return 返回新增后的报告列表 瞎JB 写,对方成功不成功也不知道,返回已经前端传过来 + * 可能有多份报告,而且每次报告是修改三个表,那只要其中一个表失败,直接此次失败吧。 + * @throws Exception + */ + @Override + @Transactional(rollbackFor = Exception.class) + public List insertModeReportList(Long bId, List modeReports) throws Exception { + ApplyBMode applyBMode = applyBModeService.selectById(bId); + List specialists = applyBModeSpecialistService.selectList(new EntityWrapper() + .eq("b_id", bId)); + if (applyBMode == null) { + return null; + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + // 1.把病例的信息填入报告中,并新增 + for (BModeReport modeReport : modeReports) { + List imageIdList = modeReport.getImageIdList(); + if (!CollectionUtils.isEmpty(imageIdList)) { + String imageIds = StringUtils.join(imageIdList,","); + modeReport.setImageIds(imageIds); + } + if (modeReport.getNature()==1 ){ + ApplyBMode updateNature = new ApplyBMode(); + updateNature.setId(bId); + updateNature.setNature(1); + applyBModeService.updateById(updateNature); + } + Long differenceInMillis=updateTime.getTime() - applyBMode.getApplyDate().getTime(); + // long hours = TimeUnit.MILLISECONDS.toHours(differenceInMillis); + // long minutes = TimeUnit.MILLISECONDS.toMinutes(differenceInMillis) % 60; + //System.out.println("时间"+differenceInMillis); + modeReport.setIntervalTime(differenceInMillis+""); + modeReport.setDiagnosisType(applyBMode.getDiagnosisType()); + modeReport.setDocId(applyBMode.getDocId()); + modeReport.setGroupDate(applyBMode.getGroupDate()); + modeReport.setCategoryHospitalId(applyBMode.getCategoryHospitalId()); + modeReport.setGroupHospitalId(applyBMode.getGroupHospitalId()); + // 状态改为结束报告 + modeReport.setActive(ModelActiveConstant.ACTIVE_CHECKING); + modeReport.setSpeId(specialists.get(0).getSpeId()); + modeReport.setUpdateTime(updateTime); + } + Boolean isBmoReport= bModeReportService.insertBatch(modeReports); + if(!isBmoReport) { + throw new Exception("报告插入失败"); + } + // 2.修改超声病例的会诊状态为结束 + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(bId); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_CHECKING); + Boolean isapplyb= applyBModeService.updateById(updateMode); + if(!isapplyb) { + throw new Exception("超声报告病例修改失败"); + } + // 更新专家表状态为已完成 + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + Boolean isapplybs= applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",modeReports.get(0).getSpeId()) + .eq("b_id",bId)); + if(!isapplybs) { + throw new Exception("更新专家表状态失败"); + } + return modeReports; + } + + /** + * 根据bId查询报告列表 + * @param bId 报告所属病例id + * @return + */ + @Override + public List selectModeReportListByBId(Long bId) { + return bModeReportService.selectList(new EntityWrapper() + .eq("b_id", bId)); + } + + /** + * 根据报告id查询报告详情 + * @param reportId + * @return + */ + @Override + public BModeReport selectModeReportByReportId(Long reportId) { + return bModeReportService.selectOne(new EntityWrapper() + .setSqlSelect("id," + + "examine_part as examinePart," + + "initial," + + "opinion," + + "b_see as bSee," + + "b_hint as bHint," + + "nature," + + "audit_doc as auditDoc," + + "audit_time as auditTime," + + "overall_opinion as overallOpinion," + + "image_ids as imageIds," + + "b_id as bId," + + "spe_id as speId," + + "update_doc as updateDoc," + + "interval_time as intervalTime," + + "update_time as updateTime ") + .eq("id",reportId)); + } + + /** + * 专家审核报告,并修改病例状态 + * @param modeReport + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void checkReportAndChangeModelState(BModeReport modeReport) throws ParseException { + // 如果修改图片则转换下格式list转string + if (!CollectionUtils.isEmpty(modeReport.getImageIdList())) { + String imageIds = StringUtils.join(modeReport.getImageIdList(), ","); + modeReport.setImageIds(imageIds); + } + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + // 1.专家审核报告,并修改报告状态为已审核 + modeReport.setActive(ModelActiveConstant.ACTIVE_FINISH); + modeReport.setUpdateTime(updateTime); + bModeReportService.updateById(modeReport); + // 2.查询同一病例的所有报告,是否全部审核完成 + List reports = bModeReportService.selectList(new EntityWrapper() + .setSqlSelect("active") + .eq("b_id", modeReport.getbId())); + // 把同一病例的所有报告的会诊状态值存入一个数组 + List collect = reports.stream().map(BModeReport::getActive).collect(Collectors.toList()); + // 如果collect里不存在2,则说明报告全部审核完成 + if (!collect.contains(ModelActiveConstant.ACTIVE_CHECKING)) { + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(modeReport.getbId()); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + // 审核完成后新增专家签名 + User user = userService.selectById(modeReport.getSpeId()); + if (user != null) { + updateMode.setSpecialistSignature(user.getSpecialistSignature()); + } + applyBModeService.updateById(updateMode); + applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",modeReport.getSpeId()) + .eq("b_id",modeReport.getbId())); + } + } + + // 专家提交报告流程:直接审核完成 + @Override + public List finishModeReport(Long bId,Long speId,List resultReports) throws ParseException { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date updateTime = dateFormat.parse(dateFormat.format(new Date())); + for (BModeReport report : resultReports) { + report.setActive(ModelActiveConstant.ACTIVE_FINISH); + report.setUpdateTime(updateTime); + } + // 更新每个报告的状态为已完成 + bModeReportService.updateBatchById(resultReports); + ApplyBMode updateMode = new ApplyBMode(); + updateMode.setId(bId); + updateMode.setStatus("70"); + updateMode.setActive(ModelActiveConstant.ACTIVE_FINISH); + // 新增专家签名 + User user = userService.selectById(speId); + if (user != null) { + updateMode.setSpecialistSignature(user.getSpecialistSignature()); + } + ApplyBModeSpecialist specialist = new ApplyBModeSpecialist(); + specialist.setState(70); + // 更新病例状态为已完成,专家签名 + applyBModeService.updateById(updateMode); + // 更新专家表状态为已完成 + applyBModeSpecialistService.update(specialist,new EntityWrapper() + .eq("spe_id",speId) + .eq("b_id",bId)); + return resultReports; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java new file mode 100644 index 0000000..b3201e8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisNextServiceImpl.java @@ -0,0 +1,23 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisNextMapper; +import com.imurs.entity.BdiagnosisNext; +import com.imurs.service.BdiagnosisNextService; + +@Service +public class BdiagnosisNextServiceImpl extends ServiceImpl implements BdiagnosisNextService { + @Autowired + BdiagnosisNextMapper bdiagnosisNextMapper; + @Override + public List selectDiagnosisList(Integer id) { + // TODO Auto-generated method stub + return bdiagnosisNextMapper.selectDiagnosisList(id); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java new file mode 100644 index 0000000..62f5900 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BdiagnosisServiceImpl.java @@ -0,0 +1,12 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisMapper; +import com.imurs.entity.Bdiagnosis; +import com.imurs.service.BdiagnosisService; +@Service +public class BdiagnosisServiceImpl extends ServiceImpl implements BdiagnosisService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java new file mode 100644 index 0000000..af3eec4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodeMachineModelServiceImpl.java @@ -0,0 +1,36 @@ +package com.imurs.service.impl; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BdiagnosisMapper; +import com.imurs.dao.BmodeMachineModelMapper; +import com.imurs.entity.Bdiagnosis; +import com.imurs.entity.BmodeMachineModel; +import com.imurs.service.BmodeMachineModelService; + +@Service +public class BmodeMachineModelServiceImpl extends ServiceImpl implements BmodeMachineModelService { + + @Autowired + private BmodeMachineModelMapper BmodeMachineModelMapper; + + public Map selectMachineModel(){ + Map map = new HashMap(); + EntityWrapper wrapper = new EntityWrapper(); + List selectList = BmodeMachineModelMapper.selectList(wrapper); + map.put("MachineModellist", selectList); + return map; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java new file mode 100644 index 0000000..c6732f3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelFrisServiceImpl.java @@ -0,0 +1,25 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelFrisMapper; +import com.imurs.entity.BmodelFris; +import com.imurs.service.BmodelFrisService; + + + +@Service +public class BmodelFrisServiceImpl extends ServiceImpl implements BmodelFrisService { + @Autowired + BmodelFrisMapper bmodelFrisMapper; + @Override + public List selectBmodelFris(int id) { + // TODO Auto-generated method stub + return bmodelFrisMapper.selectBmodelFris(id); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java new file mode 100644 index 0000000..d170436 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelSecondServiceImpl.java @@ -0,0 +1,25 @@ +package com.imurs.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelSecondMapper; +import com.imurs.entity.BmodelSecondWithBLOBs; +import com.imurs.parameter.Bchildren; +import com.imurs.service.BmodelSecondService; + + + +@Service +public class BmodelSecondServiceImpl extends ServiceImpl implements BmodelSecondService { + @Autowired + BmodelSecondMapper bmodelSecondMapper; + @Override + public List selectbmodelSecond(int id) { + // TODO Auto-generated method stub + return bmodelSecondMapper.selectbmodelSecond(id); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java new file mode 100644 index 0000000..c3fde17 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/BmodelServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.BmodelMapper; +import com.imurs.entity.Bmodel; +import com.imurs.service.BmodelService; + + +@Service +public class BmodelServiceImpl extends ServiceImpl implements BmodelService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java new file mode 100644 index 0000000..27b0598 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/CaseTemplateServiceImpl.java @@ -0,0 +1,20 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.CaseTemplateMapper; +import com.imurs.entity.CaseTemplate; +import com.imurs.service.CaseTemplateService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CaseTemplateServiceImpl extends ServiceImpl implements CaseTemplateService{ + @Override + public List listWithTree() { + + List caseTemplates = baseMapper.selectList(null); + + return caseTemplates; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java new file mode 100644 index 0000000..4608077 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ClinicalGuidelinesServiceImpl.java @@ -0,0 +1,34 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ClinicalGuidelinesMapper; +import com.imurs.entity.ClinicalGuidelines; +import com.imurs.service.ClinicalGuidelinesService; +import com.imurs.util.page.Pagetion; + +@Service +public class ClinicalGuidelinesServiceImpl extends ServiceImpl implements ClinicalGuidelinesService{ + @Autowired + ClinicalGuidelinesMapper clinicalGuidelinesMapper; + + + @Override + public Pagetion selectCgsOrByDocIdPage(Map map, Integer pageNo, Integer pageSize) { + int count=clinicalGuidelinesMapper.selectCgsOrByDocIdPage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=clinicalGuidelinesMapper.selectCgsOrByDocIdPage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java new file mode 100644 index 0000000..13b8ea0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorArrangeServiceImpl.java @@ -0,0 +1,90 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.DoctorArrangeMapper; +import com.imurs.entity.DoctorArrange; +import com.imurs.service.DoctorArrangeService; +import com.imurs.util.page.Pagetion; + +@Service +public class DoctorArrangeServiceImpl extends ServiceImpl + implements DoctorArrangeService { + + @Autowired + DoctorArrangeMapper doctorArrangeMapper; + + @Override + public List selectHonmeShowArrange() { + return doctorArrangeMapper.selectHonmeShowArrange(); + + } + + @Override + public List homeShowArrange(Map map) { + return doctorArrangeMapper.homeShowArrange(map); + } + + @Override + public DoctorArrange selectTotanumberDay(Map map) { + return doctorArrangeMapper.selectTotanumberDay(map); + } + + @Override + public List selectTotaDay(Map map) { + return doctorArrangeMapper.selectTotaDay(map); + } + + @Override + public Pagetion selectByArrangePage(Map map, Integer pageNo, Integer pageSize) { + int count = doctorArrangeMapper.selectByArrangePage(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list = doctorArrangeMapper.selectByArrangePage(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public DoctorArrange selectArrangeByUser(Long id) { + return doctorArrangeMapper.selectArrangeByUser(id); + } + + + + @Override + public int selectdoctorTotaDay(Map map) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectdoctorTotaDay(map); + } + + + @Override + public List selectDoctorArrangeList(Map doctorArrang) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectDoctorArrangeList(doctorArrang); + } + + + @Override + public Map selectAccreditedMedicalNumber(Map map1) { + // TODO Auto-generated method stub + return doctorArrangeMapper.selectAccreditedMedicalNumber(map1); + } + + + @Override + public List selectArrangeByRhId(String receiveHospitalId) { + return doctorArrangeMapper.selectArrangeByRhId(receiveHospitalId); + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java new file mode 100644 index 0000000..e44adff --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/DoctorGroupServiceImpl.java @@ -0,0 +1,26 @@ +package com.imurs.service.impl; + + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.DoctorGroupMapper; +import com.imurs.entity.DoctorGroup; +import com.imurs.service.DoctorGroupService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** +* @author dxy +* @description 针对表【doctor_group】的数据库操作Service实现 +* @createDate 2025-11-13 12:08:54 +*/ +@Service +public class DoctorGroupServiceImpl extends ServiceImpl + implements DoctorGroupService { + + +} + + + + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java new file mode 100644 index 0000000..0a1e82a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/HomePageShowServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.HomePageShowMapper; +import com.imurs.entity.HomePageShow; +import com.imurs.service.HomePageShowService; + +@Service +public class HomePageShowServiceImpl extends ServiceImpl implements HomePageShowService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java new file mode 100644 index 0000000..2183113 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/ImgArrangeServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.ImgArrangeMapper; +import com.imurs.entity.ImgArrange; +import com.imurs.service.ImgArrangeService; + +@Service +public class ImgArrangeServiceImpl extends ServiceImpl implements ImgArrangeService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java new file mode 100644 index 0000000..b395879 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/InstallModelServiceImpl.java @@ -0,0 +1,10 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.InstallModelMapper; +import com.imurs.entity.InstallModel; +import org.springframework.stereotype.Service; + +@Service +public class InstallModelServiceImpl extends ServiceImpl { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LiveServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LiveServiceImpl.java new file mode 100644 index 0000000..7b6b06e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LiveServiceImpl.java @@ -0,0 +1,31 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.LiveMapper; +import com.imurs.entity.Live; +import com.imurs.service.LiveService; +import com.imurs.util.page.Pagetion; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class LiveServiceImpl extends ServiceImpl implements LiveService { + + @Autowired + LiveMapper liveMapper; + + public Pagetion selectLivePage(Map map, Integer pageNo, Integer pageSize){ + + int count=liveMapper.selectLivePage(map).size(); + Pagetion pagetion=new Pagetion<>(pageNo, pageSize, count); + + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=liveMapper.selectLivePage(map); + pagetion.setList(list); + return pagetion; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java new file mode 100644 index 0000000..52467cb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/LoginRecordServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.LoginRecordMapper; +import com.imurs.entity.LoginRecord; +import com.imurs.service.LoginRecordService; + +@Service +public class LoginRecordServiceImpl extends ServiceImpl implements LoginRecordService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientServiceImpl.java new file mode 100644 index 0000000..79fd1a7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientMapper; +import com.imurs.entity.Patient; +import com.imurs.service.PatientService; + +@Service +public class PatientServiceImpl extends ServiceImpl implements PatientService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java new file mode 100644 index 0000000..94c1206 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordImgServiceImpl.java @@ -0,0 +1,14 @@ +package com.imurs.service.impl; + +import com.imurs.dao.PatientUserRecordImgMapper; +import com.imurs.entity.PatientUserRecordImg; +import com.imurs.service.PatientUserRecordImgService; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; + +@Service +public class PatientUserRecordImgServiceImpl extends ServiceImpl implements PatientUserRecordImgService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java new file mode 100644 index 0000000..b212076 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserRecordServiceImpl.java @@ -0,0 +1,35 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientUserRecordMapper; +import com.imurs.entity.PatientUserRecord; +import com.imurs.service.PatientUserRecordService; +import com.imurs.util.page.Pagetion; + +@Service +public class PatientUserRecordServiceImpl extends ServiceImpl implements PatientUserRecordService{ + + @Autowired + PatientUserRecordMapper patientUserRecordMapper; + + + @Override + public Pagetion selectRecordPtUserPage(Map map,Integer pageNo,Integer pageSize) { + int count=patientUserRecordMapper.selectRecordPtUserPage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=patientUserRecordMapper.selectRecordPtUserPage(map); + pagetion.setList(list); + return pagetion; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java new file mode 100644 index 0000000..e067350 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/PatientUserServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.PatientUserMapper; +import com.imurs.entity.PatientUser; +import com.imurs.service.PatientUserService; + +@Service +public class PatientUserServiceImpl extends ServiceImpl implements PatientUserService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/RoleServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..6618949 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/RoleServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.RoleMapper; +import com.imurs.entity.Role; +import com.imurs.service.RoleService; + +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SectionServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SectionServiceImpl.java new file mode 100644 index 0000000..e4e9b9c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SectionServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.SectionMapper; +import com.imurs.entity.Section; +import com.imurs.service.SectionService; + +@Service +public class SectionServiceImpl extends ServiceImpl implements SectionService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..3386f13 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.SysMenuMapper; +import com.imurs.entity.SysMenu; +import com.imurs.service.SysMenuService; + +@Service +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java new file mode 100644 index 0000000..03d95b5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalClinicalGuidelinesServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalClinicalGuidelinesMapper; +import com.imurs.entity.TotalClinicalGuidelines; +import com.imurs.service.TotalClinicalGuidelinesService; + +@Service +public class TotalClinicalGuidelinesServiceImpl extends ServiceImpl implements TotalClinicalGuidelinesService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java new file mode 100644 index 0000000..aa2db3c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalInformationServiceImpl.java @@ -0,0 +1,31 @@ +package com.imurs.service.impl; + + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalInformationMapper; +import com.imurs.entity.TotalInformation; +import com.imurs.service.TotalInformationService; + +@Service +public class TotalInformationServiceImpl extends ServiceImpl implements TotalInformationService{ + + @Autowired + TotalInformationMapper totalInformationMapper; + @Override + public List selectTotalInformationAll(Map map) { + return totalInformationMapper.selectTotalInformationAll(map); + } + + @Override + public TotalInformation totaTotalInformation(Map map) { + return totalInformationMapper.totaTotalInformation(map); + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java new file mode 100644 index 0000000..c2c4aea --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TotalTrainingServiceImpl.java @@ -0,0 +1,32 @@ +package com.imurs.service.impl; + + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TotalTrainingMapper; +import com.imurs.entity.TotalTraining; +import com.imurs.service.TotalTrainingService; + +@Service +public class TotalTrainingServiceImpl extends ServiceImpl implements TotalTrainingService{ + @Autowired + TotalTrainingMapper totalTrainingMapper; + + + @Override + public TotalTraining selectTotanNumberTraining(Map map) { + return totalTrainingMapper.selectTotanNumberTraining(map); + } + + + @Override + public Map selectLectureTrainingAndNember(Map map2) { + // TODO Auto-generated method stub + return totalTrainingMapper.selectLectureTrainingAndNember(map2); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java new file mode 100644 index 0000000..0b1618c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingOpinionServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingOpinionMapper; +import com.imurs.entity.TrainingOpinion; +import com.imurs.service.TrainingOpinionService; + +@Service +public class TrainingOpinionServiceImpl extends ServiceImpl implements TrainingOpinionService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java new file mode 100644 index 0000000..85ce5a9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingPlanServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingPlanMapper; +import com.imurs.entity.TrainingPlan; +import com.imurs.service.TrainingPlanService; + +@Service +public class TrainingPlanServiceImpl extends ServiceImpl implements TrainingPlanService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java new file mode 100644 index 0000000..9973847 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingRecordServiceImpl.java @@ -0,0 +1,38 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingRecordMapper; +import com.imurs.entity.TrainingRecord; +import com.imurs.service.TrainingRecordService; +import com.imurs.util.page.Pagetion; + +@Service +public class TrainingRecordServiceImpl extends ServiceImpl implements TrainingRecordService{ + + @Autowired + TrainingRecordMapper trainingRecord; + + @Override + public Pagetion selectAdminRecord(Map map, Integer pageNo, Integer pageSize) { + int resultCount=trainingRecord.selectAdminRecord(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, resultCount); + + map.put("pageNo", pagetion.getStartIndex()); + map.put("pageSize",pageSize); + List list=trainingRecord.selectAdminRecord(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public TrainingRecord selectTrainingRecordById(Long id) { + return trainingRecord.selectTrainingRecordById(id); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java new file mode 100644 index 0000000..a7b65c1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/TrainingServiceImpl.java @@ -0,0 +1,47 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingMapper; +import com.imurs.entity.Training; +import com.imurs.service.TrainingService; +import com.imurs.util.page.Pagetion; + +@Service +public class TrainingServiceImpl extends ServiceImpl implements TrainingService{ + @Autowired + private TrainingMapper trainingMapper; + + + @Override + public List selectTraining(Map map) { + return trainingMapper.selectTraining(map); + } + + + @Override + public int selectTotalTopicNumber(Map map) { + return trainingMapper.selectTotalTopicNumber(map); + } + + + @Override + public Pagetion selectBasePage(Map map, Integer pageNo, Integer pageSize) { + int count=trainingMapper.selectBasePage(map).size(); + Pagetion pagetion=new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("start", pagetion.getStartIndex()); + map.put("end", pageSize); + List list=trainingMapper.selectBasePage(map); + pagetion.setList(list); + return pagetion; + + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/UserServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..e1c4cb2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/UserServiceImpl.java @@ -0,0 +1,54 @@ +package com.imurs.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.UserMapper; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import com.imurs.util.page.Pagetion; + +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + UserMapper userMapper; + + @Override + public Pagetion selectUserPageByDoc(Map map, Integer pageNo, Integer pageSize) { + int count = userMapper.selectUserPageByDoc(map).size(); + Pagetion pagetion = new Pagetion(pageNo, pageSize, count); + + // 分页 + map.put("pageNo", pagetion.getStartIndex()); + map.put("pageSize", pageSize); + List list = userMapper.selectUserPageByDoc(map); + pagetion.setList(list); + return pagetion; + } + + @Override + public User selectUserByUid(Long uid) { + return userMapper.selectUserByUid(uid); + } + + @Override + public Map selectByappuserID(Long id) { + return userMapper.selectByappuserID(id); + } + + @Override + public User selectUserByPhone(String phone) { + return userMapper.selectUserByPhone(phone); + } + + @Override + public boolean updateBatchByIds(List users) { + return userMapper.updateByIds(users); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java new file mode 100644 index 0000000..ad33477 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/VideoRecordServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.VideoRecordMapper; +import com.imurs.entity.VideoRecord; +import com.imurs.service.VideoRecordService; + +@Service +public class VideoRecordServiceImpl extends ServiceImpl implements VideoRecordService { + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/WebLogImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/WebLogImpl.java new file mode 100644 index 0000000..c298ab6 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/WebLogImpl.java @@ -0,0 +1,11 @@ +package com.imurs.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.WebLogMapper; +import com.imurs.entity.WebLog; +import com.imurs.service.WebLogService; +import org.springframework.stereotype.Service; + +@Service +public class WebLogImpl extends ServiceImpl implements WebLogService { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java new file mode 100644 index 0000000..d410d90 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/service/impl/trainingFlowerServiceImpl.java @@ -0,0 +1,13 @@ +package com.imurs.service.impl; + +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.imurs.dao.TrainingFlowerMapper; +import com.imurs.entity.TrainingFlower; +import com.imurs.service.TrainingFlowerService; + +@Service +public class trainingFlowerServiceImpl extends ServiceImpl implements TrainingFlowerService{ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java new file mode 100644 index 0000000..681341c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/CORSAuthenticationFilter.java @@ -0,0 +1,64 @@ +package com.imurs.shiro; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; + +import com.alibaba.fastjson.JSON; + +/** + * @author dxy + * 自定义拦截未登录请求返回1002 + */ +public class CORSAuthenticationFilter extends FormAuthenticationFilter { + + + public CORSAuthenticationFilter() { + super(); + } + + @Override + public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + //Always return true if the request's method is OPTIONS + if (request instanceof HttpServletRequest) { + if ("GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod()) || + "POST".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) { + return true; + } + } + return super.isAccessAllowed(request, response, mappedValue); + // 部署到线上用下面的语句 +// return request instanceof HttpServletRequest && ((HttpServletRequest)request).getMethod().toUpperCase().equals("OPTIONS") ? true : super.isAccessAllowed(request, response, mappedValue); + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + HttpServletResponse res = (HttpServletResponse)response; + //跨域的header设置 +// response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin")); +// response.setHeader("Access-Control-Allow-Methods", request.getMethod()); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", +// request.getHeader("Access-Control-Request-Headers")); +// //防止乱码,适用于传输JSON数据 +// response.setHeader("Content-Type","application/json;charset=UTF-8"); +// response.setStatus(HttpStatus.OK.value()); + res.setHeader("Access-Control-Allow-Origin",((HttpServletRequest) request).getHeader("Origin") ); + res.setHeader("Access-Control-Allow-Methods", ((HttpServletRequest) request).getMethod()); + res.setStatus(HttpServletResponse.SC_OK); + res.setCharacterEncoding("UTF-8"); + PrintWriter writer = res.getWriter(); + Map map= new HashMap<>(); + map.put("msg", "1002"); + writer.write(JSON.toJSONString(map)); + writer.close(); + return false; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/JedisClientSingle.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/JedisClientSingle.java new file mode 100644 index 0000000..78a1124 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/JedisClientSingle.java @@ -0,0 +1,178 @@ +/* package com.imurs.shiro; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import redis.clients.jedis.Client; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.util.Slowlog; + +@Component +public class JedisClientSingle { + + @Autowired + JedisPool jedisPool; + + // 获取redis 服务器信息 + public String getRedisInfo() { + Jedis jedis = null; + try { + // 连接本地的 Redis 服务 + jedis = jedisPool.getResource(); // 调用资源 + Client client = jedis.getClient(); + client.info(); + String info = client.getBulkReply(); + return info; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取日志列表 + public List getLogs(long entries) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + List logList = jedis.slowlogGet(entries); + return logList; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取日志条数 + public Long getLogsLen() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + long logLen = jedis.slowlogLen(); + return logLen; + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 清空日志 + public String logEmpty() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.slowlogReset(); + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 获取占用内存大小 + public Long dbSize() { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + // TODO 配置redis服务信息 + Client client = jedis.getClient(); + client.dbSize(); + return client.getIntegerReply(); + } finally { + // 返还到连接池 + jedis.close(); + } + } + + // 删除redis缓存 + public boolean delete(String key) { + Jedis jedis = null; + try { + // 连接本地的 Redis 服务 + jedis = jedisPool.getResource(); // 调用资源 + if (jedis.exists(key)) { + if (jedis.del(key) == 1) { + System.out.println("删除数据成功"); + return true; + } else { + System.out.println("删除数据失败"); + return false; + } + } else { + System.out.println(key + "不存在"); + return false; + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + jedis.close(); + } + return false; + } + + // 设置超时时间 + public Long expire(String key, int seconds) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.expire(key, seconds); + jedis.close(); + return result; + } + + // 设置缓存 + public String set(String key, String value) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.set(key, value); + jedis.close(); + return result; + } + + // 获取缓存 + public String get(String key) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.get(key); + jedis.close(); + return result; + } + + // 判断是否存在缓存 + public Boolean exists(String key) { + Jedis jedis = jedisPool.getResource(); + Boolean result = jedis.exists(key); + jedis.close(); + return result; + } + + // 设置hash field为指定值,如果key不存在,则先创建 + public Long hset(String key, String field, String value) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.hset(key, field, value); + jedis.close(); + return result; + } + + // 获取指定的hash field + public String hget(String key, String field) { + Jedis jedis = jedisPool.getResource(); + String result = jedis.hget(key, field); + jedis.close(); + return result; + } + + // 删除指定hash的field + public Long hdel(String key, String... field) { + Jedis jedis = jedisPool.getResource(); + Long result = jedis.hdel(key, field); + jedis.close(); + return result; + } + + // 测试指定field在hash中是否存在 + public Boolean hexists(String key, String field) { + Jedis jedis = jedisPool.getResource(); + Boolean result = jedis.hexists(key, field); + jedis.close(); + return result; + } +} +*/ \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java new file mode 100644 index 0000000..01e65ee --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/KickoutSessionControlFilter.java @@ -0,0 +1,149 @@ +package com.imurs.shiro; + + +import java.io.Serializable; +import java.util.Deque; +import java.util.LinkedList; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + + +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; + +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.User; + +/** + * @author: WangSaiChao + * @date: 2018/5/23 + * @description: shiro 自定义filter 实现 并发登录控制 + */ +public class KickoutSessionControlFilter extends AccessControlFilter { + + /** 踢出后到的地址 */ + private String kickoutUrl; + + /** 踢出之前登录的/之后登录的用户 默认踢出之前登录的用户 */ + private boolean kickoutAfter = false; + + /** 同一个帐号最大会话数 默认1 */ + private int maxSession = 1; + private SessionManager sessionManager; + private Cache> cache; + + public void setKickoutUrl(String kickoutUrl) { + this.kickoutUrl = kickoutUrl; + } + + public void setKickoutAfter(boolean kickoutAfter) { + this.kickoutAfter = kickoutAfter; + } + + public void setMaxSession(int maxSession) { + this.maxSession = maxSession; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + public void setCacheManager(CacheManager cacheManager) { + this.cache = cacheManager.getCache("shiro-activeSessionCache"); + } + + /** + * 是否允许访问,返回true表示允许 + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) + throws Exception { + return false; + } + + /** + * 表示访问拒绝时是否自己处理,如果返回true表示自己不处理且继续拦截器链执行,返回false表示自己已经处理了(比如重定向到另一个页面)。 + */ + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + + System.out.println("================并发登录控制=================="); + Subject subject = getSubject(request, response); + if (!subject.isAuthenticated() && !subject.isRemembered()) { + // 如果没有登录,直接进行之后的流程 + return true; + } + + Session session = subject.getSession(); + // 这里获取的User是实体 因为我在 自定义ShiroRealm中的doGetAuthenticationInfo方法中 + // new SimpleAuthenticationInfo(user, password, getName()); 传的是 User实体 + // 所以这里拿到的也是实体,如果传的是userName 这里拿到的就是userName + String username=""; + if (subject.getPrincipal() != null) { + if (subject.getPrincipal().getClass().getName().equals("com.imurs.entity.ApplyInformation")) { + username=((ApplyInformation) subject.getPrincipal()).getAccount(); + }else{ + username=((User) subject.getPrincipal()).getPhone(); + } + } + Serializable sessionId = session.getId(); + + //ifDiffSystem不为空表示为超声系统登录,重新给username赋值用来区分两套系统以免互踢 + String ifDiffSystem = (String)session.getAttribute("ifDiffSystem"); + String token = ifDiffSystem == null ? username : (username + ifDiffSystem); + System.out.println("token===================>" + token); + // 初始化用户的队列放到缓存里 + Deque deque = cache.get(token); + if (deque == null) { + deque = new LinkedList(); + } + + // 如果队列里没有此sessionId,且用户没有被踢出;放入队列 + if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) { + deque.push(sessionId); + cache.put(token, deque); + } + + // 如果队列里的sessionId数超出最大会话数,开始踢人 + while (deque.size() > maxSession) { + Serializable kickoutSessionId = null; + if (kickoutAfter) { // 如果踢出后者 + kickoutSessionId = deque.removeFirst(); + System.out.println("------->踢出后者"); + } else { // 否则踢出前者 + kickoutSessionId = deque.removeLast(); + System.out.println("------->踢出前者"); + } + //踢出后更新缓存 + cache.put(token,deque); + try { + Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); + if (kickoutSession != null) { + // 设置会话的kickout属性表示踢出了 + kickoutSession.setAttribute("kickout", true); + } + } catch (Exception e) {// ignore exception + e.printStackTrace(); + } + } + if ( session.getAttribute("kickout") != null + && (Boolean) session.getAttribute("kickout") ) { + // 会话被踢出了 + try { + subject.logout(); + } catch (Exception e) { + e.printStackTrace(); + } + saveRequest(request); + WebUtils.issueRedirect(request, response, kickoutUrl); + return false; + } + return true; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/LoginShiroController.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/LoginShiroController.java new file mode 100644 index 0000000..ec03a79 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/LoginShiroController.java @@ -0,0 +1,424 @@ +package com.imurs.shiro; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.crypto.BadPaddingException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import com.imurs.util.IpCacheManager; +import com.imurs.util.MsgCode; +import com.imurs.util.RSAUtil; +import com.imurs.util.rateLimiter.RateLimiterAspect; +import com.imurs.util.weblog.HttpContextUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.imurs.entity.ApplyBMode; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.LoginRecord; +import com.imurs.entity.PatientUser; +import com.imurs.entity.SysMenu; +import com.imurs.entity.User; +import com.imurs.parameter.Children; +import com.imurs.parameter.Items; +import com.imurs.service.ApplyBModeService; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.LoginRecordService; +import com.imurs.service.SysMenuService; +import com.imurs.service.UserService; +import com.imurs.util.MD5; + +@RestController +@RequestMapping("shiro") +public class LoginShiroController { + + @Autowired + SysMenuService sysMenuService; + @Autowired + UserService userService; + @Autowired + ApplyInformationService applyInformationService; + @Autowired + LoginRecordService loginRecordService; + @Autowired + ApplyBModeService applyBModeService; + private static String privateKey = MsgCode.privateKeyString; + + @RequestMapping("/login") + public String login() { + return "login"; + } + + + @RequestMapping({"/loginUser"}) + @RateLimiterAspect + public Map loginUser(String phone, String password, String rid, HttpSession session, HttpServletRequest request, String ifDiffSystem,String sign) throws AuthenticationException { + Map map = new HashMap<>(); + try { + String ip = "loginUser" + HttpContextUtil.getIpAddress(); + + if (IpCacheManager.countIp(ip, 50)) { + String newpassword = RSAUtil.decrypt(password, privateKey); + + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(phone, newpassword, rid); + Subject subject = SecurityUtils.getSubject(); + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + subject.login((AuthenticationToken)usernamePasswordToken); + User user = (User)subject.getPrincipal(); + user.setLastTime(format.format(new Date())); + user.setLoginNumber(Integer.valueOf(user.getLoginNumber().intValue() + 1)); + String name = user.getUserName(); + if (name != null) + session.setAttribute("name", name); + if (ifDiffSystem != null) + session.setAttribute("ifDiffSystem", ifDiffSystem); + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(user.getId())); + loginRecord.setLoginName(user.getUserName()); + loginRecord.setRid(String.valueOf(user.getRid())); + addLoginRecord(loginRecord, request); + + this.userService.updateById(user); + map.put("user", user); + map.put("msg", "1"); + map.put("items", userMenu(user.getRpId()).get("items")); + } else { + map.put("msg", "13"); + } + } catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + System.out.println("e = " + e.getMessage()); + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (BadPaddingException e) { + map.put("msg", "密码错误"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + @RateLimiterAspect + @RequestMapping({"/loginHospital"}) + public Map loginHospital(String hospitalName, String password, String rid, HttpSession session, HttpServletRequest request, String ifDiffSystem) throws Exception { + Map map = new HashMap<>(); + String decrypt = RSAUtil.decrypt(password, privateKey); + System.out.println("hospitalName = " + hospitalName); + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(hospitalName, decrypt, rid); + Subject subject = SecurityUtils.getSubject(); + try { + String ip = "loginHospital" + HttpContextUtil.getIpAddress(); + if (IpCacheManager.countIp(ip, 50)) { + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + subject.login((AuthenticationToken)usernamePasswordToken); + ApplyInformation infor = (ApplyInformation)subject.getPrincipal(); + String className2 = subject.getPrincipal().getClass().getName(); + String name = infor.getHospitalName(); + if (name != null) + session.setAttribute("name", name); + if (ifDiffSystem != null) + session.setAttribute("ifDiffSystem", ifDiffSystem); + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(infor.getId())); + loginRecord.setLoginName(infor.getHospitalName()); + loginRecord.setRid(String.valueOf(infor.getRid())); + addLoginRecord(loginRecord, request); + session.setAttribute("infor", infor.getAccount()); + map.put("msg", "1"); + map.put("infor", infor); + map.put("items", userMenu(infor.getRpId()).get("items")); + } else { + map.put("msg", "13"); + } + } catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } + + + + /** + * 患者登录 + * @param + * @param password + * @param + * @param session + * @param request + * @return + * @throws AuthenticationException + */ + @RequestMapping("/loginPtUser") + public Map loginPtUser(String account, String password,HttpSession session, + HttpServletRequest request) throws AuthenticationException { + Map map = new HashMap(); + try { + + UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(account, password,"20"); + Subject subject = SecurityUtils.getSubject(); + + // timeout:-1000ms 永不超时 + SecurityUtils.getSubject().getSession().setTimeout(-1000L); + Session session2 = SecurityUtils.getSubject().getSession(); + + subject.login(usernamePasswordToken); // 完成登录 + PatientUser ptUser = (PatientUser) subject.getPrincipal(); + + //把登录用户的名称放入session + String name = ptUser.getPtName(); + if (name != null) { + session.setAttribute("name",name); + } + + //获取登录ip登录者姓名id 角色 + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setLoginId(String.valueOf(ptUser.getId())); + loginRecord.setLoginName(ptUser.getPtName()); + loginRecord.setRid("20"); + addLoginRecord(loginRecord, request); + + map.put("ptUser", ptUser); + map.put("msg", "1"); + }catch (UnknownAccountException e) { + map.put("msg", "12"); + } catch (IncorrectCredentialsException e) { + map.put("msg", "2"); + } catch (LockedAccountException e) { + map.put("msg", "8"); + } catch (AuthenticationException e) { + map.put("msg", "6"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + + } + + /** + * 医生忘记密码 + */ + @RequestMapping("updateUserPassword") + public Map updateUserPassword(User user){ + Map map = new HashMap<>(); + EntityWrapper wrapper= new EntityWrapper<>(); + wrapper.eq("phone", user.getPhone()); + try { + //9.16修改 + String password = RSAUtil.decrypt(user.getPassword(), privateKey); + User user1 = userService.selectOne(wrapper); + if (user1 != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + user.setPassword(passwordEncoder.encode(password)); + boolean result=userService.update(user, wrapper); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg","3"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + /** + * 医院忘记密码 + */ + @RequestMapping("updateHospitalPassword") + public Map updateHospitalPassword(ApplyInformation infor){ + Map map = new HashMap(); + EntityWrapper wrapper=new EntityWrapper(); + wrapper.eq("dean_phone", infor.getDeanPhone()); + try { + //9.16修改 + String password = RSAUtil.decrypt(infor.getPassword(), privateKey); + ApplyInformation applyInformation = applyInformationService.selectOne(wrapper); + if (applyInformation != null) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + infor.setPassword(passwordEncoder.encode(password)); + boolean result = applyInformationService.update(infor, wrapper); + map.put("msg", result ? "1" : "2"); + } else { + map.put("msg","3"); + } + } catch (Exception e) { + map.put("msg", "4"); + } + return map; + } + + + @RequestMapping("/logout") + public Map logout(HttpSession session) { + Map map = new HashMap(); + Subject subject = SecurityUtils.getSubject(); + String name=(String) session.getAttribute("name"); + System.out.println("退出的user"+name); + + + ApplyBMode applyBMode2 = new ApplyBMode(); + applyBMode2.setActive(5);; + EntityWrapper wrapper4 = new EntityWrapper(); + wrapper4.eq("login_doc", name).eq("status", "40"); + applyBModeService.update(applyBMode2, wrapper4); + subject.logout(); + map.put("msg", "1"); + //session.removeAttribute("user"); + return map; + } + + @RequestMapping(value = "/unauth") + public Map unauth() { + Map map = new HashMap(); + map.put("msg", "10"); + return map; + } + + @RequestMapping(value = "/error") + public Map error() { + Map map = new HashMap(); + map.put("msg", "10001"); + return map; + } + + + + /** + * 查询当前登录的用户所拥有的菜单权限 + * @return + */ + public Map userMenu(String rpId){ + Map map=new HashMap(); + String[] str=null; + EntityWrapper wrapper=new EntityWrapper(); + List smList=new ArrayList(); + List items=new ArrayList(); + try { + if(StringUtils.isNotEmpty(rpId)){ + str=rpId.split(","); + for (int i = 0; i < str.length; i++) { + if(str.length-i==1){ + wrapper.eq("id", str[i]).eq("menu_state", "1"); + }else{ + wrapper.eq("id", str[i]).eq("menu_state", "1").or(); + } + } + smList=sysMenuService.selectList(wrapper.orderBy("id")); + if(!smList.isEmpty()){ + List tableNames=smList.stream().map(SysMenu::getMenuStair).distinct().collect(Collectors.toList()); + //将数据按照指定格式封装 + //分组查询 + Map> groupBy = smList.stream().collect(Collectors.groupingBy(SysMenu::getMenuStair)); + for (String str2 : tableNames) { + List childrens=new ArrayList(); + smList=groupBy.get(str2); + Items items2=new Items(); + for (SysMenu s:smList) { + Children c=new Children(); + c.setName(s.getMenuVfp()); + c.setPath(s.getMenuUrl()); + childrens.add(c); + items2.setIcon(s.getMenuImage()); + items2.setChildren(childrens); + c=null; + } + items2.setName(str2); + items.add(items2); + items2=null; + } + map.put("items", items); + }else{ + map.put("items", "3"); + } + }else{ + map.put("items", "9"); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("items", "2"); + } + return map; + } + + /** + * 新增登录记录 + * @param loginRecord + * @return + */ + //@RequestMapping(value="addLoginRecord") + public Map addLoginRecord(LoginRecord loginRecord,HttpServletRequest request) throws Exception { + Map map=new HashMap(); + + try { + /** + * 获取访问用户的客户端IP(适用于公网与局域网). + */ + if (request == null) { + throw (new Exception("getIpAddr method HttpServletRequest Object is null")); + } + String ipString = request.getHeader("x-forwarded-for"); + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getHeader("WL-Proxy-Client-IP"); + } + if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) { + ipString = request.getRemoteAddr(); + } + + // 多个路由时,取第一个非unknown的ip + final String[] arr = ipString.split(","); + for (final String str : arr) { + if (!"unknown".equalsIgnoreCase(str)) { + ipString = str; + break; + } + } + //获取登录ip + loginRecord.setIp(ipString); + boolean result=loginRecordService.insert(loginRecord); + map.put("msg", result==true?"1":"2"); + } catch (Exception e) { + e.printStackTrace(); + map.put("msg", "4"); + } + return map; + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java new file mode 100644 index 0000000..3a11d0d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyCredentialsMatcher.java @@ -0,0 +1,28 @@ +package com.imurs.shiro; + +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.credential.SimpleCredentialsMatcher; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +/** + * @author wang + * @date 2021年08月05日 10:27 + * 自定义shiro的密码验证,使用spring的加密,原理是md5加盐 + */ +public class MyCredentialsMatcher extends SimpleCredentialsMatcher { + + @Override + public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { + // 要验证的原密码 + char[] check = (char[])getCredentials(token); + String tokenCredentials = String.valueOf(check); + // 数据库的加密密码 + String accountCredentials = (String)getCredentials(info); + // 使用spring的加盐密码来验证 + BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); + // BCryptPasswordEncoder会比对原密码和加盐加密后的密码 + return bCryptPasswordEncoder.matches(tokenCredentials, accountCredentials); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyExceptionHandler.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyExceptionHandler.java new file mode 100644 index 0000000..2801092 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyExceptionHandler.java @@ -0,0 +1,39 @@ +//package com.imurs.shiro; +// +// +//import com.alibaba.fastjson.support.spring.FastJsonJsonView; +//import org.apache.shiro.authz.UnauthenticatedException; +//import org.apache.shiro.authz.UnauthorizedException; +//import org.springframework.web.servlet.HandlerExceptionResolver; +//import org.springframework.web.servlet.ModelAndView; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * Created by Administrator on 2017/12/11. +// * 全局异常处理 +// */ +//public class MyExceptionHandler implements HandlerExceptionResolver { +// +// public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) { +// ModelAndView mv = new ModelAndView(); +// FastJsonJsonView view = new FastJsonJsonView(); +// Map attributes = new HashMap(); +// if (ex instanceof UnauthenticatedException) { +// attributes.put("code", "1000001"); +// attributes.put("msg", "token错误"); +// } else if (ex instanceof UnauthorizedException) { +// attributes.put("code", "1000002"); +// attributes.put("msg", "用户无权限"); +// } else { +// attributes.put("code", "1000003"); +// attributes.put("msg", ex.getMessage()); +// } +// +// view.setAttributesMap(attributes); +// mv.setView(view); +// return mv; +// } +//} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MySessionManager.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MySessionManager.java new file mode 100644 index 0000000..db85ef8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MySessionManager.java @@ -0,0 +1,39 @@ +package com.imurs.shiro; + +import org.apache.shiro.web.servlet.ShiroHttpServletRequest; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.apache.shiro.web.util.WebUtils; +import org.springframework.util.StringUtils; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.Serializable; + +/** + * Created by Administrator on 2017/12/11. + * 自定义sessionId获取 + */ +public class MySessionManager extends DefaultWebSessionManager { + + private static final String AUTHORIZATION = "Authorization"; + + private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; + + public MySessionManager() { + super(); + } + + @Override + protected Serializable getSessionId(ServletRequest request, ServletResponse response) { + String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION); + //如果请求头中有 Authorization 则其值为sessionId + if (!StringUtils.isEmpty(id)) { + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE); + return id; + } else { + //否则按默认规则从cookie取sessionId + return super.getSessionId(request, response); + } + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyShiroRealm.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyShiroRealm.java new file mode 100644 index 0000000..eb064de --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/MyShiroRealm.java @@ -0,0 +1,102 @@ +package com.imurs.shiro; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; +import com.imurs.entity.ApplyInformation; +import com.imurs.entity.PatientUser; +import com.imurs.entity.User; +import com.imurs.service.ApplyInformationService; +import com.imurs.service.PatientUserService; +import com.imurs.service.UserService; +import com.imurs.shiro.MyShiroRealm; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Resource; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.util.ByteSource; +import org.springframework.beans.factory.annotation.Autowired; + +public class MyShiroRealm extends AuthorizingRealm { + @Resource + UserService userService; + + @Resource + ApplyInformationService applyInformationService; + + @Autowired + PatientUserService patientUserService; + + protected final Map sessionMap = new HashMap<>(); + + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + UsernamePasswordToken utoken = (UsernamePasswordToken) token; + if (StringUtils.isNotEmpty(utoken.getHost()) + && java.util.Arrays.asList("1", "2", "3", "6", "7").contains(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("contact_phone", utoken.getUsername()); + User user = (User) this.userService.selectOne((Wrapper) wrapper); + if (user != null) { + if (user.getState().intValue() == 2) + throw new LockedAccountException(); + ApplyInformation infor = (ApplyInformation) this.applyInformationService.selectById(user.getHospitalId()); + if (infor != null) + user.setHospitalName(infor.getHospitalName()); + return (AuthenticationInfo) new SimpleAuthenticationInfo(user, user + .getPassword(), + + getClass().getName()); + } + } else if (StringUtils.isNotEmpty(utoken.getHost()) && "0".equals(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("hospital_name", utoken.getUsername()); + ApplyInformation infor = (ApplyInformation) this.applyInformationService.selectOne((Wrapper) wrapper); + if (infor != null) { + if (infor.getState().intValue() == 2) + throw new LockedAccountException(); + if (infor.getRid().longValue() == 9L && !utoken.getHost().equals(String.valueOf(infor.getRid()))) + throw new UnknownAccountException(); + if ((infor.getRid().longValue() != 1L && utoken.getHost().equals("1")) + || (infor.getRid().longValue() != 9L && utoken.getHost().equals("9"))) { + System.out.println("================================================================"); + System.out.println(" infor.rid= " + infor.getRid() + "token.rid=" + utoken.getHost()); + throw new UnknownAccountException(); + } + return (AuthenticationInfo) new SimpleAuthenticationInfo(infor, infor + .getPassword(), + + getClass().getName()); + } + } else if (StringUtils.isNotEmpty(utoken.getHost()) && "20".equals(utoken.getHost())) { + EntityWrapper wrapper = new EntityWrapper(); + wrapper.eq("account", utoken.getUsername()); + PatientUser ptUser = (PatientUser) this.patientUserService.selectOne((Wrapper) wrapper); + if (ptUser != null) { + if (ptUser.getState().intValue() == 2) + throw new LockedAccountException(); + return (AuthenticationInfo) new SimpleAuthenticationInfo(ptUser, ptUser + .getPassword(), + + getClass().getName()); + } + } + return null; + } + + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { + User user = (User) principal.fromRealm(getClass().getName()).iterator().next(); + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addStringPermission(user.getRpId()); + return (AuthorizationInfo) info; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroConfig.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroConfig.java new file mode 100644 index 0000000..d582c9f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroConfig.java @@ -0,0 +1,234 @@ +package com.imurs.shiro; + +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.io.ResourceUtils; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + + +import net.sf.ehcache.CacheManager; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created by Administrator on 2017/12/11. + */ +@Configuration +public class ShiroConfig { + + + + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + System.out.println("shiro启动成功!!"); + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + shiroFilterFactoryBean.setSecurityManager(securityManager); + + //自定义拦截器限制并发人数 + LinkedHashMap filtersMap = new LinkedHashMap<>(); + //限制同一帐号同时在线的个数 + filtersMap.put("kickout", kickoutSessionControlFilter()); + shiroFilterFactoryBean.setFilters(filtersMap); + + LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); + + //注意过滤器配置顺序 不能颠倒 + //配置不会被拦截的链接 顺序判断 + //filterChainDefinitionMap.put("/shiro/loginUser", "kickout,anon"); + //filterChainDefinitionMap.put("/shiro/loginHospital", "kickout,anon"); + filterChainDefinitionMap.put("/shiro/loginUser", "anon"); + filterChainDefinitionMap.put("/shiro/loginHospital", "anon"); + + filterChainDefinitionMap.put("/shiro/*", "anon"); + filterChainDefinitionMap.put("/api/*", "anon"); + filterChainDefinitionMap.put("/register/*", "anon"); + filterChainDefinitionMap.put("/html/*", "anon"); + filterChainDefinitionMap.put("/note/*", "anon"); + filterChainDefinitionMap.put("/send/sendmsg", "anon"); + filterChainDefinitionMap.put("/send/forgetPwd", "anon"); + filterChainDefinitionMap.put("/note/*", "anon"); + filterChainDefinitionMap.put("/sendNote/*", "anon"); + filterChainDefinitionMap.put("/infor/findAifmGroup", "anon"); + filterChainDefinitionMap.put("/infor/findAifmById", "anon"); + filterChainDefinitionMap.put("/user/selectUserById", "anon"); + filterChainDefinitionMap.put("/user/selectUserJy", "anon"); + filterChainDefinitionMap.put("/user/getAllDocByCategoryHospital", "anon"); + filterChainDefinitionMap.put("/home/findHomeListById", "anon"); + filterChainDefinitionMap.put("/home/findHomeListPage", "anon"); + filterChainDefinitionMap.put("/section/selectSectionById", "anon"); + //filterChainDefinitionMap.put("/Ocrcontroller/*", "anon"); + filterChainDefinitionMap.put("/ptUser/registerPtUser", "anon"); + filterChainDefinitionMap.put("/ptUser/selectPtPhone", "anon"); + filterChainDefinitionMap.put("/ptUser/updatePtUserPassword*", "anon"); + filterChainDefinitionMap.put("/record/*", "anon"); + filterChainDefinitionMap.put("/agoraApi/*", "anon"); + filterChainDefinitionMap.put("/ws/asset/*","anon"); + filterChainDefinitionMap.put("/report/*","anon"); + filterChainDefinitionMap.put("/bmode/updateBmode", "anon"); + filterChainDefinitionMap.put("/shiro/logout", "logout"); + + //filterChainDefinitionMap.put("/*/*", "anon"); + + //未登录拦截 + filterChainDefinitionMap.put("/agora/*", "authc"); + filterChainDefinitionMap.put("/bmode/*", "authc"); + filterChainDefinitionMap.put("/case/*", "authc"); + filterChainDefinitionMap.put("/con/*", "authc"); + filterChainDefinitionMap.put("/promote/*", "authc"); + filterChainDefinitionMap.put("/ecg/*", "authc"); + filterChainDefinitionMap.put("/infor/*", "authc"); + filterChainDefinitionMap.put("/apply/*", "authc"); + filterChainDefinitionMap.put("/icon/*", "authc"); + filterChainDefinitionMap.put("/BmodeSendMsg/*", "authc"); + filterChainDefinitionMap.put("/Bscan/*", "authc"); + filterChainDefinitionMap.put("/cgs/*", "authc"); + filterChainDefinitionMap.put("/data/*", "authc"); + filterChainDefinitionMap.put("/JyHiS/*", "authc"); + filterChainDefinitionMap.put("/AllinOne/*", "authc"); + filterChainDefinitionMap.put("/arrange/*", "authc"); + filterChainDefinitionMap.put("/docfa/*", "authc"); + filterChainDefinitionMap.put("/home/*", "authc"); + filterChainDefinitionMap.put("/login/*", "authc"); + filterChainDefinitionMap.put("/loginRecord/*", "authc"); + filterChainDefinitionMap.put("/Ocrcontroller/*", "authc"); + filterChainDefinitionMap.put("/patient/*", "authc"); + filterChainDefinitionMap.put("/section/*", "authc"); + filterChainDefinitionMap.put("/jyNote/*", "authc"); + filterChainDefinitionMap.put("/jyNoteTest/*", "authc"); + filterChainDefinitionMap.put("/SVS/*", "authc"); + filterChainDefinitionMap.put("/menu/*", "authc"); + filterChainDefinitionMap.put("/totalInformation/*", "authc"); + filterChainDefinitionMap.put("/training/*", "authc"); + filterChainDefinitionMap.put("/trainingPlan/*", "authc"); + filterChainDefinitionMap.put("/trainingRecord/*", "authc"); + filterChainDefinitionMap.put("/user/*", "authc"); + filterChainDefinitionMap.put("/video/*", "authc"); + filterChainDefinitionMap.put("/sound/*", "authc"); + filterChainDefinitionMap.put("/exce/*", "authc"); + filterChainDefinitionMap.put("/wechat/*", "authc"); + filterChainDefinitionMap.put("/record/*", "authc"); + filterChainDefinitionMap.put("/**", "kickout,authc"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + + //自定义过滤器 + Map filterMap = shiroFilterFactoryBean.getFilters(); + filterMap.put("authc", new CORSAuthenticationFilter()); + shiroFilterFactoryBean.setFilters(filterMap); + return shiroFilterFactoryBean; + } + + + /** + * 注入自定义的凭证匹配器MyCredentialsMatcher进行密码验证 + * 我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 + * @return myShiroRealm + */ + @Bean + public MyShiroRealm myShiroRealm() { + MyShiroRealm myShiroRealm = new MyShiroRealm(); + myShiroRealm.setCredentialsMatcher(new MyCredentialsMatcher()); + return myShiroRealm; + } + + + + /** + * 自定义sessionManager + * @return + */ + @Bean + public SessionManager sessionManager(){ + MySessionManager shiroSessionManager = new MySessionManager(); + //这里可以不设置。Shiro有默认的session管理。如果缓存为Redis则需改用Redis的管理 + shiroSessionManager.setSessionDAO(new EnterpriseCacheSessionDAO()); + return shiroSessionManager; + } + + /** + * 配置管理层。即安全控制层 + * @return + */ + @Bean(name="securityManager") + public SecurityManager securityManager(EhCacheManager ehCacheManager){ + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(myShiroRealm()); + //自定义session管理 + securityManager.setSessionManager(sessionManager()); + //自定义缓存实现 + securityManager.setCacheManager(ehCacheManager); + return securityManager; + } + + /** + * 缓存管理器 + * 可能已经存在CacheManager,在ehcache-core 2.5版本之后再次创建CacheManager会失败 + * @return + */ + @Bean + public EhCacheManager ehCacheManager() { + CacheManager cacheManager = CacheManager.getCacheManager("es"); + //cacheManager不存在才创建,否则不创建 + if(cacheManager == null){ + try { + cacheManager = CacheManager.create(ResourceUtils.getInputStreamForPath("classpath:ehcache-shiro.xml")); + } catch (IOException e) { + throw new RuntimeException("initialize cacheManager failed"); + } + } + EhCacheManager ehCacheManager = new EhCacheManager(); + ehCacheManager.setCacheManager(cacheManager); + return ehCacheManager; + } + + /** + * 开启shiro aop注解支持. + * 使用代理方式;所以需要开启代码支持; + * + * @param securityManager + * @return + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + /** + * 注册全局异常处理 + * @return + */ +// @Bean(name = "exceptionHandler") +// public HandlerExceptionResolver handlerExceptionResolver() { +// return new MyExceptionHandler(); +// } +// + /** + * 并发登录控制 + * @return + */ + @Bean + public KickoutSessionControlFilter kickoutSessionControlFilter(){ + KickoutSessionControlFilter kickoutSessionControlFilter = new KickoutSessionControlFilter(); + //用于根据会话ID,获取会话进行踢出操作的; + kickoutSessionControlFilter.setSessionManager(sessionManager()); + //使用cacheManager获取相应的cache来缓存用户登录的会话;用于保存用户—会话之间的关系的; + kickoutSessionControlFilter.setCacheManager(ehCacheManager()); + //是否踢出后来登录的,默认是false;即后者登录的用户踢出前者登录的用户; + kickoutSessionControlFilter.setKickoutAfter(false); + //同一个用户最大的会话数,默认1;比如2的意思是同一个用户允许最多同时两个人登录; + kickoutSessionControlFilter.setMaxSession(1); + //被踢出后重定向到的地址 + kickoutSessionControlFilter.setKickoutUrl("https://lunqincs.jysmyy.com/#/login"); + return kickoutSessionControlFilter; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroUtils.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroUtils.java new file mode 100644 index 0000000..f97d0ec --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/shiro/ShiroUtils.java @@ -0,0 +1,60 @@ +package com.imurs.shiro; + +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.SimpleHash; + +public class ShiroUtils { + /** + * 随机生成 salt 需要指定 它的字符串的长度 + * + * @param len 字符串的长度 + * @return salt + */ + public static String generateSalt(int len) { + //一个Byte占两个字节 + int byteLen = len >> 1; + SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator(); + return secureRandom.nextBytes(byteLen).toHex(); + } + + /** + * 获取加密后的密码,使用默认hash迭代的次数 1 次 + * + * @param hashAlgorithm hash算法名称 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 + * @param password 需要加密的密码 + * @param salt 盐 + * @return 加密后的密码 + */ + public static String encryptPassword(String hashAlgorithm, String password, String salt) { + return encryptPassword(hashAlgorithm, password, salt, 1); + } + + /** + * 获取加密后的密码,需要指定 hash迭代的次数 + * + * @param hashAlgorithm hash算法名称 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512、etc。 + * @param password 需要加密的密码 + * @param salt 盐 + * @param hashIterations hash迭代的次数 + * @return 加密后的密码 + */ + public static String encryptPassword(String hashAlgorithm, String password, String salt, int hashIterations) { + SimpleHash hash = new SimpleHash(hashAlgorithm, password, salt, hashIterations); + return hash.toString(); + } +/* + public void save(User user) { + //user.setCreateDate(new Date()); + // 密码加密 方式很多,任选 + *//* String salt = RandomStringUtils.randomAlphanumeric(20); + sysUser.setPassword(new Sha256Hash(sysUser.getPassword(), salt).toHex());*//* + + String salt = generateSalt(20); + user.setPassword(encryptPassword("MD5", user.getPassword(), salt)); + user.setSalt(salt); + sysUser.setUsername(sysUser.getEmail()); + sysUser.setStatus(SysConstant.SysUserStatus.ACTIVE); + sysUser.setType(SysConstant.SysUserType.USER); + sysUserDao.save(sysUser); + }*/ +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/AsrMain.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/AsrMain.java new file mode 100644 index 0000000..e3c1d52 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/AsrMain.java @@ -0,0 +1,203 @@ +package com.imurs.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Base64; + +import org.json.JSONException; +import org.json.JSONObject; + +public class AsrMain { + + public AsrMain(String path){ + this.filename=path; + } + public AsrMain(InputStream is){ + this.input=is; + } + + // 填写网页上申请的appkey 如 $apiKey="g8eBUMSokVB1BHGmgxxxxxx" + private final String appKey = "XOApTttzAapb3YsomfKlvDRh"; + + // 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx" + private final String secretKey = "CsXyWpN5RtwtiLwURb0Afb8GZnu5Klig"; + + // 需要识别的文件 + private String filename = null;// D:\\16k.pcm E:\\voicesource\\tr5.pcm + //需要传的流----自定义 + private InputStream input =null; + + + // 文件格式 + private final String format = "pcm"; + + // 1537 表示识别普通话,使用输入法模型。1536表示识别普通话,使用搜索模型。 其它语种参见文档 + private final int dev_pid = 1537; + + private String cuid = "1234567JAVA"; + + // 采样率固定值 + private final int rate = 16000; + + public boolean methodRaw = false; // 默认以json方式上传音频文件 + + private final String url = "https://vop.baidu.com/server_api"; // 可以改为https + + public String run() throws IOException, DemoException, JSONException { + TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.TTS_SCOPE); + holder.resfresh(); + String token = holder.getToken(); + String result = null; + if (methodRaw) { + result = runRawPostMethod(token); + } else { + + result = runJsonPostMethod(token); + } + return result; + } + + private String runRawPostMethod(String token) throws IOException, DemoException { + String url2 = url + "?cuid=" + ConnUtil.urlEncode(cuid) + "&dev_pid=" + dev_pid + "&token=" + token; + // System.out.println(url2); + byte[] content = getFileContent(filename); + HttpURLConnection conn = (HttpURLConnection) new URL(url2).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestProperty("Content-Type", "audio/" + format + "; rate=" + rate); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.getOutputStream().write(content); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + return result; + } + + public String runJsonPostMethod(String token) throws DemoException, IOException, JSONException { + //测试进入json 查看路径 + //System.out.println(filename+"百度语音路径数据"); + byte[] content = getFileContent(filename); + String speech = base64Encode(content); + + JSONObject params = new JSONObject(); + params.put("dev-pid", dev_pid); + params.put("format", format); + params.put("rate", rate); + params.put("token", token); + params.put("cuid", cuid); + params.put("channel", "1"); + params.put("len", content.length); + params.put("speech", speech); + + // System.out.println(params.toString()); + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + return result; + } + + private byte[] getFileContent(String filename) throws DemoException, IOException { + File file = new File(filename); + if (!file.canRead()) { + // System.err.println("文件不存在或者不可读: " + file.getAbsolutePath()); + throw new DemoException("file cannot read: " + file.getAbsolutePath()); + } + FileInputStream is = null; + try { + is = new FileInputStream(file); + return ConnUtil.getInputStreamContent(is); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + private String base64Encode(byte[] content) { + + Base64.Encoder encoder = Base64.getEncoder(); // JDK 1.8 推荐方法 + String str = encoder.encodeToString(content); + + +// char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库 +// String str = new String(chars); + + return str; + } + //将输入流转换为二进制数据 + private byte[] getByteContent(InputStream ins) throws IOException{ + return ConnUtil.getInputStreamContent(ins); + + } + //将byte[]上传语音到百度服务器上 + public String runJsonPostMethodIns(String token) throws DemoException, IOException, JSONException { + //测试进入json 查看路径 + // System.out.println("百度流的方法"); + byte[] content = getByteContent(input); + String speech = base64Encode(content); + + JSONObject params = new JSONObject(); + params.put("dev-pid", dev_pid); + params.put("format", format); + params.put("rate", rate); + params.put("token", token); + params.put("cuid", cuid); + params.put("channel", "1"); + params.put("len", content.length); + params.put("speech", speech); + + // System.out.println(params.toString()); + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(5000); + conn.setRequestMethod("POST"); + /* conn.setRequestProperty("Content-type", "text/html"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8");*/ + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setDoOutput(true); + conn.getOutputStream().write(params.toString().getBytes()); + conn.getOutputStream().close(); + String result = ConnUtil.getResponseString(conn); + // result=new String(result.getBytes("GBK"),"UTF-8"); + // System.out.println(System.getProperty("file.encoding")+"file解码"); + + //获取系统默认的字符编 + // System.out.println(Charset.defaultCharset()); + + + //获取系统默认语言 + + // System.out.println(System.getProperty("user.language")); + + //获取系统属性列表 + + // System.getProperties().list(System.out); + + // System.out.println("runJsonPostMethonIns"+result); + return result; + } + //将byte[]上传语音到百度服务器上 + public String runins() throws IOException, DemoException, JSONException { + TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.TTS_SCOPE); + holder.resfresh(); + String token = holder.getToken(); + String result = runJsonPostMethodIns(token); +// String retest= ConnUtil.urlEncode(result); +// System.out.println(retest+"解码后的格式"); + // System.out.println("字节流"+result); + return result; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/ConnUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/ConnUtil.java new file mode 100644 index 0000000..8c11836 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/ConnUtil.java @@ -0,0 +1,100 @@ +package com.imurs.sound; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * 与连接相关的Util类 + */ +public class ConnUtil { + + /** + * UrlEncode, UTF-8 编码 + * + * @param str 原始字符串 + * @return + */ + public static String urlEncode(String str) { + String result = null; + try { + result = URLEncoder.encode(str, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 从HttpURLConnection 获取返回的字符串 + * + * @param conn + * @return + * @throws IOException + * @throws DemoException + */ + public static String getResponseString(HttpURLConnection conn) throws IOException, DemoException { + return new String(getResponseBytes(conn)); + } + + /** + * 从HttpURLConnection 获取返回的bytes + * 注意 HttpURLConnection自身问题, 400类错误,会直接抛出异常。不能获取conn.getInputStream(); + * + * @param conn + * @return + * @throws IOException http请求错误 + * @throws DemoException http 的状态码不是 200 + */ + public static byte[] getResponseBytes(HttpURLConnection conn) throws IOException, DemoException { + int responseCode = conn.getResponseCode(); + InputStream errorStream = null; + + if (responseCode != 200) { + // System.err.println("http 请求返回的状态码错误,期望200, 当前是 " + responseCode); + /* if (responseCode == 401) { + System.err.println("可能是appkey appSecret 填错"); + }*/ + String errorDetail = null; + errorStream=conn.getErrorStream(); + if (errorStream != null) { + // 读取错误响应体内容 + errorDetail = new String(getInputStreamContent(errorStream), StandardCharsets.UTF_8); + System.out.println("错误原因"+" "+errorDetail); + } + throw new DemoException("http response code is" + responseCode); + } + + InputStream inputStream = conn.getInputStream(); + byte[] result = getInputStreamContent(inputStream); + return result; + } + + /** + * 将InputStream内的内容全部读取,作为bytes返回 + * + * @param is + * @return + * @throws IOException @see InputStream.read() + */ + public static byte[] getInputStreamContent(InputStream is) throws IOException { + byte[] b = new byte[1024]; + // 定义一个输出流存储接收到的数据 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // 开始接收数据 + int len = 0; + while (true) { + len = is.read(b); + if (len == -1) { + // 数据读完 + break; + } + byteArrayOutputStream.write(b, 0, len); + } + return byteArrayOutputStream.toByteArray(); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/DemoException.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/DemoException.java new file mode 100644 index 0000000..f8ce8aa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/DemoException.java @@ -0,0 +1,12 @@ +package com.imurs.sound; + +public class DemoException extends Exception { + /** + * + */ + private static final long serialVersionUID = 1L; + + public DemoException(String message) { + super(message); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/TokenHolder.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/TokenHolder.java new file mode 100644 index 0000000..b3da365 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/sound/TokenHolder.java @@ -0,0 +1,128 @@ +package com.imurs.sound; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * token的获取类 + * 将apiKey和secretKey换取token,注意有效期保存在expiresAt + */ +public class TokenHolder { + + + public static final String ASR_SCOPE = "audio_voice_assistant_get"; + + public static final String TTS_SCOPE = "audio_tts_post"; + + /** + * url , Token的url,http可以改为https + */ + private static final String url = "http://openapi.baidu.com/oauth/2.0/token"; + + /** + * asr的权限 scope 是 "audio_voice_assistant_get" + * tts 的权限 scope 是 "audio_tts_post" + */ + private String scope; + + /** + * 网页上申请语音识别应用获取的apiKey + */ + private String apiKey="XOApTttzAapb3YsomfKlvDRh"; + + /** + * 网页上申请语音识别应用获取的secretKey + */ + private String secretKey="CsXyWpN5RtwtiLwURb0Afb8GZnu5Klig"; + + /** + * 保存访问接口获取的token + */ + private String token; + + /** + * 当前的时间戳,毫秒 + */ + private long expiresAt; + + /** + * @param apiKey 网页上申请语音识别应用获取的apiKey + * @param secretKey 网页上申请语音识别应用获取的secretKey + */ + public TokenHolder(String apiKey, String secretKey, String scope) { + this.apiKey = apiKey; + this.secretKey = secretKey; + this.scope = scope; + } + + + /** + * 获取token,refresh 方法后调用有效 + * + * @return + */ + public String getToken() { + return token; + } + + /** + * 获取过期时间,refresh 方法后调用有效 + * + * @return + */ + public long getExpiresAt() { + return expiresAt; + } + + + + + /** + * 获取token + * + * @return + * @throws IOException http请求错误 + * @throws DemoException http接口返回不是 200, access_token未获取 + * @throws JSONException + */ + public void resfresh() throws IOException, DemoException, JSONException { + String getTokenURL = url + "?grant_type=client_credentials" + + "&client_id=" + ConnUtil.urlEncode(apiKey) + "&client_secret=" + ConnUtil.urlEncode(secretKey); + + // 打印的url出来放到浏览器内可以复现 + // System.out.println("token url:" + getTokenURL); + + URL url = new URL(getTokenURL); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(5000); + String result = ConnUtil.getResponseString(conn); + // System.out.println("Token result json:" + result); + parseJson(result); + } + + /** + * @param result token接口获得的result + * @throws DemoException + * @throws JSONException + */ + private void parseJson(String result) throws DemoException, JSONException { + JSONObject json = new JSONObject(result); + if (!json.has("access_token")) { + // 返回没有access_token字段 + throw new DemoException("access_token not obtained, " + result); + } + if (!json.has("scope")) { + // 返回没有scope字段 + throw new DemoException("scopenot obtained, " + result); + } + if (!json.getString("scope").contains(scope)) { + throw new DemoException("scope not exist, " + scope + "," + result); + } + token = json.getString("access_token"); + expiresAt = System.currentTimeMillis() + json.getLong("expires_in") * 1000; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Agora.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Agora.java new file mode 100644 index 0000000..54a2c5a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Agora.java @@ -0,0 +1,72 @@ +package com.imurs.util; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +/** + * 物理服务器录制代理工具类 + * 用本地 Mediasoup 录制方案替代原有的声网云录制 + */ +public class Agora { + + // 私有录制服务的地址 (即你笔记本执行 node src/index.js 的地址) + private static final String RECORDING_SERVICE_URL = "http://127.0.0.1:3000/api/recording"; + + /** + * 开始录制 + * + * @param roomName 房间号(对应之前的 cname) + * @return 录制文件名或错误信息 + */ + public String startLocalRecord(String roomName) { + try { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + Map map = new HashMap<>(); + map.put("roomName", roomName); + + HttpEntity> request = new HttpEntity<>(map, headers); + String response = restTemplate.postForObject(RECORDING_SERVICE_URL + "/start", request, String.class); + + JSONObject jsonObject = JSONObject.parseObject(response); + if (jsonObject.containsKey("fileName")) { + System.out.println("[Recording] Started: " + jsonObject.getString("fileName")); + return jsonObject.getString("fileName"); + } + } catch (Exception e) { + System.err.println("[Recording] Failed to start: " + e.getMessage()); + } + return null; + } + + /** + * 停止录制 + * + * @param roomName 房间号 + */ + public void stopLocalRecord(String roomName) { + try { + RestTemplate restTemplate = new RestTemplate(); + Map map = new HashMap<>(); + map.put("roomName", roomName); + restTemplate.postForObject(RECORDING_SERVICE_URL + "/stop", map, String.class); + System.out.println("[Recording] Stopped for room: " + roomName); + } catch (Exception e) { + System.err.println("[Recording] Failed to stop: " + e.getMessage()); + } + } + + // 为了兼容原有代码接口,保留部分存根 + public Map StartRecord() { + // 原有逻辑可逐步迁移至 startLocalRecord + return null; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/DateUtils.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/DateUtils.java new file mode 100644 index 0000000..8088f3f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/DateUtils.java @@ -0,0 +1,922 @@ +package com.imurs.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 创作者链接:https://blog.csdn.net/sunnyzyq/article/details/125377621 + * @author zyq + * @since 2022/6/17 + */ +public class DateUtils { + + /** 一星期的天数 */ + public static final int WEEK_DAYS = 7; + /** 一年的月份数 */ + public static final int YEAR_MONTHS = 12; + /** 一天的小时数 */ + public static final int DAY_HOURS = 24; + /** 一小时分钟数 */ + public static final int HOUR_MINUTES = 60; + /** 一天分钟数 (24 * 60) */ + public static final int DAY_MINUTES = 1440; + /** 一分钟的秒数 */ + public static final int MINUTE_SECONDS = 60; + /** 一个小时的秒数 (60 * 60) */ + public static final int HOUR_SECONDS = 3600; + /** 一天的秒数 (24 * 60 * 60) */ + public static final int DAY_SECONDS = 86400; + /** 一秒的毫秒数 */ + public static final long SECOND_MILLISECONDS = 1000L; + /** 一分钟的毫秒数(60 * 1000) */ + public static final long MINUTE_MILLISECONDS = 60000L; + /** 一小时的毫秒数(60 * 60 * 1000) */ + public static final long HOUR_MILLISECONDS = 3600000L; + /** 一天的毫秒数(24 * 60* 60* 1000) */ + public static final long DAY_MILLISECONDS = 86400000L; + /** 星期一 */ + public static final int WEEK_1_MONDAY = 1; + /** 星期二 */ + public static final int WEEK_2_TUESDAY = 2; + /** 星期三 */ + public static final int WEEK_3_WEDNESDAY = 3; + /** 星期四 */ + public static final int WEEK_4_THURSDAY = 4; + /** 星期五 */ + public static final int WEEK_5_FRIDAY = 5; + /** 星期六 */ + public static final int WEEK_6_SATURDAY = 6; + /** 星期天 */ + public static final int WEEK_7_SUNDAY = 7; + /** 一月 */ + public static final int MONTH_1_JANUARY = 1; + /** 二月 */ + public static final int MONTH_2_FEBRUARY = 2; + /** 三月 */ + public static final int MONTH_3_MARCH = 3; + /** 四月 */ + public static final int MONTH_4_APRIL= 4; + /** 五月 */ + public static final int MONTH_5_MAY = 5; + /** 六月 */ + public static final int MONTH_6_JUNE = 6; + /** 七月 */ + public static final int MONTH_7_JULY = 7; + /** 八月 */ + public static final int MONTH_8_AUGUST = 8; + /** 九月 */ + public static final int MONTH_9_SEPTEMBER = 9; + /** 十月 */ + public static final int MONTH_10_OCTOBER = 10; + /** 十一月 */ + public static final int MONTH_11_NOVEMBER = 11; + /** 十二月 */ + public static final int MONTH_12_DECEMBER= 12; + /** 显示到日期 */ + public static final String FORMAT_DATE = "yyyy-MM-dd"; + /** 显示到小时 */ + public static final String FORMAT_HOUR = "yyyy-MM-dd HH"; + /** 显示到分 */ + public static final String FORMAT_MINUTE = "yyyy-MM-dd HH:mm"; + /** 显示到秒 */ + public static final String FORMAT_SECOND = "yyyy-MM-dd HH:mm:ss"; + /** 显示到毫秒 */ + public static final String FORMAT_MILLISECOND = "yyyy-MM-dd HH:mm:ss:SSS"; + /** 显示到日期(数字格式) */ + public static final String FORMAT_NO_DATE = "yyyyMMdd"; + /** 显示到小时(数字格式) */ + public static final String FORMAT_NO_HOUR = "yyyyMMddHH"; + /** 显示到分(数字格式) */ + public static final String FORMAT_NO_MINUTE = "yyyyMMddHHmm"; + /** 显示到秒(数字格式) */ + public static final String FORMAT_NO_SECOND = "yyyyMMddHHmmss"; + /** 显示到毫秒(数字格式) */ + public static final String FORMAT_NO_MILLISECOND = "yyyyMMddHHmmssSSS"; + /** 时间格式化器集合 */ + private static final Map simpleDateFormatMap = new HashMap(); + static { + simpleDateFormatMap.put(FORMAT_DATE, new SimpleDateFormat(FORMAT_DATE)); + simpleDateFormatMap.put(FORMAT_HOUR, new SimpleDateFormat(FORMAT_HOUR)); + simpleDateFormatMap.put(FORMAT_MINUTE, new SimpleDateFormat(FORMAT_MINUTE)); + simpleDateFormatMap.put(FORMAT_SECOND, new SimpleDateFormat(FORMAT_SECOND)); + simpleDateFormatMap.put(FORMAT_MILLISECOND, new SimpleDateFormat(FORMAT_MILLISECOND)); + simpleDateFormatMap.put(FORMAT_NO_DATE, new SimpleDateFormat(FORMAT_NO_DATE)); + simpleDateFormatMap.put(FORMAT_NO_HOUR, new SimpleDateFormat(FORMAT_NO_HOUR)); + simpleDateFormatMap.put(FORMAT_NO_MINUTE, new SimpleDateFormat(FORMAT_NO_MINUTE)); + simpleDateFormatMap.put(FORMAT_NO_SECOND, new SimpleDateFormat(FORMAT_NO_SECOND)); + simpleDateFormatMap.put(FORMAT_NO_MILLISECOND, new SimpleDateFormat(FORMAT_NO_MILLISECOND)); + } + + /** + * 获取指定时间格式化器 + * + * @param formatStyle 时间格式 + * @return 时间格式化器 + */ + private static SimpleDateFormat getSimpleDateFormat(String formatStyle) { + SimpleDateFormat dateFormat = simpleDateFormatMap.get(formatStyle); + if (Objects.nonNull(dateFormat)) { + return dateFormat; + } + return new SimpleDateFormat(formatStyle); + } + + /** + * 将 Date 格式时间转化为指定格式时间 + * + * @param date Date 格式时间 + * @param formatStyle 转化指定格式(如: yyyy-MM-dd HH:mm:ss) + * @return 转化格式时间 + */ + public static String format(Date date, String formatStyle) { + if (Objects.isNull(date)) { + return ""; + } + return getSimpleDateFormat(formatStyle).format(date); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd 格式时间(如:2022-06-17) + */ + public static String formatDate(Date date) { + return format(date, FORMAT_DATE); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd HH:mm:ss 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd HH:mm:ss 格式时间(如:2022-06-17 16:06:17) + */ + public static String formatDateTime(Date date) { + return format(date, FORMAT_SECOND); + } + + /** + * 将 Date 格式时间转化为 yyyy-MM-dd HH:mm:ss:SSS 格式时间 + * + * @param date Date 格式时间 + * @return yyyy-MM-dd HH:mm:ss:SSS 格式时间(如:2022-06-17 16:06:17:325) + */ + public static String formatDateTimeStamp(Date date) { + return format(date, FORMAT_MILLISECOND); + } + + /** + * 将 yyyy-MM-dd 格式时间转化为 Date 格式时间 + * + * @param dateString yyyy-MM-dd 格式时间(如:2022-06-17) + * @return Date 格式时间 + */ + public static Date parseDate(String dateString) { + return parse(dateString, FORMAT_DATE); + } + + /** + * 将 yyyy-MM-dd HH:mm:ss 格式时间转化为 Date 格式时间 + * + * @param dateTimeStr yyyy-MM-dd HH:mm:ss 格式时间(如:2022-06-17 16:06:17) + * @return Date 格式时间 + */ + public static Date parseDateTime(String dateTimeStr) { + return parse(dateTimeStr, FORMAT_SECOND); + } + + /** + * 将 yyyy-MM-dd HH:mm:ss:SSS 格式时间转化为 Date 格式时间 + * + * @param dateTimeStr yyyy-MM-dd HH:mm:ss:SSS 格式时间(如:2022-06-17 16:06:17) + * @return Date 格式时间 + */ + public static Date parseDateTimeStamp(String dateTimeStampStr) { + return parse(dateTimeStampStr, FORMAT_MILLISECOND); + } + + /** + * 将字符串格式时间转化为 Date 格式时间 + * + * @param dateString 字符串时间(如:2022-06-17 16:06:17) + * @return formatStyle 格式内容 + * @return Date 格式时间 + */ + public static Date parse(String dateString, String formatStyle) { + String s = getString(dateString); + if (s.isEmpty()) { + return null; + } + try { + return getSimpleDateFormat(formatStyle).parse(dateString); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取字符串有效内容 + * + * @param s 字符串 + * @return 有效内容 + */ + private static String getString(String s) { + return Objects.isNull(s) ? "" : s.trim(); + } + + /** + * 获取一天的开始时间(即:0 点 0 分 0 秒 0 毫秒) + * + * @param date 指定时间 + * @return 当天的开始时间 + */ + public static Date getDateStart(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * 获取一天的截止时间(即:23 点 59 分 59 秒 999 毫秒) + * + * @param date 指定时间 + * @return 当天的开始时间 + */ + public static Date getDateEnd(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + + /** + * 获取日期数字 + * + * @param date 日期 + * @return 日期数字 + */ + public static int getDateNo(Date date) { + if (Objects.isNull(date)) { + return 0; + } + return Integer.valueOf(format(date, FORMAT_NO_DATE)); + } + + /** + * 获取日期时间数字(到秒) + * + * @param date 日期 + * @return 日期数字 + */ + public static long getDateTimeNo(Date date) { + if (Objects.isNull(date)) { + return 0L; + } + return Long.valueOf(format(date, FORMAT_NO_SECOND)); + } + + /** + * 获取日期时间数字(到毫秒) + * + * @param date 日期 + * @return 日期数字 + */ + public static long getDateTimeStampNo(Date date) { + if (Objects.isNull(date)) { + return 0L; + } + return Long.valueOf(format(date, FORMAT_NO_MILLISECOND)); + } + + /** + * 获取星期几 + * + * @param date 时间 + * @return 0(时间为空), 1(周一), 2(周二),3(周三),4(周四),5(周五),6(周六),7(周日) + */ + public static int getWeek(Date date) { + if (Objects.isNull(date)) { + return 0; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return getWeek(calendar); + } + + /** + * 获取星期几 + * + * @param date 时间 + * @return 0(时间为空), 1(周一), 2(周二),3(周三),4(周四),5(周五),6(周六),7(周日) + */ + private static int getWeek(Calendar calendar) { + switch (calendar.get(Calendar.DAY_OF_WEEK)) { + case Calendar.MONDAY: + return 1; + case Calendar.TUESDAY: + return 2; + case Calendar.WEDNESDAY: + return 3; + case Calendar.THURSDAY: + return 4; + case Calendar.FRIDAY: + return 5; + case Calendar.SATURDAY: + return 6; + case Calendar.SUNDAY: + return 7; + default: + return 0; + } + } + + /** + * 获取该日期是今年的第几周(以本年的周一为第1周,详见下面说明)
    + * + * 【说明】
    + * 比如 2022-01-01(周六)和 2022-01-02(周日)虽然在 2022 年里,但他们两天则属于 2021 年最后一周,
    + * 那么这两天不会算在 2022 年第 1 周里,此时会返回 0 ;而 2022 年第 1 周将从 2022-01-03(周一) 开始计算。
    + * + * @param date 时间 + * @return -1(时间为空), 0(为上个年的最后一周),其他数字(今年的第几周) + */ + public static int getWeekOfYear(Date date) { + if (Objects.isNull(date)) { + return -1; + } + int weeks = getWeekOfYearIgnoreLastYear(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.MONTH, Calendar.JANUARY); + calendar.set(Calendar.DAY_OF_MONTH, 1); + int week = getWeek(calendar); + if (week == 1) { + return weeks; + } + return weeks - 1; + } + + /** + * 获取今年的第几周(以本年的1月1日为第1周第1天)
    + * + * @param date 时间 + * @return -1(时间为空),其他数字(今年的第几周) + */ + public static int getWeekOfYearIgnoreLastYear(Date date) { + if (Objects.isNull(date)) { + return -1; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int days = calendar.get(Calendar.DAY_OF_YEAR); + int weeks = days / 7; + // 如果是 7 的倍数,则表示恰好是多少周 + if (days % 7 == 0) { + return weeks; + } + // 如果有余数,则需要再加 1 + return weeks + 1; + } + + /** + * 获取时间节点对象 + * + * @param date 时间对象 + * @return DateNode + */ + public static DateNode getDateNode(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + DateNode node = new DateNode(); + node.setTime(format(date, FORMAT_MILLISECOND)); + node.setYear(calendar.get(Calendar.YEAR)); + node.setMonth(calendar.get(Calendar.MONTH) + 1); + node.setDay(calendar.get(Calendar.DAY_OF_MONTH)); + node.setHour(calendar.get(Calendar.HOUR_OF_DAY)); + node.setMinute(calendar.get(Calendar.MINUTE)); + node.setSecond(calendar.get(Calendar.SECOND)); + node.setMillisecond(calendar.get(Calendar.MILLISECOND)); + node.setWeek(getWeek(calendar)); + node.setDayOfYear(calendar.get(Calendar.DAY_OF_YEAR)); + node.setWeekOfYear(getWeekOfYear(date)); + node.setWeekOfYearIgnoreLastYear(getWeekOfYearIgnoreLastYear(date)); + node.setMillisecondStamp(date.getTime()); + node.setSecondStamp(node.getMillisecondStamp() / 1000); + return node; + } + + /** + * 日期变更 + * + * @param date 指定日期 + * @param field 变更属性(如变更年份,则该值为 Calendar.DAY_OF_YEAR) + * @param amount 变更大小(大于 0 时增加,小于 0 时减少) + * @return 变更后的日期时间 + */ + public static Date add(Date date, int field, int amount) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, amount); + return calendar.getTime(); + } + + /** + * 指定日期加减年份 + * + * @param date 指定日期 + * @param year 变更年份(大于 0 时增加,小于 0 时减少) + * @return 变更年份后的日期 + */ + public static Date addYear(Date date, int year) { + return add(date, Calendar.YEAR, year); + } + + /** + * 指定日期加减月份 + * + * @param date 指定日期 + * @param month 变更月份(大于 0 时增加,小于 0 时减少) + * @return 变更月份后的日期 + */ + public static Date addMonth(Date date, int month) { + return add(date, Calendar.MONTH, month); + } + + /** + * 指定日期加减天数 + * + * @param date 指定日期 + * @param day 变更天数(大于 0 时增加,小于 0 时减少) + * @return 变更天数后的日期 + */ + public static Date addDay(Date date, int day) { + return add(date, Calendar.DAY_OF_YEAR, day); + } + + /** + * 指定日期加减星期 + * + * @param date 指定日期 + * @param week 变更星期数(大于 0 时增加,小于 0 时减少) + * @return 变更星期数后的日期 + */ + public static Date addWeek(Date date, int week) { + return add(date, Calendar.WEEK_OF_YEAR, week); + } + + /** + * 指定日期加减小时 + * + * @param date 指定日期时间 + * @param hour 变更小时数(大于 0 时增加,小于 0 时减少) + * @return 变更小时数后的日期时间 + */ + public static Date addHour(Date date, int hour) { + return add(date, Calendar.HOUR_OF_DAY, hour); + } + + /** + * 指定日期加减分钟 + * + * @param date 指定日期时间 + * @param minute 变更分钟数(大于 0 时增加,小于 0 时减少) + * @return 变更分钟数后的日期时间 + */ + public static Date addMinute(Date date, int minute) { + return add(date, Calendar.MINUTE, minute); + } + + /** + * 指定日期加减秒 + * + * @param date 指定日期时间 + * @param second 变更秒数(大于 0 时增加,小于 0 时减少) + * @return 变更秒数后的日期时间 + */ + public static Date addSecond(Date date, int second) { + return add(date, Calendar.SECOND, second); + } + + /** + * 指定日期加减秒 + * + * @param date 指定日期时间 + * @param minute 变更毫秒数(大于 0 时增加,小于 0 时减少) + * @return 变更毫秒数后的日期时间 + */ + public static Date addMillisecond(Date date, int millisecond) { + return add(date, Calendar.MILLISECOND, millisecond); + } + + /** + * 获取该日期所在周指定星期的日期 + * + * @param date 日期所在时间 + * @return index 指定星期(1 - 7 分别对应星期一到星期天) + */ + public static Date getWeekDate(Date date, int index) { + if (index < WEEK_1_MONDAY || index > WEEK_7_SUNDAY) { + return null; + } + int week = getWeek(date); + return addDay(date, index - week); + } + + /** + * 获取该日期所在周开始日期 + * + * @param date 日期所在时间 + * @return 所在周开始日期 + */ + public static Date getWeekDateStart(Date date) { + return getDateStart(getWeekDate(date, WEEK_1_MONDAY)); + } + + /** + * 获取该日期所在周开始日期 + * + * @param date 日期所在时间 + * @return 所在周开始日期 + */ + public static Date getWeekDateEnd(Date date) { + return getWeekDateEnd(getWeekDate(date, WEEK_7_SUNDAY)); + } + + /** + * 获取该日期所在周的所有日期(周一到周日) + * + * @param Date 日期 + * @return 该日照所在周的所有日期 + */ + public static List getWeekDateList(Date date) { + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + // 获取本周开始时间 + Date weekFromDate = getWeekDateStart(date); + // 获取本周截止时间 + Date weekeEndDate = getWeekDateEnd(date); + return getBetweenDateList(weekFromDate, weekeEndDate, true); + } + + /** + * 获取该日期所在周的所有日期(周一到周日) + * + * @param dateString + * @return 该日照所在周的所有日期 + */ + public static List getWeekDateList(String dateString) { + Date date = parseDate(dateString); + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + return getDateStrList(getWeekDateList(date)); + } + + /** + * 获取该日期所在月的所有日期 + * + * @param dateString + * @return 该日照所月的所有日期 + */ + public static List getMonthDateList(Date date) { + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + Date monthDateStart = getMonthDateStart(date); + Date monthDateEnd = getMonthDateEnd(date); + return getBetweenDateList(monthDateStart, monthDateEnd, true); + } + + /** + * 获取该日期所在月的所有日期 + * + * @param dateString + * @return 该日照所月的所有日期 + */ + public static List getMonthDateList(String dateString) { + Date date = parseDate(dateString); + if (Objects.isNull(date)) { + return Collections.emptyList(); + } + return getDateStrList(getMonthDateList(date)); + } + + /** + * 获取本日期所在月第一天 + * + * @param date 日期 + * @return 本日期所在月第一天 + */ + public static Date getMonthDateStart(Date date) { + if (Objects.isNull(date)) { + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, 1); + return getDateStart(calendar.getTime()); + } + + /** + * 获取本日期所在月最后一天 + * + * @param date 日期 + * @return 本日期所在月最后一天 + */ + public static Date getMonthDateEnd(Date date) { + if (Objects.isNull(date)) { + return null; + } + Date monthDateStart = getMonthDateStart(date); + Date nextMonthDateStart = getMonthDateStart(addMonth(monthDateStart, 1)); + return getDateEnd(addDay(nextMonthDateStart, -1)); + } + + /** + * 获取两个日期相差的天数(以日期为单位计算,不以24小时制计算,详见下面说明)
    + * + * 【说明】比如 2022-06-17 23:00:00 和 2022-06-17 01:00:00,两者虽然只相差 2 个小时,但也算相差 1 天
    + * + * @param date1 日期1 + * @param date2 日期2 + * @return 相差天数(若返回 -1,则至少有一个日期存在为空,此时不能进行比较) + */ + public static int countBetweenDays(Date date1, Date date2) { + if (Objects.isNull(date1) || Objects.isNull(date2)) { + return -1; + } + // 获取两个日期 0 点 0 时 0 分 0 秒 0 毫秒时的时间戳(毫秒级) + long t1 = getDateStart(date1).getTime(); + long t2 = getDateStart(date2).getTime(); + // 相差天数 = 相差的毫秒数 / 一天的毫秒数 + return (int) (Math.abs(t1 - t2) / DAY_MILLISECONDS); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param date1 日期1 + * @param date2 日期2 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(Date date1, Date date2) { + return getBetweenDateList(date1, date2, false); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param date1 日期1 + * @param date2 日期2 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(Date date1, Date date2, boolean isContainParams) { + if (Objects.isNull(date1) || Objects.isNull(date2)) { + return Collections.emptyList(); + } + // 确定前后日期 + Date fromDate = date1; + Date toDate = date2; + if (date2.before(date1)) { + fromDate = date2; + toDate = date1; + } + // 获取两个日期每天的开始时间 + Date from = getDateStart(fromDate); + Date to = getDateStart(toDate); + // 获取日期,开始循环 + List dates = new ArrayList(); + if (isContainParams) { + dates.add(from); + } + Date date = from; + boolean isBefore = true; + while (isBefore) { + date = addDay(date, 1); + isBefore = date.before(to); + if (isBefore) { + dates.add(getDateStart(date)); + } + } + if (isContainParams) { + dates.add(to); + } + return dates; + } + + /** + * 获取两个日期之间的所有日期 + * + * @param dateString1 日期1(如:2022-06-20) + * @param dateString2 日期2(如:2022-07-15) + * @return 两个日期之间的所有日期(不包含参数日期) + */ + public static List getBetweenDateList(String dateString1, String dateString2) { + return getBetweenDateList(dateString1, dateString2, false); + } + + /** + * 获取两个日期之间的所有日期 + * + * @param dateString1 日期1(如:2022-06-20) + * @param dateString2 日期2(如:2022-07-15) + * @param isContainParams 是否包含参数的两个日期 + * @return 两个日期之间的所有日期的开始时间 + */ + public static List getBetweenDateList(String dateString1, String dateString2, boolean isContainParams) { + Date date1 = parseDate(dateString1); + Date date2 = parseDate(dateString2); + List dates = getBetweenDateList(date1, date2, isContainParams); + return getDateStrList(dates); + } + + /** + * List 转 List + * + * @param dates 日期集合 + * @return 日期字符串集合 + */ + public static List getDateStrList(List dates) { + if (dates.isEmpty()) { + return Collections.emptyList(); + } + List dateList = new ArrayList(); + for (Date date : dates) { + dateList.add(formatDate(date)); + } + return dateList; + } + + static class DateNode { + /** 年 */ + private int year; + /** 月 */ + private int month; + /** 日 */ + private int day; + /** 时 */ + private int hour; + /** 分 */ + private int minute; + /** 秒 */ + private int second; + /** 毫秒 */ + private int millisecond; + /** 星期几( 1 - 7 对应周一到周日) */ + private int week; + /** 当年第几天 */ + private int dayOfYear; + /** 当年第几周(本年周 1 为第 1 周,0 则表示属于去年最后一周) */ + private int weekOfYear; + /** 当年第几周(本年周 1 为第 1 周,0 则表示属于去年最后一周) */ + private int weekOfYearIgnoreLastYear; + /** 时间戳(秒级) */ + private long secondStamp; + /** 时间戳(毫秒级) */ + private long millisecondStamp; + /** 显示时间 */ + private String time; + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public int getMonth() { + return month; + } + + public void setMonth(int month) { + this.month = month; + } + + public int getDay() { + return day; + } + + public void setDay(int day) { + this.day = day; + } + + public int getHour() { + return hour; + } + + public void setHour(int hour) { + this.hour = hour; + } + + public int getMinute() { + return minute; + } + + public void setMinute(int minute) { + this.minute = minute; + } + + public int getSecond() { + return second; + } + + public void setSecond(int second) { + this.second = second; + } + + public int getMillisecond() { + return millisecond; + } + + public void setMillisecond(int millisecond) { + this.millisecond = millisecond; + } + + public int getWeek() { + return week; + } + + public void setWeek(int week) { + this.week = week; + } + + public int getDayOfYear() { + return dayOfYear; + } + + public void setDayOfYear(int dayOfYear) { + this.dayOfYear = dayOfYear; + } + + public int getWeekOfYear() { + return weekOfYear; + } + + public void setWeekOfYear(int weekOfYear) { + this.weekOfYear = weekOfYear; + } + + public int getWeekOfYearIgnoreLastYear() { + return weekOfYearIgnoreLastYear; + } + + public void setWeekOfYearIgnoreLastYear(int weekOfYearIgnoreLastYear) { + this.weekOfYearIgnoreLastYear = weekOfYearIgnoreLastYear; + } + + public long getSecondStamp() { + return secondStamp; + } + + public void setSecondStamp(long secondStamp) { + this.secondStamp = secondStamp; + } + + public long getMillisecondStamp() { + return millisecondStamp; + } + + public void setMillisecondStamp(long millisecondStamp) { + this.millisecondStamp = millisecondStamp; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/EsUtils.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/EsUtils.java new file mode 100644 index 0000000..0a4bac5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/EsUtils.java @@ -0,0 +1,108 @@ +package com.imurs.util; + +import com.imurs.config.ElasticSearchConfig; +import com.imurs.dao.EsRepository; +import com.imurs.entity.BMDReportInfo; +import com.imurs.entity.BModeReport; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.indices.GetIndexRequest; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.index.query.MatchAllQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +public class EsUtils { + @Autowired + private ElasticsearchRestTemplate elasticsearchRestTemplate; + @Autowired + EsRepository esRepository; + + @Autowired + RestHighLevelClient client; + + private boolean testSearchIndex() { + GetIndexRequest getIndexRequest = new GetIndexRequest(ElasticSearchConfig.index); + try { + return client.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + public List findAll(){ + SearchRequest searchRequest = new SearchRequest(ElasticSearchConfig.index); + List bModeReports = new ArrayList<>(); + //构建搜索条件 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + //查询条件使用 QueryBuilders 实现 + //termQuery为精确匹配 存在中午搜索不到问题 , 它会使用默认的分词器,把字全拆分开 + //matchQuery 为模糊匹配 text字段.keyword则是精确搜索 不加.keyword则是模糊匹配 + MatchAllQueryBuilder matchQueryBuilder = QueryBuilders.matchAllQuery(); + searchSourceBuilder.query(matchQueryBuilder); + searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); + searchSourceBuilder.from(0); + searchSourceBuilder.size(11); + searchRequest.source(searchSourceBuilder); + SearchResponse searchResponse = null; + try { + searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + } catch (IOException e) { + e.printStackTrace(); + } + //获得结果里对象的值 + for (SearchHit hit : searchResponse.getHits().getHits()) { + Map sourceAsMap = hit.getSourceAsMap(); + String x = GsonUtil.simpleObjToJson(sourceAsMap); + bModeReports.add(GsonUtil.simpleJsonToObj(x, BMDReportInfo.class)); + } + return bModeReports; + } + + + public String addDocument(BModeReport bModeReport){ + if (testSearchIndex()){ + BMDReportInfo bmdReportInfo = new BMDReportInfo(); + bmdReportInfo.setId(bModeReport.getId()); + bmdReportInfo.setExaminePart(bModeReport.getExaminePart()); + bmdReportInfo.setInitial(bModeReport.getInitial()); + bmdReportInfo.setOpinion(bModeReport.getOpinion()); + bmdReportInfo.setbSee(bModeReport.getbSee()); + bmdReportInfo.setbHint(bModeReport.getbHint()); + bmdReportInfo.setNature(bModeReport.getNature()); + bmdReportInfo.setOverallOpinion(bModeReport.getOverallOpinion()); + bmdReportInfo.setbId(bModeReport.getbId()); + bmdReportInfo.setImageIds(bModeReport.getImageIds()); + bmdReportInfo.setDiagnosisType(bModeReport.getDiagnosisType()); + bmdReportInfo.setDocId(bModeReport.getDocId()); + bmdReportInfo.setSpeId(bModeReport.getSpeId()); + bmdReportInfo.setGroupDate(bModeReport.getGroupDate()); + bmdReportInfo.setCategoryHospitalId(bModeReport.getCategoryHospitalId()); + bmdReportInfo.setGroupHospitalId(bModeReport.getGroupHospitalId()); + bmdReportInfo.setActive(bModeReport.getActive()); + bmdReportInfo.setUpdateTime(bModeReport.getUpdateTime()); + esRepository.save( bmdReportInfo); + //elasticsearchRestTemplate.save( bmdReportInfo); + // esRepository.save(paramS); + return "文档添加成功"; + } + return "索引不存在"; + } + + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/GsonUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/GsonUtil.java new file mode 100644 index 0000000..26dc284 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/GsonUtil.java @@ -0,0 +1,200 @@ +package com.imurs.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author Laier + * @date 2022/11/9 + */ +public class GsonUtil { + + /** + * 简单对象转Json + * + * @param obj + * @return + */ + public static String simpleObjToJson(Object obj) { + if (Objects.isNull(obj)) { + return ""; + } + try { + Gson gson = new Gson(); + return gson.toJson(obj); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * 简单Json转对象 + * + * @param json + * @param cls + * @param + * @return + */ + public static T simpleJsonToObj(String json, Class cls) { + Gson gson = new Gson(); + if (Objects.isNull(json)) { + return null; + } + T obj = gson.fromJson(json, cls); + if (Objects.isNull(obj)) { + return null; + } else { + return obj; + } + } + + /** + * 复杂对象转Json + * + * @param obj + * @return + */ + public static String complexObjToJson(Object obj) { + Gson gson = new Gson(); + if (Objects.isNull(obj)) { + return ""; + } + String json = gson.toJson(obj); + if (Objects.isNull(json)) { + return ""; + } else { + return json; + } + } + /** + * 复杂Json转对象 + * + * @param json + * @param cls + * @param + * @return + */ + public static T complexJsonToObj(String json, Class cls) { + Gson gson = new Gson(); + if (Objects.isNull(json)) { + return null; + } + T obj = gson.fromJson(json, cls); + if (Objects.isNull(obj)) { + return null; + } else { + return obj; + } + } + + /** + * 数组转Json + * + * @param array + * @return + */ + public static String arrayToJson(Object array) { + if (Objects.isNull(array)) { + return ""; + } + Gson gson = new Gson(); + String json = gson.toJson(array); + if (Objects.isNull(json)) { + return ""; + } else { + return json; + } + } + + /** + * list To Json + * + * @param list + * @return + */ + public static String listToJson(List list) { + if (Objects.isNull(list)) { + return ""; + } + try { + Gson gson = new Gson(); + return gson.toJson(list); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * json to list + * + * @param json + * @param cls + * @param + * @return + */ + public static T jsonToList(String json,Class cls) { + if (Objects.isNull(json)) { + return null; + } + try { + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + return gson.fromJson(json, type); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 使用expose注解 obj to json + * + * @param obj + * @return + */ + public static String exposeObjToJson(Object obj) { + if (Objects.isNull(obj)) { + return ""; + } + try { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.excludeFieldsWithoutExposeAnnotation(); + Gson gson = gsonBuilder.create(); + return gson.toJson(obj); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + /** + * 使用expose注解 json to obj + * @param json + * @param cls + * @param + * @return + */ + public static T exposeJsonToObj(String json, Class cls) { + if (Objects.isNull(json)) { + return null; + } + try { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.excludeFieldsWithoutExposeAnnotation(); + Gson gson = gsonBuilder.create(); + return gson.fromJson(json, cls); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/IpCacheManager.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/IpCacheManager.java new file mode 100644 index 0000000..753d0fe --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/IpCacheManager.java @@ -0,0 +1,134 @@ +package com.imurs.util; + + +import com.google.common.cache.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.Session; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author w + * 设置缓存,限制ip的访问次数 + */ +public class IpCacheManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(IpCacheManager.class); + + /** 缓存项最大数量 */ + private static final long GUAVA_CACHE_SIZE = 100000; + + /** 缓存时间:天 */ + private static final long GUAVA_CACHE_HOURS = 1; + + /** 缓存操作对象 */ + private static LoadingCache GLOBAL_CACHE = null; + + static { + try { + GLOBAL_CACHE = loadCache(new CacheLoader() { + @Override + public AtomicInteger load(String key) throws Exception { + // 处理缓存键不存在缓存值时的处理逻辑 + return null; + } + }); + } catch (Exception e) { + LOGGER.error("初始化Guava Cache出错", e); + } + } + + /** + * 全局缓存设置 + * @param cacheLoader + * @return + * @throws Exception + */ + private static LoadingCache loadCache(CacheLoader cacheLoader) throws Exception { + LoadingCache cache = CacheBuilder.newBuilder() + //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 + .maximumSize(GUAVA_CACHE_SIZE) + //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护) + .expireAfterAccess(GUAVA_CACHE_HOURS, TimeUnit.HOURS) + // 设置缓存在写入之后 设定时间 后失效 + .expireAfterWrite(GUAVA_CACHE_HOURS, TimeUnit.HOURS) + //移除监听器,缓存项被移除时会触发 + .removalListener(new RemovalListener() { + @Override + public void onRemoval(RemovalNotification rn) { + //逻辑操作 + } + }) + //开启Guava Cache的统计功能 + .recordStats() + .build(cacheLoader); + return cache; + } + + /** + * 设置缓存值 + * @param key + * @param value + */ + public static void put(String key, AtomicInteger value) { + try { + GLOBAL_CACHE.put(key, value); + } catch (Exception e) { + LOGGER.error("设置缓存值出错", e); + } + } + + + /** + * 获取缓存值 + * @param key + * @return + */ + public static AtomicInteger get(String key) { + AtomicInteger token; + try { + token = GLOBAL_CACHE.get(key); + return token; + } catch (CacheLoader.InvalidCacheLoadException e) { + LOGGER.warn("key为" + key + "时没有从缓存获取到数据,返回null"); + } catch (Exception e) { + LOGGER.error("获取缓存值出错", e); + } + return null; + } + + + /** + * 移除缓存值 + * @param key + */ + public static void remove(String key) { + try { + GLOBAL_CACHE.invalidate(key); + } catch (Exception e) { + LOGGER.error("移除缓存出错", e); + } + } + + /** + * @param ipAddress 限制的ip + * @param maxIpCount 该ip最大访问量 + * @return 同一ip超过最大访问量时返回false + */ + public static boolean countIp(String ipAddress,int maxIpCount) { + AtomicInteger integer = IpCacheManager.get(ipAddress); + if (integer == null) { + IpCacheManager.put(ipAddress,new AtomicInteger(1)); + } else if (integer.get() < maxIpCount) { + integer.incrementAndGet(); + IpCacheManager.put(ipAddress,integer); + } else { + return false; + } + return true; + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/JapiDoc.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/JapiDoc.java new file mode 100644 index 0000000..c51518d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/JapiDoc.java @@ -0,0 +1,32 @@ +package com.imurs.util; + +import com.imurs.entity.ApplyBModeSpecialist; +import io.github.yedaxia.apidocs.Docs; +import io.github.yedaxia.apidocs.DocsConfig; +import io.github.yedaxia.apidocs.plugin.markdown.MarkdownDocPlugin; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class JapiDoc { + + /*public static void main(String[] args) { + DocsConfig config = new DocsConfig(); + // 项目根目录 + config.setProjectPath("E://new project//gansu_java_zs"); + // 项目名称 + config.setProjectName("ProjectName"); + // 声明该API的版本 + config.setApiVersion("V1.0"); + // 生成API 文档所在目录 + config.setDocsPath("C://Users//dxy//Desktop//ApiDoc"); + // 配置自动生成 false则要在需要导出的接口加注解@ApiDoc true则全部导出 + config.setAutoGenerate(Boolean.FALSE); + //配置导出文档类型 + config.addPlugin(new MarkdownDocPlugin()); + // 执行生成文档 + Docs.buildHtmlDocs(config); + }*/ + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/LetterIncrementor.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/LetterIncrementor.java new file mode 100644 index 0000000..1fa7290 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/LetterIncrementor.java @@ -0,0 +1,82 @@ +package com.imurs.util; + +public class LetterIncrementor { + + + + /** + * 生成当前字母序列的下一个序列。 + * 例如,"A" 的下一个为 "B";"Z" 的下一个为 "AA";"AZ" 的下一个为 "BA"。 + * + * @param current 当前的字母序列 + * @param maxLength 序列的最大允许长度 + * @return 下一个字母序列 + * @throws IllegalArgumentException 如果输入字符串包含非字母字符,或当序列已达到最大长度且无法再递增时 + */ + public static String getNext(String current, int maxLength) { + if (current == null || current.isEmpty()) { + return "A"; // 如果初始为空,则从"A"开始 + } + + // 校验当前字符串是否全为字母 + if (!current.matches("[a-zA-Z]+")) { + throw new IllegalArgumentException("输入字符串必须只包含字母"); + } + + // 统一转换为大写处理,保证一致性。如果需要小写,可以修改。 + char[] chars = current.toUpperCase().toCharArray(); + + // 检查是否已经达到最大值(即长度等于maxLength,且每个字符都是'Z') + boolean allZ = true; + for (char c : chars) { + if (c != 'Z') { + allZ = false; + break; + } + } + if (allZ && chars.length == maxLength) { + throw new IllegalArgumentException("字母序列已达到最大值(长度为" + maxLength + "的全Z序列),无法继续递增。"); + } + + // 从右向左遍历字符数组 + for (int i = chars.length - 1; i >= 0; i--) { + if (chars[i] < 'Z') { + // 当前字符不需要进位,直接加一 + chars[i]++; + return new String(chars); + } else { + // 当前字符是'Z',需要进位,将其重置为'A' + chars[i] = 'A'; + // 循环继续,下一位(左边一位)会自然进入下一轮判断并加一 + } + } + + // 如果执行到这里,说明原字符串所有位都是'Z',但长度未达到maxLength,需要在前面补一个'A'(例如 "ZZ" -> "AAA") + if (chars.length < maxLength) { + return "A" + new String(chars); // chars现在已经是全'A'了 + } else { + // 理论上不会进入此分支,因为前面已经做了最大值判断,但为了安全起见 + throw new IllegalArgumentException("无法生成下一个字母序列。"); + } + } + + // 测试示例 + public static void main(String[] args) { + String[] testCases = {"A", "Z", "AA", "AZ", "ZZ", "AAA", "ZZZ", "ABCD"}; + for (String test : testCases) { + try { + System.out.println(test + " -> " + getNext(test, 10)); + } catch (IllegalArgumentException e) { + System.out.println(test + " -> ERROR: " + e.getMessage()); + } + } + // 测试边界情况:长度为10的全Z序列 + String maxZ = "ZZZZZZZZZZ"; + try { + System.out.println(maxZ + " -> " + getNext(maxZ, 10)); + } catch (IllegalArgumentException e) { + System.out.println(maxZ + " -> " + e.getMessage()); + } + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MD5.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MD5.java new file mode 100644 index 0000000..2a46529 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MD5.java @@ -0,0 +1,69 @@ +package com.imurs.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5 { + // 全局数组 + private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + + public MD5() { + } + + // 返回形式为数字跟字符串 + private static String byteToArrayString(byte bByte) { + int iRet = bByte; + // System.out.println("iRet="+iRet); + if (iRet < 0) { + iRet += 256; + } + int iD1 = iRet / 16; + int iD2 = iRet % 16; + return strDigits[iD1] + strDigits[iD2]; + } + + // 返回形式只为数字 + @SuppressWarnings("unused") + private static String byteToNum(byte bByte) { + int iRet = bByte; + System.out.println("iRet1=" + iRet); + if (iRet < 0) { + iRet += 256; + } + return String.valueOf(iRet); + } + + // 转换字节数组为16进制字串 + private static String byteToString(byte[] bByte) { + StringBuffer sBuffer = new StringBuffer(); + for (int i = 0; i < bByte.length; i++) { + sBuffer.append(byteToArrayString(bByte[i])); + } + return sBuffer.toString(); + } + + public static String GetMD5Code(String strObj) { + String resultString = null; + try { + resultString = strObj; + MessageDigest md = MessageDigest.getInstance("MD5"); + // md.digest() 该函数返回值为存放哈希值结果的byte数组 + resultString = byteToString(md.digest(strObj.getBytes())); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + return resultString; + } + + /*@SuppressWarnings("unused") + public static void main(String[] args) { + MD5 getMD5 = new MD5(); + //637190078353793191 + System.out.println("第一次MD5:"+MD5.GetMD5Code("123456a")); + String cnum= MD5.GetMD5Code(MD5.GetMD5Code("123456a")); + System.out.println("第二次MD5:"+cnum); + String MDNumber3 = MD5.GetMD5Code(MD5.GetMD5Code(MD5.GetMD5Code("123456a"))); + System.out.println("第三次MD5:" + MDNumber3); + }*/ +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MsgCode.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MsgCode.java new file mode 100644 index 0000000..eae7eec --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/MsgCode.java @@ -0,0 +1,69 @@ +package com.imurs.util; + +public class MsgCode { + + /** + * msg:1 成功 + * msg:2 失败 + * msg:3 空 + * msg:4 系统异常 + * msg:5 存在 + * msg:6 不存在 + * msg:7 权限不足 + * msg:8 账号已经冻结 + * mag:9 字段为空 + * msg:10未登录 + * msg:11旧密码不一致 + * msg:12 登录角色错误 + * msg:13 访问次数过多 + * msg:1001 您的账号在另一台设备上登录,如非本人操作,请立即修改密码! + * msg:1002 未登录 + * msg:1003 未注册 + * msg:1004:签名无效 + * + */ + + //网页地址 + public static final String sendUrl = "https://39.108.252.248/yidutest/#/"; + + //医院名字 + public static final String hospitalName="上海伦琴医生集团"; + + //短信接口 + public static final String account="N144131_N9903806"; + public static final String password="f3pNYkaCsg93cd"; + public static final String url="http://smssh1.253.com/msg/send/json"; + + //短信签名为广州铱度的短信接口 + public static final String ydAccount = "N144131_N9903806"; + public static final String ydPassword = "f3pNYkaCsg93cd"; + public static final String ydUrl = "http://smssh1.253.com/msg/send/json"; + + /**私钥*/ + public static String PRIVATEKEY=""; + + /**公钥*/ + public static String PUBLICKEY=""; + + /**甘肃测试地址密钥**/ + public static final String MYSQL_PUBLICKEY="G0CvDz7oJn6"; + + /**甘肃正式地址密钥**/ + public static final String MYSQL_PUBLICKEY_GS_ZS="GSJDYUHJKHJKHYTBG9874hhdfjkhj67t565yg5"; + + /**本地测试地址密钥*/ + public static final String MYSQL_PUBLICKEY_BD_TEST="G0CvDz7oJnYDXXKEYXGSDDWW"; + + /**API密钥*/ + public static final String API="U2FsdGVkX19vesbWMrQgcml30dYqMuy0U+AtwfoDQG8R5qey4zWSsTROMspCvdAisQkz1yPFpI5r43Bh3+6j6g=="; + + /**TOKEN*/ + public static final String TOKEN="test"; + + /**RSA私钥*/ + public static final String privateKeyString=" MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAiQlWCuM2KdeyG2ur2wAqiiynYyed2mkLKQcjJoY3I/+zoZ8PTTl6+Y1U/Fqw8SdDuEpgO5+/9F5WMhHY3ICL8QIDAQABAkAzjh+g2Pp3o36OcmOlcNqQQVx4IV9x3DMmrFi9FaGJGQkdTtlsEe7DIfJhsYQ4btP6e7H8+720q9qvWAiqVsABAiEA7mv2sAUseSiJqC5G/JGXCuAAPweYpZ2zMtn2HoHBlbECIQCTI8yvExrZZTD4Wr7Aurwd1feaDYKW7b5qVGzhXpKqQQIgfwMy8sh+zbijxN2KYYip31g/qVRBpJDjYwasT8ouN7ECIEO6q+I+4hIFwVfgtYOTsTnunu27oEwHHapmOEQ5OzvBAiEAgvciJPojZtjNgwrT1JLT7AnYg2sgK6v2cRblruKHQAg="; + + /**默认密码*/ + public static final String Password="123456a"; +} + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSASecurityUtil2.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSASecurityUtil2.java new file mode 100644 index 0000000..86ca0c7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSASecurityUtil2.java @@ -0,0 +1,22 @@ +package com.imurs.util; + +import org.jasypt.util.text.BasicTextEncryptor; +public class RSASecurityUtil2 { + + public static void main(String[] args) throws Exception { + + + BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); + //加密所需的salt(盐) + textEncryptor.setPassword(MsgCode.MYSQL_PUBLICKEY_BD_TEST); + //要加密的数据(数据库的用户名或密码) + + String username = textEncryptor.encrypt("root"); + String password = textEncryptor.encrypt("Zp.123456"); + String url = textEncryptor.encrypt("jdbc:mysql://39.108.252.248:3306/yd_jinma?characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true"); + System.out.println("username:"+username); + System.out.println("password:"+password); + System.out.println("url:"+url); + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSAUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSAUtil.java new file mode 100644 index 0000000..761a136 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/RSAUtil.java @@ -0,0 +1,116 @@ +package com.imurs.util; + + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +public class RSAUtil { + + + private static final int DEFAULT_RSA_KEY_SIZE = 1024; + + private static final String KEY_ALGORITHM = "RSA"; + + //存放密钥 + private static Map keyMap = new HashMap(); + + /** + * 随机生成密钥对 + * @throws NoSuchAlgorithmException + */ + public static void genKeyPair() throws NoSuchAlgorithmException { + // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + // 初始化密钥对生成器,密钥大小为96-1024位 + keyPairGen.initialize(DEFAULT_RSA_KEY_SIZE,new SecureRandom()); + // 生成一个密钥对,保存在keyPair中 + KeyPair keyPair = keyPairGen.generateKeyPair(); + // 得到私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + // 得到公钥 + String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded())); + // 得到私钥字符串 + String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); + // 将公钥和私钥保存到Map + //0表示公钥 + keyMap.put(0,publicKeyString); + //1表示私钥 + keyMap.put(1,privateKeyString); + } + + /** + * RSA公钥加密 + * + * @param str + * 加密字符串 + * @param publicKey + * 公钥 + * @return 密文 + * @throws Exception + * 加密过程中的异常信息 + */ + public static String encrypt( String str, String publicKey ) throws Exception{ + //base64编码的公钥 + byte[] decoded = Base64.decodeBase64(publicKey); + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); + //RSA加密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8"))); + return outStr; + } + + /** + * RSA私钥解密 + * + * @param str + * 加密字符串 + * @param privateKey + * 私钥 + * @return 铭文 + * @throws Exception + * 解密过程中的异常信息 + */ + public static String decrypt(String str, String privateKey) throws Exception{ + //64位解码加密后的字符串 + byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); + //base64编码的私钥 + byte[] decoded = Base64.decodeBase64(privateKey); + RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); + //RSA解密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, priKey); + String outStr = new String(cipher.doFinal(inputByte)); + return outStr; + } + +// public static void main(String[] args) throws Exception { +// //生成公钥和私钥 +// genKeyPair(); +// //加密字符串 +// String message = "123456a"; +// System.out.println("随机生成的公钥为:" + keyMap.get(0)); +// System.out.println("随机生成的私钥为:" + keyMap.get(1)); +// String messageEn = encrypt(message,keyMap.get(0)); +// System.out.println(message + "\t加密后的字符串为:" + messageEn); +// +//// String messageEn1 = "VowRoVzepi5GXigjYv1yzck6vEKhuJBDm6XP8p6uwBev7RMnyB6HxH+ronAaTqomudRMu3qQogtHpvay5WbyUQ=="; +//// String messageDe1 = decrypt(messageEn1,"MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAiQlWCuM2KdeyG2ur2wAqiiynYyed2mkLKQcjJoY3I/+zoZ8PTTl6+Y1U/Fqw8SdDuEpgO5+/9F5WMhHY3ICL8QIDAQABAkAzjh+g2Pp3o36OcmOlcNqQQVx4IV9x3DMmrFi9FaGJGQkdTtlsEe7DIfJhsYQ4btP6e7H8+720q9qvWAiqVsABAiEA7mv2sAUseSiJqC5G/JGXCuAAPweYpZ2zMtn2HoHBlbECIQCTI8yvExrZZTD4Wr7Aurwd1feaDYKW7b5qVGzhXpKqQQIgfwMy8sh+zbijxN2KYYip31g/qVRBpJDjYwasT8ouN7ECIEO6q+I+4hIFwVfgtYOTsTnunu27oEwHHapmOEQ5OzvBAiEAgvciJPojZtjNgwrT1JLT7AnYg2sgK6v2cRblruKHQAg="); +//// System.out.println("还原后的字符串为:" + messageDe1); +// +// +//// String messageDe = decrypt(messageEn1,keyMap.get(1)); +//// System.out.println("还原后的字符串为:" + messageDe); +// } + +} + diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/ScrewUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/ScrewUtil.java new file mode 100644 index 0000000..bd8f555 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/ScrewUtil.java @@ -0,0 +1,81 @@ +package com.imurs.util; + +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +/** + * 生成数据库设计文档 + * @author wdh + */ +public class ScrewUtil { + + public static void main(String[] args) { + //需要用hikari连接池才行 + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setDriverClassName("com.mysql.jdbc.Driver"); + hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3307/yd_gansu_test?characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true"); + hikariConfig.setUsername("root"); + hikariConfig.setPassword("root"); + // 设置可以获取tables remarks信息 + hikariConfig.addDataSourceProperty("useInformationSchema", "true"); + hikariConfig.setMinimumIdle(2); + hikariConfig.setMaximumPoolSize(5); + DataSource dataSource = new HikariDataSource(hikariConfig); + + //生成配置文件 + EngineConfig engineConfig = EngineConfig.builder() + //生成文件路径 + .fileOutputDir("C://Users//dxy//Desktop//mysql") + //打开目录 + .openOutputDir(true) + //文件类型 + .fileType(EngineFileType.MD) + //生成模板实现 + .produceType(EngineTemplateType.freemarker).build(); + + //生成文档配置 + Configuration configuration = Configuration.builder() + .version("1.0.3") + .description("数据库设计文档") + .dataSource(dataSource) + .engineConfig(engineConfig) + .produceConfig(getProcessConfig()) + .build(); + //执行生成 + new DocumentationExecute(configuration).execute(); + } + + public static ProcessConfig getProcessConfig() { + //根据表名生成 + List tableName = Arrays.asList("test_group","test"); + //根据表前缀生成,如根据a开头的数据库表 + List prefix = Arrays.asList("a","b","c","d","h","i","l","p","r","s","t","u","v","w"); + //根据表后缀生成 + List suffix = Arrays.asList("test","test2"); + return ProcessConfig.builder() + //根据名称指定表生成 + .designatedTableName(tableName) + //根据表前缀生成 + .designatedTablePrefix(prefix) + //根据表后缀生成 + .designatedTableSuffix(suffix) + //忽略表名 + .ignoreTableName(new ArrayList<>()) + //忽略表前缀 + .ignoreTablePrefix(new ArrayList<>()) + //忽略表后缀 + .ignoreTableSuffix(new ArrayList<>()) + .build(); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Token.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Token.java new file mode 100644 index 0000000..0c1482b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/Token.java @@ -0,0 +1,18 @@ +package com.imurs.util; + +import io.agora.media.RtcTokenBuilder2; +import io.agora.media.RtcTokenBuilder2.Role; + +public class Token { + + public static void main(String[] args) { + // TODO Auto-generated method stub + String appCertificate ="c2809b8ba09e431e84097d60b4406e0a"; + int tokenExpirationInSeconds = 3600; + int privilegeExpirationInSeconds = 3600; + RtcTokenBuilder2 token = new RtcTokenBuilder2(); + String result = token.buildTokenWithUserAccount("3ee3f", appCertificate, "eede", "www", Role.ROLE_PUBLISHER, tokenExpirationInSeconds, privilegeExpirationInSeconds); + System.out.printf("Token with uid: %s\n", result); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java new file mode 100644 index 0000000..78f1172 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/note/ChuangLanSmsUtil.java @@ -0,0 +1,68 @@ +package com.imurs.util.note; +import org.springframework.stereotype.Service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * + * @author tianyh + * @Description:HTTP 请求 + */ + +@Service +public class ChuangLanSmsUtil { + + /** + * + * @author tianyh + * @Description + * @param path + * @param postContent + * @return String + * @throws + */ + public static String sendSmsByPost(String path, String postContent) { + URL url = null; + try { + url = new URL(path); + HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); + httpURLConnection.setRequestMethod("POST");// 提交模式 + httpURLConnection.setConnectTimeout(10000);//连接超时 单位毫秒 + httpURLConnection.setReadTimeout(10000);//读取超时 单位毫秒 + // 发送POST请求必须设置如下两行 + httpURLConnection.setDoOutput(true); + httpURLConnection.setDoInput(true); + httpURLConnection.setRequestProperty("Charset", "UTF-8"); + httpURLConnection.setRequestProperty("Content-Type", "application/json"); + + httpURLConnection.connect(); + OutputStream os=httpURLConnection.getOutputStream(); + os.write(postContent.getBytes("UTF-8")); + os.flush(); + + StringBuilder sb = new StringBuilder(); + int httpRspCode = httpURLConnection.getResponseCode(); + if (httpRspCode == HttpURLConnection.HTTP_OK) { + // 开始获取数据 + BufferedReader br = new BufferedReader( + new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); + String line = null; + while ((line = br.readLine()) != null) { + sb.append(line); + } + br.close(); + return sb.toString(); + + } + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/CustomPage.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/CustomPage.java new file mode 100644 index 0000000..441daa4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/CustomPage.java @@ -0,0 +1,120 @@ +package com.imurs.util.page; + +import java.util.List; + +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 分页工具类 + * 由此对象将page对象转换成json对象,传到前台处理 + * @author z77z + * 由于jqgrid框架定义的page对象里面的字段和mybatisplus的不一样 + * 所以这个由这个中间对象来转换 + * @param + */ +public class CustomPage{ + + //当前页数 + private int page; + + //每页显示数量 + private int pagesize; + + //总条数 + private int records; + + //数据列表 + private List rows; + + //总页数 + private int total; + + //排序字段 + //private String orderByField; + + //是否升序 + //private boolean isAsc; + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getPagesize() { + return pagesize; + } + + public void setPagesize(int pagesize) { + this.pagesize = pagesize; + } + + public int getRecords() { + return records; + } + + public void setRecords(int records) { + this.records = records; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + /*public String getOrderByField() { + return orderByField; + } + + public void setOrderByField(String orderByField) { + this.orderByField = orderByField; + } + + public boolean isAsc() { + return isAsc; + } + + public void setAsc(boolean isAsc) { + this.isAsc = isAsc; + }*/ + + public CustomPage(){} + + /*public CustomPage(Page page){ + this.page = page.getCurrent(); + this.pagesize = page.getSize(); + this.records = page.getTotal(); + this.rows = page.getRecords(); + this.total = page.getPages(); + this.orderByField = page.getOrderByField(); + this.isAsc = page.isAsc(); + }*/ + + //Page:{ [Pagination { total=0 ,size=6//每页大小 ,pages=0 ,current=1//第几页 }], records-size:11 //总数 } + public CustomPage(Page page){ + this.page = page.getCurrent(); + this.pagesize = page.getSize(); + this.records = page.getTotal(); + //this.records = page.getRecords().size(); + this.rows = page.getRecords(); + this.total = page.getPages(); + } + public CustomPage(int page, int pagesize, int records) { + this.page = page; + this.pagesize = pagesize; + this.records = records; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/FrontPage.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/FrontPage.java new file mode 100644 index 0000000..b2b45ed --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/FrontPage.java @@ -0,0 +1,123 @@ +package com.imurs.util.page; + +import com.baomidou.mybatisplus.plugins.Page; + +/** + * 用来接收页面传过来的查询字段 对象 + * + * @author z77z + * + */ +public class FrontPage { + // 是否是查询 + private boolean _search; + + // 时间戳(毫秒) + private String nd; + + // 每页显示条数 + private int rows; + + // 当前页数 + private int page; + + // 排序的字段 + private String sidx; + + // 排序方式 asc升序 desc降序 + private String sord; + + // 搜索条件 + private String keywords; + + public boolean is_search() { + return _search; + } + + public void set_search(boolean _search) { + this._search = _search; + } + + public String getNd() { + return nd; + } + + public void setNd(String nd) { + this.nd = nd; + } + + public int getRows() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public String getSidx() { + return sidx; + } + + public void setSidx(String sidx) { + this.sidx = sidx; + } + + public String getSord() { + return sord; + } + + public void setSord(String sord) { + this.sord = sord; + } + + // 获取mybatisPlus封装的Page对象 + public Page getPagePlus() { + Page pagePlus = new Page(); + pagePlus.setCurrent(this.page); + pagePlus.setSize(this.rows); + pagePlus.setAsc(this.sord.equals("asc")); + pagePlus.setOrderByField(this.sidx); + return pagePlus; + } + + // 获取mybatisPlus封装的Page对象 + public Page getPagePlusTwo() { + Page pagePlus = new Page(); + pagePlus.setCurrent(this.page); + pagePlus.setSize(this.rows); + return pagePlus; + } + + public String getKeywords() { + return keywords; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + + + public FrontPage(boolean _search, String nd, int rows, int page, String sidx, String sord, String keywords) { + super(); + this._search = _search; + this.nd = nd; + this.rows = rows; + this.page = page; + this.sidx = sidx; + this.sord = sord; + this.keywords = keywords; + } + + public FrontPage() { + super(); + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/Pagetion.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/Pagetion.java new file mode 100644 index 0000000..e061a98 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/page/Pagetion.java @@ -0,0 +1,143 @@ +package com.imurs.util.page; + +import java.util.List; +import java.util.Set; + +public class Pagetion { + // 已知数据 + private int pageNo; // 当前页,从请求那边传过来。 + private int pageSize; // 每页显示的数据条数。 + private int resultCount; // 总的记录条数。查询数据库得到的数据 + + // 需要计算得来 + private int totalPage; // 总页数,通过resultCount和pageSize计算可以得来 + // 开始索引,也就是我们在数据库中要从第几行数据开始拿,有了startIndex和pageSize, + // 就知道了limit语句的两个数据,就能获得每页需要显示的数据了 + private int startIndex; + + // 将每页要显示的数据放在list集合中 + private List list; + + private Set set; + + // 分页显示的页数,比如在页面上显示1,2,3,4,5页,start就为1,end就为5,这个也是算过来的 + private int start; + private int end; + + // 通过pageNo,pageSize,resultCount计算得来tatalPage和startIndex + // 构造方法中将pageNo,pageSize,resultCount获得 + public Pagetion(int pageNo, int pageSize, int resultCount) { + this.pageNo = pageNo; + this.pageSize = pageSize; + this.resultCount = resultCount; + + // totalPage 总页数 + if (resultCount % pageSize == 0) { + // 说明整除,正好每页显示pageSize条数据,没有多余一页要显示少于pageSize条数据的 + this.totalPage = resultCount / pageSize; + } else { + // 不整除,就要在加一页,来显示多余的数据。 + this.totalPage = resultCount / pageSize + 1; + } + // 开始索引 + this.startIndex = (pageNo - 1) * pageSize; + // 显示5页,这里自己可以设置,想显示几页就自己通过下面算法修改 + this.start = 1; + this.end = 5; + // 显示页数的算法 + + if (totalPage <= 5) { + // 总页数都小于5,那么end就为总页数的值了。 + this.end = this.totalPage; + } else { + // 总页数大于5,那么就要根据当前是第几页,来判断start和end为多少了, + this.start = pageNo - 2; + this.end = pageNo + 2; + + if (start <=0) { + // 比如当前页是第1页,或者第2页,那么就不如和这个规则, + this.start = 1; + this.end = 5; + } + if (end > this.totalPage) { + // 比如当前页是倒数第2页或者最后一页,也同样不符合上面这个规则 + this.end = totalPage; + this.start = end - 5; + } + } + } + + // get、set方法。 + public int getPageNo() { + return pageNo; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getResultCount() { + return resultCount; + } + + public void setResultCount(int resultCount) { + this.resultCount = resultCount; + } + + public int getTotalPage() { + return totalPage; + } + + public void setTotalPage(int totalPage) { + this.totalPage = totalPage; + } + + public int getStartIndex() { + return startIndex; + } + + public void setStartIndex(int startIndex) { + this.startIndex = startIndex; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public int getStart() { + return start; + } + + public void setStart(int start) { + this.start = start; + } + + public int getEnd() { + return end; + } + + public void setEnd(int end) { + this.end = end; + } + + public Set getSet() { + return set; + } + + public void setSet(Set set) { + this.set = set; + } + +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java new file mode 100644 index 0000000..847c8e3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAop.java @@ -0,0 +1,69 @@ +package com.imurs.util.rateLimiter; + +import com.google.common.util.concurrent.RateLimiter; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author wang + * @date 2021年05月12日 9:58 + * SuppressWarnings注解:忽略掉RateLimiter被标记为不稳定的警告 + * 标注了RateLimiterAspect注解的类都会被增强,然后控制访问接口的并发量 + */ +@Component +@Scope +@Aspect +@SuppressWarnings("UnstableApiUsage") +public class RateLimiterAop { + @Autowired + private HttpServletResponse response; + + private final RateLimiter rateLimiter = RateLimiter.create(10.0); + + @Pointcut("@annotation(com.imurs.util.rateLimiter.RateLimiterAspect)") + public void serviceLimit() {} + + @Around("serviceLimit()") + public Object limit(ProceedingJoinPoint joinPoint) { + boolean acquire = rateLimiter.tryAcquire(); + Object obj = null; + try { + if (acquire) { + obj = joinPoint.proceed(); + } else { + output(response,"网络繁忙"); + } + } catch (Throwable e) { + e.printStackTrace(); + } + return obj; + } + + public void output(HttpServletResponse response, String msg) throws IOException { + response.setContentType("application/json;charset=UTF-8"); + ServletOutputStream outputStream = null; + try { + outputStream = response.getOutputStream(); + outputStream.write(msg.getBytes("UTF-8")); + } catch (IOException e) { + e.printStackTrace(); + } finally { + assert outputStream != null; + outputStream.flush(); + outputStream.close(); + } + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java new file mode 100644 index 0000000..5c401d3 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/rateLimiter/RateLimiterAspect.java @@ -0,0 +1,14 @@ +package com.imurs.util.rateLimiter; + +import java.lang.annotation.*; + +/** + * @author w + * 自定义的注解,相当于一个标识,使用该注解的方法会被切面RateLimiterAop增强 + */ +@Inherited +@Documented +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RateLimiterAspect { +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/HttpContextUtil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/HttpContextUtil.java new file mode 100644 index 0000000..1e49af5 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/HttpContextUtil.java @@ -0,0 +1,56 @@ +package com.imurs.util.weblog; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +public class HttpContextUtil { + + public static HttpServletRequest getHttpServletRequest() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (servletRequestAttributes != null) { + return servletRequestAttributes.getRequest(); + } + return null; + } + + /** + * 获取ip + * @return 返回ip + */ + public static String getIpAddress() { + HttpServletRequest request = getHttpServletRequest(); + assert request != null; + String ip = request.getHeader("X-Forwarded-For"); + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + }else if (ip.length() > 15) { + String[] ips = ip.split(","); + for (String s : ips) { + if (!("unknown".equalsIgnoreCase((String) s))) { + ip = (String) s; + break; + } + } + } + return ip; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java new file mode 100644 index 0000000..05f1f4f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/ScheduledDeleteWeblog.java @@ -0,0 +1,43 @@ +package com.imurs.util.weblog; + +import com.imurs.dao.WebLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author wdh + * 定时删除weblog表十五天前的数据 + */ +@Component +@EnableScheduling +public class ScheduledDeleteWeblog { + + @Autowired + private WebLogMapper webLogMapper; + + private final Logger logger = LoggerFactory.getLogger(ScheduledDeleteWeblog.class); + + /** + * @Scheduled 定时器:表示每月每日的十八点启动 *表示每,0表示无 + * 每天下午六点定时删除web_log表十五天前的数据 十五天在WebLogMapper.xml中定义 + */ + @Scheduled(cron = "0 0 18 * * ?") + public void deleteWebLog() { + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + try { + int result = webLogMapper.deleteWebLog(dateFormat.parse(dateFormat.format(date))); + logger.info("成功删除十五天前总共" + result + "条数据!"); + } catch (Exception e) { + logger.info("删除十五天前数据失败:" + e.getMessage()); + } + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/WebLogAspect.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/WebLogAspect.java new file mode 100644 index 0000000..321cb77 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/util/weblog/WebLogAspect.java @@ -0,0 +1,141 @@ +package com.imurs.util.weblog; + +import com.imurs.entity.WebLog; +import com.imurs.service.WebLogService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +@Aspect +@Order +@Component +public class WebLogAspect { + + @Autowired + private WebLogService webLogService; + + private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); + + ThreadLocal startTime = new ThreadLocal<>(); + ThreadLocal webLogThreadLocal = new ThreadLocal<>(); + + /** + * 表示com.wonder.layui.controller,还有LoginshiroController下的任何子包下公有的任何方法,任何参数 + */ + @Pointcut("execution(public * com.imurs.controller..*.*(..)) || execution(public * com.imurs.shiro.LoginShiroController.*(..))") + public void webLogAll() {} + + /** + * 此切点不包括LoginshiroController里的logout()方法 + */ + @Pointcut("execution(public * com.imurs.controller..*.*(..)) || (execution(public * com.imurs.shiro.LoginShiroController.*(..)) && !execution(public * com.imurs.shiro.LoginShiroController.logout(..)))") + public void webLog() {} + + + /** + * 在切点的方法执行之前执行此方法,记录操作用户的操作信息 + * @param joinPoint + * @throws Throwable + */ + @Before("webLogAll()") + public void doBefore(JoinPoint joinPoint) throws Exception { + startTime.set(System.currentTimeMillis()); + //接收到请求,记录内容 + HttpServletRequest request = HttpContextUtil.getHttpServletRequest(); + String ipAddress = " "; + try { + ipAddress = HttpContextUtil.getIpAddress(); + } catch (Exception e) { + logger.error("ip获取异常",e); + } + //记录开始的时间 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); + Date time = dateFormat.parse(dateFormat.format(startTime.get()) ); + + //记录操作用户 + WebLog webLog = new WebLog(); + webLog.setSuccess(0); + webLog.setIp(ipAddress); + webLog.setStartTime(time); + if (joinPoint != null) { + webLog.setParameter(Arrays.toString(joinPoint.getArgs())); + webLog.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + + "/" + joinPoint.getSignature().getName()); + //打印请求的类路径,哪个类中的哪个方法 + logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + + "/" + joinPoint.getSignature().getName()); + //打印请求的参数 + logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); + } + if (request != null) { + HttpSession session = request.getSession(); + //在登录成功时把name放入了session中 + String name = (String)session.getAttribute("name"); + //记录下请求内容 + logger.info("URL:" + request.getRequestURL().toString()); + logger.info("HTTP_METHOD : " + request.getMethod()); + logger.info("IP : " + request.getRemoteAddr()); + logger.info("ip:"+ipAddress); + + //或者请求网页所在服务器的主机名 + logger.info("serverName :" + request.getServerName()); + logger.info("host :" + request.getHeader("Host")); + + //封装到类中 + webLog.setHttpMethod(request.getMethod()); + webLog.setUrl(request.getRequestURL().toString()); + if (name != null) { + webLog.setUsername(name); + } + } + try { + webLogService.insert(webLog); + } catch (Exception e) { + logger.error("weblog插入异常",e); + } + webLogThreadLocal.set(webLog); + + } + + + /** + * 在切点方法执行成功返回后执行此方法,返回成功信息 + * @param ret + * @throws Throwable + */ + @AfterReturning(returning = "ret", pointcut = "webLog()") + public void doAfterReturning(Object ret) throws Throwable { + // 处理该请求消耗的时间 + long spendTime = System.currentTimeMillis() - startTime.get(); + //请求的返回内容 + //logger.info("RESPONSE : " + ret); + logger.info("SPEND TIME : " + spendTime); + //获取方法执行前的weblog + WebLog webLog = webLogThreadLocal.get(); + + //把请求成功的信息封装到类中 + webLog.setSuccess(1); + webLog.setSpendTime(spendTime); + try { + webLogService.updateById(webLog); + } catch (Exception e) { + logger.error("weblog更新异常",e); + } + startTime.remove(); + webLogThreadLocal.remove(); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/BodyPartCounter.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/BodyPartCounter.java new file mode 100644 index 0000000..562023a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/BodyPartCounter.java @@ -0,0 +1,49 @@ +package com.imurs.utils; + +import java.util.*; +import java.util.regex.*; + +public class BodyPartCounter { + // 定义分类及其对应的正则表达式 + private static final Map CATEGORY_PATTERNS = new LinkedHashMap<>(); + + static { + CATEGORY_PATTERNS.put("胸部", Pattern.compile("肺|胸腔|纵隔|胸部")); + CATEGORY_PATTERNS.put("腹部", Pattern.compile("肝[脏]?|胆[囊]?|胰[腺]?|脾|全腹|腹部|腹水|腹腔浅表|右下腹|左下腹|肢|上腹部|腹股沟|腹|肾|膀胱")); + CATEGORY_PATTERNS.put("胃肠道", Pattern.compile("胃|肠[道]?|阑尾|肠系膜|胃肠道|浅表|清表")); + CATEGORY_PATTERNS.put("泌尿系", Pattern.compile("输尿管|泌尿|泌尿系")); + CATEGORY_PATTERNS.put("妇科", Pattern.compile("子宫|附件|卵巢|膀胱及周围组织|妇科|盆腔")); + CATEGORY_PATTERNS.put("产科", Pattern.compile("胎儿|宫腔|产科")); + CATEGORY_PATTERNS.put("乳腺", Pattern.compile("乳腺")); + CATEGORY_PATTERNS.put("颈部", Pattern.compile("双侧颈部|颈部")); + CATEGORY_PATTERNS.put("男性生殖系统", Pattern.compile("睾丸|附睾|输精管|精索|前列腺|阴道")); + CATEGORY_PATTERNS.put("浅表", Pattern.compile("软组织")); + } + + public static int countBodyPartCategories(String input) { + Set matchedCategories = new HashSet<>(); + + // 检查其他分类 + for (Map.Entry entry : CATEGORY_PATTERNS.entrySet()) { + String category = entry.getKey(); + Pattern pattern = entry.getValue(); + + if (pattern.matcher(input).find()) { + matchedCategories.add(category); + } + } + + return matchedCategories.size(); + } + + public static void main(String[] args) { + // 测试用例 + System.out.println(countBodyPartCategories("肾,膀胱,前列腺")); // 2 + System.out.println(countBodyPartCategories("盆腔")); // 1 + System.out.println(countBodyPartCategories("全腹,肠系膜")); // 2 + System.out.println(countBodyPartCategories("浅表B超")); // 1 + System.out.println(countBodyPartCategories("肾,膀胱")); // 2 + System.out.println(countBodyPartCategories("右侧腹股沟")); // 2 + System.out.println(countBodyPartCategories("泌尿,肝脏,胆囊,胰腺,脾")); // 2 + } +} \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Dateutil.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Dateutil.java new file mode 100644 index 0000000..66574ad --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Dateutil.java @@ -0,0 +1,26 @@ +package com.imurs.utils; + + +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class Dateutil { + + + public static String exchangeDate(String datestr) { + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + + LocalDate date = LocalDate.parse(datestr, inputFormatter); + + String formattedDate = date.format(outputFormatter); + + + return formattedDate; + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Excelvo.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Excelvo.java new file mode 100644 index 0000000..ee78e17 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/Excelvo.java @@ -0,0 +1,41 @@ +package com.imurs.utils; + +import jxl.write.DateTime; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class Excelvo { +// private String language; + private Integer examinePartNum; + private String durationOfConsultation; + private String hospitalName; + private String checkNumber; + private String patientName; + private String gender; + private String age; + private String consultationMode; + private String device; + private String imagingMethod; + private String consultationTime; + private String reportingTime; + private String reviewTime; + private String examinationSite; + private String siteNumber; + private String workTimeType; + private String uploadDoctor; + private String TypeOfMedicalTreatment; + private String reportingDoctor; + private String reportingDoctorBegin; + private String reviewedDoctorBegin; + private String negativeAndPositive; + private String reportContent; + private String diagnosticConclusion; + private String ActualReportToTheDoctor; + private String PracticalDoctor; + private String ActualReviewDoctor; + private String conditions; + private String esrdNumber; +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/PositiveResult.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/PositiveResult.java new file mode 100644 index 0000000..8ec7d49 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/PositiveResult.java @@ -0,0 +1,11 @@ +package com.imurs.utils; + + +import lombok.Data; + +@Data +public class PositiveResult { + private String positive; + private String totalCount; + private String yangCount; +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/handleDuplicate.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/handleDuplicate.java new file mode 100644 index 0000000..12c5295 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/handleDuplicate.java @@ -0,0 +1,74 @@ +package com.imurs.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.time.format.DateTimeFormatter; +import java.util.*; + +@Slf4j +public class handleDuplicate { + public static List handleDuplicateRecords(List records) { + // 步骤1:创建分组标识的 Map + Map> groupMap = new LinkedHashMap<>(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm"); // 用于时间转换 + + // 步骤2:分组并转换 reportTime 为纯数字 + for (Excelvo record : records) { + String consultationTime = record.getConsultationTime(); + + // 提取并转换 reportTime 为纯数字形式 + String reportTimeNumeric = convertToNumericTime(record.getReportingTime()); + + // 生成分组键:患者姓名 + 年龄 + 纯数字处理时间 + String key = record.getPatientName() + + "|" + record.getAge() + + "|" + consultationTime.replaceAll("[^0-9]", ""); + + // 分组:将记录添加到对应的分组中 + groupMap.computeIfAbsent(key, k -> new ArrayList<>()).add(record); + } + + // 步骤3:分离正常记录和重复记录,并在分组内保留 reportTime 最早的记录 + List result = new ArrayList<>(); + + for (Map.Entry> entry : groupMap.entrySet()) { + List group = entry.getValue(); + + if (group.size() > 1) { + // 如果分组内有多条记录,找到 reportTime 最小的记录 + Excelvo earliestRecord = group.stream() + .min(Comparator.comparing( + r -> convertToNumericTime(r.getReportingTime()) + )) + .orElse(null); + + if (earliestRecord != null) { + System.err.println("重复病例中最早的病例"+earliestRecord); + result.add(earliestRecord); // 保留最早的记录 + } + } else { + // 如果分组内只有一条记录,直接添加到结果中 + result.add(group.get(0)); + } + } + + // 可选:对最终结果按照 reportTime 升序排序 +// result.sort(Comparator.comparing( +// r -> convertToNumericTime(r.getReportingTime()) +// )); + System.err.println("总数据数:"+result.stream().count()); + return result; + } + + + private static String convertToNumericTime(String timeStr) { + if (timeStr == null || timeStr.isEmpty()) { + throw new IllegalArgumentException("时间字符串不能为空"); + } + + // 假设时间格式为 "yyyy-MM-dd HH:mm:ss" 或其他包含非数字字符的格式 + // 使用正则表达式去除所有非数字字符 + return timeStr.replaceAll("[^0-9]", ""); + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/positiveCount.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/positiveCount.java new file mode 100644 index 0000000..7609b70 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/utils/positiveCount.java @@ -0,0 +1,31 @@ +package com.imurs.utils; + + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class positiveCount { + + public static PositiveResult countPositive(List> result) { + Map yinYangCount = result.stream() + .collect(Collectors.groupingBy(map -> map.get("negativeAndPositive").toString(), + Collectors.counting())); + + Long yangCount = yinYangCount.getOrDefault("阳", 0L); + + long total = result.size(); + // System.err.println("阳:" + yangCount + ",总数:" + total); + double count = ((double)yangCount/total) * 100; + + String positive = String.format("阳性率为: %.2f%%", count); + // System.err.println(positive); + PositiveResult positiveResult = new PositiveResult(); + positiveResult.setPositive(positive); + positiveResult.setTotalCount("阴阳总数为:"+total); + positiveResult.setYangCount("阳性总数为:"+yangCount); + + + return positiveResult; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/SessionCacheManager.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/SessionCacheManager.java new file mode 100644 index 0000000..4137c62 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/SessionCacheManager.java @@ -0,0 +1,115 @@ +package com.imurs.websocket; + + +import com.google.common.cache.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.websocket.Session; +import java.util.concurrent.TimeUnit; + +/** + * @author w + * 设置缓存 + */ +public class SessionCacheManager { + + private static final Logger LOGGER = LoggerFactory.getLogger(SessionCacheManager.class); + + /** 缓存项最大数量 */ + private static final long GUAVA_CACHE_SIZE = 100000; + + /** 缓存时间:天 */ + private static final long GUAVA_CACHE_DAYS = 1; + + /** 缓存操作对象 */ + private static LoadingCache GLOBAL_CACHE = null; + + static { + try { + GLOBAL_CACHE = loadCache(new CacheLoader() { + @Override + public Session load(String key) throws Exception { + // 处理缓存键不存在缓存值时的处理逻辑 + return null; + } + }); + } catch (Exception e) { + LOGGER.error("初始化Guava Cache出错", e); + } + } + + /** + * 全局缓存设置 + * @param cacheLoader + * @return + * @throws Exception + */ + private static LoadingCache loadCache(CacheLoader cacheLoader) throws Exception { + LoadingCache cache = CacheBuilder.newBuilder() + //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 + .maximumSize(GUAVA_CACHE_SIZE) + //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护) + .expireAfterAccess(GUAVA_CACHE_DAYS, TimeUnit.DAYS) + // 设置缓存在写入之后 设定时间 后失效 + .expireAfterWrite(GUAVA_CACHE_DAYS, TimeUnit.DAYS) + //移除监听器,缓存项被移除时会触发 + .removalListener(new RemovalListener() { + @Override + public void onRemoval(RemovalNotification rn) { + //逻辑操作 + } + }) + //开启Guava Cache的统计功能 + .recordStats() + .build(cacheLoader); + return cache; + } + + /** + * 设置缓存值 + * @param key + * @param value + */ + public static void put(String key, Session value) { + try { + GLOBAL_CACHE.put(key, value); + } catch (Exception e) { + LOGGER.error("设置缓存值出错", e); + } + } + + + /** + * 获取缓存值 + * @param key + * @return + */ + public static Session get(String key) { + Session token; + try { + token = GLOBAL_CACHE.get(key); + return token; + } catch (CacheLoader.InvalidCacheLoadException e) { + LOGGER.warn("key为" + key + "时没有从缓存获取到数据,返回null"); + } catch (Exception e) { + LOGGER.error("获取缓存值出错", e); + } + return null; + } + + + /** + * 移除缓存值 + * @param key + */ + public static void remove(String key) { + try { + GLOBAL_CACHE.invalidate(key); + } catch (Exception e) { + LOGGER.error("移除缓存出错", e); + } + } + + +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketConfig.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketConfig.java new file mode 100644 index 0000000..7212898 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketConfig.java @@ -0,0 +1,30 @@ +package com.imurs.websocket; + +import com.imurs.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * @author w + */ +@Configuration +public class WebSocketConfig { + + /** + * @return 部署到线上需要注释掉这个bean + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + + /** + * @param userService 提前注入spring + */ + @Autowired + private void setUserService(UserService userService) { + WebSocketServer.userService = userService; + } +} diff --git a/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketServer.java b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketServer.java new file mode 100644 index 0000000..dcf8b2a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/java/com/imurs/websocket/WebSocketServer.java @@ -0,0 +1,169 @@ +package com.imurs.websocket; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.imurs.entity.User; +import com.imurs.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author w + */ +@ServerEndpoint(value = "/ws/asset/{username}") +@Component +public class WebSocketServer { + + /** + * websocket容器启动优先与spring容器,直接注入会有空指针异常 + */ + public static UserService userService; + + @PostConstruct + public void init() { + System.out.println("============websocket加载=========="); + } + + /** + * 判断toUser是否为所有专家 + */ + private static final String ALL_SPECIALIST = "allSpecialist"; + + /** + * 前端测试连接是否中断 + */ + private static final String CONNECT_TEST = "test"; + + private static final Logger logger = LoggerFactory.getLogger(WebSocketServer.class); + + private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(); + + /** + * concurrent包的线程安全Set,用来存放专家客户端的Session对象。 + */ + private static final CopyOnWriteArraySet SESSION_SET = new CopyOnWriteArraySet<>(); + + /** + * 连接建立成功调用的方法 + * @param session + */ + @OnOpen + public void onOpen(Session session, @PathParam("username")String userName) { + SessionCacheManager.put(userName,session); + String phone = userName.substring(0,11); + User user = userService.selectUserByPhone(phone); + if (user != null && user.getRid() == 6) { + SESSION_SET.add(session); + logger.info("查询到专家登录,加入专家房间"); + } + //在线数加1 + int cnt = ONLINE_COUNT.incrementAndGet(); + logger.info("有连接加入,当前连接数为" + cnt + " key=" + userName + " value=" + session.getId()); + } + + /** + * 连接关闭调用的方法 + * @param session + */ + @OnClose + public void onClose(Session session,@PathParam("username")String userName) { + if (SessionCacheManager.get(userName).getId().equals(session.getId())) { + SessionCacheManager.remove(userName); + logger.info(userName + "的用户会话" + "已被移除"); + } + SESSION_SET.remove(session); + int cnt = ONLINE_COUNT.decrementAndGet(); + logger.info("有连接关闭,当前连接数为" + cnt); + } + + /** + * 收到客户端信息后调用的方法 + * @param messageFromClient 客户端发来的消息 + * @param session 发送者的session + */ + @OnMessage + public void onMessage(String messageFromClient, Session session) throws IOException { + logger.info("=====收到消息======" + messageFromClient); + JSONObject object = JSON.parseObject(messageFromClient); + Map map = new HashMap<>(8); + // 消息内容 + String message = Optional.ofNullable(object.get("message")).map(Object::toString).orElse(""); + // 发送消息者 + String fromUser = Optional.ofNullable((String) object.get("fromUser")).orElse(""); + // 接收消息者 + String toUser = Optional.ofNullable((String) object.get("toUser")).orElse(""); + // 要执行的动作 + String action = Optional.ofNullable((String) object.get("action")).orElse(""); + + map.put("message",message); + map.put("fromUser",fromUser); + map.put("toUser",toUser); + map.put("action",action); + + // 群发给所有专家 + if (ALL_SPECIALIST.equals(toUser)) { + broadCastInfo(map); + } + // 测试用,收到测试消息发送回去给发送者 + if (CONNECT_TEST.equals(toUser)) { + sendMessage(session,map); + } + // 把收到的消息转给接收者 + if (SessionCacheManager.get(toUser) != null) { + sendMessage(Objects.requireNonNull(SessionCacheManager.get(toUser)),map); + } + } + + + /** + * 出现错误 + * @param session + * @param error + */ + @OnError + public void onError(Session session, Throwable error) { + logger.error("发生错误:{},sessionId是:{}",error.getMessage(),session.getId()); + error.printStackTrace(); + } + + /** + * 发送消息,实践表明,每次浏览器刷新,session会发生变化。 + * @param session + */ + public static void sendMessage(Session session, Map map) { + try { + session.getBasicRemote().sendText(new Gson().toJson(map)); + } catch (IOException e) { + logger.error("发送消息出错:{}", e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 群发消息 + * @param map + * @throws IOException + */ + public static void broadCastInfo(Map map) throws IOException { + for (Session session : SESSION_SET) { + if(session.isOpen()) { + sendMessage(session, map); + } + } + } + +} diff --git a/sfu-server/imurs_mediasoup/src/main/resources/application.properties b/sfu-server/imurs_mediasoup/src/main/resources/application.properties new file mode 100644 index 0000000..6f2714c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/application.properties @@ -0,0 +1,50 @@ +#关闭页面缓存 + spring.thymeleaf.cache=false + +#tomcat +server.jsp-servlet.init-parameters.development=true +server.port=1011 + + +#ElasticSearch +es.url= http://192.168.2.110 +es.port=9200 +spring.main.allow-bean-definition-overriding=true +spring.datasource.url=jdbc:mysql://39.108.252.248:3306/yd_gzlps_test?characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true +spring.datasource.username=root +spring.datasource.password=123456.zhangyang +management.health.elasticsearch.enabled=false + + +#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl +spring.datasource.driver-class-name= com.mysql.jdbc.Driver +spring.datasource.type= com.alibaba.druid.pool.DruidDataSource + +#druid_config +spring.datasource.max-active= 50 +spring.datasource.initial-size= 5 +spring.datasource.min-idle= 3 +spring.datasource.max-wait= 60000 +spring.datasource.time-between-eviction-runs-millis= 60000 +spring.datasource.min-evictable-idle-time-millis= 300000 +spring.datasource.test-while-idle= true +spring.datasource.test-on-borrow= false +spring.datasource.test-on-return= false +spring.datasource.poolPreparedStatements= true +spring.datasource.filters= stat,wall,slf4j + + +mybatis.mapper-locations=classpath*:/dao/**/**.xml + +# log_config DEBUG ERROR INFO WARN +logging.level.root= INFO +logging.level.io.z77z.dao= DEBUG +logging.file= ./logs/spring-boot-logging.log +logging.pattern.console= %d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n +logging.pattern.file= %d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n + +#crawler +#crawler.img.local= c:\\imag/ + + diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/AgoraRecordMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/AgoraRecordMapper.xml new file mode 100644 index 0000000..7d70f48 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/AgoraRecordMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/AiQcVocabularyMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/AiQcVocabularyMapper.xml new file mode 100644 index 0000000..88475eb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/AiQcVocabularyMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApiUrlMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApiUrlMapper.xml new file mode 100644 index 0000000..ad0f566 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApiUrlMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeImgMapper.xml new file mode 100644 index 0000000..0f49c8f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeImgMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeMapper.xml new file mode 100644 index 0000000..9766a3d --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeMapper.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeSpecialistMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeSpecialistMapper.xml new file mode 100644 index 0000000..e5f41fa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyBModeSpecialistMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseImgMapper.xml new file mode 100644 index 0000000..d30ca11 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseMapper.xml new file mode 100644 index 0000000..d7fd510 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyCaseMapper.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update apply_case set statu = #{statu} + + , inpatient = #{inpatient} + + + ,consultation_time = #{consultation_time} + + where pt_card =#{pt_card} and id= #{id} + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsulationSpecialist.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsulationSpecialist.xml new file mode 100644 index 0000000..9dda0a2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsulationSpecialist.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationImgMapper.xml new file mode 100644 index 0000000..aa48575 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationImgMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationMapper.xml new file mode 100644 index 0000000..749761f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyConsultationMapper.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyDoctorPromoteMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyDoctorPromoteMapper.xml new file mode 100644 index 0000000..25eae53 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyDoctorPromoteMapper.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgImgMapper.xml new file mode 100644 index 0000000..fa2331e --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgMapper.xml new file mode 100644 index 0000000..161fe95 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgSpecialistMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgSpecialistMapper.xml new file mode 100644 index 0000000..9ae822c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyEcgSpecialistMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationImgMapper.xml new file mode 100644 index 0000000..734b101 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationImgMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationMapper.xml new file mode 100644 index 0000000..79d0b19 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyInformationMapper.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE apply_information + SET + group_alias = #{item.groupAlias} + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyLisMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyLisMapper.xml new file mode 100644 index 0000000..744ca61 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyLisMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyFileMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyFileMapper.xml new file mode 100644 index 0000000..883f1e1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyFileMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyImgMapper.xml new file mode 100644 index 0000000..62c4276 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyImgMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyMapper.xml new file mode 100644 index 0000000..eab27a8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologyMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologySpecialistMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologySpecialistMapper.xml new file mode 100644 index 0000000..57fe490 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplyPathologySpecialistMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplySpecialistMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplySpecialistMapper.xml new file mode 100644 index 0000000..1569287 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ApplySpecialistMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeHistoryMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeHistoryMapper.xml new file mode 100644 index 0000000..be8def8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeHistoryMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeReportMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeReportMapper.xml new file mode 100644 index 0000000..c9936c7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BModeReportMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisMapper.xml new file mode 100644 index 0000000..9d387f4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisMapper.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisNextMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisNextMapper.xml new file mode 100644 index 0000000..a497162 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BdiagnosisNextMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelFrisMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelFrisMapper.xml new file mode 100644 index 0000000..c363474 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelFrisMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelMapper.xml new file mode 100644 index 0000000..dcfb4a8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelSecondMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelSecondMapper.xml new file mode 100644 index 0000000..549dbb7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/BmodelSecondMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/CaseTemplateMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/CaseTemplateMapper.xml new file mode 100644 index 0000000..f1bc5db --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/CaseTemplateMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ClinicalGuidelinesMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ClinicalGuidelinesMapper.xml new file mode 100644 index 0000000..5fbcfdd --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ClinicalGuidelinesMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorArrangeMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorArrangeMapper.xml new file mode 100644 index 0000000..cd5df15 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorArrangeMapper.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorGroupMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorGroupMapper.xml new file mode 100644 index 0000000..1802c5b --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/DoctorGroupMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + id,group_name,group_alias,description,leader_doctor_id,status, + create_time,update_time + + diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/HomePageShowMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/HomePageShowMapper.xml new file mode 100644 index 0000000..b22e387 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/HomePageShowMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/ImgArrangeMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/ImgArrangeMapper.xml new file mode 100644 index 0000000..361d207 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/ImgArrangeMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentBloodMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentBloodMapper.xml new file mode 100644 index 0000000..d61712f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentBloodMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentEcgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentEcgMapper.xml new file mode 100644 index 0000000..4a1e104 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentEcgMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentPersionMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentPersionMapper.xml new file mode 100644 index 0000000..35a562f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentPersionMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentUrineMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentUrineMapper.xml new file mode 100644 index 0000000..9c8d150 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/InoneagentUrineMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/InstallModelMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/InstallModelMapper.xml new file mode 100644 index 0000000..3e6a8f7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/InstallModelMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/LiveMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/LiveMapper.xml new file mode 100644 index 0000000..4e22aa8 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/LiveMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/LoginRecordMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/LoginRecordMapper.xml new file mode 100644 index 0000000..de7dfb0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/LoginRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientMapper.xml new file mode 100644 index 0000000..e3a260f --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserMapper.xml new file mode 100644 index 0000000..8d61eb4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordImgMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordImgMapper.xml new file mode 100644 index 0000000..bca55fa --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordImgMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordMapper.xml new file mode 100644 index 0000000..94343d7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/PatientUserRecordMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/RoleMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/RoleMapper.xml new file mode 100644 index 0000000..5ffeb4a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/RoleMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/SectionMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/SectionMapper.xml new file mode 100644 index 0000000..0d17b50 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/SectionMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/SysMenuMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/SysMenuMapper.xml new file mode 100644 index 0000000..88e9e18 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/SysMenuMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml new file mode 100644 index 0000000..d1346e1 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalClinicalGuidelinesMapper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalInformationMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalInformationMapper.xml new file mode 100644 index 0000000..57339a4 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalInformationMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalTrainingMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalTrainingMapper.xml new file mode 100644 index 0000000..fb2455c --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TotalTrainingMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingFlowerMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingFlowerMapper.xml new file mode 100644 index 0000000..b2f5f70 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingFlowerMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingMapper.xml new file mode 100644 index 0000000..9ea4edb --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingOpinionMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingOpinionMapper.xml new file mode 100644 index 0000000..56c0685 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingOpinionMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingPlanMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingPlanMapper.xml new file mode 100644 index 0000000..97e5de2 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingPlanMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingRecordMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingRecordMapper.xml new file mode 100644 index 0000000..9c9a5d7 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/TrainingRecordMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/UserMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/UserMapper.xml new file mode 100644 index 0000000..2077547 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/UserMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE user + SET + group_alias = #{item.groupAlias} + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/VideoRecordMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/VideoRecordMapper.xml new file mode 100644 index 0000000..21b1113 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/VideoRecordMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/dao/WebLogMapper.xml b/sfu-server/imurs_mediasoup/src/main/resources/dao/WebLogMapper.xml new file mode 100644 index 0000000..5c75a6a --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/dao/WebLogMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + delete from web_log where datediff(#{date},start_time) >= 15 + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/ehcache-shiro.xml b/sfu-server/imurs_mediasoup/src/main/resources/ehcache-shiro.xml new file mode 100644 index 0000000..c5963e9 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/ehcache-shiro.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/export-template.xlsx b/sfu-server/imurs_mediasoup/src/main/resources/export-template.xlsx new file mode 100644 index 0000000..96f6ed4 Binary files /dev/null and b/sfu-server/imurs_mediasoup/src/main/resources/export-template.xlsx differ diff --git a/sfu-server/imurs_mediasoup/src/main/resources/jar/elasticsearch-2.4.0.jar b/sfu-server/imurs_mediasoup/src/main/resources/jar/elasticsearch-2.4.0.jar new file mode 100644 index 0000000..ce33756 Binary files /dev/null and b/sfu-server/imurs_mediasoup/src/main/resources/jar/elasticsearch-2.4.0.jar differ diff --git a/sfu-server/imurs_mediasoup/src/main/resources/logback-spring.xml b/sfu-server/imurs_mediasoup/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..14ba9a0 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/logback-spring.xml @@ -0,0 +1,193 @@ + + + + + + + logback-spring + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${logging.path}/web_debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${logging.path}/web_info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${logging.path}/web-info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${logging.path}/web_warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${logging.path}/web_error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${logging.path}/web-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/src/main/resources/mybatis-generator.xml b/sfu-server/imurs_mediasoup/src/main/resources/mybatis-generator.xml new file mode 100644 index 0000000..3f13231 --- /dev/null +++ b/sfu-server/imurs_mediasoup/src/main/resources/mybatis-generator.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/sfu-server/imurs_mediasoup/temp_mapping.txt b/sfu-server/imurs_mediasoup/temp_mapping.txt new file mode 100644 index 0000000..1182f69 Binary files /dev/null and b/sfu-server/imurs_mediasoup/temp_mapping.txt differ diff --git a/sfu-server/package.json b/sfu-server/package.json new file mode 100644 index 0000000..ee1f59c --- /dev/null +++ b/sfu-server/package.json @@ -0,0 +1,24 @@ +{ + "name": "mediasoup-sfu-server", + "version": "1.0.0", + "description": "国产信创环境 Mediasoup 远程超声视导 SFU 服务端", + "main": "src/index.js", + "scripts": { + "start": "node src/index.js", + "dev": "nodemon src/index.js" + }, + "dependencies": { + "mediasoup": "^3.12.0", + "socket.io": "^4.7.2", + "express": "^4.18.2", + "cors": "^2.8.5", + "colors": "^1.4.0", + "systeminformation": "^5.21.7" + }, + "devDependencies": { + "nodemon": "^3.0.1", + "bytenode": "^1.5.5", + "javascript-obfuscator": "^4.1.0", + "pkg": "^5.8.1" + } +} \ No newline at end of file diff --git a/sfu-server/scripts/protect.js b/sfu-server/scripts/protect.js new file mode 100644 index 0000000..9649dfa --- /dev/null +++ b/sfu-server/scripts/protect.js @@ -0,0 +1,58 @@ +const bytenode = require('bytenode'); +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const distDir = path.join(__dirname, '../dist'); +const srcDir = path.join(__dirname, '../src'); + +// 1. 创建干净的发布目录 +if (fs.existsSync(distDir)) { + fs.rmSync(distDir, { recursive: true }); +} +fs.mkdirSync(distDir); + +console.log('--- 开始字节码编译保护 ---'.blue); + +/** + * 核心逻辑:将所有业务 JS 编译为 V8 字节码 (.jsc) + */ +const filesToProtect = ['index.js', 'config.js', 'licenseManager.js']; + +filesToProtect.forEach(file => { + const srcPath = path.join(srcDir, file); + const destPath = path.join(distDir, file.replace('.js', '.jsc')); + + // 编译为字节码 + bytenode.compileFile({ + filename: srcPath, + output: destPath + }); + + console.log(`[已加密]: ${file} -> ${path.basename(destPath)}`.green); +}); + +// 2. 生成入口引导文件 (main.js) +// 这个文件将作为打包后的入口,它不包含任何核心业务逻辑,只负责加载加密后的字节码 +const loaderContent = ` +require('bytenode'); +// 加载加密后的入口 +require('./index.jsc'); +`; +fs.writeFileSync(path.join(distDir, 'main.js'), loaderContent); + +// 3. 拷贝其他必要资源 (如 recordings 文件夹占位) +console.log('[准备]: 正在生成打包配置...'.cyan); + +// 4. 调用 pkg 进行二进制打包 (支持 Windows 和 Linux) +console.log('--- 开始二进制打包 (生成 EXE/Binary) ---'.blue); + +try { + // 我们打包生成 Windows exe 和 Linux 二进制文件 + // 注意:mediasoup 的 worker 进程是 C++ 编写的,打包时需确保它在可执行文件同级目录 + execSync('npx pkg dist/main.js --targets node18-win-x64,node18-linux-x64 --out-path build'); + console.log('\n[成功] 打包完成!请查看 build 目录。'.green.bold); + console.log('注意:运行程序时,请确保服务器上已安装 FFmpeg。'.yellow); +} catch (error) { + console.error('[失败] 打包过程中出现错误:', error.message); +} diff --git a/sfu-server/src/config.js b/sfu-server/src/config.js new file mode 100644 index 0000000..aa0be32 --- /dev/null +++ b/sfu-server/src/config.js @@ -0,0 +1,74 @@ +const os = require('os'); + +module.exports = { + // 监听的端口 (信令层) + listenPort: 3000, + + // Mediasoup 配置 + mediasoup: { + // Worker 数量:建议根据你的笔记本 i7-2670QM (4核8线程),设置为 4 个。 + numWorkers: Math.max(Object.keys(os.cpus()).length, 1), + + // Worker 设置 + workerSettings: { + logLevel: 'warn', + logTags: [ + 'info', + 'ice', + 'dtls', + 'rtp', + 'srtp', + 'rtcp' + ], + rtcMinPort: 10000, // 关键:缩窄 UDP 端口范围,方便医院内网防火墙审批 + rtcMaxPort: 10100 + }, + + // Router 设置 (媒体编码参数) + routerOptions: { + mediaCodecs: [ + { + kind: 'audio', + mimeType: 'audio/opus', + clockRate: 48000, + channels: 2 + }, + { + kind: 'video', + mimeType: 'video/VP8', // 兼容性最好,适合国产系统 + clockRate: 90000, + parameters: { + 'x-google-start-bitrate': 1000 + } + }, + { + kind: 'video', + mimeType: 'video/h264', // 超声画面常选,硬件编解码消耗小 + clockRate: 90000, + parameters: { + 'packetization-mode': 1, + 'profile-level-id': '42e01f', + 'level-asymmetry-allowed': 1 + } + } + ] + }, + + // WebRtcTransport 设置 + webRtcTransportOptions: { + listenIps: [ + { + ip: '0.0.0.0', // 监听所有网卡 + // 【非常重要】:在医院专网测试时,请将下方改为该笔记本的实体内网 IP (192.168.x.x) + announcedIp: '127.0.0.1' + } + ], + initialAvailableOutgoingBitrate: 1000000, + minimumAvailableOutgoingBitrate: 600000, + maxSctpSendBufferSize: 262144, + enableUdp: true, + enableTcp: true, // 如果内网封锁了UDP,开启TCP备用 + preferUdp: true + } + } +}; diff --git a/sfu-server/src/index.js b/sfu-server/src/index.js new file mode 100644 index 0000000..e87fa79 --- /dev/null +++ b/sfu-server/src/index.js @@ -0,0 +1,412 @@ +const http = require('http'); +const colors = require('colors'); +const si = require('systeminformation'); +const { spawn } = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const config = require('./config'); + +const app = express(); +app.use(express.json()); // 解析 JSON 请求 +const httpServer = http.createServer(app); + +// --- REST API 用于 Java 后端调用 --- + +app.post('/api/recording/start', async (req, res) => { + const { roomName } = req.body; + try { + const router = await getOrCreateRouter(roomName); + const fileName = await startRecording(router, roomName); + res.json({ success: true, fileName }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + +app.post('/api/recording/stop', (req, res) => { + const { roomName } = req.body; + stopRecording(roomName); + res.json({ success: true }); +}); + +const io = new Server(httpServer, { + cors: { origin: "*" } +}); + +// Mediasoup Workers +let workers = []; +let nextWorkerIdx = 0; + +// 存储房间、传输、生产/消费者及用户 +let rooms = new Map(); // roomName => { router, interactions: Set } +let transports = new Map(); // transportId => transport +let producers = new Map(); // producerId => producer +let consumers = new Map(); // consumerId => consumer +let users = new Map(); // uid => socketId +let recordingBots = new Map(); // roomName => { ffmpegProcess, transports: [] } + +// 确保录制目录存在 +const RECORDING_DIR = path.join(__dirname, '../recordings'); +if (!fs.existsSync(RECORDING_DIR)) fs.mkdirSync(RECORDING_DIR); + +/** + * 初始化 Mediasoup Workers + */ +async function runMediasoupWorkers() { + const { numWorkers, workerSettings } = config.mediasoup; + + for (let i = 0; i < numWorkers; i++) { + const worker = await mediasoup.createWorker(workerSettings); + + worker.on('died', () => { + console.error('mediasoup Worker died, exiting in 2 seconds...'.red); + setTimeout(() => process.exit(1), 2000); + }); + + workers.push(worker); + console.log(`[Worker] Started worker PID: ${worker.pid}`.green); + } +} + +/** + * 获取负载最低的 Worker (轮询) + */ +function getWorker() { + const worker = workers[nextWorkerIdx]; + nextWorkerIdx = (nextWorkerIdx + 1) % workers.length; + return worker; +} + +/** + * 核心调度逻辑 + */ +io.on('connection', (socket) => { + const { uid } = socket.handshake.query; + if (uid) { + users.set(uid, socket.id); + console.log(`[User Registered] UID: ${uid} covers Socket: ${socket.id}`.green); + } + + console.log(`[Socket] New connection: ${socket.id}`.cyan); + + // --- 信令转发逻辑 --- + + // 点对点消息 + socket.on('sendMessageToPeer', ({ to, text }) => { + const targetSocketId = users.get(to); + if (targetSocketId) { + io.to(targetSocketId).emit('messageFromPeer', { from: uid, text }); + } + }); + + // 发起呼叫邀请 + socket.on('invite', ({ to, content }) => { + const targetSocketId = users.get(to); + if (targetSocketId) { + io.to(targetSocketId).emit('invite', { from: uid, content }); + console.log(`[Invite] From ${uid} to ${to}`.magenta); + } + }); + + // 接收/拒绝邀请的转发 + socket.on('acceptInvite', ({ to }) => { + const targetSocketId = users.get(to); + if (targetSocketId) io.to(targetSocketId).emit('inviteAccepted', { from: uid }); + }); + + socket.on('refuseInvite', ({ to }) => { + const targetSocketId = users.get(to); + if (targetSocketId) io.to(targetSocketId).emit('inviteRefused', { from: uid }); + }); + + // 查询用户在线状态 + socket.on('queryPeersOnlineStatus', ({ peerIds }, callback) => { + const results = {}; + peerIds.forEach(pid => { + results[pid] = users.has(pid.toString()); + }); + callback(results); + }); + + // --- Mediasoup 核心调度逻辑 (原有) --- + // 1. 获取 Router 能力 (客户端加载 Device 必需) + socket.on('getRouterRtpCapabilities', async ({ roomName }, callback) => { + try { + const router = await getOrCreateRouter(roomName); + callback({ rtpCapabilities: router.rtpCapabilities }); + } catch (err) { + callback({ error: err.message }); + } + }); + + // 2. 创建 WebRtcTransport + socket.on('createWebRtcTransport', async ({ roomName, consumer }, callback) => { + try { + const router = await getOrCreateRouter(roomName); + const transport = await createWebRtcTransport(router); + + transports.set(transport.id, transport); + + callback({ + params: { + id: transport.id, + iceParameters: transport.iceParameters, + iceCandidates: transport.iceCandidates, + dtlsParameters: transport.dtlsParameters + } + }); + } catch (err) { + callback({ error: err.message }); + } + }); + + // 3. 连接 Transport (DTLS 握手) + socket.on('connectWebRtcTransport', async ({ transportId, dtlsParameters }, callback) => { + try { + const transport = transports.get(transportId); + if (!transport) throw new Error('Transport not found'); + + await transport.connect({ dtlsParameters }); + callback({ success: true }); + } catch (err) { + callback({ error: err.message }); + } + }); + + // 4. 生产流 (推流) + socket.on('produce', async ({ transportId, kind, rtpParameters, appData }, callback) => { + try { + const transport = transports.get(transportId); + if (!transport) throw new Error('Transport not found'); + + const producer = await transport.produce({ kind, rtpParameters, appData }); + producers.set(producer.id, producer); + + // 广播给房间内的所有人有新流 + socket.broadcast.emit('newProducer', { producerId: producer.id, kind: producer.kind }); + + callback({ id: producer.id }); + } catch (err) { + callback({ error: err.message }); + } + }); + + // 5. 消费流 (拉流) + socket.on('consume', async ({ transportId, producerId, rtpCapabilities }, callback) => { + try { + const transport = transports.get(transportId); + const router = transport.appData.router; // 需要在创建时存入 appData + const producer = producers.get(producerId); + + if (!router.canConsume({ producerId, rtpCapabilities })) { + throw new Error('Cannot consume'); + } + + const consumer = await transport.consume({ + producerId, + rtpCapabilities, + paused: true // 先暂停,等客户端准备好 + }); + + consumers.set(consumer.id, consumer); + + callback({ + params: { + id: consumer.id, + producerId: consumer.producerId, + kind: consumer.kind, + rtpParameters: consumer.rtpParameters + } + }); + } catch (err) { + callback({ error: err.message }); + } + }); + + socket.on('resumeConsumer', async ({ consumerId }, callback) => { + const consumer = consumers.get(consumerId); + if (consumer) { + await consumer.resume(); + callback({ success: true }); + } + }); + + // --- 录制控制逻辑 --- + + socket.on('startRecording', async ({ roomName }, callback) => { + try { + if (recordingBots.has(roomName)) throw new Error('Already recording'); + + const router = await getOrCreateRouter(roomName); + const recordingId = await startRecording(router, roomName); + callback({ recordingId }); + } catch (err) { + callback({ error: err.message }); + } + }); + + socket.on('stopRecording', async ({ roomName }, callback) => { + stopRecording(roomName); + callback({ success: true }); + }); + + socket.on('disconnect', () => { + console.log(`[Socket] Disconnected: ${socket.id}`.yellow); + // 清理用户映射 + if (uid) users.delete(uid); + // TODO: 清理该用户的 Transport 和流 + }); +}); + +/** + * 辅助函数:获取或创建 Router + */ +async function getOrCreateRouter(roomName) { + if (rooms.has(roomName)) return rooms.get(roomName).router; + + const worker = getWorker(); + const router = await worker.createRouter(config.mediasoup.routerOptions); + rooms.set(roomName, { router }); + return router; +} + +/** + * 辅助函数:创建 WebRtcTransport + */ +async function createWebRtcTransport(router) { + const options = { + ...config.mediasoup.webRtcTransportOptions, + appData: { router } + }; + + const transport = await router.createWebRtcTransport(options); + + transport.on('dtlsstatechange', (dtlsState) => { + if (dtlsState === 'closed') transport.close(); + }); + + return transport; +} + +/** + * 性能监控仪表盘 + */ +setInterval(async () => { + const cpu = await si.currentLoad(); + const mem = await si.mem(); + console.clear(); + console.log(`========================================`.blue); + console.log(` Mediasoup 医疗视导 SFU 监控仪表盘 `.bold.white); + console.log(`========================================`.blue); + console.log(`[CPU 负载]: ${cpu.currentLoad.toFixed(2)}%`.yellow); + console.log(`[内存占用]: ${((mem.active / mem.total) * 100).toFixed(2)}% (${(mem.active / 1024 / 1024 / 1024).toFixed(2)}GB)`.yellow); + console.log(`[活跃 Worker]: ${workers.length}`.cyan); + console.log(`[活跃 房间]: ${rooms.size}`.cyan); + console.log(`[活跃 推流]: ${producers.size}`.cyan); + console.log(`[活跃 拉流]: ${consumers.size}`.cyan); + console.log(`========================================`.blue); + console.log(`准备好在国产 Linux 系统上通过命令:npm start 运行`.grey); +}, 5000); + +/** + * 开始录制逻辑 (FFmpeg 进程管理) + */ +async function startRecording(router, roomName) { + console.log(`[Recording] Starting for room: ${roomName}`.red.bold); + + // 查找房间内的推流者 (Producer) + // 这里简化演示:录制房间内的第一个视频和第一个音频流 + const producerList = Array.from(producers.values()); + const videoProducer = producerList.find(p => p.kind === 'video'); + const audioProducer = producerList.find(p => p.kind === 'audio'); + + if (!videoProducer) throw new Error('No video producer to record'); + + // 1. 创建 PlainTransports 用于给 FFmpeg 发送数据 + const videoTransport = await router.createPlainTransport({ listenIp: '127.0.0.1', rtcpMux: false }); + const audioTransport = await router.createPlainTransport({ listenIp: '127.0.0.1', rtcpMux: false }); + + // 2. 建立 Consumer 将流导向 PlainTransport + const videoConsumer = await videoTransport.consume({ producerId: videoProducer.id, rtpCapabilities: router.rtpCapabilities }); + const audioConsumer = audioProducer ? await audioTransport.consume({ producerId: audioProducer.id, rtpCapabilities: router.rtpCapabilities }) : null; + + // 3. 构造 FFmpeg 命令 + const fileName = `${roomName}_${Date.now()}.mp4`; + const filePath = path.join(RECORDING_DIR, fileName); + + const ffmpegArgs = [ + '-loglevel', 'debug', + '-protocol_whitelist', 'pipe,udp,rtp', + '-f', 'sdp', '-i', 'pipe:0', // 从标准输入读取 SDP 配置 + '-c:v', 'copy', // 直接拷贝编码,不进行转码,极大节省 CPU + '-c:a', 'aac', + '-y', filePath + ]; + + const ffmpegProcess = spawn('ffmpeg', ffmpegArgs); + + // 4. 生成并发送 SDP 给 FFmpeg (描述 RTP 流的格式和端口) + const sdpString = `v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=Mediasoup Recording +c=IN IP4 127.0.0.1 +t=0 0 +m=video ${videoTransport.tuple.localPort} RTP/AVP 101 +a=rtpmap:101 VP8/90000 +${audioProducer ? `m=audio ${audioTransport.tuple.localPort} RTP/AVP 102 +a=rtpmap:102 opus/48000/2` : ''}`; + + ffmpegProcess.stdin.write(sdpString); + ffmpegProcess.stdin.end(); + + recordingBots.set(roomName, { + ffmpegProcess, + transports: [videoTransport, audioTransport], + filePath + }); + + return fileName; +} + +/** + * 停止录制并清理资源 + */ +function stopRecording(roomName) { + const bot = recordingBots.get(roomName); + if (bot) { + console.log(`[Recording] Stopping for room: ${roomName}`.red); + bot.ffmpegProcess.kill('SIGINT'); + bot.transports.forEach(t => t.close()); + recordingBots.delete(roomName); + } +} + +const LicenseManager = require('./licenseManager'); + +// 启动服务 +async function bootstrap() { + // 1. 验证授权 + if (!LicenseManager.verify()) { + console.error('[System] 授权验证失败,服务无法启动。'.red.bold); + console.log('[System] 您的机器码为: '.yellow + LicenseManager.getMachineId().bold); + process.exit(1); + } + + // 2. 启动 Mediasoup + await runMediasoupWorkers(); + + // 3. 启动 HTTP 服务 + httpServer.listen(config.listenPort, () => { + console.log(`[Server] SFU Server running at http://localhost:${config.listenPort}`.magenta.bold); + }); + + // 4. 定期检查授权 + setInterval(() => { + if (!LicenseManager.verify()) { + console.error('[Security] 授权已到期,正在强制关闭服务...'.red.bold); + process.exit(1); + } + }, 1000 * 60 * 60); +} + +bootstrap(); diff --git a/sfu-server/src/licenseManager.js b/sfu-server/src/licenseManager.js new file mode 100644 index 0000000..5f12c72 --- /dev/null +++ b/sfu-server/src/licenseManager.js @@ -0,0 +1,95 @@ +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const { execSync } = require('child_process'); + +// 授权文件路径 +const LICENSE_PATH = path.join(__dirname, '../license.txt'); +// 这是一个秘密盐值,请务必修改并妥善保存,它是生成/校验授权码的核心 +const SECRET_SALT = 'Medical_SFU_Secure_Salt_2024'; + +class LicenseManager { + /** + * 获取机器唯一标识 (硬件指纹) + * 支持 Linux (openEuler/Anolis) 和 Windows + */ + static getMachineId() { + try { + if (process.platform === 'win32') { + return execSync('wmic csproduct get uuid').toString().split('\n')[1].trim(); + } else { + // Linux 下获取产品 UUID,适合国产服务器 + return execSync('cat /sys/class/dmi/id/product_uuid').toString().trim(); + } + } catch (e) { + return 'DEFAULT-HW-ID-0000-1111'; + } + } + + /** + * 校验授权码的核心逻辑 + */ + static verify() { + if (!fs.existsSync(LICENSE_PATH)) { + console.error('\n[授权错误] 未找到授权文件 license.txt,请联系供应商获取激活码。\n'.red.bold); + return false; + } + + try { + const licenseCode = fs.readFileSync(LICENSE_PATH, 'utf8').trim(); + const [machineId, expiryDate, signature] = licenseCode.split('.'); + + // 1. 验证机器码是否匹配 + if (machineId !== this.getMachineId()) { + console.error('\n[授权错误] 授权码与当前机器硬件不匹配!\n'.red.bold); + return false; + } + + // 2. 验证签名有效性 (防篡改) + const expectedSignature = crypto + .createHmac('sha256', SECRET_SALT) + .update(`${machineId}.${expiryDate}`) + .digest('hex'); + + if (signature !== expectedSignature) { + console.error('\n[授权错误] 授权码校验失败,可能已被篡改!\n'.red.bold); + return false; + } + + // 3. 验证是否过期 + const expiry = parseInt(expiryDate); + const now = Date.now(); + if (now > expiry) { + console.error('\n[授权已过期] 授权已于 ' + new Date(expiry).toLocaleString() + ' 到期,请更新授权。\n'.red.bold); + return false; + } + + const daysLeft = Math.ceil((expiry - now) / (1000 * 60 * 60 * 24)); + console.log(`[授权成功] 剩余有效期: ${daysLeft} 天`.green.bold); + return true; + + } catch (err) { + console.error('\n[授权错误] 解析授权文件失败。\n'.red.bold); + return false; + } + } + + /** + * 获取剩余天数 (供前端展示) + */ + static getRemainingDays() { + try { + if (!fs.existsSync(LICENSE_PATH)) return { success: false, days: 0 }; + const licenseCode = fs.readFileSync(LICENSE_PATH, 'utf8').trim(); + const [, , expiryDate] = licenseCode.split('.'); // 注意索引, expiry在中间 + // 修正解析逻辑,取中间的 expiryDate + const expiry = parseInt(licenseCode.split('.')[1]); + const daysLeft = Math.ceil((expiry - Date.now()) / (1000 * 60 * 60 * 24)); + return { success: true, days: daysLeft > 0 ? daysLeft : 0 }; + } catch (e) { + return { success: false, days: 0 }; + } + } +} + +module.exports = LicenseManager; diff --git a/sfu-server/tools/genLicense.js b/sfu-server/tools/genLicense.js new file mode 100644 index 0000000..a9ff032 --- /dev/null +++ b/sfu-server/tools/genLicense.js @@ -0,0 +1,33 @@ +const crypto = require('crypto'); +const colors = require('colors'); + +// 必须与 src/licenseManager.js 中的 SECRET_SALT 完全一致 +const SECRET_SALT = 'Medical_SFU_Secure_Salt_2024'; + +const args = process.argv.slice(2); +if (args.length < 1) { + console.log('\n使用方法: node genLicense.js <服务器机器码>\n'.yellow); + process.exit(0); +} + +const machineId = args[0]; +// 设置有效期为 1 年 (365天) +const expiry = Date.now() + (365 * 24 * 60 * 60 * 1000); + +// 生成签名: machineId + expiry + SALT +const signature = crypto + .createHmac('sha256', SECRET_SALT) + .update(`${machineId}.${expiry}`) + .digest('hex'); + +const licenseCode = `${machineId}.${expiry}.${signature}`; + +console.log('========================================'.blue); +console.log(' 远程超声 SFU 授权码生成成功 '.bold.white); +console.log('========================================'.blue); +console.log('[机器码]: '.cyan + machineId); +console.log('[到期日]: '.cyan + new Date(expiry).toLocaleString()); +console.log('[激活码]: '.green.bold); +console.log('\n' + licenseCode + '\n'); +console.log('========================================'.blue); +console.log('请将上方红色文字拷贝到服务器根目录的 license.txt 文件中。'.grey);