luojie 2 months ago
parent
commit
56eba6ce56
32 changed files with 1163 additions and 268 deletions
  1. +79
    -20
      src/App.vue
  2. +8
    -0
      src/api/business/public/public.js
  3. +15
    -0
      src/api/system/user.js
  4. +9
    -6
      src/components/Template/BaseInfoFormPackage.vue
  5. +3
    -2
      src/components/Template/HandleFormItem.vue
  6. +1
    -0
      src/components/Template/LineLabel.vue
  7. +3
    -1
      src/components/Template/Step.vue
  8. +17
    -4
      src/components/Template/Table.vue
  9. +5
    -3
      src/lang/en.js
  10. +3
    -1
      src/lang/en/system/role.js
  11. +4
    -1
      src/lang/en/system/user.js
  12. +152
    -0
      src/lang/en/template/pcr.js
  13. +4
    -1
      src/lang/zh.js
  14. +3
    -1
      src/lang/zh/system/role.js
  15. +4
    -1
      src/lang/zh/system/user.js
  16. +146
    -0
      src/lang/zh/template/pcr.js
  17. +2
    -1
      src/main.js
  18. +11
    -1
      src/permission.js
  19. +12
    -12
      src/router/index.js
  20. +4
    -0
      src/utils/menu.js
  21. +120
    -0
      src/views/business/comps/common/JcgjExportList.vue
  22. +7
    -2
      src/views/business/comps/template/TemplateTable.vue
  23. +332
    -0
      src/views/business/comps/template/comps/pcr/PCR001.vue
  24. +2
    -2
      src/views/business/comps/template/comps/sp/SP00456.vue
  25. +25
    -0
      src/views/business/comps/template/formConfig/paralleAndLadderConfig.js
  26. +12
    -56
      src/views/business/study/comp/jhbd/Xq.vue
  27. +12
    -51
      src/views/business/study/comp/sqbd/Xq.vue
  28. +26
    -83
      src/views/business/study/comp/tbbd/Xq.vue
  29. +2
    -2
      src/views/business/systemLog/comp/czrz.vue
  30. +4
    -0
      src/views/system/menu/index.vue
  31. +45
    -5
      src/views/system/role/index.vue
  32. +91
    -12
      src/views/system/user/index.vue

+ 79
- 20
src/App.vue View File

