gx
queenwuli
2021-01-11 7113b4f2dd47a313c6fbc85c21f4756da42b212a
gx
8 files modified
527 ■■■■ changed files
hive-app/App.vue 2 ●●● patch | view | raw | blame | history
hive-app/common/jssdk/utils.js 9 ●●●●● patch | view | raw | blame | history
hive-app/pages/manager/employeeReport.vue 3 ●●●● patch | view | raw | blame | history
hive-app/pages/manager/selectEmployee.vue 64 ●●●● patch | view | raw | blame | history
hive-app/pages/member/editMember.vue 8 ●●●●● patch | view | raw | blame | history
hive-app/pages/member/selectCustomer.vue 62 ●●●● patch | view | raw | blame | history
hive-app/pages/workbench/followRecords/filter.vue 139 ●●●● patch | view | raw | blame | history
hive-app/pages/workbench/followRecords/index.vue 240 ●●●● patch | view | raw | blame | history
hive-app/App.vue
@@ -23,5 +23,5 @@
    /*每个页面公共css */
@import url("./common/styles/index");
@import url("./static/iconfont/iconfont.css");
@import url("//at.alicdn.com/t/font_2263696_ghdgvj09btt.css");
@import url("//at.alicdn.com/t/font_2263696_djh7biga0an.css");
</style>
hive-app/common/jssdk/utils.js
@@ -126,6 +126,15 @@
         var time = date.getFullYear() + "-" + month + "-" + day
         return time;
    },
    // 比较两个日期大小, 若第一个日期大于第二个日期,返回true
    compareData(prev, next){
        let oDate1 = new Date(prev);
        let oDate2 = new Date(next);
        if(oDate1.getTime() > oDate2.getTime()){
            return true
        }
        return false
    },
    // 加密账号
    encryptAccount(val) {
        if (/^1[3456789]\d{9}$/.test(val)) {
hive-app/pages/manager/employeeReport.vue
@@ -245,7 +245,8 @@
                    }
                })
            },
            setData(item){
            setData(selectItem){
                let item = selectItem[0];
                this.staffId = item.id;
                this.reloadData();
                setTimeout(() => {
hive-app/pages/manager/selectEmployee.vue
@@ -17,7 +17,7 @@
        </view>
        <no-record :isShow="!list.length"></no-record>
        <view class="footer">
            <text>已选:{{selectId?1:0}}人</text>
            <text>已选:{{selectItems.length?selectItems.length:0}}人</text>
            <button class="blue-btn btn mr-0" @click="confirm">确定</button>
        </view>
    </view>
@@ -33,13 +33,18 @@
            return {
                queryKey: '',
                list: [],
                selectId: '',
                selectName: ''
                selectIds: '',
                selectItems: [],
                multiSelect: false, //单选/多选,默认多选
            };
        },
        onLoad(options) {
            // 选中的id,逗号分隔
            if(options.selectId!='null'){
                this.selectId = options.selectId
                this.selectIds = options.selectId
            }
            if(options.multiSelect){
                this.multiSelect = new Boolean(options.multiSelect);
            }
            this.loadMemberList()
        },
@@ -54,8 +59,13 @@
                }, 'POST').then((res) => {
                    if(res.status == 200){
                        this.list = res.rows.map((item) => {
                            if(this.selectId && this.selectId == item.id){
                                this.selectName = item.name
                            let index = this.selectItems.findIndex((op) => {
                                return op.id == item.id
                            });
                            if(this.selectIds && this.selectIds.indexOf(item.id) > -1){
                                if(index == -1){
                                    this.selectItems.push(item);
                                }
                                return Object.assign(item, {isCheck: true})
                            }
                            return Object.assign(item, {isCheck: false})
@@ -64,26 +74,42 @@
                })
            },
            checkOnchange(item){
                if(this.multiSelect){
                    this.multiChange(item)
                }else{
                    this.singChange(item)
                }
            },
            singChange(item){
                if(!item.isCheck){
                    this.list.forEach((item) => {
                        item.isCheck = false;
                    this.list.forEach((op) => {
                        op.isCheck = false;
                    });
                    item.isCheck = true
                    this.selectId = item.id;
                    this.selectName = item.name;
                    item.isCheck = true;
                    this.selectItems = [item];
                }else{
                    item.isCheck = false;
                    this.selectId = '';
                    this.selectName = '';
                    this.selectItems = [];
                }
            },
            multiChange(item){
                let index = this.selectItems.findIndex((op) => {
                    return op.id == item.id
                });
                if(!item.isCheck){
                    item.isCheck = true;
                    this.selectItems.push(item);
                }else{
                    item.isCheck = false;
                    this.selectItems.splice(index,1);
                }
            },
            confirm(){
                let pages = getCurrentPages();
                let prevPage = pages[ pages.length - 2 ];
                prevPage.$vm.setData && prevPage.$vm.setData({
                    name: this.selectName,
                    id: this.selectId
                });
                let pages = getCurrentPages();
                let prevPage = pages[ pages.length - 2 ];
                if(this.selectItems.length){
                    prevPage.$vm.setData && prevPage.$vm.setData(this.selectItems);
                }
                uni.navigateBack()
            }
        },
hive-app/pages/member/editMember.vue
@@ -258,9 +258,11 @@
                    this.isDisabled = false;
                })
            },
            setData(item){
                this.recommendName = item.name;
                this.formData.recommendId = item.id;
            setData(selectItem){
                selectItem.forEach((item) => {
                    this.recommendName = item.vipName;
                    this.formData.recommendId = item.id;
                });
            }
        }
    }
hive-app/pages/member/selectCustomer.vue
@@ -20,7 +20,7 @@
        </view>
        <no-record :isShow="!list.length"></no-record>
        <view class="footer">
            <text>已选:{{selectId?1:0}}人</text>
            <text>已选:{{selectItems.length?selectItems.length:0}}人</text>
            <button class="blue-btn btn mr-0" @click="confirm">确定</button>
        </view>
    </view>
@@ -37,13 +37,18 @@
                colors: ['#CCC6B4', '#C0CCB4', '#B4C2CC', '#BEB4CC', '#B4CCBE', '#B4CCCA', '#CCB4C6', '#CCB4B4'],
                queryKey: '',
                list: [],
                selectId: '',
                selectName: ''
                selectIds: '',
                selectItems: [],
                multiSelect: false, //单选/多选,默认多选
            };
        },
        onLoad(options) {
            // 选中的id,逗号分隔
            if(options.selectId!='null'){
                this.selectId = options.selectId
                this.selectIds = options.selectId
            }
            if(options.multiSelect){
                this.multiSelect = new Boolean(options.multiSelect);
            }
            this.loadMemberList()
        },
