Parcourir la source

人员个人档案

cyy il y a 1 an
Parent
commit
baf6ef560d
22 fichiers modifiés avec 5753 ajouts et 0 suppressions
  1. 26 0
      src/api/platform/personFile/base.js
  2. 14 0
      src/api/platform/personFile/unidirectionalCorrelation.js
  3. 265 0
      src/views/component/personnelFile/components/SCIwzglbTag.vue
  4. 253 0
      src/views/component/personnelFile/components/bmsmTag.vue
  5. 104 0
      src/views/component/personnelFile/components/dialogDeltail.vue
  6. 428 0
      src/views/component/personnelFile/components/gzjlTag.vue
  7. 425 0
      src/views/component/personnelFile/components/jbqkTag.vue
  8. 274 0
      src/views/component/personnelFile/components/jxjyxmxshdglbTag.vue
  9. 406 0
      src/views/component/personnelFile/components/jyjlTag.vue
  10. 256 0
      src/views/component/personnelFile/components/kjhjcgglbTag.vue
  11. 284 0
      src/views/component/personnelFile/components/kphdglbTag.vue
  12. 273 0
      src/views/component/personnelFile/components/kyxmglbTag.vue
  13. 272 0
      src/views/component/personnelFile/components/kyzlglbTag.vue
  14. 256 0
      src/views/component/personnelFile/components/kyzzglbTag.vue
  15. 266 0
      src/views/component/personnelFile/components/modulesTag.vue
  16. 290 0
      src/views/component/personnelFile/components/personnelInfo.vue
  17. 403 0
      src/views/component/personnelFile/components/zsbTag.vue
  18. 273 0
      src/views/component/personnelFile/components/zwlwglbTag.vue
  19. 71 0
      src/views/component/personnelFile/constants/option.js
  20. 428 0
      src/views/component/personnelFile/constants/simulated.js
  21. 486 0
      src/views/component/personnelFile/index.vue
  22. 0 0
      src/views/component/personnelFile/utils/seal.js

+ 26 - 0
src/api/platform/personFile/base.js

@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+import { DATA_URL } from '@/api/baseUrl'
+
+/**
+ * 获取人员基本信息
+ * @param {*} params
+ */
+export function getInfo (params) {
+    return request({
+        url: DATA_URL() + '/employee/employeeInfo/get',
+        method: 'get',
+        params: params
+    })
+}
+/**
+ * 保存人员基本信息
+ * @param {*} params
+ */
+export function setInfo (params) {
+    return request({
+        url: DATA_URL() + '/employee/employeeInfo/save',
+        method: 'post',
+        isLoading: true,
+        data: params
+    })
+}

+ 14 - 0
src/api/platform/personFile/unidirectionalCorrelation.js

@@ -0,0 +1,14 @@
+import request from '@/utils/request'
+import { DATA_URL } from '@/api/baseUrl'
+
+/**
+ * 获取科研等单一关联的数据
+ * @param {*} params
+ */
+export function get (params) {
+    return request({
+        url: DATA_URL() + '/employee/employeeInfo/queryResearches',
+        method: 'post',
+        data: params
+    })
+}

+ 265 - 0
src/views/component/personnelFile/components/SCIwzglbTag.vue