@ -135,9 +135,12 @@ export default {
.el-dialog__body {
padding: 10px 10px;
}
/*隐藏自动填充密码 */
.sbzdtcma{
width: 0px; height: 0px; overflow: hidden;
.sbzdtcma {
width: 0px;
height: 0px;
overflow: hidden;
}
/*搜索区域样式 */
@ -224,7 +227,7 @@ export default {
display: flex;
justify-content: flex-start;
text-align: left;
page-break-inside: avoid;
.line {
width: 2px;
float: left;
@ -314,14 +317,68 @@ export default {
margin-top: 10px;
}
}
.no-break {
page-break-inside: avoid;
}
page-break-inside: avoid;
}
/* 表格行不被分割 */
table, tr, td, th {
page-break-inside: avoid;
}
tr,
td,
th {
page-break-inside: avoid;
}
.page-break {
page-break-before: always;
}
.datatable {
border-collapse: collapse;
width: 100%;
font-size: 13px;
}
.datatable thead {
border-left: 1px solid #f5f5f5;
page-break-inside: avoid;
}
.datatable th {
padding: 5px 5px 4px 5px;
max-width: 200px;
line-height: 35px;
text-align: center;
color: #606266;
background: #f8f8f9;
border: 1px solid #f5f5f5;
}
.datatable th.operate {
padding: 5px 5px 4px 5px;
width: 100px;
line-height: 35px;
background: #f8f8f9;
border: 1px solid #f5f5f5;
text-align: center;
}
.datatable td {
border: solid 1px #f5f5f5;
padding: 3px 5px 4px 5px;
max-width: 100px;
color: #606266;
line-height: 35px;
text-align: center;
}
.el-dialog__body {
padding: 10px 20px !important;
}
/** 基础信息设置tab **/
.edit-container {
@ -357,12 +414,12 @@ export default {
.is-finish {
background: #409eff;
border: 1px solid #409eff;
border: 1px solid #409eff;
color: #fff;
}
.is-info {
border: 1px solid #d0d0d0;
.is-info {
border: 1px solid #d0d0d0;
}
.line {
@ -383,8 +440,9 @@ export default {
padding: 10px 10px;
margin-top: 10px;
width: 100%;
display: flex;
display: flex;
justify-content: center;
.content-right {
width: 33%;
margin-left: 2%;
@ -395,6 +453,7 @@ export default {
.content-left {
width: 65%;
}
.content {
width: 100%;
}
@ -410,7 +469,7 @@ export default {
display: flex;
justify-content: flex-start;
text-align: left;
page-break-inside: avoid;
.line {
width: 2px;
float: left;
@ -470,11 +529,11 @@ export default {
}
.template-form-item {
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
margin-top: 24px;
padding: 24px;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
margin-top: 24px;
padding: 24px;
}
</style>

+ 8
- 0
src/api/business/public/public.js View File

@ -123,3 +123,11 @@ export function public_storageLocation(query) {
params: query
})
}
// 操作日志
export function public_saveSimpleLog(query) {
return request({
url: '/system/business/public/saveSimpleLog',
method: 'get',
params: query
})
}

+ 15
- 0
src/api/system/user.js View File

@ -160,3 +160,18 @@ export function studyUser(query) {
params: query
})
}
export function roleChangeList(query) {
return request({
url: '/system/business/roleChange/list',
method: 'get',
params: query
})
}
export function roleChangeExport(data) {
return request({
url: '/system/business/roleChange/export',
method: 'post',
data
})
}

+ 9
- 6
src/components/Template/BaseInfoFormPackage.vue View File

@ -233,6 +233,9 @@ export default {
grid-template-columns: repeat(2, 1fr);
/* 默认2列 */
gap: 0 20px;
/* 防止网格容器被分割到不同页面 */
page-break-inside: avoid;
break-inside: avoid;
}
.gap2 {
@ -251,7 +254,7 @@ export default {
margin-top: 20px;
padding: 20px;
border-radius: 5px 5px;
page-break-inside: avoid;
}
/* 或者使用 span 语法 */
@ -265,9 +268,11 @@ export default {
.c-Item {
// &:not(:last-child) {
margin-bottom: 16px;
// }
// &:not(:last-child) {
// margin-bottom: 16px;
// }
page-break-inside: avoid;
padding: 8px 0px;
}
.eo {
@ -315,12 +320,10 @@ export default {
}
.flex1 {
page-break-inside: avoid;
flex: 1;
}
.flex {
page-break-inside: avoid;
display: flex;
}

+ 3
- 2
src/components/Template/HandleFormItem.vue View File

@ -976,8 +976,9 @@ export default {
cursor: pointer;
width: auto;
// margin-left: 10px;
min-width: 178px;
height: 28px;
min-height: 28px;
line-height: 28px;
word-break: break-all;
border-radius: 4px;
border: 1px solid #4ea2ff;
display: flex;

+ 1
- 0
src/components/Template/LineLabel.vue View File

@ -24,6 +24,7 @@
justify-content: flex-start;
text-align: left;
margin-top: 20px;
page-break-inside: avoid;
.line {
width: 2px;
float: left;

+ 3
- 1
src/components/Template/Step.vue View File

@ -495,8 +495,10 @@ export default {
flex:1
}
.step-list {
padding-top: 10px;
.step-list-item {
margin-top: 10px;
page-break-inside: avoid;
padding-top: 10px;
border-radius: 6px;
overflow: hidden;

+ 17
- 4
src/components/Template/Table.vue View File

@ -1,11 +1,24 @@
<template>
<div>
<LineLabel v-if = "label" :label="label"></LineLabel>
<LineLabel v-if="label" :label="label"></LineLabel>
<div class="mt-20">
<el-table :data="dataSource">
<el-table-column v-for="(item) in columns" :prop="item.prop" :key="item.prop" :label="$t(item.label)" class="no-break">
<!-- <el-table :data="dataSource">
<el-table-column v-for="(item) in columns" :prop="item.prop" :key="item.prop" :label="$t(item.label)"
class="no-break">
</el-table-column>
</el-table>
</el-table> -->
<table class="datatable">
<thead>
<tr>
<th v-for="(item) in columns" :key="item.prop" class="no-break">{{ $t(item.label) }}</th>
</tr>
</thead>
<tbody>
<tr v-for="(ditem, index) in dataSource" :key="index">
<td v-for="(item) in columns" :key="item.prop" class="no-break">{{ ditem[item.prop] }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>

+ 5
- 3
src/lang/en.js View File

@ -17,7 +17,8 @@ import commonTemplate from './en/template/commonTemplate'
import sp from './en/template/sp'
//供试品模板
import gspmb from './en/template/gsp'
//PCR模板
import pcr from './en/template/pcr'
// 试验管理
import study from './en/business/study/study'
import studyEnter from './en/business/study/studyEnter'
@ -101,7 +102,7 @@ export default {
signerUser: 'Signed User',
signerPsw: 'Password',
qmyy: 'Meaning of Signature',
signTime: '签名时间',
signTime: 'Date',
remark: 'Comment',
reason: 'Reason',
modify: 'Modify',
@ -183,6 +184,7 @@ export default {
template: {
common: commonTemplate,
sp: sp,
gsp: gspmb
gsp: gspmb,
pcr: pcr
}
}

+ 3
- 1
src/lang/en/system/role.js View File

@ -20,5 +20,7 @@ export default {
filterPlaceholder: 'Name Or Mobile',
unauthorized: 'Uauthorized',
authorized: 'Authorized'
authorized: 'Authorized',
fpjs: 'Role Change'
}

+ 4
- 1
src/lang/en/system/user.js View File

@ -17,5 +17,8 @@ export default {
history: 'Role History',
addUser: 'Create',
modifyUser: 'Edit'
modifyUser: 'Edit',
bgqjs: 'Role Before Change',
bghjs: 'Role After Change'
}

+ 152
- 0
src/lang/en/template/pcr.js View File

@ -0,0 +1,152 @@
//色谱
export default {
// PCR分析溶液配制记录表
pcr001:{
title: 'PCR分析溶液配制记录表',
},
// 生物样品分析储备液配制表
sp002:{
title: '生物样品分析储备液配制表',
},
// 生物样品标曲工作液制备表
sp003:{
title: '生物样品标曲工作液制备表',
rqcz: 'Container Material',
cctj:'Storage Condition',
qsyry:'Source Solution',
ysqsyrynd:'Expected Concentration of Source Solution',
sjqsyrynd:'Actual Concentration of Source Solution',
xsy:'Diluent',
qsbhstd:'STD Starting Number',
mbryyxzq:'Validity Period of Target Solution',
mbrysxr:'Expiration Date of Target Solution',
mbrybh:'Target Solution ID',
qsrybh:'Source Solution ID',
ysqsrytj:'Expected Volume of Source Solution',
sjqsrytj:'Actual Source Solution Volume',
ysxsytj:'Expected Volume of Diluent',
sjxsytj:'Actual Volume of Diluent',
ysmbrynd:'Expected Concentration of Target Solution',
sjmbrynd:'Actual Concentration of Target Solution',
ysmbrytj:'Expected Volume of Target Solution',
sjmbrytj:'Actual Volume of Target Solution',
},
// 生物样品内标工作液制备表
sp00456:{
title: '生物样品内标工作液制备表',
mbrybh:'Target Solution ID',
qsrybh:'Source Solution ID',
ysqsrytj:'Expected Volume of Source Solution',
sjqsrytj:'Actual Source Solution Volume',
ysxsytj:'Expected Volume of Diluent',
sjxsytj:'Actual Volume of Diluent',
ysmbrynd:'Expected Concentration of Target Solution',
sjmbrynd:'Actual Concentration of Target Solution',
ysmbrytj:'Expected Volume of Target Solution',
sjmbrytj:'Actual Volume of Target Solution',
mbryyxzq:'Validity Period of Target Solution',
mbrysxr:'Expiration Date of Target Solution',
ysysrybh:'预设原始溶液编号',
sjysrybh:'实际原始溶液编号',
ysysrynd:'预设原始溶液浓度',
sjysrynd:'实际原始溶液浓度',
ysysrytj:'预设原始溶液体积',
sjysrytj:'实际原始溶液体积',
yjxsytj:'Expected Volume of Diluent',
sjxsytj:'Actual Volume of Diluent',
qsyry:'Source Solution',
ysqsyrynd:'Expected Concentration of Source Solution',
sjqsyrynd:'Actual Concentration of Source Solution',
xsy:'Diluent',
rqcz: 'Container Material',
cctj:'Storage Condition',
},
// 生物样品分析方法学样品制备表-准确度与精密度
sp008: {
title:
'Bioanalytical Methods Sample Preparation Record(Accuracy and Precision)',
clpbh: 'Analysis Batch Number',
rqcz: 'Container Material',
clsj: 'Work Time',
xzjz: 'Select substrate',
bh: 'Serial Number',
ysry: 'Preset solution',
sjry: 'Actual solution',
yjryxql: 'Expected Solution Extraction Volume',
sjryxql: 'Actual Solution Extraction Volume',
yjjzxql: 'Expected Blank Matrix Extraction Volume',
sjjzxql: 'Actual Blank Matrix Extraction Volume',
hhwznd: 'Target Solution Concentration'
},
// 生物样品分析方法学样品制备表-Recovery
sp009: {
title: 'Bioanalytical Methods Sample Preparation Record (Recovery)',
clpbh: 'Analysis Batch Number',
rqcz: 'Container Material',
clsj: 'Work Time',
xzjz: 'Select substrate',
bh: 'Serial Number',
ysry: 'Preset solution',
sjry: 'Actual solution',
yjryxql: 'Expected Solution Extraction Volume',
sjryxql: 'Actual Solution Extraction Volume',
yjjzxql: 'Expected Blank Matrix Extraction Volume',
sjjzxql: 'Actual Blank Matrix Extraction Volume',
hhwznd: 'Target Solution Concentration',
xzgzy: 'Select Working Solution',
xzxsy: 'Select Diluent',
yjgzyxql: 'Expected Working Solution Extraction Volume',
sjgzyxql: 'Actual Working Solution Extraction Volume',
yjxsyxql: 'Expected Diluent Extraction Volume',
sjxsyxql: 'Actual Diluent Extraction Volume'
},
//生物样品分析方法学样品制备表(全血稳定)
sp010: {
title:
'Bioanalytical Methods Sample Preparation Record (Whole Blood Stability)'
},
//生物样品分析方法学样品制备表(Solution stability)-生物样品分析方法学样品制备表-储备液和工作液稳定性
sp011: {
title:
'Bioanalytical Methods Sample Preparation Record (Solution Stability)',
xzxsy: 'Select Diluent',
yjxsyxql: 'Expected Blank Diluent Extraction Volume',
sjxsyxql: 'Actual Blank Diluent Extraction Volume'
},
//生物样品分析方法学样品制备表(Haemolysed matrix effect)-生物样品分析方法学样品制备表(溶血基质效应)
sp012: {
title:
'Bioanalytical Methods Sample Preparation Record (Haemolytic Matrix Effect)'
},
//生物样品分析方法学样品制备表(Matrix effect)-生物样品分析方法学样品制备表(基质效应)
sp013: {
title: 'Bioanalytical Methods Sample Preparation Record (Matrix Effect)',
kbjzbh: 'Blank Matrix Serial Number'
},
//生物样品分析方法学样品制备表(Selectivity)-生物样品分析方法学样品制备表(选择性和特异性)
sp014: {
title: 'Bioanalytical Methods Sample Preparation Record (Selectivity)'
},
//生物样品分析方法学样品制备表(Sample Size)-生物样品分析方法学样品制备表(最大样本数)
sp015: {
title: 'Bioanalytical Methods Sample Preparation Record (Sample Amount)'
},
//生物样品分析方法学样品制备表(Dilution Integrity)- 生物样品分析方法学样品制备表(稀释可靠性)
sp016: {
title:
'Bioanalytical Methods Sample Preparation Record (Dilution Integrity)',
bs: 'Multiple'
},
//生物样品分析方法学样品制备表(Stock solution comparison)- 生物样品分析方法学样品制备表(储备液对比)
sp017: {
title:
'Bioanalytical Methods Sample Preparation Record (Stock Solution Comparison)'
},
//生物样品分析方法学质控配制表
sp018: {
title: 'Bioanalytical Methods Quality Control Solution Preparation Record',
xzxsy: 'Select Diluent'
}
}

+ 4
- 1
src/lang/zh.js View File

@ -17,6 +17,8 @@ import commonTemplate from './zh/template/commonTemplate'
import sp from './zh/template/sp'
//供试品模板
import gspmb from './zh/template/gsp'
//PCR模板
import pcr from './zh/template/pcr'
// 试验管理
import study from './zh/business/study/study'
@ -178,6 +180,7 @@ export default {
template: {
common: commonTemplate,
sp: sp,
gsp: gspmb
gsp: gspmb,
pcr: pcr
}
}

+ 3
- 1
src/lang/zh/system/role.js View File

@ -20,5 +20,7 @@ export default {
filterPlaceholder: '姓名/手机号',
unauthorized: '未授权',
authorized: '已授权'
authorized: '已授权',
fpjs: '分配角色'
}

+ 4
- 1
src/lang/zh/system/user.js View File

@ -18,5 +18,8 @@ export default {
addUser: '新增角色',
modifyUser: '编辑角色',
phoneError: '请输入正确的手机号码'
phoneError: '请输入正确的手机号码',
bgqjs: '变更前角色',
bghjs: '变更后角色'
}

+ 146
- 0
src/lang/zh/template/pcr.js View File

@ -0,0 +1,146 @@
//色谱
export default {
// PCR分析溶液配制记录表
pcr001:{
title: 'PCR分析溶液配制记录表',
},
// 生物样品分析储备液配制表
sp002:{
title: '生物样品分析储备液配制表',
},
// 生物样品标曲工作液制备表
sp003:{
title: '生物样品标曲工作液制备表',
rqcz: '容器材质',
cctj:'存储条件',
qsyry:'起始源溶液',
ysqsyrynd:'预设起始源溶液浓度',
sjqsyrynd:'实际起始源溶液浓度',
xsy:'稀释液',
qsbhstd:'起始编号STD',
mbryyxzq:'目标溶液有效周期',
mbrysxr:'目标溶液失效日',
mbrybh:'目标溶液编号',
qsrybh:'起始溶液编号',
ysqsrytj:'预设起始溶液体积',
sjqsrytj:'实际起始溶液体积',
ysxsytj:'预设稀释液体积',
sjxsytj:'实际稀释液体积',
ysmbrynd:'预设目标溶液浓度',
sjmbrynd:'实际目标溶液浓度',
ysmbrytj:'预设目标溶液体积',
sjmbrytj:'实际目标溶液体积',
},
// 生物样品内标工作液制备表
sp00456:{
title: '生物样品内标工作液制备表',
mbrybh:'目标溶液编号',
qsrybh:'起始溶液编号',
ysqsrytj:'预设起始溶液体积',
sjqsrytj:'实际起始溶液体积',
ysxsytj:'预设稀释液体积',
sjxsytj:'实际稀释液体积',
ysmbrynd:'预设目标溶液浓度',
sjmbrynd:'实际目标溶液浓度',
ysmbrytj:'预设目标溶液体积',
sjmbrytj:'实际目标溶液体积',
mbryyxzq:'目标溶液有效周期',
mbrysxr:'目标溶液失效日',
ysysrybh:'预设原始溶液编号',
sjysrybh:'实际原始溶液编号',
ysysrynd:'预设原始溶液浓度',
sjysrynd:'实际原始溶液浓度',
ysysrytj:'预设原始溶液体积',
sjysrytj:'实际原始溶液体积',
yjxsytj:'预计稀释液体积',
sjxsytj:'实际稀释液体积',
qsyry:'起始源溶液',
ysqsyrynd:'预设起始源溶液浓度',
sjqsyrynd:'实际起始源溶液浓度',
xsy:'稀释液',
rqcz: '容器材质',
cctj:'存储条件',
},
// 生物样品分析方法学样品制备表-准确度与精密度
sp008: {
title: '生物样品分析方法学样品制备表(准确度与精密度)',
clpbh: '处理批编号',
rqcz: '容器材质',
clsj: '处理时间',
xzjz: '选择基质',
bh: '编号',
ysry: '预设溶液',
sjry: '实际溶液',
yjryxql: '预计溶液吸取量',
sjryxql: '实际溶液吸取量',
yjjzxql: '预计基质吸取量',
sjjzxql: '实际基质吸取量',
hhwznd: '化合物终浓度'
},
// 生物样品分析方法学样品制备表-Recovery
sp009: {
title: '生物样品分析方法学样品制备表(Recovery)',
clpbh: '处理批编号',
rqcz: '容器材质',
clsj: '处理时间',
xzjz: '选择基质',
bh: '编号',
ysry: '预设溶液',
sjry: '实际溶液',
yjryxql: '预计溶液吸取量',
sjryxql: '实际溶液吸取量',
yjjzxql: '预计基质吸取量',
sjjzxql: '实际基质吸取量',
hhwznd: '化合物终浓度',
xzgzy: '选择工作液',
xzxsy: '选择稀释液',
yjgzyxql: '预计工作液吸取量',
sjgzyxql: '实际工作液吸取量',
yjxsyxql: '预计稀释液吸取量',
sjxsyxql: '实际稀释液吸取量'
},
//生物样品分析方法学样品制备表(全血稳定)
sp010: {
title: '生物样品分析方法学样品制备表(全血稳定)'
},
//生物样品分析方法学样品制备表(Solution stability)-生物样品分析方法学样品制备表-储备液和工作液稳定性
sp011: {
title: '生物样品分析方法学样品制备表(储备液和工作液稳定性)',
xzxsy: '选择稀释液',
yjxsyxql: '预计稀释液吸取量',
sjxsyxql: '实际稀释液吸取量'
},
//生物样品分析方法学样品制备表(Haemolysed matrix effect)-生物样品分析方法学样品制备表(溶血基质效应)
sp012: {
title: '生物样品分析方法学样品制备表(溶血基质效应)'
},
//生物样品分析方法学样品制备表(Matrix effect)-生物样品分析方法学样品制备表(基质效应)
sp013: {
title: '生物样品分析方法学样品制备表(基质效应)',
kbjzbh: '空白基质编号'
},
//生物样品分析方法学样品制备表(Selectivity)-生物样品分析方法学样品制备表(选择性和特异性)
sp014: {
title: '生物样品分析方法学样品制备表(选择性和特异性)'
},
//生物样品分析方法学样品制备表(Sample Size)-生物样品分析方法学样品制备表(最大样本数)
sp015: {
title: '生物样品分析方法学样品制备表(最大样本数)'
},
//生物样品分析方法学样品制备表(Dilution Integrity)- 生物样品分析方法学样品制备表(稀释可靠性)
sp016: {
title: '生物样品分析方法学样品制备表(稀释可靠性)',
bs: '倍数'
},
//生物样品分析方法学样品制备表(Stock solution comparison)- 生物样品分析方法学样品制备表(储备液对比)
sp017: {
title: '生物样品分析方法学样品制备表(储备液对比)'
},
//生物样品分析方法学质控配制表
sp018: {
title: '生物样品分析方法学质控配制表',
xzxsy: '选择稀释液'
}
}

+ 2
- 1
src/main.js View File

@ -5,7 +5,6 @@ import Cookies from 'js-cookie'
import Element from 'element-ui'
import './assets/styles/element-variables.scss'
import '@/assets/styles/index.scss' // global css
import '@/assets/styles/ruoyi.scss' // ruoyi css
import App from './App'
@ -44,6 +43,7 @@ import ImagePreview from '@/components/ImagePreview'
import DictTag from '@/components/DictTag'
// 字典数据组件
import DictData from '@/components/DictData'
import { public_saveSimpleLog } from '@/api/business/public/public'
// 全局方法挂载
Vue.prototype.getDicts = getDicts
@ -56,6 +56,7 @@ Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download
Vue.prototype.handleTree = handleTree
Vue.prototype.getMenuName = getMenuName
Vue.prototype.saveSimpleLog = public_saveSimpleLog
// 全局组件挂载
Vue.component('DictTag', DictTag)

+ 11
- 1
src/permission.js View File

@ -6,6 +6,8 @@ import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isPathMatch } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import { public_saveSimpleLog } from '@/api/business/public/public'
import { getMenuNameEn } from '@/utils/menu'
NProgress.configure({ showSpinner: false })
@ -78,6 +80,14 @@ router.beforeEach((to, from, next) => {
}
})
router.afterEach(() => {
router.afterEach((to) => {
if (to.meta.title && to.path != '/login') {
public_saveSimpleLog({
nameEn: getMenuNameEn(to.meta.title),
name: to.meta.title,
jcmc: '进入页面',
jcmcEn: 'Enter Page'
})
}
NProgress.done()
})

+ 12
- 12
src/router/index.js View File

@ -178,7 +178,7 @@ export const dynamicRoutes = [
path: ':studyId(\\d+)/:tab',
component: () => import('@/views/business/study/comp/enter'),
name: 'StudyEnter',
meta: { title: '进入试验', activeMenu: '/trial/list' }
meta: { title: '', activeMenu: '/trial/list' }
}
]
},
@ -192,7 +192,7 @@ export const dynamicRoutes = [
path: ':studyId(\\d+)/:tab',
component: () => import('@/views/business/form/nonTrial/comp/enter'),
name: 'NonTrialEnter',
meta: { title: '进入', activeMenu: '/form/nonTrial' }
meta: { title: '', activeMenu: '/form/nonTrial' }
}
]
},
@ -206,7 +206,7 @@ export const dynamicRoutes = [
path: ':studyId(\\d+)/:tab',
component: () => import('@/views/business/form/drug/comp/enter'),
name: 'DrugEnter',
meta: { title: '进入', activeMenu: '/form/drug' }
meta: { title: '', activeMenu: '/form/drug' }
}
]
},
@ -220,7 +220,7 @@ export const dynamicRoutes = [
path: ':key',
component: () => import('@/views/business/study/comp/tbbd/Bj'),
name: 'studyFormFillBj',
meta: { title: 'loading', activeMenu: '/trial/list' }
meta: { title: '', activeMenu: '/trial/list' }
}
]
},
@ -234,7 +234,7 @@ export const dynamicRoutes = [
path: ':key',
component: () => import('@/views/business/study/comp/tbbd/Bj'),
name: 'nonTrialFormFillBj',
meta: { title: 'loading', activeMenu: '/form/nonTrial' }
meta: { title: '', activeMenu: '/form/nonTrial' }
}
]
},
@ -248,11 +248,11 @@ export const dynamicRoutes = [
path: ':key',
component: () => import('@/views/business/study/comp/tbbd/Bj'),
name: 'drugFormFillBj',
meta: { title: 'loading', activeMenu: '/form/drug' }
meta: { title: '', activeMenu: '/form/drug' }
}
]
},
{
{
path: '/resource/mjy',
component: Layout,
hidden: true,
@ -262,11 +262,11 @@ export const dynamicRoutes = [
path: ':tab',
component: () => import('@/views/business/resource/mjy/index'),
name: 'Mjy',
meta: { title: 'loading', activeMenu: '/resource/mjy/mjyList' }
meta: { title: '麻精药管理', activeMenu: '/resource/mjy/mjyList' }
}
]
},
{
{
path: '/resource/gyzj',
component: Layout,
hidden: true,
@ -276,7 +276,7 @@ export const dynamicRoutes = [
path: ':tab',
component: () => import('@/views/business/resource/gyzj/index'),
name: 'Gyzj',
meta: { title: 'loading', activeMenu: '/resource/gyzj/gyzjList' }
meta: { title: '给药制剂管理', activeMenu: '/resource/gyzj/gyzjList' }
}
]
},
@ -290,10 +290,10 @@ export const dynamicRoutes = [
path: ':tab',
component: () => import('@/views/business/resource/gsp/index'),
name: 'Gsp',
meta: { title: 'loading', activeMenu: '/resource/gsp/gspList' }
meta: { title: '供试品管理', activeMenu: '/resource/gsp/gspList' }
}
]
},
}
]
// 防止连续点击多次路由报错