@@ -61,8 +66,13 @@
                }, 'POST').then((res) => {
                    if(res.status == 200){
                        this.list = res.rows.map((item) => {
                            if(this.selectId && this.selectId == item.id){
                                this.selectName = item.vipName
                            let index = this.selectItems.findIndex((op) => {
                                return op.id == item.id
                            });
                            if(this.selectIds && this.selectIds.indexOf(item.id) > -1){
                                if(index == -1){
                                    this.selectItems.push(item);
                                }
                                return Object.assign(item, {isCheck: true})
                            }
                            return Object.assign(item, {isCheck: false})
@@ -71,26 +81,42 @@
                })
            },
            checkOnchange(item){
                if(this.multiSelect){
                    this.multiChange(item)
                }else{
                    this.singChange(item)
                }
            },
            singChange(item){
                if(!item.isCheck){
                    this.list.forEach((item) => {
                        item.isCheck = false;
                    this.list.forEach((op) => {
                        op.isCheck = false;
                    });
                    item.isCheck = true
                    this.selectId = item.id;
                    this.selectName = item.vipName;
                    item.isCheck = true;
                    this.selectItems = [item];
                }else{
                    item.isCheck = false;
                    this.selectId = '';
                    this.selectName = '';
                    this.selectItems = [];
                }
            },
            multiChange(item){
                let index = this.selectItems.findIndex((op) => {
                    return op.id == item.id
                });
                if(!item.isCheck){
                    item.isCheck = true;
                    this.selectItems.push(item);
                }else{
                    item.isCheck = false;
                    this.selectItems.splice(index,1);
                }
            },
            confirm(){
                let pages = getCurrentPages(); 
                let prevPage = pages[ pages.length - 2 ];
                prevPage.$vm.setData && prevPage.$vm.setData({
                    name: this.selectName,
                    id: this.selectId
                });
                let prevPage = pages[ pages.length - 2 ];
                if(this.selectItems.length){
                    prevPage.$vm.setData && prevPage.$vm.setData(this.selectItems);
                }
                uni.navigateBack()
            }
        },
hive-app/pages/workbench/followRecords/filter.vue
@@ -5,19 +5,21 @@
            <view class="popup-content">
                <view class="filter-content-time">
                    <text>开始时间</text>
                    <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
                        <view class="gray flex align-center">
                            <text>请选择</text>
                            <text class="iconfont iconarrow-backimg"></text>
                    <picker mode="date" @change="bindStartTimeChange" :end="endDate">
                        <view class=" flex align-center">
                            <text v-if="startTime">{{startTime}}</text>
                            <text v-else class="gray">请选择</text>
                            <text class="iconfont iconarrow-backimg gray"></text>
                        </view>
                    </picker>
                </view>
                <view class="filter-content-time">
                    <text>结束时间</text>
                    <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
                        <view class="gray flex align-center">
                            <text>请选择</text>
                            <text class="iconfont iconarrow-backimg"></text>
                    <picker mode="date" @change="bindEndTimeChange" :start="startTime" :end="endDate">
                        <view class="flex align-center">
                            <text v-if="endTime">{{endTime}}</text>
                            <text v-else class="gray">请选择</text>
                            <text class="iconfont iconarrow-backimg gray"></text>
                        </view>
                    </picker>
                </view>
@@ -26,9 +28,13 @@
                        <text>客户</text>
                    </view>
                    <view class="img-box">
                        <image class="header-img mr-20" src="../../../static/images/default-avatar.png"></image>
                        <navigator url="../../member/selectCustomer" hover-class="none">
                            <text class="iconfont iconjia gray-outline-btn-circle ml-5"></text>
                        <view v-for="item in vipList" class="flex align-center flex-v mr-10">
                            <image v-if="item.photo" class="header-img" :src="item.photo"></image>
                            <text v-else class="first-name">{{item.vipName | formatName}}</text>
                            <text class="font-12 gray ellipsis">{{item.vipName || '-'}}</text>
                        </view>
                        <navigator :url="'../../member/selectCustomer?multiSelect=true&selectId='+vipIds" hover-class="none">
                            <text class="iconfont iconjia gray-outline-btn-circle ml-5" :class="vipList.length?'mb-20':''"></text>
                        </navigator>
                    </view>
                </view>
@@ -37,16 +43,20 @@
                        <text>员工</text>
                    </view>
                    <view class="img-box">
                        <image class="header-img mr-20" src="../../../static/images/default-avatar.png"></image>
                        <navigator url="../../manager/selectEmployee" hover-class="none">
                            <text class="iconfont iconjia gray-outline-btn-circle ml-5"></text>
                        <view v-for="item in staffList" class="flex align-center flex-v mr-10">
                            <image v-if="item.photo" class="header-img" :src="item.photo"></image>
                            <text v-else class="first-name">{{item.name | formatName}}</text>
                            <text class="font-12 gray ellipsis">{{item.name || '-'}}</text>
                        </view>
                        <navigator :url="'../../manager/selectEmployee?multiSelect=true&selectId='+staffIds" hover-class="none">
                            <text class="iconfont iconjia gray-outline-btn-circle ml-5" :class="staffList.length?'mb-20':''"></text>
                        </navigator>
                    </view>
                </view>
            </view>
            <view class="btn-group">
                <button class="white-btn flex-1">重置</button>
                <button class="blue-btn flex-1 ml-10">确定</button>
                <button class="white-btn flex-1" @click="_reset()">重置</button>
                <button class="blue-btn flex-1 ml-10" @click="_confirm()">确定</button>
            </view>
        </view>
    </uni-popup>
@@ -60,14 +70,22 @@
            uniPopup,
            DateTimePicker
        },
        data() {
            return{
                windowHeight: "200px",
            }
        },
        props:{
            isShow: {
                default: false
            },
            staffList: {
                default: []
            },
            vipList: {
                default:[]
            }
        },
        data() {
            return{
                windowHeight: "200px",
                startTime: '',
                endTime: ''
            }
        },
        watch:{
@@ -79,15 +97,60 @@
                }
            }
        },
        computed:{
            vipIds(){
                let idArr = this.vipList.map((item) => {
                    return item.id;
                });
                return idArr.join(',')
            },
            staffIds(){
                let idArr = this.staffList.map((item) => {
                    return item.id;
                });
                return idArr.join(',')
            }
        },
        created() {
            this.endDate = this.$utils.formmatTime('YY-mm-dd')
        },
        mounted() {
            uni.getSystemInfo({
                success: (res) => {
                    this.windowHeight = res.windowHeight+"px";
            } })
            }})
        },
        methods:{
            showTime () {
                this.$refs['date-time'].show();
            bindStartTimeChange(e){
                this.startTime = e.detail.value;
                if(this.$utils.compareData(this.startTime, this.endTime)){
                    this.endTime = '';
                }
            },
            bindEndTimeChange(e){
                this.endTime = e.detail.value;
            },
            _reset(){
                this.startTime = '';
                this.endTime = '';
                this.$emit('reset')
                this.$refs.popup.close()
            },
            _confirm(){
                this.$refs.popup.close();
                this.$emit('change', {
                    startTime: this.startTime,
                    endTime: this.endTime
                })
            }
        },
        filters:{
            formatName(val){
                if(!val){
                    return '无'
                }
                val = val.trim();
                return val.substr(0, 1)
            }
        }
    }
