Jelajahi Sumber

Merge branch 'dev' of http://www.baoxianzhanggui.com:8090/sxzgd/vue-insagent-pc into dev

@dongkboy 2 tahun lalu
induk
melakukan
9ca75d1089
26 mengubah file dengan 1248 tambahan dan 239 penghapusan
  1. 2 2
      config/dev.env.js
  2. 2 2
      config/test.env.js
  3. 12 0
      src/assets/image/people/state.svg
  4. 496 0
      src/components/PersonnelHistory/index.vue
  5. 3 3
      src/components/UserDetail/index.vue
  6. 1 1
      src/views/AgreementManage/InsuranceCompany/CargoTruck/BusinessOperation/Fuel/OptionalsolutionConfig.vue
  7. 1 1
      src/views/AgreementManage/InsuranceCompany/CargoTruck/BusinessOperation/NewEnergy/OptionalsolutionConfig.vue
  8. 1 1
      src/views/AgreementManage/InsuranceCompany/CargoTruck/NonBusiness/Fuel/OptionalsolutionConfig.vue
  9. 1 1
      src/views/AgreementManage/InsuranceCompany/CargoTruck/NonBusiness/NewEnergy/OptionalsolutionConfig.vue
  10. 1 1
      src/views/AgreementManage/InsuranceCompany/PassengerBus/BusinessOperation/Fuel/OptionalsolutionConfig.vue
  11. 1 1
      src/views/AgreementManage/InsuranceCompany/PassengerBus/BusinessOperation/NewEnergy/OptionalsolutionConfig.vue
  12. 1 1
      src/views/AgreementManage/InsuranceCompany/PassengerBus/NonBusiness/Fuel/OptionalsolutionConfig.vue
  13. 1 1
      src/views/AgreementManage/InsuranceCompany/PassengerBus/NonBusiness/NewEnergy/OptionalsolutionConfig.vue
  14. 18 1
      src/views/PeopleManage/Agent/AgentManage.vue
  15. 91 0
      src/views/PeopleManage/MobileZoomDiv.vue
  16. 88 0
      src/views/PeopleManage/MobileZoomDivR.vue
  17. 88 0
      src/views/PeopleManage/MobileZoomDivTR.vue
  18. 4 4
      src/views/PeopleManage/PartnerExtraction.vue
  19. 326 210
      src/views/PeopleManage/PcLoginRecord.vue
  20. 20 1
      src/views/PeopleManage/Player/PlayerManage.vue
  21. 18 1
      src/views/PeopleManage/Player/PlayerManageteam.vue
  22. 18 2
      src/views/PeopleManage/Sales/SalesManage.vue
  23. 21 1
      src/views/PeopleManage/Staff/StaffManage.vue
  24. 19 2
      src/views/PeopleManage/TeamLeader/TeamLeaderManage.vue
  25. 12 0
      src/views/PeopleManage/UserMap.vue
  26. 2 2
      src/views/Task/DaikeLetter.vue

+ 2 - 2
config/dev.env.js

@@ -5,7 +5,7 @@ const prodEnv = require('./prod.env')
 module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
   ENV_CONFIG: '"dev"',
-  // BASE_URL: '"https://test.baoxianzhanggui.com/web-api"',//测试服务器
+  BASE_URL: '"https://test.baoxianzhanggui.com/web-api"',//测试服务器
   // BASE_URL:'"https://sxzgkj.baoxianzhanggui.com/web-api"',//正式服务器
   // BASE_URL:'"https://sxzgkj.baoxianzhanggui.com/web-api"'//正式服务器
   // BASE_URL: '"http://192.168.0.115:8080/"', //凯森