+ 4
- 0
src/utils/menu.js View File

@ -45,3 +45,7 @@ export function getMenuName(menuName) {
}
return menuObj[menuName] || menuName
}
export function getMenuNameEn(menuName) {
return menuObj[menuName] || menuName
}

+ 120
- 0
src/views/business/comps/common/JcgjExportList.vue View File

@ -0,0 +1,120 @@
<template>
<div style="padding: 10px 10px;">
<div v-for="(item, index) in list" :key="index" :color="item.color">
<div class="jcgjList-title no-break">
<div><span>{{ item.createTime }}</span>
<span :style="'color:' + item.color+';margin-left:5px'">{{ $i18n.locale ==='zh_CN' ? item.jcmc :item.jcmcEn }}</span></div>
</div>
<div class="no-break" style="padding: 5px 0px;">
<template v-if="$i18n.locale === 'zh_CN'">
<span v-for="(pitem, pindex) in item.jcnrList" :key="pindex" style="padding-right: 5px;">
{{ pitem.name }}{{ pitem.value }}
</span>
</template>
<template v-else>
<span v-for="(pitem, pindex) in item.jcnrListEn" :key="pindex" style="padding-right: 5px;">
{{ pitem.name }}{{ pitem.value }}
</span>
</template>
<div v-if="item.remark && item.remark !== ''" style="padding-top: 5px;">
{{ $t('form.remark') }}{{ item.remark }}
</div>
<div v-if="item.qmrId && item.qmrId > 0" style="padding-top: 5px;">
{{ $t('form.qmyy') }}{{ $i18n.locale === 'zh_CN' ? item.jcmc : item.jcmcEn }}
</div>
<div v-if="item.qmrId && item.qmrId > 0" style="padding-top: 5px;">
{{ $t('form.signer') }}{{ item.qmrMc }}
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "JcgjExportList",
components: {},
props: {
showRy: {
type: Boolean,
default: false
},
showXg: {
type: Boolean,
default: false
},
showLc: {
type: Boolean,
default: true
},
showBj: {
type: Boolean,
default: true
},
showBcsm: {
type: Boolean,
default: false
},
//
showLj: {
type: Boolean,
default: false
},
readonly: {
type: Boolean,
default: false
},
},
data() {
return {
list: [],
queryParams: {
jcmc: '',
jcgjlx: -1
}
};
},
mounted() {
this.list = []
},
methods: {
handleQuery() {
this.$emit('handleQuery', this.queryParams)
},
init(val) {
let that = this
this.list = that.paseData(val)
},
add(val) {
let that = this
this.list.push(...that.paseData(val));
},
paseData(val) {
let tmp = []
_.forEach(val, function (a) {
let item = a
try {
item.jcnrList = JSON.parse(a.jcnr)
item.jcnrListEn = JSON.parse(a.jcnrEn)
} catch (e) {
item.jcnrList = []
item.jcnrListEn = []
}
// 135绿7
if (item.jcmcys == 1) {
item.color = '#409EFF'
}
else if (item.jcmcys == 3) {
item.color = '#F56C6C'
} else if (item.jcmcys == 5) {
item.color = '#67C23A'
} else if (item.jcmcys == 7) {
item.color = '#E6A23C'
}
tmp.push(item)
})
return tmp
}
}
};
</script>