@@ -107,21 +170,43 @@
        justify-content: space-between;
        border-bottom: 1px solid #EDEAF4;
        padding: 10px 0;
        font-size: 14px;
    }
    .filter-content-row{
        padding: 10px 0;
        font-size: 14px;
        border-bottom: 1px solid #EDEAF4;
    }
    .img-box{
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        padding: 0 10px;
        margin-top: 10px;
    }
    .header-img{
        width: 45px;
        height: 45px;
        width: 42px;
        height: 42px;
        border-radius: 50%;
        margin-bottom: 5px;
    }
    .first-name{
        display: inline-block;
        width: 42px;
        height: 42px;
        line-height: 42px;
        margin-bottom: 5px;
        border-radius: 50%;
        text-align: center;
        background: #518EFF;
        color: #FFFFFF;
        font-size: 16px;
    }
    .ellipsis{
        max-width: 40px;
        overflow: hidden;
        text-overflow:ellipsis;
        white-space: nowrap;
        margin-bottom: 6px;
    }
    .btn-group{
        display: flex;
hive-app/pages/workbench/followRecords/index.vue
@@ -1,6 +1,6 @@
<template>
    <!-- 跟进记录 -->
    <view>
    <view class="container" @click="isShowComments = false">
        <view>
            <h-tabs
                class="tab"
@@ -13,60 +13,65 @@
                    fontSize: '28',
                    underLineWidth: 60,
                }"
                @tabClick="tabClick($event)"
                @tabClick="changeType"
            />
        </view>
        <view class="content-row font-14" v-for="item in 2">
        <view class="content-row font-14" v-for="item in list">
            <view class="flex align-center">
                <image class="header-img" src="../../../static/images/default-avatar.png"></image>
                <view class="flex flex-v ml-10">
                    <text>杨明</text>
                    <text>2020-12 12:34</text>
                    <text>{{item.staffName}}</text>
                    <text class="gray font-12">{{item.createTime}}</text>
                </view>
            </view>
            <view class="mt-10">
                <text>截图服务了杨姐,她的面部比较干燥暗沉色斑较多,约下次来做一个面部护理</text>
                <text>{{item.content}}</text>
            </view>
            <view class="mt-10 flex" :start="num">
                <image v-for="(item,index) in imgList" @click="previewImg(index)" class="content-img mr-10" :src="item"></image>
            <view class="mt-10 mb-10 flex" :start="imgIndex">
                <image v-for="(op,index) in item.albums" @click="previewImg(item.albums,index)" class="content-img mr-10" :src="op.img"></image>
            </view>
            <view class="flex align-center justify-between mt-5">
                <text>客户:杨依依</text>
                <view class="flex align-center">
            <view class="flex align-center justify-between mt-5 gray font-13">
                <text>客户: {{item.vipName}}</text>
                <view class="flex align-center" v-if="item.nextNotifyTime">
                    <text class="iconfont iconzhong mr-5"></text>
                    <text>2020-12-31 12:34</text>
                    <text>{{item.nextNotifyTime}}</text>
                </view>
            </view>
            <view class="mt-5">
                <text>订单:面部护理等</text>
            <view class="mt-5 gray font-13">
                <text>订单:{{item.orderAbstract}}</text>
            </view>
            <view class="right mt-5">
                <text class="iconfont iconxin"></text>
                <text class="iconfont iconliuyan1 ml-20" @click="showMessage"></text>
                <text class="iconfont" :class="item.zans && item.zans.indexOf(userInfo.id)>-1?'red iconxin1':'iconxin2'" @click="thumbsUp(item)"></text>
                <text class="iconfont iconliuyan1 ml-15"  @click.stop="showComment(item.id)"></text>
            </view>
            <view class="content-row-notes flex align-center blue">
                <text class="iconfont iconxin mr-10"></text>
                <text>李贝,拉拉</text>
            <view class="content-row-notes flex align-center blue" v-if="item.zanUsers && item.zanUsers.length">
                <text class="iconfont iconxin2 mr-10"></text>
                <text v-for="(op, i) in item.zanUsers">{{op.suName}}<text v-if="i!=item.zanUsers.length-1">,</text></text>
            </view>
            <view class="content-row-notes flex align-center blue">
                <text>李贝: 好的,继续跟进</text>
            <view class="content-row-notes blue" v-if="item.followupComments && item.followupComments.length">
                <view v-for="op in item.followupComments">{{op.createBy}}: {{op.content}}</view>
            </view>
        </view>
        <fillter :isShow="isShowFilter" @change="changeFilter"></fillter>
        <view v-show="messageShow" class="message-row">
            <input type="text" cursor-spacing="10" :focus="messageShow" class="message-input" placeholder="评论" placeholder-class="placeholder"/>
            <button class="green-btn message-btn">发送</button>
        <view v-if="list.length">
            <uni-load-more :status="loadStatus" color="#a5abaf"></uni-load-more>
        </view>
        <view v-if="isShowComments" class="message-row" @click.stop="">
            <input type="text" v-model="comment" cursor-spacing="10" :focus="isShowComments" class="message-input" placeholder="评论" placeholder-class="placeholder"/>
            <button class="green-btn message-btn" :disabled="!comment" @click="addFollowupComment">发送</button>
        </view>
        <fillter :isShow="isShowFilter" :staffList="staffList" :vipList="vipList" @reset="resetFilter" @change="changeFilter"></fillter>
    </view>