@@ -17,7 +17,7 @@ module.exports = merge(prodEnv, {
   // BASE_URL: '"http://192.168.1.101:8080/"',
   // BASE_URL: '"http://192.168.0.250:8080/"',//
   // BASE_URL: '"http:///192.168.0.103:8080/"',//霍续亮
-  BASE_URL: '"http://192.168.0.52:8080/"',//贺礼霄
+  // BASE_URL: '"http://192.168.0.52:8080/"',//贺礼霄
   // BASE_URL: '"http:///192.168.0.55:8080/"',// 董鑫
   CONSOLE_BASE_URL: '"http://localhost:8080/"', //控制台测试服务器
   // CONSOLE_BASE_URL: '"https://test.baoxianzhanggui.com/console-api"' //控制台正式服务器

+ 2 - 2
config/test.env.js

@@ -6,8 +6,8 @@ module.exports = merge(prodEnv, {
   NODE_ENV: '"testing"',
   ENV_CONFIG: '"test"',
   // BASE_URL: '"http://proxy.517game.site:6100"',//测试服务器
-  // BASE_URL: '"https://test.baoxianzhanggui.com/web-api"',//测试服务器
-  BASE_URL: '"https://pre.baoxianzhanggui.com/test/"',
+  BASE_URL: '"https://test.baoxianzhanggui.com/web-api"',//测试服务器
+  // BASE_URL: '"https://pre.baoxianzhanggui.com/test/"',
   APP_BASE_URL: '"https://test.baoxianzhanggui.com/web-api"',    // app打包上传地址
   CONSOLE_BASE_URL: '"https://test.baoxianzhanggui.com/console-api"', //控制台测试服务器
   SOCKET_Url: '"wss://test.baoxianzhanggui.com/web-api/"',

+ 12 - 0
src/assets/image/people/state.svg

@@ -0,0 +1,12 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 1000006926">
+<circle id="Ellipse 1009" cx="8" cy="8" r="8" fill="#D42426" fill-opacity="0.2"/>
+<circle id="Ellipse 1008" cx="8" cy="8" r="5" fill="url(#paint0_linear_144_8637)"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_144_8637" x1="10.5" y1="12" x2="5.5" y2="4" gradientUnits="userSpaceOnUse">
+<stop stop-color="#D42426"/>
+<stop offset="1" stop-color="#FD2B2D"/>
+</linearGradient>
+</defs>
+</svg>

+ 496 - 0
src/components/PersonnelHistory/index.vue

@@ -0,0 +1,496 @@
+<template>
+    <el-dialog  :title="dialogInfo.title" 
+                :visible.sync="dialogInfo.visible" 
+                :show-close="false"
+                top="5vh"
+                width="35%"
+                v-dialogDrag
+                class="personnel_history">
+        <div class="container">
+            <div class="item" v-for="(item,index) of dialogInfo.data" :key="index">
+                <div class="heade">
+                    <div class="title_state">{{ item.status }}</div>
+                    <div class="date">{{ item.createTime }}</div>
+                </div>
+                <div class="card_content">
+                    <div class="row">
+                        <label class="label">提交人</label>
+                        <div class="content">{{ item.createBy }}</div>
+                    </div>
+                    <div class="row">
+                        <label class="label" :title="'修改内容'">修改内容</label>
+                        <div class="content">
+                            <div class="edit_item" v-for="(row, index) in item.list" :key="index">
+                                <div class="oldValue">
+                                    <div class="oldState">修改前</div>
+                                    <div class="key" :title="translate(row.propertyName)">{{ translate(row.propertyName) }}</div>
+                                    <div class="value"  v-if="row.propertyName == 'isSpeciality'">{{ row.oldValue == 1 ? '是' : row.oldValue == 2 ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'realName'">{{ row.oldValue == 'true' ? '是' : row.oldValue == 'false' ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'bankAuthentication'">{{ row.oldValue == 'true' ? '是' : row.oldValue == 'false' ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'sex'">{{ translateSex(row.oldValue) }}</div>
+                                    <div class="value"  v-else>{{ row.oldValue == 'null' ? '--' : row.oldValue }}</div>
+                                    <div class="oldLine"></div>
+                                </div>
+                                <div class="newValue">
+                                    <div class="newState">修改后</div>
+                                    <div class="key" :title="translate(row.propertyName)">{{ translate(row.propertyName) }}</div>
+                                    <div class="value"  v-if="row.propertyName == 'isSpeciality'">{{ row.newValue == 1 ? '是' : row.newValue == 2 ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'realName'">{{ row.newValue == 'true' ? '是' : row.newValue == 'false' ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'bankAuthentication'">{{ row.newValue == 'true' ? '是' : row.newValue == 'false' ? '否' : '' }}</div>
+                                    <div class="value" v-else-if="row.propertyName == 'sex'">{{ translateSex(row.newValue) }}</div>
+                                    <div class="value" v-else :title="row.newValue">{{ row.newValue == 'null' ? '--' : row.newValue }}</div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="step-line"></div>
+            </div>
+        </div>
+        <div class="handler">
+            <el-button size="small" type="primary"  class="closeBtn" @click="close">取消</el-button>            
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+import mixa from "@/views/PeopleManage/mixin";
+const mixin = new mixa({
+  treeTypeNum: null,
+});
+export default {
+    props:{
+        isBusiness: Boolean,
+        default: false
+    },
+    mixins: [mixin],
+    data(){
+        return{
+            dialogInfo: {
+                title: '人员轨迹',
+                visible: false,
+                data: []
+            },
+            translations: {
+                pdeptId: '机构名称',
+                deptId: '机构名称',
+                positionId: '岗位',
+                id: '工号',
+                name: '姓名',
+                mobile: '手机号',
+                entryTime:  '入司时间',
+                status: '状态',
+                roleId: '角色',
+                leaderId: '管理人',
+                leaderName: '管理人工号',
+                agentQualificationCode: '代理人资格证号',
+                referrerId: '推荐人',
+                referrerName: '推荐人工号',
+                identity: '身份证号',
+                sex: '性别',
+                birthday: '出生日期',
+                nations: '民族',
+                koseki: '户籍',
+                maritalStatus: '婚姻状况',
+                politicsStatus: '政治面貌',
+                health: '健康状况',
+                liveAddress: '居住地址',
+                address: '详细地址',
+                postalCode: '邮政编码',
+                education: '学历',
+                school: '毕业院校',
+                graduationTime: '毕业时间',
+                formerEmployer: '原工作单位',
+                password: '密码',
+                emergencyContactName: '紧急联系人姓名',
+                emergencyContactTel: '紧急联系人电话',
+                isSpeciality: '是否计算机专业',
+                salary: '工资',
+                salaryLevel: '工资等级',
+                performance: '绩效方案',
+                accountno: '开户账号',
+                bankName: '开户行',
+                // referrerId: '推荐人',
+                // referrerName: '推荐人工号',
+                status: '状态',
+                // entryTime: '入司时间',
+                logoutTime: '离职时间',
+                weChat: '微信绑定',
+                alipay: '支付宝绑定',
+                realName: '是否实名认证',
+                bankAuthentication: '银行卡是否认证',
+                approvalOpinion: '备注'
+            },
+            regionalTree: []
+        }
+    },
+    created(){
+        this.selectTree();
+    },
+    mounted(){},
+    methods: {
+        // 查询人员修改历史
+        async getHistory(userId){  
+            const data = await this.$api.user.queryHistory({userId})
+            if(data.code == 200){
+                if(data.data.length){
+                    data.data.forEach(item => {
+                        item.list = item.user.concat(item.userInfo);
+                        item.list.forEach(val =>{
+                            if(val.propertyName == 'liveAddress'){
+                                if(val.newValue){
+                                    val.newValue = this.getVal(val.newValue.split(','), this.regionalTree, []);
+                                }
+                                if(val.oldValue){
+                                    val.oldValue = this.getVal(val.oldValue.split(','), this.regionalTree, []);
+                                }
+                            }
+                        })
+                    });
+                    this.dialogInfo.data = data.data;
+                    this.dialogInfo.visible =  true;
+                }else{
+                    this.$message.warning('暂无修改记录');
+                }
+            }else{
+                this.$message({
+                    message: `${data.msg}`,
+                    type: "error",
+                });
+            }
+        },
+        //字段翻译
+        translate(key) {
+            if(this.translations[key] == 'referrerId' && this.isBusiness){
+                return '业务员';
+            }else{
+                return this.translations[key] || 'No translation found';
+            }
+        },
+        //性别翻译
+        translateSex(value){
+            let label = '--';
+            if(value != 'null'){
+                this.sexoptions.forEach((val) => {
+                    if(value == val.value){
+                        label = val.label;
+                    }
+                });
+            }else{
+                
+            }
+            return label;
+        },
+        //查询树结构
+        selectTree(){
+            this.$api.dept.queryTree().then((response) =>{
+                this.regionalTree = this.recursion(response.data);
+            }).catch((error) =>{
+            })
+        },
+        //递归
+        recursion(data){
+            if(data.length){
+                data.forEach(item => {
+                if(item.child.length){
+                    this.recursion(item.child);
+                }else{
+                    delete item.child
+                }
+                });
+                return data;
+            }
+        },
+        //翻译省市区
+        getVal(data, options, arr) {
+            options.forEach((e) => {
+                data.forEach((i) => {
+                if (i == e.areaCode) {
+                    arr.push(e.areaCname);
+                    return;
+                } else {
+                    if (e.child) {
+                    this.getVal([i], e.child, arr);
+                    } else {
+                    return;
+                    }
+                }
+                });
+            });
+            return arr.join('/');
+        },
+        //关闭弹窗
+        close(){
+            this.dialogInfo.visible = false;
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.personnel_history{
+    >>>.el-dialog{
+        min-width: 550px;
+        max-width: 800px;
+        max-height: 650px;
+        .el-dialog__header{
+            height: 50px;
+            line-height: 50px;
+            padding: 0;
+            margin: 0 24px;
+            text-align: center;
+            border-bottom: 1px solid #eee;
+            .el-dialog__title{
+                font-size: 18px;
+                color: #333;
+                font-weight: 500;
+            }
+        }
+        .el-dialog__body{
+            padding: 24px;
+            padding-bottom: 0px;
+            .container{
+                max-height: calc(650px - 64px - 48px - 50px);
+                overflow: auto;
+                .item{
+                    padding-left: 28px;
+                    margin-bottom: 24px;
+                    position: relative;
+                    .heade{
+                        position: relative;
+                        display: flex;
+                        height: 22px;
+                        line-height: 22px;
+                        .title_state{
+                            font-size: 16px;
+                            color: #333;
+                            font-weight: 600;
+                        }
+                        .date{
+                            margin-left: 14px;
+                            font-size: 10px;
+                            color: #999;
+                            font-weight: 300;
+                            letter-spacing: 0.5px;
+                        }
+                    }
+                    .card_content{
+                        height: 178px;
+                        margin-top: 7px;
+                        margin-right: 10px;
+                        padding: 16px;
+                        padding-right: 6px;
+                        background: #FFFFFF;
+                        box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.1);
+                        border-radius: 6px 6px 6px 6px;
+                        .row{
+                            display: flex;
+                            height: 22px;
+                            line-height: 22px;
+                            font-size: 14px;
+                            font-weight: 400;
+                            color: #666;
+                            margin-bottom: 8px;
+                            .label{
+                                width: 60px;
+                                margin-right: 18px;
+                                white-space: nowrap; /* 确保文本在一行内显示 */
+                                overflow: hidden; /* 超出容器部分隐藏 */
+                                text-overflow: ellipsis; /* 超出部分显示打点 */
+                            }
+                            .content{
+                                width: calc(100% - 82px);
+                                font-weight: 400;
+                                font-size: 14px;
+                                color: #333;
+                                min-height: 140px;
+                                overflow-y: auto;
+                                .edit_item{
+                                    margin-bottom: 12px;
+                                    padding-left: 5px;
+                                    .oldValue{
+                                        margin-bottom: 8px;
+                                        margin-left: 15px;
+                                        position: relative;
+                                        display: flex;
+                                        align-items: center;
+                                        .oldState{
+                                            min-width: 36px;
+                                            color: #F63B3D;
+                                            font-size: 12px;
+                                            padding: 0 3px;
+                                            border-radius: 2px 2px 2px 2px;
+                                            border: 1px solid #F63B3D;
+                                            margin-right: 14px;
+                                        }
+                                        
+                                    }
+                                    .key{
+                                            max-width: 160px;
+                                            // min-width: 60px;
+                                            font-size: 14px;
+                                            margin-right: 5px;
+                                            white-space: nowrap; /* 确保文本在一行内显示 */
+                                            overflow: hidden; /* 超出容器部分隐藏 */
+                                            text-overflow: ellipsis; /* 超出部分显示打点 */
+                                        }
+                                    .newValue{
+                                        position: relative;
+                                        margin-left: 15px;
+                                        display: flex;
+                                        .newState{
+                                            min-width: 36px;
+                                            color: #1DD07A;
+                                            font-size: 12px;
+                                            padding: 0 3px;
+                                            border-radius: 2px 2px 2px 2px;
+                                            border: 1px solid #1DD07A;
+                                            margin-right: 14px;
+                                        }
+                                    }
+                                    .value{
+                                        max-width: 400px;
+                                        min-width: calc(100% - 36px - 160px);
+                                        display: inline-block;
+                                        white-space: nowrap; /* 确保文本在一行内显示 */
+                                        overflow: hidden; /* 超出容器部分隐藏 */
+                                        text-overflow: ellipsis; /* 超出部分显示打点 */
+                                    }
+                                    .oldValue::before{
+                                        content: ''; /* 生成伪元素的内容,但这里不需要实际文本,所以为空 */  
+                                        display: inline-block; /* 使伪元素以行内块级元素显示 */  
+                                        width: 6px; /* 小圆点的宽度 */  
+                                        height: 6px; /* 小圆点的高度 */  
+                                        background-color: #F63B3D; /* 小圆点的颜色 */  
+                                        border-radius: 50%; /* 将方形变成圆形 */  
+                                        vertical-align: middle; /* 垂直居中,如果需要的话 */  
+                                        position: absolute;
+                                        left: -16px;
+                                        top: 50%;
+                                        transform: translateY(-50%);
+                                        z-index: 2;
+                                    }
+                                    .newValue::before{
+                                        content: ''; /* 生成伪元素的内容,但这里不需要实际文本,所以为空 */  
+                                        display: inline-block; /* 使伪元素以行内块级元素显示 */  
+                                        width: 6px; /* 小圆点的宽度 */  
+                                        height: 6px; /* 小圆点的高度 */  
+                                        background-color: #1DD07A; /* 小圆点的颜色 */  
+                                        border-radius: 50%; /* 将方形变成圆形 */  
+                                        vertical-align: middle; /* 垂直居中,如果需要的话 */  
+                                        position: absolute;
+                                        left: -16px;
+                                        top: 50%;
+                                        transform: translateY(-50%);
+                                        z-index: 2;
+                                    }
+                                    .oldLine{
+                                        position: absolute;
+                                        top: 10px; /* 根据圆点的尺寸调整 */
+                                        left: -14px; /* 将竖线居中对齐 */
+                                        bottom: -20px; /* 调整竖线的长度 */
+                                        width: 1px;
+                                        background: linear-gradient(to bottom, rgba(246, 59, 61, 1), rgba(29, 208, 122, 1));
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                .heade::before {  
+                    content: ''; /* 生成伪元素的内容,但这里不需要实际文本,所以为空 */  
+                    display: inline-block; /* 使伪元素以行内块级元素显示 */  
+                    width: 10px; /* 小圆点的宽度 */  
+                    height: 10px; /* 小圆点的高度 */  
+                    background: #fff;
+                    border: 1px solid #E5E5E5; /* 小圆点的颜色 */  
+                    border-radius: 50%; /* 将方形变成圆形 */  
+                    vertical-align: middle; /* 垂直居中,如果需要的话 */  
+                    position: absolute;
+                    left: -25px;
+                    top: 50%;
+                    transform: translateY(-50%);
+                    z-index: 2;
+                    box-sizing: border-box;
+                }
+                .item:first-child .heade{
+                    .title_state{
+                        font-size: 16px;
+                        color: #D42426;
+                        font-weight: 600;
+                    }
+                    .date{
+                        margin-left: 14px;
+                        font-size: 10px;
+                        color: #D42426;
+                        font-weight: 300;
+                    }
+                    &::before{
+                        content: ''; /* 生成伪元素的内容,但这里不需要实际文本,所以为空 */  
+                        display: inline-block; /* 使伪元素以行内块级元素显示 */  
+                        width: 16px; /* 小圆点的宽度 */  
+                        height: 16px; /* 小圆点的高度 */  
+                        background: url('~@/assets/image/people/state.svg') no-repeat;
+                        background-size: 100% 100%;
+                        vertical-align: middle; /* 垂直居中,如果需要的话 */  
+                        position: absolute;
+                        left: -28px;
+                        top: 50%;
+                        transform: translateY(-50%);
+                        z-index: 2;
+                    }
+                }
+                .step-line {
+                    position: absolute;
+                    top: 10px; /* 根据圆点的尺寸调整 */
+                    left: 8px; /* 将竖线居中对齐 */
+                    bottom: -40px; /* 调整竖线的长度 */
+                    width: 1px;
+                    background-color: #e5e5e5;
+                }
+                .item:last-child .step-line{
+                    display: none;
+                }
+            }
+            .handler{
+                height: 64px;
+                line-height: 64px;
+                border-top: 1px solid #eee;
+                text-align: right;
+                .el-button{
+                    width: 90px;
+                    height: 36px;
+                    font-size: 16px;
+                    color: #D42426;
+                    border-radius: 2px 2px 2px 2px;
+                    border: 1px solid #D42426;
+                    font-weight: 300 !important;
+                    background: #fff;
+                    &:hover{
+                        background: #fff;
+                    }
+                }
+            }
+        }
+        .el-cascader{
+            min-width: 175px;
+            height: 22px;
+            line-height: 22px;
+            cursor: auto;
+            .el-input__suffix{
+                display: none;
+            }
+            .el-input__inner{
+                padding: 0;
+                border: 0;
+                height: 16px;
+                color: #333;
+                font-size: 14px;
+                font-weight: 400;
+                cursor: auto;
+                background: transparent;
+            }
+        }
+    }
+}
+</style>

+ 3 - 3
src/components/UserDetail/index.vue

@@ -142,7 +142,7 @@
       </el-row>
       <el-row>
         <el-col :span="8">
-          <el-form-item label="居住地址" prop="address">
+          <el-form-item label="居住地址">
             <!-- <el-select
               
               v-model="formDataDetail.address"
@@ -312,8 +312,8 @@
               placeholder="请选择"
               v-model="formDataDetail.isSpeciality"
             >
-              <el-option label="是" :value="1"></el-option>
-              <el-option label="否" :value="2"></el-option>
+              <el-option label="是" value="1"></el-option>
+              <el-option label="否" value="2"></el-option>
             </el-select>
             <!-- <el-input
               :disabled="isDisabled"

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/CargoTruck/BusinessOperation/Fuel/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/CargoTruck/BusinessOperation/NewEnergy/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/CargoTruck/NonBusiness/Fuel/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/CargoTruck/NonBusiness/NewEnergy/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/PassengerBus/BusinessOperation/Fuel/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/PassengerBus/BusinessOperation/NewEnergy/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/PassengerBus/NonBusiness/Fuel/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 1 - 1
src/views/AgreementManage/InsuranceCompany/PassengerBus/NonBusiness/NewEnergy/OptionalsolutionConfig.vue

@@ -33,7 +33,7 @@
               </el-col>
               <el-col :span="20">
                 <el-form-item label="投保指引">
-                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引" maxlength="200"
+                  <el-input type="textarea" v-model="CustomPlanData.description" placeholder="输入投保指引"
                     show-word-limit></el-input>
                 </el-form-item>
               </el-col>

+ 18 - 1
src/views/PeopleManage/Agent/AgentManage.vue

@@ -178,6 +178,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -406,6 +407,7 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+    <personnelHistory ref="personnelHistory" ></personnelHistory>
   </div>
 </template>
 
@@ -416,6 +418,7 @@ import templateTable from "../../../components/TemplateTable/index.vue";
 import peopleImage from "@/components/PeopleImage/index.vue";
 import { validateSfz } from "../../../utils/validate.js";
 import userDetail from "@/components/UserDetail/index.vue"; // 详情信息
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import mixa from "../mixin";
 const mixin = new mixa({
   treeTypeNum: 2, //树分类过滤参数
@@ -427,6 +430,7 @@ export default {
     templateTable,
     peopleImage,
     userDetail,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -541,7 +545,7 @@ export default {
         loading: true,
         isPaginationShow: true,
         isShowIndex: true,
-        operationWidth: "230",
+        operationWidth: "330",
         optBtns: [
           {
             type: "primary",
@@ -552,6 +556,14 @@ export default {
               return this.handleTableEdit(row);
             },
           },
+          {
+            type: "primary",
+            label: "人员轨迹",
+            perm: "sys:agent:edit",
+            click: (row, index) => {
+              return this.checkHistory(row);
+            },
+          },
           {
             type: "primary",
             label: "离司",
@@ -1110,6 +1122,11 @@ export default {
         }
       });
     },
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
+    }
   },
 };
 </script>

+ 91 - 0
src/views/PeopleManage/MobileZoomDiv.vue

@@ -0,0 +1,91 @@
+<template>
+    <div class="resizable-draggable" :style="{ transform: `scale(${scale})`, left: `${x}px`, top: `${y}px` }"
+        @mousedown="startDrag" @wheel="zoom">
+        <slot></slot>
+    </div>
+</template>  
+  
+<script>
+export default {
+    name: 'ResizableDraggable',
+    data() {
+        return {
+            dragging: false,
+            resizing: false,
+            startX: 0,
+            startY: 0,
+            scale: 1,
+            x: 0,
+            y: 0
+        };
+    },
+    methods: {
+        zoom(event) {
+                event.preventDefault();
+                const delta = event.deltaY < 0 ? 1.1 : 0.9;
+                this.scale *= delta;
+                },
+
+        startDrag(event) {
+            this.dragging = true;
+            this.startX = event.clientX - this.x;
+            this.startY = event.clientY - this.y;
+            console.log(this.startX ,this.startY,11111111111);
+            document.addEventListener('mousemove', this.drag);
+            document.addEventListener('mouseup', this.stopDrag);
+        },
+        drag(event) {
+            if (!this.dragging) return;
+            this.x = event.clientX - this.startX;
+            this.y = event.clientY - this.startY;
+            console.log(this.x ,this.y,2222222222);
+
+        },
+        stopDrag() {
+            if (!this.dragging) return;
+            this.dragging = false;
+            document.removeEventListener('mousemove', this.drag);
+            document.removeEventListener('mouseup', this.stopDrag);
+        },
+        startResize(type) {
+            this.resizing = true;
+            const num = type === 'narrow' ? -0.2 : 0.2;
+            this.scale += num;
+            this.scale = Math.max(1, Math.min(this.scale, 2)); // 限制缩放范围
+        },
+        reset() {
+            this.dragging = false;
+            this.resizing = false;
+            this.startX = 0;
+            this.startY = 0;
+            this.scale = 1;
+            this.x = 0;
+            this.y = 0;
+        }
+        // startResize(event) {
+        //   this.resizing = true;
+        //   const rect = this.$el.getBoundingClientRect();
+        //   const scaleFactor = event.clientX - rect.left > rect.width / 2 ? 1.1 : 0.9;
+        //   this.scale *= scaleFactor;
+        //   this.scale = Math.max(0.1, Math.min(this.scale, 2)); // 限制缩放范围
+        //   event.preventDefault();
+        // }
+    }
+};
+</script>  
+    
+<style scoped>
+.resizable-draggable {
+    /* width: 100%;
+    height: 100%; */
+    width: 500px;
+    height: auto;
+    position: absolute;
+    transition: transform 0.2s ease-in-out;
+    cursor: move;
+    /* 其他样式 */
+}
+
+
+</style>
+  

+ 88 - 0
src/views/PeopleManage/MobileZoomDivR.vue

@@ -0,0 +1,88 @@
+<template>
+    <div class="resizable-draggable" :style="{ transform: `scale(${scale})`, right: `${x}px`, bottom: `${y}px` }"
+        @mousedown="startDrag" @wheel="zoom">
+        <slot></slot>
+    </div>
+</template>  
+  
+<script>
+export default {
+    name: 'ResizableDraggable',
+    data() {
+        return {
+            dragging: false,
+            resizing: false,
+            startX: 0,
+            startY: 0,
+            scale: 1,
+            x: 0,
+            y: 0
+        };
+    },
+    methods: {
+        zoom(event) {
+            event.preventDefault();
+            const delta = event.deltaY < 0 ? 1.1 : 0.9;
+            this.scale *= delta;
+        },
+
+        startDrag(event) {
+            this.dragging = true;
+            this.startX = event.clientX + this.x;
+            this.startY = event.clientY + this.y;
+            document.addEventListener('mousemove', this.drag);
+            document.addEventListener('mouseup', this.stopDrag);
+        },
+        drag(event) {
+            if (!this.dragging) return;
+            this.x = this.startX - event.clientX;
+            this.y = this.startY - event.clientY;
+
+        },
+        stopDrag() {
+            if (!this.dragging) return;
+            this.dragging = false;
+            document.removeEventListener('mousemove', this.drag);
+            document.removeEventListener('mouseup', this.stopDrag);
+
+        },
+        startResize(type) {
+            this.resizing = true;
+            const num = type === 'narrow' ? -0.2 : 0.2;
+            this.scale += num;
+            this.scale = Math.max(1, Math.min(this.scale, 2)); // 限制缩放范围
+        },
+        reset() {
+            this.dragging = false;
+            this.resizing = false;
+            this.startX = 0;
+            this.startY = 0;
+            this.scale = 1;
+            this.x = 0;
+            this.y = 0;
+        }
+        // startResize(event) {
+        //   this.resizing = true;
+        //   const rect = this.$el.getBoundingClientRect();
+        //   const scaleFactor = event.clientX - rect.left > rect.width / 2 ? 1.1 : 0.9;
+        //   this.scale *= scaleFactor;
+        //   this.scale = Math.max(0.1, Math.min(this.scale, 2)); // 限制缩放范围
+        //   event.preventDefault();
+        // }
+    }
+};
+</script>  
+    
+<style scoped>
+.resizable-draggable {
+    /* width: 100%;
+    height: 100%; */
+    width: 500px;
+    height: auto;
+    position: absolute;
+    transition: transform 0.2s ease-in-out;
+    cursor: move;
+    /* 其他样式 */
+}
+</style>
+  

+ 88 - 0
src/views/PeopleManage/MobileZoomDivTR.vue

@@ -0,0 +1,88 @@
+<template>
+    <div class="resizable-draggable" :style="{ transform: `scale(${scale})`, right: `${x}px`, top: `${y}px` }"
+        @mousedown="startDrag" @wheel="zoom">
+        <slot></slot>
+    </div>
+</template>  
+  
+<script>
+export default {
+    name: 'ResizableDraggable',
+    data() {
+        return {
+            dragging: false,
+            resizing: false,
+            startX: 0,
+            startY: 0,
+            scale: 1,
+            x: 0,
+            y: 0
+        };
+    },
+    methods: {
+        zoom(event) {
+                event.preventDefault();
+                const delta = event.deltaY < 0 ? 1.1 : 0.9;
+                this.scale *= delta;
+                },
+
+        startDrag(event) {
+            this.dragging = true;
+            this.startX = event.clientX +this.x;
+            this.startY = event.clientY - this.y;
+            document.addEventListener('mousemove', this.drag);
+            document.addEventListener('mouseup', this.stopDrag);
+        },
+        drag(event) {
+            if (!this.dragging) return;
+            this.x = this.startX-event.clientX ;
+            this.y = event.clientY - this.startY;
+        },
+        stopDrag() {
+            if (!this.dragging) return;
+            this.dragging = false;
+            document.removeEventListener('mousemove', this.drag);
+            document.removeEventListener('mouseup', this.stopDrag);
+        },
+        startResize(type) {
+            this.resizing = true;
+            const num = type === 'narrow' ? -0.2 : 0.2;
+            this.scale += num;
+            this.scale = Math.max(1, Math.min(this.scale, 2)); // 限制缩放范围
+        },
+        reset() {
+            this.dragging = false;
+            this.resizing = false;
+            this.startX = 0;
+            this.startY = 0;
+            this.scale = 1;
+            this.x = 0;
+            this.y = 0;
+        }
+        // startResize(event) {
+        //   this.resizing = true;
+        //   const rect = this.$el.getBoundingClientRect();
+        //   const scaleFactor = event.clientX - rect.left > rect.width / 2 ? 1.1 : 0.9;
+        //   this.scale *= scaleFactor;
+        //   this.scale = Math.max(0.1, Math.min(this.scale, 2)); // 限制缩放范围
+        //   event.preventDefault();
+        // }
+    }
+};
+</script>  
+    
+<style scoped>
+.resizable-draggable {
+    /* width: 100%;
+    height: 100%; */
+    width: 500px;
+    height: auto;
+    position: absolute;
+    transition: transform 0.2s ease-in-out;
+    cursor: move;
+    /* 其他样式 */
+}
+
+
+</style>
+  

+ 4 - 4
src/views/PeopleManage/PartnerExtraction.vue

@@ -93,12 +93,12 @@ export default {
           //   type: "text",
           // },
          
-          { prop: "deptId", label: "机构id", type: "text" },
+          { prop: "deptId", label: "机构编码", type: "text" },
           { prop: "deptName", label: "机构名称", type: "text" },
            { prop: "sumpremium", label: "总保费", type: "text" },
-          { prop: "proportional", label: "抽成比例", type: "text" },
-          { prop: "extractFee", label: "总保费抽成费用", type: "text" },
-          { prop: "startTime", label: "核算开始时间", type: "text" },
+          // { prop: "proportional", label: "抽成比例", type: "text" },
+          // { prop: "extractFee", label: "总保费抽成费用", type: "text" },
+          { prop: "startTime", label: "核算开始时间", type: "text",width:170 },
         ],
         optBtns: [
           {

+ 326 - 210
src/views/PeopleManage/PcLoginRecord.vue

@@ -3,199 +3,211 @@
     <div id="containerMap" style="width: 100%; height: 87vh;position: relative" v-loading="loading"
       element-loading-text="数据量较大,正在为您加载......" element-loading-spinner="el-icon-loading"
       element-loading-background="rgba(0, 0, 0, 0.8)"></div>
-    <div class="province-window">
-      <el-select size="small" v-model="provinceName" clearable placeholder="请选择省" @change="provinceChange"
-        @clear="provinceClear">
-        <el-option v-for="(option, index) in provinceOption" :key="index" :label="option.name"
-          :value="option.code"></el-option>
-      </el-select>
-      <el-select size="small" v-model="cityName" clearable placeholder="请选择市" @change="cityChange" @clear="cityClear">
-        <el-option v-for="(option, index) in cityOption" :key="index" :label="option.name"
-          :value="option.code"></el-option>
-      </el-select>
-      <el-select size="small" v-model="districtName" clearable placeholder="请选择区" @change="districtChange"
-        @clear="districtClear">
-        <el-option v-for="(option, index) in districtOption" :key="index" :label="option.name"
-          :value="option.code"></el-option>
-      </el-select>
-      <el-button size="small" type="primary" @click="onSearch">搜索</el-button>
-      <!-- <el-button size="small" type="primary" @click="onCircular">圆形定位</el-button> -->
-      <!-- <el-button size="small" type="primary" @click="map.remove(circle)">删除定位</el-button> -->
-    </div>
-    <div class="source-window">
-      <div>
-        <span>全部</span>
-        <el-switch v-model="sourceqb" @change="sourceqbChange">
-        </el-switch>
+    <div class="dragContainerEl">
+      <div class="province-window">
+        <el-select size="small" v-model="provinceName" clearable placeholder="请选择省" @change="provinceChange"
+          @clear="provinceClear">
+          <el-option v-for="(option, index) in provinceOption" :key="index" :label="option.name"
+            :value="option.code"></el-option>
+        </el-select>
+        <el-select size="small" v-model="cityName" clearable placeholder="请选择市" @change="cityChange" @clear="cityClear">
+          <el-option v-for="(option, index) in cityOption" :key="index" :label="option.name"
+            :value="option.code"></el-option>
+        </el-select>
+        <el-select size="small" v-model="districtName" clearable placeholder="请选择区" @change="districtChange"
+          @clear="districtClear">
+          <el-option v-for="(option, index) in districtOption" :key="index" :label="option.name"
+            :value="option.code"></el-option>
+        </el-select>
+        <el-button size="small" type="primary" @click="onSearch">搜索</el-button>
+        <!-- <el-button size="small" type="primary" @click="onCircular">圆形定位</el-button> -->
+        <!-- <el-button size="small" type="primary" @click="map.remove(circle)">删除定位</el-button> -->
       </div>
-      <div>
-        <span>代理</span>
-        <el-switch v-model="sourcedl" @change="sourcedlChange">
-        </el-switch>
-        <!-- <span style="margin-left: 15px;">在线</span>
+      <div class="source-window">
+        <div>
+          <span>全部</span>
+          <el-switch v-model="sourceqb" @change="sourceqbChange">
+          </el-switch>
+        </div>
+        <div>
+          <span>代理</span>
+          <el-switch v-model="sourcedl" @change="sourcedlChange">
+          </el-switch>
+          <!-- <span style="margin-left: 15px;">在线</span>
         <el-switch v-model="lineZx" @change="onLineChange">
         </el-switch> -->
-      </div>
-      <div>
-        <span>渠道</span>
-        <el-switch v-model="sourceqd" @change="sourceqdChange">
-        </el-switch>
-        <!-- <span style="margin-left: 15px;">离线</span>
+        </div>
+        <div>
+          <span>渠道</span>
+          <el-switch v-model="sourceqd" @change="sourceqdChange">
+          </el-switch>
+          <!-- <span style="margin-left: 15px;">离线</span>
         <el-switch v-model="lineLx" @change="offlineChange">
         </el-switch> -->
-      </div>
-    </div>
-    <div v-if="infoWindowVisible" class="infohis-window">
-      <p class="close flex j-s">
-        <span>历史记录</span>
-        <span style="color: #c3c3c3;font-size:18px" @click="infoWindowVisible = false"> ×</span>
-      </p>
-      <el-table :data="tableData" border style="width: 98%; max-height: 45vh;
-    overflow-y: auto; " 
-    :cell-style="{padding: '3px 8px'}"
-    :header-cell-style="{
-        background: '#F2F7FC',
-        fontWeight: '700',
-        color: '#606266',
-        
-      }">
-        <el-table-column prop="userId" label="工号" width="150">
-        </el-table-column>
-        <el-table-column prop="userName" label="姓名" width="80">
-        </el-table-column>
-        <el-table-column prop="address" label="地址">
-        </el-table-column>
-        <el-table-column prop="operationTime" label="登录时间">
-        </el-table-column>
-      </el-table>
-      <div class="bottomFixed">
-        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageNum"
-          :page-sizes="[5, 10, 20, 30, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next"
-          :total="totalSum">
-        </el-pagination>
-      </div>
-    </div>
-    <div class="personnel-window ">
-      <p class="close flex j-s ">
-        <!-- <span>人员分布</span> -->
-        <el-tabs style="position: relative;width: 100%;" v-model="activeName" @tab-click="handHistory">
-          <el-tab-pane label="人员分布" name="1"></el-tab-pane>
-          <el-tab-pane label="历史在线人数" name="2"></el-tab-pane>
-        </el-tabs>
-        <span style="color: #3865E9 ; cursor: pointer; font-size: 14px;position: absolute;line-height: 40px;
-    right: 30px;" @click="isCollapse = !isCollapse;if(isCollapse)infoWindowVisible=false">{{
-      isCollapse ? '收起' : '展开' }} </span>
-      </p>
-      <div v-show="activeName == 1">
-        <div class="flex j-s">
-          <div class="info-title"><i></i>人员数量概览</div>
-          <div class="info-online"><i></i>在线人数:{{ onlineData }}</div>
-        </div>
-        <div style="padding: 10px 0;" class="flex j-s">
-          <div v-for="(item, index) in overviewOption" :key="index"
-            :class="currentIndex === index ? 'overview after-img' : 'overview '" @click="checkPrice(index)">
-            <span>{{ item.active }}</span>
-            <span>{{ item.name }}</span>
-          </div>
         </div>
-        <div v-show="isCollapse" class="info-title"><i></i>区域人员概览</div>
-        <el-table v-show="isCollapse" :data="overviewData" border
-          style="width: 100%; max-height: 50vh; overflow: auto;margin:15px 0" :header-cell-style="{
-            background: '#F7F7F9',
-            fontWeight: '700',
-            color: '#000',
-          }">
-          <el-table-column type="index" align="center" width="50" label="序号">
-            <template slot-scope="scope">
-              <img v-if="scope.$index == 0" src="../../assets/序号1.png" />
-              <img v-else-if="scope.$index == 1" src="../../assets/序号2.png" />
-              <img v-else-if="scope.$index == 2" src="../../assets/序号3.png" />
-              <span v-else style="text-decoration-line: underline;">{{ scope.$index + 1 }}</span>
-            </template>
+      </div>
+      <MobileZoomDivTR>
+      <div v-if="infoWindowVisible"  class="infohis-window">
+        <p class="close flex j-s">
+          <span>历史记录</span>
+          <span style="color: #c3c3c3;font-size:18px" @click="infoWindowVisible = false"> ×</span>
+        </p>
+        <el-table :data="tableData" border style="width: 98%; max-height: 45vh;
+    overflow-y: auto; " :cell-style="{ padding: '3px 8px' }" :header-cell-style="{
+      background: '#F2F7FC',
+      fontWeight: '700',
+      color: '#606266',
+
+    }">
+          <el-table-column prop="userId" label="工号" width="150">
           </el-table-column>
-          <el-table-column prop="districtName" align="center" label="区域">
+          <el-table-column prop="userName" label="姓名" width="80">
           </el-table-column>
-          <el-table-column prop="number" align="center" label="人数">
+          <el-table-column prop="address" label="地址">
+          </el-table-column>
+          <el-table-column prop="operationTime" label="登录时间">
           </el-table-column>
-          <div slot="empty" class="empty">
-            <img src="../../assets/暂无数据.png" />
-            <div class="txt">暂无数据哦</div>
-          </div>
         </el-table>
+        <div class="bottomFixed">
+          <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageNum"
+            :page-sizes="[5, 10, 20, 30, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next"
+            :total="totalSum">
+          </el-pagination>
+        </div>
       </div>
-      <div v-show="activeName == 2">
-        <div style="margin-bottom: 10px;">
-          <span style="color: #262626;font-weight: 700;font-size: 14px;">时间筛选 </span>
-          <el-date-picker v-model="historyDate" type="daterange" size="small" @change="historyDateFun"
-            value-format="yyyy-MM-dd" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
-          </el-date-picker>
-          <!-- <el-date-picker size="small" @change="historyDateFun"  v-model="historyDate" type="date" placeholder="选择日期" format="yyyy 年 MM 月 dd 日"
+    </MobileZoomDivTR>
+      <MobileZoomDivR>
+        <div class="personnel-window ">
+          <p class="close flex j-s ">
+            <!-- <span>人员分布</span> -->
+            <el-tabs style="position: relative;width: 100%;" v-model="activeName" @tab-click="handHistory">
+              <el-tab-pane label="人员分布" name="1"></el-tab-pane>
+              <el-tab-pane label="历史在线人数" name="2"></el-tab-pane>
+            </el-tabs>
+            <span style="color: #3865E9 ; cursor: pointer; font-size: 14px;position: absolute;line-height: 40px;
+    right: 30px;" @click="isCollapse = !isCollapse; if (isCollapse) infoWindowVisible = false">{{
+      isCollapse ? '收起' : '展开' }} </span>
+          </p>
+          <div v-show="activeName == 1">
+            <div class="flex j-s">
+              <div class="info-title"><i></i>人员数量概览</div>
+              <div class="info-online"><i></i>在线人数:{{ onlineData }}</div>
+            </div>
+            <div style="padding: 10px 0;" class="flex j-s">
+              <div v-for="(item, index) in overviewOption" :key="index"
+                :class="currentIndex === index ? 'overview after-img' : 'overview '" @click="checkPrice(index)">
+                <span>{{ item.active }}</span>
+                <span>{{ item.name }}</span>
+              </div>
+            </div>
+            <div v-show="isCollapse" class="info-title"><i></i>区域人员概览</div>
+            <el-table v-show="isCollapse" :data="overviewData" border
+              style="width: 100%; max-height: 50vh; overflow: auto;margin:15px 0" :header-cell-style="{
+                background: '#F7F7F9',
+                fontWeight: '700',
+                color: '#000',
+              }">
+              <el-table-column type="index" align="center" width="50" label="序号">
+                <template slot-scope="scope">
+                  <img v-if="scope.$index == 0" src="../../assets/序号1.png" />
+                  <img v-else-if="scope.$index == 1" src="../../assets/序号2.png" />
+                  <img v-else-if="scope.$index == 2" src="../../assets/序号3.png" />
+                  <span v-else style="text-decoration-line: underline;">{{ scope.$index + 1 }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="districtName" align="center" label="区域">
+              </el-table-column>
+              <el-table-column prop="number" align="center" label="人数">
+              </el-table-column>
+              <div slot="empty" class="empty">
+                <img src="../../assets/暂无数据.png" />
+                <div class="txt">暂无数据哦</div>
+              </div>
+            </el-table>
+          </div>
+          <div v-show="activeName == 2">
+            <div style="margin-bottom: 10px;">
+              <span style="color: #262626;font-weight: 700;font-size: 14px;">时间筛选 </span>
+              <el-date-picker v-model="historyDate" type="daterange" size="small" @change="historyDateFun"
+                value-format="yyyy-MM-dd" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+              </el-date-picker>
+              <!-- <el-date-picker size="small" @change="historyDateFun"  v-model="historyDate" type="date" placeholder="选择日期" format="yyyy 年 MM 月 dd 日"
             value-format="yyyy-MM-dd"> 
           </el-date-picker>-->
-        </div>
-        <div class="flex j-s">
-          <div class="info-title"><i></i>历史在线人数统计</div>
-          <div class="info-online"><i></i>使用人数:{{ onlineHisData }}</div>
-        </div>
-        <div id="echarts_box" v-show="isCollapse" style="width: 460px;height:300px;"></div>
+            </div>
+            <div class="flex j-s">
+              <div class="info-title"><i></i>历史在线人数统计</div>
+              <div class="info-online"><i></i>使用人数:{{ onlineHisData }}</div>
+            </div>
+            <div id="echarts_box" v-show="isCollapse" style="width: 460px;height:300px;"></div>
 
-      </div>
+          </div>
+        </div>
 
+      </MobileZoomDivR>
 
-    </div>
-    <div v-if="personnelVisible" class="info-window">
-      <p class="close flex j-s">
-        <span>人员详情</span>
-        <span style="color: #c3c3c3;font-size:18px;cursor: pointer" @click="personnelVisible = false"> ×</span>
-      </p>
-      <el-table :data="personnelData" border style="width: 100%; " :header-cell-style="{
-        background: '#F7F7F9',
-        fontWeight: '700',
-        color: '#606266',
-      }">
-        <el-table-column type="index" align="center" width="50" label="序号">
-          <template slot-scope="scope">
-            <img v-if="scope.$index == 0" src="../../assets/序号1.png" />
-            <img v-else-if="scope.$index == 1" src="../../assets/序号2.png" />
-            <img v-else-if="scope.$index == 2" src="../../assets/序号3.png" />
-            <span v-else style="text-decoration-line: underline;">{{ scope.$index + 1 }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="userName" label="姓名" width="100">
-        </el-table-column>
-        <el-table-column prop="userId" label="工号">
-        </el-table-column>
-        <el-table-column prop="address" label="地址">
-        </el-table-column>
-        <el-table-column prop="operationTime" label="登录时间">
-        </el-table-column>
-        <el-table-column prop="source" label="分类">
-          <template slot-scope="scope">
-            {{ scope.row.source == '1' ? '渠道' : '代理' }}
-          </template>
-        </el-table-column>
-        <el-table-column label="操作">
-          <template slot-scope="scope">
-            <el-button style="color:#3865E9 " @click.native.prevent="historicRecords(scope.row)" type="text" size="small">
-              历史记录
-            </el-button>
-          </template>
-        </el-table-column>
-        <div slot="empty" class="empty">
-          <img src="../../assets/暂无数据.png" />
-          <div class="txt">暂无数据哦</div>
+      <MobileZoomDiv>
+        <div v-if="personnelVisible" class="info-window">
+          <p class="close flex j-s">
+            <span>人员详情</span>
+            <span style="color: #c3c3c3;font-size:18px;cursor: pointer" @click="personnelVisible = false"> ×</span>
+          </p>
+          <el-table :data="personnelData" border style="width: 100%; " :header-cell-style="{
+            background: '#F7F7F9',
+            fontWeight: '700',
+            color: '#606266',
+          }">
+            <el-table-column type="index" align="center" width="50" label="序号">
+              <template slot-scope="scope">
+                <img v-if="scope.$index == 0" src="../../assets/序号1.png" />
+                <img v-else-if="scope.$index == 1" src="../../assets/序号2.png" />
+                <img v-else-if="scope.$index == 2" src="../../assets/序号3.png" />
+                <span v-else style="text-decoration-line: underline;">{{ scope.$index + 1 }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="userName" label="姓名" width="100">
+            </el-table-column>
+            <el-table-column prop="userId" label="工号">
+            </el-table-column>
+            <el-table-column prop="address" label="地址">
+            </el-table-column>
+            <el-table-column prop="operationTime" label="登录时间">
+            </el-table-column>
+            <el-table-column prop="source" label="分类">
+              <template slot-scope="scope">
+                {{ scope.row.source == '1' ? '渠道' : '代理' }}
+              </template>
+            </el-table-column>
+            <el-table-column label="操作">
+              <template slot-scope="scope">
+                <el-button style="color:#3865E9 " @click.native.prevent="historicRecords(scope.row)" type="text"
+                  size="small">
+                  历史记录
+                </el-button>
+              </template>
+            </el-table-column>
+            <div slot="empty" class="empty">
+              <img src="../../assets/暂无数据.png" />
+              <div class="txt">暂无数据哦</div>
+            </div>
+          </el-table>
+
+          <div class="bottomFixed">
+            <el-pagination @current-change="handlePersonnelChange" :current-page="personnelPageNum" :page-size="5"
+              layout="total, prev, pager, next" :total="personnelTotalSize">
+            </el-pagination>
+          </div>
         </div>
-      </el-table>
-      <div class="bottomFixed">
-        <el-pagination @current-change="handlePersonnelChange" :current-page="personnelPageNum" :page-size="5"
-          layout="total, prev, pager, next" :total="personnelTotalSize">
-        </el-pagination>
+      </MobileZoomDiv>
+
+      <div class="info-window input-card" v-if="circle">
+        <el-button size="small" round @click="circleEditor.open()" style="margin-bottom: 5px">开始编辑</el-button>
+        <el-button size="small" round @click="circleEditor.close()" style="margin-left:0">结束编辑</el-button>
       </div>
-    </div>
-    <div class="info-window input-card" v-if="circle">
-      <el-button size="small" round @click="circleEditor.open()" style="margin-bottom: 5px">开始编辑</el-button>
-      <el-button size="small" round @click="circleEditor.close()" style="margin-left:0">结束编辑</el-button>
 
+      <!-- <div class="dragContainerEl">
+      <div id="Drag" @mousedown="mousedown($event)"  :style="{ transform: `translate(${x}px, ${y}px) scale(${scale})` }" @wheel="zoom" class="drag">可移动和放大缩小的区域</div>
+    </div> -->
     </div>
   </div>
 </template>
@@ -203,11 +215,15 @@
 <script>
 import echarts from 'echarts';
 import yongchengData from '../../assets/js/yongchengData';
+import MobileZoomDiv from './MobileZoomDiv.vue'
+import MobileZoomDivR from './MobileZoomDivR.vue'
+import MobileZoomDivTR from './MobileZoomDivTR.vue'
 import AMapLoader from "@amap/amap-jsapi-loader";
 window._AMapSecurityConfig = {
   securityJsCode: 'd62687dd438cfadd859bbab66d8e41a2',		//安全密钥
 }
 var myChart;
+
 export default {
   data() {
     return {
@@ -266,9 +282,21 @@ export default {
       lineLx: null,
       status: null,
       positionType: null,
-      historyData: []
+      historyData: [],
+      scale: 1,
+      DragEl: null,//拖动元素
+      dragContainerEl: null,//容器元素
+      // 位置差
+      // disX: 0,
+      // disY: 0,
+      // x: 0,
+      // y: 0,
+      top: 60,
+      left: 20,
+      isMoving: false,
     };
   },
+  components: { MobileZoomDiv, MobileZoomDivR,MobileZoomDivTR },
   mounted() {
     myChart = echarts.init(document.getElementById('echarts_box'))
     this.initMap();
@@ -287,18 +315,88 @@ export default {
     this.map.destroy();
   },
   methods: {
+    startMove(event) {
+      this.isMoving = true;
+      this.initialX = event.clientX;
+      this.initialY = event.clientY;
+    },
+    doMove(event) {
+      if (this.isMoving) {
+        this.left += event.clientX - this.initialX;
+        this.top += event.clientY - this.initialY;
+        this.initialX = event.clientX;
+        this.initialY = event.clientY;
+      }
+    },
+    stopMove() {
+      this.isMoving = false;
+    },
+    mousedown(event) {
+      // 1,计算位置差
+      // 因为clientX和offsetLeft的属性返回的位置不一样 要相减得到鼠标在拖动元素内实际点击的位置
+      // 后面每一次拖动时都要减去这个差值 否则就会造成你拖动的位置一直都是元素的左上角 而不是你之前点击的位置
+
+      console.log(event.clientX, this.DragEl.offsetLeft, 222222222);
+
+      this.disX = event.clientX - this.DragEl.offsetLeft;
+      this.disY = event.clientY - this.DragEl.offsetTop;
+
+      //2, 获取拖动元素的高度和容器的高度 为了下面进行限制元素拖动的范围
+      let dragHeight = this.DragEl.offsetHeight;
+      let dragWidth = this.DragEl.offsetWidth;
+      let dragContainerWidth = this.dragContainerEl.offsetWidth; //获取容器的高度和宽度
+      let dragContainerHeight = this.dragContainerEl.offsetHeight;
+
+      // 添加鼠标移动事件
+      document.onmousemove = (el) => {
+        // 3,获取鼠标移动位置
+        let moveX = el.clientX - this.disX;
+        let moveY = el.clientY - this.disY;
+
+
+        // 左边界
+        if (moveX <= 0) {
+          moveX = 0;
+        }
+        // 上边界
+        if (moveY <= 0) {
+          moveY = 0;
+        }
+        //下边界  容器高度 - 拖动元素高度
+        if (moveY >= dragContainerHeight - dragHeight) {
+          moveY = dragContainerHeight - dragHeight;
+        }
+        //右边界   容器宽度 - 拖动元素宽度
+        if (moveX >= dragContainerWidth - dragWidth) {
+          moveX = dragContainerWidth - dragWidth;
+        }
+
+        // 5, 开始移动
+        this.DragEl.style.left = moveX + "px";
+        this.DragEl.style.top = moveY + "px";
+      };
+      /* 6,鼠标抬起解除事件 */
+      document.onmouseup = () => {
+        document.onmousemove = null;
+      };
+    },
+    zoom(event) {
+      event.preventDefault();
+      const delta = event.deltaY > 0 ? 1.1 : 0.9;
+      this.scale *= delta;
+    },
     historicRecords(row) {
       this.rowId = row.userId
-      this.isCollapse=false
-      this.infoWindowVisible=true
+      this.isCollapse = false
+      this.infoWindowVisible = true
       this.detail()
     },
     handHistory(tab, event) {
       if (tab.name == '2') {
         this.queryAnalysis();
       }
-      else{
-        this.positionType=1
+      else {
+        this.positionType = 1
         this.initMap();
       }
     },
@@ -307,7 +405,7 @@ export default {
       this.queryAnalysis({ startTime: val[0], endTime: val[1] });
     },
     queryAnalysis(param) {
-      this.$api.user.ipAddrGetPcAddress({source:this.source ,...param}).then((res) => {
+      this.$api.user.ipAddrGetPcAddress({ source: this.source, ...param }).then((res) => {
         if (res.code == 200) {
           this.onlineHisData = res.data.onlineNum
           this.formatAnalysisDate(res.data.list)
@@ -324,25 +422,25 @@ export default {
           _this.map.on("complete", () => {
             //处理后台返回要用到的数据
             // _this.positionData = res.data.data
-            if (res.data.pcAddressList.length > 0){
+            if (res.data.pcAddressList.length > 0) {
 
               _this.positionType = res.data.pcAddressList[0].type
-            _this.positionData = res.data.pcAddressList.map(item => ({
-              userName: item.userName,
-              id: item.id,
-              userId: item.userId,
-              address: item.address,
-              leaderName: item.leaderName ? item.leaderName : '无',
-              // onlineImg: item.status ? "Frame-1(2).png" : "Frame(2).png",
-              onlineImg: "Frame-1(2).png",
-              operationTime: item.operationTime,
-              source: item.source,
-              status: item.status ? "#1CE247" : "#B2B2B2",
-              // status: item.status ? "在线" : "离线",
-              positionArr: [item.longitude, item.latitude]
-            }));
-            _this.mapPoint();
-          }
+              _this.positionData = res.data.pcAddressList.map(item => ({
+                userName: item.userName,
+                id: item.id,
+                userId: item.userId,
+                address: item.address,
+                leaderName: item.leaderName ? item.leaderName : '无',
+                // onlineImg: item.status ? "Frame-1(2).png" : "Frame(2).png",
+                onlineImg: "Frame-1(2).png",
+                operationTime: item.operationTime,
+                source: item.source,
+                status: item.status ? "#1CE247" : "#B2B2B2",
+                // status: item.status ? "在线" : "离线",
+                positionArr: [item.longitude, item.latitude]
+              }));
+              _this.mapPoint();
+            }
           });
           // if (location.href.indexOf("&guide=1") !== -1) {
           //   _this.map.setStatus({ scrollWheel: fal0e });
@@ -629,11 +727,11 @@ export default {
         this.sourceqd = null
       }
       this.source = null
-      if(this.positionType==1){
+      if (this.positionType == 1) {
         this.initMap();
       }
-      else{
-      this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
+      else {
+        this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
       }
     },
     sourcedlChange(val) {
@@ -642,11 +740,11 @@ export default {
         this.sourceqd = null
       }
       this.source = 2
-      if(this.positionType==1){
+      if (this.positionType == 1) {
         this.initMap();
       }
-      else{
-      this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
+      else {
+        this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
       }
     },
     sourceqdChange(val) {
@@ -655,11 +753,11 @@ export default {
         this.sourcedl = null
       }
       this.source = 1
-      if(this.positionType==1){
+      if (this.positionType == 1) {
         this.initMap();
       }
-      else{
-      this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
+      else {
+        this.queryAnalysis({ startTime: this.historyData[0], endTime: this.historyData[1] });
       }
     },
     onLineChange(val) {
@@ -958,15 +1056,17 @@ export default {
 }
 
 .personnel-window {
-  position: fixed;
-  bottom: 10px;
-  right: 5px;
+  position: absolute;
+  // bottom: 10px;
+  // right: 5px;
+  bottom: 0;
+  right: 0;
   z-index: 100;
   background-color: white;
   padding: 10px;
   box-shadow: 0px 5px 10px #ddd;
   box-sizing: border-box;
-    width: 500px;
+  width: 500px;
 }
 
 .bottomFixed {
@@ -1098,5 +1198,21 @@ export default {
     }
   }
 
+  .dragContainerEl {
+    // position: absolute;
+    // top: 0;
+    width: 100%;
+    height: 100%;
+  }
+
+  .drag {
+    position: absolute;
+    width: 50px;
+    height: 50px;
+    border: 5px solid yellowgreen;
+    background-color: red;
+    text-align: center;
+  }
+
 }
 </style>

+ 20 - 1
src/views/PeopleManage/Player/PlayerManage.vue

@@ -182,6 +182,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -423,6 +424,7 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+    <personnelHistory ref="personnelHistory" :isBusiness="true" ></personnelHistory>
   </div>
 </template>
 
@@ -431,6 +433,7 @@ import KtButton from "@/views/Core/KtButton"; // 按钮权限组件
 import tree from "@/components/ztree.vue"; // 机构树组件
 import templateTable from "../../../components/TemplateTable/index.vue";
 import peopleImage from "@/components/PeopleImage/index.vue";
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import { validateSfz } from "../../../utils/validate.js";
 import mixa from "../mixin";
 const mixin = new mixa({
@@ -442,6 +445,7 @@ export default {
     tree,
     templateTable,
     peopleImage,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -544,7 +548,7 @@ export default {
         loading: true,
         isPaginationShow: true,
         isShowIndex: true,
-        operationWidth: "220",
+        operationWidth: "330",
         optBtns: [
           {
             type: "primary",
@@ -555,6 +559,14 @@ export default {
               return this.handleTableEdit(row);
             },
           },
+          {
+            type: "primary",
+            label: "人员轨迹",
+            perm: "sys:agent:edit",
+            click: (row, index) => {
+              return this.checkHistory(row);
+            },
+          },
           {
             type: "primary",
             label: "离司",
@@ -977,6 +989,7 @@ export default {
               this.$api.user
                 .saveUserInfo({
                   sysUser: this.formData,
+                  sysUserInfo: this.formDataDetail,
                   esmUserImageVo: this.imagesIdList,
                 })
                 .then((res) => {
@@ -1000,6 +1013,7 @@ export default {
               this.$api.user
                 .updateUserInfo(this.formData.id, {
                   sysUser: this.formData,
+                  sysUserInfo: this.formDataDetail,
                   esmUserImageVo: this.imagesIdList,
                 })
                 .then((res) => {
@@ -1028,6 +1042,11 @@ export default {
     },
     switchPassword(){
       this.showPassWord = !this.showPassWord;
+    },
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
     }
   },
 };

+ 18 - 1
src/views/PeopleManage/Player/PlayerManageteam.vue

@@ -176,6 +176,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -376,6 +377,7 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+    <personnelHistory ref="personnelHistory" ></personnelHistory>
   </div>
 </template>
 
@@ -385,6 +387,7 @@ import tree from "@/components/ztree.vue"; // 机构树组件
 import templateTable from "../../../components/TemplateTable/index.vue";
 import peopleImage from "@/components/PeopleImage/index.vue";
 import userDetail from "@/components/UserDetail/index.vue"; // 详情信息
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import { validateSfz } from "../../../utils/validate.js";
 import mixa from "../mixin";
 const mixin = new mixa({
@@ -397,6 +400,7 @@ export default {
     templateTable,
     peopleImage,
     userDetail,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -504,7 +508,7 @@ export default {
         loading: true,
         isPaginationShow: true,
         isShowIndex: true,
-        operationWidth: "220",
+        operationWidth: "330",
         optBtns: [
           {
             type: "primary",
@@ -515,6 +519,14 @@ export default {
               return this.handleTableEdit(row);
             },
           },
+          {
+            type: "primary",
+            label: "人员轨迹",
+            perm: "sys:agent:edit",
+            click: (row, index) => {
+              return this.checkHistory(row);
+            },
+          },
           {
             type: "primary",
             label: "离司",
@@ -1041,6 +1053,11 @@ export default {
 
       }, 500);
     },
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
+    }
   },
 };
 </script>

+ 18 - 2
src/views/PeopleManage/Sales/SalesManage.vue

@@ -120,6 +120,7 @@
           <kt-common-table
             permsEdit="sys:team:edit"
             :data="pageResult"
+            :operationWidth="250"
             :columns="columns"
             editButtonName="编辑"
             :showBatchDelete="false"
@@ -131,6 +132,7 @@
             :button9Name="'离司恢复'"
             :button9Status="'离司'"
             @handleButton9="handleRest"
+            :buttonDropdown="dropdownOption"
           >
           </kt-common-table>
         </SplitArea>
@@ -254,6 +256,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -474,6 +477,7 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+    <personnelHistory ref="personnelHistory" ></personnelHistory>
   </div>
 </template>
 
@@ -484,6 +488,7 @@ import KtCommonTable from "@/views/Core/KtCommonTable.vue"; //表格组件
 import peopleImage from "@/components/PeopleImage/index.vue"; //影像组件
 import {validateSfz} from "../../../utils/validate.js";
 import userDetail from "@/components/UserDetail/index.vue"; // 详情信息
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import mixa from "../mixin";
 
 const mixin = new mixa({
@@ -496,6 +501,7 @@ export default {
     KtCommonTable,
     userDetail,
     peopleImage,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -630,7 +636,13 @@ export default {
       },
       //影像上传列表
       imagesIdList: [],
-      pdeptId: null
+      pdeptId: null,
+      dropdownOption:[
+        {
+          label:'人员轨迹',
+          click:(row)=>this.checkHistory(row)
+        }
+      ],
     };
   },
   created() {
@@ -1138,7 +1150,11 @@ export default {
         });
       }, 200);
     },
-
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
+    }
   },
 };
 </script>

+ 21 - 1
src/views/PeopleManage/Staff/StaffManage.vue

@@ -123,6 +123,7 @@
           <kt-common-table
             ref="ktcommonTable"
             permsEdit="sys:backline:edit"
+            :operationWidth="250"
             :data="pageResult"
             :columns="columns"
             editButtonName="编辑"
@@ -135,6 +136,7 @@
             :button9Name="'离司恢复'"
             :button9Status="'离司'"
             @handleButton9="handleRest"
+            :buttonDropdown="dropdownOption"
           >
           </kt-common-table>
         </SplitArea>
@@ -263,6 +265,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -468,6 +471,9 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+    
+    <personnelHistory ref="personnelHistory" ></personnelHistory>
+    
   </div>
 </template>
 
@@ -478,6 +484,7 @@ import KtCommonTable from "@/views/Core/KtCommonTable.vue"; //表格组件
 import { validateSfz } from "../../../utils/validate.js";
 import peopleImage from "@/components/PeopleImage/index.vue"; //影像组件
 import userDetail from "@/components/UserDetail/index.vue"; // 详情信息
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import mixa from "../mixin";
 const mixin = new mixa({
   treeTypeNum: null,
@@ -489,6 +496,7 @@ export default {
     KtCommonTable,
     peopleImage,
     userDetail,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -635,7 +643,13 @@ export default {
       searchLeaderOptions: {},
       user_statusoptions: [],
       showOut: false,
-      pdeptId: null
+      pdeptId: null,
+      dropdownOption:[
+        {
+          label:'人员轨迹',
+          click:(row)=>this.checkHistory(row)
+        }
+      ],
     };
   },
   created() {
@@ -1122,6 +1136,12 @@ export default {
         });
       }, 200);
     },
+
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
+    }
   },
 };
 </script>

+ 19 - 2
src/views/PeopleManage/TeamLeader/TeamLeaderManage.vue

@@ -123,6 +123,7 @@
           <kt-common-table
             permsEdit="sys:team:edit"
             :data="pageResult"
+            :operationWidth="250"
             :columns="columns"
             editButtonName="编辑"
             :showBatchDelete="false"
@@ -134,6 +135,7 @@
             :button9Name="'离司恢复'"
             :button9Status="'离司'"
             @handleButton9="handleRest"
+            :buttonDropdown="dropdownOption"
           >
           </kt-common-table>
         </SplitArea>
@@ -253,6 +255,7 @@
                     style="width: 100%"
                     v-model="formDataDetail.entryTime"
                     type="date"
+                    value-format="yyyy-MM-dd"
                     placeholder="选择日期"
                     popper-class="select-prop"
                   >
@@ -468,6 +471,8 @@
         <el-button @click="closeDialogOut">取消</el-button>
       </span>
     </el-dialog>
+
+    <personnelHistory ref="personnelHistory" ></personnelHistory>
   </div>
 </template>
 
@@ -478,6 +483,7 @@ import KtCommonTable from "@/views/Core/KtCommonTable.vue"; //表格组件
 import peopleImage from "@/components/PeopleImage/index.vue"; //影像组件
 import { validateSfz } from "../../../utils/validate.js";
 import userDetail from "@/components/UserDetail/index.vue"; // 详情信息
+import personnelHistory from "@/components/PersonnelHistory/index.vue"; //人员修改历史
 import mixa from "../mixin";
 const mixin = new mixa({
   treeTypeNum: 2, //树分类过滤参数
@@ -489,6 +495,7 @@ export default {
     KtCommonTable,
     userDetail,
     peopleImage,
+    personnelHistory
   },
   mixins: [mixin],
   data() {
@@ -623,7 +630,13 @@ export default {
       },
       //影像上传列表
       imagesIdList: [],
-      pdeptId: null
+      pdeptId: null,
+      dropdownOption:[
+        {
+          label:'人员轨迹',
+          click:(row)=>this.checkHistory(row)
+        }
+      ],
     };
   },
   created() {
@@ -1123,7 +1136,11 @@ export default {
         });
       }, 200);
     },
-
+    //查看人员修改记录
+    async checkHistory(row){
+      let userId = row.userId;
+      this.$refs.personnelHistory.getHistory(userId);
+    }
   },
 };
 </script>

+ 12 - 0
src/views/PeopleManage/UserMap.vue

@@ -46,6 +46,7 @@
         </el-switch> -->
       </div>
     </div>
+    <MobileZoomDivTR>
     <div v-if="infoWindowVisible" class="infohis-window">
       <p class="close flex j-s">
         <span>历史记录</span>
@@ -75,6 +76,8 @@
         </el-pagination>
       </div>
     </div>
+  </MobileZoomDivTR>
+      <MobileZoomDivR>
     <div class="personnel-window ">
       <p class="close flex j-s ">
         <!-- <span>人员分布</span> -->
@@ -144,6 +147,9 @@
           </div> -->
       </div>
     </div>
+  </MobileZoomDivR>
+
+<MobileZoomDiv>
     <div v-if="personnelVisible" class="info-window">
       <p class="close flex j-s">
         <span>人员详情</span>
@@ -195,12 +201,17 @@
         </el-pagination>
       </div>
     </div>
+  </MobileZoomDiv>
+
   </div>
 </template>
 
 <script>
 import echarts from 'echarts';
 import yongchengData from '../../assets/js/yongchengData';
+import MobileZoomDiv from './MobileZoomDiv.vue'
+import MobileZoomDivR from './MobileZoomDivR.vue'
+import MobileZoomDivTR from './MobileZoomDivTR.vue'
 import AMapLoader from "@amap/amap-jsapi-loader";
 window._AMapSecurityConfig = {
   securityJsCode: 'd62687dd438cfadd859bbab66d8e41a2',		//安全密钥
@@ -266,6 +277,7 @@ export default {
 
     };
   },
+  components: { MobileZoomDiv, MobileZoomDivR,MobileZoomDivTR },
   mounted() {
     myChart = echarts.init(document.getElementById('echarts_box'))
     this.initMap();

+ 2 - 2
src/views/Task/DaikeLetter.vue

@@ -67,7 +67,7 @@
       <el-tabs v-model="activeName"  tab-position="left" @tab-click="handleClick">
         <el-tab-pane label="报价" name="999" >
           <div class="quotation-content">
-            <Ktletter ref="Ktletter" :isdisabled="isdisabled"  isLetter="2"></Ktletter>
+            <Ktletter ref="Ktletter" :isdisabled="isdisabled" isLetter="2"></Ktletter>
           </div>
         </el-tab-pane>
         <el-tab-pane label="全部订单" name="888" :disabled="isdisabled">
@@ -225,7 +225,7 @@ export default {
     orderEdit(data){
       this.activeName=data.activeName
       this.$refs.Ktletter.editingWay(data)
-      this.$refs.Ktletter.obtainProtocol(data)
+      // this.$refs.Ktletter.obtainProtocol(data)
     }
   }
 }