+ 7
- 2
src/views/business/comps/template/TemplateTable.vue View File

@ -44,7 +44,8 @@ import Demo from "./comps/sp/Demo.vue";
import SYWZPZJHB from "./comps/gsp/SYWZPZJHB.vue";
import MJYLQSQD from "./comps/gsp/MJYLQSQD.vue";
// PCR
import PCR001 from "./comps/pcr/PCR001.vue";
export default {
name: "TemplateTable",
@ -54,7 +55,9 @@ export default {
//
MJYLQSQD, SYWZPZJHB,
//
SP001, SP002, SP003, SP00456, SP008, SP009, SP010, SP011, SP012, SP013, SP014, SP015, SP016, SP017, SP018
SP001, SP002, SP003, SP00456, SP008, SP009, SP010, SP011, SP012, SP013, SP014, SP015, SP016, SP017, SP018,
// PCR
PCR001
},
props: {
sn: {
@ -100,6 +103,8 @@ export default {
//
'SYWZPZJHB': 'SYWZPZJHB',
'MJYLQSQD': 'MJYLQSQD',
//PCR
'PCR001': 'PCR001'
}
}
return this.componentMap || "Demo"

+ 332
- 0
src/views/business/comps/template/comps/pcr/PCR001.vue View File

@ -0,0 +1,332 @@
<!-- PCR分析溶液配制记录表 -->
<template>
<div>
<div class="detail-container">
<div class="detail-title"><img src="@/assets/images/detail-title.png">{{ formData.bdmc ||
$t('template.pcr.pcr001.title') }}<img src="@/assets/images/detail-title.png" /></div>
<div class="detail-content">
<div class="content">
<BaseInfoFormPackage fieldItemLabel="template.common.baseInfo" label="template.common.baseInfo"
ref="baseInfoRef" :formConfig="baseInfoFormConfig" :formData="formData" />
<TableList label="template.common.reagentInfo" :columns="sysjColumns" :dataSource="resource" />
<TableList label="template.common.wzInfo" :columns="sywzColumns" :dataSource="resourceWz" v-if="resourceWz.length>0"/>
<TableList label="template.common.instrumentInfo" :columns="yqColumns" :dataSource="yqResource" />
<BaseInfoFormPackage fieldItemLabel="template.common.storageCondition"
label="template.common.storageCondition" ref="storageConditionRef"
:formConfig="storageFormConfig" :formData="formData" />
<LineLabel label="template.common.operationSteps" />
<div class="template-form-item">
<el-button class="print-btn" v-if="fillType === 'actFill'" type="primary"
@click="printTag">标签打印</el-button>
<BaseInfoFormPackage fieldItemLabel="template.common.operationSteps" ref="stepFormPackageRef"
:formConfig="stepFormConfig" @blur="onHandleBlur" :formData="formData" />
</div>
<Step ref="stepRef" :formData="formData.stepData"></Step>
<BaseInfoFormPackage fieldItemLabel="template.common.remark" label="template.common.remark"
ref="remarkRef" :formConfig="remarkConig" :formData="formData" />
</div>
</div>
</div>
<!-- <button @click="onSave">保存</button> -->
</div>
</template>
<script>
import BaseInfoFormPackage from "@/components/Template/BaseInfoFormPackage";
import LineLabel from "@/components/Template/LineLabel";
import TableList from "@/components/Template/Table";
import Step from "@/components/Template/Step";
import templateMixin from "../../mixins/templateMixin";
import CustomTable from '@/components/Template/CustomTable.vue';
import { getLatestSn } from '@/api/template';
import { EventBus } from "@/utils/eventBus";
import { uniqeResource } from "@/utils/calUnitTools";
import { debounce } from 'lodash-es'
export default {
name: "PCR001",
components: { BaseInfoFormPackage, LineLabel, TableList, Step, CustomTable },
mixins: [templateMixin],
props: {
fillType: {
type: String,
default: 'preFill',
},
},
computed: {
//
storageFormConfig() {
return [
{
type: "conditionItem",
config: {
storageCondition: {
label: 'template.common.storageConditionLabel',
type: "select",
fillType: "preFill",
options: this.getDictOptions("business_cctj"),
otherCode: "storageConditionOther",
},
}
}
];
},
//
remarkConig() {
return [
{
type: "cellItem",
config: {
remark: {
label: "",
type: "textarea",
fillType: "actFill",
span: 1,
placeholder: 'template.common.remarkPlaceholder',
maxlength: 1000,
rows: 5
}
}
}
]
},
//
baseInfoFormConfig() {
return [
{
type: "cardItem",
config: {
studyMc: {
label: 'template.common.testName',
type: "input",
disabled: true,
},
studySn: {
label: 'template.common.testNumber',
type: "input",
disabled: true,
},
methodCode: {
label: 'template.common.methodCode',
type: "input",
fillType: "preFill",
maxlength: 50
},
versionNum: {
label: 'template.common.versionNumber',
type: "inputNumber",
fillType: "actFill",
prepend: "V",
maxlength: 50
},
}
},
{
type: "conditionItem",
label: 'template.common.testConfigurationConditions',
config: {
pre: {
label: 'template.common.preFill',
type: "select",
multiple: true,
fillType: "preFill",
options: this.getDictOptions('business_pztj'),
otherCode: "preOther",
},
act: {
label: 'template.common.actualFill',
type: "select",
fillType: "actFill",
otherCode: "actOther",
multiple: true,
compareTo: "pre",
options: this.getDictOptions('business_pztj')
}
}
},
{
type: "cellItem",
label: 'template.common.configurationTime',
config: {
startDate: {
label: 'template.common.startTime',
type: "input",
},
endDate: {
label: 'template.common.endTime',
type: "input",
},
}
}
]
},
//
stepFormConfig() {
return [
{
type: "step",
config: {
targetName: {
label: 'template.common.targetSolutionName',
type: "input",
fillType: "preFill",
maxlength: 50
},
targetCode: {
label: 'template.common.targetSolutionCode',
type: "input",
subType: "span",
fillType: "preFill",
subKey: "targetCodeSn",
maxlength: 20
},
targetPreConcentration: {
label: 'template.common.targetPreConcentration',
type: "inputNumber",
subType: "select",
subKey: "targetPreConcentrationUnit",
fillType: "preFill",
subOptions: this.getDictOptions('business_nddw'),
maxlength: 10,
selectTo: "targetActConcentrationUnit",//
},
targetActConcentration: {
label: 'template.common.targetActConcentration',
type: "inputNumber",
subType: "select",
subKey: "targetActConcentrationUnit",
compareTo: "targetPreConcentration",//
fillType: "actFill",
subFillType: "preFill",
subOptions: this.getDictOptions('business_nddw'),
copyFrom: "targetPreConcentration",//
maxlength: 10
},
targetPreVolume: {
label: 'template.common.targetPreVolume',
type: "inputNumber",
subType: "select",
subKey: "targetPreVolumeUnit",
subOptions: this.getDictOptions('business_tjdw'),
fillType: "preFill",
maxlength: 10,
selectTo: "targetActVolumeUnit",//
},
targetActVolume: {
label: 'template.common.targetActVolume',
type: "inputNumber",
subType: "select",
subKey: "targetActVolumeUnit",
fillType: "actFill",
subFillType: "preFill",
subOptions: this.getDictOptions('business_tjdw'),
compareTo: "targetPreVolume",//
copyFrom: "targetPreVolume",//
maxlength: 10
},
effectivePeriod: {
label: 'template.common.effectivePeriod',
type: "inputNumber",
subType: "select",
subKey: "effectivePeriodUnit",
fillType: "preFill",
subOptions: this.getDictOptions('business_yxqdw'),
maxlength: 10
},
expireDate: {
label: 'template.common.expireDate',
type: "input",
},
}
}
]
},
},
data() {
return {
formData: {}
};
},
mounted() {
const formData = this.getFormDataByTemplateData();
if(!formData.targetCodeSn&& this.fillType === "actFill"){
this.getCode(formData);
}
},
methods: {
//
printTag() {
const printConfig = this.getBasePrintConfig();
const { storageCondition, targetCodeSn } = this.formData;
printConfig["存储条件"] = storageCondition;
printConfig["编号"] = targetCodeSn;
EventBus.$emit('showTagPrintDialog', { printConfig })
},
//
getCode: debounce(async function (v) {
const result = await getLatestSn({
count: 1,
pre:v.targetCode,
type:1
})
if (result.code == 200) {
this.$refs.stepFormPackageRef.updateFormData("targetCodeSn", result.data[0])
}
}, 100),
//
getFilledFormData() {
return this.getFilledFormDataByRefs(["baseInfoRef", "storageConditionRef", "stepFormPackageRef", "stepRef", "remarkRef"])
},
//
async getFormData() {
let content = await this.validFormFields(["baseInfoRef", "storageConditionRef", "stepFormPackageRef", "stepRef", "remarkRef"]);
//resource
let tmpResource = []
if (this.fillType === "actFill") {
//
tmpResource.push({
mc: content.targetName,
bh: content.targetCode + content.targetCodeSn,
ph: '',
ndz: content.targetActConcentration + content.targetActConcentrationUnit,
nd: content.targetActConcentration,
nddw: content.targetActConcentrationUnit,
ly: 'ELN配制',
sxrq: content.expireDate,
kc: content.targetActVolume,
kcdw: content.targetActVolumeUnit,
syl: null,
type: null,
elnType: this.product,
syldw: content.targetActVolumeUnit,
yxzq: content.effectivePeriod,
yxzqdw: content.effectivePeriodUnit,
})
}
//使
const stepResource = this.$refs.stepRef.getStepResource()
this.resourceTmp =uniqeResource(tmpResource,stepResource.sjResource||[])
this.yqResourceTmp = stepResource.yqResource||[]
return content;
},
//
async onSave() {
let content = this.$refs.stepRef.getStepResource();
console.log(content);
},
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
.mt-20 {
margin-top: 20px;
}
.print-btn {
margin-bottom: 20px;
}
</style>

+ 2
- 2
src/views/business/comps/template/comps/sp/SP00456.vue View File

@ -34,7 +34,7 @@
:ref="`ladderStepFormPackageRef_${ladderIndex}`" :formConfig="ladderStepFormConfig"
:formData="ladderConfig" fieldItemLabel="阶梯配制" :prefixKey="'ladder_' + ladderIndex" />
<CustomTable @blur="(e) => onHandleTableBlur('ladder', ladderIndex, e)"
:ref="`ladderStepTableRef_${ladderIndex}`" :columns="ladderStepColumns"
:ref="`ladderStepTableRef_${ladderIndex}`" :showOperation="fillType === 'actFill'" :columns="ladderStepColumns"
:formData="ladderConfig" :prefixKey="'ladder_' + ladderIndex" fieldItemLabel="阶梯配制">
<template slot="operation" slot-scope="{ row, rowIndex, columns }">
<TableOpertaion @printTag="(e) => printTag(e, 'ladderConfigs', ladderIndex)"
@ -67,7 +67,7 @@
:ref="`paralleStepFormPackageRef_${paralleIndex}`" :formConfig="paralleStepFormConfig"
:formData="paralleConfig" :prefixKey="'paralle' + paralleIndex" fieldItemLabel="平行配制" />
<CustomTable @blur="(e) => onHandleTableBlur('paralle', paralleIndex, e)"
:ref="`paralleStepTableRef_${paralleIndex}`" :columns="paralleStepColumns"
:ref="`paralleStepTableRef_${paralleIndex}`" :showOperation="fillType === 'actFill'" :columns="paralleStepColumns"
@clickable="(e, tableRowIndex, rowData) => handleTableClickable('paralle', paralleIndex, e, tableRowIndex, rowData)"
:formData="paralleConfig" :prefixKey="'paralle' + paralleIndex" fieldItemLabel="平行配制">
<template slot="operation" slot-scope="{ row, rowIndex, columns }">

+ 25
- 0
src/views/business/comps/template/formConfig/paralleAndLadderConfig.js View File

@ -9,6 +9,7 @@ export const getLadderColumnsConfig = ($this) => {
bodySubKey: 'subTargetSolutionCode',
bodyFillType: 'preFill',
width: 280,
showWidth: 180,
myCodeFields: ["targetSolutionCode", "subTargetSolutionCode"],//分装的母液编号字段
maxVolumeField: "actSolutionVolume",//分装的最大量字段
maxVolumeFieldUnit: "actSolutionVolumeUnit",//分装的最大量单位字段
@ -17,6 +18,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.qsrybh',
prop: 'startSolutionCode',
width: 280,
showWidth: 180,
bodyType: 'input',
bodyFillType: 'actFill',
bodyMaxlength: 10
@ -25,6 +27,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysqsrytj',
prop: 'targetStartSolutionVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'targetStartSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -43,6 +46,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjqsrytj',
prop: 'actStartSolutionVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'actStartSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -56,6 +60,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysxsytj',
prop: 'targetDiluentVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'targetDiluentVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -75,6 +80,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjxsytj',
prop: 'actDiluentVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'actDiluentVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -88,6 +94,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysmbrynd',
prop: 'targetSolutionConcentration',
width: 280,
showWidth: 180,
headerSelectKey: 'targetSolutionConcentrationUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_nddw'),
@ -99,6 +106,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjmbrynd',
prop: 'actSolutionConcentration',
width: 280,
showWidth: 180,
headerSelectKey: 'actSolutionConcentrationUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_nddw'),
@ -119,6 +127,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysmbrytj',
prop: 'targetSolutionVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'targetSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -130,6 +139,7 @@ export const getLadderColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjmbrytj',
prop: 'actSolutionVolume',
width: 280,
showWidth: 180,
headerSelectKey: 'actSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -169,12 +179,14 @@ export const getParallelColumnsConfig = ($this) => {
myCodeFields: ["targetSolutionCode", "subTargetSolutionCode"],//分装的母液编号字段
maxVolumeField: "actSolutionVolume",//分装的最大量字段
maxVolumeFieldUnit: "actSolutionVolumeUnit",//分装的最大量单位字段
showWidth: 180,
width: 280
},
{
label: 'template.sp.sp00456.ysmbrynd',
prop: 'targetSolutionConcentration',
width: 280,
showWidth: 120,
headerSelectKey: 'targetSolutionConcentrationUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_nddw'),
@ -186,6 +198,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjmbrynd',
prop: 'actSolutionConcentration',
width: 280,
showWidth: 120,
headerSelectKey: 'actSolutionConcentrationUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_nddw'),
@ -205,6 +218,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysmbrytj',
prop: 'targetSolutionVolume',
width: 280,
showWidth: 120,
headerSelectKey: 'targetSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -216,6 +230,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjmbrytj',
prop: 'actSolutionVolume',
width: 280,
showWidth: 120,
headerSelectKey: 'actSolutionVolumeUnit',
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
@ -235,6 +250,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.mbryyxzq',
prop: 'targetSolutionCycle',
width: 280,
showWidth: 160,
fillType: 'preFill',
bodyType: 'inputNumber',
bodySubType: 'select',
@ -248,6 +264,7 @@ export const getParallelColumnsConfig = ($this) => {
{
label: 'template.sp.sp00456.mbrysxr',
prop: 'targetSolutionExpirationDate',
showWidth: 120,
width: 180,
bodyType: 'span'
},
@ -255,6 +272,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysysrybh',
prop: 'startSolutionCode',
width: 280,
showWidth: 120,
bodyType: 'input',
bodyFillType: 'preFill'
},
@ -262,6 +280,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjysrybh',
prop: 'actStartSolutionCode',
width: 280,
showWidth: 180,
bodyType: 'clickable',
bodyFillType: 'actFill',
compareTo: 'startSolutionCode', //比较哪个字段
@ -270,6 +289,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.ysysrynd',
prop: 'targetStartSolutionConcentration',
width: 280,
showWidth: 160,
bodyType: 'inputNumber',
bodyFillType: 'preFill',
bodySubType: 'select',
@ -283,6 +303,7 @@ export const getParallelColumnsConfig = ($this) => {
label: 'template.sp.sp00456.sjysrynd',
prop: 'targetAcSolution',
width: 280,
showWidth: 120,
bodyType: 'inputNumber',
bodyFillType: 'actFill',
bodyDisabled: true,
@ -295,6 +316,7 @@ export const getParallelColumnsConfig = ($this) => {
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
width: 280,
showWidth: 120,
bodyType: 'inputNumber',
bodyFillType: 'preFill',
bodySubType: 'inputNumber',
@ -316,6 +338,7 @@ export const getParallelColumnsConfig = ($this) => {
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
width: 280,
showWidth: 120,
bodyType: 'inputNumber',
bodyFillType: 'actFill',
bodyMaxlength: 10,
@ -330,6 +353,7 @@ export const getParallelColumnsConfig = ($this) => {
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
width: 280,
showWidth: 120,
bodyType: 'inputNumber',
bodyFillType: 'preFill',
bodySubType: 'inputNumber',
@ -348,6 +372,7 @@ export const getParallelColumnsConfig = ($this) => {
fillType: 'preFill',
headerOptions: $this.getDictOptions('business_tjdw'),
width: 280,
showWidth: 120,
bodyType: 'inputNumber',
bodyFillType: 'actFill',
bodyMaxlength: 10,

+ 12
- 56
src/views/business/study/comp/jhbd/Xq.vue View File

@ -61,7 +61,7 @@
<div class="line"></div>
<div class="subtitle"> {{ $t('page.business.study.studyFormPlan.jcgj') }}</div>
</div>
<JcgjList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
<JcgjExportList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
</div>
</div>
<div v-if="showExport" id="watermark-overlay" ref="watermarkContainer" :style="{
@ -152,12 +152,13 @@
import { studyFormPlan_jcgjqmxxList, studyFormPlan_tb, studyFormPlan_info, studyFormPlan_jcgj, studyFormPlan_qmxx, studyFormPlan_exportDetail } from "@/api/business/study/studyFormPlan"
import { mapGetters } from 'vuex'
import JcgjList from "@/views/business/comps/common/JcgjList";
import JcgjExportList from "@/views/business/comps/common/JcgjExportList";
import TemplateTable from '@/views/business/comps/template/TemplateTable';
import moment from "moment";
import VueHtml2pdf from 'vue-html2pdf'
export default {
name: "Xq",
components: { JcgjList, TemplateTable, VueHtml2pdf },
components: { JcgjExportList,JcgjList, TemplateTable, VueHtml2pdf },
data() {
return {
watermarkText:'',
@ -267,7 +268,9 @@ export default {
this.updateWatermark()
this.$refs.jcgjExportList.init(this.jcgjExportList)
setTimeout(() => {
this.$refs.html2Pdf.generatePdf()
this.$refs.html2Pdf.generatePdf({
margin:[20,10,20,10]
})
}, 200);
})
},
@ -277,10 +280,9 @@ export default {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
//
const rect = this.$refs.contentArea.getBoundingClientRect()
canvas.width = rect.width
canvas.height = rect.height
// canvas
canvas.width = 300;
canvas.height = 300;
//
ctx.fillStyle = `rgba(100, 100, 100, ${this.watermarkOpacity})`
@ -297,10 +299,11 @@ export default {
ctx.translate(canvas.width / 2, canvas.height / 2)
ctx.rotate(-Math.PI / 4) // 45
let time=moment().format("YYYY-MM-DD HH:mm:ss")
for (let x = -canvas.width; x < canvas.width * 2; x += stepX) {
for (let y = -canvas.height; y < canvas.height * 2; y += stepY) {
//
const dynamicText = `${this.watermarkText} - ${this.getCurrentTime()}`
const dynamicText = `${this.watermarkText} - ${time}`
ctx.fillText(dynamicText, x, y)
}
}
@ -321,10 +324,6 @@ export default {
z-index: 9999;
`
//
this.$refs.contentArea.style.position = 'relative'
this.$refs.contentArea.appendChild(watermarkLayer)
//
setTimeout(() => resolve(), 100)
})
@ -415,6 +414,7 @@ export default {
width: 100%;
background: #f9f9ff;
font-size: 0.96rem;
page-break-inside: avoid;
font-weight: bold;
padding-left: 10px;
height: 40px;
@ -482,55 +482,11 @@ export default {
background-color: #f2f2f2;
}
.datatable {
border-collapse: collapse;
width: 100%;
}
.upload-file-list .el-upload-list__item {
margin-bottom: 0px !important;
}
.datatable thead {
border-left: 1px solid #d0d0d0;
}
.datatable th {
padding: 5px 5px 4px 5px;
max-width: 200px;
line-height: 35px;
text-align: center;
color: #414753;
background: #F5F7FA;
border: 1px solid #d0d0d0;
}
.el-dialog__body {
padding: 10px 20px !important;
}
.datatable th.operate {
padding: 5px 5px 4px 5px;
width: 100px;
line-height: 35px;
background: #F5F7FA;
border: 1px solid #d0d0d0;
text-align: center;
}
.datatable .rowAlt td,
.datatable tbody tr:nth-child(2n) td {
background: #F5F7FA;
}
.datatable td {
border: solid 1px #d0d0d0;
padding: 3px 5px 4px 5px;
max-width: 100px;
color: #414753;
line-height: 35px;
text-align: center;
}
.html2pdf__page-break {
display: none !important;

+ 12
- 51
src/views/business/study/comp/sqbd/Xq.vue View File

@ -61,7 +61,7 @@
<div class="line"></div>
<div class="subtitle"> {{ $t('page.business.study.studyFormApply.jcgj') }}</div>
</div>
<JcgjList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
<JcgjExportList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
</div>
</div>
<div v-if="showExport" id="watermark-overlay" ref="watermarkContainer" :style="{
@ -152,12 +152,13 @@
import { studyFormApply_jcgjqmxxList, studyFormApply_tb, studyFormApply_info, studyFormApply_jcgj, studyFormApply_qmxx, studyFormApply_exportDetail } from "@/api/business/study/studyFormApply"
import { mapGetters } from 'vuex'
import JcgjList from "@/views/business/comps/common/JcgjList";
import JcgjExportList from "@/views/business/comps/common/JcgjExportList";
import TemplateTable from '@/views/business/comps/template/TemplateTable';
import moment from "moment";
import VueHtml2pdf from 'vue-html2pdf'
export default {
name: "Xq",
components: { JcgjList, TemplateTable, VueHtml2pdf },
components: { JcgjExportList,JcgjList, TemplateTable, VueHtml2pdf },
data() {
return {
watermarkText:'',
@ -267,7 +268,9 @@ export default {
this.updateWatermark()
this.$refs.jcgjExportList.init(this.jcgjExportList)
setTimeout(() => {
this.$refs.html2Pdf.generatePdf()
this.$refs.html2Pdf.generatePdf({
margin:[20,10,20,10]
})
}, 200);
})
},
@ -277,10 +280,9 @@ export default {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
//
const rect = this.$refs.contentArea.getBoundingClientRect()
canvas.width = rect.width
canvas.height = rect.height
// canvas
canvas.width = 300;
canvas.height = 300;
//
ctx.fillStyle = `rgba(100, 100, 100, ${this.watermarkOpacity})`
@ -297,10 +299,11 @@ export default {
ctx.translate(canvas.width / 2, canvas.height / 2)
ctx.rotate(-Math.PI / 4) // 45
let time=moment().format("YYYY-MM-DD HH:mm:ss")
for (let x = -canvas.width; x < canvas.width * 2; x += stepX) {
for (let y = -canvas.height; y < canvas.height * 2; y += stepY) {
//
const dynamicText = `${this.watermarkText} - ${this.getCurrentTime()}`
const dynamicText = `${this.watermarkText} - ${time}`
ctx.fillText(dynamicText, x, y)
}
}
@ -321,9 +324,6 @@ export default {
z-index: 9999;
`
//
this.$refs.contentArea.style.position = 'relative'
this.$refs.contentArea.appendChild(watermarkLayer)
//
setTimeout(() => resolve(), 100)
@ -418,6 +418,7 @@ export default {
font-weight: bold;
padding-left: 10px;
height: 40px;
page-break-inside: avoid;
line-height: 40px;
display: flex;
justify-content: flex-start;
@ -482,56 +483,16 @@ export default {
background-color: #f2f2f2;
}
.datatable {
border-collapse: collapse;
width: 100%;
}
.upload-file-list .el-upload-list__item {
margin-bottom: 0px !important;
}
.datatable thead {
border-left: 1px solid #d0d0d0;
}
.datatable th {
padding: 5px 5px 4px 5px;
max-width: 200px;
line-height: 35px;
text-align: center;
color: #414753;
background: #F5F7FA;
border: 1px solid #d0d0d0;
}
.el-dialog__body {
padding: 10px 20px !important;
}
.datatable th.operate {
padding: 5px 5px 4px 5px;
width: 100px;
line-height: 35px;
background: #F5F7FA;
border: 1px solid #d0d0d0;
text-align: center;
}
.datatable .rowAlt td,
.datatable tbody tr:nth-child(2n) td {
background: #F5F7FA;
}
.datatable td {
border: solid 1px #d0d0d0;
padding: 3px 5px 4px 5px;
max-width: 100px;
color: #414753;
line-height: 35px;
text-align: center;
}
.html2pdf__page-break {
display: none !important;
}

+ 26
- 83
src/views/business/study/comp/tbbd/Xq.vue View File

@ -26,7 +26,7 @@
<el-button type="primary" @click="exportExcel(999)">{{ $t('page.business.study.studyFormFill.dcbhsjgj') }}
</el-button>
<div class="edit-content">
<div class="detail-content" style="width: 100%; height: 100%;">
<div class="detail-content" style="width: 100%; height: 100%; padding: 0px 10px;">
<vue-html2pdf :show-layout="true" pdf-content-width="100%" :pdf-format="form.templatePdfSize" :pdf-quality="2"
:float-layout="false" pdf-orientation="landscape" :paginate-elements-by-height="0" :enable-download="true"
:preview-modal="false" :filename="form.bdmc" @beforeDownload="addDynamicWatermark" ref="html2Pdf"
@ -61,10 +61,10 @@
<div class="line"></div>
<div class="subtitle"> {{ $t('page.business.study.studyFormFill.jcgj') }}</div>
</div>
<JcgjList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
<JcgjExportList ref="jcgjExportList" :readonly="true" v-show="jcgjlxExport != 999" />
</div>
</div>
<div v-if="showExport" id="watermark-overlay" ref="watermarkContainer" :style="{
<div v-if="showExport" id="watermark-overlay" ref="watermarkContainer" :style="{
'--watermark-text': `'${watermarkText}'`,
'--watermark-opacity': opacity,
'--watermark-size': '14px',
@ -72,7 +72,7 @@
}"></div>
</section>
</vue-html2pdf>
<div style="padding: 0px 20px 0px 30px;margin-left: 10px;">
<div style="margin-left: 20px;">
<div class="content-title">
<div class="line"></div>
<div class="subtitle"> {{ $t('page.business.study.studyFormFill.qmxx') }}</div>
@ -152,15 +152,16 @@
import { studyFormFill_jcgjqmxxList, studyFormFill_tb, studyFormFill_info, studyFormFill_jcgj, studyFormFill_qmxx, studyFormFill_exportDetail } from "@/api/business/study/studyFormFill"
import { mapGetters } from 'vuex'
import JcgjList from "@/views/business/comps/common/JcgjList";
import JcgjExportList from "@/views/business/comps/common/JcgjExportList";
import TemplateTable from '@/views/business/comps/template/TemplateTable';
import moment from "moment";
import VueHtml2pdf from 'vue-html2pdf'
export default {
name: "Xq",
components: { JcgjList, TemplateTable, VueHtml2pdf },
components: { JcgjExportList, JcgjList, TemplateTable, VueHtml2pdf },
data() {
return {
watermarkText:'',
watermarkText: '',
opacity: 0.8,
watermarkOpacity: 0.8,
watermarkSize: 40,
@ -225,7 +226,7 @@ export default {
methods: {
updateWatermark() {
//
const text = this.nickName +' '+ moment().format("YYYY-MM-DD HH:mm:ss");
const text = this.nickName + ' ' + moment().format("YYYY-MM-DD HH:mm:ss");
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
@ -267,7 +268,14 @@ export default {
this.updateWatermark()
this.$refs.jcgjExportList.init(this.jcgjExportList)
setTimeout(() => {
this.$refs.html2Pdf.generatePdf()
this.$refs.html2Pdf.generatePdf({
margin: {
top: 20,
right: 15,
bottom: 20,
left: 15
},
})
}, 200);
})
},
@ -277,10 +285,10 @@ export default {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
//
const rect = this.$refs.contentArea.getBoundingClientRect()
canvas.width = rect.width
canvas.height = rect.height
// canvas
canvas.width = 300;
canvas.height = 300;
//
ctx.fillStyle = `rgba(100, 100, 100, ${this.watermarkOpacity})`
@ -296,11 +304,11 @@ export default {
ctx.save()
ctx.translate(canvas.width / 2, canvas.height / 2)
ctx.rotate(-Math.PI / 4) // 45
let time=moment().format("YYYY-MM-DD HH:mm:ss")
for (let x = -canvas.width; x < canvas.width * 2; x += stepX) {
for (let y = -canvas.height; y < canvas.height * 2; y += stepY) {
//
const dynamicText = `${this.watermarkText} - ${this.getCurrentTime()}`
const dynamicText = `${this.watermarkText} - ${time}`
ctx.fillText(dynamicText, x, y)
}
}
@ -321,9 +329,6 @@ export default {
z-index: 9999;
`
//
this.$refs.contentArea.style.position = 'relative'
this.$refs.contentArea.appendChild(watermarkLayer)
//
setTimeout(() => resolve(), 100)
@ -418,6 +423,7 @@ export default {
font-weight: bold;
padding-left: 10px;
height: 40px;
page-break-inside: avoid;
line-height: 40px;
display: flex;
justify-content: flex-start;
@ -444,11 +450,12 @@ export default {
padding: 0px;
font-family: Arial, sans-serif;
}
#watermark-overlay {
position: absolute;
top: 0;
top: -80px;
left: 0;
width: 100%;
height: 100%;
@ -465,74 +472,10 @@ export default {
padding-bottom: 10px;
}
.pdf-content table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.pdf-content th,
.pdf-content td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
.pdf-content th {
background-color: #f2f2f2;
}
.datatable {
border-collapse: collapse;
width: 100%;
page-break-inside: avoid;
}
.upload-file-list .el-upload-list__item {
margin-bottom: 0px !important;
}
.datatable thead {
border-left: 1px solid #d0d0d0;
}
.datatable th {
padding: 5px 5px 4px 5px;
max-width: 200px;
line-height: 35px;
text-align: center;
color: #414753;
background: #F5F7FA;
border: 1px solid #d0d0d0;
}
.el-dialog__body {
padding: 10px 20px !important;
}
.datatable th.operate {
padding: 5px 5px 4px 5px;
width: 100px;
line-height: 35px;
background: #F5F7FA;
border: 1px solid #d0d0d0;
text-align: center;
}
.datatable .rowAlt td,
.datatable tbody tr:nth-child(2n) td {
background: #F5F7FA;
}
.datatable td {
border: solid 1px #d0d0d0;
padding: 3px 5px 4px 5px;
max-width: 100px;
color: #414753;
line-height: 35px;
text-align: center;
}
.html2pdf__page-break {
display: none !important;
}

+ 2
- 2
src/views/business/systemLog/comp/czrz.vue View File

@ -133,9 +133,9 @@ export default {
_.forEach(list,(o,index)=>{
nr+=o.name+':'+o.value+(index===list.length-1?'':';')
})
return (row.name?('【'+row.name+'】'): '')+nr+(row.remark?(';'+this.$t('form.remark')+":"+row.remark):'')
return (row.nameEn?('【'+row.nameEn+'】'): '')+nr+(row.remark?(';'+this.$t('form.remark')+":"+row.remark):'')
}else{
return (row.name?('【'+row.name+'】'): '')+(row.jcnrEn || '')+(row.remark?(';'+this.$t('form.remark')+":"+row.remark):'')
return (row.nameEn?('【'+row.nameEn+'】'): '')+(row.jcnrEn || '')+(row.remark?(';'+this.$t('form.remark')+":"+row.remark):'')
}
}
},

+ 4
- 0
src/views/system/menu/index.vue View File

@ -435,6 +435,8 @@ export default {
},
/** 新增按钮操作 */
handleAdd(row) {
debugger
// this.saveSimpleLog({name:'',nameEn:'',jcmc:'',jcmcEn:'Add Menu'})
this.reset()
this.getTreeselect()
if (row != null && row.menuId) {
@ -455,6 +457,7 @@ export default {
},
/** 修改按钮操作 */
handleUpdate(row) {
// this.saveSimpleLog({name:row.menuName,nameEn:row.menuName,jcmc:'',jcmcEn:'Edit Menu'})
this.reset()
this.getTreeselect()
getMenu(row.menuId).then(response => {
@ -485,6 +488,7 @@ export default {
},
/** 删除按钮操作 */
handleDelete(row) {
// this.saveSimpleLog({name:row.menuName,nameEn:row.menuName,jcmc:'',jcmcEn:'Remove Menu'})
this.$modal.confirm(this.$t('form.confirmDelete')).then(function() {
return delMenu(row.menuId)
}).then(() => {

+ 45
- 5
src/views/system/role/index.vue View File

@ -307,16 +307,20 @@
<el-button @click="transferDialog.visible = false">{{$t('form.cancel')}}</el-button>
</div>
</el-dialog>
<Sign ref="signRef" @callback="doChangRoleUser" />
</div>
</template>
<script>
import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect,allocatedUserList,authUserSetAll } from "@/api/system/role"
import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu"
import Sign from '@/views/business/study/comp/sign.vue'
export default {
name: "Role",
dicts: ['sys_normal_disable'],
components:{Sign},
data() {
return {
//
@ -407,7 +411,9 @@ export default {
list:[],
selected:[],
roleId:''
roleId:'',
oldIdList:[]
}
}
@ -593,6 +599,9 @@ export default {
/** 修改按钮操作 */
handleUpdate(row,readonly) {
this.readonly = readonly
if(readonly){
this.saveSimpleLog({name:row.roleName,nameEn:row.roleName,jcmc:'角色详情',jcmcEn:'Role Detail'})
}
this.reset()
const roleId = row.roleId || this.ids
const roleMenu = this.getRoleMenuTreeselect(roleId)
@ -642,19 +651,22 @@ export default {
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
this.$modal.loading()
if (this.form.roleId != undefined) {
this.form.menuIds = this.getMenuAllCheckedKeys()
updateRole(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
}).finally(()=>{
this.$modal.closeLoading()
})
} else {
this.form.menuIds = this.getMenuAllCheckedKeys()
addRole(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
}).finally(()=>{
this.$modal.closeLoading()
})
}
}
@ -699,6 +711,8 @@ export default {
this.transferDialog.selected = response.selected
this.transferDialog.list = list
this.transferDialog.roleId = row.roleId
this.transferDialog.oldIdList = _.cloneDeep(response.selected)
this.transferDialog.visible = true
}
)
@ -707,9 +721,35 @@ export default {
return item.label.indexOf(query) > -1;
},
changRoleUser(){
authUserSetAll({ roleId: this.transferDialog.roleId, userIdList: this.transferDialog.selected && this.transferDialog.selected.length>0 ? this.transferDialog.selected:[] }).then(res => {
let update = false
let userIdList = this.transferDialog.selected && this.transferDialog.selected.length>0 ? this.transferDialog.selected:[]
if(this.transferDialog.oldIdList.length!==userIdList.length){
update = true
}else{
for(let i=0;i<this.transferDialog.oldIdList.length;i++){
if(_.findIndex(userIdList,o=>{return o===this.transferDialog.oldIdList[i]})==-1){
update = true
break
}
}
}
if(update){
this.$refs.signRef.show(
this.$t('page.system.role.fpjs'),
this.$t('page.system.role.fpjs'),
)
}else{
this.transferDialog.visible = false
})
}
},
doChangRoleUser(sign){
this.$modal.loading()
authUserSetAll({ roleId: this.transferDialog.roleId, userIdList: this.transferDialog.selected && this.transferDialog.selected.length>0 ? this.transferDialog.selected:[] ,sign:sign}).then(res => {
this.$refs.signRef.cancel()
this.transferDialog.visible = false
}).finally(()=>{
this.$modal.closeLoading()
})
}
}
}

+ 91
- 12
src/views/system/user/index.vue View File

@ -99,7 +99,7 @@
type="text"
@click="handleStatusChange(scope.row)"
v-hasPermi="['system:user:edit']"
v-hasPermi="['system:user:enable']"
v-if="scope.row.status==='0'"
>{{$t('page.system.user.disable')}}</el-button>
@ -107,15 +107,15 @@
type="text"
@click="handleStatusChange(scope.row)"
v-hasPermi="['system:user:edit']"
v-hasPermi="['system:user:enable']"
v-if="scope.row.status==='1'"
>{{$t('page.system.user.enable')}}</el-button>
<el-button
type="text"
@click="handleStatusChange(scope.row)"
v-hasPermi="['system:user:edit']"
@click="showRoleChange(scope.row)"
v-hasPermi="['system:user:roleChange']"
>{{$t('page.system.user.history')}}</el-button>
<el-button type="text" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']">删除</el-button>
@ -259,21 +259,42 @@
<el-button @click="upload.open = false"> </el-button>
</div>
</el-dialog>
<Sign ref="signRef" @callback="doUpdate" />
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="$t('page.system.user.history')" :visible.sync="changeDialog.visible" width="70%" append-to-body>
<el-table v-loading="changeDialog.loading" :data="changeDialog.list">
<el-table-column :label="$t('form.signer')" prop="qmrMc" width="150" />
<el-table-column :label="$t('form.qmyy')" :prop="$i18n.locale === 'zh_CN'?'jcmc':'jcmcEn'" width="150" />
<el-table-column :label="$t('form.signTime')" prop="createTime" width="150" />
<el-table-column :label="$t('page.system.user.bgqjs')" prop="bgq" />
<el-table-column :label="$t('page.system.user.bgqjs')" prop="bgh" />
</el-table>
<pagination
v-show="changeDialog.total>0"
:total="changeDialog.total"
:page.sync="changeDialog.searchForm.pageNum"
:limit.sync="changeDialog.searchForm.pageSize"
@pagination="getChangeList"
/>
</el-dialog>
</div>
</template>
<script>
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect } from "@/api/system/user"
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus, deptTreeSelect,roleChangeList,roleChangeExport } from "@/api/system/user"
import { getToken } from "@/utils/auth"
import Treeselect from "@riophae/vue-treeselect"
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
import { Splitpanes, Pane } from "splitpanes"
import "splitpanes/dist/splitpanes.css"
import Sign from '@/views/business/study/comp/sign.vue'
export default {
name: "User",
dicts: ['sys_normal_disable', 'sys_user_sex'],
components: { Treeselect, Splitpanes, Pane },
components: { Treeselect, Splitpanes, Pane,Sign },
data() {
return {
//
@ -389,6 +410,20 @@ export default {
// trigger: "blur"
// }
// ]
},
oldRoleIdList:[],
changeDialog:{
visible:false,
searchForm:{
userId:'',
pageSize:10,
pageNum:1
},
loading:false,
total:0,
list:[]
}
}
},
@ -481,6 +516,7 @@ export default {
postIds: [],
roleIds: []
}
this.oldRoleIdList = []
this.resetForm("form")
},
/** 搜索按钮操作 */
@ -532,6 +568,7 @@ export default {
const userId = row.userId || this.ids
getUser(userId).then(response => {
this.form = response.data
this.oldRoleIdList = _.cloneDeep(response.roleIds)
this.postOptions = response.posts
this.roleOptions = response.roles
this.$set(this.form, "postIds", response.postIds)
@ -570,14 +607,27 @@ export default {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.userId != undefined) {
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
let updateRole = false;
if(this.oldRoleIdList.length!==this.form.roleIds.length){
updateRole = true
}else{
for(let i=0;i<this.oldRoleIdList.length;i++){
if(_.findIndex(this.form.roleIds,o=>{return o==this.oldRoleIdList[i]})==-1){
updateRole = true
break
}
}
}
if(updateRole){
this.$refs.signRef.show(
this.$t('page.system.role.fpjs'),
this.$t('page.system.role.fpjs'),
)
}else{
this.doUpdate({})
}
} else {
addUser(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
@ -585,6 +635,16 @@ export default {
}
})
},
doUpdate(sign){
this.$modal.loading()
updateUser({user:this.form,sign:sign}).then(response => {
this.$refs.signRef.cancel()
this.open = false
this.getList()
}).finally(()=>{
this.$modal.closeLoading()
})
},
/** 删除按钮操作 */
handleDelete(row) {
const userIds = row.userId || this.ids
@ -637,6 +697,25 @@ export default {
return _.map(row.roles,'roleName').join(',')
}
return ''
},
showRoleChange(row){
this.saveSimpleLog({name:row.nickName,nameEn:row.nickName,jcmc:this.$t('page.system.user.history','zh_CN'),jcmcEn:this.$t('page.system.user.history','en_US')})
this.changeDialog.searchForm = {
userId:row.userId,
pageNum:1,
pageSize:10
}
this.changeDialog.visible = true
this.getChangeList()
},
getChangeList(){
this.changeDialog.loading = true;
roleChangeList(this.changeDialog.searchForm).then(response => {
this.changeDialog.list = response.rows;
this.changeDialog.total = response.total;
}).finally(()=>{
this.changeDialog.loading = false;
})
}
}
}

Loading…
Cancel
Save