</template>
<script>
    import HTabs from "@/components/liuyuno-tabs/liuyuno-tabs.vue";
    import fillter from './filter'
    import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
    export default {
        components: {
            HTabs,
            fillter
            fillter,
            uniLoadMore
        },
        data() {
          return {
@@ -84,40 +89,162 @@
                    name: '我的团队'
                }
            ],
            imgList:[
                '../../../static/images/banner.jpg',
                '../../../static/images/product.jpg'
            ],
            messageShow:false,
            type: 1,
            list: [],
            imgIndex: 0,
            isShowComments:false,
            isShowFilter: false,
            num:0
            pageNum: 0,
            loadStatus: 'more',
            userInfo: {},
            comment: '',
            follId: '',
            staffList: [],
            vipList: [],
            startTime: '',
            endTime: ''
          }  
        },
        onNavigationBarButtonTap(e){
            if(e.index==0){
                uni.navigateTo({
                    url:"./addRecord"
                })
            }
            if(e.index==1){
                this.isShowFilter = !this.isShowFilter;
            }
        },
        onLoad() {
            this.getUserInfo()
            this.reloadList()
        },
        onPullDownRefresh(){
            this.reloadData();
            let timer = setTimeout(function () {
                uni.startPullDownRefresh();
                clearTimeout(timer);
                timer = null;
            }, 800);
        },
        onReachBottom(){
            this.loadList()
        },
        methods:{
            getUserInfo(){
                let roleInfo = this.$httpUtils.getRoleInfo();
                if(roleInfo){
                    this.userInfo = roleInfo;
                }
            },
            reloadList(){
                this.pageNum = 0;
                this.loadStatus = 'more';
                this.loadList(true)
            },
            loadList(isRest){
                if(this.loadStatus!=='more'){
                    return;
                }
                let staffIds = this.staffList.map((item) => {
                    return item.id;
                });
                let vipIds = this.vipList.map((item) => {
                    return item.id;
                });
                this.$httpUtils.request('/api/followup/findFollowup', {
                    startTime: this.startTime,
                    endTime: this.endTime,
                    limit: 10,
                    offset: this.pageNum,
                    queryType: this.type,
                    staffIds: staffIds,
                    vipIds: vipIds
                }, 'POST').then((res) => {
                    if(res.status == 200){
                        let result = res.rows;
                        if(result.length < 10){
                            this.loadStatus = 'noMore';
                        } else {
                            this.pageNum ++ ;
                            this.loadStatus = 'more';
                        }
                        if(isRest){
                            this.list = result
                        }else{
                            this.list = this.list.concat(result);
                        }
                    }
                })
            },
            changeType(index){
                this.type = index+1;
                this.reloadList()
            },
            // 预览图片
            previewImg(index) {
                // let imgArr=[]
                // imgArr.push(image)
                //预览图片
            previewImg(imgList, index) {
                if(!imgList.length){
                    return;
                }
                this.imgIndex = index;
                imgList = imgList.map((item) => {
                    return item.img;
                });
                uni.previewImage({
                    urls: this.imgList,
                    indicator:'default',
                    urls: imgList,
                    indicator: 'default',
                    loop:true
                })
            },
            onNavigationBarButtonTap(e){
                if(e.index==0){
                    uni.navigateTo({
                        url:"./addRecord"
                    })
                }
                if(e.width && e.index==1){
                    this.isShowFilter = !this.isShowFilter;
            // 点赞
            thumbsUp(item){
                this.$httpUtils.request('/api/followup/zanFollowup/'+item.id).then((res) => {
                    if(res.status == 200){
                        this.reloadList()
                    }
                })
            },
            // 评论
            addFollowupComment(){
                this.$httpUtils.request('/api/followup/addFollowupComment', {
                    follId: this.follId,
                    content: this.comment
                }, 'POST').then((res) => {
                    if(res.status == 200){
                        this.reloadList();
                        this.isShowComments = false;
                        this.comment = '';
                    }else{
                        this.$toast.info(res.info)
                    }
                })
            },
            showComment(id){
                this.follId = id;
                this.isShowComments=true;
            },
            setData(selectItem){
                let pages = getCurrentPages();
                let prevPage = pages[ pages.length - 1 ];
                if(prevPage.route.indexOf('selectCustomer') > -1){
                    this.vipList = selectItem;
                }else{
                    this.staffList = selectItem;
                }
            },
            showMessage(){
                this.messageShow=!this.messageShow
            // 重置筛选条件
            resetFilter(){
                this.startTime = '';
                this.endTime = '';
                this.staffList = [];
                this.vipList = [];
                this.reloadList();
            },
            changeFilter(data){
                this.startTime = data.startTime;
                this.endTime = data.endTime;
                this.reloadList();
            }
        }
    }
</script>
@@ -125,6 +252,10 @@
<style>
    page{
        background: #F6F6F8;
        height: 100%;
    }
    .container{
        height: 100%;
    }
    .tab{
        background: #FFFFFF;
@@ -144,10 +275,11 @@
        height: 80px;
    }
    .content-row-notes{
        line-height: 20px;
        line-height: 22px;
        background: #F6F6F8;
        padding: 5px;
        margin-top: 10px;
        margin-top: 5px;
        font-size: 13px;
    }
    .message-row{
        display: flex;
@@ -161,10 +293,18 @@
        background: #FFFFFF;
        height: 30px;
        margin-right: 5px;
        padding-left: 5px;
        padding-right: 5px;
    }
    .message-btn{
        margin: 0;
        line-height: 30px;
        border-radius: 0;
        font-size: 14px;
    }
    uni-button[disabled]:not([type]), uni-button[disabled][type=default]{
        color: #FFFFFF;
        background-color: rgb(31 183 19 / 0.4);
        border: 0;
    }
</style>