@@ -0,0 +1,265 @@
+<template>
+    <div class="SCIwzglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>SCI文章</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableSCI"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="论文题目"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("lunWenTiMu") > 0 ? scope.row.lunWenTiMu:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="期刊名称"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiKanMingCheng") > 0 ? scope.row.qiKanMingCheng:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="JCR分区"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiJuanHao") > 0 ? scope.row.qiJuanHao:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="影响因子IF"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("yingXiangYZIf") > 0 ? scope.row.yingXiangYZIf:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="原文"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.shangChuanYuan"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableSCI.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '文章编号', contant: val.wenZhangBianHao, type: 'text' }, { name: 'JCR分区', contant: val.qiJuanHao, type: 'text' }],
+                [{ name: '论文题目', contant: val.lunWenTiMu, type: 'text' }, { name: '影响因子IF', contant: val.yingXiangYZIf, type: 'text' }],
+                [{ name: '全部作者', contant: val.quanBuZuoZhe, type: 'text' }, { name: '作者排名', contant: val.childGeRenPaiMing, type: 'text' }],
+                [{ name: '期刊名称', contant: val.qiKanMingCheng, type: 'text' }, { name: '论文链接', contant: val.lunWenLianJie, type: 'text' }],
+                [{ name: '发表日期', contant: val.faBiaoShiJian, type: 'text' }, { name: 'WOS号', contant: val.wosHao, type: 'text' }],
+                [{ name: '原文', contant: val.shangChuanYuan, type: 'file' }, { name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.SCIwzglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 253 - 0
src/views/component/personnelFile/components/bmsmTag.vue

@@ -0,0 +1,253 @@
+<template>
+    <div class="bmsm20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>公正性、保密性</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableBMSM"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="签名时间"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("bianZhiShiJian") > 0 ? scope.row.bianZhiShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="声明"
+                    min-width="45%"
+                >
+                    <template slot-scope="scope">
+                        <div class="text-overflow">{{ scope.row.hasOwnProperty("shuoMing") > 0 ? scope.row.shuoMing:'/' }}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="附件"
+                    min-width="25%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.fuJian"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(this.$refs, `当前页: ${val}`)
+            this.$refs.reviewTableBMSM.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '签名日期', contant: val.bianZhiShiJian, type: 'text' }],
+                [{ name: '声明', contant: val.shuoMing, type: 'text' }],
+                [{ name: '附件', contant: val.fuJian, type: 'file' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.bmsm20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+            .text-overflow {
+                white-space: nowrap;
+                overflow: hidden;
+                text-overflow: ellipsis;
+
+            }
+
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 104 - 0
src/views/component/personnelFile/components/dialogDeltail.vue

@@ -0,0 +1,104 @@
+<!--
+ * @Author: cyy szjbdcyy@126.com
+ * @Date: 2024-11-14 18:05:33
+ * @LastEditors: cyy szjbdcyy@126.com
+ * @LastEditTime: 2024-12-06 15:52:02
+ * @FilePath: \zdqy_firm_former\src\views\component\personnelFile\components\dialogDeltail.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+<template>
+    <el-dialog
+        class="dialogSty"
+        title="详情"
+        :visible.sync="dialogDetails"
+        width="60%"
+        center
+        :show-close="false"
+        append-to-body
+    >
+        <el-row v-for="(item,i) in dialogData" :key="i" :gutter="24">
+            <el-col v-for="(e,t) in item" :key="'item'+t" :span="item.length<2?24:12">
+                <div class="rowSty">
+                    <div class="nameSty">{{ e.name }} </div>
+                    <div v-if="e.type==='text'" class="contant">{{ e.contant }}</div>
+                    <div v-else-if="e.type==='file'" class="contant">
+                        <ibps-attachment
+                            v-model="e.contant"
+                            :download="true"
+                            multiple
+                            accept="*"
+                            :readonly="true"
+                            style="width:100%"
+                            limlt="5"
+                        />
+                    </div>
+                </div>
+            </el-col>
+        </el-row>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="$emit('changeDetails',false)">关 闭</el-button>
+        </span>
+    </el-dialog>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+
+export default {
+    components: {
+        IbpsAttachment
+    },
+    props: {
+        dialogData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        dialogDetails: {
+            type: Boolean,
+            default: true
+        }
+    },
+    data () {
+        return {
+
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.dialogSty{
+    // height: 50vh;
+    ::v-deep .el-dialog.el-dialog--center{
+        height: 70%;
+        .el-dialog__body{
+            height: 83%;
+            overflow-y: auto;
+            padding-top: 15px !important;
+            .el-row {
+                margin: 0 0 20px !important;
+                display: flex;
+                align-items: baseline;
+                // &:last-child {
+                //     margin-bottom: 0;
+                // }
+                .rowSty{
+                    display: flex;
+                    justify-content: space-between;
+                    margin: 1%;
+                    align-items: center;
+                    .nameSty{
+                        width: 120px;
+                    }
+                    .contant{
+                        width: calc(100% - 120px);
+                        min-height: 1em;
+                        border-bottom: 1px solid #e5e5e5;
+                    }
+                }
+            }
+        }
+    }
+
+}
+</style>

+ 428 - 0
src/views/component/personnelFile/components/gzjlTag.vue

@@ -0,0 +1,428 @@
+<template>
+    <div class="gzjl20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>工作经历</span>
+        </div>
+        <div class="hand-btn" :style="judgeTag()?'height:10px;':'height:5.5%;'">
+            <el-button v-if="!judgeTag()" type="primary" size="mini" icon="el-icon-plus" @click="addData">添加</el-button>
+            <el-button v-if="!judgeTag()" type="danger" size="mini" icon="el-icon-close" @click="goRemove">删除</el-button>
+        </div>
+        <!-- <div class="contentAll"> -->
+        <el-form ref="nowData" :model="nowDataObj" :rules="rules" label-width="0px" class="contentAll">
+            <el-table
+                ref="reviewTable"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                :row-key="getRowKey"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="入职时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("ruZhiShiJian") > 0 ? scope.row.ruZhiShiJian:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.ruZhiShiJian'" :rules="rules.bianzhiriqi">
+                                <el-date-picker
+                                    v-model="scope.row.ruZhiShiJian"
+                                    type="date"
+                                    size="mini"
+                                    class=""
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择开始时间"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="离职时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("liZhiShiJian") > 0 ? scope.row.liZhiShiJian:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.liZhiShiJian'" :rules="rules.jieshuriqi">
+                                <el-date-picker
+                                    v-model="scope.row.liZhiShiJian"
+                                    type="date"
+                                    size="mini"
+                                    class=""
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择结束时间"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="单位名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("danWeiMingChen") > 0 ? scope.row.danWeiMingChen:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.danWeiMingChen'" :rules="rules.school">
+                                <el-input
+                                    v-model="scope.row.danWeiMingChen"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="部门"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("buMen") > 0 ? scope.row.buMen:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.buMen'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.buMen"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="职位"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("zhiWei") > 0 ? scope.row.zhiWei:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.zhiWei'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.zhiWei"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="工作内容"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("gongZuoNeiRong") > 0 ? scope.row.gongZuoNeiRong:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.gongZuoNeiRong'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.gongZuoNeiRong"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <!-- <el-table-column
+                    label="附件"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.fujian'" :rules="rules.attachmentsNum">
+                                <ibps-attachment
+                                    v-model="scope.row.fujian"
+                                    :download="true"
+                                    multiple
+                                    accept="*"
+                                    :readonly="judgeTag()"
+                                    style="width:100%"
+                                    limlt="5"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column> -->
+                <!-- <el-table-column
+                    v-if="!judgeTag()"
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="150">
+                    <template slot-scope="scope">
+                        <el-button @click="handleClick(scope.row)" type="text" size="small">查阅</el-button>
+                        <el-button type="text" size="small">编辑</el-button>
+                    </template>
+                </el-table-column> -->
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </el-form>
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+export default {
+    components: {
+        IbpsAttachment
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        const checkTimeJS = (rule, value, callback) => {
+            if (value) {
+                setTimeout(() => {
+                    const now = this.$common.getDateNow()
+                    const nowTime = new Date(now).getTime()
+                    const valueTime = new Date(value).getTime()
+                    const obj = this.nowData.find(t => t.liZhiShiJian === value)
+                    const ksTime = obj && obj.ruZhiShiJian !== null ? new Date(obj.ruZhiShiJian).getTime() : ''
+
+                    if (ksTime === '') {
+                        callback(new Error('请先选择开始时间'))
+                    } else if (nowTime < valueTime) {
+                        callback(new Error('请选择小于当前日期的时间'))
+                    } else if (ksTime >= valueTime) {
+                        callback(new Error('请选择大于开始日期的时间'))
+                    } else {
+                        callback()
+                    }
+                }, 100)
+            } else {
+                return callback(new Error('请选择时间'))
+            }
+        }
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            rules: {
+                bianzhiriqi: [
+                    { validator: option.checkTime, trigger: 'change' }
+                ],
+                jieshuriqi: [
+                    { validator: checkTimeJS, trigger: 'change' }
+                ],
+                school: [
+                    { validator: option.checkLength, trigger: 'blur' }
+                ],
+                optional: [
+                    { validator: option.optional, trigger: 'blur' }
+                ]
+                // attachmentsNum: [
+                //     { validator: option.attachmentsNum, trigger: 'change' }
+                // ]
+            },
+            multipleSelection: [],
+            currentPage: 1
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                } else if (val === 'save' || val === 'temporaryStorage' || val === 'submit' || val === 'sendBack' || val === 'agree') {
+                    this.submitForm('nowData', this.nowData)
+                }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        judgeTag () {
+            // return this.planeData.length>0&& this.btnShow === true && this.buttonType!==1 ? true : false
+            return !!(this.btnShow === true && this.buttonType !== 1 && this.buttonType !== 4)
+        },
+        submitForm (formName, val) {
+            // console.log('33333333333333333333')
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.$emit('changeBaseData', val, 'gzjl')
+                    // alert('submit!')
+                    this.$emit('changeButtonShow', this.$parent.$parent.$parent.btnShow)
+                } else {
+                    console.log('error submit!!')
+                    this.$emit('tipsShowTab', true)
+                    return false
+                }
+            })
+        },
+        addData () {
+            console.log(this.nowData.length % 10, '1111111111')
+            if (this.nowData.length % 10 === 0) {
+                this.currentPage = (this.nowData.length / 10) + 1
+            }
+            const mid = { ruZhiShiJian: '2024-09-12', liZhiShiJian: '2024-09-13', uuid: this.$common.generateUUID() }
+            this.nowData.push(mid)
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        goRemove () {
+            if (this.multipleSelection.length === 0) {
+                this.$message({
+                    message: '请选择要删除的数据',
+                    type: 'warning'
+                })
+                return
+            }
+            this.nowData = this.nowData.filter(item => !this.multipleSelection.includes(item))
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(`当前页: ${val}`)
+        },
+        getRowKey (row) {
+            if (row.id) {
+                return row.id
+            } else {
+                return row.uuid
+            }
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.gzjl20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 5.5%;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+
+}
+</style>

+ 425 - 0
src/views/component/personnelFile/components/jbqkTag.vue

@@ -0,0 +1,425 @@
+<template>
+    <div class="jbqk20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>基本情况</span>
+        </div>
+        <el-form ref="nowData" :model="nowData" :rules="rules" label-width="0" class="contentAll">
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">建档日期</div></div>
+                <div class="colSty" :span="6">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("jianDangRiQi") > 0 ? nowData.jianDangRiQi:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="jianDangRiQi">
+                            <el-date-picker
+                                v-model="nowData.jianDangRiQi"
+                                type="date"
+                                size="mini"
+                                class=""
+                                value-format="yyyy-MM-dd"
+                                placeholder="请选择日期"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">出生日期</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("chuShengRiQi") > 0 ? nowData.chuShengRiQi:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="chuShengRiQi">
+                            <el-date-picker
+                                v-model="nowData.chuShengRiQi"
+                                type="date"
+                                placeholder="请选择日期"
+                                value-format="yyyy-MM-dd"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">年龄</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("nianLing") > 0 ? nowData.nianLing:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="nianLing">
+                            <el-input-number v-model.number="nowData.nianLing" controls-position="right" :min="0" :max="150" size="mini" />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">最高学历学位</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("zuiGaoXueLiX") > 0 ? nowData.zuiGaoXueLiX:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="zuiGaoXueLiX">
+                            <el-select v-model="nowData.zuiGaoXueLiX" placeholder="请选择">
+                                <el-option label="博士" value="博士" />
+                                <el-option label="硕士" value="硕士" />
+                                <el-option label="本科" value="本科" />
+                                <el-option label="大专" value="大专" />
+                                <el-option label="高中" value="高中" />
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">毕业院校</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("yuanBiYeYuanXi") ? nowData.yuanBiYeYuanXi:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="yuanBiYeYuanXi">
+                            <el-input
+                                v-model="nowData.yuanBiYeYuanXi"
+                                type="text"
+                                placeholder="请输入"
+                            />
+                            <!-- maxlength="200" -->
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">入职日期</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("ruZhiShiJian") > 0 ? nowData.ruZhiShiJian:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="ruZhiShiJian">
+                            <el-date-picker
+                                v-model="nowData.ruZhiShiJian"
+                                type="date"
+                                placeholder="入职日期"
+                                value-format="yyyy-MM-dd"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">职称等级</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("zhiChengDengJi") > 0 ? nowData.zhiChengDengJi:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="zhiChengDengJi">
+                            <el-select v-model="nowData.zhiChengDengJi" placeholder="请选择">
+                                <el-option label="初级" value="初级" />
+                                <el-option label="中级" value="中级" />
+                                <el-option label="副高" value="副高" />
+                                <el-option label="高级" value="高级" />
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">职称</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("zhiCheng") > 0 ? nowData.zhiCheng:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="zhiCheng">
+                            <el-input
+                                v-model="nowData.zhiCheng"
+                                type="text"
+                                placeholder="请输入"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">身份证号码</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("shenFenZhengHao") > 0 ? nowData.shenFenZhengHao:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="shenFenZhengHao">
+                            <el-input
+                                v-model="nowData.shenFenZhengHao"
+                                type="text"
+                                placeholder="请输入"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">人员类型</div></div>
+                <div class="colSty">
+                    <div v-if="judgeTag()" class="grid-content bg-purple-light">
+                        <div>{{ nowData.hasOwnProperty("renYuanLeiXing") > 0 ? nowData.renYuanLeiXing:'/' }}</div>
+                    </div>
+                    <div v-else class="grid-content bg-purple-light">
+                        <el-form-item prop="renYuanLeiXing">
+                            <el-select v-model="nowData.renYuanLeiXing" placeholder="请选择">
+                                <el-option label="合同人员" value="合同人员" />
+                                <el-option label="派遣人员" value="派遣人员" />
+                                <el-option label="规培人员" value="规培人员" />
+                                <el-option label="实习人员" value="实习人员" />
+                                <el-option label="进修人员" value="进修人员" />
+                                <el-option label="临时人员" value="临时人员" />
+                                <el-option label="提供支持性服务的外部人员" value="提供支持性服务的外部人员" />
+                            </el-select>
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">保密协议</div></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light">
+                        <el-form-item prop="baoMiXieYi">
+                            <ibps-attachment
+                                v-model="nowData.baoMiXieYi"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="judgeTag()"
+                                style="width:100%"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">签字图文</div></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light">
+                        <el-form-item prop="qianZiTuWen">
+                            <ibps-attachment
+                                v-model="nowData.qianZiTuWen"
+                                :download="true"
+                                accept="*"
+                                :readonly="judgeTag()"
+                                style="width:100%"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">劳动合同或社保证明</div></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light">
+                        <el-form-item prop="sheBao">
+                            <ibps-attachment
+                                v-model="nowData.sheBao"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="judgeTag()"
+                                style="width:100%"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple">承诺函</div></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light">
+                        <el-form-item prop="chengNuoHan">
+                            <ibps-attachment
+                                v-model="nowData.chengNuoHan"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="judgeTag()"
+                                style="width:100%"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+            </div>
+            <div class="rowSty">
+                <div class="colSty"><div class="grid-content bg-purple">附件</div></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light">
+                        <el-form-item prop="sheBao">
+                            <ibps-attachment
+                                v-model="nowData.fujIan"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="judgeTag()"
+                                style="width:100%"
+                            />
+                        </el-form-item>
+                    </div>
+                </div>
+                <div class="colSty"><div class="grid-content bg-purple" /></div>
+                <div class="colSty">
+                    <div class="grid-content bg-purple-light" />
+                </div>
+            </div>
+        </el-form>
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+
+export default {
+    components: {
+        IbpsAttachment
+    },
+    props: {
+        planeData: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: {},
+            rules: {
+                jianDangRiQi: [{ validator: option.checkTime, trigger: 'blur' }],
+                chuShengRiQi: [{ validator: option.checkTime, trigger: 'blur' }],
+                nianLing: [{ validator: option.checkNianLing, trigger: 'change' }],
+                yuanBiYeYuanXi: [{ validator: option.checkLength, trigger: 'blur' }],
+                ruZhiShiJian: [{ validator: option.checkTime, trigger: 'blur' }],
+                zhiCheng: [{ validator: option.checkLength, trigger: 'blur' }],
+                qianZiTuWen: [{ validator: option.attachmentsNumOne, trigger: 'change' }],
+                shenFenZhengHao: [{ validator: option.checkLength, trigger: 'blur' }],
+                baoMiXieYi: [{ validator: option.attachmentsNum, trigger: 'change' }],
+                chengNuoHan: [{ validator: option.attachmentsNum, trigger: 'change' }],
+                sheBao: [{ validator: option.attachmentsNum, trigger: 'change' }]
+            }
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                console.log(val, 'vvvvvvvvvvvvvvvvvvvvvvvvv')
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                // console.log(val, 'vvvvvvvvvvvvvvvvvvvvvvvvv')
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                } else if (val === 'save' || val === 'temporaryStorage' || val === 'submit' || val === 'sendBack' || val === 'agree') {
+                    this.submitForm('nowData', this.nowData)
+                }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        judgeTag () {
+            // return this.planeData.length>0&& this.btnShow === true && this.buttonType!==1 ? true : false
+            return !!(this.btnShow === true && this.buttonType !== 1 && this.buttonType !== 4)
+        },
+        submitForm (formName, val) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.$emit('changeBaseData', val, 'ryjbqk')
+                    this.$emit('changeButtonShow', this.$parent.$parent.$parent.btnShow)
+                } else {
+                    this.$emit('tipsShowTab', true)
+                    return false
+                }
+            })
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.jbqk20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+
+    .contentAll{
+        height: 100%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .bg-purple {
+            background: #f8f8f8;
+        }
+        .bg-purple-light {
+            border-left: 1px solid #f2f2f2;
+            border-right: 1px solid #f2f2f2;
+            div{
+                width: 100%;
+            }
+            ::v-deep .el-form-item{
+                margin-bottom: 0 !important;
+            }
+        }
+        .bg-purple-last{
+            border-left: 1px solid #f2f2f2;
+            border-right: none;
+        }
+        .grid-content {
+            min-height: 36px;
+            height: 100%;
+            padding: 0 5%;
+            display: flex;
+            align-items: center;
+        }
+        .row-bg {
+            padding: 10px 0;
+            background-color: #f9fafc;
+        }
+        .rowSty{
+            display: flex;
+            border: 1px solid #f2f2f2;
+            border-top: none;
+            &:first-child {
+                margin-top: 10px;
+                border-top: 1px solid #f2f2f2;
+            }
+            &:last-child {
+                margin-bottom: 0;
+            }
+            .colSty{
+                width: 25%;
+            }
+        }
+    }
+
+}
+</style>

+ 274 - 0
src/views/component/personnelFile/components/jxjyxmxshdglbTag.vue

@@ -0,0 +1,274 @@
+<template>
+    <div class="jxjyxmxshdglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>继续教育项目/学术活动</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableJXJY"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="项目编号"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xiangMuBianHao") > 0 ? scope.row.xiangMuBianHao:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="会议名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("huiYiMingCheng") > 0 ? scope.row.huiYiMingCheng:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="项目级别"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xueFenJiBie") > 0 ? scope.row.xueFenJiBie:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="学分"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xueFen") > 0 ? scope.row.xueFen:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="举办日期"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("juBanShiJian") > 0 ? scope.row.juBanShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="会议通知"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.huiYiTongZhiS"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableJXJY.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '项目编号', contant: val.xiangMuBianHao, type: 'text' }, { name: '学分', contant: val.xueFen, type: 'text' }],
+                [{ name: '项目级别', contant: val.xueFenJiBie, type: 'text' }, { name: '举办日期', contant: val.juBanShiJian, type: 'text' }],
+                [{ name: '全部作者', contant: val.quanBuZuoZhe, type: 'text' }, { name: '举办地点', contant: val.juBanDiDian, type: 'text' }],
+                [{ name: '会议名称', contant: val.huiYiMingCheng, type: 'text' }, { name: '合作单位', contant: val.heZuoDanWei, type: 'text' }],
+                [{ name: '会议通知', contant: val.huiYiTongZhiS, type: 'file' }, { name: '活动现场照片', contant: val.huoDXCZPSC, type: 'file' }],
+                [{ name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.jxjyxmxshdglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 406 - 0
src/views/component/personnelFile/components/jyjlTag.vue

@@ -0,0 +1,406 @@
+<template>
+    <div class="jyjl20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>教育经历</span>
+        </div>
+        <div class="hand-btn" :style="judgeTag()?'height:10px;':'height:5.5%;'">
+            <el-button v-if="!judgeTag()" type="primary" size="mini" icon="el-icon-plus" @click="addData">添加</el-button>
+            <el-button v-if="!judgeTag()" type="danger" size="mini" icon="el-icon-close" @click="goRemove">删除</el-button>
+        </div>
+        <!-- <div class="contentAll"> -->
+        <el-form ref="nowData" :model="nowDataObj" :rules="rules" label-width="0px" class="contentAll">
+            <el-table
+                ref="reviewTable"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                :row-key="getRowKey"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="开始时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("kaiShiShiJian") > 0 ? scope.row.kaiShiShiJian:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.kaiShiShiJian'" :rules="rules.kaiShiShiJian">
+                                <el-date-picker
+                                    v-model="scope.row.kaiShiShiJian"
+                                    type="date"
+                                    size="mini"
+                                    class=""
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择开始时间"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="结束时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("jieShuShiJian") > 0 ? scope.row.jieShuShiJian:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.jieShuShiJian'" :rules="rules.jieShuShiJian">
+                                <el-date-picker
+                                    v-model="scope.row.jieShuShiJian"
+                                    type="date"
+                                    size="mini"
+                                    class=""
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择结束时间"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="学校"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("xueXiao") > 0 ? scope.row.xueXiao:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.xueXiao'" :rules="rules.school">
+                                <el-input
+                                    v-model="scope.row.xueXiao"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="专业"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("zhuanYe") > 0 ? scope.row.zhuanYe:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.zhuanYe'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.zhuanYe"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="学历学位"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("xueLiXueWei") > 0 ? scope.row.xueLiXueWei:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.xueLiXueWei'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.xueLiXueWei"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="附件"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.fuJian'" :rules="rules.attachmentsNum">
+                                <ibps-attachment
+                                    v-model="scope.row.fuJian"
+                                    :download="true"
+                                    multiple
+                                    accept="*"
+                                    :readonly="judgeTag()"
+                                    style="width:100%"
+                                    limlt="5"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <!-- <el-table-column
+                    v-if="!judgeTag()"
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="150">
+                    <template slot-scope="scope">
+                        <el-button @click="handleClick(scope.row)" type="text" size="small">查阅</el-button>
+                        <el-button type="text" size="small">编辑</el-button>
+                    </template>
+                </el-table-column> -->
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </el-form>
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+export default {
+    components: {
+        IbpsAttachment
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        const checkTimeJS = (rule, value, callback) => {
+            if (!value) {
+                return callback(new Error('请选择日期'))
+            }
+            setTimeout(() => {
+                const now = this.$common.getDateNow()
+                const nowTime = new Date(now).getTime()
+                const valueTime = new Date(value).getTime()
+                const obj = this.nowData.find(t => t.jieShuShiJian === value)
+                const ksTime = obj && obj.kaiShiShiJian !== null ? new Date(obj.kaiShiShiJian).getTime() : ''
+
+                if (ksTime === '') {
+                    callback(new Error('请先选择开始时间'))
+                } else if (nowTime < valueTime) {
+                    callback(new Error('请选择小于当前日期的时间'))
+                } else if (ksTime >= valueTime) {
+                    callback(new Error('请选择大于开始日期的时间'))
+                } else {
+                    callback()
+                }
+            }, 100)
+        }
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            rules: {
+                kaiShiShiJian: [
+                    { validator: option.checkTime, trigger: 'change' }
+                ],
+                jieShuShiJian: [
+                    { validator: checkTimeJS, trigger: 'change' }
+                ],
+                school: [
+                    { validator: option.checkLength, trigger: 'blur' }
+                ],
+                optional: [
+                    { validator: option.optional, trigger: 'blur' }
+                ],
+                attachmentsNum: [
+                    { validator: option.attachmentsNum, trigger: 'change' }
+                ]
+            },
+            multipleSelection: [],
+            currentPage: 1
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                } else if (val === 'save' || val === 'temporaryStorage' || val === 'submit' || val === 'sendBack' || val === 'agree') {
+                    this.submitForm('nowData', this.nowData)
+                }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        judgeTag () {
+            // return this.planeData.length>0&& this.btnShow === true && this.buttonType!==1 ? true : false
+            return !!(this.btnShow === true && this.buttonType !== 1 && this.buttonType !== 4)
+        },
+        submitForm (formName, val) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.$emit('changeBaseData', val, 'jyjl')
+                    // alert('submit!')
+                    this.$emit('changeButtonShow', this.$parent.$parent.$parent.btnShow)
+                } else {
+                    console.log('error submit!!')
+                    this.$emit('tipsShowTab', true)
+                    return false
+                }
+            })
+        },
+        addData () {
+            console.log(this.nowData.length % 10, '1111111111')
+            if (this.nowData.length % 10 === 0) {
+                this.currentPage = (this.nowData.length / 10) + 1
+            }
+            const mid = { uuid: this.$common.generateUUID() }
+            this.nowData.push(mid)
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        goRemove () {
+            if (this.multipleSelection.length === 0) {
+                this.$message({
+                    message: '请选择要删除的数据',
+                    type: 'warning'
+                })
+                return
+            }
+            this.nowData = this.nowData.filter(item => !this.multipleSelection.includes(item))
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(`当前页: ${val}`)
+        },
+        getRowKey (row) {
+            if (row.id) {
+                return row.id
+            } else {
+                return row.uuid
+            }
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.jyjl20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 5.5%;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+
+}
+</style>

+ 256 - 0
src/views/component/personnelFile/components/kjhjcgglbTag.vue

@@ -0,0 +1,256 @@
+<template>
+    <div class="kjhjcgglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>获奖成果</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableHJCG"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="奖励项目名称"
+                    min-width="25%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("jiangLiXiangMu") > 0 ? scope.row.jiangLiXiangMu:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="奖励类型"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("jiangLiLeiXing") > 0 ? scope.row.jiangLiLeiXing:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="获奖日期"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("huoJiangShiJia") > 0 ? scope.row.huoJiangShiJia:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="获奖证书"
+                    min-width="25%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.shangCHJZS"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(`当前页: ${val}`)
+            this.$refs.reviewTableHJCG.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '奖励项目名称', contant: val.jiangLiXiangMu, type: 'text' }, { name: '奖励类型', contant: val.jiangLiLeiXing, type: 'text' }],
+                [{ name: '获奖编号', contant: val.huoJiangBianHao, type: 'text' }, { name: '获奖日期', contant: val.huoJiangShiJia, type: 'text' }],
+                [{ name: '全部获奖者', contant: val.quanBuHuoJiang, type: 'text' }, { name: '个人排名', contant: val.childGeRenPaiMing, type: 'text' }],
+                [{ name: '单位', contant: val.danWei, type: 'text' }, { name: '单位排名', contant: val.danWeiPaiMing, type: 'text' }],
+                [{ name: '获奖证书', contant: val.shangCHJZS, type: 'file' }, { name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.kjhjcgglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 284 - 0
src/views/component/personnelFile/components/kphdglbTag.vue

@@ -0,0 +1,284 @@
+<template>
+    <div class="kphdglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>科研项目</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableKPHD"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="科普编号"
+                    min-width="16%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("kePuBianHao") > 0 ? scope.row.kePuBianHao:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="活动时间"
+                    min-width="16%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("huoDongShiJian") > 0 ? scope.row.huoDongShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="科普形式"
+                    min-width="16%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("kePuXingShi") > 0 ? scope.row.kePuXingShi:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="备注"
+                    min-width="21%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("beiZhu") > 0 ? scope.row.beiZhu:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="附件"
+                    min-width="21%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.fuJian"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        const checkTimeJS = (rule, value, callback) => {
+            console.log(value)
+
+            if (!value) {
+                return callback(new Error('请选择日期'))
+            }
+            setTimeout(() => {
+                const now = this.$common.getDateNow()
+                const nowTime = new Date(now).getTime()
+                const valueTime = new Date(value).getTime()
+                const obj = this.nowData.find(t => t.jieshuriqi === value)
+                const ksTime = obj.bianzhiriqi !== null ? new Date(obj.bianzhiriqi).getTime() : ''
+
+                if (ksTime === '') {
+                    callback(new Error('请先选择开始时间'))
+                } else if (nowTime < valueTime) {
+                    callback(new Error('请选择小于当前日期的时间'))
+                } else if (ksTime >= valueTime) {
+                    callback(new Error('请选择大于开始日期的时间'))
+                }
+            }, 100)
+        }
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(this.$refs, `当前页: ${val}`)
+            this.$refs.reviewTableKPHD.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '科普编号', contant: val.kePuBianHao, type: 'text' }, { name: '开始日期', contant: val.qiZhiShiJian, type: 'text' }],
+                [{ name: '科普形式', contant: val.kePuXingShi, type: 'text' }],
+                [{ name: '备注', contant: val.beiZhu, type: 'text' }, { name: '附件', contant: val.fuJian, type: 'file' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.kphdglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 273 - 0
src/views/component/personnelFile/components/kyxmglbTag.vue

@@ -0,0 +1,273 @@
+<template>
+    <div class="kyzlglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>科研项目</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableKYXM"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="项目编号"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xiangMuBianHao") > 0 ? scope.row.xiangMuBianHao:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="项目类型"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xiangMuLeiXing") > 0 ? scope.row.xiangMuLeiXing:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="项目名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("xiangMuMingChe") > 0 ? scope.row.xiangMuMingChe:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="开始时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiZhiShiJian") > 0 ? scope.row.qiZhiShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="结束时间"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("jieShuShiJian") > 0 ? scope.row.jieShuShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="项目文档"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.shangCLXWD"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableKYXM.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '项目编号', contant: val.xiangMuBianHao, type: 'text' }, { name: '项目名称', contant: val.xiangMuMingChe, type: 'text' }],
+                [{ name: '全部参与人', contant: val.quanBuCanYuRe, type: 'text' }, { name: '主持/参与', contant: val.childZhuChiCanYu, type: 'text' }],
+                [{ name: '资助单位', contant: val.ziZhiDanWei, type: 'text' }, { name: '开始日期', contant: val.qiZhiShiJian, type: 'text' }],
+                [{ name: '项目类型', contant: val.xiangMuLeiXing, type: 'text' }, { name: '结束日期', contant: val.jieShuShiJian, type: 'text' }],
+                [{ name: '立项经费(万元)', contant: val.liXiangJingFei, type: 'text' }, { name: '项目文档', contant: val.shangCLXWD, type: 'file' }],
+                [{ name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.kyzlglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 272 - 0
src/views/component/personnelFile/components/kyzlglbTag.vue

@@ -0,0 +1,272 @@
+<template>
+    <div class="kyxmglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>专利</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableKYZL"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="专利名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("zhuanLiMingChe") > 0 ? scope.row.zhuanLiMingChe:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="专利权人"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("zhuanLiQuanRen") > 0 ? scope.row.zhuanLiQuanRen:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="类别"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("leiBie") > 0 ? scope.row.leiBie:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="申请日期"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("shenQingShiJia") > 0 ? scope.row.shenQingShiJia:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="授权日期"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("shouQuanShiJia") > 0 ? scope.row.shouQuanShiJia:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="附件"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.fuJian"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableKYZL.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '专利编号', contant: val.zhuanLiBianHao, type: 'text' }, { name: '类别', contant: val.leiBie, type: 'text' }],
+                [{ name: '专利名称', contant: val.zhuanLiMingChe, type: 'text' }, { name: '申请日期', contant: val.shenQingShiJia, type: 'text' }],
+                [{ name: '全部申请人', contant: val.quanBuShenQing, type: 'text' }, { name: '授权日期', contant: val.shouQuanShiJia, type: 'text' }],
+                [{ name: '专利权人', contant: val.zhuanLiQuanRen, type: 'text' }, { name: '作者排名', contant: val.childGeRenPaiMing, type: 'text' }],
+                [{ name: '附件', contant: val.fuJian, type: 'file' }, { name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.kyxmglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 256 - 0
src/views/component/personnelFile/components/kyzzglbTag.vue

@@ -0,0 +1,256 @@
+<template>
+    <div class="kyzzglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>专著</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableKYZZ"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="专著名称"
+                    min-width="25%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("zhuanZhuoMingC") > 0 ? scope.row.zhuanZhuoMingC:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="出版社"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("chuBanShe") > 0 ? scope.row.chuBanShe:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="出版时间"
+                    min-width="20%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("chuBanShiJian") > 0 ? scope.row.chuBanShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="原文"
+                    min-width="25%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.shangChuanYuan"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableKYZZ.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '专著编号', contant: val.zhuanZhuoBianHao, type: 'text' }, { name: '出版社', contant: val.chuBanShe, type: 'text' }],
+                [{ name: '专著名称', contant: val.zhuanZhuoMingC, type: 'text' }, { name: '出版时间', contant: val.chuBanShiJian, type: 'text' }],
+                [{ name: '全部作者', contant: val.quanBuZuoZhe, type: 'text' }, { name: '编撰字数', contant: val.bianZhuanZiShu, type: 'text' }],
+                [{ name: '主编/编委', contant: val.childZhuBianBianWei, type: 'text' }, { name: '链接', contant: val.lianJie, type: 'text' }],
+                [{ name: '原文', contant: val.shangChuanYuan, type: 'file' }, { name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            // console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.kyzzglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 10px;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 266 - 0
src/views/component/personnelFile/components/modulesTag.vue

@@ -0,0 +1,266 @@
+<template>
+    <div class="modulesTag20241107">
+        <el-tabs ref="tabref" v-model="activeNameTab" class="tabsAll" @tab-click="handleClick">
+            <div class="bgC" />
+            <el-tab-pane label="基本情况" name="ryjbqk" class="tabPane">
+                <jbqk-tag class="paneAll" :plane-data="judgeBase('ryjbqk','obj')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" @tipsShowTab="tipsShowTab" />
+            </el-tab-pane>
+            <el-tab-pane label="教育经历" name="jyjl" class="tabPane">
+                <jyjl-tag class="paneAll" :plane-data="judgeBase('jyjl')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" @tipsShowTab="tipsShowTab" />
+            </el-tab-pane>
+            <el-tab-pane label="工作经历" name="gzjl" class="tabPane">
+                <gzjl-tag class="paneAll" :plane-data="judgeBase('gzjl')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" @tipsShowTab="tipsShowTab" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('kyxmglb')" label="科研项目" name="kyxmglb" class="tabPane">
+                <kyxmglb-tag ref="kyxmglb" class="paneAll" :plane-data="judgeData('kyxmglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('kjhjcgglb')" label="获奖成果" name="kjhjcgglb" class="tabPane">
+                <kjhjcgglb-tag ref="kjhjcgglb" class="paneAll" :plane-data="judgeData('kjhjcgglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('SCIwzglb')" label="SCI文章" name="SCIwzglb" class="tabPane">
+                <SCIwzglb-tag ref="SCIwzglb" class="paneAll" :plane-data="judgeData('SCIwzglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('zwlwglb')" label="中文论文" name="zwlwglb" class="tabPane">
+                <zwlwglb-tag ref="zwlwglb" class="paneAll" :plane-data="judgeData('zwlwglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('kyzzglb')" label="专著" name="kyzzglb" class="tabPane">
+                <kyzzglb-tag ref="kyzzglb" class="paneAll" :plane-data="judgeData('kyzzglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('kyzlglb')" label="专利" name="kyzlglb" class="tabPane">
+                <kyzlglb-tag ref="kyzlglb" class="paneAll" :plane-data="judgeData('kyzlglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('jxjyxmxshdglb')" label="继续教育学术活动" name="jxjyxmxshdglb" class="tabPane">
+                <jxjyxmxshdglb-tag ref="jxjyxmxshdglb" class="paneAll" :plane-data="judgeData('jxjyxmxshdglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('kphdglb')" label="科普活动" name="kphdglb" class="tabPane">
+                <kphdglb-tag ref="kphdglb" class="paneAll" :plane-data="judgeData('kphdglb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane v-if="judgeTag('bmsm')" label="公正性、保密性" name="bmsm" class="tabPane">
+                <bmsm-tag ref="bmsm" class="paneAll" :plane-data="judgeData('bmsm')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" />
+            </el-tab-pane>
+            <el-tab-pane label="资格职称证书" name="zsb" class="tabPane">
+                <zsb-tag class="paneAll" :plane-data="judgeBase('zsb')" :button-type="buttonType" :btn-show="btnShow" :btn-type="btnType" @changeButtonShow="changeButtonShow" @changeBaseData="changeBaseData" @tipsShowTab="tipsShowTab" />
+            </el-tab-pane>
+        </el-tabs>
+    </div>
+</template>
+<script>
+import jbqkTag from './jbqkTag.vue'
+import jyjlTag from './jyjlTag.vue'
+import gzjlTag from './gzjlTag.vue'
+import zsbTag from './zsbTag.vue'
+import kyxmglbTag from './kyxmglbTag.vue'
+import kjhjcgglbTag from './kjhjcgglbTag.vue'
+import SCIwzglbTag from './SCIwzglbTag.vue'
+import zwlwglbTag from './zwlwglbTag.vue'
+import kyzzglbTag from './kyzzglbTag.vue'
+import kyzlglbTag from './kyzlglbTag.vue'
+import jxjyxmxshdglbTag from './jxjyxmxshdglbTag.vue'
+import kphdglbTag from './kphdglbTag.vue'
+import bmsmTag from './bmsmTag.vue'
+
+export default {
+    components: {
+        jbqkTag,
+        jyjlTag,
+        gzjlTag,
+        zsbTag,
+        kyxmglbTag,
+        kjhjcgglbTag,
+        SCIwzglbTag,
+        zwlwglbTag,
+        kyzzglbTag,
+        kyzlglbTag,
+        jxjyxmxshdglbTag,
+        kphdglbTag,
+        bmsmTag
+    },
+    props: {
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        tagData: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        baseData: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        },
+        activeName: {
+            type: String,
+            default: 'ryjbqk'
+        }
+    },
+    data () {
+        return {
+            activeNameTab: this.activeName
+        }
+    },
+    watch: {
+        tagData: {
+            handler: function (val, oldVal) {
+                if (Object.keys(val).length > 0) {
+                    this.$forceUpdate()
+                }
+            },
+            deep: true,
+            immediate: true
+        },
+        baseData: {
+            handler: function (val, oldVal) {
+                if (Object.keys(val).length > 0) {
+                    this.$forceUpdate()
+                }
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    methods: {
+        handleClick (val) {
+            this.$emit('changeTabs', val.name)
+            if (typeof this.$refs.kyxmglb !== 'undefined' && typeof this.$refs.kyxmglb.$refs.reviewTableKYXM !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.kyxmglb.$refs.reviewTableKYXM.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.kjhjcgglb !== 'undefined' && typeof this.$refs.kjhjcgglb.$refs.reviewTableHJCG !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.kjhjcgglb.$refs.reviewTableHJCG.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.SCIwzglb !== 'undefined' && typeof this.$refs.SCIwzglb.$refs.reviewTableSCI !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.SCIwzglb.$refs.reviewTableSCI.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.zwlwglb !== 'undefined' && typeof this.$refs.zwlwglb.$refs.reviewTableZWLW !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.zwlwglb.$refs.reviewTableZWLW.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.kyzzglb !== 'undefined' && typeof this.$refs.kyzzglb.$refs.reviewTableKYZZ !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.kyzzglb.$refs.reviewTableKYZZ.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.kyzlglb !== 'undefined' && typeof this.$refs.kyzlglb.$refs.reviewTableKYZL !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.kyzlglb.$refs.reviewTableKYZL.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.jxjyxmxshdglb !== 'undefined' && typeof this.$refs.jxjyxmxshdglb.$refs.reviewTableJXJY !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.jxjyxmxshdglb.$refs.reviewTableJXJY.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.kphdglb !== 'undefined' && typeof this.$refs.kphdglb.$refs.reviewTableKPHD !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.kphdglb.$refs.reviewTableKPHD.doLayout()
+                }, 200)
+            }
+            if (typeof this.$refs.bmsm !== 'undefined' && typeof this.$refs.bmsm.$refs.reviewTableBMSM !== 'undefined') {
+                setTimeout(() => {
+                    this.$refs.bmsm.$refs.reviewTableBMSM.doLayout()
+                }, 200)
+            }
+        },
+        judgeTag (val) {
+            return !!(Object.keys(this.tagData).length > 0 && this.tagData.hasOwnProperty(val) && this.tagData[val].display === 'Y' && this.btnShow === true && this.buttonType !== 1 && this.buttonType !== 3 && this.buttonType !== 4)
+        },
+        judgeData (val) {
+            return Object.keys(this.tagData).length > 0 ? this.tagData[val].data : []
+        },
+        judgeBase (val, type = 'arr') {
+            return Object.keys(this.baseData).length > 0 ? this.baseData[val].data : type === 'obj' ? {} : []
+        },
+        changeBaseData (val, name) {
+            this.$emit('getChangeBaseData', val, name)
+        },
+        changeButtonShow (val, name) {
+            this.$emit('changeBtnShow', val)
+        },
+        tipsShowTab (val, name) {
+            this.$emit('tipsShow', val)
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.modulesTag20241107{
+    // background-color: #fff;
+    width: calc(100% - 40px);
+    height: 77%;
+    padding: 0 0 1%;
+    ::v-deep .el-tabs__nav-wrap::after{
+        height: 0;
+    }
+    ::v-deep .el-tabs__content{
+        height: 92%;
+        background-color: #fff;
+        overflow: inherit;
+    }
+    ::v-deep .el-tabs__header.is-top{
+        // background-color: #fff;
+        width: calc(100% - 40px);
+        // height: 5%;
+        padding: 0 20px 15px;
+        background-color: #fff;
+        // padding-bottom: 1%;
+        box-shadow:
+            0 4px 2px -5px rgba(0,0,0,.0),
+            -2px 10px 15px -5px rgba(0,0,0,.1),
+            2px 10px 15px -5px rgba(0,0,0,.1);
+        border-radius: 0 0 4px 4px;
+    }
+    ::v-deep .el-tabs__item.is-active{
+        color: #49bdb2;
+    }
+    ::v-deep .el-tabs__item:hover{
+        color: #49bdb2;
+    }
+    ::v-deep .el-tabs__active-bar{
+        background-color: #49bdb2;
+    }
+    // ::v-deep .el-tabs__active-bar.is-top{
+    //     color: #49bdb2;
+    // }
+    .bgC{
+        background-color: #f9ffff;
+        width: 100%;
+        height: 2%;
+    }
+    .tabsAll{
+        height: 100%;
+        .tabPane{
+            width: calc(100% - 40px);
+            height: calc(100% - 30px);
+            padding: 20px 20px 0;
+            box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
+            border-radius: 4px;
+            // overflow: hidden;
+            display: flex;
+            .paneAll{
+                width: 100%;
+                height: 100%;
+                display: table;
+            }
+        }
+    }
+
+}
+</style>

+ 290 - 0
src/views/component/personnelFile/components/personnelInfo.vue

@@ -0,0 +1,290 @@
+<!--
+ * @Author: cyy szjbdcyy@126.com
+ * @Date: 2024-11-07 16:00:14
+ * @LastEditors: cyy szjbdcyy@126.com
+ * @LastEditTime: 2024-11-08 16:42:35
+ * @FilePath: \zdqy_firm_former\src\views\component\personnelFile\components\personnelInfo.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+<template>
+    <div class="personnelInfo20241107">
+        <div class="allInfo">
+            <div class="photoSty">
+                <el-avatar :src="getPhoto(personInfoData.photo)" fit="fit" @error="errorHandler">
+                    <img src="../../../../../public/images/common/default_user_image.jpg">
+                </el-avatar>
+            </div>
+            <div class="contentSty">
+                <div class="contentHeader">
+                    <div class="contentHeaderLeft">
+                        <p>姓名:</p>
+                        <el-input v-if="buttonType===1" v-model="submitperInfoData.name" class="leftFont" size="mini" />
+                        <span v-else>{{ submitperInfoData.name }}</span>
+                    </div>
+                    <div>
+                        <el-button v-if="(buttonType===0&&buttonShow===false)||buttonType===3||buttonType===4" type="primary" icon="el-icon-picture" @click="changeButton('flowChart')">流程图</el-button>
+                        <!-- <el-button v-if="buttonType===0&&buttonShow===false" type="primary" icon="ibps-icon-save" @click="changeButton('temporaryStorage')">暂存</el-button> -->
+                        <el-button v-if="buttonType===0&&buttonShow===false" type="primary" icon="el-icon-s-promotion" @click="changeButton('submit')">提交</el-button>
+                        <el-button v-if="buttonType===1" type="primary" icon="ibps-icon-save" @click="changeButton('save')">保存</el-button>
+                        <el-button v-if="buttonType===3||buttonType===4" type="primary" icon="ibps-icon-check-square-o" @click="changeButton('agree')">{{ buttonType===4?'提交':'同意' }}</el-button>
+                        <el-button v-if="buttonType===3" type="primary" icon="ibps-icon-check-square-o" @click="changeButton('sendBack')">退回</el-button>
+                        <el-button v-if="buttonType===0&&buttonShow===true" type="primary" icon="el-icon-edit-outline" @click="changeButtonShow(false,'edit')">编辑</el-button>
+                        <el-button v-if="buttonType===0&&buttonShow===false" type="warning" icon="el-icon-switch-button" @click="changeButtonShow(true,'exitEdit')">退出编辑</el-button>
+                        <el-button v-if="type==='dialog'||buttonType===3||buttonType===4" type="danger" icon="el-icon-close" autofocus @click="showSubmit()">关闭</el-button>
+                    </div>
+                </div>
+                <div class="contentFooter">
+                    <el-row :gutter="20">
+                        <el-col :span="8" class="contentFooterC">
+                            <p>工号:</p>
+                            <el-input v-if="buttonType===1" v-model="submitperInfoData.jianDingZiGeZ" class="leftFont" size="mini" />
+                            <span v-else>{{ submitperInfoData.jianDingZiGeZ }}</span>
+                        </el-col>
+                        <el-col :span="8" class="contentFooterC">
+                            <p>性别:</p>
+                            <!-- <el-input class="leftFont" v-if="buttonType===1" v-model="submitperInfoData.gender" size="mini" /> -->
+                            <el-radio-group v-if="buttonType===1" v-model="submitperInfoData.gender" class="leftFont">
+                                <el-radio label="male">男</el-radio>
+                                <el-radio label="female">女</el-radio>
+                            </el-radio-group>
+                            <span v-else>{{ submitperInfoData.gender==='female'?'女':'男' }}</span>
+                        </el-col>
+                        <el-col :span="8" class="contentFooterC">
+                            <p>状态:</p>
+                            <el-tag type="success" size="mini">{{ submitperInfoData.status==='actived'?'已激活':'' }}</el-tag>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="8" class="contentFooterC">
+                            <p>电话:</p>
+                            <el-input v-if="buttonType===1" v-model="submitperInfoData.mobile" class="leftFont" size="mini" />
+                            <span v-else>{{ submitperInfoData.mobile }}</span>
+                        </el-col>
+                        <el-col :span="8" class="contentFooterC">
+                            <p>邮箱:</p>
+                            <el-input v-if="buttonType===1" v-model="submitperInfoData.email" class="leftFont" size="mini" />
+                            <span v-else>{{ submitperInfoData.email }}</span>
+                        </el-col>
+                        <el-col :span="8" class="contentFooterC">
+                            <p>岗位:</p>
+                            <div v-if="typeof userList.find(t => t.userId === submitperInfoData.id) != 'undefined'" class="posSty">
+                                <el-tag v-for="(item,i) in userList.find(t => t.userId === submitperInfoData.id).roles.split(',')" :key="i" class="interspaceTag" size="mini">{{ item }}</el-tag>
+                            </div>
+                        </el-col>
+                    </el-row>
+                </div>
+            </div>
+        </div>
+        <flow-diagram-dialog
+            :visible="flowDiagramVisible"
+            :def-id="'1315609540510613504'"
+            :task-id="$parent.$attrs.hasOwnProperty('params')&&$parent.$attrs.params.hasOwnProperty('taskId') ? $parent.$attrs.params.taskId : ''"
+            :inst-id="''"
+            @close="visible => (flowDiagramVisible = visible)"
+        />
+    </div>
+</template>
+<script>
+import { getFile } from '@/utils/avatar'
+import FlowDiagramDialog from '@/business/platform/bpmn/components/flow-diagram/dialog'
+export default {
+    components: {
+        FlowDiagramDialog
+    },
+    props: {
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        type: {
+            type: String,
+            default: ''
+        },
+        personInfoData: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        const { userId, userList = [], userInfo } = this.$store.getters
+        return {
+            userList,
+            submitperInfoData: {},
+            buttonShow: true,
+            flowDiagramVisible: false
+        }
+    },
+    watch: {
+        personInfoData: {
+            handler: function (val, oldVal) {
+                if (Object.keys(val).length > 0) {
+                    // eslint-disable-next-line no-undef
+                    this.submitperInfoData = structuredClone(val)
+                }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnShow: {
+            handler: function (val, oldVal) {
+                this.buttonShow = val
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    methods: {
+        getPhoto (photo) {
+            return getFile(photo)
+        },
+        showSubmit () {
+            // console.log(this, '222222222222')
+            this.$emit('showTF', false)
+        },
+        changeButtonShow (val, name) {
+            if (this.$parent.userId !== '') {
+                const sql = `select count(*) as count from ibps_bpm_inst where PROC_DEF_KEY_ = 'Process_08xwabfNEW' and create_by_ = '${this.$parent.userId}'`
+                this.$common.request('sql', sql).then(res => {
+                    const datas = res.variables.data
+                    if (datas[0].count > 0) {
+                        this.$alert(`你已经填写修改个人信息申请,但是还没有审核完毕,不能重复提交申请!`, '提示', {
+                            confirmButtonText: '确定',
+                            callback: action => {}
+                        })
+                    } else {
+                        this.buttonShow = val
+                        const obj = this.$parent.$children.find(t => t.$refs.hasOwnProperty('tabref'))
+                        if (typeof obj !== 'undefined') {
+                            obj.activeName = 'ryjbqk'
+                            obj.activeNameTab = 'ryjbqk'
+                        }
+                        this.$emit('changeBtnShow', val)
+                        this.changeButton(name)
+                    }
+                })
+            } else {
+                this.buttonShow = val
+                const obj = this.$parent.$children.find(t => t.$refs.hasOwnProperty('tabref'))
+                if (typeof obj !== 'undefined') {
+                    obj.activeName = 'ryjbqk'
+                }
+                this.$emit('changeBtnShow', val)
+                this.changeButton(name)
+            }
+        },
+        changeButton (val) {
+            console.log(val, 'aaaaaaaaaaaaaaaaaaaaa')
+            this.$emit('changeBtn', val, this.submitperInfoData)
+            setTimeout(() => {
+                this.$emit('changeBtn', '', {})
+            }, 1000)
+
+            switch (val) {
+                case 'flowChart':
+                    this.flowDiagramVisible = true
+                    break
+                default:
+                    break
+            }
+        },
+        errorHandler () {
+            return true
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.personnelInfo20241107{
+    width: calc(100% - 40px);
+    height: 20%;
+    background-color: #fff;
+    .allInfo{
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        width: calc(100% - 40px);
+        height: 100%;
+        margin: 0 20px;
+        color: #2f2f36;
+        .photoSty{
+            height: 100%;
+            display: flex;
+            align-items: center;
+            span{
+                height: 14vh;
+                width: 14vh;
+                border-radius: 100%;
+            }
+        }
+        .contentSty{
+            height: 100%;
+            width: 100%;
+            display: flex;
+            // align-items: center;
+            flex-direction: column;
+            justify-content: center;
+            .contentHeader{
+                width: 100%;
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+                .contentHeaderLeft{
+                    width: 31.74%;
+                    display: flex;
+                    align-items: center;
+                    p{
+                        width: 20%;
+                        text-align: right;
+                        font-size: 16px;
+                        font-weight: 700;
+                    }
+                    .leftFont{
+                        width: 80%;
+                        font-size: 16px;
+                        font-weight: 700;
+                    }
+                    span{
+                        font-size: 16px;
+                        font-weight: 700;
+                    }
+                }
+            }
+            .contentFooter{
+                width: 100%;
+                .contentFooterC{
+                    display: flex;
+                    align-items: baseline;
+                    p{
+                        width: 20%;
+                        text-align: right;
+                        font-size: 14px;
+                    }
+                    .leftFont{
+                        width: 80%;
+                        font-size: 14px;
+                    }
+                    span{
+                        font-size: 14px;
+                    }
+                    .interspaceTag{
+                        margin: 0 2px;
+                    }
+                    .posSty{
+                        width: 80%;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>

+ 403 - 0
src/views/component/personnelFile/components/zsbTag.vue

@@ -0,0 +1,403 @@
+<template>
+    <div class="zsb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>资格职称证书</span>
+        </div>
+        <div class="hand-btn" :style="judgeTag()?'height:10px;':'height:5.5%;'">
+            <el-button v-if="!judgeTag()" type="primary" size="mini" icon="el-icon-plus" @click="addData">添加</el-button>
+            <el-button v-if="!judgeTag()" type="danger" size="mini" icon="el-icon-close" @click="goRemove">删除</el-button>
+        </div>
+        <!-- <div class="contentAll"> -->
+        <el-form ref="nowData" :model="nowDataObj" :rules="rules" label-width="0px" class="contentAll">
+            <el-table
+                ref="reviewTable"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                :row-key="getRowKey"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="证书名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("zhengShuMingC") > 0 ? scope.row.zhengShuMingC:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.zhengShuMingC'" :rules="rules.school">
+                                <el-input
+                                    v-model="scope.row.zhengShuMingC"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="证件号"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("zhengJianHao") > 0 ? scope.row.zhengJianHao:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.zhengJianHao'" :rules="rules.school">
+                                <el-input
+                                    v-model="scope.row.zhengJianHao"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="发证单位"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("faZhengDanWei") > 0 ? scope.row.faZhengDanWei:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.faZhengDanWei'" :rules="rules.optional">
+                                <el-input
+                                    v-model="scope.row.faZhengDanWei"
+                                    type="text"
+                                    placeholder="请输入"
+                                    show-word-limit
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="发证日期"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("faZhengShiJian") > 0 ? scope.row.faZhengShiJian:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.faZhengShiJian'" :rules="rules.bianzhiriqi">
+                                <el-date-picker
+                                    v-model="scope.row.faZhengShiJian"
+                                    type="date"
+                                    size="mini"
+                                    class=""
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="请选择发证日期"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="档案保存"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div v-if="judgeTag()">
+                            <div>{{ scope.row.hasOwnProperty("dangAnBaoCun") > 0 ? scope.row.dangAnBaoCun:'/' }}</div>
+                        </div>
+                        <div v-else class="grid-content">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.dangAnBaoCun'" :rules="rules.school">
+                                <el-radio-group v-model="scope.row.dangAnBaoCun">
+                                    <el-radio label="复印件">复印件</el-radio>
+                                    <el-radio label="原件">原件</el-radio>
+                                </el-radio-group>
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+
+                <el-table-column
+                    label="获奖证书"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <el-form-item :prop="'nowData.'+ (10*(currentPage-1) +scope.$index)+'.huoJiangZhengS'" :rules="rules.attachmentsNum">
+                                <ibps-attachment
+                                    v-model="scope.row.huoJiangZhengS"
+                                    :download="true"
+                                    multiple
+                                    accept="*"
+                                    :readonly="judgeTag()"
+                                    style="width:100%"
+                                    limlt="5"
+                                />
+                            </el-form-item>
+                        </div>
+                    </template>
+                </el-table-column>
+                <!-- <el-table-column
+                    v-if="!judgeTag()"
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="150">
+                    <template slot-scope="scope">
+                        <el-button @click="handleClick(scope.row)" type="text" size="small">查阅</el-button>
+                        <el-button type="text" size="small">编辑</el-button>
+                    </template>
+                </el-table-column> -->
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </el-form>
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+export default {
+    components: {
+        IbpsAttachment
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        const checkTimeJS = (rule, value, callback) => {
+            console.log(value)
+
+            if (!value) {
+                return callback(new Error('请选择日期'))
+            }
+            setTimeout(() => {
+                const now = this.$common.getDateNow()
+                const nowTime = new Date(now).getTime()
+                const valueTime = new Date(value).getTime()
+                const obj = this.nowData.find(t => t.jieshuriqi === value)
+                const ksTime = obj && obj.bianzhiriqi !== null ? new Date(obj.bianzhiriqi).getTime() : ''
+
+                if (ksTime === '') {
+                    callback(new Error('请先选择开始时间'))
+                } else if (nowTime < valueTime) {
+                    callback(new Error('请选择小于当前日期的时间'))
+                } else if (ksTime >= valueTime) {
+                    callback(new Error('请选择大于开始日期的时间'))
+                }
+            }, 100)
+        }
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            rules: {
+                bianzhiriqi: [
+                    { validator: option.checkTime, trigger: 'change' }
+                ],
+                jieshuriqi: [
+                    { validator: checkTimeJS, trigger: 'change' }
+                ],
+                school: [
+                    { validator: option.checkLength, trigger: 'blur' }
+                ],
+                optional: [
+                    { validator: option.optional, trigger: 'blur' }
+                ],
+                attachmentsNum: [
+                    { validator: option.attachmentsNum, trigger: 'change' }
+                ]
+            },
+            multipleSelection: [],
+            currentPage: 1
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                } else if (val === 'save' || val === 'temporaryStorage' || val === 'submit' || val === 'sendBack' || val === 'agree') {
+                    this.submitForm('nowData', this.nowData)
+                }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        judgeTag () {
+            // return this.planeData.length>0&& this.btnShow === true && this.buttonType!==1 ? true : false
+            return !!(this.btnShow === true && this.buttonType !== 1 && this.buttonType !== 4)
+        },
+        submitForm (formName, val) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    this.$emit('changeBaseData', val, 'zsb')
+                    // alert('submit!')
+                    this.$emit('changeButtonShow', this.$parent.$parent.$parent.btnShow)
+                } else {
+                    console.log('error submit!!')
+                    this.$emit('tipsShowTab', true)
+
+                    return false
+                }
+            })
+        },
+        addData () {
+            if (this.nowData.length % 10 === 0) {
+                this.currentPage = (this.nowData.length / 10) + 1
+            }
+            const mid = { uuid: this.$common.generateUUID() }
+            this.nowData.push(mid)
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        goRemove () {
+            if (this.multipleSelection.length === 0) {
+                this.$message({
+                    message: '请选择要删除的数据',
+                    type: 'warning'
+                })
+                return
+            }
+            this.nowData = this.nowData.filter(item => !this.multipleSelection.includes(item))
+            this.nowDataObj = { nowData: [...this.nowData] }
+        },
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            console.log(`当前页: ${val}`)
+        },
+        getRowKey (row) {
+            if (row.id) {
+                return row.id
+            } else {
+                return row.uuid
+            }
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.zsb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 5.5%;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+
+}
+</style>

+ 273 - 0
src/views/component/personnelFile/components/zwlwglbTag.vue

@@ -0,0 +1,273 @@
+<template>
+    <div class="zwlwglb20241107">
+        <div class="titleAll">
+            <el-divider direction="vertical" />
+            <span>中文论文</span>
+        </div>
+        <div class="hand-btn" />
+        <div class="contentAll">
+            <el-table
+                ref="reviewTableZWLW"
+                :data="nowData.filter((e,m) => Math.floor(m/10)===currentPage-1 )"
+                stripe
+                height="92%"
+                highlight-current-row
+                style="width: 99.5%"
+                class="review-table blue-header tableCol"
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column
+                    type="selection"
+                    min-width="2%"
+                />
+                <el-table-column
+                    type="index"
+                    label="序号"
+                    min-width="5%"
+                />
+                <el-table-column
+                    label="论文题目"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("lunWenTiMu") > 0 ? scope.row.lunWenTiMu:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="期刊名称"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiKanMingCheng") > 0 ? scope.row.qiKanMingCheng:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="期卷号"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiJuanHao") > 0 ? scope.row.qiJuanHao:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="发表日期"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("faBiaoShiJian") > 0 ? scope.row.faBiaoShiJian:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="期刊类别"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        {{ scope.row.hasOwnProperty("qiKanLeiBie") > 0 ? scope.row.qiKanLeiBie:'/' }}
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    label="原文"
+                    min-width="15%"
+                >
+                    <template slot-scope="scope">
+                        <div class="grid-content bg-purple-light">
+                            <ibps-attachment
+                                v-model="scope.row.shangChuanYuan"
+                                :download="true"
+                                multiple
+                                accept="*"
+                                :readonly="true"
+                                style="width:100%"
+                                limlt="5"
+                            />
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    fixed="right"
+                    label="操作"
+                    class-name="handleSty"
+                    width="100"
+                >
+                    <template slot-scope="scope">
+                        <el-button type="text" size="small" @click="handleClick(scope.row)">查阅</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                :current-page.sync="currentPage"
+                :page-size="10"
+                layout="total, prev, pager, next"
+                :total="nowData.length"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <dialog-deltail :dialog-details="dialogDetails" :dialog-data="dialogData" @changeDetails="changeDetails" />
+    </div>
+</template>
+<script>
+import IbpsAttachment from '@/business/platform/file/attachment/selector'
+import option from '../constants/option.js'
+import dialogDeltail from './dialogDeltail'
+
+export default {
+    components: {
+        IbpsAttachment,
+        dialogDeltail
+    },
+    props: {
+        planeData: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        btnShow: {
+            type: Boolean,
+            default: true
+        },
+        btnType: {
+            type: String,
+            default: ''
+        }
+    },
+    data () {
+        return {
+            activeName: 'first',
+            nowData: [],
+            nowDataObj: {},
+            multipleSelection: [],
+            currentPage: 1,
+            dialogDetails: false,
+            dialogData: []
+        }
+    },
+    watch: {
+        planeData: {
+            handler: function (val, oldVal) {
+                // eslint-disable-next-line no-undef
+                this.nowData = structuredClone(val)
+                this.nowDataObj = { nowData: [...this.nowData] }
+            },
+            deep: true,
+            immediate: true
+        },
+        btnType: {
+            handler: function (val, oldVal) {
+                if (val === 'exitEdit') {
+                    // eslint-disable-next-line no-undef
+                    this.nowData = structuredClone(this.planeData)
+                    this.nowDataObj = { nowData: [...this.nowData] }
+                }
+                // else if (val === 'save' || val === 'temporaryStorage' || val === 'submit') {
+                // }
+            },
+            deep: true
+        }
+    },
+    methods: {
+        handleSelectionChange (val) {
+            this.multipleSelection = val
+        },
+        handleCurrentChange (val) {
+            // console.log(`当前页: ${val}`)
+            this.$refs.reviewTableZWLW.$parent.$parent.$parent.$parent.$parent.tabSetData(val)
+        },
+        handleClick (val) {
+            this.dialogDetails = true
+            this.dialogData = [
+                [{ name: '文章编号', contant: val.wenZhangBianHao, type: 'text' }, { name: '发表日期', contant: val.faBiaoShiJian, type: 'text' }],
+                [{ name: '论文题目', contant: val.lunWenTiMu, type: 'text' }, { name: '期刊类别', contant: val.qiKanLeiBie, type: 'text' }],
+                [{ name: '全部作者', contant: val.quanBuZuoZhe, type: 'text' }, { name: '论文链接', contant: val.lunWenLianJie, type: 'text' }],
+                [{ name: '期刊名称', contant: val.qiKanMingCheng, type: 'text' }, { name: '作者排名', contant: val.childGeRenPaiMing, type: 'text' }],
+                [{ name: '期卷号', contant: val.qiJuanHao, type: 'text' }, { name: 'ISSN号', contant: val.issnHao, type: 'text' }],
+                [{ name: '原文', contant: val.shangChuanYuan, type: 'file' }, { name: '备注', contant: val.childBeiZhu, type: 'text' }]
+            ]
+            console.log(this.dialogData)
+        },
+        changeDetails (val) {
+            this.dialogDetails = val
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.zwlwglb20241107{
+    font-size: 12px;
+    color: #2f2f36;
+    .titleAll{
+        ::v-deep .el-divider--vertical{
+            width: 4px;
+            height: 1.4em;
+            background-color: #86c3c7;
+            border-radius: 2px;
+            margin-left: 0;
+            margin-right: 15px;
+        }
+        span{
+            font-size: 15px;
+            font-weight: 700;
+            vertical-align: text-top;
+        }
+    }
+    .hand-btn{
+        width: 99.5%;
+        height: 5.5%;
+        text-align: right;
+        margin: 0.5% 0;
+    }
+    .contentAll{
+        height: 85%;
+        overflow-y: auto;
+        ::v-deep .ibps-attachment-selector{
+            min-width: 0;
+        }
+        .tableCol{
+            height: 92%;
+            overflow-y: auto;
+            ::v-deep .el-table__fixed-right{
+                .el-table__fixed-body-wrapper{
+                    .el-table__body{
+                        .el-table__row{
+                            .handleSty{
+                                text-align: center;
+                            }
+                        }
+                    }
+                }
+                .el-table__fixed-header-wrapper{
+                    .el-table__header{
+                        .handleSty{
+                            text-align: center;
+                        }
+                    }
+                }
+            }
+            ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
+                display: none; /* for Chrome, Safari, and Opera */
+            }
+
+            ::v-deep .el-table__body-wrapper {
+                -ms-overflow-style: none;  /* for Internet Explorer, Edge */
+                scrollbar-width: none;  /* for Firefox */
+            }
+            ::v-deep .el-table__fixed-right-patch{
+                width: 0 !important;
+            }
+        }
+        .tableCol::-webkit-scrollbar{
+            display: none;
+        }
+        .grid-content {
+            ::v-deep .el-date-editor.el-input.el-input--mini.el-input--prefix.el-input--suffix.el-date-editor--date{
+                width: 100%;
+            }
+        }
+    }
+}
+
+</style>

+ 71 - 0
src/views/component/personnelFile/constants/option.js

@@ -0,0 +1,71 @@
+export const checkTime = (rule, value, callback) => {
+    if (!value) {
+        return callback(new Error('请选择日期'))
+    }
+    setTimeout(() => {
+        const nowTime = new Date().getTime()
+        const valueTime = new Date(value).getTime()
+        if (nowTime < valueTime) {
+            callback(new Error('请选择小于当前日期的时间'))
+        } else {
+            callback()
+        }
+    }, 100)
+}
+export const checkLength = (rule, value, callback) => {
+    if (!value) {
+        return callback(new Error('请填写内容'))
+    }
+    setTimeout(() => {
+        if (value.length > 200) {
+            callback(new Error('请将字数限制在200以内'))
+        } else {
+            callback()
+        }
+    }, 100)
+}
+export const optional = (rule, value, callback) => {
+    if (!value) {
+        callback()
+    } else if (value.length > 200) {
+        callback(new Error('请将字数限制在200以内'))
+    } else {
+        callback()
+    }
+}
+export const attachmentsNum = (rule, value, callback) => {
+    if (!value) {
+        callback()
+    } else if (value.split(',').length > 5) {
+        callback(new Error('请将数量限制在5个以内'))
+    } else {
+        callback()
+    }
+}
+export const attachmentsNumOne = (rule, value, callback) => {
+    if (!value) {
+        callback()
+    } else if (value.split(',').length > 1) {
+        callback(new Error('请将数量限制在1个以内'))
+    } else {
+        callback()
+    }
+}
+export const checkNianLing = (rule, value, callback) => {
+    if (!value) {
+        return callback(new Error('请合理选择年龄'))
+    }
+    if (value > 150 || value < 0) {
+        callback(new Error('年龄范围在0~150岁'))
+    } else {
+        callback()
+    }
+}
+export default {
+    checkTime,
+    checkLength,
+    optional,
+    attachmentsNum,
+    checkNianLing,
+    attachmentsNumOne
+}

+ 428 - 0
src/views/component/personnelFile/constants/simulated.js

@@ -0,0 +1,428 @@
+export const baseDataObj = {
+    employee: {
+        title: '',
+        data: {
+            id: '',
+            name: '名字',
+            photo: '',
+            jianDingZiGeZ: '',
+            gender: '',
+            status: '',
+            mobile: '',
+            email: '',
+            job: '',
+            positions: ''
+        }
+    },
+    ryjbqk: {
+        title: '',
+        data: {
+            id: '',
+            parentId: '',
+            jianDangRiQi: '2024-09-12',
+            chuShengRiQi: '2024-09-12',
+            nianLing: '1',
+            zuiGaoXueLiX: '本科',
+            yuanBiYeYuanXi: '学校',
+            ruZhiShiJian: '2024-11-11',
+            zhiChengDengJi: '高级',
+            zhiCheng: '主任',
+            qianZiTuWen: '1305918421677899776',
+            shenFenZhengHao: '232323232323232323232',
+            baoMiXieYi: '1305918421677899776',
+            chengNuoHan: '1305918421677899776',
+            sheBao: '1305918421677899776',
+            renYuanLeiXing: '提供支持性服务的外部人员',
+            fujIan: '1305918421677899776'
+        }
+    },
+    jyjl: {
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                kaiShiShiJian: '2024-09-12',
+                jieShuShiJian: '2024-09-13',
+                xueXiao: '学校',
+                zhuanYe: '软件',
+                xueLiXueWei: '学士',
+                fuJian: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                kaiShiShiJian: '2024-09-12',
+                jieShuShiJian: '2024-09-13',
+                xueXiao: '学校',
+                zhuanYe: '软件',
+                xueLiXueWei: '学士',
+                fuJian: '1305918421677899776'
+            }
+        ]
+    },
+    gzjl: {
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                ruZhiShiJian: '2024-09-12',
+                liZhiShiJian: '2024-09-13',
+                danWeiMingCheng: '医院',
+                buMen: '临检',
+                zhiWei: '检验员',
+                gongZuoNeiRong: '检测',
+                fuJian: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                ruZhiShiJian: '2024-09-12',
+                liZhiShiJian: '2024-09-13',
+                danWeiMingCheng: '医院',
+                buMen: '临检',
+                zhiWei: '检验员',
+                gongZuoNeiRong: '检测',
+                fuJian: '1305918421677899776'
+            }
+        ]
+    },
+    zsb: {
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                zhengShuMingC: '毕业证书',
+                zhengJianHao: '201101101-002',
+                faZhengDanWei: '学校',
+                faZhengShiJian: '2024-09-12',
+                dangAnBaoCun: '原件',
+                huoJiangZhengS: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                zhengShuMingC: '毕业证书',
+                zhengJianHao: '201101101-002',
+                faZhengDanWei: '学校',
+                faZhengShiJian: '2024-09-12',
+                dangAnBaoCun: '原件',
+                huoJiangZhengS: '1305918421677899776'
+            }
+        ]
+    }
+}
+export const externalSourceDataObj = {
+    kyxmglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                xiangMuMingChe: '1212121',
+                xiangMuBianHao: '121212',
+                zhuChiCanYu: '参与',
+                quanBuCanYuRe: '1212',
+                qiZhiShiJian: '2024-09-12',
+                ziZhiDanWei: '111',
+                jieShuShiJian: '2024-09-13',
+                xiangMuLeiXing: '1212',
+                liXiangJingFei: '1212',
+                shangCLXWD: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: '2024-09-12',
+                xiangMuMingChe: '1212121',
+                xiangMuBianHao: '121212',
+                zhuChiCanYu: '参与',
+                quanBuCanYuRe: '1212',
+                qiZhiShiJian: '2024-09-12',
+                ziZhiDanWei: '111',
+                jieShuShiJian: '2024-09-13',
+                xiangMuLeiXing: '1212',
+                liXiangJingFei: '1212',
+                shangCLXWD: '1305918421677899776'
+            }
+        ]
+    },
+    kjhjcgglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                jiangLiLeiXing: 'qww',
+                jiangLiXiangMu: '研究',
+                huoJiangShiJia: '2024-09-13',
+                quanBuHuoJiang: '1,2,3',
+                geRenPaiMing: '1',
+                danWei: '医院',
+                paiMing: '2',
+                shangCHJZS: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                jiangLiLeiXing: 'qww',
+                jiangLiXiangMu: '研究',
+                huoJiangShiJia: '2024-09-13',
+                quanBuHuoJiang: '1,2,3',
+                geRenPaiMing: '1',
+                danWei: '医院',
+                paiMing: '2',
+                shangCHJZS: '1305918421677899776'
+            }
+        ]
+    },
+    SCIwzglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                qiJuanHao: '20220101-111',
+                lunWenTiMu: '题目',
+                yingXiangYZIf: '23',
+                quanBuZuoZhe: '1,2,3',
+                geRenPaiMing: '2',
+                qiKanMingCheng: '名称',
+                lunWenLianJie: 'https://',
+                faBiaoShiJian: '2024-09-12',
+                wosHao: '243234',
+                shangChuanYuan: '1305918421677899776',
+                beiZhu: 'dffsfsdfsdf'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                qiJuanHao: '20220101-111',
+                lunWenTiMu: '题目',
+                yingXiangYZIf: '23',
+                quanBuZuoZhe: '1,2,3',
+                geRenPaiMing: '2',
+                qiKanMingCheng: '名称',
+                lunWenLianJie: 'https://',
+                faBiaoShiJian: '2024-09-12',
+                wosHao: '243234',
+                shangChuanYuan: '1305918421677899776',
+                beiZhu: 'dffsfsdfsdf'
+            }
+        ]
+    },
+    zwlwglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                faBiaoShiJian: '2024-09-12',
+                lunWenTiMu: '',
+                qiKanLeiBie: 'CSCD核心库与扩展库及EI',
+                quanBuZuoZhe: '1,2,3',
+                lunWenLianJie: 'https://',
+                qiKanMingCheng: '期刊',
+                geRenPaiMing: '2',
+                qiJuanHao: '22',
+                issnHao: '666',
+                shangChuanYuan: '1305918421677899776',
+                beiZhuA: '2132137239812739'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                faBiaoShiJian: '2024-09-12',
+                lunWenTiMu: '',
+                qiKanLeiBie: 'CSCD核心库与扩展库及EI',
+                quanBuZuoZhe: '1,2,3',
+                lunWenLianJie: 'https://',
+                qiKanMingCheng: '期刊',
+                geRenPaiMing: '2',
+                qiJuanHao: '22',
+                issnHao: '666',
+                shangChuanYuan: '1305918421677899776',
+                beiZhuA: '2132137239812739'
+            }
+        ]
+    },
+    kyzzglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                chuBanShe: '出版社',
+                zhuanZhuoMingChen: '书名',
+                chuBanShiJian: '2024-09-12',
+                quanBuZuoZhe: '1,2,3',
+                bianZhuanZiShu: '100002',
+                zhuBianBianWei: '主编',
+                lianJie: 'https://',
+                shangChuanYuan: '1305918421677899776',
+                beiZhu: 'sdfsfsdff'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                chuBanShe: '出版社',
+                zhuanZhuoMingChen: '书名',
+                chuBanShiJian: '2024-09-12',
+                quanBuZuoZhe: '1,2,3',
+                bianZhuanZiShu: '100002',
+                zhuBianBianWei: '主编',
+                lianJie: 'https://',
+                shangChuanYuan: '1305918421677899776',
+                beiZhu: 'sdfsfsdff'
+            }
+        ]
+    },
+    kyzlglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                leiBie: '类别',
+                zhuanLiMingCheng: '',
+                shenQingShiJian: '2024-09-12',
+                quanBuShenQingRen: '人',
+                shouQuanShiJian: '2024-09-12',
+                zhuanLiQuanRen: '人',
+                geRenPaiMing: '2',
+                fuJian: '1305918421677899776',
+                beiZhu: 'sdfsfsdff'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                leiBie: '类别',
+                zhuanLiMingCheng: '',
+                shenQingShiJian: '2024-09-12',
+                quanBuShenQingRen: '人',
+                shouQuanShiJian: '2024-09-12',
+                zhuanLiQuanRen: '人',
+                geRenPaiMing: '2',
+                fuJian: '1305918421677899776',
+                beiZhu: 'sdfsfsdff'
+            }
+        ]
+    },
+    jxjyxmxshdglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                xueFen: '34',
+                xiangMuBianHao: '20120102-002',
+                juBanShiJian: '2024-09-12',
+                quanBuZuoZhe: '1,2,3',
+                juBanDiDian: '会议室',
+                huiYiMingCheng: '开会',
+                heZuoDanWei: '医院',
+                xueFenJiBie: '国家级继教项目',
+                huoDXCZPSC: '1305918421677899776',
+                huiYiTongZhiS: '1305918421677899776'
+            },
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                xueFen: '34',
+                xiangMuBianHao: '20120102-002',
+                juBanShiJian: '2024-09-12',
+                quanBuZuoZhe: '1,2,3',
+                juBanDiDian: '会议室',
+                huiYiMingCheng: '开会',
+                heZuoDanWei: '医院',
+                xueFenJiBie: '国家级继教项目',
+                huoDXCZPSC: '1305918421677899776',
+                huiYiTongZhiS: '1305918421677899776'
+            }
+        ]
+    },
+    kphdglb: {
+        display: 'Y',
+        title: '',
+        data: [
+            {
+                id: '',
+                parentId: '',
+                tenantId: '',
+                xingMing: 'name',
+                kePuBianHao: '123',
+                huoDongShiJian: '2024-09-09',
+                kePuXingShi: '科普文章',
+                fuJian: '1305918421677899776',
+                beiZhu: '12312321321321'
+            }
+        ]
+    }
+}
+export const tabName = {
+    kphdglb: 'kphd',
+    kyxmglb: 'kyxm',
+    kjhjcgglb: 'kjhjcg',
+    SCIwzglb: 'sci',
+    zwlwglb: 'zwlw',
+    kyzzglb: 'kyzz',
+    kyzlglb: 'kyzl',
+    jxjyxmxshdglb: 'jxjy',
+    bmsm: 'bmsm'
+}
+export const data = '{"id":"","diDian":"1257660949100232704","shiFouGuoShen":"已编制","jiaoYuId":"1315704890411974656,1309159909132075008","gongZuoId":"1309159909136269313,1315700904648769536,1309159909136269312","neiBuId":"1304386884142628865","waiBuId":"","kaoHeId":"","keYanId":"1278845812985561088","huoJiangId":"1313555341203472384,1314646912695009280","scIid":"","zhongWenId":"1313562201641975808","zhuanZhuoId":"1314884868894621696","zhuanLiId":"1313563580292923392","jiXuId":"","zhengShuId":"1309159909136269315,1309159909136269314,1315704890915291136","kaoShiId":"","bianZhiBuMen":"1259815242628595712","bianZhiRen":"702117247933480960","bianZhiShiJian":"2024-12-10 11:16","buMen":"1257661032474607616,1259815242628595712,1259815355627339776,1259815408806920192,1259815458987573248,1259815511915495424,1259815603112247296,1259815645608935424","dianHua":"18373382991","mingCheng":"702117247933480960","youXiang":"938764563@qq.com","yuanGongBianHao":"12231","diZhi":"2222","xingBie":"male","gangWei":"466555953945247744","jianDangRiQi":"","zuiGaoXueLiXueWei":"博士","zhiChengDengJi":"中级","shenFenZhengHaoMa":"","chuShengRiQi":"1996-07-11","nianLing":28,"biYeYuanXiao":"","ruZhiShiJian":"","zhiCheng":"","qianZiTuWen":"","baoMiXieYi":"","chengNuoHan":"","sheBao":"","jyjl":[],"gzjl":[],"xygpx":[],"pxjl":[],"rykhda":[],"kyxm":[],"kjhjcg":[],"SCIwztjb":[],"zwlw":[],"kyzz":[],"kyzl":[],"jxjyxmxshd":[],"zsb":[],"ksjlb":[]}'
+
+// export const baseName = {
+//     ryjbqk: 'kphd',
+//     kyxmglb: 'kyxm',
+//     kjhjcgglb: 'kjhjcg',
+//     SCIwzglb: 'sci',
+//     zwlwglb: 'zwlw',
+//     kyzzglb: 'kyzz',
+//     kyzlglb: 'kyzl',
+//     jxjyxmxshdglb: 'jxjy',
+//     bmsm: 'bmsm'
+// }
+export default {
+    baseDataObj,
+    externalSourceDataObj,
+    tabName,
+    data
+    // baseName
+}

