You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wkcrm_web/src/views/workLog/components/LogDetail.vue

730 lines
17 KiB

<template>
<slide-view
v-loading="loading"
:no-listener-class="noListenerClass"
:body-style="{padding: 0, height: '100%'}"
class="d-view"
xs-empty-icon="nopermission"
xs-empty-text="暂无权限"
@afterEnter="viewAfterEnter"
@close="hideView">
<div
v-if="detail"
direction="column"
align="stretch"
class="main">
<flexbox class="detail-header">
<div class="header-icon">
<i class="wk wk-log" />
</div>
<div class="header-name">日志</div>
</flexbox>
<div class="main__bd">
<!-- 基本信息 -->
<div class="main__bd--info">
<div class="content">
<div
v-if="detail.content"
class="content-box">
<div class="content-title">
今日工作内容:
</div>
<div class="content-text">{{ detail.content }}</div>
</div>
<div
v-if="detail.tomorrow"
class="content-box">
<div class="content-title">
明日工作的内容:
</div>
<div class="content-text">{{ detail.tomorrow }}</div>
</div>
<div
v-if="detail.question"
class="content-box">
<div class="content-title">
遇到的问题:
</div>
<div class="content-text">{{ detail.question }}</div>
</div>
</div>
<picture-list-view
v-if="detail.imgList.length !== 0"
:list="detail.imgList" />
<flexbox v-if="detail.sendUserList && detail.sendUserList.length" class="send-list">
<span class="send-list__label">发送给:</span>
<span
v-for="(item, index) in detail.sendUserList"
:key="index"
class="send-list__user">
<xr-avatar
:name="item.realname"
:size="32"
:src="item.img || item.thumb_img"
:id="item.user_id"
:disabled="false"
trigger="hover" />
</span>
</flexbox>
<!-- 附件 -->
<div v-if="detail.fileList.length" class="section">
<div class="section__hd">
<i class="wukong wukong-file" />
<span>附件</span>
<span>({{ detail.fileList.length }})</span>
</div>
<div class="section__bd">
<file-cell
v-for="(file, fileIndex) in detail.fileList"
:key="fileIndex"
:data="file"
:list="detail.file"
:cell-index="fileIndex" />
</div>
</div>
<!-- 相关信息 -->
<div
v-if="Object.keys(relatedListData).length > 0"
class="section">
<div class="section__hd">
<i class="wukong wukong-relevance" />
<span>相关信息</span>
</div>
<div class="section__bd">
<div
v-for="(items, key) in relatedListData"
:key="key">
<related-business-cell
v-for="(item, itemIndex) in items"
:data="item"
:cell-index="itemIndex"
:type="key"
:key="itemIndex"
:show-foot="false"
@click.native="checkRelatedDetail(key, item)" />
</div>
</div>
</div>
<div v-if="detail.bulletin" class="section">
<div class="section__hd">
<i class="wk wk-briefing" />
<span>销售简报</span>
</div>
<div class="section__bd">
<report-menu
:list="reportList"
@select="reportSelect" />
</div>
</div>
</div>
<!-- 回复 -->
<el-tabs
value="commont"
type="border-card"
class="commont">
<el-tab-pane
label="回复"
name="commont">
<reply-comment
v-loading="commentLoading"
ref="f_reply"
@toggle="closeOtherReply"
@reply="handleReply" />
<comment-list
v-if="replyList.length > 0"
ref="comment_list"
:id="id"
:list="replyList"
type="2"
@delete="deleteComment"
@close-other-reply="$refs.f_reply.toggleFocus(true)" />
</el-tab-pane>
</el-tabs>
</div>
</div>
<c-r-m-full-screen-detail
:visible.sync="showRelatedDetail"
:crm-type="relatedCRMType"
:id="relatedID" />
<!-- 销售简报列表 -->
<report-list
:show.sync="reportListShow"
:title="reportData.title"
:placeholder="reportData.placeholder"
:crm-type="reportData.crmType"
:request="reportData.request"
:params="reportData.params"
:record-request="reportData.recordRequest"
:field-list="fieldReportList"
:paging="reportData.paging"
:sortable="reportData.sortable"/>
</slide-view>
</template>
<script>
import {
journalQueryByIdAPI,
journalQueryRecordCountAPI,
journalQueryBulletinByTypeAPI, journalQueryActivityCountAPI } from '@/api/oa/journal'
import {
queryCommentListAPI,
setjournalCommentAPI
} from '@/api/oa/common'
import SlideView from '@/components/SlideView'
import PictureListView from '@/components/PictureListView'
import FileCell from '@/views/oa/components/FileCell'
import RelatedBusinessCell from '@/views/oa/components/RelatedBusinessCell'
import ReportMenu from './ReportMenu'
import ReportList from '@/views/crm/workbench/components/ReportList'
import ReplyComment from '@/components/ReplyComment'
import CommentList from '@/components/CommentList'
import { mapGetters } from 'vuex'
import { separator } from '@/filters/vueNumeralFilter/filters'
export default {
// 日志详情
name: 'LogDetail',
components: {
SlideView,
PictureListView,
FileCell,
RelatedBusinessCell,
ReportMenu,
ReportList,
ReplyComment,
CommentList,
CRMFullScreenDetail: () =>
import('@/components/CRMFullScreenDetail')
},
props: {
id: [String, Number],
noListenerClass: {
type: Array,
default: () => {
return ['el-table__body']
}
}
},
data() {
return {
loading: false,
detail: null,
// 相关详情的查看
relatedID: '',
relatedCRMType: '',
showRelatedDetail: false,
// 简报信息
reportList: [
{
type: 'customer',
key: 'customerNum',
info: '今日新增客户',
name: '今日新增客户 0'
},
{
type: 'business',
key: 'businessNum',
info: '今日新增商机',
name: '今日新增商机 0'
},
{
type: 'contract',
key: 'contractNum',
info: '今日新增合同',
name: '今日新增合同 0'
},
{
type: 'receivables',
key: 'receivablesMoneyNum',
info: '今日新增回款',
name: '今日新增回款 0'
},
{
type: 'record',
key: 'recordNum',
info: '今日新增跟进记录',
name: '今日新增跟进记录 0'
}
],
// 简报预览
reportListShow: false,
fieldReportList: null,
reportData: {
title: '',
placeholder: '',
crmType: '',
request: null,
recordRequest: journalQueryRecordCountAPI,
params: null,
paging: true,
sortable: false
},
// 回复
commentLoading: false,
replyList: []
}
},
computed: {
...mapGetters([
'userInfo'
]),
/**
* 相关信息
*/
relatedListData() {
const tempsData = {}
const keys = ['contacts', 'customer', 'business', 'contract']
for (let index = 0; index < keys.length; index++) {
const key = keys[index]
const list = this.detail[`${key}List`] || []
if (list.length > 0) {
tempsData[key] = list
}
}
return tempsData
}
},
watch: {
id() {
this.viewAfterEnter()
}
},
mounted() {},
beforeDestroy() {},
methods: {
/**
* 页面展示发请求
*/
viewAfterEnter() {
this.detail = null
this.getDetail()
// this.getCommentList()
},
/**
* 详情
*/
getDetail() {
this.loading = true
journalQueryByIdAPI({ log_id: this.id })
.then(res => {
this.detail = res.data.list
this.replyList = this.detail.replyList
if (this.detail.bulletin) {
const data = this.detail.bulletin || {}
this.reportList = this.reportList.map(item => {
if (item.key == 'receivablesMoney') {
data.receivablesMoney = separator(Math.floor(data.receivablesMoney || 0))
}
item.name = `${item.info} ${data[item.key]}`
return item
})
}
this.loading = false
})
.catch(() => {
this.loading = false
this.hideView()
})
},
/**
* 查看相关信息详情
*/
checkRelatedDetail(crmType, item) {
this.relatedID = item[crmType + '_id']
this.relatedCRMType = crmType
this.showRelatedDetail = true
},
/**
* 关闭页面
*/
hideView() {
this.$emit('close')
this.$emit('hide-view')
},
/**
* 简报预览
*/
reportSelect(item, data) {
data = this.detail
if (item.type) {
this.reportData.title = `销售简报-${item.info}`
this.reportData.placeholder = {
customer: '请输入客户名称',
business: '请输入商机名称',
contract: '请输入合同名称',
receivables: '请输入回款编号',
record: ''
}[item.type]
this.reportData.crmType = item.type
// data 存在 是已添加日志预览 不存在为页面顶部 销售简报预览
this.reportData.params = data ? { log_id: data.log_id } : { today: 1 }
// type 1 客户 2 商机 3 合同 4 回款 5 跟进记录
this.reportData.params.type = {
customer: 1,
business: 2,
contract: 3,
receivables: 4,
record: 5
}[item.type]
if (item.type == 'record') {
this.fieldReportList = [
{
label: '模块',
prop: 'types',
width: 300
},
{
label: '新增跟进记录数',
prop: 'dataCount'
}
]
this.reportData.request = journalQueryActivityCountAPI
this.reportData.paging = false
this.reportData.sortable = false
} else {
this.fieldReportList = this.getReportFieldList(item.type)
this.reportData.request = journalQueryBulletinByTypeAPI
this.reportData.paging = true
this.reportData.sortable = 'custom'
}
this.reportListShow = true
}
},
/**
* type 1 客户 2 商机 3 合同 4 回款 5 跟进记录
*
* 表头数据
* 客户:客户名称、成交状态、最后跟进时间、创建时间、负责人
* 商机:商机名称、商机阶段、最后跟进时间、创建时间、负责人
* 合同:合同名称、合同状态、创建时间、公司签约人
* 回款:回款编号、回款时间、负责人
*/
getReportFieldList(type) {
return {
customer: [
{
label: '客户名称',
prop: 'name'
},
{
label: '成交状态',
prop: 'deal_status'
},
{
label: '最后跟进时间',
prop: 'last_time'
},
{
label: '创建时间',
prop: 'create_time'
},
{
label: '负责人',
prop: 'owner_user_name'
}
],
business: [
{
label: '商机名称',
prop: 'name'
},
{
label: '商机阶段',
prop: 'status_name'
},
{
label: '最后跟进时间',
prop: 'last_time'
},
{
label: '创建时间',
prop: 'create_time'
},
{
label: '负责人',
prop: 'owner_user_name'
}
],
contract: [
{
label: '合同名称',
prop: 'name'
},
{
label: '合同状态',
prop: 'check_status'
},
{
label: '创建时间',
prop: 'create_time'
},
{
label: '公司签约人',
prop: 'order_user_name'
}
],
receivables: [
{
label: '回款编号',
prop: 'number'
},
{
label: '回款时间',
prop: 'return_time'
},
{
label: '负责人',
prop: 'owner_user_name'
}
]
}[type]
},
/**
* 评论逻辑
*/
getCommentList() {
queryCommentListAPI({
type_id: this.id,
type: 2 // 任务1 日志2
})
.then(res => {
const list = res.data || []
this.replyList = list
// this.replyList = list.sort((a, b) => {
// return new Date(b.createTime) - new Date(a.createTime)
// }) || []
})
.catch(() => {})
},
closeOtherReply(flag) {
if (!flag && this.$refs.comment_list) {
this.$refs.comment_list.closeReply()
}
},
deleteComment(index) {
this.replyList.splice(index, 1)
},
/**
* 日志评论
*/
handleReply(data) {
this.commentLoading = true
setjournalCommentAPI({
type: 2,
content: data,
log_id: this.id
}).then(res => {
res.data.userInfo = {
user_id: this.userInfo.id,
realname: this.userInfo.realname,
img: this.userInfo.img
}
res.data.childCommentList = []
// this.$emit('add-comment', {
// data: res.data,
// index: this.index
// })
this.$refs.f_reply.commentsTextarea = ''
this.replyList.push(res.data)
this.commentLoading = false
}).catch(() => {
this.commentLoading = false
})
}
}
}
</script>
<style lang="scss" scoped>
.main {
position: relative;
height: 100%;
background: #f5f6f9;
&__bd {
height: calc(100% - 40px);
overflow: auto;
&--info {
padding: 0 20px 10px;
background: white;
}
}
}
.d-view {
padding: 0 !important;
}
// 日志内容
.content {
padding-top: 30px;
.content-box {
font-size: 14px;
margin-bottom: 20px;
&:last-child {
margin-bottom: 15px;
}
.content-title {
font-size: 13px;
color: #666;
margin-bottom: 10px;
}
.content-text {
color: #333;
line-height: 1.5;
white-space: pre-wrap;
word-wrap: break-word;
}
}
}
.detail-header {
padding: 30px 20px 0;
background: white;
.header-icon {
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
border-radius: $xr-border-radius-base;
margin-right: 20px;
background-color: #5864ff;
.wk {
color: white;
font-size: 26px;
}
}
.header-name {
font-size: 16px;
color: #333333;
flex: 1;
font-weight: 600;
}
}
.send-list {
padding: 8px 0 ;
&__label {
color: #333;
font-size: 12px;
}
&__user {
position: relative;
display: inline-block;
}
&__user + &__user {
margin-left: 7px;
}
}
.d-view {
position: fixed;
min-width: 926px;
width: 75%;
top: 60px;
bottom: 0px;
right: 0px;
padding: 15px;
background-color: white;
}
// 详情其他模块
.section {
padding: 10px 0;
&__hd {
span {
font-size: 16px;
color: #333;
font-weight: 600;
}
.wk {
color: #363636;
font-size: 15px;
margin-right: 5px;
}
}
&__bd {
margin-top: 15px;
padding-left: 25px;
}
}
// 详情
.commont {
box-shadow: none;
margin-bottom: 50px;
/deep/ .el-tabs__item {
color: #333;
font-size: 12px;
top: 2px;
margin-top: -2px;
}
/deep/ .el-tabs__nav-scroll {
min-height: 39px;
}
/deep/ .el-tabs__item.is-active {
border-top: 2px solid $xr-color-primary;
color: #333;
}
/deep/ .el-tabs {
height: calc(100% - 15px) !important;
}
// /deep/ .el-tabs__content {
// height: calc(100% - 40px) !important;
// padding: 0;
// overflow: hidden;
// position: relative;
// .el-tab-pane {
// height: 100%;
// overflow: hidden;
// }
// }
}
</style>