Browse Source

AI智能

master
xuhuajiao 1 year ago
parent
commit
ee1ebd8624
  1. 5
      .env.development
  2. 4
      .env.production
  3. 9
      package.json
  4. 2530
      public/report/annual.htm
  5. 71
      public/report/年报_files/anno.html
  6. 39
      public/report/年报_files/annualReport_d_statisticalInformation_input.css
  7. 806
      public/report/年报_files/common.css
  8. 39
      public/report/年报_files/content.html
  9. 68
      public/report/年报_files/highlight(1).html
  10. 68
      public/report/年报_files/highlight.html
  11. 1359
      public/report/年报_files/layui.css
  12. 756
      public/report/年报_files/layui.js.下载
  13. 92
      public/report/年报_files/outline.html
  14. 534
      public/report/年报_files/theme.css
  15. 14
      public/report/年报_files/translate(1).html
  16. 14
      public/report/年报_files/translate.html
  17. 3
      public/static/config.js
  18. 59
      src/api/report.js
  19. 1
      src/assets/icons/svg/sta.svg
  20. BIN
      src/assets/images/graph-img.png
  21. BIN
      src/assets/images/index-img7.png
  22. BIN
      src/assets/images/index-img8.png
  23. BIN
      src/assets/images/list-bg.png
  24. BIN
      src/assets/images/run.png
  25. BIN
      src/assets/images/wenhao.png
  26. 58
      src/assets/styles/yxk-admin.scss
  27. 55
      src/assets/test.md
  28. 23
      src/main.js
  29. 586
      src/views/AIAssistant/AICataloging/index.vue
  30. 284
      src/views/AIAssistant/AIDigitalHuman/index.vue
  31. 404
      src/views/AIAssistant/AIDigitalHuman/index2.vue
  32. 159
      src/views/AIAssistant/AIDigitalHuman/message.vue
  33. 370
      src/views/AIAssistant/AIIntelligentCoding/aiForm.vue
  34. 614
      src/views/AIAssistant/AIIntelligentCoding/index.vue
  35. 11
      src/views/AIAssistant/AIIntelligentCoding/str.json
  36. 629
      src/views/AIAssistant/AIKeywords/index.vue
  37. 246
      src/views/AIAssistant/AIknowledgeGraph/index.vue
  38. 306
      src/views/archivesStatistics/annualReportStatistics/index.vue
  39. 278
      src/views/archivesStatistics/customDefinedStatistics/index.vue
  40. 185
      src/views/archivesStatistics/dataStatistics/index.vue
  41. 374
      src/views/archivesStatistics/dataStatistics/index2.vue
  42. 27
      src/views/archivesStatistics/ureport/designer/index.vue
  43. 6
      src/views/components/category/PreviewForm.vue
  44. 34
      vue.config.js

5
.env.development

@ -3,11 +3,10 @@ ENV = 'development'
# 接口地址
# 许镇-本地服地址
# VUE_APP_BASE_API = 'http://192.168.99.84:7070'
# VUE_APP_WS_API = 'ws://192.168.99.84:7070'
VUE_APP_BASE_API = 'http://192.168.99.72:11100'
VUE_APP_WS_API = 'ws://192.168.99.72:11100'
#VUE_APP_BASE_API = 'http://192.168.99.107:11100'
# 是否启用 babel-plugin-dynamic-import-node插件
VUE_CLI_BABEL_TRANSPILE_MODULES = true

4
.env.production

@ -3,10 +3,10 @@ ENV = 'production'
# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
# VUE_APP_BASE_API = 'https://openapitest.aiyxlib.com'
# VUE_APP_BASE_API = 'http://192.168.99.107:11100'
VUE_APP_BASE_API = 'http://192.168.99.107:11100'
# VUE_APP_BASE_API = 'http://27.19.215.77:11100'
# VUE_APP_BASE_API = 'http://27.16.212.58:11100'
VUE_APP_BASE_API = 'http://192.168.99.71:11110'
# VUE_APP_BASE_API = 'http://192.168.99.71:11110'
# 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'ws://27.16.212.58:11110'
VUE_APP_CAMERA_API = '192.168.99.107:3000'

9
package.json

@ -51,7 +51,7 @@
"file-saver": "^1.3.8",
"fuse.js": "3.4.4",
"handsontable": "^14.1.0",
"highlight.js": "^11.5.1",
"highlight.js": "^11.11.1",
"html2canvas": "^1.4.1",
"jquery": "^3.2.1",
"js-beautify": "^1.10.2",
@ -62,6 +62,9 @@
"jsrsasign": "^10.3.0",
"jszip": "^3.7.0",
"jszip-utils": "^0.1.0",
"katex": "^0.16.21",
"markdown-it": "^14.1.0",
"markdown-it-highlightjs": "^4.2.0",
"mavon-editor": "^2.9.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
@ -87,6 +90,7 @@
"vue-echarts": "^5.0.0-beta.0",
"vue-highlightjs": "^1.3.3",
"vue-image-crop-upload": "^2.5.0",
"vue-katex": "^0.5.0",
"vue-print-nb": "^1.7.5",
"vue-quill-editor": "^3.0.6",
"vue-resource": "^1.5.3",
@ -121,9 +125,11 @@
"eslint": "5.15.3",
"eslint-plugin-vue": "5.2.2",
"generate-asset-webpack-plugin": "^0.3.0",
"html-loader": "^5.1.0",
"http-proxy-middleware": "^0.19.1",
"husky": "1.3.1",
"lint-staged": "8.1.5",
"markdown-loader": "^8.0.0",
"plop": "2.3.0",
"sass": "1.32.13",
"sass-loader": "10.2.0",
@ -133,6 +139,7 @@
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.0",
"tasksfile": "^5.1.1",
"vue-markdown-loader": "^2.5.0",
"vue-template-compiler": "2.6.14"
},
"engines": {

2530
public/report/annual.htm
File diff suppressed because it is too large
View File

71
public/report/年报_files/anno.html
File diff suppressed because it is too large
View File

39
public/report/年报_files/annualReport_d_statisticalInformation_input.css

@ -0,0 +1,39 @@
@font-face { font-family: "Times New Roman"; }
@font-face { font-family: "宋体"; }
@font-face { font-family: "Wingdings"; }
@font-face { font-family: "Arial"; }
@font-face { font-family: "黑体"; }
@font-face { font-family: "Calibri"; }
@font-face { font-family: "仿宋"; }
@font-face { font-family: "Calibri Light"; }
p.MsoNormal { mso-style-name: ; mso-style-parent: ""; margin: 0pt; margin-bottom: .0001pt; mso-pagination: none; text-align: justify; text-justify: inter-ideograph; font-family: Calibri; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-size: 15.0000pt; mso-font-kerning: 1.0000pt; }
h1 { mso-style-name: "标题 1"; mso-style-next: ; margin-top: 17.0000pt; margin-bottom: 16.5000pt; page-break-after: avoid; mso-pagination: lines-together; text-align: justify; text-justify: inter-ideograph; mso-outline-level: 1; line-height: 240%; font-family: Calibri; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-weight: bold; font-size: 22.0000pt; mso-font-kerning: 22.0000pt; }
h2 { mso-style-name: "标题 2"; mso-style-next: ; margin-top: 13.0000pt; margin-bottom: 13.0000pt; page-break-after: avoid; mso-pagination: lines-together; text-align: justify; text-justify: inter-ideograph; mso-outline-level: 2; line-height: 150%; font-family: Arial; mso-fareast-font-family: ; mso-bidi-font-family: ; font-weight: bold; font-size: 16.0000pt; mso-font-kerning: 1.0000pt; }
span.10 { font-family: 'Times New Roman'; }
span.15 { font-family: 'Times New Roman'; color: rgb(51, 51, 51); }
span.16 { font-family: 'Times New Roman'; color: rgb(5, 99, 193); text-decoration: underline; text-underline: single; }
span.17 { font-family: ; color: rgb(255, 0, 0); font-size: 9.0000pt; }
span.18 { font-family: ; color: rgb(0, 0, 0); font-size: 9.0000pt; }
p.MsoToc2 { mso-style-name: "目录 2"; mso-style-next: ; margin-left: 21.0000pt; mso-para-margin-left: 2.0000gd; mso-pagination: none; text-align: justify; text-justify: inter-ideograph; font-family: Calibri; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-size: 15.0000pt; mso-font-kerning: 1.0000pt; }
p.MsoHeader { mso-style-name: ; margin: 0pt; margin-bottom: .0001pt; border-top: none; mso-border-top-alt: none; border-right: none; mso-border-right-alt: none; border-bottom: none; mso-border-bottom-alt: none; border-left: none; mso-border-left-alt: none; padding: 1pt 4pt 1pt 4pt; layout-grid-mode: char; mso-pagination: none; text-align: justify; text-justify: inter-ideograph; font-family: Calibri; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-size: 9.0000pt; mso-font-kerning: 1.0000pt; }
p.MsoFooter { mso-style-name: ; margin: 0pt; margin-bottom: .0001pt; layout-grid-mode: char; mso-pagination: none; text-align: left; font-family: Calibri; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-size: 9.0000pt; mso-font-kerning: 1.0000pt; }
p.22 { mso-style-name: ; mso-style-parent: "标题 2"; mso-style-next: ; margin-top: 12.0000pt; margin-bottom: 3.2000pt; page-break-after: avoid; mso-pagination: lines-together; text-align: center; mso-outline-level: 2; line-height: 132%; font-family: Arial; mso-fareast-font-family: 仿; mso-bidi-font-family: ; font-weight: bold; font-size: 16.0000pt; mso-font-kerning: 1.0000pt; }
p.23 { mso-style-name: "TOC 标题1"; mso-style-noshow: yes; mso-style-parent: "标题 1"; mso-style-next: ; margin-top: 12.0000pt; margin-bottom: 0.0000pt; page-break-after: avoid; mso-pagination: widow-orphan lines-together; text-align: left; line-height: 107%; font-family: 'Calibri Light'; mso-fareast-font-family: ; mso-bidi-font-family: ; color: rgb(45, 115, 179); font-weight: normal; font-size: 16.0000pt; }
span.msoIns { mso-style-type: export-only; mso-style-name: ""; text-decoration: underline; text-underline: single; color: blue; }
span.msoDel { mso-style-type: export-only; mso-style-name: ""; text-decoration: line-through; color: red; }
table.MsoNormalTable { mso-style-name: ; mso-style-parent: ""; mso-style-noshow: yes; mso-tstyle-rowband-size: 0; mso-tstyle-colband-size: 0; mso-padding-alt: 0.0000pt 5.4000pt 0.0000pt 5.4000pt; mso-para-margin: 0pt; mso-para-margin-bottom: .0001pt; mso-pagination: widow-orphan; font-family: 'Times New Roman'; font-size: 10.0000pt; mso-ansi-language: #0400; mso-fareast-language: #0400; mso-bidi-language: #0400; }
table.MsoTableGrid { mso-style-name: ; mso-tstyle-rowband-size: 0; mso-tstyle-colband-size: 0; mso-padding-alt: 0.0000pt 5.4000pt 0.0000pt 5.4000pt; mso-border-top-alt: 0.5000pt solid windowtext; mso-border-left-alt: 0.5000pt solid windowtext; mso-border-bottom-alt: 0.5000pt solid windowtext; mso-border-right-alt: 0.5000pt solid windowtext; mso-border-insideh: 0.5000pt solid windowtext; mso-border-insidev: 0.5000pt solid windowtext; mso-para-margin: 0pt; mso-para-margin-bottom: .0001pt; mso-pagination: none; text-align: justify; text-justify: inter-ideograph; font-family: 'Times New Roman'; font-size: 10.0000pt; mso-ansi-language: #0400; mso-fareast-language: #0400; mso-bidi-language: #0400; }
@page { mso-page-border-surround-header: no; mso-page-border-surround-footer: no; }
@page Section0 { margin-top: 70.8500pt; margin-bottom: 70.8500pt; margin-left: 62.3500pt; margin-right: 62.3500pt; size: 595.3000pt 841.9000pt; layout-grid: 15.6000pt; }
div.Section0 { page: Section0; }
.datainput { height: 14pt; height: 14.8px \9; /*解决ie 6 7 8 9样式*/ border: 1px #ccc solid; width: 60pt; margin: 0; vertical-align: middle; text-align: center; }
@media \\0 screen {.datainput { height: 18px;}}
@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution: .001dpcm) {.datainput { /* height: 14px; */}}
@media screen and (-moz-images-in-menus:0) {.datainput { height: 14pt;}}
@media screen and (min--moz-device-pixel-ratio:0) {.datainput { height: 14.8px;}}
/*解决ie10 ie11 edge样式*/
_:-ms-lang(x), .datainput { height: 14.8px; }
input.hasError { border: 1px solid red !important; background: #FCD2D2; color: red; }
input.readOnly { background: #eee;border: 1px #ccc solid }
.layui-main.layui-border-box .layui-form{overflow: auto;height:100%;width: 100%;}
.layui-main.layui-border-box{padding-bottom: 70px;background-color: #fff;}

806
public/report/年报_files/common.css

@ -0,0 +1,806 @@
@import url("../font/awesome/css/all.css");
/* 超大型屏幕(高分辨率桌面) */
@media screen and (min-width:1400px) {
.layui-container {width:1370px;}
.layui-hide-slg {display:none!important;}
.layui-show-slg-block {display:block!important;}
.layui-show-slg-inline {display:inline!important;}
.layui-show-slg-inline-block {display:inline-block!important;}
.layui-col-slg1,.layui-col-slg2,.layui-col-slg3,.layui-col-slg4,.layui-col-slg5,.layui-col-slg6,.layui-col-slg7,.layui-col-slg8,.layui-col-slg9,.layui-col-slg10,.layui-col-slg11,.layui-col-slg12 {float:left;}
.layui-col-slg1 {width:8.33333333%;}
.layui-col-slg2 {width:16.66666667%;}
.layui-col-slg3 {width:25%;}
.layui-col-slg4 {width:33.33333333%;}
.layui-col-slg5 {width:41.66666667%;}
.layui-col-slg6 {width:50%;}
.layui-col-slg7 {width:58.33333333%;}
.layui-col-slg8 {width:66.66666667%;}
.layui-col-slg9 {width:75%;}
.layui-col-slg10 {width:83.33333333%;}
.layui-col-slg11 {width:91.66666667%;}
.layui-col-slg12 {width:100%;}
/* 列偏移 */
.layui-col-slg-offset1 {margin-left:8.33333333%;}
.layui-col-slg-offset2 {margin-left:16.66666667%;}
.layui-col-slg-offset3 {margin-left:25%;}
.layui-col-slg-offset4 {margin-left:33.33333333%;}
.layui-col-slg-offset5 {margin-left:41.66666667%;}
.layui-col-slg-offset6 {margin-left:50%;}
.layui-col-slg-offset7 {margin-left:58.33333333%;}
.layui-col-slg-offset8 {margin-left:66.66666667%;}
.layui-col-slg-offset9 {margin-left:75%;}
.layui-col-slg-offset10 {margin-left:83.33333333%;}
.layui-col-slg-offset11 {margin-left:91.66666667%;}
.layui-col-slg-offset12 {margin-left:100%;}
}
/** 图标字体
@font-face {
font-family: 'unis-icon';
src: url('../font/iconfont.eot?v=0.1');
src: url('../font/iconfont.eot?v=0.1#iefix') format('embedded-opentype'),
url('../font/iconfont.woff2?v=0.1') format('woff2'),
url('../font/iconfont.woff?v=0.1') format('woff'),
url('../font/iconfont.ttf?v=0.1') format('truetype'),
url('../font/iconfont.svg?v=0.1#unis-icon') format('svg');
}
.unis-icon{ font-family:"unis-icon" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
**/
/*框架业务内容区、弹窗里的页面高度都是100%*/
html, body { height: 100%; }
body {font-family: PingFangSC, PingFangSC-Regular, 'Microsoft YaHei', , STXihei, , Georgia, 'Times New Roman', serif;}
body {font-family: Tahoma,"Microsoft YaHei",;}
/* 去除firefox浏览器中tab键引起的虚线框 */
button::-moz-focus-inner,
input[type="color"]:-moz-system-metric(color-picker-available)::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
input[type="file"] > button[type="button"]::-moz-focus-inner{
border: 1px dotted transparent !important;
}
a{outline:none;}
/*调窗口宽高的时候用这个样式*/
.dialog_body_test {border: 1px solid #e2e3e8;height: 500px;width:300px;}
/*重写layui.css样式区*/
/*替换颜色 #5FB878 为 #0066CC*/
.layui-form-select dl {padding: 0;top: 32px;}
.layui-form-select dl dd.layui-this{color: #32363a;font-weight: 900;}
.layui-form-select dl dd {cursor: pointer;color: #32363a;}
.layui-form-select dl dd:hover{background-color: #f5f5f5;}
.layui-form-select .layui-edge {border-top-color: #74777a;}
.layui-form-checked, .layui-form-checked:hover{border-color: #1890ff;}
.layui-form-checked span, .layui-form-checked:hover span{background-color: #1890ff;}
.layui-form-checked i, .layui-form-checked:hover i{color: #1890ff;border-color: #1890ff;}
.layui-form-checkbox[lay-skin="primary"] span{background: none;color: #32363a;line-height: 13px;padding-right: 0px;height: 14px;}
.layui-form-checkbox[lay-skin="primary"]:hover i{border-color: #1890ff; color: #fff;}
.layui-form-checkbox i,.layui-form-checked i, .layui-form-checked:hover i{height: 30px;}
.layui-form-checkbox[lay-skin="primary"] i,.layui-form-checked[lay-skin="primary"] i,.layui-form-switch i{width: 18px;height: 18px;font-size: 14px;line-height: 16px;}
/* .layui-form-switch{height:18px;line-height:18px;width:30px;padding: 0px;} */
.layui-form-switch{padding: 0px;width: 35px;box-sizing:content-box;margin-top: 15px;background-color: #BFBFBF;border-color:#BFBFBF;}
.layui-form-switch i{top: 1px;margin-left:-3px;background-color: #fff;}
.layui-form-onswitch i{margin-left:-19px;}
.layui-form-onswitch.layui-disabled em{color: #999999 !important;}
.layui-form-onswitch.layui-disabled i{background-color: #d2d2d2;}
.layui-form-radio > i{font-size:19px;color:#bfbfbf;margin-right: 5px;vertical-align: -6px;border-radius: 50%;}
.layui-form-radio div{height: 14px;line-height: 12px;}
.layui-form-radioed>i,.layui-form-radio>i:hover{color: #1890ff;}
.layui-table-edit:focus{border-color: #0066CC!important;}
/* .layui-transfer-active .layui-btn{background-color: #0066CC; border-color: #0066CC; color: #fff;} */
.layui-nav-bar,.layui-nav .layui-this:after,.layui-nav-tree .layui-nav-itemed:after{background-color: #1890ff;}
.layui-nav-child{border-color: #d9d9d9;}
.layui-nav-child dd.layui-this{background-color: #1890ff; color: #fff;}
.layui-nav .layui-nav-child dd.layui-this a{background-color: #1890ff; color: #fff;}
.layui-breadcrumb a:hover{color: #0066CC !important;}
.layui-tab-card > .layui-tab-more .layui-this{background: none; color: #1890ff;}
/* .layui-disabled{background-color: #f2f2f2!important;color: #333!important;} */
/* 边框 #ccc替换为 #d9d9d9 */
.layui-btn-primary,
.layui-input,
.layui-textarea{border-color: #a1a7ae;color: #32363a;padding-right: 10px;}
.layui-form-select .layui-select-title .layui-input{border-color: #a1a7ae;color: #32363a;}
/*替换颜色 #009688 为 #0066CC*/
.layui-elem-quote{border-left: 5px solid #1890ff;}
/* .layui-btn-group .layui-btn-primary:hover{border-color: #C9C9C9; color: #0066CC;} */
.layui-upload-drag .layui-icon{color: #1890ff;}
.layui-upload-drag[lay-over]{border-color: #1890ff}
/* .layui-nav-tree .layui-this,
.layui-nav-tree .layui-this>a,
.layui-nav-tree .layui-this>a:hover,
.layui-nav-tree .layui-nav-child dd.layui-this,
.layui-nav-tree .layui-nav-child dd.layui-this a{background-color: #1890ff; color: #fff;}
.layui-nav-tree .layui-nav-bar{background-color: #1890ff;} */
.layui-tab-brief > .layui-tab-title .layui-this{color: #1890ff;}
.layui-slider-input-btn i:hover{color: #1890ff;}
/* 按钮的禁用 */
.layui-btn-disabled{background-color: #f5f5f5;}
button.layui-btn.layui-btn-normal[disabled]{background-color: #A3D3FF;border-color: #A3D3FF;}
button.layui-btn[disabled]{background-color: #f5f5f5;cursor: not-allowed}
button.layui-btn.layui-btn-primary[disabled]:hover{border-color: #bfbfbf !important;color: #32363a !important;}
.layui-form-danger:focus{border-color: #bb0000 !important;}
/*灰*/
.layui-bg-gray { background-color: #DDDDDD !important; color: #666 !important; }
.layui-btn{line-height:31px;height: 35px;padding: 0 16px;}
.layui-btn-lg{line-height:40px;}
.layui-btn-sm{line-height:26px;height: 30px;}
.layui-btn-xs{line-height:18px;}
/*修改数据表格*/
.layui-table-view .layui-table th, .layui-table-view .layui-table td{padding:0;}
.layui-table-view .layui-table td{border-top-width:0;border-bottom-width:0; color: #32363a;}
.layui-table-cell{height:38px;line-height:38px;padding: 0 10px;}
.layui-table-cell .edoc-blocktag{margin-top: 9px;}
.laytable-cell-checkbox, .laytable-cell-radio, .laytable-cell-space, .laytable-cell-numbers{ padding: 0; }
.layui-table tbody tr[data-index]:hover, .layui-table-hover[data-index]{background-color: #fff7ca !important;}
.layui-table tbody tr:hover, .layui-table-hover{background: none;}
.layui-table-click{background-color: #fff7ca !important;}
.layui-table-header{background-color: #F2F2F2;}
.layui-table thead tr, .layui-table-header, .layui-table-tool, .layui-table-total, .layui-table-total tr, .layui-table-patch, .layui-table-mend, .layui-table[lay-even] tr:nth-child(even), .layui-table-click{background-color: #f2f2f2;}
.layui-table th, .layui-table td, .layui-table[lay-skin="line"], .layui-table[lay-skin="row"], .layui-table-view, .layui-table-tool, .layui-table-header, .layui-table-col-set, .layui-table-total, .layui-table-page, .layui-table-fixed-r, .layui-table-tips-main, .layui-table-grid-down {border-color: #d9d9d9;}
.layui-table th {color: #6a6d70;}
/* 选项卡 */
.layui-tab {margin-top:0;}
.layui-tab.layui-tab-brief > .layui-tab-title .layui-this::after {height: 45px;}
.layui-tab.layui-tab-brief > .layui-tab-title .layui-this:after,.layui-tab.layui-tab-brief > .layui-tab-title .layui-this after{height: 45px;}/* IE8支持 */
.edoc-tab-box .layui-tab.layui-tab-brief .layui-tab-title{height: 45px;line-height: 45px;margin:6px 10px 0px 20px;border-color: #d9d9d9;}/* 标题高度 */
.edoc-tab-box .layui-tab.layui-tab-brief .layui-tab-title li{padding: 0 8px ;margin: 0 15px 0 0;height: 45px;line-height: 45px;color: #6a6d70;font-size:15px;font-weight:bold;}/* 标题的水平间距 */
.layui-tab.layui-tab-brief .layui-tab-title li{color: #6a6d70;}
.edoc-tab-box .layui-tab-content { padding: 5px 0 5px 5px; }
/* 卡片内分块——左右*/
.layui-tab-item .layui-main{top: 50px;border: 0px;}
/* 侧边的选项卡切换 */
.layui-side .layui-tab .layui-tab-title li {font-weight:bold;font-size:15px;}
.layui-side .layui-tab .layui-tab-title .layui-this {color:#1890ff;}
.layui-side .layui-tab .layui-tab-title .layui-this::after {height: 41px;}
.layui-side.edoc-side-w280 .layui-tab .layui-tab-title li{margin: 0 10px;}
.layui-side.edoc-side-w220 .layui-tab .layui-tab-title li{margin: 0;}
.layui-side.edoc-side-w250 .layui-tab .layui-tab-title li{margin: 0 5px;}
/* 对 disabled 样式重新定义 */
.layui-disabled.layui-input, .layui-disabled.layui-textarea{background:#f5f5f5 !important;border-color: #bfbfbf !important; color: #6a6d70 !important;}
.layui-disabled.layui-radio-disbaled{background:none !important;color: #74777a !important;}
.layui-radio-disbaled>i{color: #bfbfbf !important;background-color: #f5f5f5 !important;}
.layui-disabled.layui-form-switch.layui-checkbox-disbaled{background:#E5E5E5;border-color: #E5E5E5;}
.layui-disabled.layui-checkbox-disbaled.layui-form-checked i {color:#74777a !important;}
.layui-disabled.layui-checkbox-disbaled[lay-skin="primary"] i {background-color:#f5f5f5 !important;color:#f5f5f5 !important;}
.layui-disabled.layui-checkbox-disbaled[lay-skin="primary"]:hover i{border-color: #bfbfbf !important;}
.layui-disabled.layui-checkbox-disbaled[lay-skin="primary"].layui-form-checked i {background-color:#f5f5f5 !important;color: #bfbfbf !important;border-color: #bfbfbf !important;}
.layui-disabled.layui-checkbox-disbaled[lay-skin="_switch"] i {background-color: #ffffff !important;}
.layui-disabled.layui-checkbox-disbaled[lay-skin="_switch"].layui-form-onswitch i {background-color:#FFFFFF !important;}
/*重写layui.css样式区*/
/*border边框*/
.edoc-border { border: 1px solid #d9d9d9;}
.edoc-border-t {border-top: 1px solid #d9d9d9;}
.edoc-border-r {border-right: 1px solid #d9d9d9;}
.edoc-border-b {border-bottom: 1px solid #d9d9d9;}
.edoc-border-l {border-left: 1px solid #d9d9d9;}
.edoc-border-tb {border-top: 1px solid #d9d9d9;border-bottom: 1px solid #d9d9d9;}
.edoc-border-lr {border-left: 1px solid #d9d9d9;border-right: 1px solid #d9d9d9;}
/*padding边距*/
.edoc-padding-l-0 { padding-left: 0 !important;}
.edoc-padding-l-5 { padding-left: 5px !important;}
.edoc-padding-l-10 { padding-left: 10px !important;}
.edoc-padding-l-15 { padding-left: 15px !important;}
.edoc-padding-r-0 { padding-right: 0 !important;}
.edoc-padding-r-5 { padding-right: 5px !important;}
.edoc-padding-r-10 { padding-right: 10px !important;}
.edoc-padding-r-15 { padding-right: 15px !important;}
.edoc-padding-t-0 { padding-top: 0 !important;}
.edoc-padding-t-5 { padding-top: 5px !important;}
.edoc-padding-t-10 { padding-top: 10px !important;}
.edoc-padding-t-15 { padding-top: 15px !important;}
.edoc-padding-b-0 { padding-bottom: 0 !important;}
.edoc-padding-b-5 { padding-bottom: 5px !important;}
.edoc-padding-b-10 { padding-bottom: 10px !important;}
.edoc-padding-b-15 { padding-bottom: 15px !important;}
.edoc-padding-lr-0 { padding-left: 0 !important; padding-right: 0 !important;}
.edoc-padding-lr-5 { padding-left: 5px !important; padding-right: 5px !important;}
.edoc-padding-lr-10 { padding-left: 10px !important; padding-right: 10px !important;}
.edoc-padding-lr-15 { padding-left: 15px !important; padding-right: 15px !important;}
/*margin边距*/
.edoc-margin-l-0 { margin-left: 0 !important;}
.edoc-margin-l-5 { margin-left: 5px !important;}
.edoc-margin-l-10 { margin-left: 10px !important;}
.edoc-margin-l-15 { margin-left: 15px !important;}
.edoc-margin-l-30 { margin-left: 30px !important;}
.edoc-margin-r-0 { margin-right: 0 !important;}
.edoc-margin-r-5 { margin-right: 5px !important;}
.edoc-margin-r-10 { margin-right: 10px !important;}
.edoc-margin-r-15 { margin-right: 15px !important;}
.edoc-margin-r-30 { margin-right: 30px !important;}
.edoc-margin-t-0 { margin-top: 0 !important;}
.edoc-margin-t-5 { margin-top: 5px !important;}
.edoc-margin-t-10 { margin-top: 10px !important;}
.edoc-margin-t-15 { margin-top: 15px !important;}
.edoc-margin-t-30 { margin-top: 30px !important;}
.edoc-margin-b-0 { margin-bottom: 0 !important;}
.edoc-margin-b-5 { margin-bottom: 5px !important;}
.edoc-margin-b-10 { margin-bottom: 10px !important;}
.edoc-margin-b-15 { margin-bottom: 15px !important;}
.edoc-margin-b-30 { margin-bottom: 30px !important;}
.edoc-margin-lr-0 { margin-left: 0 !important; margin-right: 0 !important;}
.edoc-margin-lr-5 { margin-left: 5px !important; margin-right: 5px !important;}
.edoc-margin-lr-10 { margin-left: 10px !important; margin-right: 10px !important;}
.edoc-margin-lr-15 { margin-left: 15px !important; margin-right: 15px !important;}
.edoc-margin-lr-30 { margin-left: 30px !important; margin-right: 30px !important;}
/* 通用宽度 */
.edoc-width-xs{width: 104px !important;}
.edoc-width-s{width: 216px !important;}
.edoc-width-m{width: 328px !important;}
.edoc-width-l{width: 440px !important;}
.edoc-width-xl{width: 552px !important;}
/*灰色说明性文字*/
.edoc-introduce{color: #32363a;font-size:12px;font-style: normal;font-weight: 400;margin-left: 15px;}
.edoc-form-header .edoc-introduce {font-size: 14px;color:#8c8c8c;vertical-align: top;}
/*操作链接增加下划线*/
.edoc-underline{display: inline;border-bottom: 1px #1890ff solid;text-decoration: none !important; }
/* 定义占位文字样式 */
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #bfbfbf; opacity: 1; }
input:-moz-placeholder, textarea:-moz-placeholder { color: #bfbfbf; opacity: 1; }
input::-moz-placeholder, textarea::-moz-placeholder { color: #bfbfbf; opacity: 1; }
input:-ms-input-placeholder, textarea:-ms-input-placeholder { color: #bfbfbf; opacity: 1; }
/* 主体内容区域内边距 */
.edoc-body-padding{padding:15px;}
/* 页面背景 */
body {background-color:#FFFFFF;overflow:hidden;}
/* 页面主外框 */
.layui-main {position:absolute;top:0;right:0;bottom:0;left:0;margin:0;width:auto;background:#f2f2f2;}
/* 页面头部区域(内部含左右布局) */
.layui-header {line-height:44px;height:50px;}
.layui-header .layui-layout-left {left:0;bottom:0;margin:2px 0 0 18px;font-size:20px;font-weight:bold;color:#32363a;}
.layui-header .layui-layout-right {bottom:0;margin-right:10px;}
.layui-header .layui-layout-right .far.fa-question-circle{font-size:16px;cursor:pointer;color:#6a6d70;}
/* 左侧头部帮助图标 */
.edoc_helpManage_Icon{background: none;padding: 0px;display: inline-block;vertical-align: middle;}
.edoc_helpManage_Icon>.layui-nav-bar{display: none;}
.edoc_helpManage_Icon>.layui-nav-item{line-height: 52px;}
.edoc_helpManage_Icon>.layui-nav-item>a{padding: 0px;}
.edoc_helpManage_Icon>.layui-nav-item>dl.layui-nav-child{top: 40px;position: fixed;min-width: auto;}
.edoc_helpManage_Icon>.layui-nav-item>dl.layui-nav-child a{cursor: pointer;}
.edoc_helpManage_Icon .layui-nav-child dd.layui-this{background: none;}
.edoc_helpManage_Icon .layui-nav-child dd.layui-this a{background: none;color: #333333;}
.edoc_helpManage_Icon .far.fa-question{font-weight: 900;font-size:14px;cursor:pointer;color:#74777a;}
.edoc-side-w280 .edoc_helpManage_Icon>.layui-nav-item>dl.layui-nav-child{left: 254px;}
.edoc-side-w250 .edoc_helpManage_Icon>.layui-nav-item>dl.layui-nav-child{left: 224px;}
.edoc-side-w220 .edoc_helpManage_Icon>.layui-nav-item>dl.layui-nav-child{left: 194px;}
/* 页面侧边区域 */
.layui-side {position:absolute;}
.layui-side.edoc-side-w220{width:220px;}
.layui-side.edoc-side-w250{width:250px;}
.layui-side.edoc-side-w280{width:280px;}
.layui-side.down-left {top:50px;padding:10px;box-sizing:border-box;}
.layui-side hr{margin:5px 0px;}
.layui-side hr.first{margin-top:0;display:none;}
.layui-side .layui-tab .layui-tab-title{margin:0 10px;}
.layui-side .layui-tab .layui-tab-title li{padding:0 1px;}
.layui-side .layui-tab .layui-tab-content{padding:5px 0;}
.layui-side .layui-side-addnew{margin: 0 10px 10px 28px;line-height: 40px;height: 40px;font-size: 14px;color: #333333;cursor: pointer;}
.layui-side.edoc-border-r{border-width:0px;}
/* 页面主内容区域 */
.layui-body{background:#fff;margin:15px 15px 15px 7px;box-shadow:0 4px 6px 0 rgba(31,31,31,0.05),0 0 2px 0 rgba(31,31,31,0.2);}
.layui-body.edoc-body-w220{left:220px;}
.layui-body.edoc-body-w250{left:250px;}
.layui-body.edoc-body-w280{left:280px;}
.layui-body.down {left:0;top:50px;background-color:#f2f2f2;}
.layui-body.down-right {top:50px;}
.layui-body.full {left: 0;}
.layui-body .layui-table-view{margin:10px 0 0 0;}
/* 表格区域 */
.edoc-table-wrap{position:relative;}
/* 表格头部按钮行区域 */
.edoc-table-top-block {position:relative;height:30px;}
.edoc-table-top-block .layui-layout-left {left:0;}
/* 表格头部按钮行区域 -- 批量操作菜单 */
.edoc-table-top-block .layui-nav {background-color:#FFFFFF;color:#333333;height:30px;padding:0;display:inline-block;border:1px solid #bfbfbf;vertical-align:5px;z-index:999;}
.edoc-table-top-block .layui-nav-bar {display:none;}
.edoc-table-top-block .layui-nav .layui-nav-item {line-height:30px;width:90px;box-sizing: border-box;}
.edoc-table-top-block .layui-nav .layui-nav-item>a {color:#32363a;font-size:12px;text-align:left;margin-right: 12px;padding: 0 12px;}
.edoc-table-top-block .layui-nav .layui-nav-more {border-top-color:#74777a;right:12px;}
.edoc-table-top-block .layui-nav-child {top:31px;padding:0;}
.edoc-table-top-block .layui-nav-child hr{padding:0;margin:0;}
/* 表格头部按钮行区域 -- 按钮容器 */
.edoc-table-top-block .layui-btn-container {display: inline-block;margin-left:15px;}
/* 表格头部按钮行区域 -- 下拉框容器 */
.edoc-table-top-block .edoc-table-select {display: inline-block ;vertical-align: middle; margin-left:10px;}
/* 表格头部按钮行区域 -- 下拉框 */
.edoc-table-top-block .layui-form-select .layui-input{height: 30px;text-align:left;}
/* 表格头部按钮行区域 -- 搜索框样式 */
.edoc-table-top-block .edoc-table-searchBox{float:right;}
.edoc-table-top-block .edoc-table-searchBox i{position:relative;left:27px;z-index:999;color: #74777a;}
.edoc-table-top-block .layui-input-search {position:relative;display:inline-block;width:512px;height:30px;border:1px solid #bfbfbf;padding: 0 10px 0 30px;}
.edoc-table-top-block .layui-input-search+i {position:absolute;top:7px;left:10px;color: #6a6d70;z-index: 1000;font-size: 12px;}
.edoc-table-top-block .layui-btn-link{margin:0 14px;}
.edoc-table-top-block .layui-btn-link.open .layui-btn-link-more{top: 1px;border-color:transparent transparent #797979;}
.edoc-table-top-block .layui-btn-link.open:hover .layui-btn-link-more{border-color:transparent transparent #0066CC;}
.edoc-table-top-block .edoc-btn-search {margin-left:2px;vertical-align:top;}
/* 表格头部按钮行区域 -- radio过滤容器 */
.edoc-table-top-block .edoc-table-status{float: right;margin-top: -5px;}
/* 表格头部按钮行区域 -- 列过滤样式 */
.edoc-table-top-block .cols-filter{ width:30px; height: 30px; border: 1px solid #bfbfbf; color: #6a6d70; margin-left: 10px; padding: 3px; cursor: pointer;position: relative; display: inline-block;}
.edoc-table-top-block .cols-filter .layui-table-tool-panel{left:auto;right:-1px;}
/* 表格头部高级搜索区域 */
.edoc-advance-query-block{margin-top:15px;transition:height .2s;-webkit-transition:height .2s;}
.edoc-advance-query-block.edoc-hide{height:0;margin:0;border-width:0;overflow:hidden;}
.edoc-advance-query-block.edoc-show{height:200px;}
/* 强行调整原生表格工具栏的位置 */
/* .edoc-table-wrap .layui-table-tool{position:absolute;width:30px;top:0;right:0;background-color:transparent;padding:0;min-height:30px;border:none;}
.edoc-table-wrap .layui-table-tool .layui-table-tool-temp{display:none;}
.edoc-table-wrap .layui-table-tool .layui-table-tool-self{top:0;right:0;}
.edoc-table-wrap .layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{width:30px;height:30px;margin:0;}
.edoc-table-wrap .layui-table-tool .layui-table-tool-self .layui-inline[lay-event]:hover{border-color:#0066CC;color:#0066CC;} */
/* 无头表格头部行样式 */
.edoc-table-wrap .layui-table-view.edoc-noheader{border:none;}
.edoc-table-wrap .layui-table-view.edoc-noheader .layui-table-header{background:none;border:none;}
.edoc-table-wrap .layui-table-view.edoc-noheader .layui-table-header tr{background:none;}
.edoc-table-wrap .layui-table-view.edoc-noheader .layui-table-header th{color:#999999;font-style:italic}
/* 定义表格操作列更多按钮样式 */
.edoc-table-more-btn-wrap { display:none; position:absolute; box-shadow:0 2px 4px rgba(0,0,0,.12); border:1px solid #d2d2d2; background-color:#fff; border-radius:2px; box-sizing:border-box; color:#333333; font-size:14px; line-height:36px; text-align:left; white-space:nowrap; z-index:999; }
.edoc-table-more-btn-wrap .edoc-table-more-btn{cursor:pointer;padding:0 10px;}
.edoc-table-more-btn-wrap .edoc-table-more-btn:not(.layui-disabled):hover {background-color:#f2f2f2;}
.edoc-table-more-btn-wrap .edoc-table-more-btn.haschild{position:relative;padding-right:26px;}
.edoc-table-more-btn-wrap .edoc-table-more-btn.haschild span{padding-right:5px;}
/* .edoc-table-more-btn-wrap .edoc-table-more-btn.haschild .edoc-table-more-btn-wrap{left:97%;} */
.edoc-table-more-btn-wrap .edoc-table-more-btn i{position:absolute;right:10px;}
.edoc-table-more-btn-wrap hr {padding:0;margin:0;}
/* 表格头部行内图标样式 */
.edoc-table-wrap .layui-table-header .layui-icon{font-size:14px;padding-left: 3px;}
/* 表格头部行内全选框样式 */
.edoc-table-wrap .layui-table-header .layui-icon.layui-icon-ok{padding-left: 0px;}
/* 表格内容悬浮按钮样式 */
.table-cell-auto-link{display:none;}
.layui-table-hover .table-cell-auto-link{display:inline-block;}
.layui-table-cell .layui-input{height:28px;margin-top:6px;}
/* 业务数据表格预览内容样式 */
.edoc-preview-window{display:none;padding:10px 20px;}
/* 表格内部的radio样式 */
.layui-table-view .layui-form-radio > i{margin: 0 2px 0 0;line-height: 28px;}
.layui-table-view .layui-form-switch, .layui-table-view .layui-form-checkbox, .layui-table-view .layui-form-radio{margin: 0 5px 0 0;}
.layui-table tbody .layui-form-switch{height: 20px;line-height: 20px;width: 35px;}
.layui-table tbody tr td[align="center"] .layui-form-switch{margin-left: 0;margin-right: 0; display: inline-block;}
/* 表格的单选框列,复选框列的样式 */
.laytable-cell-checkbox {padding:12px 16px 10px;}
.laytable-cell-radio{padding:6px 10px;}
.laytable-cell-checkbox .layui-form-checkbox,.laytable-cell-radio .layui-form-radio{margin: 0 !important;padding: 0 !important;display: block !important;}
/* 表格的固定列的隐藏滚动条样式 */
.layui-table-body.soul-fixed-scroll{overflow: hidden !important;}
/* 表格的分页 */
/* .layui-table-page > div,.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{margin-left:10px;} */
.layui-table-page .layui-laypage input{margin-top: 0px;}
.layui-table-page .layui-laypage button{line-height: 22px;}
.layui-table-page .layui-laypage-limits select[lay-ignore] ,.layui-table-view .layui-table-page select[lay-ignore] {background-color: #fff;}
.layui-table-page .layui-laypage input::-webkit-outer-spin-button,
.layui-table-page .layui-laypage input::-webkit-inner-spin-button {-webkit-appearance: none;}
.layui-table-page .layui-laypage input[type="number"]{-moz-appearance: textfield;}
.layui-table-page .layui-laypage input {width: 58px;}
.layui-table-page .layui-laypage .layui-laypage-refresh{margin-left: 0px;}
.layui-table-page .layui-laypage .layui-laypage-refresh{padding: 0px 5px;}
/* 表格头部排序按钮 */
.layui-table-sort .layui-edge{left:0;}
.layui-table-sort .layui-table-sort-asc{border-bottom-color: #bfbfbf;}
.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color: #6A6D70;}
.layui-table-sort .layui-table-sort-desc{border-top-color: #bfbfbf;}
.layui-table-sort .layui-table-sort-desc:hover{border-top-color: #6a6d70;}
.layui-table-sort[lay-sort="asc"] .layui-table-sort-asc{border-bottom-color: #6A6D70;}
.layui-table-sort[lay-sort="desc"] .layui-table-sort-desc{border-top-color: #6a6d70;}
/* 表格底部分页 */
.layui-table-page .layui-laypage button{line-height: 23px;}
/* 添加新的按钮样式 */
.edoc-btn:hover{opacity: 1 !important;}
.layui-btn:hover{opacity: 1 !important;}
.edoc-btn.layui-btn-primary{background-color: #ffffff;}
.layui-btn-link{position:relative;display:inline-block;height:25px;line-height:30px;margin-left:5px;color:#1890ff;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;}
.layui-btn-link.gray{color:#797979;}
.layui-btn-link:hover{color:#40a9ff;}
.layui-btn-link .layui-btn-link-more{position:absolute;top:12px;right:-14px;content:'';display:block;width:0;height:0;border-width:6px;border-style:solid;border-color:#797979 transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;}
.layui-btn-link:hover .layui-btn-link-more{border-color:#1890ff transparent transparent;}
/* 字段集区块样式 */
/* .layui-elem-field {margin: 0;border-color: #e2e2e8;} */
/* .layui-elem-field legend {margin:0 30px;padding:3px 10px; font-size:16px; color: #999999;background:#f2f2f2; } */
/* .layui-elem-field legend a{color: #999999;} */
/* .layui-field-title {border-style:dashed;} */
.layui-elem-field {border-color: #d9d9d9;}
.layui-elem-field legend {font-size: 20px;color: #32363a;}
.layui-elem-field legend a{color: #32363a;cursor: auto;}
/* 内容分区块 */
.edoc-card .layui-card-header{height:16px;line-height:16px;font-style: normal;color:#000;font-size: 16px;padding: 0px;border: 0px;}
.edoc-card{padding: 0px 0px 30px 0px;margin:0px;box-shadow:none;}
.edoc-card .edoc-introduce{font-size: 14px;color: #8c8c8c;margin-left: 15px;}
.edoc-card .layui-card-body{padding: 0px;margin-top: 15px;color: #32363a;line-height: 14px;font-size: 14px;}
.edoc-card .layui-card-body>li{margin-top: 15px;}
.edoc-card a{color: #1890ff;}
/* 内容分区块边框和单选框测试样式 */
.edoc-test1{border: 1px solid #d7d7d7;width: 600px;margin-top: 20px;margin-left: 20px;padding: 15px;}
.edoc-card .layui-form-radio{display: block;}
/*栏目或分类*/
.edoc-navOpt {background-color:#f2f2f2;width:auto;margin: 0;}
/* 栏目的效果 */
.edoc-navOpt>.layui-nav-item {line-height:45px;position: relative;}
.edoc-navOpt .layui-nav-item>a:hover{background: none;}
.edoc-navOpt .layui-nav-item a{color:#32363a;height:45px;line-height:45px;padding-left:25px;box-sizing: border-box;transition: none;-webkit-transition: none;overflow: visible;}
.edoc-navOpt .layui-nav-item a:first-child>p{display: inline-block;vertical-align: top;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;max-width: 100px;}
.edoc-navOpt .layui-this>a:before {content:"";position:absolute;top:0px;right:0px;bottom:0px;width:4px;height:100%;margin-top:0px;z-index:1;}
.edoc-navOpt>.layui-this{background: none !important;}
.edoc-navOpt a>i{display: inline-block;height: 45px;line-height: 48px;padding-right: 10px;vertical-align: top;}
.edoc-navOpt a>i.fa-square-full{font-weight: bold;}
.edoc-navOpt a>i:first-child{width: 18px;box-sizing: border-box;color: #6a6d70;font-size: 8px;}
/* 个性化图标 */
.edoc-navOpt.special_icon a>i{font-size: 14px;line-height: 45px;}
.edoc-navOpt.special_icon a>i:first-child{width: 24px;}
/* 二级栏目效果 */
.edoc-navOpt>.layui-nav-bar {display: none;}
.edoc-navOpt .layui-nav-itemed:hover{background-color:#f2f2f2;}
.edoc-navOpt .layui-nav-itemed:hover>a{color: #1890ff;}
.edoc-navOpt>.layui-nav-itemed dd{border-width:0;}
.edoc-navOpt>.layui-nav-itemed dd:hover{background:none;}
.edoc-navOpt>.layui-nav-itemed dd a:first-child{padding-left:50px;background-color: #f2f2f2;color: #32363a !important;}
.edoc-navOpt>.layui-nav-itemed>a{color:#32363a!important;}
.edoc-navOpt>.layui-nav-itemed>.layui-nav-child{background-color: #f2f2f2 !important;}
.edoc-navOpt>.layui-nav-itemed .edoc-nav-addnew{background-color: #f2f2f2;}
.edoc-navOpt>.layui-nav-itemed .edoc-nav-addnew.layui-this a:before{content: "";position: absolute;top: 0px;left: 2px;bottom: 0px;width: 4px;height: 100%;margin-top: 0px;background-color: #f2f2f2;z-index: 1;}
.edoc-navOpt>.layui-nav-itemed .edoc-nav-addnew .layui-btn-link{color: #1890ff;background-color: #f2f2f2;padding-left: 36px;}
.edoc-navOpt .layui-nav-child{background-color: #f2f2f2 !important;}
/* 三级栏目 */
.edoc-navOpt>.layui-nav-item>.layui-nav-child .layui-nav-child a{padding:0px 20px 0px 70px;margin: 0px;}
.edoc-navOpt>.layui-nav-item>.layui-nav-child .layui-nav-child .edoc-nav-addnew .layui-btn-link{color: #1890ff !important;}
/* 带子栏目项的箭头 */
.edoc-navOpt.layui-nav .layui-nav-more{border: none;font-size: 16px;right: 20px;top:16px;height: 12px;width: 10px;border-width: 0px;margin: 0px !important;color: #6a6d70;}
/* 栏目中每项的右侧元素 */
.edoc-navOpt .layui-nav-item .edoc-navOpt-r{color: #bb0000;font-style: normal;width: auto;}
/* 操作图标 */
.edoc-navOpt .edoc-navOpt-more{padding: 0px;position: absolute;top: 0px;right: 10px;}
.edoc-nav-icon{display: inline-block;vertical-align: top;height: 20px;position: relative;top: 15px;line-height: 17px;padding-left: 10px;}
.edoc-nav-icon>.layui-icon{padding: 8px 2px;}
.edoc-nav-icon>.layui-icon-more{padding: 8px;}
.edoc-nav-icon.edoc-nav-icon-show{float: right;padding: 5px 0 0 5px;height: 30px;margin-top: -5px;margin-right: -8px;}
/* 悬浮菜单 */
.edoc-navOpt #twoNavOpt .layui-anim{background-color: #fff;box-shadow: 0 2px 4px rgba(0,0,0,.1);border: 1px solid #d9d9d9;border-radius: 2px;}
.edoc-navOpt #twoNavOpt .layui-anim>div{padding-left: 15px;}
.edoc-navOpt #twoNavOpt>div{position: fixed;text-align: left;line-height: 36px;background-color: rgba(0,0,0,0);box-sizing: border-box;color: #32363a;font-size: 12px;z-index: 999;right: 5px;visibility: hidden;}
.edoc-navOpt #twoNavOpt .layui-anim>div:hover{background-color: #f5f5f5;cursor: pointer;}
/* 时间线 */
.timeLine-demo{width: 350px;height: 500px;padding: 20px 10px;border: 1px solid #cccccc;margin: 20px;float: left;}
.edoc-timeline>.layui-timeline-item{padding-bottom: 25px;}
.edoc-timeline>.layui-timeline-item>i{line-height: 20px;}
.edoc-timeline>li>.layui-icon{font-size: 14px;}
.edoc-timeline>li>.layui-text>.layui-timeline-title{font-weight: 400; font-style: normal; color: #74777a;}
.edoc-timeline>.edoc-timeline-item-last:before{ display: none;}
.edoc-timeline .layui-text {line-height: 18px;padding-left: 26px;}
.edoc-timeline>.layui-timeline-item .edoc-timeline-content{color: #32363a;}
.layui-timeline-axis:hover{color: #1890ff;}
.edoc-timeline .fas.fa-check-circle,
.edoc-timeline .fas.fa-times-circle,
.edoc-timeline .fas.fa-paper-plane{font-weight: 400;font-size: 18px;height: 38px;line-height: 38px;top: -8px;}
.edoc-timeline .edoc-timeline-endIcon.fas.fa-check-circle{font-weight: 900;}
.edoc-timeline .fas.fa-times-circle{color: #bb0000 !important;}
/* 时间线—标题—操作 */
.edoc-timeline>.layui-timeline-item .edoc-timeline-title-opt{color: #6a6d70;font-size: 14px;}
.edoc-timeline>.layui-timeline-item .edoc-timeline-title-date{color: #74777a;font-size: 14px;font-family: Tahoma;}
.edoc-timeline>.layui-timeline-item .edoc-timeline-title-user{color: #74777a;font-size: 14px;}
/* --分界线-- */
/* 表单页面,上下结构 */
.edoc-form .layui-input,.edoc-form .layui-textarea,.edoc-form .layui-select{height: 35px;line-height: 35px;margin-top: 15px;}
.edoc-sign-red{color: #bb0000;margin-left: 5px;}
.edoc-form-header{width:100%;margin: 0px 0px 0px 0px;height:16px;line-height: 16px;}
.edoc-form .layui-form-label{width:auto;color: #000;text-align: left;padding: 0px;font-size:16px;line-height: 18px;margin-top: -2px;}
.edoc-form .layui-form-item{padding: 0px 0px 10px 0px;margin-bottom: 0px;}
.edoc-form .edoc-form-two{float: left;width: 50%;}
/* .edoc-form input{color: #32363a;} */
.edoc-form .layui-form-radio {margin-top: 15px;line-height: 14px;}
.layui-checkbox-disbaled[lay-skin="primary"] span{color: #32363a;}
.edoc-form .layui-form-checkbox[lay-skin="primary"] i{width: 16px;height: 16px;line-height: 16px;font-size: 10px;font-weight: 900;box-sizing: border-box;}
/* 表单多选框、下拉框、单选框*/
.edoc-form .layui-form-item .layui-form-checkbox[lay-skin="primary"]{margin-top: 15px;padding-left: 24px;min-height: 14px;}
.edoc-form div[lay-skin='primary']{display: block;padding-top:0px;}
.edoc-form div[lay-skin='primary'] .layui-icon{top: -1px;}
.edoc-form .layui-form-select .layui-anim{top: 37px;border-color: #d9d9d9;box-shadow:0 2px 4px rgba(0,0,0,.1)}
.edoc-form .layui-form-selectup .layui-anim{top: auto !important;bottom: 37px;}
.edoc-table-top-block .edoc-form .layui-form-select .layui-anim{top: 32px;}
.edoc-form .layui-form-radio{display: block;}
.edoc-form div[lay-skin='primary']>i{position: absolute;}
.edoc-form .layui-form-checkbox{display: block;margin-top: 15px;}
.edoc-form .layui-form-checkbox[lay-skin="primary"]{padding-left: 24px;}
.edoc-form .layui-form-checkbox>i{position: relative;}
.edoc-form .layui-form-switch{display: block;height: 20px;line-height: 20px;}
.edoc-form .layui-form-danger.layui-input:hover, .layui-form-danger.layui-textarea:hover{border-color: #bb0000 !important;}
.edoc-form select.layui-form-danger+.layui-form-select .layui-input{border-color: #d9d9d9;}
.layui-form-radio *{color: #32363a;}
.edoc-form .layui-form-radio.layui-disabled div{color: #32363a;}
.edoc-form .layui-textarea{color: #32363a;min-height: 98px;line-height:22px;padding: 4px 12px;resize:none;}
.layui-form-danger:focus, .layui-form-danger+.layui-form-select .layui-input{border-color: #bb0000 !important;}
/* 按钮 */
.edoc-form .layui-btn{border-radius: 2px;}
.edoc-form .layui-btn:hover{opacity: 1; filter:alpha(opacity=100); color: #fff;}
.edoc-form .layui-btn:active{opacity: 1; filter:alpha(opacity=100);}
/* 图标区 */
.edoc-form .edoc-form-icon{position: absolute;top: 40px;right: 7px;width: 38px;height: 38px;line-height:38px;display: inline-block;text-align: center;}
.edoc-form .layui-col-xs6 .edoc-form-icon+input{padding-right: 32px;}
.edoc-form i.layui-icon-triangle-d+input,.edoc-form i.layui-icon-triangle-d+input{padding-right: 32px;}
/* 错误提示 */
.edoc-form .edoc-error-hint{height: 20px;line-height:20px;color:#bb0000;display:block;margin-top: 0px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}
.layui-form-danger{border-color: #bb0000 !important;}
/* 外边框 */
.edoc-test2{padding: 15px;width:100%;box-sizing:border-box;}
/* ---- */
/*普通弹窗一*/
.edoc-dialog-body {padding: 0px 0px 59px 0px !important;height: 100%;}
.edoc-dialog-content {overflow-y: auto;height: 100%;padding: 30px 30px 0 30px;}
.edoc-dialog-bottom {position: fixed;bottom: 0px;width: 100%;padding: 11px 15px 11px 15px;border-top: 1px solid #d9d9d9;background-color: #fff;}
.edoc-dialog-bottom .layui-inline{float: right;}
.edoc-dialog-bottom .edoc-dialog-bottom-left{float: left;margin-left: 15px;}
.edoc-dialog-bottom .edoc-dialog-bottom-left .layui-form-checkbox[lay-skin="primary"]{margin-top: 10px;}
.edoc-dialog-layui-input-block {margin-left: 0px;}
.edoc-dialog-bottom .edoc-dialog-btn{height: 35px;min-width: 50px;float: left;font-size: 15px;padding: 0 14px;}
.edoc-dialog-bottom .edoc-dialog-btn>span:first-child{padding-right: 10px;}
.edoc-dialog-btn+.edoc-dialog-btn{margin-left: 10px;}
/*普通弹窗二*/
.edoc-dialog-body-only {padding: 0px;height: 100%;}
.edoc-dialog-body form{height: 100%;}
/* 表格内的tips */
.layui-table-tips .layui-table-tips-c.layui-icon-close{box-sizing: unset;}
/* 表格的带下划线的tips*/
/* .layui-table-tips .layui-layer-content .layui-table-tips-main span.edoc-underline{text-decoration: underline !important;border-bottom: none;} */
/* 表格题名链接 */
.edoc-table-wrap .layui-table td[data-field="title"] .edoc-underline { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; max-width: 100%; margin-top: 2px; }
/* 弹窗预览 */
.edoc-iframe-item{height: 100%;width: 100%;border: none;}
.edoc-iframe{border: 1px solid #cccccc;margin: 15px;}
.layui-layer-prompt .layui-layer-input{width: 300px !important;}
/* 输入弹窗地址 */
.layui-layer .layui-layer-title{color: #6a6d70;font-weight: bold;}
.layui-layer .layui-layer-setwin{right: 17px;}
div.layui-layer-prompt .layui-layer-content{padding: 30px 30px 25px;}
div.layui-layer-prompt .layui-layer-btn{padding-bottom: 30px;}
div.layui-layer-prompt .layui-layer-btn>a{height: 33px !important;line-height: 33px !important;}
/* 块级标签 */
.edoc-blocktag {display: inline-block; padding: 0 7px 0 10px; border: none; height: 35px;line-height: 35px; border-radius: 2px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center;}
.edoc-blocktag .edoc-blocktag-label{max-width: 160px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;}
.edoc-blocktag .edoc-blocktag-label,.edoc-blocktag .edoc-blocktag-icon .layui-icon {font-size: 14px;}
.edoc-blocktag-icon{cursor: pointer;}
.edoc-blocktag-primary { border: 1px solid #bfbfbf; background-color: #ffffff; color: #32363a; line-height: 33px;}
.edoc-blocktag-normal { background-color: #1E9FFF; color: #fff; }
.edoc-blocktag-warn { background-color: #FFB800; color: #fff; }
.edoc-blocktag-danger { background-color: #FF5722; color: #fff; }
.edoc-blocktag-disabled { background-color: #FBFBFB; color: #C9C9C9; border: 1px solid #e6e6e6; cursor: not-allowed; opacity: 1; line-height: 33px;}
.edoc-blocktag-green {background-color: #107e3e; color: #fff;}
.edoc-blocktag-darkGreen{ background-color: rgba(115, 209, 61, 1); color: #fff; cursor: default; }
.edoc-blocktag-lightGreen{ background-color: #F6FFED; color: #52C41A; border: 1px solid #B7EB8F;}
.edoc-blocktag-blue{ background-color: #0a6ed1; color: #FFFFFF; }
.edoc-blocktag-darkBlue{ background-color: #0a6ed1; color: #FFFFFF; }
.edoc-blocktag-orange{ background-color: #e9730c; color: #FFFFFF; }
.edoc-blocktag-red{ background-color: #bb0000; color: #fff; cursor: default; }
.edoc-blocktag-darkGrey{ background-color: #6a6d70; color: #fff; }
.edoc-blocktag-grey{ background-color: #f4f4f4; color: #6a6d70; cursor: default; border: 1px solid #6a6d70; }
/* 在表格中使用时——有边框,带浅色底 */
.layui-table-body .edoc-blocktag-green{border: 1px solid #107e3e; color: #107e3e; background-color: #f1fdf6;}
.layui-table-body .edoc-blocktag-red{border: 1px solid #bb0000; color: #bb0000; background-color: #ffebeb;}
.layui-table-body .edoc-blocktag-darkBlue{border: 1px solid #0a6ed1; color: #0a6ed1; background-color: #f5faff;}
.layui-table-body .edoc-blocktag-blue{border: 1px solid #0a6ed1; color: #0a6ed1; background-color: #f5faff;}
.layui-table-body .edoc-blocktag-orange{border: 1px solid #e9730c; color: #e9730c; background-color: #fef7f1;}
.layui-table-body .edoc-blocktag-darkGrey{border: 1px solid #6a6d70; color: #6a6d70; background-color: #f4f4f4;}
.layui-table-body .edoc-blocktag.edoc-blocktag-xs{padding: 0 9px;}
/* 文字颜色 */
.edoc-text-green{color: #107E3E !important;}
.edoc-text-orange{color: #E9730C !important;}
/* 块级标签—带边框 */
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-darkGreen{background-color: #E6FFFB;border: 1px solid #87E8DE;color: #13C2C2;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-darkGreen .leftIcon{color: #35C5C2;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-lightBlue{background-color: #e6f7ff;border: 1px solid #91D5FF;color: #1890ff;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-lightBlue .leftIcon{color: #2594FF;margin-top: -1px;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-violet{background-color: #F9F0FF;border: 1px solid #D3ADF7;color: #722ED1;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-violet .leftIcon{color: #8F4CD3;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-pink{background-color: #FFF0F6;border: 1px solid #FFADD2;color: #F5317F;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-pink .leftIcon{color: #F53481;}
.edoc-blocktag.edoc-blocktag-border>span{float: left;line-height: 33px;}
.edoc-blocktag.edoc-blocktag-border>.edoc-blocktag-label{padding: 0 5px;}
/* 块级标签的大小 */
.edoc-blocktag.edoc-blocktag-xs{ height: 21px;line-height: 20px;padding: 0 10px;}
.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-label{max-width: 130px;}
.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-label,.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-icon i {font-size: 11px;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-xs>span{line-height: 18px;}
.edoc-blocktag.edoc-blocktag-sm{height: 30px;line-height: 30px;padding:0 5px 0 7px;}
.edoc-blocktag.edoc-blocktag-sm .edoc-blocktag-label,.edoc-blocktag.edoc-blocktag-sm .edoc-blocktag-icon i {font-size: 14px;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-sm>span{line-height: 28px;}
@-moz-document url-prefix() {
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-sm>span{line-height: 28px;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-xs>.edoc-blocktag-icon{margin-top: -1px;}
}
.edoc-blocktag.edoc-blocktag-lg{height: 44px;line-height: 44px;padding: 0 9px 0 12px;}
.edoc-blocktag.edoc-blocktag-lg .edoc-blocktag-label,.edoc-blocktag.edoc-blocktag-lg .edoc-blocktag-icon i {font-size: 16px;}
.edoc-blocktag.edoc-blocktag-border.edoc-blocktag-lg>span{line-height: 42px;}
@-moz-document url-prefix() {
.edoc-blocktag.edoc-blocktag-xs{line-height: 18px !important;}
.edoc-blocktag-grey.edoc-blocktag-xs{line-height: 15px !important;}
.edoc-blocktag-lg{line-height: 42px !important;}
.edoc-blocktag-sm{line-height:30px !important;}
}
/* 微调图标 */
.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-icon .fa-university{font-size: 12px;}
.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-icon .fa-user{font-size: 10px;}
.edoc-blocktag.edoc-blocktag-xs .edoc-blocktag-icon .fa-sitemap{font-size: 10px;}
.edoc-blocktag.edoc-blocktag-sm .edoc-blocktag-icon .fa-user{font-size: 13px;}
.edoc-blocktag.edoc-blocktag-sm .edoc-blocktag-icon .fa-sitemap{font-size: 12px;}
/* 文本域计算字数 */
.edoc-word-up{float:right;position:relative;bottom:-5px;color: #74777a;}
/* 穿梭框的传递按钮 */
.layui-transfer-active .layui-btn{border: none;background-color: #fff;}
.layui-transfer-active .layui-btn .layui-icon{color: #1890ff;font-size: 18px!important;}
/* 隐藏卡片的样式 */
.edoc-hideCard { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto;text-align: center; height: 30px; line-height: 30px; }
.edoc-hideCard-cardText { font-size: 16px; color: #32363a; }
.edoc-hideCard-cardText .layui-btn-link { margin-left: 10px; color: #1890ff;}
/* 步骤条demo样式 */
.step-item {display: inline-block;line-height: 26px;position: relative;background: #ffffff;}
.step-item-tail {width: 100%;padding: 0 10px;position: absolute;left: 0;top: 13px;}
.step-item-tail i {display: inline-block;width: 100%;height: 1px;vertical-align: top;background: #c2c2c2;position: relative;}
.step-item-tail-done {background: #009688 !important;}
.step-item-head {position: relative;display: inline-block;height: 26px;width: 26px;text-align: center;vertical-align: top;color: #009688;border: 1px solid #009688;border-radius: 50%;background: #ffffff;}
.step-item-head.step-item-head-active {background: #009688;color: #ffffff;}
.step-item-main {background: #ffffff;display: block;position: relative;}
.step-item-main-title {font-weight: bolder;color: #555555;}
.step-item-main-desc {color: #aaaaaa;}
.step-item-head.step-item-head-current {background: #FF5722;color: #ffffff;border: 1px solid #FF5722;}
/* soulTable右键菜单样式 */
#soul-table-contextmenu-wrapper .soul-table-contextmenu{line-height: 36px;box-shadow: 0 2px 4px rgba(0,0,0,.12);border: 1px solid #d2d2d2;border-radius: 2px;box-sizing: border-box;color: #333333;font-size: 12px;text-align: center;}
#soul-table-contextmenu-wrapper .soul-table-contextmenu li{line-height: 36px;padding: 0 22px;}
#soul-table-contextmenu-wrapper .soul-table-contextmenu li:hover{background-color: #f2f2f2;}
/*文本编辑器按钮背景色*/
.edoc-textEditor-btn{background-color:#1890ff !important;}
/* 滑块组件的提示信息 */
.layui-slider-tips{background-color: #1890ff; }
.layui-slider-tips::after{border-color:#1890ff #fff #fff #fff;}
.layui-slider-wrap-btn{border:2px solid #1890ff;}
/* 取消a标签hover */
.edoc-hover-unset:hover{color: #fff;}
/* input框高度 */
.edoc-input-height-30{height: 30px;line-height: 30px;}
/* 字体颜色 */
.edoc-color-gray-medium{color:#666666}
/* 树形组件 */
.far{font-family: 'Font Awesome 5 Free'!important;}
.far.fa-spinner{font-weight: bold;}
body .eleTree{padding-left: 25px;}
.eleTree-node-content-icon .layui-icon.icon-rotate{transform: none !important;}
.layui-icon-triangle-r:before{content: "\f0d4";background-color: #ffffff;position: relative;}
.layui-icon-triangle-r.icon-rotate:before{content: "\e079";background-color: #ffffff;position: relative;}
.eleTree-node-content-icon .layui-icon.leaf-icon:before{/* content: "\f249" !important; */background: none;position: relative;}
.eleTree-node .eleTree-node-content-label{width: auto;padding: 0 3px;border-radius: 2px;margin-left: 0px;max-width: calc(100% - 42px); color: #32363a;margin-top: -2px;font-size:14px;}
.eleTree-node .eleTree-node-content>.eleTree-node-content-icon{margin-right: 5px;}
.eleTree-node-content:hover .eleTree-node-content-icon .layui-icon{color: #777 !important;}
.eleTree-node .eleTree-node-content.eleTree-node-content-active .eleTree-node-content-icon .layui-icon{color: #777 !important;}
.eleTree-node-content:hover .eleTree-node-content-label{background-color: #f5f5f5 !important;color: #32363a !important}
.eleTree-node:before{content: "";height: calc(100% - 18px);border-left: 0px dotted #999;position: absolute;top: 13px;left: 5px;z-index: -1;}
.eleTree-node .eleTree-node-content{padding-left: 0px !important;height: 24px !important;margin-bottom: 4px;padding-bottom: 0px;line-height: 24px;}
.eleTree-node-group{margin-left: 21px;}
.ajaxFrontTree-eleTree-last.eleTree-node:before{display: none;}
.eleTree-node-content-icon .layui-icon{font-size: 14px !important;color: #777 !important;}
.eleTree-node-content .eleTree-node-content-more{position: absolute !important;}
/* .eleTree-node-content .eleTree-node-content-more .fa-bars{color: #1890ff;} */
.fa-plus-square:before{background-color: #f5f5f5;}
.fa-sticky-note:before{background-color: #f5f5f5;}
.eleTree-node-content-icon .layui-icon.icon-rotate:before{content: "\f146";}
.eleTree-more-menu .eleTree-more-item:hover{background-color: #f7f7f7 !important;}
div.eleTree-more-menu{width: max-content;width: -moz-max-content;color: #32363a;}
div.eleTree-more-menu .eleTree-more-item{padding-left: 15px;padding-right: 15px;text-align: left;}
.eleTree-node .eleTree-checkbox{padding-left: 2px;padding-right: 2px;}
.eleTree-node .eleTree-checkbox i{left: 0px;position: relative;font-size: 8px;float: left;top: 2px;}
.eleTree-node .eleTree-checkbox-line:after{top: -2px;}
.eleTree-node .eleTree-checkbox i{border-color: #bfbfbf;}
/* nav下拉选项 */
.layui-nav-child.layui-anim.layui-anim-upbit {
text-align: left !important;
}
/* 人员弹窗 */
.use-pop{width: 400px;position: absolute;z-index: 120;background-color: #ffffff;box-shadow:0px 1px 5px #cccccc;border-radius: 2px;border: 1px solid #EBEBEB;display: none;margin-top: 2px;}
.use-pop .edoc-contentBlock .edoc-contentBlock-head{padding-top: 14px;height: 55px;padding-left: 24px;text-align: left;background-color: #ffffff;}
.use-pop .edoc-contentBlock .edoc-contentBlock-head .edoc-contentBlock-head-font{color: #32363a;font-weight: bold;font-size: 14px;}
.use-pop .edoc-contentBlock-body{overflow-y: hidden;padding:20px 24px 12px 24px !important;}
.use-pop .edoc-contentBlock-head .layui-timeline-axis{right: 19px;left: auto;top: 17px !important;font-size: 16px;color:#74777a}
.use-pop .edoc-contentBlock-head .layui-timeline-axis:hover{color:#1890ff;background-color: #ffffff;}
.use-pop .edoc-contentBlock-head .layui-timeline-axis:active{color:#40a9ff;}
.use-pop .edoc-contentBlock-body ul{padding: 0px;}
.use-pop .edoc-contentBlock-body ul li{list-style-type: none;color: #32363a;padding-bottom: 11px;max-width: 338px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;margin-top: 0px;text-align: left;line-height: 20px;height: 28px;}
.use-pop .edoc-contentBlock-body ul li span{color:#74777a;padding-right:12px;width: auto;margin: 0px;}
.use-pop .edoc-contentBlock-body ul li a{color:#1890ff;text-decoration: underline !important;}
.use-pop .edoc-contentBlock-body ul li .front-no-underline{text-decoration: none !important;color:#32363a;vertical-align: middle;}
/* 详情页内容块 */
.edoc-contentBlock{width: 100%;background-color: #FFFFFF;}
.edoc-contentBlock .edoc-contentBlock-head{height: 65px;box-sizing: border-box;border-bottom: 1px solid #f2f2f2;padding-top: 20px;padding-left: 24px;}
.edoc-contentBlock .edoc-contentBlock-head .edoc-contentBlock-head-font{color: #6a6d70;line-height: 24px;font-size: 16px;}
.edoc-contentBlock .edoc-contentBlock-body{padding-left: 24px;word-break:break-all;}
/* 日期选择框 */
.layui-laydate{margin-top: 2px !important;}
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-header{ background-color:#ffffff !important; color: #32363a; border-bottom: 1px solid #d9d9d9; box-shadow: 0px 0px 3px rgba(0,0,0,.12) !important; }
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-header .laydate-set-ym span{ color: #6A6D70;font-weight: bolder;}
.layui-laydate.laydate-theme-molv .layui-laydate-header i.laydate-icon{color: #6A6D70;font-size: 10px;}
.layui-laydate.laydate-theme-molv .layui-laydate-header i.laydate-icon:hover{color: #40a9ff;}
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content { border: none; }
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content ul{padding-top: 0px;}
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content ul li{ height: 30px; line-height: 30px; margin: 8px 0; border-radius: 2px; }
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content td.laydate-selected{background-color: #FFF !important;}
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content td{padding-right: 0;padding-left: 0;}
.layui-laydate td.layui-this{background-color: #FFF !important;}
.layui-laydate td.layui-this .edoc-laydate-dayspan{border-radius: 2px;}
.layui-laydate.laydate-theme-molv .layui-laydate-main .layui-laydate-content td.laydate-selected .edoc-laydate-dayspan {background-color: #e6f7ff !important;padding:0 5px;width: 100%;}
.laydate-theme-molv .layui-laydate-footer .laydate-btns-time{}
.layui-laydate-footer .laydate-footer-btns span:hover{color: #fff;}
/* 表格头部工具栏的样式 */
.edoc-table-top-block .layui-btn +.layui-btn{margin-left: 5px;}
.edoc-table-top-block.edoc-form .layui-btn,.edoc-table-top-block .edoc-form .layui-btn{min-width: auto;}
.edoc-username{color:#1890ff;}
/* 吸顶提示 */
.layui-layer-tips:not(.layui-table-tips) .layui-layer-content {color: #32363a !important;padding: 5px 10px !important;}
.noUser{padding-bottom: 14px;text-align: center;color: #74777a;}
.use-pop .edoc-contentBlock-body .noUser{padding-bottom:8px !important;}
.layui-table-view .layui-form-checkbox[lay-skin="primary"] i{width:16px;height: 16px;line-height: 16px;}
/* 上传文件状态居中 */
.statusDom{text-align: center;}
/* 进度条颜色 */
.layui-bg-blue{background-color: #1890ff !important;}
/* 带复选框选择单位弹窗 */
.selectorgfrontmuti .edoc-dialog-bottom{position: fixed;bottom: 0px;width: 100%;padding: 11px 24px 11px 0px;background-color: #ffffff;height: 55px;border-top: 1px solid #d9d9d9;}
.selectorgfrontmuti .edoc-dialog-bottom .layui-inline {float: right;}
.selectorgfrontmuti .edoc-dialog-bottom .edoc-dialog-layui-input-block {margin-left: 0px;min-height: 32px;}
.selectorgfrontmuti .edoc-dialog-bottom .edoc-front-btn {height: 32px;line-height: 26px;border-radius: 2px;padding: 0 16px;background-color: #FFFFFF;color: #32363A;border: 1px solid #bfbfbf;cursor: pointer;-webkit-transition: all .3s cubic-bezier(.645,.045,.355,1);transition: all .3s cubic-bezier(.645,.045,.355,1);}
.selectorgfrontmuti .edoc-dialog-bottom .edoc-front-btn.edoc-front-btn-normal {background-color: #1890ff;color: #FFFFFF;border: none;}
.selectorgfrontmuti .edoc-dialog-content{overflow-y: auto;height: 100%;padding: 24px 24px 0 24px;}
.selectorgfrontmuti .fa-plus-square.icon-rotate:before {background-color: #ffffff;position: relative;}
/* 外单位利用档案详情 */
.split-archdetail{padding-top: 20px !important;}
#hideHtml{display: none;}
.edoc-blocktag.edoc-blocktag-primary.edoc-blocktag-sm>span{float: left;}
.edoc-blocktag.edoc-blocktag-primary.edoc-blocktag-sm span.edoc-blocktag-icon{display: contents;}
.archdestruction-title{display: inline-block;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;vertical-align: top;}

39
public/report/年报_files/content.html

@ -0,0 +1,39 @@
<!DOCTYPE html>
<!-- saved from url=(0064)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/content.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Tab Switcher</title>
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/content.css" rel="stylesheet">
<style>
/*
* 所有滚动条不可见
* */
html::-webkit-scrollbar,
body::-webkit-scrollbar,
div::-webkit-scrollbar,
p::-webkit-scrollbar,
button::-webkit-scrollbar
{
width: 0.01px;
background-color: transparent;
}
html::-webkit-scrollbar-thumb,
body::-webkit-scrollbar-thumb,
div::-webkit-scrollbar-thumb,
p::-webkit-scrollbar-thumb,
button::-webkit-scrollbar-thumb
{
background-color: transparent;
}
</style>
</head>
<body style="width: 100%;height: 100%; overflow: scroll;background:transparent">
<div id="root"></div>
<script src="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/content.js">
</script><div id="CRX-container"><div class="CRX-content"></div></div><script type="text/javascript" src="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/insert.js"></script>
</body></html>

68
public/report/年报_files/highlight(1).html

@ -0,0 +1,68 @@
<!DOCTYPE html>
<!-- saved from url=(0066)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/highlight.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style rc-util-key="@ant-design-icons">
.anticon {
display: inline-block;
color: inherit;
font-style: normal;
line-height: 0;
text-align: center;
text-transform: none;
vertical-align: -0.125em;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.anticon > * {
line-height: 1;
}
.anticon svg {
display: inline-block;
}
.anticon::before {
display: none;
}
.anticon .anticon-icon {
display: block;
}
.anticon[tabindex] {
cursor: pointer;
}
.anticon-spin::before,
.anticon-spin {
display: inline-block;
-webkit-animation: loadingCircle 1s infinite linear;
animation: loadingCircle 1s infinite linear;
}
@-webkit-keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
</style>
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/highlight.css" rel="stylesheet">
<style>
</style>
</head>
<body style="background-color: rgba(171, 175, 180, 0.73); height: 96px;"><div id="content-container" class="content-container" style="opacity: 0; transform: translateY(-50px) translateZ(0px);"><div class="highlights-item-container"><input class="ant-input" type="text" value="" style="width: 300px;"><div class="ant-select mode-select ant-select-single ant-select-show-arrow"><div class="ant-select-selector"><span class="ant-select-selection-search"><input type="search" autocomplete="off" class="ant-select-selection-search-input" role="combobox" aria-haspopup="listbox" aria-owns="rc_select_0_list" aria-autocomplete="list" aria-controls="rc_select_0_list" aria-activedescendant="rc_select_0_list_0" readonly="" unselectable="on" value="" id="rc_select_0" style="opacity: 0;"></span><span class="ant-select-selection-item" title="全文">全文</span></div><span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;"><span role="img" aria-label="down" class="anticon anticon-down ant-select-suffix"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></span></span></div><div class="color-box color-box-value fl-highlight-yellow"></div><img class="highlights-view" src="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/images/open-eye.png"></div><div class="plus-container"><span class="plus">+</span></div></div>
</body></html>

68
public/report/年报_files/highlight.html

@ -0,0 +1,68 @@
<!DOCTYPE html>
<!-- saved from url=(0066)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/highlight.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style rc-util-key="@ant-design-icons">
.anticon {
display: inline-block;
color: inherit;
font-style: normal;
line-height: 0;
text-align: center;
text-transform: none;
vertical-align: -0.125em;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.anticon > * {
line-height: 1;
}
.anticon svg {
display: inline-block;
}
.anticon::before {
display: none;
}
.anticon .anticon-icon {
display: block;
}
.anticon[tabindex] {
cursor: pointer;
}
.anticon-spin::before,
.anticon-spin {
display: inline-block;
-webkit-animation: loadingCircle 1s infinite linear;
animation: loadingCircle 1s infinite linear;
}
@-webkit-keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
</style>
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/highlight.css" rel="stylesheet">
<style>
</style>
</head>
<body style="background-color: rgba(171, 175, 180, 0.73); height: 96px;"><div id="content-container" class="content-container" style="opacity: 0; transform: translateY(-50px) translateZ(0px);"><div class="highlights-item-container"><input class="ant-input" type="text" value="" style="width: 300px;"><div class="ant-select mode-select ant-select-single ant-select-show-arrow"><div class="ant-select-selector"><span class="ant-select-selection-search"><input type="search" autocomplete="off" class="ant-select-selection-search-input" role="combobox" aria-haspopup="listbox" aria-owns="rc_select_0_list" aria-autocomplete="list" aria-controls="rc_select_0_list" aria-activedescendant="rc_select_0_list_0" readonly="" unselectable="on" value="" id="rc_select_0" style="opacity: 0;"></span><span class="ant-select-selection-item" title="全文">全文</span></div><span class="ant-select-arrow" unselectable="on" aria-hidden="true" style="user-select: none;"><span role="img" aria-label="down" class="anticon anticon-down ant-select-suffix"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></span></span></div><div class="color-box color-box-value fl-highlight-yellow"></div><img class="highlights-view" src="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/images/open-eye.png"></div><div class="plus-container"><span class="plus">+</span></div></div>
</body></html>

1359
public/report/年报_files/layui.css
File diff suppressed because it is too large
View File

756
public/report/年报_files/layui.js.下载

@ -0,0 +1,756 @@
/*!
@Title: layui
@Description:经典模块化前端 UI 框架
@Site: www.layui.com
@Author: 贤心
@License:MIT
*/
!(function (win) {
'use strict';
var doc = document;
var config = {
modules: {}, // 记录模块物理路径
status: {}, // 记录模块加载状态
timeout: 10, // 符合规范的模块请求最长等待秒数
event: {}, // 记录模块自定义事件
version: '30233', // 系统版本号 为了解决浏览器的缓存问题; 系统中的js、html文件路径都会拼上此版本号
};
var Layui = function () {
this.v = '2.5.5'; // 版本号
};
// 获取layui所在目录
var getPath = (function () {
var jsPath = doc.currentScript
? doc.currentScript.src
: (function () {
var js = doc.scripts;
var last = js.length - 1;
var src;
for (var i = last; i > 0; i--) {
if (js[i].readyState === 'interactive') {
src = js[i].src;
break;
}
}
return src || js[last].src;
})();
return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
})();
// 异常提示
var error = function (msg) {
win.console && console.error && console.error('Layui hint: ' + msg);
};
var isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]';
// 内置模块
var modules = {
layer: 'modules/layer', // 弹层
laydate: 'modules/laydate', // 日期
laypage: 'modules/laypage', // 分页
laytpl: 'modules/laytpl', // 模板引擎
layim: 'modules/layim', // web通讯
layedit: 'modules/layedit', // 富文本编辑器
form: 'modules/form', // 表单集
upload: 'modules/upload', // 上传
transfer: 'modules/transfer', // 上传
tree: 'modules/tree', // 树结构
table: 'modules/table', // 表格
element: 'modules/element', // 常用元素操作
rate: 'modules/rate', // 评分组件
colorpicker: 'modules/colorpicker', // 颜色选择器
slider: 'modules/slider', // 滑块
carousel: 'modules/carousel', // 轮播
flow: 'modules/flow', // 流加载
util: 'modules/util', // 工具块
code: 'modules/code', // 代码修饰器
jquery: 'modules/jquery', // DOM库(第三方)
mobile: 'modules/mobile', // 移动大模块 | 若当前为开发目录,则为移动模块入口,否则为移动模块集合
'layui.all': '../layui.all', // PC模块合并版
};
// 记录基础数据
Layui.prototype.cache = config;
// 定义模块
Layui.prototype.define = function (deps, factory) {
var that = this;
var type = typeof deps === 'function';
var callback = function () {
var setApp = function (app, exports) {
layui[app] = exports;
config.status[app] = true;
};
typeof factory === 'function' &&
factory(function (app, exports) {
setApp(app, exports);
config.callback[app] = function () {
factory(setApp);
};
});
return this;
};
type && ((factory = deps), (deps = []));
if (!layui['layui.all'] && layui['layui.mobile']) {
return callback.call(that);
}
that.use(deps, callback);
return that;
};
// 使用特定模块
Layui.prototype.use = function (apps, callback, exports) {
var that = this;
var dir = (config.dir = config.dir ? config.dir : getPath);
var head = doc.getElementsByTagName('head')[0];
apps = typeof apps === 'string' ? [apps] : apps;
// 如果页面已经存在jQuery1.7+库且所定义的模块依赖jQuery,则不加载内部jquery模块
if (window.jQuery && jQuery.fn.on) {
that.each(apps, function (index, item) {
if (item === 'jquery') {
apps.splice(index, 1);
}
});
layui.jquery = layui.$ = jQuery;
}
var item = apps[0];
var timeout = 0;
exports = exports || [];
// 静态资源host
config.host = config.host || (dir.match(/\/\/([\s\S]+?)\//) || ['//' + location.host + '/'])[0];
// 加载完毕
function onScriptLoad (e, url) {
var readyRegExp =
navigator.platform === 'PLaySTATION 3' ? /^complete$/ : /^(complete|loaded)$/;
if (e.type === 'load' || readyRegExp.test((e.currentTarget || e.srcElement).readyState)) {
config.modules[item] = url;
head.removeChild(node);
(function poll () {
if (++timeout > (config.timeout * 1000) / 4) {
return error(item + ' is not a valid module');
}
config.status[item] ? onCallback() : setTimeout(poll, 4);
})();
}
}
// 回调
function onCallback () {
exports.push(layui[item]);
apps.length > 1
? that.use(apps.slice(1), callback, exports)
: typeof callback === 'function' && callback.apply(layui, exports);
}
// 如果引入了完整库(layui.all.js),内置的模块则不必再加载
if (
apps.length === 0 ||
(layui['layui.all'] && modules[item]) ||
(!layui['layui.all'] && layui['layui.mobile'] && modules[item])
) {
return onCallback(), that;
}
// 首次加载模块
if (!config.modules[item]) {
var node = doc.createElement('script');
// 如果是内置模块,则按照 dir 参数拼接模块路径
// 如果是扩展模块,则判断模块路径值是否为 {/} 开头,
// 如果路径值是 {/} 开头,则模块路径即为后面紧跟的字符。
// 否则,则按照 base 参数拼接模块路径
var url =
(modules[item]
? dir + 'lay/'
: /^\{\/\}/.test(that.modules[item])
? ''
: config.base || '') +
(that.modules[item] || item) +
'.js';
url = url.replace(/^\{\/\}/, '');
node.async = true;
node.charset = 'utf-8';
node.src =
url +
(function () {
var version =
config.version === true ? config.v || new Date().getTime() : config.version || '';
return version ? '?v=' + version : '';
})();
head.appendChild(node);
if (
node.attachEvent &&
!(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
!isOpera
) {
node.attachEvent('onreadystatechange', function (e) {
onScriptLoad(e, url);
});
} else {
node.addEventListener(
'load',
function (e) {
onScriptLoad(e, url);
},
false
);
}
config.modules[item] = url;
} else {
// 缓存
(function poll () {
if (++timeout > (config.timeout * 1000) / 4) {
return error(item + ' is not a valid module');
}
typeof config.modules[item] === 'string' && config.status[item]
? onCallback()
: setTimeout(poll, 4);
})();
}
return that;
};
// 获取节点的style属性值
Layui.prototype.getStyle = function (node, name) {
var style = node.currentStyle ? node.currentStyle : win.getComputedStyle(node, null);
return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name);
};
// css外部加载器
Layui.prototype.link = function (href, fn, cssname) {
var that = this;
var link = doc.createElement('link');
var head = doc.getElementsByTagName('head')[0];
if (typeof fn === 'string') {
cssname = fn;
}
var app = (cssname || href).replace(/\.|\//g, '');
var id = (link.id = 'layuicss-' + app);
var timeout = 0;
link.rel = 'stylesheet';
link.href = href + (config.debug ? '?v=' + new Date().getTime() : '');
link.media = 'all';
if (!doc.getElementById(id)) {
head.appendChild(link);
}
if (typeof fn !== 'function') {
return that;
}
// 轮询css是否加载完毕
(function poll () {
if (++timeout > (config.timeout * 1000) / 100) {
return error(href + ' timeout');
}
parseInt(that.getStyle(doc.getElementById(id), 'width')) === 1989
? (function () {
fn();
})()
: setTimeout(poll, 100);
})();
return that;
};
// 存储模块的回调
config.callback = {};
// 重新执行模块的工厂函数
Layui.prototype.factory = function (modName) {
if (layui[modName]) {
return typeof config.callback[modName] === 'function' ? config.callback[modName] : null;
}
};
// css内部加载器
Layui.prototype.addcss = function (firename, fn, cssname) {
return layui.link(config.dir + 'css/' + firename, fn, cssname);
};
// 图片预加载
Layui.prototype.img = function (url, callback, error) {
var img = new Image();
img.src = url;
if (img.complete) {
return callback(img);
}
img.onload = function () {
img.onload = null;
typeof callback === 'function' && callback(img);
};
img.onerror = function (e) {
img.onerror = null;
typeof error === 'function' && error(e);
};
};
// 全局配置
Layui.prototype.config = function (options) {
options = options || {};
for (var key in options) {
config[key] = options[key];
}
return this;
};
// 记录全部模块
Layui.prototype.modules = (function () {
var clone = {};
for (var o in modules) {
clone[o] = modules[o];
}
return clone;
})();
// 拓展模块
Layui.prototype.extend = function (options) {
var that = this;
// 验证模块是否被占用
options = options || {};
for (var o in options) {
if (that[o] || that.modules[o]) {
error('\u6A21\u5757\u540D ' + o + ' \u5DF2\u88AB\u5360\u7528');
} else {
that.modules[o] = options[o];
}
}
return that;
};
// 路由解析
Layui.prototype.router = function (hash) {
var that = this;
var hash = hash || location.hash;
var data = {
path: [],
search: {},
hash: (hash.match(/[^#](#.*$)/) || [])[1] || '',
};
if (!/^#\//.test(hash)) {
return data;
} // 禁止非路由规范
hash = hash.replace(/^#\//, '');
data.href = '/' + hash;
hash = hash.replace(/([^#])(#.*$)/, '$1').split('/') || [];
// 提取Hash结构
that.each(hash, function (index, item) {
/^\w+=/.test(item)
? (function () {
item = item.split('=');
data.search[item[0]] = item[1];
})()
: data.path.push(item);
});
return data;
};
// 本地持久性存储
Layui.prototype.data = function (table, settings, storage) {
table = table || 'layui';
storage = storage || localStorage;
if (!win.JSON || !win.JSON.parse) {
return;
}
// 如果settings为null,则删除表
if (settings === null) {
return delete storage[table];
}
settings = typeof settings === 'object' ? settings : { key: settings };
try {
var data = JSON.parse(storage[table]);
} catch (e) {
var data = {};
}
if ('value' in settings) {
data[settings.key] = settings.value;
}
if (settings.remove) {
delete data[settings.key];
}
storage[table] = JSON.stringify(data);
return settings.key ? data[settings.key] : data;
};
// 本地会话性存储
Layui.prototype.sessionData = function (table, settings) {
return this.data(table, settings, sessionStorage);
};
// 设备信息
Layui.prototype.device = function (key) {
var agent = navigator.userAgent.toLowerCase();
// 获取版本号
var getVersion = function (label) {
var exp = new RegExp(label + '/([^\\s\\_\\-]+)');
label = (agent.match(exp) || [])[1];
return label || false;
};
// 返回结果集
var result = {
os: (function () {
// 底层操作系统
if (/windows/.test(agent)) {
return 'windows';
} else if (/linux/.test(agent)) {
return 'linux';
} else if (/iphone|ipod|ipad|ios/.test(agent)) {
return 'ios';
} else if (/mac/.test(agent)) {
return 'mac';
}
})(),
ie: (function () {
// ie版本
return !!win.ActiveXObject || 'ActiveXObject' in win
? (agent.match(/msie\s(\d+)/) || [])[1] || '11' // 由于ie11并没有msie的标识
: false;
})(),
weixin: getVersion('micromessenger'), // 是否微信
};
// 任意的key
if (key && !result[key]) {
result[key] = getVersion(key);
}
// 移动设备
result.android = /android/.test(agent);
result.ios = result.os === 'ios';
return result;
};
// 提示
Layui.prototype.hint = function () {
return {
error: error,
};
};
// 遍历
Layui.prototype.each = function (obj, fn) {
var key;
var that = this;
if (typeof fn !== 'function') {
return that;
}
obj = obj || [];
if (obj.constructor === Object) {
for (key in obj) {
if (fn.call(obj[key], key, obj[key])) {
break;
}
}
} else {
for (key = 0; key < obj.length; key++) {
if (fn.call(obj[key], key, obj[key])) {
break;
}
}
}
return that;
};
// 将数组中的对象按其某个成员排序
Layui.prototype.sort = function (obj, key, desc) {
var clone = JSON.parse(JSON.stringify(obj || []));
if (!key) {
return clone;
}
// 如果是数字,按大小排序,如果是非数字,按字典序排序
clone.sort(function (o1, o2) {
var isNum = /^-?\d+$/;
var v1 = o1[key];
var v2 = o2[key];
if (isNum.test(v1)) {
v1 = parseFloat(v1);
}
if (isNum.test(v2)) {
v2 = parseFloat(v2);
}
if (v1 && !v2) {
return 1;
} else if (!v1 && v2) {
return -1;
}
if (v1 > v2) {
return 1;
} else if (v1 < v2) {
return -1;
} else {
return 0;
}
});
desc && clone.reverse(); // 倒序
return clone;
};
// 阻止事件冒泡
Layui.prototype.stope = function (thisEvent) {
thisEvent = thisEvent || win.event;
try {
thisEvent.stopPropagation();
} catch (e) {
thisEvent.cancelBubble = true;
}
};
// 自定义模块事件
Layui.prototype.onevent = function (modName, events, callback) {
if (typeof modName !== 'string' || typeof callback !== 'function') {
return this;
}
return Layui.event(modName, events, null, callback);
};
// 执行自定义模块事件
Layui.prototype.event = Layui.event = function (modName, events, params, fn) {
var that = this;
var result = null;
var filter = events.match(/\((.*)\)$/) || []; // 提取事件过滤器字符结构,如:select(xxx)
var eventName = (modName + '.' + events).replace(filter[0], ''); // 获取事件名称,如:form.select
var filterName = filter[1] || ''; // 获取过滤器名称,,如:xxx
var callback = function (_, item) {
var res = item && item.call(that, params);
res === false && result === null && (result = false);
};
// 添加事件
if (fn) {
config.event[eventName] = config.event[eventName] || {};
// 这里不再对多次事件监听做支持,避免更多麻烦
// config.event[eventName][filterName] ? config.event[eventName][filterName].push(fn) :
config.event[eventName][filterName] = [fn];
return this;
}
// 执行事件回调
layui.each(config.event[eventName], function (key, item) {
// 执行当前模块的全部事件
if (filterName === '{*}') {
layui.each(item, callback);
return;
}
// 执行指定事件
key === '' && layui.each(item, callback);
filterName && key === filterName && layui.each(item, callback);
});
return result;
};
// 加载自定义事件
NodeList.prototype.forEach = Array.prototype.forEach;
window.customEvent = {
rootScope: {
name: 'document',
handleEvent: {},
events: {},
children: [],
},
/**
* @description: 用于处理模板解析
* @param {String} template 传递已经被latpl编译的模板
* @param {String} locationId id
* @return {String} 返回已经被latpl编译的模板
*/
parse: function (template, locationId) {
var $ = layui.$;
// 查找父级组件
var that = this;
var currentScope = null;
if (!locationId) {
// 根节点初始化Scope
currentScope = that.rootScope;
} else {
var parentId = $("*[edoc='" + locationId + "']")
.parents('*[edoc]')
.first()
.attr('edoc');
var parentScope = that.findScope(parentId, that.rootScope) || that.rootScope;
var currentScope = that.findScope(locationId, that.rootScope);
if (!currentScope) {
currentScope = {
name: locationId,
handleEvent: {},
events: {},
};
parentScope.children
? parentScope.children.push(currentScope)
: (parentScope.children = [currentScope]);
}
}
// 匹配模板内部存在 @ 绑定事件的DOM
return template.replace(/<[^<]*(@\w*=\w*(\(\S*\))?\s*)+[^>]*>/gi, function (domStr) {
var randomFlag = 'data-ident=' + Math.floor(Math.random() * 1000);
while (currentScope.handleEvent[randomFlag]) {
randomFlag = 'data-ident=' + Math.floor(Math.random() * 1000);
}
// 初始化handleEvent
currentScope.handleEvent[randomFlag] = {};
// 替换生成唯一标记 然后匹配DOM上的绑定事件
// (\((?<=\()[^\)]+\))?
return domStr
.replace('>', ' ' + randomFlag + ' >')
.replace(/@\w*=\w*(\([^\)]+\))?\s*/gi, function (subStr) {
// 生成绑定事件的格式
var event = subStr.replace('@', '').trim().split('=');
currentScope.handleEvent[randomFlag][event[0]] = event[1];
return '';
});
});
},
/**
* @description: 用于绑定监听事件,并触发相关的回调
* @param {Object} data data
* @param {String} locationId id
* @return {Object} null
*/
bindEvent: function (data, locationId) {
var $ = layui.$;
var currentScope = this.findScope(locationId, this.rootScope) || this.rootScope;
var filter = $(locationId ? '*[edoc="' + currentScope.name + '"]' : 'body');
try {
Object.keys(currentScope.handleEvent).forEach(function (event) {
if (currentScope.handleEvent[event].bindStatus) {return null;}
var _EventDOM = filter.find('*[' + event + ']');
var _Events = currentScope.handleEvent[event.trim()];
Object.keys(_Events).forEach(function (_EventName) {
var _FnTemp = _Events[_EventName].split('(');
var _FnName = _FnTemp[0];
var _FnArgs = _FnTemp[1] ? _FnTemp[1].replace(')', '') : data;
try {
if (typeof _FnArgs === 'string' && isNaN(_FnArgs)) {
_FnArgs = JSON.parse(_FnArgs);
}
} catch (e) {
console.error(_FnArgs, '参数无法转化为对象', e);
}
_EventDOM.on(_EventName, function (event) {
currentScope.events[_FnName](_FnArgs, event.currentTarget);
});
Object.defineProperty(currentScope.handleEvent[event], 'bindStatus', {
value: true,
});
});
});
} catch (error) {
console.error(error);
}
},
/**
* @description: 用于提供回调以挂载给绑定事件调用
* @param {String} name 回调函数名称
* @param {Function} callback 回调函数
* @return {Object} null
*/
toggleEvent: function (name, callback) {
var customEvent = window.customEvent;
var currentScope =
this.constructor.name === 'Object'
? customEvent.rootScope
: customEvent.findScope(this.id, customEvent.rootScope);
if (currentScope && currentScope.events) {currentScope.events[name] = callback;}
},
//
refresh:function(locationId){
var that=this
try {
var node=that.findScope(locationId,that.rootScope)
if(node){
node.handleEvent={},
node.events={}
}
} catch (error) {
console.log(error);
}
},
// 依赖方法
/**
* @description:数组去重
* @param {Array} arr 重复数组
* @return {Array} 去重数组
*/
unique: function (arr) {
var obj = {};
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (obj[arr[i]] === undefined) {
newArr.push(arr[i]);
obj[arr[i]] = 1;
}
}
return newArr;
},
/**
* @description: 查找作用域(不查根节点)
* @param {String} scopeName 作用域名词
* @param {Object} scopeTree 作用域树
* @return {Object} scope
*/
findScope: function (scopeName, scopeTree) {
try {
var childScopes = scopeTree.children;
for (var index = 0; index < childScopes.length; index++) {
var scope = childScopes[index];
if (scope.name === scopeName) {
return scope;
}
if (scope.children) {
var result = window.customEvent.findScope(scopeName, scope);
if (result) {
return result;
}
}
}
return null;
} catch (error) {
console.log(error);
}
},
};
win.layui = new Layui();
})(window);

92
public/report/年报_files/outline.html

@ -0,0 +1,92 @@
<!DOCTYPE html>
<!-- saved from url=(0064)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/outline.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style rc-util-key="@ant-design-icons">
.anticon {
display: inline-block;
color: inherit;
font-style: normal;
line-height: 0;
text-align: center;
text-transform: none;
vertical-align: -0.125em;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.anticon > * {
line-height: 1;
}
.anticon svg {
display: inline-block;
}
.anticon::before {
display: none;
}
.anticon .anticon-icon {
display: block;
}
.anticon[tabindex] {
cursor: pointer;
}
.anticon-spin::before,
.anticon-spin {
display: inline-block;
-webkit-animation: loadingCircle 1s infinite linear;
animation: loadingCircle 1s infinite linear;
}
@-webkit-keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loadingCircle {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
</style>
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Flash Copilot</title>
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/outline.css" rel="stylesheet">
<style>
/*
* 所有滚动条不可见
* */
html::-webkit-scrollbar,
body::-webkit-scrollbar,
div::-webkit-scrollbar,
p::-webkit-scrollbar,
button::-webkit-scrollbar
{
width: 0.01px;
background-color: transparent;
}
html::-webkit-scrollbar-thumb,
body::-webkit-scrollbar-thumb,
div::-webkit-scrollbar-thumb,
p::-webkit-scrollbar-thumb,
button::-webkit-scrollbar-thumb
{
background-color: transparent;
}
</style>
</head>
<body style="background:transparent">
<script src="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/outline.js">
</script><div id="outline-container" contenteditable="true"><div style="background-color: rgb(0, 21, 41); padding: 8px; width: 300px;"><div class="ant-row" style="margin-left: -4px; margin-right: -4px; border: 1px solid white; padding: 4px;"><div class="ant-col ant-col-3" style="padding-left: 4px; padding-right: 4px;"><span role="img" aria-label="drag" class="anticon anticon-drag" style="font-size: 30px; color: white;"><svg viewBox="64 64 896 896" focusable="false" data-icon="drag" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M909.3 506.3L781.7 405.6a7.23 7.23 0 00-11.7 5.7V476H548V254h64.8c6 0 9.4-7 5.7-11.7L517.7 114.7a7.14 7.14 0 00-11.3 0L405.6 242.3a7.23 7.23 0 005.7 11.7H476v222H254v-64.8c0-6-7-9.4-11.7-5.7L114.7 506.3a7.14 7.14 0 000 11.3l127.5 100.8c4.7 3.7 11.7.4 11.7-5.7V548h222v222h-64.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V548h222v64.8c0 6 7 9.4 11.7 5.7l127.5-100.8a7.3 7.3 0 00.1-11.4z"></path></svg></span></div><div class="ant-col ant-col-21" style="padding-left: 4px; padding-right: 4px;"><input placeholder="Search" class="ant-input" type="text" value="" style="width: -webkit-fill-available;"></div></div><div class="no-scrollbar" style="min-height: 350px; max-height: 800px; overflow: scroll; max-width: 400px; opacity: 0; transform: translateX(-65.9871px) translateY(12.6671px) translateZ(0px);"></div></div></div>
</body></html>

534
public/report/年报_files/theme.css

@ -0,0 +1,534 @@
/*---------------------默认蓝色主题-------------------------*/
/*index.css 都带上.layui-layout-admin类*/
body.theme-blue .layui-layout-admin .layui-side {background-color: #002766;}
body.theme-blue .layui-layout-admin .layui-nav-tree .layui-checked-add {background-color: #1890ff;}
body.theme-blue .layui-layout-admin .layui-side-menu .layui-nav .layui-nav-item a:hover {background-color: #003a8c;}
body.theme-blue .layui-layout-admin .layui-nav-tree .layui-nav-item-selectd {background-color: #003a8c;}
body.theme-blue .layui-layout-admin .layui-side-menu .layui-nav .layui-nav-item .layui-card .fas{color: #096dd9;}
body.theme-blue .layui-layout-admin .layui-layer-tab .layui-layer-title span.layui-this{color: #1890ff;}
body.theme-blue #toast-container .layui-icon.layui-icon-ok{background-color: #2E8DED;}
/* body.theme-blue .layui-layout-admin .unis_logo {color: #32363a;} */
body.theme-blue .layui-layout-admin .layui-layer-tab .layui-layer-title span.layui-this{color: #0166CE;}
body.theme-blue .layui-layout-admin .layui-nav .layui-nav-item a{color: #e6f7ff;}
body.theme-blue .layui-layout-admin .front_role_deps_currut{background-color: #e6f7ff;}
body.theme-blue .layui-layout-admin .front_role_deps_currut a:hover{background-color: #e6f7ff;}
/*common.css*/
body.theme-blue .layui-btn-primary{border-color: #bfbfbf;color: #32363a;}
body.theme-blue .layui-btn-primary:hover{border-color: #40a9ff; color: #40a9ff; }
body.theme-blue .layui-btn-primary:active{border-color: #40a9ff; color: #40a9ff;}
body.theme-blue .layui-btn-normal{background-color:#1890ff;color:#ffffff;}
body.theme-blue .layui-btn-normal:hover{background-color: #40a9ff;}
body.theme-blue .layui-btn-normal:active{background-color: #1890ff;}
body.theme-blue .edoc-btn{background-color: #1890ff;}
body.theme-blue .edoc-btn:hover{background-color: #40a9ff;}
body.theme-blue .layui-input,
body.theme-blue .layui-textarea{border-color: #bfbfbf;color: #32363a;}
body.theme-blue .layui-input:hover,
body.theme-blue .layui-textarea:hover{border-color: #40a9ff ;}
body.theme-blue .layui-input:focus,
body.theme-blue .layui-textarea:focus{border-color: #40a9ff ;}
body.theme-blue .edoc-table-top-block .layui-layout-left .searchInput{border-color: #bfbfbf;color: #32363a;}
body.theme-blue .edoc-table-top-block .layui-layout-left .searchInput:hover{border-color: #40a9ff;}
body.theme-blue .edoc-table-top-block .layui-layout-left .searchInput:hover{border-color: #40a9ff;}
body.theme-blue .edoc-table-top-block .layui-nav:hover{border-color: #1890ff;}
body.theme-blue .layui-form-checkbox i{border-color: #bfbfbf;}
body.theme-blue .layui-form-checkbox:hover i{border-color: #1890ff;}
body.theme-blue .layui-form-checked[lay-skin="primary"] i{border-color: #1890ff; background-color: #1890ff; color: #fff;}
body.theme-blue .edoc-portal-search-bottom .layui-form-checked[lay-skin="primary"] i{ background-color: #fff;}
body.theme-blue .layui-form-onswitch{border-color: #1890ff; background-color: #1890ff;}
body.theme-blue .layui-form-onswitch.layui-checkbox-disbaled.layui-disabled[lay-skin="_switch"]{background-color:#A3D3FF;border-color: #A3D3FF;}
body.theme-blue .layui-form-radioed>i,body.theme-blue .layui-form-radio>i:hover{color: #1890ff;}
body.theme-blue .layui-form-select dl dd.layui-this{background-color: #e6f7ff;}
body.theme-blue .layui-input:hover, body.theme-blue .layui-textarea:hover{border-color: #1890ff;}
body.theme-blue .layui-input:focus, body.theme-blue .layui-textarea:focus{border-color: #1890ff;}
body.theme-blue .edoc-navOpt .layui-nav-item>a:hover>p{color:#1890ff;}
body.theme-blue .edoc-navOpt .layui-nav-item>a:hover>i{color:#1890ff;}
body.theme-blue .edoc-navOpt .layui-nav-item>a:hover>.layui-nav-more{color:#1890ff;}
body.theme-blue .edoc-navOpt>.layui-this>a:first-child {background-color:#e6f7ff;color:#1890ff;}
body.theme-blue .edoc-navOpt>.layui-this>a:first-child >i{color:#1890ff;}
body.theme-blue .edoc-navOpt .edoc-nav-thisParent>a>p,
body.theme-blue .edoc-navOpt .edoc-nav-thisParent>a>i:first-child{color: #1890ff;}
body.theme-blue .edoc-navOpt .layui-nav-child dd.layui-this>a:first-child{background-color: #e6f7ff;color:#1890ff !important;}
body.theme-blue .edoc-navOpt>.layui-nav-itemed dd>a:hover>p,
body.theme-blue .edoc-navOpt>.layui-nav-itemed dd>a:hover>i,
body.theme-blue .edoc-navOpt>.layui-nav-itemed dd>a:hover>.layui-nav-more{color: #1890ff;}
body.theme-blue .edoc-table-top-block .layui-nav .layui-nav-mored {border-color:transparent;border-bottom-color:#1890ff;}
body.theme-blue .layui-tab-brief > .layui-tab-title .layui-this:after,.layui-tab-brief > .layui-tab-more li.layui-this:after{border-bottom: 3px solid #1890ff;}
body.theme-blue .layui-tab.layui-tab-brief > .layui-tab-title .layui-this {color:#1890ff;}
body.theme-blue .eleTree-checkbox i:hover { border-color: #70ABE6; }
body.theme-blue .eleTree-node .eleTree-checkbox-checked i{border-color: #1890ff;background-color: #1890ff;}
body.theme-blue .eleTree-node-content .eleTree-node-content-more {color: #1890ff;}
body.theme-blue .eleTree-node .eleTree-node-content.eleTree-node-content-active .eleTree-node-content-label{background-color: #d1e8ff !important;color: #32363a;}
body.theme-blue .edoc-table-top-block .layui-nav {border-color: #bfbfbf;}
body.theme-blue .edoc-table-top-block .layui-layout-right .batchmenu-nav:hover{border-color:#40a9ff;background-color: #ffffff;}
body.theme-blue .edoc-table-top-block .layui-layout-right .layui-nav .layui-nav-mored {border-color:transparent;border-bottom-color:#1890ff;}
body.theme-blue .edoc-table-top-block .layui-nav:hover{border-color: #1890ff;}
body.theme-blue .edoc-table-top-block .layui-nav:hover .layui-nav-item >a{color: #1890ff;}
body.theme-blue .edoc-table-top-block .cols-filter {border: 1px solid #bfbfbf;}
body.theme-blue .edoc-table-top-block .cols-filter:hover{border: 1px solid #40a9ff;background-color: #ffffff;}
body.theme-blue .edoc-table-top-block .cols-filter:hover >i{color: #1890ff;}
body.theme-blue .edoc_helpManage_Icon .far.fa-question:hover{color:#1890ff;}
body.theme-blue .layui-header .layui-layout-right .far.fa-question-circle:hover{color:#40a9ff;}
body.theme-blue .layui-laypage a:hover{color: #0066CC;}
body.theme-blue .layui-laypage .layui-laypage-curr .layui-laypage-em{background-color: #1890ff; }
body.theme-blue .layui-laypage select:hover,
body.theme-blue .layui-laypage select:focus{border-color: #1890ff;}
body.theme-blue .layui-laydate .layui-this{background-color: #1890ff !important;color: #ffffff !important;}
body.theme-blue .laydate-theme-molv .layui-laydate-footer span:hover ,
body.theme-blue .laydate-theme-molv .layui-laydate-footer span[lay-type="date"]{color: #1890ff;}
body.theme-blue .layui-laydate-footer .laydate-footer-btns span:hover{color: #fff;background-color:#1890ff ;}
body.theme-blue .edoc-timeline>.layui-timeline-item>i{color: #1890ff;}
/* body.theme-blue .layui-timeline-axis{background-color: #fff; color: #1890ff;} */
/*console.css*/
body.theme-blue .notification .li-ltem .content.icon-hover{color: #1890ff;}
body.theme-blue .shortcut .layadmin-shortcut li a .fas.icon-hover{ color: #1890ff; }
body.theme-blue .car .layadmin-car li a .fas.icon-hover{ color: #1890ff; }
body.theme-blue .shortcut .layui-card-header i:hover{ color: #1890ff; }
body.theme-blue .edoc_helpManage_Icon .far.fa-cog:hover{color: #1890ff;}
body.theme-blue .edoc_helpManage_Icon .far.fa-expand-arrows-alt:hover{color: #1890ff;}
body.theme-blue .room .room-item li:hover .fas {color: #d8ebfd;}
body.theme-blue .car .layui-carousel-ind li.layui-this { background-color: #bae7ff; }
body.theme-blue .shortcut .layadmin-shortcut li a .fas{color: #1890ff;}
body.theme-blue .shortcut .layui-carousel-ind li.layui-this { background-color: #bae7ff; }
/*arrange_home.css*/
body.theme-blue .edoc-arch-item:hover .arch-item-icon i.fas{color: #f5faff;}
/*arrange_list.css*/
body.theme-blue .edoc-arrange-tree-title .fas:hover {color: #1890ff;}
body.theme-blue .edoc-arrange-tree-this{background-color: #d1e8ff;}
/*arrange_d_record.css*/
body.theme-blue .edoc-blocktag.edoc-blocktag-normal{background-color: #1890ff;color: #ffffff;}
body.theme-blue .edoc-blocktag.edoc-blocktag-normal:hover{background-color: #40a9ff;}
body.theme-blue .edoc-blocktag.edoc-blocktag-primary:hover{border-color: #1890ff;color: #1890ff;}
body.theme-blue .edoc-blocktag.edoc-blocktag-primary:hover .edoc-blocktag-icon i{color: #1890ff;}
body.theme-blue #Catalog_box dd.active a{color:#1890ff;}
body.theme-blue #Catalog_box dd a:hover{color:#1890ff;}
body.theme-blue .layui-btn-primary:hover i{color: #40a9ff !important;}
/*quickCheck_home.css*/
body.theme-blue .quickCheck-card:hover { box-shadow: 0 2px 8px #e6f7ff; background-color: #e6f7ff; }
body.theme-blue .quickCheck-card-checked { border-color: #40a9ff; box-shadow: 0 2px 8px #e6f7ff; background-color: #e6f7ff; }
/*virtualWarehouse_d_home.css*/
body.theme-blue .edoc-warehousePreviewAdjustment-block>ul>li>div[data-open=true]{background-color: #096dd9;}
body.theme-blue .edoc-virtualWarehouse-thisBorder{border-bottom: 2px solid #1890ff !important;}
/* body.theme-blue .edoc-virtualWarehouse-thisBorder:after{content: "";position: absolute;left: 0px;bottom: 0px;height: 2px;width: 100%;background-color: #1890ff;} */
body.theme-blue .edoc-warehousePreviewAdjustment-view table td:hover{background-color: #f7f9fc;}
/*arrange_d_batchModify.css*/
body.theme-blue .edoc-batchModifyPermissions-title{background-color: #e6f7ff;}
/*arrange_d_fileImport.css*/
body.theme-blue .edoc-stepItem-icon.edoc-stepItem-now .step-icon{background-color: #1890ff;}
body.theme-blue .layui-btn-link.filename .fas:hover,
body.theme-blue .layui-btn-link.filename .far:hover{color:#1890ff;}
body.theme-blue .edoc-stepItem-icon.edoc-stepItem-after .step-icon i{color: #1890ff;}
/*前台 都带着 .edoc-main 类*/
/*portal.css*/
body.theme-blue .edoc-main .layui-tab-title li:hover{color: #1890ff;}
/* body.theme-blue .edoc-main .edoc-tab-content-left p:hover{color: #1890ff;} */
body.theme-blue .edoc-main .edoc-front-layout-content .edoc-front-body .edoc-portal-content{background-color: #0A6ED1;}
/*common_front.css*/
body.theme-blue .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav-bar{background-color: #1890ff;}
body.theme-blue .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav .layui-nav-item a:hover{color: #1890ff;}
body.theme-blue .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav .layui-nav-item.layui-this a{color: #1890ff;}
body.theme-blue .edoc-main .edoc-front-selectBtn a.current{background-color: #e6f7ff !important;}
body.theme-blue .layui-tree-line .layui-tree-set.current>.layui-tree-entry .layui-tree-txt{background-color: #d1e8ff;}
body.theme-blue .edoc-main .edoc-front-form .layui-form-item .layui-form-checkbox[lay-skin="primary"]:hover i{border-color: #1890ff !important;}
body.theme-blue .edoc-main .edoc-tab-border.layui-tab-brief .layui-tab-title .layui-this{background-color: #e6f7ff;}
body.theme-blue .edoc-main .edoc-tab-border.layui-tab-brief .layui-tab-title .layui-this:before{background-color: #1890ff;}
/* body.theme-blue .edoc-main .edoc-portal-header .header-hover:hover{color: #1890ff;} */
body.theme-blue .edoc-main .front_role_units_content .front_role_deps.front_role_deps_currut{background-color: #e6f7ff;}
body.theme-blue .edoc-main .layui-nav .layui-nav-child dd.layui-this a{background-color: #e6f7ff;}
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item.current{ background-color: #e6f7ff; }
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item.current .edoc-side-nav-item-text{color:#1890ff;}
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item.current .edoc-side-nav-item-icon{color:#1890ff;}
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item .edoc-side-nav-bar{ background-color: #1890ff; }
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item:hover .edoc-side-nav-item-icon{color: #1890ff;}
body.theme-blue .edoc-main .edoc-side-nav .edoc-side-nav-item:hover .edoc-side-nav-item-text{color: #1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title.current .edoc-side-nav-item-text{color:#1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title.current .edoc-side-nav-item-icon{color:#1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover{color: #1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover .edoc-side-nav-item-icon{color: #1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover .edoc-side-nav-item-text{color: #1890ff;}
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .current{ background-color: #e6f7ff; }
body.theme-blue .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-bar{ background-color: #1890ff; }
body.theme-blue .edoc-main .edoc-front-btn:hover{border-color: #40a9ff;color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn:focus{border-color: #40a9ff;color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn:active{border-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn.edoc-front-btn-normal{background-color: #1890ff;border-color: #1890ff;color: #ffffff;}
body.theme-blue .edoc-main .edoc-front-btn.edoc-front-btn-normal[disabled]{background-color: #bae7ff;border-color: #bae7ff;color: #ffffff;}
body.theme-blue .edoc-main .edoc-front-btn.edoc-front-btn-normal:hover{background-color: #40a9ff;color: #fff;border-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn.edoc-front-btn-normal[disabled]:hover{background-color: #bae7ff;border-color: #bae7ff;color: #ffffff !important;}
body.theme-blue .edoc-main .edoc-front-btn:hover{border-color: #40a9ff;color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn:focus{border-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-btn:active{border-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal{background-color: #1890ff;}
body.theme-blue .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal:hover{background-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-batchBtn:hover{color: #40a9ff;border-color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-batchBtn:hover>li>a.unis-icon{color: #40a9ff;}
body.theme-blue .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal .layui-nav-item>a.unis-icon{color: #ffffff;}
body.theme-blue .edoc-main .edocpage .edocpage-curr{background-color: #1890ff;}
body.theme-blue .edoc-main .edocpage .edocpage-skip .edocpage-input:hover{border-color: #1890ff;}
body.theme-blue .edoc-main .edocpage .edocpage-skip .edocpage-input:focus{border-color: #1890ff;}
/* 前台弹窗底部按钮 */
body.theme-blue .edoc-dialog-bottom .edoc-front-btn:hover{border-color: #40a9ff;color: #40a9ff;}
body.theme-blue .edoc-dialog-bottom .edoc-front-btn:focus{border-color: #40a9ff;color: #40a9ff;}
body.theme-blue .edoc-dialog-bottom .edoc-front-btn:active{border-color: #40a9ff;}
body.theme-blue .edoc-dialog-bottom .edoc-front-btn.edoc-front-btn-normal{background-color: #1890ff;border-color: #1890ff;color: #ffffff;}
body.theme-blue .edoc-dialog-bottom .edoc-front-btn.edoc-front-btn-normal:hover{background-color: #40a9ff;border-color: #40a9ff;}
body.theme-blue .edoc-main .layui-input:focus{box-shadow: 0 0 0 2px #e6f7ff;-webkit-box-shadow: 0 0 0 2px #e6f7ff;animation: fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode: forwards;}
body.theme-blue .edoc-main .layui-input:active{box-shadow:0px 0px 0px 2px #e6f7ff;}
body.theme-blue .layui-layer .layui-layer-btn .layui-layer-btn0{background-color: #1890ff;border-color: #1890ff;color: #fff;}
body.theme-blue .layui-layer .layui-layer-btn .layui-layer-btn0:hover{background-color: #40a9ff;border-color: #40a9ff;color: #fff;}
body.theme-blue .layui-layer .layui-layer-btn .layui-layer-btn0:active{box-shadow: 0 0 0 2px #e6f7ff;background-color: #1890ff;border-color: #1890ff;color: #fff;}
body.theme-blue .layui-layer .layui-layer-btn a:hover{border-color: #1890ff;color: #40a9ff;}
body.theme-blue .layui-layer .layui-layer-btn a:active{box-shadow: 0 0 0 2px #e6f7ff;border-color: #1890ff;color: #40a9ff;}
body.theme-blue .layui-layer .edoc-dialog-input:focus{border-color: #1890ff;}
body.theme-blue .edoc-main .edoc-rightNav-fixedNav .layui-timeline-content.current .layui-timeline-title a{color: #1890ff;}
body.theme-blue .edoc-main .edoc-rightNav-fixedNav .layui-timeline-content.current:before{background-color: #1890ff;}
body.theme-blue .edoc-main .edoc-front-timeline .layui-timeline-axis.unis-icon{color: #1890ff;}
body.theme-blue .edoc-main .edoc-front-timeline .layui-timeline-item:before{background-color: #1890ff;}
body.theme-blue .use-pop .edoc-contentBlock-head .layui-timeline-axis.closePop:hover{color:#1890ff !important;}
body.theme-blue .use-pop .edoc-contentBlock-head .layui-timeline-axis.closePop:active{color:#40a9ff !important;}
/* 前台——快速检索 */
body.theme-blue .edoc-main .edoc-searchquick-complex:hover,
body.theme-blue .edoc-main .edoc-searchquick-complex:focus{border-color: #1890ff;}
body.theme-blue .edoc-main .edoc-searchquick-complex:active{border-color: #1890ff;box-shadow: 0px 0px 0px 2px #e6f7ff;}
/* utilize.css */
body.theme-blue .edoc-main .step-log .edoc-contentBlock-head .layui-timeline-axis:hover{color: #1890ff;}
/* borrowCar.css */
body.theme-blue .edoc-main .edoc-borrowCar-footBody{background-color: #e6f7ff;}
body.theme-blue .edoc-main .edoc-rightNav-content>div.edoc-applyDetail_class-foot{background-color: #e6f7ff;}
body.theme-blue .edoc-main .applyDetail-right>.applyDetail-right_top>button:hover,
body.theme-blue .edoc-main .applyDetail-right>.applyDetail-right_top>button:hover>i{color: #1890ff;}
/* catalog.css */
body.theme-blue .edoc-main .edoc-catalog-tree-this{background-color: #d1e8ff !important;}
/* searchadvanced.css */
body.theme-blue .edoc-main .edoc-body-top-wrap .condition-top .selectY-box .show:hover,
body.theme-blue .edoc-main .edoc-body-top-wrap .condition-top .selectY-box .show:focus{border-color: #1890ff !important;}
body.theme-blue .edoc-main .searchAdvance-select .selectY-box .pop ul li.active{background-color: #E6F7FF;}
body.theme-blue .edoc-main .searchAdvance-select .selectY-box .pop ul li:hover{background-color: #F7F7F7;}
/* multilingual_home.css */
body.theme-blue .icondivs .far.fa-cog:hover{color: #1890ff;}
/* 虚拟库房 */
body.theme-blue .edoc-warehousePreviewAdjustment-block .occupy{background-color: #bae7ff;}
body.theme-blue .edoc-warehousePreviewAdjustment-block .default{background-color: #e6f7ff;}
body.theme-blue #selectTargetArchives:hover,
body.theme-blue #selectTargetArchives:focus{border-color: #1890ff;}
/* 帮助管理 */
body.theme-blue .stepBlock .stepBlock_item_orderNum .orderindex{border: 1px solid #1890ff;background-color: #1890ff;}
body.theme-blue .detail_order{background-color: #1890ff;}
body.theme-blue .stepBlock .stepBlock_item_pic_li:hover{border-color: #1890ff;}
body.theme-blue .stepBlock .stepBlock_item_pic_li .fa-trash-alt{color: #1890ff;}
body.theme-blue .stepBlock .stepBlock_item_pic_li_btn:hover{border-color: #1890ff;}
body.theme-blue .stepBlock .stepBlock_item_pic_li_btn:hover span{color: #1890ff;}
/* 批量装盒 */
body.theme-blue .d_batchCartoning_table .layui-table-cell select:hover,
body.theme-blue .d_batchCartoning_table .layui-table-cell select:focus{border-color: #1890ff;}
/* 输入型下拉框 */
body.theme-blue .edoc-inputselect-this{background:#e6f7ff;}
/*----------------------紫色主题------------------------------*/
/*index.css*/
body.theme-purple .layui-layout-admin .layui-side {background-color: #450043;}
body.theme-purple .layui-layout-admin .layui-nav-tree .layui-checked-add {background-color: #920784;}
body.theme-purple .layui-layout-admin .layui-side-menu .layui-nav .layui-nav-item a:hover {background-color: #6b0064;}
body.theme-purple .layui-layout-admin .layui-nav-tree .layui-nav-item-selectd {background-color: #6b0064;}
body.theme-purple .layui-layout-admin .layui-side-menu .layui-nav .layui-nav-item .layui-card .fas{color: #920784;}
body.theme-purple #toast-container .layui-icon.layui-icon-ok{background-color: #920784;}
/* body.theme-purple .layui-layout-admin .unis_logo {color: #811086;} */
body.theme-purple .layui-layout-admin .layui-layer-tab .layui-layer-title span.layui-this{color: #920784;}
body.theme-purple .layui-layout-admin .layui-nav .layui-nav-item a{color: #fbf3f9;}
body.theme-purple .layui-layout-admin .front_role_deps_currut{background-color: #fbf3f9;}
body.theme-purple .layui-layout-admin .front_role_deps_currut a:hover{background-color: #fbf3f9;}
body.theme-purple .layui-layout-admin .layui-layer-tab .layui-layer-title span.layui-this{color: #920784;}
/*common.css*/
body.theme-purple .layui-btn-primary{border-color: #bfbfbf;color: #32363a;}
body.theme-purple .layui-btn-primary:hover{border-color: #920784; color: #920784; }
body.theme-purple .layui-btn-primary:active{border-color: #920784; color: #920784;}
body.theme-purple .layui-btn-normal{background-color:#920784;color:#ffffff;}
body.theme-purple .layui-btn-normal:hover{background-color: #6b0064;}
body.theme-purple .layui-btn-normal:active{background-color: #6b0064;}
body.theme-purple .edoc-btn{background-color: #920784;}
body.theme-purple .edoc-btn:hover{background-color: #6b0064;}
body.theme-purple .layui-input,
body.theme-purple .layui-textarea{border-color: #bfbfbf;color: #32363a;}
body.theme-purple .layui-input:hover,
body.theme-purple .layui-textarea:hover{border-color: #920784;}
body.theme-purple .layui-input:focus,
body.theme-purple .layui-textarea:focus{border-color: #920784;}
body.theme-purple .edoc-table-top-block .layui-layout-left .searchInput{border-color: #bfbfbf;color: #32363a;}
body.theme-purple .edoc-table-top-block .layui-layout-left .searchInput:hover{border-color: #920784;}
body.theme-purple .edoc-table-top-block .layui-layout-left .searchInput:hover{border-color: #920784;}
body.theme-purple .edoc-table-top-block .layui-nav:hover{border-color: #920784;}
body.theme-purple .layui-form-checkbox i{border-color: #bfbfbf;}
body.theme-purple .layui-form-checkbox:hover i{border-color: #920784;}
body.theme-purple .layui-form-checked[lay-skin="primary"] i{border-color: #920784; background-color: #920784; color: #fff;}
body.theme-purple .layui-form-onswitch{border-color: #920784; background-color: #920784;}
body.theme-purple .layui-form-onswitch.layui-checkbox-disbaled.layui-disabled[lay-skin="_switch"]{background-color:#f7e3f2;border-color: #f7e3f2;}
body.theme-purple .layui-form-radioed>i,body.theme-purple .layui-form-radio>i:hover{color: #920784;}
body.theme-purple .layui-form-select dl dd.layui-this{background-color: #fbf3f9;}
body.theme-purple .layui-input:hover, body.theme-purple .layui-textarea:hover{border-color: #920784;}
body.theme-purple .layui-input:focus, body.theme-purple .layui-textarea:focus{border-color: #920784;}
body.theme-purple .edoc-navOpt .layui-nav-item>a:hover>p{color:#920784;}
body.theme-purple .edoc-navOpt .layui-nav-item>a:hover>i{color:#920784;}
body.theme-purple .edoc-navOpt .layui-nav-item>a:hover>.layui-nav-more{color:#920784;}
body.theme-purple .edoc-navOpt>.layui-this>a:first-child {background-color:#f9ebf5;color:#920784;}
body.theme-purple .edoc-navOpt>.layui-this>a:first-child >i{color:#920784;}
body.theme-purple .edoc-navOpt .edoc-nav-thisParent>a>p,
body.theme-purple .edoc-navOpt .edoc-nav-thisParent>a>i:first-child{color: #920784;}
body.theme-purple .edoc-navOpt .layui-nav-child dd.layui-this>a:first-child{background-color: #f9ebf9;color:#920784 !important;}
body.theme-purple .edoc-navOpt>.layui-nav-itemed dd>a:hover>p,
body.theme-purple .edoc-navOpt>.layui-nav-itemed dd>a:hover>i,
body.theme-purple .edoc-navOpt>.layui-nav-itemed dd>a:hover>.layui-nav-more{color: #920784;}
body.theme-purple .edoc-table-top-block .layui-nav .layui-nav-mored {border-color:transparent;border-bottom-color:#920784;}
body.theme-purple .layui-tab-brief > .layui-tab-title .layui-this:after,.layui-tab-brief > .layui-tab-more li.layui-this:after{border-bottom: 3px solid #920784;}
body.theme-purple .layui-tab.layui-tab-brief > .layui-tab-title .layui-this {color:#920784;}
body.theme-purple .eleTree-checkbox i:hover { border-color: #920784; }
body.theme-purple .eleTree-node .eleTree-checkbox-checked i{border-color: #920784;background-color: #920784;}
body.theme-purple .eleTree-node-content .eleTree-node-content-more {color: #920784;}
body.theme-purple .eleTree-node .eleTree-node-content.eleTree-node-content-active .eleTree-node-content-label{background-color: #f9ebf5 !important;color: #32363a;}
body.theme-purple .edoc-table-top-block .layui-nav {border-color: #bfbfbf;}
body.theme-purple .edoc-table-top-block .layui-layout-right .batchmenu-nav:hover{border-color:#920784;background-color: #ffffff;}
body.theme-purple .edoc-table-top-block .layui-layout-right .layui-nav .layui-nav-mored {border-color:transparent;border-bottom-color:#920784;}
body.theme-purple .edoc-table-top-block .layui-nav .layui-nav-item>a:hover {color: #920784;}
body.theme-purple .edoc-table-top-block .layui-nav .layui-nav-item:hover >a {color: #920784;}
body.theme-purple .edoc-table-top-block .cols-filter {border: 1px solid #bfbfbf;}
body.theme-purple .edoc-table-top-block .cols-filter:hover >i{color: #920784;}
body.theme-purple .edoc-table-top-block .cols-filter:hover{border: 1px solid #920784;background-color: #ffffff;}
body.theme-purple .edoc_helpManage_Icon .far.fa-question:hover{color:#920784;}
body.theme-purple .layui-header .layui-layout-right .far.fa-question-circle:hover{color:#920784;}
body.theme-purple .layui-laypage a:hover{color: #6a6d70;}
body.theme-purple .layui-laypage .layui-laypage-curr .layui-laypage-em{background-color: #920784; }
body.theme-purple .layui-laypage select:hover,
body.theme-purple .layui-laypage select:focus{border-color: #920784;}
body.theme-purple .layui-laydate .layui-this{background-color: #920784 !important;color: #ffffff !important;}
body.theme-purple .laydate-theme-molv .layui-laydate-footer span:hover ,
body.theme-purple .laydate-theme-molv .layui-laydate-footer span[lay-type="date"]{color: #920784;}
body.theme-purple .layui-laydate-footer .laydate-footer-btns span:hover{color: #fff;background-color:#920784 ;}
body.theme-purple .edoc-timeline>.layui-timeline-item>i{color: #920784;}
/* body.theme-purple .layui-timeline-axis{background-color: #fff; color: #920784;} */
/*console.css*/
body.theme-purple .shortcut .layadmin-shortcut li a .fas.icon-hover{ color: #920784; }
body.theme-purple .car .layadmin-car li a .fas.icon-hover{ color: #920784; }
body.theme-purple .shortcut .layui-card-header i:hover{ color: #920784; }
body.theme-purple .edoc_helpManage_Icon .far.fa-cog:hover{color: #920784;}
body.theme-purple .edoc_helpManage_Icon .far.fa-expand-arrows-alt:hover{color: #920784;}
body.theme-purple .room .room-item li:hover .fas {color: #f7e3f2;}
body.theme-purple .car .layui-carousel-ind li.layui-this { background-color: #f7e3f2; }
body.theme-purple .shortcut .layadmin-shortcut li a .fas{color: #920784;}
body.theme-purple .shortcut .layui-carousel-ind li.layui-this { background-color: #f7e3f2; }
/*arrange_home.css*/
body.theme-purple .edoc-arch-item:hover .arch-item-icon i.fas{color: #f9ebf5;}
/*arrange_list.css*/
body.theme-purple .edoc-arrange-tree-title .fas:hover {color: #920784;}
body.theme-purple .edoc-arrange-tree-this{background-color: #f9ebf5;}
/*arrange_d_record.css*/
body.theme-purple .edoc-blocktag.edoc-blocktag-normal{background-color: #920784;color: #ffffff;}
body.theme-purple .edoc-blocktag.edoc-blocktag-normal:hover{background-color: #6b0064;}
body.theme-purple .edoc-blocktag.edoc-blocktag-primary:hover{border-color: #920784;color: #920784;}
body.theme-purple .edoc-blocktag.edoc-blocktag-primary:hover .edoc-blocktag-icon i{color: #920784;}
body.theme-purple #Catalog_box dd.active a{color:#920784;}
body.theme-purple #Catalog_box dd a:hover{color:#920784;}
body.theme-purple .layui-btn-primary:hover i{color: #6b0064 !important;}
/*quickCheck_home.css*/
body.theme-purple .quickCheck-card:hover{box-shadow: 0 2px 8px #fbf3f9; background-color: #fbf3f9;}
body.theme-purple .quickCheck-card-checked { border-color: #920784; box-shadow: 0 2px 8px #fbf3f9; background-color: #fbf3f9; }
/*virtualWarehouse_d_home.css*/
body.theme-purple .edoc-warehousePreviewAdjustment-block>ul>li>div[data-open=true]{background-color: #6b0064;}
body.theme-purple .edoc-virtualWarehouse-thisBorder{border-bottom: 2px solid #920784 !important;}
body.theme-purple .edoc-warehousePreviewAdjustment-view table td:hover{background-color: #fbf3f9;}
/*arrange_d_batchModify.css*/
body.theme-purple .edoc-batchModifyPermissions-title{background-color: #f9ebf5;}
/*arrange_d_fileImport.css*/
body.theme-purple .edoc-stepItem-icon.edoc-stepItem-now .step-icon{background-color: #920784;}
body.theme-purple .layui-btn-link.filename .fas:hover,
body.theme-purple .layui-btn-link.filename .far:hover{color:#920784;}
body.theme-purple .edoc-stepItem-icon.edoc-stepItem-after .step-icon i{color: #920784;}
/*前台 都带着 .edoc-main 类*/
/*portal.css*/
body.theme-purple .edoc-main .layui-tab-title li:hover{color: #920784;}
/* body.theme-purple .edoc-main .edoc-tab-content-left p:hover{color: #920784;} */
body.theme-purple .edoc-main .edoc-front-layout-content .edoc-front-body .edoc-portal-content{background-color: #920784;}
/*common_front.css*/
body.theme-purple .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav-bar{background-color: #920784;}
body.theme-purple .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav .layui-nav-item a:hover{color: #920784;}
body.theme-purple .edoc-main .edoc-portal-header .edoc-portal-header-right .layui-nav .layui-nav-item.layui-this a{color: #920784;}
body.theme-purple .edoc-main .edoc-front-selectBtn a.current{background-color: #f9ebf5 !important;}
body.theme-purple .layui-tree-line .layui-tree-set.current>.layui-tree-entry .layui-tree-txt{background-color: #f9ebf5;}
body.theme-purple .edoc-main .edoc-front-form .layui-form-item .layui-form-checkbox[lay-skin="primary"]:hover i{border-color: #920784 !important;}
body.theme-purple .edoc-main .edoc-tab-border.layui-tab-brief .layui-tab-title .layui-this{background-color: #FBF3F9;}
body.theme-purple .edoc-main .edoc-tab-border.layui-tab-brief .layui-tab-title .layui-this:before{background-color: #920784;}
/* body.theme-purple .edoc-main .edoc-portal-header .header-hover:hover{color: #920784;} */
body.theme-purple .edoc-main .front_role_units_content .front_role_deps.front_role_deps_currut{background-color: #f9ebf5;}
body.theme-purple .edoc-main .layui-nav .layui-nav-child dd.layui-this a{background-color: #f9ebf5;}
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item.current{ background-color: #f9ebf5; }
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item.current .edoc-side-nav-item-text{color:#920784;}
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item.current .edoc-side-nav-item-icon{color:#920784;}
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item .edoc-side-nav-bar{ background-color: #920784; }
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item:hover .edoc-side-nav-item-icon{color: #920784;}
body.theme-purple .edoc-main .edoc-side-nav .edoc-side-nav-item:hover .edoc-side-nav-item-text{color: #920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title.current .edoc-side-nav-item-text{color:#920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title.current .edoc-side-nav-item-icon{color:#920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover{color: #920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover .edoc-side-nav-item-icon{color: #920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-item-title:hover .edoc-side-nav-item-text{color: #920784;}
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .current{ background-color: #f9ebf5; }
body.theme-purple .edoc-main .edoc-side-childNav .edoc-side-nav-item .edoc-side-nav-bar{ background-color: #920784; }
body.theme-purple .edoc-main .edoc-front-btn:hover{border-color: #920784;color: #920784}
body.theme-purple .edoc-main .edoc-front-btn:focus{border-color: #920784;color: #920784}
body.theme-purple .edoc-main .edoc-front-btn:active{border-color: #920784;}
body.theme-purple .edoc-main .edoc-front-btn.edoc-front-btn-normal{background-color: #920784;border-color: #920784;color: #ffffff;}
body.theme-purple .edoc-main .edoc-front-btn.edoc-front-btn-normal[disabled]{background-color: #F7E3F2;border-color: #F7E3F2;color: #ffffff;}
body.theme-purple .edoc-main .edoc-front-btn.edoc-front-btn-normal:hover{background-color: #6b0064;border-color: #6b0064;}
body.theme-purple .edoc-main .edoc-front-btn.edoc-front-btn-normal[disabled]:hover{background-color: #F7E3F2;border-color: #F7E3F2;color: #ffffff !important;}
body.theme-purple .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal{background-color: #920784;}
body.theme-purple .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal:hover{background-color: #6b0064;}
body.theme-purple .edoc-main .edoc-front-batchBtn:hover{color: #920784;border-color: #920784;}
body.theme-purple .edoc-main .edoc-front-batchBtn:hover>li>a.unis-icon{color: #920784;}
body.theme-purple .edoc-main .edoc-front-batchBtn.edoc-front-btn-normal .layui-nav-item>a.unis-icon{color: #ffffff;}
body.theme-purple .edoc-main .edocpage .edocpage-curr{background-color: #920784;}
body.theme-purple .edoc-main .edocpage .edocpage-skip .edocpage-input:hover{border-color: #920784;}
body.theme-purple .edoc-main .edocpage .edocpage-skip .edocpage-input:focus{border-color: #920784;}
/* 前台弹窗底部按钮 */
body.theme-purple .edoc-dialog-bottom .edoc-front-btn:hover{border-color: #920784;color: #920784;}
body.theme-purple .edoc-dialog-bottom .edoc-front-btn:focus{border-color: #920784;color: #920784;}
body.theme-purple .edoc-dialog-bottom .edoc-front-btn:active{border-color: #920784;}
body.theme-purple .edoc-dialog-bottom .edoc-front-btn.edoc-front-btn-normal{background-color: #920784;border-color: #920784;color: #ffffff;}
body.theme-purple .edoc-dialog-bottom .edoc-front-btn.edoc-front-btn-normal:hover{background-color: #6b0064;border-color: #6b0064;}
body.theme-purple .edoc-main .layui-input:focus{box-shadow: 0 0 0 2px #f9ebf5;-webkit-box-shadow: 0 0 0 2px #f9ebf5;animation: fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation-fill-mode: forwards;}
body.theme-purple .edoc-main .layui-input:active{box-shadow:0px 0px 0px 2px #f9ebf5;}
body.theme-purple .layui-layer .layui-layer-btn .layui-layer-btn0{background-color: #920784;border-color: #920784;color: #fff;}
body.theme-purple .layui-layer .layui-layer-btn .layui-layer-btn0:hover{background-color: #6b0064;border-color: #6b0064;color: #fff;}
body.theme-purple .layui-layer .layui-layer-btn .layui-layer-btn0:active{box-shadow: 0 0 0 2px #f9ebf5;background-color: #6b0064;border-color: #6b0064;color: #fff;}
body.theme-purple .layui-layer .layui-layer-btn a:hover{border-color: #920784;color: #920784;}
body.theme-purple .layui-layer .layui-layer-btn a:active{box-shadow: 0 0 0 2px #f9ebf5;border-color: #920784;color: #920784;}
body.theme-purple .layui-layer .edoc-dialog-input:focus{border-color: #920784;}
body.theme-purple .edoc-main .edoc-rightNav-fixedNav .layui-timeline-content.current .layui-timeline-title a{color: #920784;}
body.theme-purple .edoc-main .edoc-rightNav-fixedNav .layui-timeline-content.current:before{background-color: #920784;}
body.theme-purple .edoc-main .edoc-front-timeline .layui-timeline-axis.unis-icon{color: #920784;}
body.theme-purple .edoc-main .edoc-front-timeline .layui-timeline-item:before{background-color: #920784;}
body.theme-purple .use-pop .edoc-contentBlock-head .layui-timeline-axis.closePop:hover{color:#920784 !important;}
body.theme-purple .use-pop .edoc-contentBlock-head .layui-timeline-axis.closePop:active{color:#920784 !important;}
/* 前台——快速检索 */
body.theme-purple .edoc-main .edoc-searchquick-complex:hover,
body.theme-purple .edoc-main .edoc-searchquick-complex:focus{border-color: #920784;}
body.theme-purple .edoc-main .edoc-searchquick-complex:active{border-color: #920784;box-shadow: 0px 0px 0px 2px #F9EBF5;}
/* utilize.css */
body.theme-purple .edoc-main .step-log .edoc-contentBlock-head .layui-timeline-axis:hover{color: #920784;}
/* borrowCar.css */
body.theme-purple .edoc-main .edoc-borrowCar-footBody{background-color: #FBF3F9;}
body.theme-purple .edoc-main .edoc-rightNav-content>div.edoc-applyDetail_class-foot{background-color: #FBF3F9;}
body.theme-purple .edoc-main .applyDetail-right>.applyDetail-right_top>button:hover,
body.theme-purple .edoc-main .applyDetail-right>.applyDetail-right_top>button:hover>i{color: #920784;}
/* catalog.css */
body.theme-purple .edoc-main .edoc-catalog-tree-this{background-color: #f9ebf5 !important;}
/* searchadvanced.css */
body.theme-purple .edoc-main .edoc-body-top-wrap .condition-top .selectY-box .show:hover,
body.theme-purple .edoc-main .edoc-body-top-wrap .condition-top .selectY-box .show:focus{border-color: #920784 !important;}
body.theme-purple .edoc-main .searchAdvance-select .selectY-box .pop ul li.active{background-color: #f9ebf5;}
body.theme-purple .edoc-main .searchAdvance-select .selectY-box .pop ul li:hover{background-color: #F7F7F7;}
/* multilingual_home.css */
body.theme-purple .icondivs .far.fa-cog:hover{color: #920784;}
/* 虚拟库房 */
body.theme-purple .edoc-warehousePreviewAdjustment-block .occupy{background-color: #e09ccf;}
body.theme-purple .edoc-warehousePreviewAdjustment-block .default{background-color: #f9ebf5;}
body.theme-purple #selectTargetArchives:hover,
body.theme-purple #selectTargetArchives:focus{border-color: #920784;}
/* 帮助管理 */
body.theme-purple .stepBlock .stepBlock_item_orderNum .orderindex{border: 1px solid #920784;background-color: #920784;}
body.theme-purple .detail_order{background-color: #920784;}
body.theme-purple .stepBlock .stepBlock_item_pic_li:hover{border-color: #920784;}
body.theme-purple .stepBlock .stepBlock_item_pic_li .fa-trash-alt{color: #920784;}
body.theme-purple .stepBlock .stepBlock_item_pic_li_btn:hover{border-color: #920784;}
body.theme-purple .stepBlock .stepBlock_item_pic_li_btn:hover span{color: #920784;}
/* 批量装盒 */
body.theme-purple .d_batchCartoning_table .layui-table-cell select:hover,
body.theme-purple .d_batchCartoning_table .layui-table-cell select:focus{border-color: #920784;}
/* 输入型下拉框 */
body.theme-purple .edoc-inputselect-this{background:#f9ebf5;}

14
public/report/年报_files/translate(1).html

@ -0,0 +1,14 @@
<!DOCTYPE html>
<!-- saved from url=(0066)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/translate.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/translate.css" rel="stylesheet">
<style>
</style>
</head>
<body style="display: inline-block;width: auto;height: auto"><div id="content-container" class="content-container" style="opacity: 0; transform: translateY(-50px) translateZ(0px);"><div></div><div><div id="anno-yellow" class="anno-action highlight-yellow"></div><div id="anno-blue" class="anno-action highlight-blue"></div><div id="anno-brown" class="anno-action highlight-brown"></div><div id="anno-red" class="anno-action highlight-red"></div></div></div>
</body></html>

14
public/report/年报_files/translate.html

@ -0,0 +1,14 @@
<!DOCTYPE html>
<!-- saved from url=(0066)chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/translate.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="icon" href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/%PUBLIC_URL%/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="chrome-extension://dppcnmibpgmagiigcnfdjpnghplibbna/static/css/translate.css" rel="stylesheet">
<style>
</style>
</head>
<body style="display: inline-block;width: auto;height: auto"><div id="content-container" class="content-container" style="opacity: 0; transform: translateY(-50px) translateZ(0px);"><div></div><div><div id="anno-yellow" class="anno-action highlight-yellow"></div><div id="anno-blue" class="anno-action highlight-blue"></div><div id="anno-brown" class="anno-action highlight-brown"></div><div id="anno-red" class="anno-action highlight-red"></div></div></div>
</body></html>

3
public/static/config.js

@ -1,7 +1,8 @@
window.g = {
AXIOS_TIMEOUT: 10000,
// ApiUrl: 'http://27.16.212.58:11100', // 配置服务器地址,
ApiUrl: 'http://192.168.99.71:11110',
// ApiUrl: 'http://192.168.99.71:11110',
ApiUrl: 'http://192.168.99.107:11100',
// ParentPage: { // 后续看需求配置
// CrossDomainProxyUrl: '/Home/CrossDomainProxy',
// BtnsApi: '/api/services/app/Authorization/GetBtns',

59
src/api/report.js

@ -0,0 +1,59 @@
import request from '@/utils/request'
export function loadData(params, token) {
return request({
url: '/ureport/loadData',
method: 'post',
headers: { 'X-Token': token },
data: params
})
}
export function downloadWord(params, token) {
return request({
url: '/ureport/download/word',
method: 'post',
headers: { 'X-Token': token },
responseType: 'arraybuffer',
data: params
})
}
export function downloadExcel(params, token) {
return request({
url: '/ureport/download/excel',
method: 'post',
headers: { 'X-Token': token },
responseType: 'arraybuffer',
data: params
})
}
export function downloadPDF(params, token) {
return request({
url: '/ureport/download/pdf',
method: 'post',
headers: { 'X-Token': token },
responseType: 'arraybuffer',
data: params
})
}
export function print(params, token) {
return request({
url: '/ureport/print',
method: 'post',
headers: { 'X-Token': token },
responseType: 'arraybuffer',
data: params
})
}
export function refreshSearchForm(params, token) {
return request({
url: '/ureport/refreshForm',
method: 'post',
headers: { 'X-Token': token },
data: params
})
}

1
src/assets/icons/svg/sta.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739330265899" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5089" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M978.286 320H960V182.857a45.714 45.714 0 0 0-45.714-45.714H507.758l-31.452-44.764a45.787 45.787 0 0 0-37.449-19.456H45.714A45.714 45.714 0 0 0 0 118.638v786.285c0 25.235 20.48 45.715 45.714 45.715h932.572c25.234 0 45.714-20.48 45.714-45.715V365.714A45.714 45.714 0 0 0 978.286 320zM868.57 228.571V320H636.27l-64.293-91.429h296.594z m64 630.638H91.43V164.352h323.657l160.036 227.62a45.641 45.641 0 0 0 37.376 19.457h320v447.78z" fill="#ffffff" p-id="5090"></path><path d="M476.599 632.54H184.027a45.714 45.714 0 0 0 0 91.428H476.6a45.714 45.714 0 0 0 0-91.429z m-14.044-242.615l-86.454 86.454-116.81-58.44a45.787 45.787 0 0 0-52.736 8.557l-73.142 73.143a45.714 45.714 0 0 0 64.658 64.658l49.883-49.883 116.81 58.44a45.495 45.495 0 0 0 52.735-8.557l109.715-109.714a45.714 45.714 0 0 0-64.659-64.658z" fill="#ffffff" p-id="5091"></path></svg>

BIN
src/assets/images/graph-img.png

After

Width: 1170  |  Height: 810  |  Size: 105 KiB

BIN
src/assets/images/index-img7.png

After

Width: 24  |  Height: 24  |  Size: 751 B

BIN
src/assets/images/index-img8.png

After

Width: 36  |  Height: 36  |  Size: 716 B

BIN
src/assets/images/list-bg.png

After

Width: 1692  |  Height: 948  |  Size: 840 KiB

BIN
src/assets/images/run.png

After

Width: 200  |  Height: 200  |  Size: 2.8 KiB

BIN
src/assets/images/wenhao.png

After

Width: 200  |  Height: 200  |  Size: 5.7 KiB

58
src/assets/styles/yxk-admin.scss

@ -1674,34 +1674,7 @@ input[type ='number'] {
}
}
}
.des-title {
position: relative;
height: 28px;
margin-bottom: 10px;
font-size: 14px;
font-weight: bold;
color: #fff;
cursor: pointer;
@include des-title;
p {
line-height: 28px;
i {
font-size: 16px;
margin-left: 6px;
background-image: none;
transition: all ease-in 0.5s;
&.arrow-up {
transform: rotate(180deg);
}
}
}
&::before {
content: "";
position: absolute;
left: 0;
z-index: 1;
}
}
.des-fields {
display: flex;
flex-wrap: wrap;
@ -1750,6 +1723,35 @@ input[type ='number'] {
}
}
.des-title {
position: relative;
height: 28px;
margin-bottom: 10px;
font-size: 14px;
font-weight: bold;
color: #fff;
cursor: pointer;
@include des-title;
p {
line-height: 28px;
i {
font-size: 16px;
margin-left: 6px;
background-image: none;
transition: all ease-in 0.5s;
&.arrow-up {
transform: rotate(180deg);
}
}
}
&::before {
content: "";
position: absolute;
left: 0;
z-index: 1;
}
}
// 带select得输入框
.input-prepend{
position: relative;

55
src/assets/test.md

@ -0,0 +1,55 @@
## 项目背景
> 描述项目或产品的现状,让项目成员了解当前存在的问题与痛点。
>
+ 痛点1...
+ 痛点2...
+ 痛点3...
## 项目目标
> 描述本项目期望达成的目标,目标需满足Smart原则:
>
> 1. 具体的(Specific)
> 2. 可以衡量的(Measurable)
> 3. 可以达到的(Attainable)
> 4. 要与其他目标具有一定的相关性(Relevant)
> 5. 有明确的截止期限(Time-bound)
>
[此处为语雀卡片,点击链接查看](https://www.yuque.com/docs/205890729#ewusl)
## 关键事项
> 为达成上述目标,需要完成哪些关键事项。
>
+ 关键事项1...
+ 关键事项2...
+ 关键事项3...
## 里程碑
> 整个项目中,关键节点的里程碑计划。
>
![画板](https://cdn.nlark.com/yuque/0/2022/jpeg/956523/1657187439577-9e5f23b1-b37f-41ff-989b-646e87f85d6d.jpeg)
## 人员安排
> 输入项目的所有干系人,包括内部和外部干系人。
>
| **人员** | **岗位** |
| --- | --- |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 项目经理 |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 技术负责人 |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 产品负责人 |
## 风险提示
> 对公司战略、项目结题、法务风险问题进行提示,并说明应对措施。
>
[此处为语雀卡片,点击链接查看](https://www.yuque.com/docs/205890729#MBwu4)

23
src/main.js

@ -46,6 +46,29 @@ import { parseTime } from '@/utils/index.js'
Vue.filter('parseTime', function(time, cFormat) {
return parseTime(time, cFormat)
})
// 记得把样式也一起引入进来
// import VueKatex from 'vue-katex'
// import 'katex/dist/katex.min.css'
// Vue.use(VueKatex, {
// globalOptions: {
// // 定义好界定符,好让它能够找到渲染的latex公式块
// delimiters: [
// { left: '$$', right: '$$', display: true },
// { left: '$', right: '$', display: false },
// { left: '\\(', right: '\\)', display: false },
// { left: '\\[', right: '\\]', display: true }
// ],
// throwOnError: false
// // ... Define globally applied KaTeX options here
// }
// })
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
Vue.use(mavonEditor)
Vue.use(uploader)
Vue.use(checkPer)
Vue.use(VueHighlightJS)

586
src/views/AIAssistant/AICataloging/index.vue

@ -0,0 +1,586 @@
<template>
<div class="app-container category-container" style="height: calc(100vh - 140px);">
<!-- 门类列表 -->
<div class="container-main">
<div class="elect-cont-left">
<div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<!--门类树状结构-->
<div class="tree-scroll">
<el-scrollbar style="height: calc(100vh - 230px);">
<el-tree ref="categroyTree" v-loading="crud.loading" class="arc-tree arc-tree-01" :data="crud.data" :props="defaultProps" node-key="id" :expand-on-click-node="false" highlight-current @node-click="handleNodeClick">
<span slot-scope="{ node, data }" class="custom-tree-node">
<el-tooltip :content="node.label" placement="left" :enterable="false" effect="dark">
<span v-if="data.isType === 0">
{{ data.label }}
</span>
<span v-if="data.isType === 1" class="iconFolder tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 2" class="iconArch tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 3" class="iconFile tree-text">
{{ data.label }}
</span>
</el-tooltip>
</span>
</el-tree>
</el-scrollbar>
</div>
</div>
</div>
<!-- 门类管理tab -->
<div class="elect-cont-right">
<div v-if="selectedCategory.isType === 2" class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<div>
<el-form>
<el-form-item label="电子原件" prop="aiFileOriginal" class="prearch-upload">
<p class="input-style">{{ aiFileOriginal }}</p>
<div class="upload-btn">
<input id="upFile" type="file" name="upFile" @change="changeFile($event)">
<el-button size="small" type="primary" :loading="aiLoading">
<i :class="['iconfont', aiLoading ? 'icon-huoqu' : 'icon-shangchuan']" />{{ aiLoading ? 'AI辅助著录识别中' : '上传' }}
</el-button>
</div>
</el-form-item>
</el-form>
</div>
<div class="ai-category-main">
<div class="ai-des-left">
<div class="des-title">
<p>著录项</p>
</div>
<div class="ai-des-form">
<PreviewForm
ref="previewForm"
:is-has-code="true"
:is-disabled="false"
:form-preview-data.sync="formPreviewData"
:selected-category="selectedCategory"
:is-des-form-type="isDesFormType"
:collect-level="collectLevel"
:category-menu="categoryMenu"
:is-ai-category="true"
/>
</div>
</div>
<div class="ai-des-right">
<div class="des-title">
<p>AI识别数据</p>
</div>
<div ref="typingContainer" class="ai-des-json">
<pre v-if="aiJsonData" v-highlightjs="displayedText">{{ displayedText }}</pre>
</div>
<div v-if="typingFinished" style="text-align: right;">
<el-button @click="saveAiData">保存</el-button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import crudCategory from '@/api/system/category/category'
import CRUD, { presenter, header } from '@crud/crud'
import PreviewForm from '@/views/components/category/PreviewForm'
import { FetchInitCategoryInputFieldByPid, FetchCategoryMenu } from '@/api/system/category/category'
import { getCurrentTime } from '@/utils/index'
export default {
name: 'AICataloging',
components: { PreviewForm },
cruds() {
return [
CRUD({
title: 'AI辅助著录', url: 'api/category/fondMenu',
crudMethod: { ...crudCategory },
optShow: {
add: false,
edit: false,
del: false,
download: false,
group: false
}
})
]
},
mixins: [presenter(), header()],
provide() {
return {
parentsData: this
}
},
data() {
return {
defaultProps: {
children: 'children',
label: 'label'
},
selectedCategory: {},
formPreviewData: [],
isDesFormType: 'arcives',
collectLevel: 3,
categoryMenu: [],
aiLoading: false,
aiFileOriginal: null,
aiJsonData: null,
displayedText: '',
typingInterval: null,
typingFinished: false,
file: null, // change
fileNames: '', // - name
formatType: '', // - type
postfix: '', // -
fileSize: '', // -
filePath: '', // - path
px: '', // -
nowDate: '', //
fileJsonString: null
}
},
computed: {
},
mounted() {
this.getCategoryDataTree()
},
methods: {
getCategoryDataTree() {
FetchCategoryMenu().then(res => {
this.categoryMenu = res
})
},
filterData(data) {
return data.filter(node => {
if (node.children && node.children.length > 0) {
node.children = this.filterData(node.children) //
}
return node.isType !== 3 // isType3
})
},
//
findNode(tree, func) {
for (const node of tree) {
if (func(node)) return node
if (node.children) {
const res = this.findNode(node.children, func)
if (res) return res
}
}
return null
},
//
expandAllChildren(node, targetElement) {
node.expanded = true
//
if (node.childNodes && node.childNodes.length > 0) {
for (let i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].data.id === targetElement.id) {
this.$refs.categroyTree.setCurrentKey(node.childNodes[i])
}
this.expandAllChildren(node.childNodes[i], targetElement)
}
}
},
// el-tree
transformData(rawData) {
return rawData.map(item => {
return {
label: item.fondName,
isType: 0,
id: item.fondsId,
fondsNo: item.fondsNo,
children: item.categoryList.map(category => {
return {
label: category.cnName,
id: category.id,
arrangeType: category.arrangeType,
isType: category.isType,
fondsId: item.fondsId,
fondName: item.fondName,
fondsNo: item.fondsNo,
children: this.transformChildren(category.children, item.fondsId, item.fondName, item.fondsNo)
}
})
}
})
},
//
transformChildren(children, fondsId, fondName, fondsNo) {
return children.map(child => {
return {
label: child.cnName,
id: child.id,
isType: child.isType,
pid: child.pid,
code: child.code,
arrangeType: child.arrangeType,
fondsId: fondsId,
fondName: fondName,
fondsNo: fondsNo,
children: child.children.length ? this.transformChildren(child.children, fondsId, fondName, fondsNo) : []
}
})
},
//
findTopLevelNode(data, fondsId) {
for (let i = 0; i < data.length; i++) {
if (data[i].id === fondsId) {
return data[i]
}
}
return null
},
[CRUD.HOOK.afterRefresh]() {
this.crud.data = this.filterData(this.transformData(this.crud.data))
this.$nextTick(() => {
let currentKey
if (localStorage.getItem('currentArchivesKey') !== null) {
currentKey = JSON.parse(localStorage.getItem('currentArchivesKey'))
//
if (this.$refs.categroyTree.getCurrentKey(currentKey.id) == null) {
localStorage.removeItem('currentArchivesKey')
}
this.topLevelNode = this.findTopLevelNode(this.crud.data, currentKey.fondsId)
//
if (this.topLevelNode) {
if (currentKey) {
//
if (currentKey.isType === 1) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
}
this.expandAllChildren(this.$refs.categroyTree.getNode(this.topLevelNode), currentKey)
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
if (currentKey && currentKey.id) {
this.$nextTick(() => {
//
this.handleNodeClick(currentKey)
})
}
})
},
defaultSetting(currentKey) {
if (this.crud.data[0].isType === 0) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
} else {
currentKey = this.crud.data[0]
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
}
},
//
handleNodeClick(val) {
if (val) {
localStorage.setItem('currentArchivesKey', JSON.stringify(val))
this.selectedCategory = val
this.$nextTick(() => {
this.getFormInfo()
})
}
},
getFormInfo() {
// console.log('this.selectedCategory.arrangeType', this.selectedCategory.arrangeType)
// if (this.selectedCategory.arrangeType === 1) {
// this.collectLevel = 3
// } else if (this.selectedCategory.arrangeType === 2) {
// this.collectLevel = 2
// } else {
// this.collectLevel = 1
// }
const params = {
'categoryId': this.selectedCategory.id,
'categoryLevel': this.collectLevel
}
FetchInitCategoryInputFieldByPid(params).then(data => {
this.formPreviewData = data
console.log('formPreviewData', this.formPreviewData)
this.isDesFormType = 'arcives'
this.$nextTick(() => {
this.$refs.previewForm.archivesType = 'add'
this.$refs.previewForm.FetchNoFormatField(this.selectedCategory.id)
})
})
},
//
async changeFile(e) {
this.file = e.target.files[0]
this.fileSize = this.file.size
this.formatType = this.file.type.substring(0, this.file.type.indexOf('/'))
this.fileNames = this.file.name
this.postfix = this.file.name.substring(
this.fileNames.lastIndexOf('.') + 1,
this.fileNames.length
)
if (this.formatType === 'image') {
const fileBase64 = await this.getBase64(this.file)
const res = await this.getImgPx(fileBase64)
this.px = res.width + 'px*' + res.height + 'px'
} else {
this.px = ''
}
this.uploadSave()
//
// reDocumentUpload(this.baseApi + '/api/re-document/uploadFile', this.file, this.selectedDocument.id).then(res => {
// if (res.data.code === 200) {
// this.filePath = res.data.data
// this.uploadSave()
// }
// })
},
// -
uploadSave() {
this.aiLoading = true
this.nowDate = getCurrentTime()
const json = {
'file_name': this.fileNames,
'file_size': this.fileSize,
'file_type': this.postfix,
'file_path': this.filePath,
'sequence': null,
'archive_id': this.arcId,
'file_dpi': this.px,
'file_thumbnail': '',
'create_time': this.nowDate,
'id': null,
'is_quote': null,
'last_modified': this.file.lastModified
}
const arrayUpload = []
arrayUpload.push(json)
this.aiFileOriginal = this.fileNames
this.fileJsonString = JSON.stringify(arrayUpload)
console.log(this.fileJsonString)
setTimeout(() => {
const json = `{
"fonds_no": "A001",
"archival_category_code": "WSWJ",
"archive_ctg_no": "SCGL",
"archive_year": "2024",
"retention": "永久",
"item_no": "0005",
"archive_no": "A001-WSWJ·SCGL-2024-Y-0005",
"maintitle": "Windows下如何创建FTP文件夹",
"keyword": "",
"doc_no": "武汉飞天[2024]0005",
"doc_id": "",
"security_class": "",
"secrecy_period": "",
"doc_type": "",
"serial_no": "",
"emergency_degree": "",
"created_date": "",
"doc_department": "",
"signer": "",
"main_department": "",
"copy_department": "",
"printing_department": "",
"printing_date": "",
"release_level": "",
"microfilm": "",
"attachment": "",
"annotation": "",
"file_id": "",
"software_environment": "",
"hardware_environment": "",
"disposal_type": "",
"disposal_actor": "",
"disposal_department": "",
"disposal_date": "",
"disposal_result": "",
"medium_type": "",
"medium_qty": "",
"medium_unit": "",
"medium_specs": "",
"is_entity": 1,
"id": "6C91AAD1F6D9940469F8B0"
}`
this.aiJsonData = json
this.startTypingEffect()
this.aiLoading = false
}, 3000)
},
startTypingEffect() {
const lines = this.aiJsonData.split('\n')
let currentLineIndex = 0
this.displayedText = ''
this.typingFinished = false
this.typingInterval = setInterval(() => {
if (currentLineIndex < lines.length) {
this.displayedText += lines[currentLineIndex] + '\n'
currentLineIndex++
} else {
clearInterval(this.typingInterval)
setTimeout(() => {
this.typingFinished = true
this.$refs.previewForm.addOrUpdateForm = JSON.parse(this.aiJsonData)
}, 1000)
}
//
const container = this.$refs.typingContainer
if (container) {
container.scrollTop = container.scrollHeight
}
}, 200)
},
saveAiData() {
this.$router.push({ path: '/collectReorganizi/collectionLibrary' })
},
// base64
getBase64(file) {
const reader = new FileReader()
reader.readAsDataURL(file)
return new Promise((resolve) => {
reader.onload = () => {
resolve(reader.result)
}
})
},
//
getImgPx(img) {
const image = new Image()
image.src = img
return new Promise((resolve) => {
image.onload = () => {
const width = image.width
const height = image.height
resolve({ width, height })
}
})
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/mixin.scss";
@import "~@/assets/styles/variables.scss";
.category-container {
.elect-cont-left{
width: 296px !important;
}
}
.openSidebar .category-container .elect-cont-right{
width: calc(100vw - 614px) !important;
}
.hideSidebar .category-container .elect-cont-right {
width: calc(100vw - 412px) !important;
}
.tree-scroll{
font-size: 14px;
}
.ai-category-main{
display: flex;
justify-content: flex-start;
.ai-des-left{
width: 740px;
margin-right: 20px;
}
.ai-des-right{
flex: 1;
}
.ai-des-form,
.ai-des-json{
height: calc(100vh - 272px);
overflow-y: auto;
padding-right: 10px;
}
.ai-des-json{
height: calc(100vh - 300px);
margin-bottom: 10px;
}
}
.prearch-upload{
margin-right: 0 !important;
::v-deep .el-form-item__label{
position: relative;
&::before{
position: absolute;
top: -2px;
right: 70px;
content: "*";
font-size: 10px;
color: #ff4949;
font-style: normal;
}
}
::v-deep .el-form-item__content{
position: relative;
width: 540px !important;
display: flex;
justify-content: space-between;
.input-style{
width: 500px;
height: 34px;
line-height: 34px;
padding: 0 20px;
border: 1px solid #e6e8ed;
border-radius: 3px;
// &.error-box{
// border-color: #ed4a41;
// }
}
// .error-tip{
// position: absolute;
// left: 0;
// bottom: -26px;
// font-size: 12px;
// color: #ff4949;
// }
.upload-btn{
position: relative;
width:96px;
margin-right: 0 !important;
margin-left: 10px;
overflow: initial !important;
#upFile{
position: absolute;
left: 0;
top: 0;
// opacity: 0;
width: 84px;
height: 34px;
}
.el-button{
margin-top: -2px;
font-weight: bold;
border-color: #0348f3;
color: #0348f3;
}
}
}
}
pre {
background-color: #f4f4f4;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
white-space: pre-wrap;
word-wrap: break-word;
}
</style>

284
src/views/AIAssistant/AIDigitalHuman/index.vue

@ -0,0 +1,284 @@
<template>
<div class="app-container category-container" style="position: relative; height: calc(100vh - 140px);">
<iframe id="myIframe" style="position: absolute; top: 0; left: -34%; border: none; z-index: 9;" width="100%" height="100%" src="https://f.3dman.cn/art/sDpbYwwJ/fbx/CdYqVH95/index.html" />
<div class="chat-wrapper">
<div ref="chatContent" class="chat-content">
<Message
v-for="(message, index) in chatMessages"
:key="index"
:content="message.content"
:is-user-message="message.isUserMessage"
:is-loading="message.isLoading"
:is-welcome-message="message.isWelcomeMessage"
:is-typing="message.isTyping"
@stop-typing="handleStopTyping(index)"
/>
</div>
<div class="chat-send">
<textarea v-model="message" cols="50" rows="7" placeholder="请输入你想咨询的问题" @input="updateSendButtonState" @keypress="handleKeyPress" />
<div class="send-button-container">
<div class="hot-word">
<span v-for="(word, index) in hotWords" :key="index" @click="handleHotWordClick(word)">{{ word }}</span>
</div>
<span class="send-button" :class="{ 'send-disabled-button': isSendButtonDisabled }" :disabled="isSendButtonDisabled" @click="sendMessage">发送</span>
</div>
</div>
</div>
</div>
</template>
<script>
import Message from './message.vue'
export default {
name: 'AIDigitalHuman',
components: {
Message
},
data() {
return {
message: '',
isSendButtonDisabled: true,
isBotReplying: false,
chatMessages: [],
hotWords: ['什么是“AI辅助著录”', '什么是“AI编研”?'],
//
mockReplies: {
'什么是“AI辅助著录”': 'AI辅助著录是利用AI数据模型(例如:DeepSeek-R1等),对档案电子原文进行解析及分析操作,再结合当前档案门类的特有著录项目(例如:标题、年度、发文字号等),从电子原文中提取出对应的数据,并自动完成档案表单的著录。辅助著录结束后,管理员任可继续编辑档案信息。',
'什么是“AI编研”?': 'AI编研是利用AI数据模型(例如:DeepSeek-R1等),结合用户上传的文件以及需求,通过对文件的解析、理解,对用户需求的理解、分析,从而智能的生成用户所需要的文本型数据(用户需求,例如:“结合我上传的附件内容,帮我写一篇,AI如何赋能图书馆业务的文章,要求不少于5000字”)'
}
}
},
computed: {
},
created() {
},
mounted() {
this.sendWelcomeMessage()
this.updateSendButtonState()
},
methods: {
sendWelcomeMessage() {
const welcomeMessage = '您好!请问有什么问题可以帮您解答吗?'
this.appendMessage(welcomeMessage, false, false, true, false)
},
updateSendButtonState() {
this.isSendButtonDisabled = this.message.trim() === '' || this.isBotReplying
},
sendMessage() {
if (!this.isBotReplying) {
const message = this.message.trim()
if (message) {
this.appendMessage(message, true, false, false, false)
this.message = ''
this.isSendButtonDisabled = true
this.isBotReplying = true
//
setTimeout(() => {
const loadingIndex = this.chatMessages.findIndex(msg => msg.isLoading)
if (loadingIndex !== -1) {
this.chatMessages.splice(loadingIndex, 1)
}
const botReply = this.mockReplies[message] || '很抱歉,我暂时无法回答这个问题。'
const lastMessageIndex = this.chatMessages.length
this.appendMessage('', false, false, false, true)
let i = 0
const speed = 50
const typeWriter = () => {
const currentMessage = this.chatMessages[lastMessageIndex]
if (!currentMessage.isTyping) {
return
}
if (i < botReply.length) {
currentMessage.content += botReply.charAt(i)
i++
setTimeout(typeWriter, speed)
this.$nextTick(() => {
this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
})
} else {
currentMessage.isTyping = false
this.isBotReplying = false
this.updateSendButtonState()
}
}
typeWriter()
}, 1000)
}
}
},
handleKeyPress(event) {
if (event.which === 13) {
event.preventDefault()
this.sendMessage()
}
},
handleHotWordClick(word) {
this.message = word
this.sendMessage()
},
appendMessage(content, isUserMessage, isLoading, isWelcomeMessage, isTyping = false) {
this.chatMessages.push({
content,
isUserMessage,
isLoading,
isWelcomeMessage,
isTyping
})
this.$nextTick(() => {
this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
})
},
handleStopTyping(index) {
const message = this.chatMessages[index]
message.isTyping = false
this.isBotReplying = false
this.updateSendButtonState()
}
}
}
</script>
<style lang="scss">
/* ai数字人 start */
.chat-wrapper {
position: absolute;
right: 0;
top: 0;
width: 1185px;
height: 778px;
padding: 24px;
background: url("~@/assets/images/list-bg.png") no-repeat left top;
background-size: 100% 100%;
z-index: 99;
font-family: 'PingFang';
}
.chat-content {
width: 100%;
height: calc(100% - 234px);
overflow: hidden;
overflow-y: scroll;
}
.chat-send {
width: 100%;
height: 210px;
margin-top: 24px;
background: linear-gradient(90deg, #2C509B 0%, rgba(44, 80, 155, 0.6) 100%);
border-radius: 16px;
}
.chat-send textarea {
display: block;
width: calc(100% - 40px);
height: 120px;
font-size: 24px;
line-height: 36px;
border: none;
padding: 20px;
background-color: transparent;
color: #fff;
}
.send-button-container {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px 0 0;
margin-top: 16px;
}
.hot-word span {
position: relative;
display: inline-block;
font-size: 20px;
color: #fff;
line-height: 50px;
margin: 0 10px;
padding: 6px 16px 6px 48px;
background: rgba(0, 0, 0, 0.2);
border-radius: 28px 8px 28px 28px;
}
.hot-word span::before {
content: "";
position: absolute;
left: 12px;
top: 50%;
width: 30px;
height: 30px;
background: url("~@/assets/images/wenhao.png") no-repeat left top;
background-size: 100% 100%;
transform: translateY(-50%);
}
.hot-word span:hover {
background-color: rgba(0, 0, 0, 0.6);
cursor: pointer;
}
.send-button {
position: relative;
display: inline-block;
width: 140px;
height: 58px;
line-height: 58px;
padding-left: 60px;
font-size: 26px;
text-align: left;
color: #fff;
background: linear-gradient(135deg, #06BFFF 0%, #2B74FF 100%);
border-radius: 58px;
cursor: pointer;
}
.send-button::before {
content: "";
position: absolute;
left: 16px;
top: 50%;
width: 36px;
height: 36px;
background: url("~@/assets/images/index-img8.png") no-repeat left top;
background-size: 36px 36px;
transform: translateY(-50%);
}
.send-disabled-button {
background: rgba(255, 255, 255, 0.2);
cursor: not-allowed;
}
.run-btn {
position: relative;
width: 120px;
height: 58px;
line-height: 58px;
padding-left: 60px;
font-size: 26px;
text-align: center;
color: #fff;
background: linear-gradient(135deg, #06BFFF 0%, #2B74FF 100%);
border-radius: 58px;
cursor: pointer;
margin: 40px 0 0 20px;
}
.run-btn::before {
content: "";
position: absolute;
left: 30px;
top: 50%;
width: 36px;
height: 36px;
background: url("~@/assets/images/run.png") no-repeat left top;
background-size: 36px 36px;
transform: translateY(-50%);
}
/* ai数字人 end */
</style>

404
src/views/AIAssistant/AIDigitalHuman/index2.vue

@ -0,0 +1,404 @@
<template>
<div class="app-container category-container" style="position: relative; height: calc(100vh - 140px);">
<!-- <div class="ai-wrapper">
<iframe id="myIframe" style="position: absolute; top: 0; left: -34%; border: none; z-index: 9;" width="100%" height="100%" src="https://f.3dman.cn/art/sDpbYwwJ/fbx/CdYqVH95/index.html" />
</div> -->
<div class="chat-wrapper">
<div ref="chatContent" class="chat-content" />
<div class="chat-send">
<textarea v-model="message" cols="50" rows="7" placeholder="请输入你想咨询的问题" @input="updateSendButtonState" @keypress="handleKeyPress" />
<div class="send-button-container">
<div class="hot-word">
<span v-for="(word, index) in hotWords" :key="index" @click="handleHotWordClick(word)">{{ word }}</span>
</div>
<span class="send-button" :class="{ 'send-disabled-button': isSendButtonDisabled }" :disabled="isSendButtonDisabled" @click="sendMessage">发送</span>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'AIDigitalHuman',
components: { },
data() {
return {
message: '',
isSendButtonDisabled: true,
isBotReplying: false,
isBotTyping: false,
hotWords: ['什么是“人工智能”?', '什么是“AI大模型”?']
}
},
computed: {
},
created() {
},
mounted() {
this.sendWelcomeMessage()
this.updateSendButtonState()
},
methods: {
sendWelcomeMessage() {
const welcomeMessage = '您好!请问有什么问题可以帮您解答吗?'
this.appendMessage(welcomeMessage, false, false, true)
},
updateSendButtonState() {
this.isSendButtonDisabled = this.message.trim() === '' || this.isBotReplying || this.isBotTyping
},
sendMessage() {
if (!this.isBotReplying && !this.isBotTyping) {
const message = this.message.trim()
if (message) {
this.appendMessage(message, true, false)
this.message = ''
this.isSendButtonDisabled = true
this.appendMessage('', false, true)
this.isBotReplying = true
// axios.post(`${this.config.apiUrl}/api/v1/workspace/dxhtsg/chat`, {
// message,
// mode: 'chat'
// }, {
// headers: {
// 'Authorization': this.config.apiKey
// }
// })
// .then((res) => {
// const loadingElement = this.$refs.chatContent.querySelector('.loading')
// if (loadingElement) {
// loadingElement.parentNode.remove()
// }
// const botReply = res.data.textResponse.replace(/\(\/)?SYS\/gi, 'AI')
// this.appendMessage('', false, false)
// this.isBotTyping = true
// let i = 0
// const speed = 50
// const typeWriter = () => {
// if (!this.isBotTyping) {
// return
// }
// if (i < botReply.length) {
// const lastBotMessage = this.$refs.chatContent.querySelectorAll('.bot-message:last-child p')[0]
// lastBotMessage.innerHTML += botReply.charAt(i)
// i++
// setTimeout(typeWriter, speed)
// this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
// } else {
// this.isBotTyping = false
// this.isBotReplying = false
// const stopButton = this.$refs.chatContent.querySelector('#stop-btn')
// if (stopButton) {
// stopButton.remove()
// }
// }
// }
// typeWriter()
// })
// .catch((err) => {
// console.log(err)
// // layer
// // layer.msg('', {
// // offset: [window.innerHeight / 2 - 100, window.innerWidth / 2 + 100],
// // anim: 5
// // });
// const loadingElement = this.$refs.chatContent.querySelector('.loading')
// if (loadingElement) {
// loadingElement.parentNode.remove()
// }
// this.isBotTyping = false
// this.isBotReplying = false
// })
}
} else if (this.isBotTyping) {
// layer.msg('', {
// offset: [window.innerHeight / 2 - 100, window.innerWidth / 2 + 100],
// anim: 6
// });
} else if (this.isBotReplying) {
// layer.msg('', {
// offset: [window.innerHeight / 2 - 100, window.innerWidth / 2 + 100],
// anim: 6
// });
}
},
handleKeyPress(event) {
if (event.which === 13) {
event.preventDefault()
this.sendMessage()
}
},
handleHotWordClick(word) {
this.message = word
this.sendMessage()
},
appendMessage(content, isUserMessage, isLoading, isWelcomeMessage = false) {
const className = isUserMessage ? 'user-message' : 'bot-message'
let messageContent
if (isLoading) {
messageContent = '<p class="loading"><img src="images/loading.webp" alt="" /></p>'
} else {
messageContent = isUserMessage
? `<p>${content}</p>`
: isWelcomeMessage
? `<p>${content}</p>`
: `<p>${content}<span id="stop-btn">停止输出</span></p>`
}
const messageHtml = `
<div class="chat-message ${className}">
${messageContent}
</div>`
this.$refs.chatContent.insertAdjacentHTML('beforeend', messageHtml)
this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
const stopButton = this.$refs.chatContent.querySelector('#stop-btn')
if (stopButton) {
stopButton.addEventListener('click', () => {
this.isBotTyping = false
this.isBotReplying = false
stopButton.removeAttribute('id')
stopButton.classList.add('remove-btn')
stopButton.innerHTML = '用户取消'
})
}
}
}
}
</script>
<style lang="scss" scoped>
/* ai数字人 start */
.chat-wrapper {
position: absolute;
right: 0;
top: 0;
width: 1185px;
height: 778px;
padding: 24px;
background: url("~@/assets/images/list-bg.png") no-repeat left top;
background-size: 100% 100%;
z-index: 99;
font-family: 'PingFang';
}
.chat-content {
width: 100%;
height: calc(100% - 234px);
overflow: hidden;
overflow-y: scroll;
}
.chat-message {
display: flex;
justify-content: flex-end;
font-size: 28px;
color: #fff;
margin-bottom: 16px;
}
.chat-message p {
position: relative;
line-height: 30px;
padding: 10px 16px;
background: rgba(0,0,0,0.2);
border-radius: 28px 10px 28px 28px;
max-width: 90%;
}
.chat-message p span{
position: absolute;
left: 4px;
bottom: -40px;
width: 80px;
padding-left: 24px;
height: 32px;
text-align: center;
line-height: 32px;
border: 1px solid #4CA7FF;
color: #4CA7FF;
border-radius: 10px;
font-size: 16px;
cursor: pointer;
}
.chat-message p span::before{
content: '';
position: absolute;
left: 4px;
top: 50%;
width: 24px;
height: 24px;
background: url("~@/assets/images/index-img7.png") no-repeat left top;
background-size: 100% 100%;
margin-top: -12px;
}
.chat-message p span:hover{
background-color: rgba(255,255,255,.2);
}
.chat-message p span.remove-btn{
padding-left: 0;
border: none;
color: #999;
}
.chat-message p span.remove-btn::before{
border: none;
color: #999;
background: none;
}
.chat-message p span.remove-btn:hover{
background-color: transparent;
cursor: default;
}
.bot-message {
display: flex;
flex-direction: row-reverse;
justify-content: flex-end;
}
.bot-message p {
line-height: 48px;
background-color: rgb(255,255,255,0.2);
border-radius: 8px 28px 28px 28px;
}
.loading{
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
height: 66px;
}
.loading img{
display: block;
width: 67px;
margin: 0 10px;
}
.chat-send {
width: 100%;
height: 210px;
margin-top: 24px;
background: linear-gradient( 90deg, #2C509B 0%, rgba(44,80,155,0.6) 100%);
border-radius: 16px;
}
.chat-send textarea {
display: block;
width: calc(100% - 40px);
height: 120px;
font-size: 24px;
line-height: 36px;
border: none;
padding: 20px;
background-color: transparent;
color: #fff;
}
.send-button-container {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px 0 0;
margin-top: 16px;
}
.hot-word span{
position: relative;
display: inline-block;
font-size: 20px;
color: #fff;
line-height: 50px;
margin: 0 10px;
padding: 6px 16px 6px 48px;
background: rgba(0,0,0,0.2);
border-radius: 28px 8px 28px 28px;
}
.hot-word span::before{
content: "";
position: absolute;
left: 12px;
top: 50%;
width: 30px;
height: 30px;
background: url("~@/assets/images/wenhao.png") no-repeat left top;
background-size: 100% 100%;
transform: translateY(-50%);
}
.hot-word span:hover{
background-color: rgba(0,0,0,0.6);
cursor: pointer;
}
.send-button {
position: relative;
display: inline-block;
width: 140px;
height: 58px;
line-height: 58px;
padding-left: 60px;
font-size: 26px;
text-align: left;
color: #fff;
background: linear-gradient(135deg, #06BFFF 0%, #2B74FF 100%);
border-radius: 58px;
cursor: pointer;
}
.send-button::before {
content: "";
position: absolute;
left: 16px;
top: 50%;
width: 36px;
height: 36px;
background: url("~@/assets/images/index-img8.png") no-repeat left top;
background-size: 36px 36px;
transform: translateY(-50%);
}
.send-disabled-button {
background: rgba(255,255,255,.2);
cursor: not-allowed;
}
.run-btn {
position: relative;
width: 120px;
height: 58px;
line-height: 58px;
padding-left: 60px;
font-size: 26px;
text-align: center;
color: #fff;
background: linear-gradient(135deg, #06BFFF 0%, #2B74FF 100%);
border-radius: 58px;
cursor: pointer;
margin: 40px 0 0 20px;
}
.run-btn::before {
content: "";
position: absolute;
left: 30px;
top: 50%;
width: 36px;
height: 36px;
background: url("~@/assets/images/run.png") no-repeat left top;
background-size: 36px 36px;
transform: translateY(-50%);
}
/* ai数字人 end */
</style>

159
src/views/AIAssistant/AIDigitalHuman/message.vue

@ -0,0 +1,159 @@
<template>
<div :class="{ 'chat-message': true, 'user-message': isUserMessage, 'bot-message':!isUserMessage }">
<p v-if="isLoading" class="loading"><img src="images/loading.webp" alt=""></p>
<p v-else>
{{ content }}
<span
v-if="!isUserMessage &&!isWelcomeMessage"
:class="{ 'stop-btn': isTyping, 'remove-btn':!isTyping && isStopped }"
@click="stopTyping($event)"
>
{{ isTyping? '停止输出' : (isStopped? '用户取消' : '') }}
</span>
</p>
</div>
</template>
<script>
export default {
props: {
content: {
type: String,
default: ''
},
isUserMessage: {
type: Boolean,
default: false
},
isLoading: {
type: Boolean,
default: false
},
isWelcomeMessage: {
type: Boolean,
default: false
},
isTyping: {
type: Boolean,
default: false
}
},
data() {
return {
isStopped: false
}
},
methods: {
stopTyping(event) {
this.isTyping = false
this.isStopped = true
this.$emit('stop-typing', event)
}
}
}
</script>
<style scoped>
/* 可以在这里添加组件特定的样式 */
.chat-message {
display: flex;
justify-content: flex-end;
font-size: 22px;
color: #fff;
margin-bottom: 16px;
}
.chat-message p {
position: relative;
line-height: 30px;
padding: 10px 16px;
background: rgba(0, 0, 0, 0.2);
border-radius: 28px 10px 28px 28px;
max-width: 90%;
}
.chat-message p span.stop-btn {
position: absolute;
left: 4px;
bottom: -40px;
width: 100px;
padding-left: 24px;
height: 32px;
text-align: center;
line-height: 30px;
border: 1px solid #4CA7FF;
color: #4CA7FF;
border-radius: 10px;
font-size: 16px;
cursor: pointer;
}
.chat-message p span.stop-btn::before {
content: '';
position: absolute;
left: 4px;
top: 50%;
width: 24px;
height: 24px;
background: url("~@/assets/images/index-img7.png") no-repeat left top;
background-size: 100% 100%;
margin-top: -12px;
}
.chat-message p span.stop-btn:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.chat-message p span.remove-btn {
position: absolute;
left: 4px;
bottom: -40px;
padding-left: 0;
border: none;
color: #999;
width: 100px;
padding-left: 24px;
height: 32px;
text-align: center;
line-height: 30px;
font-size: 16px;
cursor: pointer;
}
.chat-message p span.remove-btn::before {
border: none;
color: #999;
background: none;
}
.chat-message p span.remove-btn:hover {
background-color: transparent;
cursor: default;
}
.bot-message {
display: flex;
flex-direction: row-reverse;
justify-content: flex-end;
}
.bot-message p {
line-height: 48px;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 8px 28px 28px 28px;
}
.loading {
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
height: 66px;
}
.loading img {
display: block;
width: 67px;
margin: 0 10px;
}
</style>

370
src/views/AIAssistant/AIIntelligentCoding/aiForm.vue

@ -0,0 +1,370 @@
<template>
<div>
<el-dialog class="editingDialog" :title="formTitle" :visible="formVisible" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseForm">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog">
<div style="display: flex; justify-content: flex-start; align-items: flex-start;">
<div class="upload-input" style="margin-top: 0;">
<input
ref="file"
multiple
type="file"
@change="previewFiles"
>
<div class="upload-zip"><i class="iconfont icon-shangchuan2" />上传文件</div>
</div>
<div v-if="selectedFiles.length > 0" style="flex: 1; max-height: 120px; overflow-y: auto; margin-left: 20px; line-height: 24px;">
<p v-for="(file, index) in selectedFiles" :key="index">{{ file.name }}</p>
</div>
</div>
<div style="display: flex; justify-content: flex-start; align-items: flex-end; margin: 20px 0; ">
<el-input
v-model="textarea"
placeholder="请输入提问"
/>
<el-button style="margin-left: 20px;" :loading="loading" @click="handleAIEditing">AI智能编研</el-button>
</div>
<mavon-editor
ref="typingContainer"
class="md"
:value="editorContent"
:subfield="false"
:default-open="'preview'"
:toolbars-flag="false"
:editable="false"
:scroll-style="true"
:ishljs="true"
/>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="handleCloseForm">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="handleComfiredEditing">确定</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { form } from '@crud/crud'
import { mapGetters } from 'vuex'
// import editor from '@/components/quillEditor/index'
// import strJson from './str.json'
const defaultForm = { id: null, title: null, researchType: null, editor1: null, editor2: null, startTime: null, endTime: null, remarks: null }
export default {
name: 'Form',
components: { },
mixins: [
form(function() {
return Object.assign({}, defaultForm)
})
],
data() {
return {
formType: 1,
formTitle: '',
formVisible: false,
selectedFiles: [],
textarea: '帮我写一篇AI赋能档案管理的报告',
editorRef: 'test',
editorContent: '',
mockResponse: `## 一、引言
### 1.1 研究背景与意义
随着科技的飞速发展人工智能AI技术已逐渐渗透到各个行业成为推动创新和发展的重要力量AI 技术以其强大的数据分析模式识别和自动化处理能力正在重塑许多传统行业的运作方式在档案管理领域传统的管理模式面临着诸多挑战如档案数量的快速增长信息检索的效率低下档案利用的局限性等 AI 技术引入档案管理为解决这些问题提供了新的思路和方法
传统档案管理主要依赖人工操作从档案的收集整理分类到存储和检索都需要大量的人力和时间这种方式不仅效率低下而且容易出现人为错误随着数字化时代的到来电子档案的数量呈爆炸式增长传统的管理方式越发难以应对AI 技术的出现为档案管理带来了新的机遇它能够自动处理大量的档案数据实现档案的智能分类快速检索和精准推荐大大提高了档案管理的效率和准确性
AI 赋能档案管理具有重要的现实意义它可以显著提升档案管理的效率通过自动化的分类和索引AI 能够快速处理海量的档案信息使档案管理人员从繁琐的重复性工作中解放出来将更多的精力投入到更有价值的工作中AI 技术可以实现档案的精准检索和智能推荐提高档案的利用效率更好地满足用户的需求这有助于充分挖掘档案的价值为决策提供更有力的支持
AI 技术的应用还将推动档案管理行业的变革它促使档案管理从传统的人工模式向智能化数字化模式转变引领行业进入一个新的发展阶段这种变革不仅有助于提升档案管理机构的竞争力也为整个社会的信息资源管理和利用带来了新的契机通过 AI 技术档案管理机构可以更好地整合和利用档案资源为社会提供更优质的信息服务
### 1.2 研究方法与创新点
本研究采用了多种研究方法以确保研究的全面性和深入性通过广泛收集和分析国内外相关文献了解 AI 技术在档案管理领域的研究现状应用进展和发展趋势为研究提供理论基础和参考依据对国内外多个档案管理机构应用 AI 技术的实际案例进行深入分析总结其成功经验和存在的问题探索 AI 技术在档案管理中的最佳应用模式还与档案管理领域的专家从业人员进行交流和访谈获取他们对 AI 技术应用的看法和建议进一步丰富研究内容
本研究的创新点在于从多个维度对 AI 赋能档案管理进行分析不仅关注 AI 技术在档案管理中的应用效果还深入探讨其对档案管理流程组织架构和服务模式的影响结合实际案例 AI 技术在不同类型档案管理中的应用进行详细分析为档案管理机构提供具有针对性的实践指导此外本研究还前瞻性地探讨了 AI 技术在档案管理中的未来发展趋势为行业的长远发展提供参考
## AI 赋能档案管理的技术基础
### 2.1 AI 技术概述
AI 技术是一门综合性的技术领域旨在让计算机系统模拟人类的智能行为实现对复杂问题的理解推理学习和决策它涵盖了多个子领域其中机器学习深度学习自然语言处理计算机视觉等技术在档案管理中具有重要的应用价值
机器学习是 AI 的核心技术之一它通过让计算机从大量的数据中学习模式和规律从而实现对未知数据的预测和决策机器学习主要分为监督学习无监督学习和强化学习监督学习使用标记好的数据进行训练模型通过学习数据中的特征和标签之间的关系来预测新数据的标签在档案分类中可以使用监督学习算法将已分类的档案作为训练数据让模型学习不同类别档案的特征从而对新的档案进行自动分类无监督学习则处理未标记的数据通过聚类降维等方法发现数据中的内在结构和模式在档案管理中无监督学习可以用于对档案进行主题建模发现档案中的潜在主题帮助用户更好地理解档案内容强化学习通过智能体与环境的交互根据环境反馈的奖励信号来学习最优策略在档案检索中强化学习可以根据用户的反馈不断优化检索策略提高检索结果的准确性
深度学习是机器学习的一个分支它基于深度神经网络通过构建多层神经元来自动学习数据的高级特征深度学习在图像识别语音识别自然语言处理等领域取得了显著的成果在档案管理中深度学习可以用于图像识别如对档案中的图像进行文字识别图像分类等也可以用于语音识别将档案中的语音内容转换为文本方便进行检索和管理
自然语言处理致力于让计算机理解和处理人类语言它包括文本分类情感分析机器翻译问答系统等多个任务在档案管理中自然语言处理可以用于对档案文本进行关键词提取摘要生成帮助用户快速了解档案内容还可以用于构建智能问答系统用户可以通过自然语言提问获取所需的档案信息
计算机视觉主要研究如何让计算机理解和解释图像和视频信息它包括图像识别目标检测图像分割等技术在档案管理中计算机视觉可以用于对档案图像进行数字化处理如去噪增强修复等提高图像的质量和可读性还可以用于对档案中的图像进行内容分析识别图像中的人物场景等信息为档案的分类和检索提供支持
这些 AI 技术在档案管理中具有很强的适用性档案管理涉及大量的数据处理和信息分析工作传统的人工方式效率低下且容易出错AI 技术的自动化和智能化特点可以有效地提高档案管理的效率和准确性通过机器学习和深度学习算法可以实现档案的自动分类检索和推荐大大节省了人力和时间成本自然语言处理和计算机视觉技术可以让计算机更好地理解和处理档案中的文本和图像信息为用户提供更加便捷和智能的服务
### 2.2 与档案管理相关的 AI 技术应用
#### 图像识别技术在档案数字化中的应用
图像识别技术在档案数字化过程中发挥着关键作用在纸质档案数字化时通过高精度扫描仪将纸质档案转化为数字图像后图像识别技术可对这些图像进行处理如在某大型企业的档案数字化项目中利用先进的卷积神经网络CNN算法能准确识别档案图像中的文字图表等元素该技术可自动去除图像中的噪声划痕校正图像的倾斜角度增强文字的清晰度极大提高了图像质量为后续的文字识别和信息提取奠定了良好基础通过图像识别技术实现自动边界检测与切割能准确识别文档的边缘截取文件中的文字区域过滤掉空白边缘或杂物避免误识别和多余信息干扰提高了识别效率和准确性在处理包含多个内容区域的文档如表格多栏文本等时算法还能准确识别并分别处理每个区域通过布局分析识别图像中的文本区域非文本区域以及文本的结构信息如列标题段落表格等有效提升了复杂档案图像的处理能力
#### 语音识别技术在档案检索中的应用
语音识别技术为档案检索带来了新的便利在一些档案管理系统中用户只需说出检索关键词系统就能快速定位到相关档案以某政府档案管理部门为例其引入了基于深度学习的语音识别技术该技术采用了循环神经网络RNN及其变体长短时记忆网络LSTM能够有效处理语音中的时序信息准确识别各种口音和语速的语音指令用户在检索档案时无需手动输入关键词直接通过语音提问系统即可将语音转换为文本并在档案数据库中进行检索迅速返回相关档案信息这一应用不仅提高了检索效率还降低了用户的操作门槛特别适用于不熟悉键盘输入或需要快速获取信息的用户提升了档案服务的便捷性和用户体验
#### 自然语言处理技术在档案内容分析中的应用
自然语言处理技术在档案内容分析方面具有重要价值它可以对档案文本进行深度挖掘和分析实现关键词提取主题建模情感分析等功能在某高校的科研档案管理中利用自然语言处理技术对科研成果档案进行关键词提取能够准确提炼出档案中的核心概念和关键信息方便用户快速了解档案内容通过主题建模可将大量的科研档案按照不同的研究主题进行分类和归纳帮助科研人员快速找到相关领域的研究资料自然语言处理技术还能对档案中的文本进行情感分析了解科研人员对特定研究方向或项目的态度和情感倾向为科研管理和决策提供有价值的参考
## AI 在档案管理中的应用场景与案例分析
### 3.1 档案资源建设
#### 3.1.1 智能采集与整理
在档案资源建设过程中智能采集与整理是重要的基础环节以某大型综合性档案馆为例该馆负责收集和整理大量的历史文献政府文件企业资料等各类档案随着信息时代的发展档案来源日益广泛包括各类网站数据库社交媒体等传统的人工采集和整理方式难以满足需求为此该档案馆引入了 AI 技术利用智能采集工具从网页爬取信息并结合自然语言处理和机器学习算法对采集到的信息进行自动分类和整理
通过配置专门的网络爬虫程序档案馆能够按照设定的规则自动从指定的网站和数据库中获取相关的档案信息在采集过程中利用自然语言处理技术对网页内容进行分析提取关键信息如文件标题发布时间作者主题等并自动生成元数据机器学习算法则用于对档案信息进行分类根据已有的分类标准和训练数据将新采集到的档案信息自动归类到相应的类别中如历史文献类政策法规类企业档案类等这一过程大大提高了档案采集的效率和准确性每天能够处理数千条信息相比传统人工采集方式效率提升了数倍同时通过自动分类和整理减少了人工分类的主观性和误差提高了档案资源的质量和可用性
#### 3.1.2 档案数字化处理
档案数字化是档案管理现代化的关键步骤AI 技术在这一过程中发挥了重要作用北京中烟创新科技有限公司推出的数字档案管理系统充分展示了 AI 在档案数字化处理中的应用该系统利用先进的 OCR光学字符识别技术能够高效准确地识别并转换纸质档案中的文字图像等信息为数字格式在处理大量纸质档案时OCR 技术可快速将纸质文件转化为可编辑的电子文本大大减少了人工录入成本提高了数字化转换效率
在对档案进行数字化处理后还需要对电子档案的 四性即真实性完整性可用性和安全性进行检测中烟创新数字档案管理系统通过数字签名访问记录等技术确保文件的真实性和可信度防止文件被篡改或伪造通过记录和管理文件的版本和修改历史确保文件的完整性和版本的追溯性通过提供随时随地的网络访问功能提高了档案信息的可用性和可访问性通过访问控制权限管理加密传输等安全机制保护档案信息不被未授权人员访问或泄露确保档案数据的安全性这些功能的实现离不开 AI 技术的支持如利用人工智能算法对数字签名进行验证通过机器学习模型对文件的完整性进行评估利用加密算法保障数据传输和存储的安全等通过 AI 技术的应用中烟创新数字档案管理系统实现了档案数字化处理的高效性准确性和安全性为企业的档案管理提供了有力支持
### 3.2 档案开放利用
#### 3.2.1 档案开放审核
档案开放审核是保障档案信息安全合理利用的重要环节某综合档案馆在档案开放审核工作中应用了海泰智能档案开放系统借助 AI 技术优化审核流程提升审核效率该系统利用自然语言处理的文本向量化文本分类关键信息提取文本摘要文本纠错等技术建立档案开放审核模型通过对大量已审核档案数据的学习和训练模型能够自动分析新档案的内容提取关键信息判断档案是否符合开放条件并给出开放审核建议
在实际应用中档案管理人员只需将待审核的档案录入系统系统即可快速进行分析处理对于一些内容较为简单明显符合开放条件的档案系统能够直接给出开放建议大大缩短了审核时间对于复杂的档案系统提供的分析结果和建议也能帮助档案鉴定人员更高效地开展审核工作据统计引入该系统后该档案馆的档案开放审核效率提升了 50% 以上有效加快了档案开放的进程使更多的档案资源能够及时为社会公众所用同时通过 AI 技术的辅助审核的准确性也得到了提高减少了因人工判断失误导致的档案开放不当问题
#### 3.2.2 档案智能检索
档案智能检索是提高档案利用效率的关键范德比尔特电视新闻档案馆在档案管理中充分利用 AI 技术实现了智能检索功能该档案馆自 1968 年以来致力于记录和保存美国国家电视网的新闻拥有海量的视频新闻档案随着档案数量的不断增加传统的检索方式难以满足用户快速准确获取信息的需求为此档案馆引入了自动语音识别ASR和命名实体识别NER AI 技术
首先利用 ASR 技术为新闻播报生成转录文本将视频中的语音内容转化为文字形成可检索的文本数据库接着通过 NER 技术从转录文本中提取命名实体如人名地名组织机构名等并自动生成新闻标题这些技术的应用使得用户可以通过输入自然语言关键词 2020 年美国总统大选相关新闻系统就能快速定位到相关的新闻档案大大提高了检索的准确性和效率与传统的基于关键词匹配的检索方式相比智能检索能够理解用户的语义需求提供更精准的检索结果满足了研究人员媒体工作者等不同用户对档案信息的多样化需求
#### 3.2.3 辅助档案编研
档案编研是对档案信息进行深度加工和开发利用的重要工作AI 技术在这一领域也发挥着重要作用海泰方圆在某军工企业的档案管理应用中利用自然语言处理技术服务于档案编研工作在编研素材的收集阶段自然语言处理技术通过智能检索引擎能够迅速准确地定位到与编研主题高度相关的档案极大提高检索的效率和准确性例如当编研人员确定了 某型号武器装备研发历程 的编研主题后系统能够根据主题关键词在海量的档案库中快速筛选出相关的研发报告试验记录技术文档等档案资料
通过文本挖掘技术海泰方圆深入挖掘档案中隐含信息揭示档案之间的内在联系和规律通过对档案内容的语义分析发现不同档案之间的关联如人物关系事件关联等为编研人员提供更全面的信息视角利用知识图谱技术构建档案知识网络将档案中的各种信息以图形化的方式展示出来使编研人员能够直观地了解档案之间的关联性和层次性为编写高质量的编研成果提供有力支持通过 AI 技术的应用该军工企业的档案编研工作效率得到了显著提升编研成果的质量和深度也得到了提高为企业的技术研发经验总结和历史传承提供了重要的参考依据
### 3.3 档案安全管理
#### 3.3.1 库房安全管理
档案库房的安全管理是档案管理工作的重要保障江苏省太仓市智慧档案馆将 AI 技术应用于库房安全管理实现了对库房环境的实时监控和智能安防该档案馆利用物联网技术在库房内布置了大量的传感器如温湿度传感器烟雾传感器门禁传感器等实时采集库房的环境数据和设备状态信息AI 智能管理系统对这些感知数据进行分析处理根据预设的规则和阈值判断库房环境是否正常设备是否运行良好
当库房内的温湿度超出适宜范围时系统会自动发出警报并联动空调除湿机等设备进行调节确保档案保存环境的稳定在安防方面利用人脸识别视频监控等 AI 技术对进入库房的人员进行身份识别和行为监测只有通过授权的人员才能进入库房并且系统会实时记录人员的进出时间行为轨迹等信息一旦发现异常行为如非法闯入长时间逗留等系统会立即触发警报并通知安保人员进行处理通过这些 AI 技术的应用太仓市智慧档案馆实现了库房安全管理的智能化自动化有效提高了档案库房的安全性保障了档案实体的安全
#### 3.3.2 数据安全与隐私保护
在数字化时代档案数据的安全与隐私保护至关重要AI 技术在数据加密访问控制等方面的应用为档案数据安全提供了有力保障在数据加密方面利用 AI 算法生成高强度的加密密钥对档案数据进行加密存储和传输通过机器学习算法不断优化加密策略提高加密的安全性和效率防止数据被窃取或篡改在访问控制方面AI 技术可以根据用户的身份权限和行为模式实现智能的访问控制通过对用户行为数据的分析建立用户行为模型实时监测用户的访问行为当发现异常访问行为如频繁尝试登录大量下载敏感数据等系统会自动进行拦截并要求用户进行身份验证确保只有授权用户能够访问相应的档案数据
AI 技术还可以用于检测和防范网络攻击通过对网络流量的实时监测和分析利用机器学习算法识别潜在的攻击行为 DDoS 攻击SQL 注入攻击等并及时采取防护措施保障档案管理系统的网络安全在隐私保护方面AI 技术可以对档案中的敏感信息进行自动识别和脱敏处理如个人身份证号银行卡号医疗记录等在保护用户隐私的同时确保档案数据的可用性通过这些 AI 技术的综合应用有效地保障了档案数据的安全和用户的隐私为档案管理的数字化转型提供了安全可靠的环境
## AI 赋能档案管理的优势与挑战
### 4.1 优势分析
#### 4.1.1 提高管理效率
AI 技术在档案管理的多个环节显著提高了管理效率在档案分类环节传统的人工分类方式需要档案管理人员逐份阅读档案内容依据经验和既定规则进行分类这一过程耗时费力且容易因人为因素导致分类不准确以某大型企业的档案管理为例该企业每年产生的各类档案数量多达数十万份包括合同档案财务档案人事档案等在引入 AI 分类系统之前档案管理人员需要花费大量时间进行分类工作且分类错误率较高这给后续的档案检索和利用带来了很大困难引入基于机器学习算法的 AI 分类系统后该系统通过对大量已分类档案数据的学习能够自动识别档案的关键信息和特征快速准确地将新的档案归入相应类别经过实际应用档案分类的效率提高了数倍错误率也大幅降低从原来的 10% 左右降低到了 2% 以内
在档案检索方面AI 技术同样展现出巨大优势传统的检索方式主要依赖关键词匹配当用户输入关键词时系统在档案库中进行简单的文本匹配这种方式往往无法准确理解用户的真实需求导致检索结果不准确不全面某高校的图书馆档案管理系统在采用 AI 智能检索技术之前学生和教师在检索相关资料时常常因为检索结果不理想而浪费大量时间引入 AI 智能检索系统后该系统利用自然语言处理技术能够理解用户输入的自然语言问题分析其语义和语境从而在海量的档案中精准定位到用户所需信息同时通过建立知识图谱系统可以挖掘档案之间的关联关系为用户提供更全面更相关的检索结果据统计采用 AI 智能检索技术后检索效率提高了 50% 以上用户对检索结果的满意度也从原来的 60% 提升到了 85% 以上
在档案审核环节AI 技术的应用也大大节省了人力和时间如北京神舟航天软件技术股份有限公司申请的文书档案开放审核专利技术通过获取待审核文书档案利用机器学习和自然语言处理等技术识别个性化信息并运用审查准则自动判断文书档案是否开放在某政府部门的档案审核工作中引入该技术后原本需要人工花费数周时间才能完成的大量文书档案审核工作现在通过自动化系统仅需几天甚至几小时就能完成审核效率大幅提升同时减少了人工判断的误判率提高了审核的准确性
#### 4.1.2 提升服务质量
AI 技术能够实现精准检索和个性化服务从而有效提升档案服务质量满足用户多元化需求在精准检索方面AI 技术通过自然语言处理和深度学习算法能够理解用户的复杂查询意图提供更准确的检索结果以范德比尔特电视新闻档案馆为例该馆利用自动语音识别ASR和命名实体识别NER技术为新闻播报生成转录文本并提取命名实体用户可以通过输入自然语言关键词 2020 年美国总统大选相关新闻系统就能快速准确地定位到相关新闻档案大大提高了检索的精准度与传统的基于关键词匹配的检索方式相比AI 精准检索能够理解语义避免了因关键词匹配不准确而导致的漏检和误检问题为用户节省了大量时间和精力
在个性化服务方面AI 技术可以根据用户的历史检索记录浏览行为等数据分析用户的兴趣偏好和需求特点为用户提供个性化的档案推荐服务某企业的档案管理系统通过 AI 技术对用户的使用数据进行分析当用户登录系统时系统会根据用户的个性化需求主动推荐相关的档案资源如行业报告市场分析资料等这种个性化推荐服务不仅提高了用户获取所需信息的效率还能帮助用户发现潜在的有价值信息提升了用户对档案服务的满意度同时AI 技术还可以根据不同用户的身份和权限提供差异化的服务如为企业高管提供更高级别的决策支持信息为普通员工提供与工作相关的基础档案资料满足了不同用户的多元化需求
#### 4.1.3 挖掘数据价值
AI 技术通过强大的数据分析能力能够深入挖掘档案中的潜在价值为决策提供有力支持通过对档案数据的分析AI 可以发现数据之间的关联和规律揭示出隐藏在档案中的信息某城市的规划部门对历年的城市建设档案进行分析利用 AI 技术挖掘出城市发展过程中不同区域的功能演变人口流动趋势以及基础设施建设需求等信息通过对这些信息的分析规划部门可以更好地制定城市未来的发展规划合理布局基础设施优化城市功能分区为城市的可持续发展提供决策依据
在企业领域AI 技术对档案数据的分析也具有重要价值某企业通过对历年销售档案客户档案和市场档案的分析利用 AI 技术预测市场趋势客户需求和产品销售情况通过对销售数据的时间序列分析和市场趋势预测企业可以提前调整生产计划优化产品库存合理安排资源提高企业的运营效率和市场竞争力AI 还可以对客户档案进行分析了解客户的购买行为和偏好为企业的市场营销策略提供数据支持实现精准营销提高客户满意度和忠诚度
在科研领域AI 技术对档案数据的挖掘也为科研工作提供了新的思路和方法某科研机构对大量的科研文献档案进行分析利用 AI 技术发现不同研究领域之间的潜在联系和交叉点为科研人员提供新的研究方向和创新点通过对科研文献的主题建模和知识图谱构建AI 可以帮助科研人员快速了解相关领域的研究现状和发展趋势避免重复研究提高科研效率
### 4.2 挑战分析
#### 4.2.1 数据质量问题
档案数据来源多样包括纸质档案数字化电子文档数据库导入网络采集等这导致数据格式不统一如文本文件有.doc.txt.pdf 等多种格式图像文件有.jpg.png.tif 等格式不同格式的数据在处理和分析时需要不同的技术和工具增加了数据处理的复杂性档案数据还存在质量参差不齐的问题如纸质档案数字化过程中可能出现文字模糊图像变形信息缺失等情况电子文档可能存在数据错误格式混乱元数据不完整等问题这些问题会影响 AI 算法的训练和模型的准确性导致分类错误检索结果不准确等问题
为解决这些问题需要建立完善的数据质量管理机制在数据采集阶段制定严格的数据采集标准和规范确保采集的数据准确完整格式统一在数据预处理阶段采用数据清洗去噪修复等技术对数据进行标准化处理去除错误数据和噪声数据补充缺失数据提高数据质量利用数据质量评估工具定期对档案数据进行质量评估及时发现和解决数据质量问题通过建立数据质量管理体系从数据的产生采集存储处理到应用的全过程进行监控和管理确保数据的质量和可靠性 AI 技术在档案管理中的应用提供坚实的数据基础
#### 4.2.2 技术适应性与安全性
档案信息种类繁多包括文本图像音频视频等多种类型每种类型的信息都有其独特的结构和特征这对 AI 技术的适应性提出了很高的要求不同类型的档案数据需要不同的 AI 算法和模型进行处理如文本数据需要自然语言处理技术图像数据需要计算机视觉技术音频数据需要语音识别技术等如何针对不同类型的档案数据选择合适的 AI 技术并将这些技术有效地集成到档案管理系统中是一个需要解决的问题
档案信息包含大量的敏感信息如个人隐私商业机密国家秘密等保障档案信息的安全和隐私至关重要AI 技术在处理和存储档案信息时可能面临数据泄露篡改非法访问等安全风险在数据传输过程中可能被黑客截获和篡改在数据存储过程中可能因系统漏洞被非法访问为保障档案信息安全需要采用多种安全技术如数据加密技术对档案数据进行加密存储和传输防止数据被窃取和篡改访问控制技术根据用户的身份和权限对档案信息的访问进行严格控制确保只有授权用户能够访问相应的档案信息安全监测技术实时监测档案管理系统的运行状态及时发现和防范安全威胁还需要建立健全安全管理制度加强对档案管理人员和用户的安全培训提高安全意识确保档案信息的安全和隐私
#### 4.2.3 伦理与法律法规问题
AI 应用中数据使用的合法性和合规性是一个重要问题档案数据的收集存储处理和共享需要遵循相关的法律法规如个人信息保护法数据安全法等在收集和使用用户的个人档案数据时需要获得用户的明确授权确保数据使用的目的合法正当防止数据滥用和泄露AI 算法可能存在偏见这是由于训练数据的偏差或算法设计的缺陷导致的在档案分类和检索中如果算法存在偏见可能会导致某些类型的档案被错误分类或检索不到影响档案管理的公平性和准确性算法的透明度和可解释性也是一个伦理问题由于 AI 算法的复杂性其决策过程往往难以理解这使得用户难以信任算法的结果在涉及重要决策时如档案开放审核机密档案处理等算法的不可解释性可能会引发伦理争议
为应对这些伦理和法律法规问题需要加强法律法规建设制定专门针对 AI 在档案管理中应用的法律法规明确数据使用算法开发和应用等方面的规则和责任建立伦理审查机制 AI 系统的设计开发和应用进行伦理审查确保 AI 技术的应用符合伦理道德标准提高 AI 算法的透明度和可解释性通过技术手段和可视化方法让用户能够理解算法的决策过程和依据增强用户对 AI 系统的信任加强对 AI 技术应用的监管建立监管机构 AI 在档案管理中的应用进行监督和管理确保其合法合规符合伦理要求
#### 4.2.4 人才短缺问题
AI 时代对档案管理人员的技能提出了新的挑战传统的档案管理人员主要具备档案管理的专业知识和技能如档案整理分类保管等而在 AI 赋能的档案管理环境下档案管理人员需要掌握 AI 技术相关的知识和技能如机器学习自然语言处理数据分析等以便能够有效地运用 AI 技术进行档案管理工作他们还需要具备一定的信息技术素养能够熟练使用档案管理系统和相关软件工具目前具备这些综合技能的档案管理人才相对短缺这限制了 AI 技术在档案管理中的广泛应用和深入发展
为解决人才短缺问题需要加强人才培养在高校教育中优化档案管理相关专业的课程设置增加 AI 技术信息技术等相关课程培养具备跨学科知识和技能的专业人才开展在职培训针对现有的档案管理人员提供定期的 AI 技术培训和继续教育课程帮助他们更新知识结构提升技能水平鼓励档案管理机构与科研机构高校等合作建立人才培养基地共同培养适应 AI 时代需求的档案管理人才还可以通过引进外部人才吸引具有 AI 技术背景和经验的专业人才加入档案管理队伍提高档案管理团队的整体素质和能力
## 应对策略与未来发展趋势
### 5.1 应对策略
#### 5.1.1 数据质量管理
建立完善的数据质量管理机制是确保档案数据质量和一致性的关键在数据采集环节制定严格的数据采集标准和规范明确数据的来源格式内容要求等确保采集到的数据准确完整格式统一对于纸质档案数字化要保证扫描图像的清晰度完整性对图像进行预处理去除噪声倾斜校正等确保后续的文字识别和信息提取准确无误在数据录入过程中采用数据校验和审核机制对录入的数据进行实时校验及时发现和纠正错误数据
在数据存储和管理方面建立数据仓库和数据湖对档案数据进行集中存储和管理确保数据的一致性和可访问性利用数据清洗和去重技术定期对档案数据进行清洗去除重复数据错误数据和无效数据提高数据的质量建立数据质量评估体系制定数据质量指标和评估方法定期对档案数据进行质量评估及时发现和解决数据质量问题通过数据质量评估对数据的准确性完整性一致性时效性等方面进行量化评估为数据质量管理提供数据支持
#### 5.1.2 技术研发与应用
鼓励加大对适应档案管理的 AI 技术的研发投入推动技术创新针对档案数据的特点研发专门的 AI 算法和模型提高 AI 技术在档案管理中的适应性和准确性研发针对档案图像识别的深度学习模型提高对档案图像中文字图表等元素的识别准确率研发适合档案文本分析的自然语言处理模型增强对档案文本的理解和分析能力加强与高校科研机构的合作共同开展 AI 技术在档案管理中的应用研究促进技术成果的转化和应用
在技术应用方面加强 AI 技术与档案管理系统的集成实现 AI 技术在档案管理全流程的应用在档案采集环节利用 AI 技术实现自动化采集和分类在档案整理环节借助 AI 技术进行智能分类和编目在档案检索环节运用 AI 技术提供智能检索和推荐服务不断优化 AI 技术在档案管理中的应用效果根据实际应用情况 AI 模型和算法进行调整和优化提高档案管理的效率和质量
#### 5.1.3 人才培养与团队建设
加强档案人员的 AI 技术培训是提升档案管理水平的重要举措定期组织档案人员参加 AI 技术培训课程邀请专家学者进行授课系统学习机器学习自然语言处理数据分析等 AI 技术知识了解 AI 技术在档案管理中的应用案例和实践经验鼓励档案人员参加相关的学术交流活动和研讨会拓宽视野掌握最新的技术动态和发展趋势
通过培训使档案人员具备运用 AI 技术进行档案管理的能力能够熟练操作档案管理系统中的 AI 功能模块如智能检索自动分类等培养档案人员的数据思维和创新意识让他们能够充分利用 AI 技术挖掘档案数据的价值为档案管理工作提供创新思路和方法除了技术培训还应注重培养档案人员的综合素质包括沟通能力团队协作能力问题解决能力等提高档案管理团队的整体战斗力
引进具有 AI 技术背景的专业人才充实档案管理团队优化团队的知识结构和技能水平建立人才激励机制为人才提供良好的发展空间和待遇吸引和留住优秀人才通过人才的引进和培养打造一支既懂档案管理又懂 AI 技术的复合型人才队伍 AI 赋能档案管理提供人才保障
#### 5.1.4 伦理与法律规范
制定相关的伦理准则和法律法规是规范 AI 在档案管理中应用的重要保障明确 AI 在档案管理中的数据使用规则确保数据的收集存储处理和共享符合法律法规和伦理道德要求在收集用户个人档案数据时必须获得用户的明确授权遵循最小必要原则仅收集与档案管理相关的必要数据保护用户的隐私和个人信息安全
建立 AI 算法的审查机制对用于档案管理的 AI 算法进行伦理审查确保算法的公正性和透明度审查算法是否存在偏见是否会对特定群体造成不公平的影响对于可能影响档案管理决策的 AI 算法要求算法开发者提供详细的算法说明和解释提高算法的可解释性增强用户对算法结果的信任加强对 AI 技术应用的监管建立专门的监管机构制定监管标准和流程 AI 在档案管理中的应用进行监督和管理确保其合法合规符合伦理要求对违反伦理准则和法律法规的行为要依法进行惩处维护档案管理的良好秩序
### 5.2 未来发展趋势
#### 5.2.1 AI 技术与档案管理的深度融合
未来AI 技术将在档案管理的全流程实现更深入的融合和应用在档案资源建设方面AI 技术将实现更智能化的采集和整理通过智能传感器和网络爬虫技术能够自动从各种数据源采集档案信息包括网页社交媒体数据库等实现档案信息的全面收集利用更先进的机器学习算法对采集到的信息进行自动分类标引和编目提高档案资源建设的效率和准确性在档案数字化处理中AI 技术将进一步提升数字化的质量和速度通过深度学习算法实现对档案图像和文字的更精准识别和转换提高数字化的准确率利用 AI 技术对数字化后的档案进行智能修复和优化恢复受损档案的内容提高档案的可读性和可用性
在档案开放利用方面AI 技术将为用户提供更个性化智能化的服务通过对用户行为数据的分析和挖掘AI 能够深入了解用户的需求和兴趣偏好为用户提供定制化的档案推荐服务当用户搜索档案时AI 不仅能够根据关键词提供相关档案还能根据用户的历史搜索记录和行为模式推荐更符合用户需求的档案资源AI 技术还将实现更智能的档案编研通过自然语言处理和知识图谱技术能够对档案内容进行深度分析和挖掘发现档案之间的关联和潜在知识为档案编研人员提供更丰富的素材和思路提高编研成果的质量和深度
在档案安全管理方面AI 技术将发挥更重要的作用利用 AI 技术实现对档案库房环境的实时监测和智能调控确保档案保存环境的稳定和安全通过对库房内温湿度空气质量光照等环境参数的实时监测AI 系统能够自动调整空调除湿机通风设备等保持适宜的保存环境在档案数据安全方面AI 技术将提供更强大的防护能力通过机器学习算法能够实时监测档案数据的访问和传输情况及时发现和防范数据泄露篡改等安全威胁利用 AI 技术对档案数据进行加密和备份确保数据的安全性和完整性
#### 5.2.2 智能化与自动化的发展方向
随着 AI 技术的不断发展档案管理将朝着更加智能化和自动化的方向发展AI 将实现档案管理的自动化决策通过对大量档案数据的分析和学习AI 系统能够自动判断档案的价值重要性和保存期限为档案管理决策提供依据在档案鉴定环节AI 可以根据预设的标准和模型自动评估档案的保存价值决定哪些档案需要永久保存哪些可以定期销毁减少人工鉴定的主观性和工作量
AI 还将实现档案管理的自主服务通过智能客服和聊天机器人技术用户可以与档案管理系统进行自然语言交互获取所需的档案信息和服务用户只需通过语音或文字提问系统就能自动理解用户的需求提供准确的答案和相关档案资源档案管理系统还能根据用户的需求自动生成档案报告统计分析等为用户提供更便捷高效的服务未来档案管理将实现无人化管理通过自动化设备和 AI 技术实现档案的自动上架下架盘点等操作减少人工干预提高管理效率和准确性利用机器人技术实现档案库房的自动巡逻和安全检查及时发现和处理安全隐患
#### 5.2.3 跨领域合作与创新
档案管理将与其他领域展开更广泛的合作与创新推动 AI 技术的应用和发展与大数据云计算等技术领域的合作将更加紧密通过与大数据技术的结合能够对海量的档案数据进行更深入的分析和挖掘发现数据背后的潜在价值和规律为档案管理决策提供更有力的数据支持借助云计算技术实现档案数据的分布式存储和计算提高数据处理的效率和可靠性降低档案管理的成本
与文化教育科研等领域的合作也将不断加强在文化领域与博物馆图书馆等文化机构合作整合档案资源和文化资源打造综合性的文化信息服务平台为公众提供更丰富的文化体验在教育领域与学校合作将档案资源作为教学素材开展档案教育和研究培养学生的历史文化素养和信息素养在科研领域与科研机构合作利用档案数据开展学术研究为科研工作提供数据支持和历史借鉴通过跨领域合作能够拓展档案管理的应用场景和服务范围推动档案管理的创新发展为社会提供更优质的档案信息服务
## 结论与展望
### 6.1 研究总结
本研究深入探讨了 AI 赋能档案管理的相关内容AI 技术包括机器学习深度学习自然语言处理和计算机视觉等为档案管理提供了强大的技术支持使其在多个方面实现了创新和变革
在应用场景方面AI 在档案资源建设中实现了智能采集与整理以及高效的档案数字化处理在档案开放利用中助力档案开放审核提供智能检索服务并辅助档案编研工作在档案安全管理中实现了库房安全的智能监控和数据安全与隐私的有效保护通过多个实际案例分析如范德比尔特电视新闻档案馆利用 AI 实现智能检索海泰方圆在档案编研中应用自然语言处理技术等充分展示了 AI 在档案管理各环节的应用效果和价值
AI 赋能档案管理具有显著优势它极大地提高了管理效率在档案分类检索和审核等工作中节省了大量的人力和时间成本提高了工作的准确性通过精准检索和个性化服务提升了档案服务质量满足了用户的多元化需求AI 技术还能够深入挖掘档案数据的价值为决策提供有力支持在城市规划企业运营和科研等领域发挥了重要作用
AI 在档案管理中的应用也面临诸多挑战数据质量问题如数据格式不统一质量参差不齐影响了 AI 算法的训练和模型的准确性技术适应性与安全性方面不同类型档案数据对 AI 技术的适应性要求高同时保障档案信息安全和隐私至关重要伦理与法律法规问题包括数据使用的合法性算法偏见以及算法的透明度和可解释性等人才短缺问题传统档案管理人员难以满足 AI 时代对综合技能的要求针对这些挑战本研究提出了相应的应对策略包括建立完善的数据质量管理机制加大技术研发与应用力度加强人才培养与团队建设以及制定伦理与法律规范等
### 6.2 未来展望
未来AI 在档案管理领域将展现出更广阔的发展前景AI 技术与档案管理的融合将更加深入贯穿档案管理的全流程在档案资源建设中实现更智能化的采集和整理提升数字化处理的质量和速度在档案开放利用中提供更个性化智能化的服务实现更智能的档案编研在档案安全管理中发挥更重要的作用保障档案实体和数据的安全
档案管理将朝着智能化与自动化的方向加速发展AI 将实现档案管理的自动化决策如自动判断档案的价值重要性和保存期限实现档案管理的自主服务通过智能客服和聊天机器人为用户提供便捷的服务甚至实现无人化管理借助自动化设备和机器人完成档案的日常管理工作
跨领域合作与创新将成为档案管理发展的重要趋势与大数据云计算等技术领域的紧密合作将为档案管理提供更强大的数据处理和分析能力与文化教育科研等领域的合作将拓展档案管理的应用场景和服务范围推动档案管理的创新发展为社会提供更优质的档案信息服务为了充分发挥 AI 在档案管理中的优势我们需要持续关注技术发展动态积极应对各种挑战不断探索和创新推动档案管理行业向更高水平迈进`,
loading: false,
intervalId: null
}
},
computed: {
...mapGetters([
'user'
])
},
created() {
},
methods: {
previewFiles() {
const files = this.$refs.file.files
this.selectedFiles = []
for (let i = 0; i < files.length; i++) {
this.selectedFiles.push(files[i])
}
},
handleAIEditing() {
if (this.selectedFiles.length === 0) {
this.$message({ message: '请上传要编研的文件', type: 'error', offset: 8 })
return
}
if (this.textarea === '') {
this.$message({ message: '请输入提问要求', type: 'error', offset: 8 })
return
}
this.loading = true
this.editorContent = ''
const lines = this.mockResponse.split('\n')
let index = 0
this.intervalId = setInterval(() => {
if (index < lines.length) {
this.editorContent += (index > 0 ? '\n' : '') + lines[index]
index++
} else {
clearInterval(this.intervalId)
this.loading = false
}
// this.$nextTick(() => {
// const container = this.$refs.typingContainer.$el.querySelector('.markdown-body')
// if (container) {
// container.scrollTop = container.scrollHeight
// }
// })
}, 200) // 500
},
handleCloseForm() {
this.selectedFiles = []
this.textarea = ''
this.editorContent = ''
this.formVisible = false
clearInterval(this.intervalId)
this.loading = false
},
handleComfiredEditing() {
this.handleCloseForm()
}
}
}
</script>
<style lang="scss" scoped>
.editingDialog{
::v-deep .el-dialog{
width: 1000px;
}
}
::v-deep .markdown-body{
height: 500px !important;
overflow-y: auto;
}
</style>

614
src/views/AIAssistant/AIIntelligentCoding/index.vue

@ -0,0 +1,614 @@
<template>
<div class="app-container tab-container" style="height: calc(100vh - 140px);">
<div class="head-container" style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px;">
<!-- <div class="head-search" style="margin-bottom: 0;">
<el-input
v-model="keyWord"
size="small"
clearable
placeholder="输入关键字可模糊检索"
style="width: 245px;"
class="filter-item"
@clear="crud.toQuery"
@keyup.enter.native="crud.toQuery"
/>
<date-range-picker v-model="blurryTime" class="date-item" />
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button>
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button>
<el-checkbox v-model="participants" style="line-height: 32px; padding-left: 10px;" @change="changeMy">我参与得编研</el-checkbox>
</div> -->
<crudOperation>
<template v-slot:left>
<el-button size="mini" @click="toAdd(1,null)">
<i class="iconfont icon-xinzeng" />
新增
</el-button>
<!-- <el-button size="mini" :disabled="crud.selections.length === 0" @click="toAdd(2,crud.selections[0])">
<i class="iconfont icon-bianji" />
编辑
</el-button> -->
</template>
<!-- <template v-slot:right>
<el-button size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)">
<i class="iconfont icon-shanchu" />
删除
</el-button>
</template> -->
</crudOperation>
</div>
<el-table
ref="table"
v-loading="crud.loading"
:data="crud.data"
row-key="id"
style="width: 100%;"
height="calc(100vh - 330px)"
@row-click="clickRowHandler"
@cell-dblclick="tableDoubleClick"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" :reserve-selection="true" width="55" align="center" />
<el-table-column prop="title" label="编研主题" />
<el-table-column prop="researchType" label="编研类型" align="center" />
<el-table-column prop="editor1" label="主编人" align="center" />
<el-table-column prop="editor2" label="其他编研人员" align="center" />
<el-table-column prop="startTime" label="开始时间" width="200">
<template slot-scope="scope">
<div>{{ scope.row.startTime | parseTime }}</div>
</template>
</el-table-column>
<el-table-column prop="endTime" label="结束时间" width="200">
<template slot-scope="scope">
<div>{{ scope.row.endTime | parseTime }}</div>
</template>
</el-table-column>
</el-table>
<pagination v-if="crud.data.length !== 0" />
<aiForm ref="aiForm" />
<el-dialog class="detail-dialog" title="AI编研详情" :close-on-click-modal="false" :modal-append-to-body="false" append-to-body :visible.sync="onlineEditDetail" :before-close="handleCloseDialog">
<div class="setting-dialog">
<div class="detail-tab tab-content">
<!-- tab -->
<ul class="tab-nav">
<li :class="{'active-tab-nav': onlineTabIndex == 0}" @click="changeOnlineTab(0)">AI编研正文</li>
<li :class="{'active-tab-nav': onlineTabIndex == 1}" @click="changeOnlineTab(1)">AI文档附件</li>
</ul>
<div v-if="onlineTabIndex===0" style="width: 100%; height: 500px; overflow: hidden; overflow-y: scroll;">
<!-- <p>文档名称{{ onlineContent && onlineContent.title }}</p> -->
<!-- <div class="context-wrapper" v-html="onlineContent" /> -->
<mavon-editor
class="md"
:value="onlineContent"
:subfield="false"
:default-open="'preview'"
:toolbars-flag="false"
:editable="false"
:scroll-style="true"
:ishljs="true"
/>
</div>
<el-table
v-if="onlineTabIndex===1"
ref="table"
:data="detailArcData"
row-key="id"
style="width: 100%;"
height="calc(100vh - 560px)"
>
<el-table-column type="index" label="序号" align="center" width="55" />
<el-table-column prop="fileName" label="附件名称" />
<el-table-column prop="fileType" label="格式" align="center" min-width="60">
<template slot-scope="scope">
<div v-if="scope.row.fileType === 'jpg' || scope.row.fileType === 'jpeg' || scope.row.fileType === 'png' || scope.row.fileType === 'bmp'|| scope.row.fileType === 'gif'">
<i class="fileIcon icon-image" />
</div>
<div v-else-if="scope.row.fileType === 'xlsx' || scope.row.fileType === 'xls'">
<i class="fileIcon icon-excel" />
</div>
<div v-else-if="scope.row.fileType === 'docx' || scope.row.fileType === 'doc'">
<i class="fileIcon icon-word" />
</div>
<div v-else-if="scope.row.fileType === 'pdf'">
<i class="fileIcon icon-pdf" />
</div>
<div v-else-if="scope.row.fileType === 'ppt' || scope.row.fileType === 'pptx'">
<i class="fileIcon icon-ppt" />
</div>
<div v-else-if="scope.row.fileType === 'zip' || scope.row.fileType === 'rar'">
<i class="fileIcon icon-zip" />
</div>
<div v-else-if="scope.row.fileType === 'txt'">
<i class="fileIcon icon-txt" />
</div>
<div v-else>
<i class="fileIcon icon-other" />
</div>
</template>
</el-table-column>
<el-table-column prop="fileSize" label="大小">
<template slot-scope="scope">
{{ getFileSize(scope.row.fileSize) }}
</template>
</el-table-column>
<el-table-column prop="create_by" label="操作者" />
<el-table-column prop="create_time" label="加入时间">
<template slot-scope="scope">
<div>{{ scope.row.create_time | parseTime }}</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</el-dialog>
<!-- <eForm ref="eform" @refresh="initData" /> -->
<!-- <EditingDetail ref="editingDetail" :current-research="currentResearch" /> -->
</div>
</template>
<script>
import CRUD, { presenter, crud } from '@crud/crud'
import crudEditing from '@/api/archiveUtilize/archiveEditing'
import pagination from '@crud/Pagination'
// import DateRangePicker from '@/components/DateRangePicker'
import crudOperation from '@crud/CRUD.operation'
// import eForm from '../../archiveUtilize/archiveEditing/form.vue'
import aiForm from './aiForm'
// import EditingDetail from './module/detail'
import { mapGetters } from 'vuex'
export default {
name: 'AIIntelligentCoding',
components: { pagination, crudOperation, aiForm },
mixins: [presenter(), crud()],
cruds() {
return CRUD({
url: 'api/archivesUtilize/initResearchList',
title: '档案编研',
crudMethod: { ...crudEditing },
optShow: {
add: false,
edit: false,
del: false,
download: false,
reset: false,
group: false
}
})
},
props: {
activeIndex: {
type: Number,
default: 0
}
},
data() {
return {
permission: {
add: ['admin', 'archiveEditing:add'],
edit: ['admin', 'archiveEditing:edit'],
del: ['admin', 'archiveEditing:del']
},
keyWord: null,
blurryTime: null,
participants: false,
currentResearch: null,
onlineEditDetail: false,
onlineTabIndex: 0,
onlineContent: null,
uploadVisible: false,
fileList: [],
detailArcData: [],
currentResearchOnline: null
}
},
computed: {
...mapGetters([
'user'
])
},
mounted() {
},
methods: {
initData() {
this.crud.refresh()
this.crud.selections = []
this.$refs.table.clearSelection()
},
resetQuery() {
this.blurryTime = []
this.crud.query.startTime = null
this.crud.query.endTime = null
this.crud.toQuery()
},
[CRUD.HOOK.beforeRefresh]() {
this.crud.query.search = this.keyWord
if (this.participants) {
this.crud.query.participants = this.user.username
} else {
this.crud.query.participants = ''
}
if (this.blurryTime) {
this.crud.query.startTime = this.blurryTime[0]
this.crud.query.endTime = this.blurryTime[1]
} else {
this.crud.query.startTime = null
this.crud.query.endTime = null
}
},
toAdd(type, row) {
if (type === 1) {
this.$refs.aiForm.formTitle = '新增AI编研'
} else {
this.$refs.aiForm.formTitle = '新增AI编研'
this.$refs.aiForm.form = {
'id': row.id,
'title': row.title,
'editor1': row.editor1,
'editor2': row.editor2,
'researchType': row.researchType,
'startTime': row.startTime,
'endTime': row.endTime,
'remarks': row.remarks
}
if (row.editor1) {
var usernames = row.editor1.split(',')
var matchedItems = []
for (var i = 0; i < this.$refs.aiForm.userTable.length; i++) {
if (usernames.includes(this.$refs.aiForm.userTable[i].username)) {
matchedItems.push(this.$refs.aiForm.userTable[i])
}
}
this.$refs.aiForm.userMainSelected = matchedItems
}
if (row.editor2) {
var usernames2 = row.editor2.split(',')
var matchedItems2 = []
for (var j = 0; j < this.$refs.aiForm.userTable.length; j++) {
if (usernames2.includes(this.$refs.aiForm.userTable[j].username)) {
matchedItems2.push(this.$refs.aiForm.userTable[j])
}
}
this.$refs.aiForm.userOtherSelected = matchedItems2
}
}
this.$refs.aiForm.formType = type
this.$refs.aiForm.formVisible = true
},
toDelete(data) {
this.$confirm('此操作将删除当前所选编研主题' + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
const ids = data.map(item => item.id)
const params = {
'ids': ids,
'operator': this.user.username
}
crudEditing.del(params).then((res) => {
console.log(res)
if (res.code !== 500) {
this.$message({ message: '删除成功', type: 'success', offset: 8 })
} else {
this.$message({ message: res.message, type: 'error', offset: 8 })
}
this.initData()
}).catch(err => {
console.log(err)
})
}).catch(() => {
})
},
clickRowHandler(row) {
this.$refs.table.toggleRowSelection(row)
},
// tableDoubleClick(row) {
// // this.currentResearch = row
// // this.$refs.editingDetail.archivesTabIndex = 0
// // this.$refs.editingDetail.getDetail(row)
// // this.$refs.editingDetail.editingDetailVisible = true
// },
tableDoubleClick(row) {
this.onlineTabIndex = 0
this.currentResearchOnline = row
this.onlineEditDetail = true
this.onlineContent = `## 一、引言
### 1.1 研究背景与意义
随着科技的飞速发展人工智能AI技术已逐渐渗透到各个行业成为推动创新和发展的重要力量AI 技术以其强大的数据分析模式识别和自动化处理能力正在重塑许多传统行业的运作方式在档案管理领域传统的管理模式面临着诸多挑战如档案数量的快速增长信息检索的效率低下档案利用的局限性等 AI 技术引入档案管理为解决这些问题提供了新的思路和方法
传统档案管理主要依赖人工操作从档案的收集整理分类到存储和检索都需要大量的人力和时间这种方式不仅效率低下而且容易出现人为错误随着数字化时代的到来电子档案的数量呈爆炸式增长传统的管理方式越发难以应对AI 技术的出现为档案管理带来了新的机遇它能够自动处理大量的档案数据实现档案的智能分类快速检索和精准推荐大大提高了档案管理的效率和准确性
AI 赋能档案管理具有重要的现实意义它可以显著提升档案管理的效率通过自动化的分类和索引AI 能够快速处理海量的档案信息使档案管理人员从繁琐的重复性工作中解放出来将更多的精力投入到更有价值的工作中AI 技术可以实现档案的精准检索和智能推荐提高档案的利用效率更好地满足用户的需求这有助于充分挖掘档案的价值为决策提供更有力的支持
AI 技术的应用还将推动档案管理行业的变革它促使档案管理从传统的人工模式向智能化数字化模式转变引领行业进入一个新的发展阶段这种变革不仅有助于提升档案管理机构的竞争力也为整个社会的信息资源管理和利用带来了新的契机通过 AI 技术档案管理机构可以更好地整合和利用档案资源为社会提供更优质的信息服务
### 1.2 研究方法与创新点
本研究采用了多种研究方法以确保研究的全面性和深入性通过广泛收集和分析国内外相关文献了解 AI 技术在档案管理领域的研究现状应用进展和发展趋势为研究提供理论基础和参考依据对国内外多个档案管理机构应用 AI 技术的实际案例进行深入分析总结其成功经验和存在的问题探索 AI 技术在档案管理中的最佳应用模式还与档案管理领域的专家从业人员进行交流和访谈获取他们对 AI 技术应用的看法和建议进一步丰富研究内容
本研究的创新点在于从多个维度对 AI 赋能档案管理进行分析不仅关注 AI 技术在档案管理中的应用效果还深入探讨其对档案管理流程组织架构和服务模式的影响结合实际案例 AI 技术在不同类型档案管理中的应用进行详细分析为档案管理机构提供具有针对性的实践指导此外本研究还前瞻性地探讨了 AI 技术在档案管理中的未来发展趋势为行业的长远发展提供参考
## AI 赋能档案管理的技术基础
### 2.1 AI 技术概述
AI 技术是一门综合性的技术领域旨在让计算机系统模拟人类的智能行为实现对复杂问题的理解推理学习和决策它涵盖了多个子领域其中机器学习深度学习自然语言处理计算机视觉等技术在档案管理中具有重要的应用价值
机器学习是 AI 的核心技术之一它通过让计算机从大量的数据中学习模式和规律从而实现对未知数据的预测和决策机器学习主要分为监督学习无监督学习和强化学习监督学习使用标记好的数据进行训练模型通过学习数据中的特征和标签之间的关系来预测新数据的标签在档案分类中可以使用监督学习算法将已分类的档案作为训练数据让模型学习不同类别档案的特征从而对新的档案进行自动分类无监督学习则处理未标记的数据通过聚类降维等方法发现数据中的内在结构和模式在档案管理中无监督学习可以用于对档案进行主题建模发现档案中的潜在主题帮助用户更好地理解档案内容强化学习通过智能体与环境的交互根据环境反馈的奖励信号来学习最优策略在档案检索中强化学习可以根据用户的反馈不断优化检索策略提高检索结果的准确性
深度学习是机器学习的一个分支它基于深度神经网络通过构建多层神经元来自动学习数据的高级特征深度学习在图像识别语音识别自然语言处理等领域取得了显著的成果在档案管理中深度学习可以用于图像识别如对档案中的图像进行文字识别图像分类等也可以用于语音识别将档案中的语音内容转换为文本方便进行检索和管理
自然语言处理致力于让计算机理解和处理人类语言它包括文本分类情感分析机器翻译问答系统等多个任务在档案管理中自然语言处理可以用于对档案文本进行关键词提取摘要生成帮助用户快速了解档案内容还可以用于构建智能问答系统用户可以通过自然语言提问获取所需的档案信息
计算机视觉主要研究如何让计算机理解和解释图像和视频信息它包括图像识别目标检测图像分割等技术在档案管理中计算机视觉可以用于对档案图像进行数字化处理如去噪增强修复等提高图像的质量和可读性还可以用于对档案中的图像进行内容分析识别图像中的人物场景等信息为档案的分类和检索提供支持
这些 AI 技术在档案管理中具有很强的适用性档案管理涉及大量的数据处理和信息分析工作传统的人工方式效率低下且容易出错AI 技术的自动化和智能化特点可以有效地提高档案管理的效率和准确性通过机器学习和深度学习算法可以实现档案的自动分类检索和推荐大大节省了人力和时间成本自然语言处理和计算机视觉技术可以让计算机更好地理解和处理档案中的文本和图像信息为用户提供更加便捷和智能的服务
### 2.2 与档案管理相关的 AI 技术应用
#### 图像识别技术在档案数字化中的应用
图像识别技术在档案数字化过程中发挥着关键作用在纸质档案数字化时通过高精度扫描仪将纸质档案转化为数字图像后图像识别技术可对这些图像进行处理如在某大型企业的档案数字化项目中利用先进的卷积神经网络CNN算法能准确识别档案图像中的文字图表等元素该技术可自动去除图像中的噪声划痕校正图像的倾斜角度增强文字的清晰度极大提高了图像质量为后续的文字识别和信息提取奠定了良好基础通过图像识别技术实现自动边界检测与切割能准确识别文档的边缘截取文件中的文字区域过滤掉空白边缘或杂物避免误识别和多余信息干扰提高了识别效率和准确性在处理包含多个内容区域的文档如表格多栏文本等时算法还能准确识别并分别处理每个区域通过布局分析识别图像中的文本区域非文本区域以及文本的结构信息如列标题段落表格等有效提升了复杂档案图像的处理能力
#### 语音识别技术在档案检索中的应用
语音识别技术为档案检索带来了新的便利在一些档案管理系统中用户只需说出检索关键词系统就能快速定位到相关档案以某政府档案管理部门为例其引入了基于深度学习的语音识别技术该技术采用了循环神经网络RNN及其变体长短时记忆网络LSTM能够有效处理语音中的时序信息准确识别各种口音和语速的语音指令用户在检索档案时无需手动输入关键词直接通过语音提问系统即可将语音转换为文本并在档案数据库中进行检索迅速返回相关档案信息这一应用不仅提高了检索效率还降低了用户的操作门槛特别适用于不熟悉键盘输入或需要快速获取信息的用户提升了档案服务的便捷性和用户体验
#### 自然语言处理技术在档案内容分析中的应用
自然语言处理技术在档案内容分析方面具有重要价值它可以对档案文本进行深度挖掘和分析实现关键词提取主题建模情感分析等功能在某高校的科研档案管理中利用自然语言处理技术对科研成果档案进行关键词提取能够准确提炼出档案中的核心概念和关键信息方便用户快速了解档案内容通过主题建模可将大量的科研档案按照不同的研究主题进行分类和归纳帮助科研人员快速找到相关领域的研究资料自然语言处理技术还能对档案中的文本进行情感分析了解科研人员对特定研究方向或项目的态度和情感倾向为科研管理和决策提供有价值的参考
## AI 在档案管理中的应用场景与案例分析
### 3.1 档案资源建设
#### 3.1.1 智能采集与整理
在档案资源建设过程中智能采集与整理是重要的基础环节以某大型综合性档案馆为例该馆负责收集和整理大量的历史文献政府文件企业资料等各类档案随着信息时代的发展档案来源日益广泛包括各类网站数据库社交媒体等传统的人工采集和整理方式难以满足需求为此该档案馆引入了 AI 技术利用智能采集工具从网页爬取信息并结合自然语言处理和机器学习算法对采集到的信息进行自动分类和整理
通过配置专门的网络爬虫程序档案馆能够按照设定的规则自动从指定的网站和数据库中获取相关的档案信息在采集过程中利用自然语言处理技术对网页内容进行分析提取关键信息如文件标题发布时间作者主题等并自动生成元数据机器学习算法则用于对档案信息进行分类根据已有的分类标准和训练数据将新采集到的档案信息自动归类到相应的类别中如历史文献类政策法规类企业档案类等这一过程大大提高了档案采集的效率和准确性每天能够处理数千条信息相比传统人工采集方式效率提升了数倍同时通过自动分类和整理减少了人工分类的主观性和误差提高了档案资源的质量和可用性
#### 3.1.2 档案数字化处理
档案数字化是档案管理现代化的关键步骤AI 技术在这一过程中发挥了重要作用北京中烟创新科技有限公司推出的数字档案管理系统充分展示了 AI 在档案数字化处理中的应用该系统利用先进的 OCR光学字符识别技术能够高效准确地识别并转换纸质档案中的文字图像等信息为数字格式在处理大量纸质档案时OCR 技术可快速将纸质文件转化为可编辑的电子文本大大减少了人工录入成本提高了数字化转换效率
在对档案进行数字化处理后还需要对电子档案的 四性即真实性完整性可用性和安全性进行检测中烟创新数字档案管理系统通过数字签名访问记录等技术确保文件的真实性和可信度防止文件被篡改或伪造通过记录和管理文件的版本和修改历史确保文件的完整性和版本的追溯性通过提供随时随地的网络访问功能提高了档案信息的可用性和可访问性通过访问控制权限管理加密传输等安全机制保护档案信息不被未授权人员访问或泄露确保档案数据的安全性这些功能的实现离不开 AI 技术的支持如利用人工智能算法对数字签名进行验证通过机器学习模型对文件的完整性进行评估利用加密算法保障数据传输和存储的安全等通过 AI 技术的应用中烟创新数字档案管理系统实现了档案数字化处理的高效性准确性和安全性为企业的档案管理提供了有力支持
### 3.2 档案开放利用
#### 3.2.1 档案开放审核
档案开放审核是保障档案信息安全合理利用的重要环节某综合档案馆在档案开放审核工作中应用了海泰智能档案开放系统借助 AI 技术优化审核流程提升审核效率该系统利用自然语言处理的文本向量化文本分类关键信息提取文本摘要文本纠错等技术建立档案开放审核模型通过对大量已审核档案数据的学习和训练模型能够自动分析新档案的内容提取关键信息判断档案是否符合开放条件并给出开放审核建议
在实际应用中档案管理人员只需将待审核的档案录入系统系统即可快速进行分析处理对于一些内容较为简单明显符合开放条件的档案系统能够直接给出开放建议大大缩短了审核时间对于复杂的档案系统提供的分析结果和建议也能帮助档案鉴定人员更高效地开展审核工作据统计引入该系统后该档案馆的档案开放审核效率提升了 50% 以上有效加快了档案开放的进程使更多的档案资源能够及时为社会公众所用同时通过 AI 技术的辅助审核的准确性也得到了提高减少了因人工判断失误导致的档案开放不当问题
#### 3.2.2 档案智能检索
档案智能检索是提高档案利用效率的关键范德比尔特电视新闻档案馆在档案管理中充分利用 AI 技术实现了智能检索功能该档案馆自 1968 年以来致力于记录和保存美国国家电视网的新闻拥有海量的视频新闻档案随着档案数量的不断增加传统的检索方式难以满足用户快速准确获取信息的需求为此档案馆引入了自动语音识别ASR和命名实体识别NER AI 技术
首先利用 ASR 技术为新闻播报生成转录文本将视频中的语音内容转化为文字形成可检索的文本数据库接着通过 NER 技术从转录文本中提取命名实体如人名地名组织机构名等并自动生成新闻标题这些技术的应用使得用户可以通过输入自然语言关键词 2020 年美国总统大选相关新闻系统就能快速定位到相关的新闻档案大大提高了检索的准确性和效率与传统的基于关键词匹配的检索方式相比智能检索能够理解用户的语义需求提供更精准的检索结果满足了研究人员媒体工作者等不同用户对档案信息的多样化需求
#### 3.2.3 辅助档案编研
档案编研是对档案信息进行深度加工和开发利用的重要工作AI 技术在这一领域也发挥着重要作用海泰方圆在某军工企业的档案管理应用中利用自然语言处理技术服务于档案编研工作在编研素材的收集阶段自然语言处理技术通过智能检索引擎能够迅速准确地定位到与编研主题高度相关的档案极大提高检索的效率和准确性例如当编研人员确定了 某型号武器装备研发历程 的编研主题后系统能够根据主题关键词在海量的档案库中快速筛选出相关的研发报告试验记录技术文档等档案资料
通过文本挖掘技术海泰方圆深入挖掘档案中隐含信息揭示档案之间的内在联系和规律通过对档案内容的语义分析发现不同档案之间的关联如人物关系事件关联等为编研人员提供更全面的信息视角利用知识图谱技术构建档案知识网络将档案中的各种信息以图形化的方式展示出来使编研人员能够直观地了解档案之间的关联性和层次性为编写高质量的编研成果提供有力支持通过 AI 技术的应用该军工企业的档案编研工作效率得到了显著提升编研成果的质量和深度也得到了提高为企业的技术研发经验总结和历史传承提供了重要的参考依据
### 3.3 档案安全管理
#### 3.3.1 库房安全管理
档案库房的安全管理是档案管理工作的重要保障江苏省太仓市智慧档案馆将 AI 技术应用于库房安全管理实现了对库房环境的实时监控和智能安防该档案馆利用物联网技术在库房内布置了大量的传感器如温湿度传感器烟雾传感器门禁传感器等实时采集库房的环境数据和设备状态信息AI 智能管理系统对这些感知数据进行分析处理根据预设的规则和阈值判断库房环境是否正常设备是否运行良好
当库房内的温湿度超出适宜范围时系统会自动发出警报并联动空调除湿机等设备进行调节确保档案保存环境的稳定在安防方面利用人脸识别视频监控等 AI 技术对进入库房的人员进行身份识别和行为监测只有通过授权的人员才能进入库房并且系统会实时记录人员的进出时间行为轨迹等信息一旦发现异常行为如非法闯入长时间逗留等系统会立即触发警报并通知安保人员进行处理通过这些 AI 技术的应用太仓市智慧档案馆实现了库房安全管理的智能化自动化有效提高了档案库房的安全性保障了档案实体的安全
#### 3.3.2 数据安全与隐私保护
在数字化时代档案数据的安全与隐私保护至关重要AI 技术在数据加密访问控制等方面的应用为档案数据安全提供了有力保障在数据加密方面利用 AI 算法生成高强度的加密密钥对档案数据进行加密存储和传输通过机器学习算法不断优化加密策略提高加密的安全性和效率防止数据被窃取或篡改在访问控制方面AI 技术可以根据用户的身份权限和行为模式实现智能的访问控制通过对用户行为数据的分析建立用户行为模型实时监测用户的访问行为当发现异常访问行为如频繁尝试登录大量下载敏感数据等系统会自动进行拦截并要求用户进行身份验证确保只有授权用户能够访问相应的档案数据
AI 技术还可以用于检测和防范网络攻击通过对网络流量的实时监测和分析利用机器学习算法识别潜在的攻击行为 DDoS 攻击SQL 注入攻击等并及时采取防护措施保障档案管理系统的网络安全在隐私保护方面AI 技术可以对档案中的敏感信息进行自动识别和脱敏处理如个人身份证号银行卡号医疗记录等在保护用户隐私的同时确保档案数据的可用性通过这些 AI 技术的综合应用有效地保障了档案数据的安全和用户的隐私为档案管理的数字化转型提供了安全可靠的环境
## AI 赋能档案管理的优势与挑战
### 4.1 优势分析
#### 4.1.1 提高管理效率
AI 技术在档案管理的多个环节显著提高了管理效率在档案分类环节传统的人工分类方式需要档案管理人员逐份阅读档案内容依据经验和既定规则进行分类这一过程耗时费力且容易因人为因素导致分类不准确以某大型企业的档案管理为例该企业每年产生的各类档案数量多达数十万份包括合同档案财务档案人事档案等在引入 AI 分类系统之前档案管理人员需要花费大量时间进行分类工作且分类错误率较高这给后续的档案检索和利用带来了很大困难引入基于机器学习算法的 AI 分类系统后该系统通过对大量已分类档案数据的学习能够自动识别档案的关键信息和特征快速准确地将新的档案归入相应类别经过实际应用档案分类的效率提高了数倍错误率也大幅降低从原来的 10% 左右降低到了 2% 以内
在档案检索方面AI 技术同样展现出巨大优势传统的检索方式主要依赖关键词匹配当用户输入关键词时系统在档案库中进行简单的文本匹配这种方式往往无法准确理解用户的真实需求导致检索结果不准确不全面某高校的图书馆档案管理系统在采用 AI 智能检索技术之前学生和教师在检索相关资料时常常因为检索结果不理想而浪费大量时间引入 AI 智能检索系统后该系统利用自然语言处理技术能够理解用户输入的自然语言问题分析其语义和语境从而在海量的档案中精准定位到用户所需信息同时通过建立知识图谱系统可以挖掘档案之间的关联关系为用户提供更全面更相关的检索结果据统计采用 AI 智能检索技术后检索效率提高了 50% 以上用户对检索结果的满意度也从原来的 60% 提升到了 85% 以上
在档案审核环节AI 技术的应用也大大节省了人力和时间如北京神舟航天软件技术股份有限公司申请的文书档案开放审核专利技术通过获取待审核文书档案利用机器学习和自然语言处理等技术识别个性化信息并运用审查准则自动判断文书档案是否开放在某政府部门的档案审核工作中引入该技术后原本需要人工花费数周时间才能完成的大量文书档案审核工作现在通过自动化系统仅需几天甚至几小时就能完成审核效率大幅提升同时减少了人工判断的误判率提高了审核的准确性
#### 4.1.2 提升服务质量
AI 技术能够实现精准检索和个性化服务从而有效提升档案服务质量满足用户多元化需求在精准检索方面AI 技术通过自然语言处理和深度学习算法能够理解用户的复杂查询意图提供更准确的检索结果以范德比尔特电视新闻档案馆为例该馆利用自动语音识别ASR和命名实体识别NER技术为新闻播报生成转录文本并提取命名实体用户可以通过输入自然语言关键词 2020 年美国总统大选相关新闻系统就能快速准确地定位到相关新闻档案大大提高了检索的精准度与传统的基于关键词匹配的检索方式相比AI 精准检索能够理解语义避免了因关键词匹配不准确而导致的漏检和误检问题为用户节省了大量时间和精力
在个性化服务方面AI 技术可以根据用户的历史检索记录浏览行为等数据分析用户的兴趣偏好和需求特点为用户提供个性化的档案推荐服务某企业的档案管理系统通过 AI 技术对用户的使用数据进行分析当用户登录系统时系统会根据用户的个性化需求主动推荐相关的档案资源如行业报告市场分析资料等这种个性化推荐服务不仅提高了用户获取所需信息的效率还能帮助用户发现潜在的有价值信息提升了用户对档案服务的满意度同时AI 技术还可以根据不同用户的身份和权限提供差异化的服务如为企业高管提供更高级别的决策支持信息为普通员工提供与工作相关的基础档案资料满足了不同用户的多元化需求
#### 4.1.3 挖掘数据价值
AI 技术通过强大的数据分析能力能够深入挖掘档案中的潜在价值为决策提供有力支持通过对档案数据的分析AI 可以发现数据之间的关联和规律揭示出隐藏在档案中的信息某城市的规划部门对历年的城市建设档案进行分析利用 AI 技术挖掘出城市发展过程中不同区域的功能演变人口流动趋势以及基础设施建设需求等信息通过对这些信息的分析规划部门可以更好地制定城市未来的发展规划合理布局基础设施优化城市功能分区为城市的可持续发展提供决策依据
在企业领域AI 技术对档案数据的分析也具有重要价值某企业通过对历年销售档案客户档案和市场档案的分析利用 AI 技术预测市场趋势客户需求和产品销售情况通过对销售数据的时间序列分析和市场趋势预测企业可以提前调整生产计划优化产品库存合理安排资源提高企业的运营效率和市场竞争力AI 还可以对客户档案进行分析了解客户的购买行为和偏好为企业的市场营销策略提供数据支持实现精准营销提高客户满意度和忠诚度
在科研领域AI 技术对档案数据的挖掘也为科研工作提供了新的思路和方法某科研机构对大量的科研文献档案进行分析利用 AI 技术发现不同研究领域之间的潜在联系和交叉点为科研人员提供新的研究方向和创新点通过对科研文献的主题建模和知识图谱构建AI 可以帮助科研人员快速了解相关领域的研究现状和发展趋势避免重复研究提高科研效率
### 4.2 挑战分析
#### 4.2.1 数据质量问题
档案数据来源多样包括纸质档案数字化电子文档数据库导入网络采集等这导致数据格式不统一如文本文件有.doc.txt.pdf 等多种格式图像文件有.jpg.png.tif 等格式不同格式的数据在处理和分析时需要不同的技术和工具增加了数据处理的复杂性档案数据还存在质量参差不齐的问题如纸质档案数字化过程中可能出现文字模糊图像变形信息缺失等情况电子文档可能存在数据错误格式混乱元数据不完整等问题这些问题会影响 AI 算法的训练和模型的准确性导致分类错误检索结果不准确等问题
为解决这些问题需要建立完善的数据质量管理机制在数据采集阶段制定严格的数据采集标准和规范确保采集的数据准确完整格式统一在数据预处理阶段采用数据清洗去噪修复等技术对数据进行标准化处理去除错误数据和噪声数据补充缺失数据提高数据质量利用数据质量评估工具定期对档案数据进行质量评估及时发现和解决数据质量问题通过建立数据质量管理体系从数据的产生采集存储处理到应用的全过程进行监控和管理确保数据的质量和可靠性 AI 技术在档案管理中的应用提供坚实的数据基础
#### 4.2.2 技术适应性与安全性
档案信息种类繁多包括文本图像音频视频等多种类型每种类型的信息都有其独特的结构和特征这对 AI 技术的适应性提出了很高的要求不同类型的档案数据需要不同的 AI 算法和模型进行处理如文本数据需要自然语言处理技术图像数据需要计算机视觉技术音频数据需要语音识别技术等如何针对不同类型的档案数据选择合适的 AI 技术并将这些技术有效地集成到档案管理系统中是一个需要解决的问题
档案信息包含大量的敏感信息如个人隐私商业机密国家秘密等保障档案信息的安全和隐私至关重要AI 技术在处理和存储档案信息时可能面临数据泄露篡改非法访问等安全风险在数据传输过程中可能被黑客截获和篡改在数据存储过程中可能因系统漏洞被非法访问为保障档案信息安全需要采用多种安全技术如数据加密技术对档案数据进行加密存储和传输防止数据被窃取和篡改访问控制技术根据用户的身份和权限对档案信息的访问进行严格控制确保只有授权用户能够访问相应的档案信息安全监测技术实时监测档案管理系统的运行状态及时发现和防范安全威胁还需要建立健全安全管理制度加强对档案管理人员和用户的安全培训提高安全意识确保档案信息的安全和隐私
#### 4.2.3 伦理与法律法规问题
AI 应用中数据使用的合法性和合规性是一个重要问题档案数据的收集存储处理和共享需要遵循相关的法律法规如个人信息保护法数据安全法等在收集和使用用户的个人档案数据时需要获得用户的明确授权确保数据使用的目的合法正当防止数据滥用和泄露AI 算法可能存在偏见这是由于训练数据的偏差或算法设计的缺陷导致的在档案分类和检索中如果算法存在偏见可能会导致某些类型的档案被错误分类或检索不到影响档案管理的公平性和准确性算法的透明度和可解释性也是一个伦理问题由于 AI 算法的复杂性其决策过程往往难以理解这使得用户难以信任算法的结果在涉及重要决策时如档案开放审核机密档案处理等算法的不可解释性可能会引发伦理争议
为应对这些伦理和法律法规问题需要加强法律法规建设制定专门针对 AI 在档案管理中应用的法律法规明确数据使用算法开发和应用等方面的规则和责任建立伦理审查机制 AI 系统的设计开发和应用进行伦理审查确保 AI 技术的应用符合伦理道德标准提高 AI 算法的透明度和可解释性通过技术手段和可视化方法让用户能够理解算法的决策过程和依据增强用户对 AI 系统的信任加强对 AI 技术应用的监管建立监管机构 AI 在档案管理中的应用进行监督和管理确保其合法合规符合伦理要求
#### 4.2.4 人才短缺问题
AI 时代对档案管理人员的技能提出了新的挑战传统的档案管理人员主要具备档案管理的专业知识和技能如档案整理分类保管等而在 AI 赋能的档案管理环境下档案管理人员需要掌握 AI 技术相关的知识和技能如机器学习自然语言处理数据分析等以便能够有效地运用 AI 技术进行档案管理工作他们还需要具备一定的信息技术素养能够熟练使用档案管理系统和相关软件工具目前具备这些综合技能的档案管理人才相对短缺这限制了 AI 技术在档案管理中的广泛应用和深入发展
为解决人才短缺问题需要加强人才培养在高校教育中优化档案管理相关专业的课程设置增加 AI 技术信息技术等相关课程培养具备跨学科知识和技能的专业人才开展在职培训针对现有的档案管理人员提供定期的 AI 技术培训和继续教育课程帮助他们更新知识结构提升技能水平鼓励档案管理机构与科研机构高校等合作建立人才培养基地共同培养适应 AI 时代需求的档案管理人才还可以通过引进外部人才吸引具有 AI 技术背景和经验的专业人才加入档案管理队伍提高档案管理团队的整体素质和能力
## 应对策略与未来发展趋势
### 5.1 应对策略
#### 5.1.1 数据质量管理
建立完善的数据质量管理机制是确保档案数据质量和一致性的关键在数据采集环节制定严格的数据采集标准和规范明确数据的来源格式内容要求等确保采集到的数据准确完整格式统一对于纸质档案数字化要保证扫描图像的清晰度完整性对图像进行预处理去除噪声倾斜校正等确保后续的文字识别和信息提取准确无误在数据录入过程中采用数据校验和审核机制对录入的数据进行实时校验及时发现和纠正错误数据
在数据存储和管理方面建立数据仓库和数据湖对档案数据进行集中存储和管理确保数据的一致性和可访问性利用数据清洗和去重技术定期对档案数据进行清洗去除重复数据错误数据和无效数据提高数据的质量建立数据质量评估体系制定数据质量指标和评估方法定期对档案数据进行质量评估及时发现和解决数据质量问题通过数据质量评估对数据的准确性完整性一致性时效性等方面进行量化评估为数据质量管理提供数据支持
#### 5.1.2 技术研发与应用
鼓励加大对适应档案管理的 AI 技术的研发投入推动技术创新针对档案数据的特点研发专门的 AI 算法和模型提高 AI 技术在档案管理中的适应性和准确性研发针对档案图像识别的深度学习模型提高对档案图像中文字图表等元素的识别准确率研发适合档案文本分析的自然语言处理模型增强对档案文本的理解和分析能力加强与高校科研机构的合作共同开展 AI 技术在档案管理中的应用研究促进技术成果的转化和应用
在技术应用方面加强 AI 技术与档案管理系统的集成实现 AI 技术在档案管理全流程的应用在档案采集环节利用 AI 技术实现自动化采集和分类在档案整理环节借助 AI 技术进行智能分类和编目在档案检索环节运用 AI 技术提供智能检索和推荐服务不断优化 AI 技术在档案管理中的应用效果根据实际应用情况 AI 模型和算法进行调整和优化提高档案管理的效率和质量
#### 5.1.3 人才培养与团队建设
加强档案人员的 AI 技术培训是提升档案管理水平的重要举措定期组织档案人员参加 AI 技术培训课程邀请专家学者进行授课系统学习机器学习自然语言处理数据分析等 AI 技术知识了解 AI 技术在档案管理中的应用案例和实践经验鼓励档案人员参加相关的学术交流活动和研讨会拓宽视野掌握最新的技术动态和发展趋势
通过培训使档案人员具备运用 AI 技术进行档案管理的能力能够熟练操作档案管理系统中的 AI 功能模块如智能检索自动分类等培养档案人员的数据思维和创新意识让他们能够充分利用 AI 技术挖掘档案数据的价值为档案管理工作提供创新思路和方法除了技术培训还应注重培养档案人员的综合素质包括沟通能力团队协作能力问题解决能力等提高档案管理团队的整体战斗力
引进具有 AI 技术背景的专业人才充实档案管理团队优化团队的知识结构和技能水平建立人才激励机制为人才提供良好的发展空间和待遇吸引和留住优秀人才通过人才的引进和培养打造一支既懂档案管理又懂 AI 技术的复合型人才队伍 AI 赋能档案管理提供人才保障
#### 5.1.4 伦理与法律规范
制定相关的伦理准则和法律法规是规范 AI 在档案管理中应用的重要保障明确 AI 在档案管理中的数据使用规则确保数据的收集存储处理和共享符合法律法规和伦理道德要求在收集用户个人档案数据时必须获得用户的明确授权遵循最小必要原则仅收集与档案管理相关的必要数据保护用户的隐私和个人信息安全
建立 AI 算法的审查机制对用于档案管理的 AI 算法进行伦理审查确保算法的公正性和透明度审查算法是否存在偏见是否会对特定群体造成不公平的影响对于可能影响档案管理决策的 AI 算法要求算法开发者提供详细的算法说明和解释提高算法的可解释性增强用户对算法结果的信任加强对 AI 技术应用的监管建立专门的监管机构制定监管标准和流程 AI 在档案管理中的应用进行监督和管理确保其合法合规符合伦理要求对违反伦理准则和法律法规的行为要依法进行惩处维护档案管理的良好秩序
### 5.2 未来发展趋势
#### 5.2.1 AI 技术与档案管理的深度融合
未来AI 技术将在档案管理的全流程实现更深入的融合和应用在档案资源建设方面AI 技术将实现更智能化的采集和整理通过智能传感器和网络爬虫技术能够自动从各种数据源采集档案信息包括网页社交媒体数据库等实现档案信息的全面收集利用更先进的机器学习算法对采集到的信息进行自动分类标引和编目提高档案资源建设的效率和准确性在档案数字化处理中AI 技术将进一步提升数字化的质量和速度通过深度学习算法实现对档案图像和文字的更精准识别和转换提高数字化的准确率利用 AI 技术对数字化后的档案进行智能修复和优化恢复受损档案的内容提高档案的可读性和可用性
在档案开放利用方面AI 技术将为用户提供更个性化智能化的服务通过对用户行为数据的分析和挖掘AI 能够深入了解用户的需求和兴趣偏好为用户提供定制化的档案推荐服务当用户搜索档案时AI 不仅能够根据关键词提供相关档案还能根据用户的历史搜索记录和行为模式推荐更符合用户需求的档案资源AI 技术还将实现更智能的档案编研通过自然语言处理和知识图谱技术能够对档案内容进行深度分析和挖掘发现档案之间的关联和潜在知识为档案编研人员提供更丰富的素材和思路提高编研成果的质量和深度
在档案安全管理方面AI 技术将发挥更重要的作用利用 AI 技术实现对档案库房环境的实时监测和智能调控确保档案保存环境的稳定和安全通过对库房内温湿度空气质量光照等环境参数的实时监测AI 系统能够自动调整空调除湿机通风设备等保持适宜的保存环境在档案数据安全方面AI 技术将提供更强大的防护能力通过机器学习算法能够实时监测档案数据的访问和传输情况及时发现和防范数据泄露篡改等安全威胁利用 AI 技术对档案数据进行加密和备份确保数据的安全性和完整性
#### 5.2.2 智能化与自动化的发展方向
随着 AI 技术的不断发展档案管理将朝着更加智能化和自动化的方向发展AI 将实现档案管理的自动化决策通过对大量档案数据的分析和学习AI 系统能够自动判断档案的价值重要性和保存期限为档案管理决策提供依据在档案鉴定环节AI 可以根据预设的标准和模型自动评估档案的保存价值决定哪些档案需要永久保存哪些可以定期销毁减少人工鉴定的主观性和工作量
AI 还将实现档案管理的自主服务通过智能客服和聊天机器人技术用户可以与档案管理系统进行自然语言交互获取所需的档案信息和服务用户只需通过语音或文字提问系统就能自动理解用户的需求提供准确的答案和相关档案资源档案管理系统还能根据用户的需求自动生成档案报告统计分析等为用户提供更便捷高效的服务未来档案管理将实现无人化管理通过自动化设备和 AI 技术实现档案的自动上架下架盘点等操作减少人工干预提高管理效率和准确性利用机器人技术实现档案库房的自动巡逻和安全检查及时发现和处理安全隐患
#### 5.2.3 跨领域合作与创新
档案管理将与其他领域展开更广泛的合作与创新推动 AI 技术的应用和发展与大数据云计算等技术领域的合作将更加紧密通过与大数据技术的结合能够对海量的档案数据进行更深入的分析和挖掘发现数据背后的潜在价值和规律为档案管理决策提供更有力的数据支持借助云计算技术实现档案数据的分布式存储和计算提高数据处理的效率和可靠性降低档案管理的成本
与文化教育科研等领域的合作也将不断加强在文化领域与博物馆图书馆等文化机构合作整合档案资源和文化资源打造综合性的文化信息服务平台为公众提供更丰富的文化体验在教育领域与学校合作将档案资源作为教学素材开展档案教育和研究培养学生的历史文化素养和信息素养在科研领域与科研机构合作利用档案数据开展学术研究为科研工作提供数据支持和历史借鉴通过跨领域合作能够拓展档案管理的应用场景和服务范围推动档案管理的创新发展为社会提供更优质的档案信息服务
## 结论与展望
### 6.1 研究总结
本研究深入探讨了 AI 赋能档案管理的相关内容AI 技术包括机器学习深度学习自然语言处理和计算机视觉等为档案管理提供了强大的技术支持使其在多个方面实现了创新和变革
在应用场景方面AI 在档案资源建设中实现了智能采集与整理以及高效的档案数字化处理在档案开放利用中助力档案开放审核提供智能检索服务并辅助档案编研工作在档案安全管理中实现了库房安全的智能监控和数据安全与隐私的有效保护通过多个实际案例分析如范德比尔特电视新闻档案馆利用 AI 实现智能检索海泰方圆在档案编研中应用自然语言处理技术等充分展示了 AI 在档案管理各环节的应用效果和价值
AI 赋能档案管理具有显著优势它极大地提高了管理效率在档案分类检索和审核等工作中节省了大量的人力和时间成本提高了工作的准确性通过精准检索和个性化服务提升了档案服务质量满足了用户的多元化需求AI 技术还能够深入挖掘档案数据的价值为决策提供有力支持在城市规划企业运营和科研等领域发挥了重要作用
AI 在档案管理中的应用也面临诸多挑战数据质量问题如数据格式不统一质量参差不齐影响了 AI 算法的训练和模型的准确性技术适应性与安全性方面不同类型档案数据对 AI 技术的适应性要求高同时保障档案信息安全和隐私至关重要伦理与法律法规问题包括数据使用的合法性算法偏见以及算法的透明度和可解释性等人才短缺问题传统档案管理人员难以满足 AI 时代对综合技能的要求针对这些挑战本研究提出了相应的应对策略包括建立完善的数据质量管理机制加大技术研发与应用力度加强人才培养与团队建设以及制定伦理与法律规范等
### 6.2 未来展望
未来AI 在档案管理领域将展现出更广阔的发展前景AI 技术与档案管理的融合将更加深入贯穿档案管理的全流程在档案资源建设中实现更智能化的采集和整理提升数字化处理的质量和速度在档案开放利用中提供更个性化智能化的服务实现更智能的档案编研在档案安全管理中发挥更重要的作用保障档案实体和数据的安全
档案管理将朝着智能化与自动化的方向加速发展AI 将实现档案管理的自动化决策如自动判断档案的价值重要性和保存期限实现档案管理的自主服务通过智能客服和聊天机器人为用户提供便捷的服务甚至实现无人化管理借助自动化设备和机器人完成档案的日常管理工作
跨领域合作与创新将成为档案管理发展的重要趋势与大数据云计算等技术领域的紧密合作将为档案管理提供更强大的数据处理和分析能力与文化教育科研等领域的合作将拓展档案管理的应用场景和服务范围推动档案管理的创新发展为社会提供更优质的档案信息服务为了充分发挥 AI 在档案管理中的优势我们需要持续关注技术发展动态积极应对各种挑战不断探索和创新推动档案管理行业向更高水平迈进`
// const params = {
// 'researchOnlineId': row.id
// }
// FetchInitResearchOnlineDetails(params).then((res) => {
// console.log(res)
// this.onlineContent = res
// }).catch(err => {
// console.log(err)
// })
},
handleCloseDialog(done) {
this.lendDetail = false
this.onlineEditDetail = false
},
// changeMy(val) {
// if (val) {
// this.crud.query.participants = this.user.username
// } else {
// this.crud.query.participants = ''
// }
// this.crud.toQuery()
// },
changeOnlineTab(data) {
this.onlineTabIndex = data
if (this.onlineTabIndex === 1) {
// const paramsFile = {
// 'researchOnlineId': this.currentResearchOnline.id,
// 'page': 0,
// 'size': 10
// }
// console.log('paramsFile', paramsFile)
// FetchInitResearchOnlineFileList(paramsFile).then((res) => {
// console.log(res)
// this.detailArcData = res.content
// }).catch(err => {
// console.log(err)
// })
this.detailArcData = [
{
'id': '4028e3c38d67ac83018d680836c2000f',
'onlineId': '4028e3c38d67ac83018d6807660b000d',
'fileName': 'AI赋能档案管理的研究与展望.docx',
'fileType': 'docx',
'fileSize': 147535,
'filePath': '/researchOnlineFile/4028e3c38d67ac83018d680560230004/4028e3c38d67ac83018d6807660b000d/d2d41cf5-9b2d-4f2f-bc1b-f00e7c1a3962.zip',
'create_by': 'admin',
'update_by': 'admin',
'create_time': 1706847385000,
'update_time': 1706847385000
},
{
'id': '4028e3c38d67ac83018d680817fa000e',
'onlineId': '4028e3c38d67ac83018d6807660b000d',
'fileName': 'AI赋能档案管理的研究与展望.pdf',
'fileType': 'pdf',
'fileSize': 176996,
'filePath': '/researchOnlineFile/4028e3c38d67ac83018d680560230004/4028e3c38d67ac83018d6807660b000d/3e308a02-a7e9-4e45-97b3-cb659c994221.zip',
'create_by': 'admin',
'update_by': 'admin',
'create_time': 1706847377000,
'update_time': 1706847377000
}
]
}
},
getFileSize(fileSize) {
const fileSizeInKB = (fileSize / 1024).toFixed(2) + 'kB'
const fileSizeInB = fileSize + 'B'
return (fileSize / 1024) <= 0.01 ? fileSizeInB : fileSizeInKB
}
}
}
</script>
<style lang="scss" scoped>
</style>

11
src/views/AIAssistant/AIIntelligentCoding/str.json

@ -0,0 +1,11 @@
{
"id": "4028e3c38d6928f8018d71e75a990007",
"researchId": "4028e3c38d6928f8018d71dfe3680000",
"title": "目标识别-模型选择",
"context": "",
"status": 1,
"create_by": "admin",
"update_by": "eason",
"create_time": 1707013004000,
"update_time": 1739679967000
}

629
src/views/AIAssistant/AIKeywords/index.vue

@ -0,0 +1,629 @@
<template>
<div class="app-container category-container" style="height: calc(100vh - 140px);">
<!-- 门类列表 -->
<div class="container-main">
<div class="elect-cont-left">
<div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<!--门类树状结构-->
<div class="tree-scroll">
<el-scrollbar style="height: calc(100vh - 230px);">
<el-tree ref="categroyTree" v-loading="crud.loading" class="arc-tree arc-tree-01" :data="crud.data" :props="defaultProps" node-key="id" :expand-on-click-node="false" highlight-current @node-click="handleNodeClick">
<span slot-scope="{ node, data }" class="custom-tree-node">
<el-tooltip :content="node.label" placement="left" :enterable="false" effect="dark">
<span v-if="data.isType === 0">
{{ data.label }}
</span>
<span v-if="data.isType === 1" class="iconFolder tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 2" class="iconArch tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 3" class="iconFile tree-text">
{{ data.label }}
</span>
</el-tooltip>
</span>
</el-tree>
</el-scrollbar>
</div>
</div>
</div>
<div class="elect-cont-right">
<div v-if="selectedCategory.isType === 2" class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<div class="ai-file-pickUp">
<div class="ai-file-all">
<div class="des-title">
<p>原文列表</p>
</div>
<el-table
ref="table"
:data="tableData"
style="min-width: 100%"
class="archives-table"
height="calc(100vh - 220px)"
@row-click="clickRowHandler"
>
<el-table-column type="selection" align="center" width="55" />
<!-- <el-table-column type="index" label="序号" width="55" align="center" /> -->
<el-table-column prop="file_name" label="文件名称" show-overflow-tooltip min-width="120" />
<el-table-column prop="file_type" label="格式" min-width="60" align="center">
<template slot-scope="scope">
<div v-if="scope.row.file_type === 'jpg' || scope.row.file_type === 'jpeg' || scope.row.file_type === 'png' || scope.row.file_type === 'bmp'|| scope.row.file_type === 'gif'">
<i class="fileIcon icon-image" />
</div>
<div v-else-if="scope.row.file_type === 'xlsx' || scope.row.file_type === 'xls'">
<i class="fileIcon icon-excel" />
</div>
<div v-else-if="scope.row.file_type === 'docx' || scope.row.file_type === 'doc'">
<i class="fileIcon icon-word" />
</div>
<div v-else-if="scope.row.file_type === 'pdf'">
<i class="fileIcon icon-pdf" />
</div>
<div v-else-if="scope.row.file_type === 'ppt' || scope.row.file_type === 'pptx'">
<i class="fileIcon icon-ppt" />
</div>
<div v-else-if="scope.row.file_type === 'zip' || scope.row.file_type === 'rar'">
<i class="fileIcon icon-zip" />
</div>
<div v-else-if="scope.row.file_type === 'txt'">
<i class="fileIcon icon-txt" />
</div>
<div v-else>
<i class="fileIcon icon-other" />
</div>
</template>
</el-table-column>
<el-table-column prop="file_status" label="是否标注" width="100" align="center">
<template slot-scope="scope">
<span v-if="scope.row.file_status === 0" class="row-state row-physical ">未标注</span>
<span v-else class="row-state row-binding state-active">已标注</span>
</template>
</el-table-column>
<el-table-column prop="file_status" label="操作" align="center" width="80">
<template slot-scope="scope">
<div class="handle-btn">
<el-button class="iconfont icon-huoqu" @click.stop="handlePickUp(scope.row)" />
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="pickUp-right">
<div class="pickUp-right-item">
<div class="des-title">
<p>已标注关键词</p>
</div>
<div v-if="currentRow && currentRow.file_status===1" style="height: calc(100% - 70px); overflow-y: auto;">
<div v-for="(item, index) in keywords" :key="index" class="keywords-list">
<div class="keywords-item">
<div v-if="isEditing[index]" class="keywords-input">
<el-input v-model="keywords[index]" style="width: 320px;" @blur="handleBlur(index)" />
</div>
<div v-else class="keywords-text">
<!-- <p>{{ item }}</p> -->
<el-tooltip class="item" effect="dark" :content="item" :enterable="false" placement="top">
<p>{{ item }}</p>
</el-tooltip>
</div>
</div>
<div class="keywords-handle">
<i class="iconfont icon-shanchu" @click="handleDelete(index)" />
<i class="iconfont icon-bianji" @click="handleEdit(index)" />
</div>
</div>
</div>
<el-empty v-else description="暂无标注的数据" />
</div>
<div :key="reloadKey" class="pickUp-Ai">
<div class="des-title">
<p>AI关键词标注</p>
<el-button @click="batchAiText">批量标注</el-button>
</div>
<div v-if="isPickUp " v-loading="aiLoadingPick" style="height: calc(100% - 70px); overflow-y: auto;">
<div v-for="(item, index) in aiPickData" :key="index" class="keywords-list">
<div class="keywords-item ai-item-text">
<el-checkbox v-model="selectedItems[index]" @change="handleCheckboxChange(index)" />
<div class="keywords-text">
<el-tooltip class="item" effect="dark" :content="item" :enterable="false" placement="top">
<p>{{ item }}</p>
</el-tooltip>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import crudCategory from '@/api/system/category/category'
import CRUD, { presenter, header } from '@crud/crud'
const data = [
{
'file_path': '/category//09A6ECD967BCC772DABB2F.txt',
'sequence': '',
'create_time': '2024-02-05 11:43:26',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000201.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '09A6ECD967BCC772DABB2F',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 1
},
{
'file_path': '/category//0EFEF1CB577453482ADE5F.txt',
'sequence': '',
'create_time': '2024-02-05 11:43:26',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000202.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '0EFEF1CB577453482ADE5F',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category/AE8B188F0C0314F9BE31B8/82FBCAE96CBC9F50809838/eb824e27-13eb-4f33-adc8-39ca5926d244.txt',
'sequence': '',
'create_time': '2024-3-20 16:16:32',
'file_name': '123.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': '',
'id': '3D49BD844334621851DF24',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 37679,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category/AE8B188F0C0314F9BE31B8/82FBCAE96CBC9F50809838/4B457990A874D55714FF8C.pdf',
'sequence': '',
'create_time': '2024-3-20 11:36:24',
'file_name': 'DAT 48-2009 基于XML的电子文件封装规范.pdf',
'file_type': 'pdf',
'document_file_id': '',
'file_dpi': '',
'id': '4B457990A874D55714FF8C',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 92308284,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category//6867E751998B41C3B89FA3.txt',
'sequence': '',
'create_time': '2024-01-25 10:26:44',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000201.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '6867E751998B41C3B89FA3',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category//694FD852367CD7465F7142.txt',
'sequence': '',
'create_time': '2024-02-05 13:21:39',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000202.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '694FD852367CD7465F7142',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category//6E39B6C1428217A5AAA835.txt',
'sequence': '',
'create_time': '2024-02-05 11:52:33',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000201.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '6E39B6C1428217A5AAA835',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category//761753E47A37F7F1C141BB.txt',
'sequence': '',
'create_time': '2024-01-25 10:25:25',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000202.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '761753E47A37F7F1C141BB',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 1
},
{
'file_path': '/category/AE8B188F0C0314F9BE31B8/82FBCAE96CBC9F50809838/95ec71e9-4745-4210-ba28-77c71b95bf06.ofd',
'sequence': '',
'create_time': '2024-3-20 14:20:57',
'file_name': '999.ofd',
'file_type': 'ofd',
'document_file_id': '',
'file_dpi': '',
'id': '7F846C5F6E3D5E50950384',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 29752,
'file_thumbnail': '',
'file_status': 0
},
{
'file_path': '/category//831817367E0C3D2E739787.txt',
'sequence': '',
'create_time': '2024-01-25 10:25:25',
'file_name': 'A002-WSWJ·XZGL·2024·Y-000201.txt',
'file_type': 'txt',
'document_file_id': '',
'file_dpi': 'null',
'id': '831817367E0C3D2E739787',
'archive_id': '0FBCB1FCB6341BFF9709B6',
'document_id': '',
'file_size': 0,
'file_thumbnail': '',
'file_status': 1
}
]
export default {
name: 'AIKeywords',
components: { },
cruds() {
return [
CRUD({
title: 'AI关键词提取', url: 'api/category/fondMenu',
crudMethod: { ...crudCategory },
optShow: {
add: false,
edit: false,
del: false,
download: false,
group: false
}
})
]
},
mixins: [presenter(), header()],
data() {
return {
defaultProps: {
children: 'children',
label: 'label'
},
selectedCategory: {},
tableData: data,
selections: [],
keywords: [],
isEditing: [],
aiPickData: [],
isPickUp: false,
reloadKey: 0,
aiLoadingPick: false,
currentRow: {},
selectedItems: []
}
},
computed: {
},
created() {
this.isEditing = this.keywords.map(() => false)
},
mounted() {
},
methods: {
//
handleEdit(index) {
this.$set(this.isEditing, index, true)
},
//
handleBlur(index) {
this.$set(this.isEditing, index, false)
},
//
handleDelete(index) {
// keywords
this.keywords.splice(index, 1)
// isEditing
this.isEditing.splice(index, 1)
},
filterData(data) {
return data.filter(node => {
if (node.children && node.children.length > 0) {
node.children = this.filterData(node.children) //
}
return node.isType !== 3 // isType3
})
},
//
findNode(tree, func) {
for (const node of tree) {
if (func(node)) return node
if (node.children) {
const res = this.findNode(node.children, func)
if (res) return res
}
}
return null
},
//
expandAllChildren(node, targetElement) {
node.expanded = true
//
if (node.childNodes && node.childNodes.length > 0) {
for (let i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].data.id === targetElement.id) {
this.$refs.categroyTree.setCurrentKey(node.childNodes[i])
}
this.expandAllChildren(node.childNodes[i], targetElement)
}
}
},
// el-tree
transformData(rawData) {
return rawData.map(item => {
return {
label: item.fondName,
isType: 0,
id: item.fondsId,
fondsNo: item.fondsNo,
children: item.categoryList.map(category => {
return {
label: category.cnName,
id: category.id,
arrangeType: category.arrangeType,
isType: category.isType,
fondsId: item.fondsId,
fondName: item.fondName,
fondsNo: item.fondsNo,
children: this.transformChildren(category.children, item.fondsId, item.fondName, item.fondsNo)
}
})
}
})
},
//
transformChildren(children, fondsId, fondName, fondsNo) {
return children.map(child => {
return {
label: child.cnName,
id: child.id,
isType: child.isType,
pid: child.pid,
code: child.code,
arrangeType: child.arrangeType,
fondsId: fondsId,
fondName: fondName,
fondsNo: fondsNo,
children: child.children.length ? this.transformChildren(child.children, fondsId, fondName, fondsNo) : []
}
})
},
//
findTopLevelNode(data, fondsId) {
for (let i = 0; i < data.length; i++) {
if (data[i].id === fondsId) {
return data[i]
}
}
return null
},
[CRUD.HOOK.afterRefresh]() {
this.crud.data = this.filterData(this.transformData(this.crud.data))
this.$nextTick(() => {
let currentKey
if (localStorage.getItem('currentArchivesKey') !== null) {
currentKey = JSON.parse(localStorage.getItem('currentArchivesKey'))
//
if (this.$refs.categroyTree.getCurrentKey(currentKey.id) == null) {
localStorage.removeItem('currentArchivesKey')
}
this.topLevelNode = this.findTopLevelNode(this.crud.data, currentKey.fondsId)
//
if (this.topLevelNode) {
if (currentKey) {
//
if (currentKey.isType === 1) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
}
this.expandAllChildren(this.$refs.categroyTree.getNode(this.topLevelNode), currentKey)
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
if (currentKey && currentKey.id) {
this.$nextTick(() => {
//
this.handleNodeClick(currentKey)
})
}
})
},
defaultSetting(currentKey) {
if (this.crud.data[0].isType === 0) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
} else {
currentKey = this.crud.data[0]
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
}
},
//
handleNodeClick(val) {
if (val) {
localStorage.setItem('currentArchivesKey', JSON.stringify(val))
this.selectedCategory = val
this.$nextTick(() => {
})
}
},
// table
clickRowHandler(row) {
this.isPickUp = false
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row)
this.selections = [row]
this.currentRow = row
if (this.currentRow.file_status === 1) {
this.keywords = [
'永久', '武汉飞天', '2024'
]
} else {
this.keywords = []
}
},
handlePickUp(row) {
this.currentRow = row
this.aiPickData = []
this.isPickUp = true
this.aiLoadingPick = true
setTimeout(() => {
this.aiPickData = ['数字人', '多媒体技术在档案信息存贮与检索中的应用中的应用中的应用中的应用', '2023', '30年']
this.aiLoadingPick = false
}, 3000)
},
//
handleCheckboxChange(index) {
// console.log(` ${index} : ${this.selectedItems[index]}`)
const allSelectedItems = this.aiPickData.filter((_, i) => this.selectedItems[i])
console.log('所有选中项:', allSelectedItems)
},
batchAiText() {
const selected = this.aiPickData.filter((_, index) => this.selectedItems[index])
if (selected.length === 0) {
this.$message({ message: '请选择要提取的关键词', type: 'warning', offset: 8 })
return
}
this.keywords = this.keywords.concat(selected)
this.isEditing = this.keywords.map(() => false)
//
this.aiPickData = this.aiPickData.filter((_, index) => !this.selectedItems[index])
this.selectedItems = this.aiPickData.map(() => false)
// file_status
if (this.currentRow) {
this.currentRow.file_status = 1
// tableData
const rowIndex = this.tableData.findIndex(row => row.id === this.currentRow.id)
if (rowIndex !== -1) {
this.$set(this.tableData, rowIndex, { ...this.tableData[rowIndex], file_status: 1 })
}
}
}
}
}
</script>
<style lang="scss" scoped>
.elect-cont-right .container-right {
// min-height: calc(100vh - 188px);
}
.category-container {
.elect-cont-left{
width: 296px !important;
}
}
.openSidebar .category-container .elect-cont-right{
width: calc(100vw - 614px) !important;
}
.hideSidebar .category-container .elect-cont-right {
width: calc(100vw - 412px) !important;
}
.tree-scroll{
font-size: 14px;
}
.ai-file-pickUp{
display: flex;
justify-content: space-between;
}
.ai-file-all{
flex: 1;
}
.pickUp-right{
width: 400px;
margin-left: 20px;
.pickUp-right-item,
.pickUp-Ai{
height: calc(100% / 2);
}
}
.keywords-text p{
width: 340px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
}
.keywords-list{
display: flex;
justify-content: space-between;
line-height: 40px;
border-bottom: 1px solid #e6e8ed;
// padding: 0 10px;
}
.keywords-handle i{
cursor: pointer;
}
.ai-item-text{
display: flex;
justify-content: flex-start;
p{
margin-left: 10px;
}
}
.des-title{
position: relative;
.el-button{
position: absolute;
right: 0;
top: -5px;
}
}
</style>

246
src/views/AIAssistant/AIknowledgeGraph/index.vue

@ -0,0 +1,246 @@
<template>
<div class="app-container category-container" style="height: calc(100vh - 140px);">
<!-- 门类列表 -->
<div class="container-main">
<div class="elect-cont-left">
<div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<!--门类树状结构-->
<div class="tree-scroll">
<el-scrollbar style="height: calc(100vh - 230px);">
<el-tree ref="categroyTree" v-loading="crud.loading" class="arc-tree arc-tree-01" :data="crud.data" :props="defaultProps" node-key="id" :expand-on-click-node="false" highlight-current @node-click="handleNodeClick">
<span slot-scope="{ node, data }" class="custom-tree-node">
<el-tooltip :content="node.label" placement="left" :enterable="false" effect="dark">
<span v-if="data.isType === 0">
{{ data.label }}
</span>
<span v-if="data.isType === 1" class="iconFolder tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 2" class="iconArch tree-text">
{{ data.label }}
</span>
<span v-if="data.isType === 3" class="iconFile tree-text">
{{ data.label }}
</span>
</el-tooltip>
</span>
</el-tree>
</el-scrollbar>
</div>
</div>
</div>
<div class="elect-cont-right">
<div v-if="selectedCategory.isType === 2" class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<img style="display: block; height: calc(100vh - 184px);" src="@/assets/images/graph-img.png" alt=" ">
</div>
</div>
</div>
</div>
</template>
<script>
import crudCategory from '@/api/system/category/category'
import CRUD, { presenter, header } from '@crud/crud'
export default {
name: 'AIknowledgeGraph',
components: { },
cruds() {
return [
CRUD({
title: 'AI知识图谱', url: 'api/category/fondMenu',
crudMethod: { ...crudCategory },
optShow: {
add: false,
edit: false,
del: false,
download: false,
group: false
}
})
]
},
mixins: [presenter(), header()],
data() {
return {
defaultProps: {
children: 'children',
label: 'label'
},
selectedCategory: {}
}
},
computed: {
},
created() {
},
mounted() {
},
methods: {
filterData(data) {
return data.filter(node => {
if (node.children && node.children.length > 0) {
node.children = this.filterData(node.children) //
}
return node.isType !== 3 // isType3
})
},
//
findNode(tree, func) {
for (const node of tree) {
if (func(node)) return node
if (node.children) {
const res = this.findNode(node.children, func)
if (res) return res
}
}
return null
},
//
expandAllChildren(node, targetElement) {
node.expanded = true
//
if (node.childNodes && node.childNodes.length > 0) {
for (let i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].data.id === targetElement.id) {
this.$refs.categroyTree.setCurrentKey(node.childNodes[i])
}
this.expandAllChildren(node.childNodes[i], targetElement)
}
}
},
// el-tree
transformData(rawData) {
return rawData.map(item => {
return {
label: item.fondName,
isType: 0,
id: item.fondsId,
fondsNo: item.fondsNo,
children: item.categoryList.map(category => {
return {
label: category.cnName,
id: category.id,
arrangeType: category.arrangeType,
isType: category.isType,
fondsId: item.fondsId,
fondName: item.fondName,
fondsNo: item.fondsNo,
children: this.transformChildren(category.children, item.fondsId, item.fondName, item.fondsNo)
}
})
}
})
},
//
transformChildren(children, fondsId, fondName, fondsNo) {
return children.map(child => {
return {
label: child.cnName,
id: child.id,
isType: child.isType,
pid: child.pid,
code: child.code,
arrangeType: child.arrangeType,
fondsId: fondsId,
fondName: fondName,
fondsNo: fondsNo,
children: child.children.length ? this.transformChildren(child.children, fondsId, fondName, fondsNo) : []
}
})
},
//
findTopLevelNode(data, fondsId) {
for (let i = 0; i < data.length; i++) {
if (data[i].id === fondsId) {
return data[i]
}
}
return null
},
[CRUD.HOOK.afterRefresh]() {
this.crud.data = this.filterData(this.transformData(this.crud.data))
this.$nextTick(() => {
let currentKey
if (localStorage.getItem('currentArchivesKey') !== null) {
currentKey = JSON.parse(localStorage.getItem('currentArchivesKey'))
//
if (this.$refs.categroyTree.getCurrentKey(currentKey.id) == null) {
localStorage.removeItem('currentArchivesKey')
}
this.topLevelNode = this.findTopLevelNode(this.crud.data, currentKey.fondsId)
//
if (this.topLevelNode) {
if (currentKey) {
//
if (currentKey.isType === 1) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
}
this.expandAllChildren(this.$refs.categroyTree.getNode(this.topLevelNode), currentKey)
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
} else {
this.defaultSetting(currentKey)
}
if (currentKey && currentKey.id) {
this.$nextTick(() => {
//
this.handleNodeClick(currentKey)
})
}
})
},
defaultSetting(currentKey) {
if (this.crud.data[0].isType === 0) {
currentKey = this.findNode(this.crud.data[0].children, (node) => {
return node.isType !== 1
})
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
} else {
currentKey = this.crud.data[0]
this.expandAllChildren(this.$refs.categroyTree.getNode(this.crud.data[0]), currentKey)
}
},
//
handleNodeClick(val) {
if (val) {
localStorage.setItem('currentArchivesKey', JSON.stringify(val))
this.selectedCategory = val
this.$nextTick(() => {
})
}
}
}
}
</script>
<style lang="scss" scoped>
.elect-cont-right .container-right {
min-height: calc(100vh - 190px);
}
.category-container {
.elect-cont-left{
width: 296px !important;
}
}
.openSidebar .category-container .elect-cont-right{
width: calc(100vw - 614px) !important;
}
.hideSidebar .category-container .elect-cont-right {
width: calc(100vw - 412px) !important;
}
.tree-scroll{
font-size: 14px;
}
</style>

306
src/views/archivesStatistics/annualReportStatistics/index.vue

@ -0,0 +1,306 @@
<template>
<div class="app-container">
<div class="container-main">
<div class="elect-cont-left">
<div class="head-container">
<el-select v-model="form.fondsId" placeholder="请选择" style="width: 225px;" @change="changeFondsValue($event)">
<el-option
v-for="(item,index) in fondsOptions"
:key="index"
:label="item.fondsName"
:value="item.id"
/>
</el-select>
</div>
<div class="container-left">
<span class="right-top-line" />
<span class="left-bottom-line" />
<ul class="left-annual-type">
<li class="active">本单位填报6</li>
<li>下级上报0</li>
<li>汇总上报0</li>
</ul>
</div>
</div>
<div class="elect-cont-right">
<div class="head-container" style="position: relative;">
<crudOperation :permission="permission">
<template v-slot:middle>
<el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)">
<i class="iconfont icon-shanchu" />
删除
</el-button>
</template>
</crudOperation>
<div class="double-click-btn" style="top: 3px;"><i class="iconfont icon-zhuyi-lan" /><span>双击列表数据查看年报详情</span></div>
</div>
<div class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-table
ref="table"
v-loading="loading"
class="archives-table"
:data="tableData"
@selection-change="crud.selectionChangeHandler"
@row-click="clickRowHandler"
@row-dblclick="handleDbClick"
>
<el-table-column type="selection" align="center" width="55" />
<el-table-column label="年度" prop="year" />
<el-table-column label="统计模板" prop="template" min-width="150px" />
<el-table-column label="填报单位" prop="unit" />
<el-table-column label="创建人" prop="creator" />
<el-table-column prop="create_time" label="创建日期">
<template slot-scope="scope">
<div>{{ scope.row.create_time | parseTime }}</div>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" />
<el-table-column label="状态" prop="status" align="center">
<template slot-scope="scope">
<!-- <div>{{ scope.row.status === 0 ? '录入中' : '已汇总' }}</div> -->
<span v-if="scope.row.status === 0" class="row-state row-physical state-active">录入中</span>
<span v-else class="row-state row-binding state-active">已汇总</span>
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center" prop="deptsStatus" /> -->
</el-table>
<!--分页组件-->
<!-- <pagination v-if="crud.data.length!==0" /> -->
</div>
</div>
</div>
<el-dialog append-to-body :close-on-click-modal="false" :before-close="handleCloseDialog" :visible.sync="detailVisible" title="详情">
<div class="setting-dialog">
<ul class="annual-dialog-detail">
<li class="detail-item">
<div class="detail-item-left">年度</div>
<div class="detail-item-right">{{ detailContent && detailContent.year }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">年报模板</div>
<div class="detail-item-right">2019</div>
</li>
<li class="detail-item">
<div class="detail-item-left">填报单位</div>
<div class="detail-item-right">{{ detailContent && detailContent.unit }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">报表模板</div>
<div class="detail-item-right">{{ detailContent && detailContent.template }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">填报人</div>
<div class="detail-item-right">{{ detailContent && detailContent.creator }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">上报至</div>
<div class="detail-item-right">{{ detailContent && detailContent.upToUint }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">上报日期</div>
<div class="detail-item-right">{{ detailContent && detailContent.upToDate | parseTime }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">备注</div>
<div class="detail-item-right">{{ detailContent && detailContent.remark }}</div>
</li>
<li class="detail-item">
<div class="detail-item-left">附件列表</div>
<div class="detail-item-right" />
</li>
</ul>
<div slot="footer" class="dialog-footer">
<!-- <router-link to="/local-html">跳转到本地HTML文件</router-link> -->
<el-button type="primary" @click="goToHtml">报表详情</el-button>
<!-- <el-button type="text" @click="detailVisible=false">确定</el-button> -->
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import crudDept from '@/api/system/dept'
import { FetchFondsAll } from '@/api/system/fonds'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
const defaultForm = { id: null, fondsId: null }
const data = [
{
'year': 2024,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '',
'upToDate': null
},
{
'year': 2023,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '武汉飞天智能',
'upToDate': '1706078799000'
},
{
'year': 2022,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '',
'upToDate': null
},
{
'year': 2021,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '',
'upToDate': null
},
{
'year': 2020,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '',
'upToDate': null
},
{
'year': 2019,
'template': '《档案室基本情况表》(2019版)',
'unit': '武汉飞天智能',
'creator': '系统管理员',
'create_time': '1706078799000',
'status': 1,
'remark': '',
'upToUint': '',
'upToDate': null
}
]
export default {
name: 'AnnualReportStatistics',
components: { crudOperation },
cruds() {
return CRUD({ title: '年报统计', idField: 'deptsId', url: 'api/depts/initDeptsList', crudMethod: { ...crudDept }, optShow: {
add: false,
edit: false,
del: false,
reset: false,
download: false,
group: false
},
queryOnPresenterCreated: false
})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
permission: {
add: ['admin'],
edit: ['admin'],
del: ['admin']
},
fondsOptions: [],
form: {
'fondsId': null
},
loading: false,
tableData: data,
detailVisible: false,
detailContent: {}
}
},
mounted() {
this.getFondsDatas()
},
methods: {
getFondsDatas() {
FetchFondsAll().then(res => {
this.fondsOptions = res
if (this.fondsOptions.length > 0) {
this.form.fondsId = this.fondsOptions[0].id
}
})
},
changeFondsValue(value) {
const obj = this.fondsOptions.find(function(item) {
return item.id === value
})
console.log('obj', obj)
},
clickRowHandler(row) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row)
},
handleDbClick(row) {
this.detailVisible = true
this.detailContent = row
},
handleCloseDialog() {
this.detailVisible = false
},
goToHtml() {
// 'test.html' public HTML
// window.location.href = 'report/annual.htm'
window.open('report/annual.htm', '_blank')
}
}
}
</script>
<style lang="scss" scoped>
.left-annual-type{
// padding: 20px 0;
line-height: 36px;
font-size: 14px;
color: #0c0e1e;
li{
padding: 0 10px;
&:hover,
&.active{
background-color: #e8f2ff;
color: #0348f3;
cursor: default;
}
}
}
.annual-dialog-detail{
.detail-item{
display: flex;
justify-content: flex-start;
line-height: 38px;
font-size: 16px;
.detail-item-left{
width: 120px;
text-align: right;
}
.detail-item-right{
color: #0c0e1e;
}
}
}
</style>

278
src/views/archivesStatistics/customDefinedStatistics/index.vue

@ -0,0 +1,278 @@
<template>
<!-- style="height: calc(100vh - 140px);" -->
<div class="app-container row-container">
<div class="custom-main">
<!-- <el-card class="box-card" @click="goToHtml">
认证材料
</el-card>
<el-card class="box-card" @click="goToHtml">
学籍表测试
</el-card>
<el-card class="box-card" @click="goToHtml">
交接统计
</el-card>
<el-card class="box-card" @click="goToHtml">
单个电子文件大小统计
</el-card>
<el-card class="box-card" @click="goToHtml">
电子文件统计
</el-card> -->
<el-card class="box-card">
<div @click="goToHtml">文书档案年度分类统计</div>
</el-card>
<el-card class="box-card">
<div @click="goToHtml">文书档案年度保管期限统计</div>
</el-card>
<!-- <div v-katex:auto class="mdTextBox" v-html="renderMdText(markDownText)" /> -->
<!-- <mavon-editor
class="md"
:value="markDownText"
:subfield="false"
:default-open="'preview'"
:toolbars-flag="false"
:editable="false"
:scroll-style="true"
:ishljs="true"
/> -->
</div>
</div>
</template>
<script>
import MarkdownIt from 'markdown-it'
import MarkdownItHighlightjs from 'markdown-it-highlightjs'
import 'highlight.js/styles/a11y-dark.css'
import katex from 'katex'
import 'katex/dist/katex.min.css'
// import MarkdownItAbbr from 'markdown-it-abbr'
// import MarkdownItAnchor from 'markdown-it-anchor'
// import MarkdownItFootnote from 'markdown-it-footnote'
// import MarkdownItHighlightjs from 'markdown-it-highlightjs'
// import MarkdownItSub from 'markdown-it-sub'
// import MarkdownItSup from 'markdown-it-sup'
// import MarkdownItTasklists from 'markdown-it-task-lists'
// import MarkdownItTOC from 'markdown-it-toc-done-right'
// import 'highlight.js/styles/default.css'
import markdownText2 from '@/assets/test.md'
export default {
name: 'CustomDefinedStatistics',
components: { },
data() {
return {
markdownText2: markdownText2,
//
markDownText: `## 项目背景
> 描述项目或产品的现状让项目成员了解当前存在的问题与痛点
>
+ 痛点1...
+ 痛点2...
+ 痛点3...
## 项目目标
> 描述本项目期望达成的目标目标需满足Smart原则
>
> 1. 具体的Specific
> 2. 可以衡量的Measurable
> 3. 可以达到的Attainable
> 4. 要与其他目标具有一定的相关性Relevant
> 5. 有明确的截止期限Time-bound
>
## 关键事项
> 为达成上述目标需要完成哪些关键事项
>
+ 关键事项1...
+ 关键事项2...
+ 关键事项3...
## 里程碑
> 整个项目中关键节点的里程碑计划
>
![画板](http://gips0.baidu.com/it/u=3602773692,1512483864&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280)
## 人员安排
> 输入项目的所有干系人包括内部和外部干系人
>
| **人员** | **岗位** |
| --- | --- |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 项目经理 |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 技术负责人 |
| @<font style="color:#8C8C8C;background-color:#F5F5F5;">提及</font> | 产品负责人 |
## 风险提示
> 对公司战略项目结题法务风险问题进行提示并说明应对措施
>
`,
markdownRender: new MarkdownIt({
html: true,
linkify: true,
typographer: true,
xhtmlOut: false
}).use(MarkdownItHighlightjs),
// .use(MarkdownItAbbr)
// .use(MarkdownItAnchor)
// .use(MarkdownItFootnote)
// .use(MarkdownItHighlightjs)
// .use(MarkdownItSub)
// .use(MarkdownItSup)
// .use(MarkdownItTasklists)
// .use(MarkdownItTOC)
markdownContent: ''
}
},
updated() {
const that = this
this.$nextTick(() => {
// precode
const codeBlocks = document.querySelectorAll('pre code')
codeBlocks.forEach((block) => {
let newDiv
// code
const preElement = block
// code
const parentElement = preElement.parentNode
// parentElementdiv
const firstDiv = parentElement.querySelector('div')
// div
if (!firstDiv) {
// div
newDiv = document.createElement('div')
// div
newDiv.innerText = '复制代码'
// divclass
newDiv.setAttribute('class', 'copyButton')
// divcode
parentElement.insertBefore(newDiv, preElement)
// div
newDiv.onclick = function() {
const textArea = document.createElement('textarea')
textArea.value = preElement.innerText
document.body.appendChild(textArea)
textArea.select()
document.execCommand('copy')
document.body.removeChild(textArea)
that.$message.success('复制成功')
}
}
})
})
},
mounted() {
// const md = new MarkdownIt()
// console.log('md', md)
// this.markdownContent = md.render(this.markdownText2)
// console.log(' this.markdownContent', this.markdownContent)
},
methods: {
// renderMdText(text) {
// // html
// return this.markdownRender.render(text)
// }
renderMdText(text) {
// markdownhtml
text = this.markdownRender.render(text)
text = this.renderMath(text)
// text = this.decodeHTMLEntities(text) // HTML
return text
},
// decodeHTMLEntities(text) {
// const parser = new DOMParser()
// const doc = parser.parseFromString(text, 'text/html')
// return doc.documentElement.textContent
// },
// markdownlatex
renderMath(html) {
// $$...$$, \[...\], \(...\), and $...$
const regex = /(\$\$([\s\S]+?)\$\$)|(\\\[([\s\S]+?)\\\])|(\\\(([\s\S]+?)\\\))|(\$([^\$]+?)\$)/g
return html.replace(regex, (match, p1, p2, p3, p4, p5, p6, p7, p8) => {
let latex
if (p2) {
// $$...$$
latex = p2
} else if (p4) {
// \[...\]
latex = p4
} else if (p6) {
// \(...\)
latex = p6
} else if (p8) {
// $...$
latex = p8
}
console.log('latex', latex)
if (latex) {
try {
return katex.renderToString(latex, {
throwOnError: false
})
} catch (e) {
console.error('KaTeX rendering error:', e)
return match
}
}
return match
})
},
goToHtml() {
// 'test.html' public HTML
// window.location.href = 'report/annual.htm'
window.open('report/annual.htm', '_blank')
}
}
}
</script>
<style lang="scss" scoped>
.custom-main{
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
::v-deep .el-card{
margin: 0 20px 20px 0;
width: calc(100% / 4 - 40px);
height: 100px;
line-height: 100px;
text-align: center;
cursor: pointer;
}
}
// .mdTextBox{
// width: 1400px;
// ::v-deep h1{
// font-size: 24px;
// line-height: 48px;
// font-weight: 800;
// }
// ::v-deep h2{
// font-size: 22px;
// line-height: 42px;
// font-weight: 700;
// }
// ::v-deep h3{
// font-size: 20px;
// line-height: 36px;
// font-weight: 600;
// }
// ::v-deep img{
// width: 500px;
// }
// ::v-deep a{
// color: #335fee;
// line-height: 20px;
// }
// ::v-deep p {
// line-height: 20px;
// }
// }
</style>

185
src/views/archivesStatistics/dataStatistics/index.vue

@ -0,0 +1,185 @@
<template>
<div class="app-container" style="height: calc(100vh - 140px);">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="company_name" label="公司名称" width="150" align="center" />
<el-table-column label="数据统计" align="center">
<template slot-scope="scope">
<el-table :data="scope.row.archive_types" style="width: 100%">
<el-table-column prop="type_name" label="档案门类" width="150" align="center" />
<el-table-column label="收集库" align="center">
<el-table-column prop="collection.未归档" label="未归档" align="center" />
<el-table-column prop="collection.归档中" label="归档中" align="center" />
<el-table-column prop="collection.已装盒" label="已装盒" align="center" />
<el-table-column prop="collection.未装盒" label="未装盒" align="center" />
<el-table-column prop="collection.全部" label="全部" align="center" />
</el-table-column>
<el-table-column label="管理库" align="center">
<el-table-column prop="management.已装盒" label="已装盒" align="center" />
<el-table-column prop="management.未装盒" label="未装盒" align="center" />
<el-table-column prop="management.已入库" label="已入库" align="center" />
<el-table-column prop="management.未入库" label="未入库" align="center" />
<el-table-column prop="management.审批中" label="审批中" align="center" />
<el-table-column prop="management.全部" label="全部" align="center" />
</el-table-column>
</el-table>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
const tableData = [
{
'company_name': '武汉飞天智能',
'archive_types': [
{
'type_id': 1,
'type_name': '文书档案(文件)',
'collection': {
'未归档': 5,
'归档中': 0,
'已装盒': 1,
'未装盒': 4,
'全部': 5
},
'management': {
'已装盒': 3,
'未装盒': 29,
'已入库': 0,
'未入库': 32,
'审批中': 0,
'全部': 32
}
},
{
'type_id': 2,
'type_name': '文书档案(案卷)',
'collection': {
'未归档': 1,
'归档中': 0,
'已装盒': 0,
'未装盒': 0,
'全部': 4
},
'management': {
'已装盒': 1,
'未装盒': 13,
'已入库': 0,
'未入库': 14,
'审批中': 0,
'全部': 14
}
},
{
'type_id': 3,
'type_name': '科技档案项目',
'collection': {
'未归档': 5,
'归档中': 0,
'已装盒': 0,
'未装盒': 5,
'全部': 5
},
'management': {
'已装盒': 0,
'未装盒': 0,
'已入库': 0,
'未入库': 0,
'审批中': 0,
'全部': 0
}
}
]
},
{
'company_name': '阅行客(武汉)科技',
'archive_types': [
{
'type_name': '文书档案(文件)',
'collection': {
'未归档': 5,
'归档中': 1,
'已装盒': 0,
'未装盒': 5,
'全部': 5
},
'management': {
'已装盒': 0,
'未装盒': 7,
'已入库': 0,
'未入库': 7,
'审批中': 0,
'全部': 7
}
},
{
'type_name': '文书档案(案卷)',
'collection': {
'未归档': 4,
'归档中': 0,
'已装盒': 2,
'未装盒': 2,
'全部': 4
},
'management': {
'已装盒': 0,
'未装盒': 4,
'已入库': 0,
'未入库': 4,
'审批中': 0,
'全部': 4
}
}
]
}
]
export default {
name: 'DataStatistics',
data() {
return {
tableData: tableData
}
},
computed: {
},
watch: {
},
created() {
},
mounted() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-table .cell{
padding: 0 !important;
margin-left: -2px !important;
margin-top: -2px !important;
}
::v-deep .el-table .el-table__body-wrapper{
// border-bottom: 1px solid #000;
// margin-top: -1px !important;
}
::v-deep .el-table .el-table__body-wrapper td.el-table__cell,
::v-deep .el-table .el-table__fixed-right td.el-table__cell {
padding: 0 !important;
border-left: 1px solid #000;
border-bottom: 1px solid #000;
border-right: 1px solid #000;
}
::v-deep.el-table .el-table__header-wrapper th.el-table__cell,
::v-deep.el-table .el-table__header th.el-table__cell{
border: 1px solid #000;
// border-left: 1px solid yellow;
// border-top: 1px solid yellow;
// border-bottom: 1px solid yellow;
}
::v-deep .el-table td.el-table__cell div{
// margin-left: -1px !important;
// border-bottom: 1px solid #000 !important;
}
</style>

374
src/views/archivesStatistics/dataStatistics/index2.vue

@ -0,0 +1,374 @@
<template>
<div class="app-container">
<div class="container-main" style="justify-content: flex-start;">
<!--侧边部门数据-->
<div class="elect-cont-left">
<div class="head-container">
<el-input v-model="filterText" clearable size="small" placeholder="输入部门名称搜索" prefix-icon="el-icon-search" class="filter-item" />
</div>
<el-tree ref="tree" v-loading="crud.loading" :data="fondsDatas" :props="defaultProps" :expand-on-click-node="false" :default-expanded-keys="defaultExpandedKeys" node-key="id" highlight-current :filter-node-method="filterNode" @node-click="handleNodeClick">
<template
slot-scope="{node,data}"
class="custom-tree-node"
>
<el-tooltip
v-if="data.fondsName"
effect="dark"
:content="data.fondsName"
:enterable="false"
placement="left"
>
<span class="tree-text"> {{ data.fondsName }}</span>
</el-tooltip>
<span v-else class="tree-text"> {{ data.deptsName }}</span>
</template>
</el-tree>
</div>
<!--用户数据-->
<div class="elect-cont-right">
<!--工具栏-->
<div class="head-container">
<div class="head-search">
<date-range-picker v-model="blurryTime" class="date-item" />
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button>
<el-button v-if="crud.optShow.reset" class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button>
</div>
<crudOperation :permission="permission">
<template v-slot:right>
<el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)">
<i class="iconfont icon-daochu" />
导出
</el-button>
</template>
</crudOperation>
</div>
<div class="container-right">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-table
:data="crud.data"
style="width: 100%"
>
<el-table-column prop="username" label="姓名" width="100" align="center" />
<el-table-column prop="date" label="文书档案" align="center">
<el-table-column prop="name" label="增加" width="60" />
<el-table-column prop="province" label="删除" width="60" />
<el-table-column prop="city" label="挂接" width="60" />
<el-table-column prop="address" label="移交" width="60" />
<el-table-column prop="zip" label="接收" width="60" />
<el-table-column prop="city" label="打回" width="60" />
<el-table-column prop="address" label="归档" width="60" />
<el-table-column prop="zip" label="销毁" width="60" />
<el-table-column prop="zip" label="推送" width="60" />
</el-table-column>
<el-table-column prop="date" label="科技档案" align="center">
<el-table-column prop="name" label="增加" width="60" />
<el-table-column prop="province" label="删除" width="60" />
<el-table-column prop="city" label="挂接" width="60" />
<el-table-column prop="address" label="移交" width="60" />
<el-table-column prop="zip" label="接收" width="60" />
<el-table-column prop="city" label="打回" width="60" />
<el-table-column prop="address" label="归档" width="60" />
<el-table-column prop="zip" label="销毁" width="60" />
<el-table-column prop="zip" label="推送" width="60" />
</el-table-column>
<el-table-column prop="total" label="合计" align="center" />
</el-table>
</div>
</div>
</div>
</div>
</template>
<script>
import { getDepts, FetchSonDepts } from '@/api/system/dept'
import { FetchFondsAll } from '@/api/system/fonds'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import crudOperation from '@crud/CRUD.operation'
import DateRangePicker from '@/components/DateRangePicker'
import { mapGetters } from 'vuex'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import Vue from 'vue'
import { exportFile } from '@/utils/index'
import qs from 'qs'
const defaultForm = { id: null }
export default {
name: 'DataStatistics',
components: { crudOperation, DateRangePicker },
cruds() {
return CRUD({ title: '档案统计', idField: 'userId', url: 'api/users/initUserList', sort: [], crudMethod: { }, optShow: {
add: false,
edit: false,
del: false,
reset: false,
download: false,
group: false
}})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
blurryTime: null,
fondsDatas: [],
fondsOptions: [],
lastValue: '',
leftFondsId: '',
leftDeptsId: '',
filterText: '',
defaultExpandedKeys: [],
defaultProps: { children: 'children', label: 'fondsName' },
levelNumber: 0,
permission: {
add: ['admin', 'user:add'],
edit: ['admin', 'user:edit'],
del: ['admin', 'user:del']
},
tableData: []
}
},
computed: {
...mapGetters([
'user',
'baseApi'
])
},
watch: {
filterText(val) {
this.$refs.tree.filter(val)
}
},
created() {
},
mounted: function() {
this.getFondsDatas()
},
methods: {
getAutoNameUnknown(name) {
if (name.lastIndexOf('unknown') > -1) {
return name.split('(')[0]
} else {
return name
}
},
resetQuery() {
this.crud.query.blurry = ''
this.blurryTime = null
this.crud.query.startTime = null
this.crud.query.endTime = null
this.crud.query.userStatus = null
this.crud.toQuery()
},
[CRUD.HOOK.beforeRefresh]() {
if (this.blurryTime) {
this.crud.query.startTime = this.blurryTime[0]
this.crud.query.endTime = this.blurryTime[1]
} else {
this.crud.query.startTime = null
this.crud.query.endTime = null
}
},
//
[CRUD.HOOK.afterToCU](crud, form) {
},
//
[CRUD.HOOK.beforeToAdd]() {
},
//
[CRUD.HOOK.beforeToEdit](crud, form) {
},
//
[CRUD.HOOK.afterValidateCU](crud) {
return true
},
clickRowHandler(row) {
this.$refs.table.clearSelection()
this.$refs.table.toggleRowSelection(row)
},
//
handleNodeClick(data) {
console.log(data)
const selectedKey = this.$refs.tree.getCurrentNode()
// const selectedParentVal = this.$refs.tree.getNode(selectedKey).parent.data.id
console.log('selectedKey', selectedKey)
if (data.pid === 0) {
this.query.deptsId = null
this.query.deptsName = null
this.leftFondsId = null
this.leftDeptsId = null
} else {
if (data.fondsNo) {
const selectedParentVal = this.$refs.tree.getNode(selectedKey).data.id
this.query.fondsId = data.id
this.query.deptsId = null
this.query.deptsName = null
this.leftFondsId = selectedParentVal
} else {
const selectedParentVal = this.$refs.tree.getNode(selectedKey).parent.data.id
this.query.deptsId = data.id
this.query.deptsName = data.deptsName
this.leftFondsId = selectedParentVal
}
}
this.crud.toQuery()
},
getFondsDatas() {
const parent = {}
parent.id = 0
parent.fondsName = '全宗部门选择'
FetchFondsAll().then(res => {
res.forEach(item => {
item.children = item.depts
})
parent.children = res
this.fondsDatas.push(parent)
this.fondsOptions = res
this.$nextTick(() => {
Vue.set(this.defaultExpandedKeys, 0, this.fondsDatas[0].children[0].children[0].id)
this.$refs.tree.setCurrentKey(this.fondsDatas[0].children[0].children[0].id)
this.handleNodeClick(this.fondsDatas[0].children[0].children[0])
})
console.log('this.fondsDatas', this.fondsDatas)
})
},
filterNode(value, data) {
if (!value) return true
if (data.deptsName) {
if (data.deptsName.includes(value)) {
return true
} else {
return false
}
}
},
changeFondsValue(value) {
this.depts = []
// console.log(this.lastValue)
// if (this.lastValue) {
// if (value !== this.lastValue) {
// this.form.dept.id = null
// }
// }
var obj = {}
obj = this.fondsOptions.find(function(item) {
return item.id === value
})
const params = {
'fondsId': obj.id,
'fondsName': obj.fondsName,
'status': 1
}
this.getDepts(params)
},
getDepts(params) {
getDepts(params).then(res => {
this.depts = res.content.map(function(obj) {
if (obj.sonNum !== 0) {
obj.hasChildren = true
} else {
obj.hasChildren = false
}
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
//
loadDepts({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) {
FetchSonDepts({ deptsId: parentNode.deptsId }).then(res => {
parentNode.children = res.map(function(obj) {
if (obj.sonNum !== 0) {
obj.hasChildren = true
} else {
obj.hasChildren = false
}
if (obj.hasChildren) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
doExport(data) {
console.log(data)
this.crud.downloadLoading = true
this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
const ids = []
data.forEach(val => {
ids.push(val.userId)
})
const params = {
'deptsIds': ids
}
exportFile(this.baseApi + '/api/users/download?' + qs.stringify(params, { indices: false }))
this.crud.downloadLoading = false
}).catch(() => {
})
},
checkboxT(row, rowIndex) {
return row.userId !== this.user.id
},
fondsNormalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.fondsName,
children: node.children
}
},
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.deptsId,
label: node.deptsName,
children: node.children
}
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-tree{
.el-tree-node__content{
font-size: 14px;
color: #545B65;
.tree-text{
font-size: 16px;
font-weight: 600;
color: #0C0E1E;
}
}
.el-tree-node__children{
.tree-text {
font-size: 14px !important;
font-weight: normal;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
display: inline-block;
min-width: 170px;
color: #545B65;
}
}
}
</style>

27
src/views/archivesStatistics/ureport/designer/index.vue

@ -0,0 +1,27 @@
<template>
<div v-loading="loading" :style="'height:'+ height">
<iframe :src="src" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
</div>
</template>
<script>
export default {
name: 'Ureport',
data() {
return {
src: '/ureport/designer',
height: document.documentElement.clientHeight - 94.5 + 'px;',
loading: true
}
},
mounted: function() {
setTimeout(() => {
this.loading = false
}, 230)
const that = this
window.onresize = function temp() {
that.height = document.documentElement.clientHeight - 94.5 + 'px;'
}
console.log('8888888')
}
}
</script>

6
src/views/components/category/PreviewForm.vue

@ -72,7 +72,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row v-if="isDesFormType !== 'prearchiveLibrary' && isDesFormType !== 'mergeFile' && isDesFormType !== 'category'" class="preview-form-bottom prearch-bottom">
<el-row v-if="isDesFormType !== 'prearchiveLibrary' && isDesFormType !== 'mergeFile' && isDesFormType !== 'category' && !isAiCategory" class="preview-form-bottom prearch-bottom">
<el-col v-for="(item,index) in formPreviewData" :key="index">
<el-form-item v-if="item.fieldName === 'is_entity'" label="有无实体" :prop="item.fieldName" :rules="[{ required: true, message: '请选择',trigger: 'change' }]" class="pbysical-style">
<el-radio-group v-model="addOrUpdateForm[item.fieldName]">
@ -194,6 +194,10 @@ export default {
categoryMenu: {
type: Array,
default: () => { return [] }
},
isAiCategory: {
type: Boolean,
default: false
}
},

34
vue.config.js

@ -47,6 +47,14 @@ module.exports = {
pathRewrite: {
'^/auth': 'auth'
}
},
'/ureport': {
target: process.env.VUE_APP_BASE_API,
ws: false,
changeOrigin: true,
pathRewrite: {
'^/ureport': '/ureport'
}
}
}
},
@ -151,6 +159,32 @@ module.exports = {
config.optimization.runtimeChunk('single')
}
)
config.module
.rule('mjs')
.test(/\.mjs$/)
.include
.add(/node_modules/)
.end()
.type('javascript/auto')
// 定义一个新的webpack模块规则,命名为md
config.module.rule('md')
// 通过.test()方法,指定这个规则应该匹配哪些文件
// 这个规则将应用于所有以.md结尾的文件,即Markdown文件
.test(/\.md/)
// 使用vue-loader来处理Markdown文件
.use('vue-loader')
.loader('vue-loader')
.end()
// 指定vue-markdown-loader来处理Markdown文件
.use('vue-markdown-loader')
// 使用vue-markdown-loader包中的markdown-compiler模块来处理Markdown文件
.loader('vue-markdown-loader/lib/markdown-compiler')
// raw: true以原始字符串的形式处理Markdown内容,不进行HTML转义等处理。
.options({
raw: true
})
},
transpileDependencies: [
'vue-echarts',

Loading…
Cancel
Save