+ 486 - 0
src/views/component/personnelFile/index.vue

@@ -0,0 +1,486 @@
+<template>
+    <div class="personFile20241107" :style="$attrs.params&&$attrs.params.attrs.flow!=''?'height:100vh':'height:100%'">
+        <el-dialog
+            v-if="type=='dialog'"
+            title=""
+            class="personFileDialog20241107"
+            :visible.sync="dialogVisible"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+            :append-to-body="true"
+            :fullscreen="true"
+            :show-close="false"
+            center
+        >
+            <div class="dialogSty">
+                <div v-if="stauts!=='已完成'||stauts!==''" style="position: absolute;top:2%;" v-html="stauts==='已退回'?seal.sealNo:stauts==='待审核'?seal.sealPing:seal.sealSuc" />
+                <personnel-info class="perInfo" :button-type="$attrs.params?$attrs.params.attrs.flow*1:buttonType" :type="type" :btn-show="btnShow" :btn-type="btnType" :person-info-data="personInfoData" @showTF="showTF" @changeBtn="changeBtn" @changeBtnShow="changeBtnShow" />
+                <modules-tag
+                    class="moudleTab"
+                    :tag-data="tagData"
+                    :base-data="baseData"
+                    :type="type"
+                    :btn-show="btnShow"
+                    :btn-type="btnType"
+                    :button-type="$attrs.params?$attrs.params.attrs.flow*1:buttonType"
+                    @getChangeBaseData="getChangeBaseData"
+                    @tipsShow="tipsShow"
+                    @changeTabs="changeTabs"
+                    @changeBtnShow="changeBtnShow"
+                />
+            </div>
+        </el-dialog>
+        <div v-else class="personFilePlane20241107">
+            <div class="planeSty">
+                <div v-if="stauts!=''" style="position: absolute;top:2%;" v-html="stauts==='已退回'?seal.sealNo:stauts==='待审核'?seal.sealPing:seal.sealSuc" />
+                <personnel-info class="perInfo" :button-type="$attrs.params?$attrs.params.attrs.flow*1:buttonType" :btn-show="btnShow" :btn-type="btnType" :person-info-data="personInfoData" @showTF="showTF" @changeBtn="changeBtn" @changeBtnShow="changeBtnShow" />
+                <modules-tag
+                    class="moudleTab"
+                    :tag-data="tagData"
+                    :base-data="baseData"
+                    :type="type"
+                    :btn-show="btnShow"
+                    :btn-type="btnType"
+                    :button-type="$attrs.params?$attrs.params.attrs.flow*1:buttonType"
+                    @getChangeBaseData="getChangeBaseData"
+                    @tipsShow="tipsShow"
+                    @changeTabs="changeTabs"
+                    @changeBtnShow="changeBtnShow"
+                />
+            </div>
+        </div>
+
+    </div>
+</template>
+<script>
+import personnelInfo from './components/personnelInfo.vue'
+import modulesTag from './components/modulesTag.vue'
+import simulated from './constants/simulated'
+import seal from './utils/seal.js'
+
+import { getInfo, setInfo } from '@/api/platform/personFile/base'
+import { get } from '@/api/platform/personFile/unidirectionalCorrelation'
+import { startFlow } from '@/api/platform/bpmn/bpmInst'
+import { agree, reject } from '@/api/platform/bpmn/bpmTask'
+
+export default {
+    components: {
+        personnelInfo,
+        modulesTag
+    },
+    props: {
+        visible: {
+            type: Boolean,
+            default: true
+        },
+        type: {
+            type: String,
+            default: ''
+        },
+        buttonType: {
+            type: Number,
+            default: 0
+        },
+        personID: {
+            type: String,
+            default: ''
+        },
+        flowNode: {
+            type: String,
+            default: ''
+        },
+        flow: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data () {
+        const { userId, userList = [], userInfo } = this.$store.getters
+        return {
+            userId,
+            userList,
+            userInfo,
+            dialogVisible: this.visible,
+            personInfoData: {},
+            tagData: {},
+            baseData: {},
+            btnShow: true,
+            btnType: '',
+            activeName: 'ryjbqk',
+            infoNumArr: [],
+            seal,
+            stauts: '',
+            tipsControls: false
+        }
+    },
+    watch: {
+        dialogVisible: {
+            handler: function (val, oldVal) {
+                // if(val == true){
+                // }
+            },
+            deep: true,
+            immediate: true
+        },
+        activeName: {
+            handler: function (val, oldVal) {
+                if (this.type === 'dialog') {
+                    this.tabChangeSetData(this.personID, val, 1)
+                } else {
+                    this.tabChangeSetData(this.userId, val, 1)
+                }
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+    created () {
+        console.log(this)
+        if (this.$attrs.params) {
+            const sql1 = `select a.CREATE_BY_ from ibps_bpm_inst a join ibps_bpm_task_pendding b on b.proc_inst_id_=a.id_ where b.PROC_DEF_KEY_ = 'Process_08xwabfNEW' and b.task_id_ ='${this.$attrs.params.taskId}'`
+            // const sql1 = `select CREATE_BY_ FROM ibps_bpm_oper_log WHERE PROC_INST_ID_ = (SELECT PROC_INST_ID_ FROM ibps_bpm_bus_rel WHERE BUSINESSKEY_ = "${this.$attrs.params.attrs.id}" LIMIT 1 )AND OPER_TYPE_ IN('start')`
+            const sql2 = `select CREATE_BY_ FROM ibps_bpm_oper_log WHERE PROC_INST_ID_ = '${this.$attrs.params.instanceId}' AND OPER_TYPE_ IN('start') ORDER BY CREATE_TIME_ asc limit 1`
+            this.$common.request('sql', this.$attrs.params.hasOwnProperty('taskId') ? sql1 : this.$attrs.params.hasOwnProperty('instanceId') ? sql2 : '').then((r) => {
+                const datas = r.variables.data.length > 0 ? r.variables.data[0].CREATE_BY_ : ''
+                this.userId = datas
+                this.init(this.userId)
+            })
+        } else {
+            if (this.type === 'dialog') {
+                this.init(this.personID)
+            } else {
+                this.init(this.userId)
+            }
+        }
+    },
+    methods: {
+        init (val) {
+            getInfo({ id: val }).then(res => {
+                this.personInfoData = res.data
+                this.stauts = this.personInfoData.ryjbqkInfoPoList[0].shiFouGuoShen
+                // 保存基本数据
+                simulated.baseDataObj.ryjbqk.data = res.data.ryjbqkInfoPoList[0]
+                this.$set(this.baseData, 'ryjbqk', simulated.baseDataObj.ryjbqk)
+                simulated.baseDataObj.jyjl.data = res.data.educationInfoPoList
+                this.$set(this.baseData, 'jyjl', simulated.baseDataObj.jyjl)
+                simulated.baseDataObj.gzjl.data = res.data.workInfoPoList
+                this.$set(this.baseData, 'gzjl', simulated.baseDataObj.gzjl)
+                simulated.baseDataObj.zsb.data = res.data.certificateInfoPoList
+                this.$set(this.baseData, 'zsb', simulated.baseDataObj.zsb)
+            })
+            const sql1 = `select * from t_rydatablpzb where xian_shi_yin_cang = 'Y'`
+            this.$common.request('sql', sql1).then((r) => {
+                const { data = [] } = r.variables || []
+                data.forEach(e => {
+                    this.$set(this.tagData, e.dui_ying_biao_min, { display: e.xian_shi_yin_cang, title: e.tab_zhong_wen_min })
+                })
+            })
+        },
+        showTF (val) {
+            if (this.$attrs.params && this.$attrs.params.attrs.flow) {
+                this.$emit('close', false)
+            }
+            this.dialogVisible = val
+        },
+        changeTabs (val) {
+            this.activeName = val
+        },
+        tabChangeSetData (id, val, page) {
+            if (this.tagData.hasOwnProperty(val)) {
+                get({ 'customs': {
+                    'id': id, // 人员id
+                    'type': simulated.tabName[val] // 科研类型
+                }
+                // 'requestPage': { // 分页信息,可为空
+                //     'pageNo': page,
+                //     'limit': 10
+                // }
+                }).then(res => {
+                    const data = res.data.dataResult || []
+                    this.$set(this.tagData, val, { ...this.tagData[val], ...{ data: data }})
+                })
+            }
+        },
+        tabSetData (page) {
+            if (this.type === 'dialog') {
+                this.tabChangeSetData(this.personID, this.activeName, page)
+            } else {
+                this.tabChangeSetData(this.userId, this.activeName, page)
+            }
+        },
+        changeBtnShow (val) {
+            this.btnShow = val
+        },
+        getChangeBaseData (val, name) {
+            // console.log(this.infoNumArr, this.btnType, this.tipsControls, (this.btnType === 'save' || this.btnType === 'agree' || this.btnType === 'submit' || this.btnType === 'sendBack') && this.tipsControls === false, "(this.btnType === 'save' || this.btnType === 'agree' || this.btnType === 'submit' || this.btnType === 'sendBack') && this.tipsControls === false")
+            if ((this.btnType === 'save' || this.btnType === 'agree' || this.btnType === 'submit' || this.btnType === 'sendBack') && this.tipsControls === false && this.checkData(this.personInfoData)) {
+                switch (name) {
+                    case 'ryjbqk':
+                        // eslint-disable-next-line no-undef
+                        this.personInfoData.ryjbqkInfoPoList[0] = structuredClone(val)
+                        this.personInfoData.ryjbqkInfoPoList[0].shiFouGuoShen = this.btnType === 'submit' || (this.btnType === 'agree' && this.$attrs.params.attrs.flow * 1 === 4) ? '待审核' : this.btnType === 'sendBack' ? '已退回' : '已完成'
+                        this.infoNumArr.push(1)
+                        break
+                    case 'zsb':
+                        // eslint-disable-next-line no-undef
+                        this.personInfoData.certificateInfoPoList = structuredClone(val)
+                        this.infoNumArr.push(1)
+                        break
+                    case 'gzjl':
+                        // eslint-disable-next-line no-undef
+                        this.personInfoData.workInfoPoList = structuredClone(val)
+                        this.infoNumArr.push(1)
+                        break
+                    case 'jyjl':
+                        // eslint-disable-next-line no-undef
+                        this.personInfoData.educationInfoPoList = structuredClone(val)
+                        this.infoNumArr.push(1)
+                        break
+                    default:
+                        break
+                }
+                if (this.infoNumArr.length === 4) {
+                    if (this.btnType === 'submit') {
+                        startFlow(
+                            {
+                                'defId': '1315609540510613504',
+                                'version': '0',
+                                'data': simulated.data
+                            }
+                        ).then(res => {
+                            this.$alert(`启动成功!`, '提示', {
+                                confirmButtonText: '确定',
+                                callback: action => {
+                                    this.$children[0].buttonShow = true
+                                    this.infoNumArr = []
+                                    this.saveData(this.personInfoData, 'Refresh')
+                                }
+                            })
+                        })
+                    } else if (this.btnType === 'agree') {
+                        agree(
+                            {
+                                'opinion': '同意',
+                                'taskId': this.$attrs.params.taskId,
+                                'data': simulated.data
+                            }
+                        ).then(res => {
+                            this.$alert(`任务办理成功!`, '提示', {
+                                confirmButtonText: '确定',
+                                callback: action => {
+                                    this.showTF(false)
+                                    this.infoNumArr = []
+                                    this.saveData(this.personInfoData)
+                                }
+                            })
+                        })
+                    } else if (this.btnType === 'sendBack') {
+                        console.log(this.$attrs.params.taskId)
+                        reject(
+                            {
+                                'backHandMode': 'normal',
+                                'destination': '',
+                                'opinion': '退回修改',
+                                'rejectMode': 'reject',
+                                'taskId': this.$attrs.params.taskId,
+                                'data': simulated.data
+                            }
+                        ).then(res => {
+                            this.$alert(`已退回!`, '提示', {
+                                confirmButtonText: '确定',
+                                callback: action => {
+                                    this.showTF(false)
+                                    this.infoNumArr = []
+                                    this.saveData(this.personInfoData)
+                                }
+                            })
+                        })
+                    } else if (this.btnType === '') {
+                        console.log('重置')
+                    } else if (this.btnType === 'save') {
+                        this.saveOperate()
+                        // const sql = `select b.id_,b.name_ from ibps_bpm_inst a join ibps_bpm_tasks b on b.PROC_DEF_KEY_=a.PROC_DEF_KEY_ where b.PROC_DEF_KEY_ = 'Process_08xwabfNEW' and a.CREATE_BY_ ='${this.personID}'`
+                        // this.$common.request('sql', sql).then(res => {
+                        //     const datas = res.variables.data.length > 0 ? res.variables.data[0] : ''
+                        //     if (datas.id_ !== '') {
+                        //         agree(
+                        //             {
+                        //                 'opinion': '同意',
+                        //                 'taskId': datas.id_,
+                        //                 'data': simulated.data
+                        //             }
+                        //         ).then(res1 => {
+                        //             if (datas.name_ === '编制') {
+                        //                 agree(
+                        //                     {
+                        //                         'opinion': '同意',
+                        //                         'taskId': datas.id_,
+                        //                         'data': simulated.data
+                        //                     }
+                        //                 ).then(res2 => {
+                        //                     this.$alert(`办理成功!`, '提示', {
+                        //                         confirmButtonText: '确定',
+                        //                         callback: action => {
+                        //                             this.showTF(false)
+                        //                             this.infoNumArr = []
+                        //                             this.saveData(this.personInfoData)
+                        //                         }
+                        //                     })
+                        //                 })
+                        //             } else {
+                        //                 this.$alert(`办理成功!`, '提示', {
+                        //                     confirmButtonText: '确定',
+                        //                     callback: action => {
+                        //                         this.showTF(false)
+                        //                         this.infoNumArr = []
+                        //                         this.saveData(this.personInfoData)
+                        //                     }
+                        //                 })
+                        //             }
+                        //         })
+                        //     } else {
+                        //         this.infoNumArr = []
+                        //         this.saveData(this.personInfoData)
+                        //     }
+                        // })
+                    } else {
+                        this.infoNumArr = []
+                        this.saveData(this.personInfoData)
+                    }
+                }
+            }
+        },
+        saveData (val, r) {
+            setInfo(val).then(res => {
+                this.showTF(false)
+                if (r === 'Refresh') {
+                    location.reload()
+                }
+            })
+        },
+        changeBtn (val, data) {
+            this.btnType = val
+            if (Object.keys(data).length > 0) {
+                this.personInfoData = data
+            }
+            if ((this.btnType === 'save' || this.btnType === 'agree' || this.btnType === 'submit' || this.btnType === 'sendBack') && this.tipsControls === false && !this.checkData(this.personInfoData)) {
+                this.tipsMess('请检查表单数据是否填写正确')
+            }
+        },
+        tipsShow (val, name) {
+            // console.log(val, this.tipsControls, val && this.tipsControls === false, 'tttttttttttttt')
+
+            console.log(this.infoNumArr, '23123213213123213123123213213123')
+            if (val && this.tipsControls === false) {
+                this.infoNumArr = []
+
+                this.tipsControls = true
+                this.tipsMess('请检查表单数据是否填写正确')
+            }
+        },
+        checkData (val) {
+            const nameArr = ['name', 'jianDingZiGeZ', 'gender']
+            let identification = 0
+            nameArr.forEach((item, i) => {
+                if (val[item] === '' || val[item] === null) {
+                    identification = 1
+                }
+            })
+            return identification === 0
+        },
+        tipsMess (val) {
+            const that = this
+            this.$message({
+                message: val,
+                type: 'warning',
+                onClose: () => {
+                    that.tipsControls = false
+                }
+            })
+        },
+        saveOperate () {
+            const sql = `select b.id_,b.name_ from ibps_bpm_inst a join ibps_bpm_tasks b on b.PROC_DEF_KEY_=a.PROC_DEF_KEY_ where b.PROC_DEF_KEY_ = 'Process_08xwabfNEW' and a.CREATE_BY_ ='${this.personID}'`
+            this.$common.request('sql', sql).then(res => {
+                const datas = res.variables.data.length > 0 ? res.variables.data[0] : ''
+                if (res.variables.data.length > 0 && datas.id_ !== '') {
+                    agree(
+                        {
+                            'opinion': '同意',
+                            'taskId': datas.id_,
+                            'data': simulated.data
+                        }
+                    ).then(res1 => {
+                        if (datas.name_ === '编制') {
+                            this.saveOperate()
+                        } else {
+                            this.$alert(`办理成功!`, '提示', {
+                                confirmButtonText: '确定',
+                                callback: action => {
+                                    this.showTF(false)
+                                    this.infoNumArr = []
+                                    this.saveData(this.personInfoData)
+                                }
+                            })
+                        }
+                    })
+                } else {
+                    this.infoNumArr = []
+                    this.saveData(this.personInfoData)
+                }
+            })
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.personFile20241107{
+    background-color: #f9ffff;
+    width: 100%;
+    height: 100%;
+}
+.personFileDialog20241107{
+    ::v-deep .el-dialog__header{
+        display: none;
+    }
+    ::v-deep .el-dialog{
+        background-color: #f9ffff;
+    }
+    .dialogSty{
+        width: 100%;
+        height: calc(100vh - 40px);
+        padding-top: 20px;
+        display: flex;
+        // justify-content: center;
+        flex-direction: column;
+        align-items: center;
+        // padding-top: 1%;
+        .perInfo{
+            // margin-top: 2%;
+            box-shadow:
+            0 -2px 12px 0 rgba(0,0,0,.04),
+            2px 0px 12px 0 rgba(0,0,0,.04),
+            -2px 0px 12px 0 rgba(0,0,0,.04);
+        }
+    }
+}
+.personFilePlane20241107{
+    width: 100%;
+    height: calc(100% - 40px);
+    padding-top: 20px;
+    .planeSty{
+        width: 100%;
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        .perInfo{
+            // margin-top: 2%;
+            box-shadow:
+            0 -2px 12px 0 rgba(0,0,0,.04),
+            2px 0px 12px 0 rgba(0,0,0,.04),
+            -2px 0px 12px 0 rgba(0,0,0,.04);
+            border-radius: 4px 4px 0 0;
+        }
+    }
+}
+</style>

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
src/views/component/personnelFile/utils/seal.js


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff