소스 검색

常错词

newStyle
jyt 2 년 전
부모
커밋
4e701e029b
14개의 변경된 파일758개의 추가작업 그리고 232개의 파일을 삭제
  1. +5
    -0
      package.json
  2. BIN
      public/model.docx
  3. +6
    -11
      src/page/wel.vue
  4. +105
    -12
      src/views/Receive/index.vue
  5. +5
    -5
      src/views/Statistics/BuildingContrast.vue
  6. +24
    -13
      src/views/Statistics/ConsultantBrand.vue
  7. +8
    -6
      src/views/Statistics/ReceptionOverview.vue
  8. +178
    -149
      src/views/Statistics/ReceptionStatistical.vue
  9. +20
    -16
      src/views/Statistics/TheTeamCompared.vue
  10. +2
    -2
      src/views/Statistics/TrendAnalysis.vue
  11. +4
    -6
      src/views/Statistics/index.vue
  12. +5
    -5
      src/views/houseData/analyse.vue
  13. +393
    -5
      src/views/inspection/ProhibitedList.vue
  14. +3
    -2
      vue.config.js

+ 5
- 0
package.json 파일 보기

@@ -25,11 +25,16 @@
"codemirror": "^5.53.2",
"core-js": "^2.6.12",
"crypto-js": "^3.1.9-1",
"docxtemplater": "^3.29.4",
"echarts": "^4.2.1",
"element-ui": "2.12.0",
"file-saver": "^2.0.5",
"js-cookie": "^2.2.0",
"jszip": "^3.9.1",
"jszip-utils": "^0.1.0",
"less-loader": "^6.0.0",
"nprogress": "^0.2.0",
"pizzip": "^3.1.1",
"quill": "^1.3.7",
"script-loader": "^0.7.2",
"sockjs-client": "1.0.0",


BIN
public/model.docx 파일 보기


+ 6
- 11
src/page/wel.vue 파일 보기

@@ -241,8 +241,6 @@
style="
display: flex;
flex-wrap: wrap;
height: 290px;
overflow-y: auto;
width: 90%;
margin: 0 auto;
"
@@ -311,8 +309,6 @@
<div class="tabbox" v-if="employeeExecutionRatelist.list.length != 0">
<div
style="
overflow-y: auto;
height: 230px;
width: 94%;
margin: 0 auto;
"
@@ -976,9 +972,8 @@
<el-table
:header-cell-style="{ background: '#F2F4F5' }"
:data="companyRank"
height="320"
style="width: 100%; font-size: 14px"
>>
>
<el-table-column
prop="companyName"
:label="role == 2 ? '项目名称' : '公司名称'"
@@ -1044,7 +1039,6 @@
<el-table
:header-cell-style="{ background: '#F2F4F5' }"
:data="houseRank"
height="320"
style="width: 100%; font-size: 14px"
>>
<el-table-column
@@ -1616,6 +1610,7 @@ export default {
padding-left: 30px;
padding-right: 30px;
margin-top: 20px;
min-height: 320px;
}
}
.el-row {
@@ -1627,16 +1622,16 @@ export default {

.app-box-san {
width: 100%;
height: 350px;
min-height: 350px;
display: flex;
margin-top: 15px;
.zuo {
// flex: 1;
height: 100%;
padding: 0 0 20px 0 ;
margin-right: 15px;
background: #ffffff;
border-radius: 4px;
width: 48.7%;
flex-grow: 1;
.title {
width: 100%;
height: 55px;
@@ -1653,7 +1648,7 @@ export default {
}
}
.you {
height: 100%;
flex-grow: 1;
width: 49%;
background: #ffffff;
border-radius: 4px;


+ 105
- 12
src/views/Receive/index.vue 파일 보기

@@ -7,7 +7,7 @@
<div class="topbox">
<div class="topzuo">
<div class="title" style="display: flex">
<div style="flex: 1">
<div style="flex-grow: 1">
<span class="span1"
>{{
userinformationlist.visitRecord == 1
@@ -21,7 +21,7 @@
}}
</span>
</div>
<div style="width: 120px; display: flex; color: #2671e2">
<div style="flex-shrink: 0; display: flex; color: #2671e2">
<div v-if="rec_index_addJ" @click="Addtodigest()">加精</div>
<div
v-if="rec_index_receflag"
@@ -30,6 +30,8 @@
>
{{ userinformationlist.validInvalidName }}
</div>
<!-- 导出 -->
<div v-if="permissions.cus_index_downLoad_word" class="outDownLoad" @click="exportWord">导出话术</div>
</div>
</div>
<div class="title" style="margin-top: 6px">
@@ -160,7 +162,13 @@
</div>
</div>
<div v-if="rec_index_flag" class="headpade">
<div class="biaoji" @click="biaoji()" v-if="userinformationlist.merge==0">标记</div>
<div
class="biaoji"
@click="biaoji()"
v-if="userinformationlist.merge == 0"
>
标记
</div>
</div>
</div>
<div style="width: 100%">
@@ -195,10 +203,17 @@
{{ item.bg | timestamp }}
</div>
<div class="textcontent">
<div class="content123s"
:class="{ adjskdjroleindexclass: item.isShow == 1 }"
v-html="item.onebest"></div>
<img @click.stop="play(item)" src="../../../public/img/play.png" alt="" style="flex-shrink: 0;width: 24px;height: 24px;">
<div
class="content123s"
:class="{ adjskdjroleindexclass: item.isShow == 1 }"
v-html="item.onebest"
></div>
<img
@click.stop="play(item)"
src="../../../public/img/play.png"
alt=""
style="flex-shrink: 0; width: 24px; height: 24px"
/>
</div>
</div>
</div>
@@ -403,7 +418,11 @@
<el-input v-model="form.wrongWord" :disabled="isNum" maxlength="8" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="正确词" prop="correctWord">
<el-input v-model="form.correctWord" maxlength="8" autocomplete="off"></el-input>
<el-input
v-model="form.correctWord"
maxlength="8"
autocomplete="off"
></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
@@ -735,6 +754,12 @@ import "aplayer/dist/APlayer.min.css";
import APlayer from "aplayer";
import { mapGetters } from "vuex";
import { getStore, setStore } from "@/util/store";

import docxtemplater from "docxtemplater";
import PizZip from "pizzip";
import JSZipUtils from "jszip-utils";
import { saveAs } from "file-saver";

export default {
data() {
return {
@@ -816,7 +841,8 @@ export default {
rec_index_todo: false,
rec_index_receflag: false,
rec_index_textyh: false,
isNum:false
isNum:false,
outSpeechSkillList: [], // 导出话术列表
};
},
created() {
@@ -827,6 +853,7 @@ export default {
this.rec_index_todo = this.permissions["rec_index_todo"]; //禁忌
this.rec_index_receflag = this.permissions["rec_index_receflag"]; //接待标记
this.rec_index_textyh = this.permissions["rec_index_textyh"]; //文本优化
console.log(this.permissions)
},
mounted() {
this.fileId = this.$route.query.flag;
@@ -871,6 +898,67 @@ export default {
},

methods: {
// 格式化话术内容
formatAudioList() {
let list = this.arr[0].audioContent
list = JSON.parse(list)
console.log(list)
list.map(item => {
this.outSpeechSkillList.push({
id: this.$options.filters.toCapital(item.speaker),
times: this.$options.filters.timestamp(item.bg),
content: item.onebest.replace(/<.*?>/gi, "")
})
})

console.log(this.outSpeechSkillList)
},

// 导出word
exportWord() {
// 读取并获得模板文件的二进制内容
JSZipUtils.getBinaryContent("/model.docx", (error, content) => {
console.log(error, content);
// model.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据
// 抛出异常
if (error) {
throw error;
}
// 创建一个PizZip实例,内容为模板的内容
let zip = new PizZip(content);
// 创建并加载docxtemplater实例对象
let doc = new docxtemplater().loadZip(zip);
// 设置模板变量的值
doc.setData({
audioList: this.outSpeechSkillList,
});
try {
// 用模板变量的值替换所有模板变量
doc.render();
} catch (error) {
// 抛出异常
let e = {
message: error.message,
name: error.name,
stack: error.stack,
properties: error.properties,
};
console.log(JSON.stringify({ error: e }));
throw error;
}

// 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
let out = doc.getZip().generate({
type: "blob",
mimeType:
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
});
// 将目标文件对象保存为目标类型的文件,并命名
saveAs(out, "接待话术.docx");
});
},

// 返回颜色
spackerColor(index) {
let obj = {
@@ -1403,7 +1491,7 @@ export default {

// 播放
play(item) {
let num = parseInt(item.bg / 1000)
let num = parseInt(item.bg / 1000);
this.aplayer.seek(num);
this.searchisshow = false;
this.aplayer.play();
@@ -1653,6 +1741,7 @@ export default {
this.aplayerLength = audopbj.length;
this.arr = res.data;
this.bofangchushihua();
this.formatAudioList()
});
},
tapspagek(i) {
@@ -1847,8 +1936,8 @@ export default {
text-align: left;

.textcontent {
flex-direction: row-reverse;
text-align: left;
flex-direction: row-reverse;
text-align: left;
}
}

@@ -2101,6 +2190,10 @@ export default {
margin-left: 2px;
}
}

.outDownLoad {
margin: 0 0 0 0.5em;
}
}
.topyou {
width: 24%;


+ 5
- 5
src/views/Statistics/BuildingContrast.vue 파일 보기

@@ -141,7 +141,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 250px; width: 94%; margin: 0 auto"
style="height: 300px; width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in objList1.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -170,7 +170,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 250px; width: 94%; margin: 0 auto"
style="height: 300px; width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in objList2.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -206,7 +206,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 250px; width: 94%; margin: 0 auto"
style="height: 300px; width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in objList3.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -239,7 +239,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 250px; width: 94%; margin: 0 auto"
style="height: 300px; width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in objList4.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -669,7 +669,7 @@ export default {

.app-box-san {
width: 100%;
height: 400px;
min-height: 400px;
display: flex;
margin-top: 15px;
.zuo {


+ 24
- 13
src/views/Statistics/ConsultantBrand.vue 파일 보기

@@ -98,7 +98,12 @@
</el-table-column>
<el-table-column prop="deptName" label="归属团队" align="center">
</el-table-column>
<el-table-column prop="activeCustomer" label="接待量" align="center" sortable>
<el-table-column
prop="activeCustomer"
label="接待量"
align="center"
sortable
>
<template slot-scope="{ row }"> {{ row.activeCustomer }}次 </template>
</el-table-column>
<el-table-column
@@ -190,7 +195,7 @@
</div>
<div
v-if="echarlist.length != 0"
style="overflow-y: auto; height: 258px; width: 94%; margin: 0 auto"
style="min-height: 258px; width: 94%; margin: 0 auto;padding: 0 0 20px 0;"
>
<div class="jinbox" v-for="(item, i) in echarlist" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -235,7 +240,7 @@
</div>
<div
v-if="echarlist2.length != 0"
style="overflow-y: auto; height: 258px; width: 94%; margin: 0 auto"
style="min-height: 258px; width: 94%; margin: 0 auto;padding: 0 0 20px 0;"
>
<div class="jinbox" v-for="(item, i) in echarlist2" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -294,7 +299,7 @@
</div>
<div
v-if="echarlist1.length != 0"
style="overflow-y: auto; height: 258px; width: 94%; margin: 0 auto"
style="min-height: 258px; width: 94%; margin: 0 auto;padding: 0 0 20px 0;"
>
<div class="jinbox" v-for="(item, i) in echarlist1" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -354,7 +359,7 @@
</div>
<div
v-if="echarlist3.length != 0"
style="overflow-y: auto; height: 258px; width: 94%; margin: 0 auto"
style="min-height: 258px; width: 94%; margin: 0 auto;padding: 0 0 20px 0;"
>
<div class="jinbox" v-for="(item, i) in echarlist3" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -387,7 +392,7 @@ import * as echarts from "echarts";
import { mapGetters } from "vuex";
import { exportMethodPost } from "@/util/util";
export default {
name:"consultantBrand",
name: "consultantBrand",
data() {
return {
houseId: "",
@@ -459,6 +464,9 @@ export default {
statDateEnd: this.statDateEnd,
deptId: this.deptId,
dateType: this.dateType == 7 ? null : this.dateType,
type: 1,
current: 1,
size: 1,
};
// exportMethodPost()
exportMethodPost(
@@ -597,7 +605,7 @@ export default {
this["num" + type] = res.data.num || 0;
this["avg" + type] = res.data.avg || 0;
let arr = [];
let max = 0
let max = 0;
let newarr = res.data.list || [];
if (newarr.length != 0) {
res.data.list.map((item) => {
@@ -610,7 +618,7 @@ export default {
obj.name = item.accountName;
obj.zxl = Math.floor(item.sumDuration / 60);
if (max < obj.zxl) {
max = obj.zxl
max = obj.zxl;
}
arr.push(obj);
} else if (type == 3) {
@@ -625,10 +633,10 @@ export default {
});
}

if(type == 2) {
if (type == 2) {
arr.forEach((item) => {
item.percentage = (item.zxl/max)*100
})
item.percentage = (item.zxl / max) * 100;
});
}

if (type == 3) {
@@ -636,7 +644,10 @@ export default {
}

if (type == 4) {
console.log(arr, 'arr4,ajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjaksl')
console.log(
arr,
"arr4,ajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjakslajdklsajkldjaskldjaksl"
);
arr = this.dealData(arr);
}
return arr;
@@ -899,7 +910,7 @@ export default {

.app-box-san {
width: 100%;
height: 400px;
min-height: 400px;
display: flex;
margin-top: 15px;
.zuo {


+ 8
- 6
src/views/Statistics/ReceptionOverview.vue 파일 보기

@@ -273,8 +273,7 @@
<div
v-if="ceratelist.list.length != 0"
style="
overflow-y: auto;
height: 320px;
height: 360px;
width: 94%;
margin: 0 auto;
margin-top: 15px;
@@ -290,7 +289,7 @@
></div>
</div>
<div class="jinboxbott">
{{ item.zxl }}{{ activeName | company }}
{{ item.zxl || 0 }}{{ activeName | company }}
</div>
</div>
</div>
@@ -336,8 +335,7 @@
<div
v-if="systemList.list.length != 0"
style="
overflow-y: auto;
height: 320px;
height: 360px;
width: 94%;
margin: 0 auto;
margin-top: 15px;
@@ -1336,7 +1334,7 @@ export default {
str = "次";
break;
case 1:
str = "分钟";
str = "";
break;
case 2:
str = "次";
@@ -1619,4 +1617,8 @@ export default {
.el-icon-caret-top {
color: #FF0000;
}

.nulllist {
height: 396px;
}
</style>

+ 178
- 149
src/views/Statistics/ReceptionStatistical.vue 파일 보기

@@ -1,98 +1,108 @@
<template>
<div class="box-center">
<div class="app-top">

<div class="app-titel" v-if="role!=3" style="margin-bottom:10px;">
<div class="app-titel" v-if="role != 3" style="margin-bottom: 10px">
<div class="titel-text">项目选择:</div>
<div style="margin-left: 26px">
<el-select v-model="houseId" placeholder="请选择" filterable @change="houseChange">
<el-select
v-model="houseId"
placeholder="请选择"
filterable
@change="houseChange"
>
<el-option
v-for="item in houseList"
:key="item.id"
:label="item.propertyName"
:value="item.id">
:value="item.id"
>
</el-option>
</el-select>
</div>
</div>
<div class="app-titel">
<div style="text-indent: 30px;">接待时间:</div>
<div class="toptimeqhuan">
<div :class="{ tophove: dateType == 4 }" @click="tabtimetap(4)">
近7天
<div class="app-titel">
<div style="text-indent: 30px">接待时间:</div>
<div class="toptimeqhuan">
<div :class="{ tophove: dateType == 4 }" @click="tabtimetap(4)">
近7天
</div>
<div :class="{ tophove: dateType == 5 }" @click="tabtimetap(5)">
近15天
</div>
<div :class="{ tophove: dateType == 6 }" @click="tabtimetap(6)">
近30天
</div>
</div>
<div :class="{ tophove: dateType == 5 }" @click="tabtimetap(5)">
近15天
</div>
<div :class="{ tophove: dateType == 6 }" @click="tabtimetap(6)">
近30天
<div style="margin-left: 26px">
<el-date-picker
v-model="customtime"
@change="confirmtime()"
type="daterange"
range-separator="-"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</div>
</div>
<div style="margin-left: 26px">
<el-date-picker
v-model="customtime"
@change="confirmtime()"
type="daterange"
range-separator="-"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</div>
</div>
<div class="app-titel" style="margin-top: 15px">
<div class="div-lab">
<div style="margin-right: 20px" class="label">团队:</div>
<el-select
v-model="deptId"
filterable
@change="deptChange"
placeholder="请选择"
class="div-inp"
>
<el-option
v-for="item in options"
:key="item.deptId"
:label="item.name"
:value="item.deptId"
<div class="app-titel" style="margin-top: 15px">
<div class="div-lab">
<div style="margin-right: 20px" class="label">团队:</div>
<el-select
v-model="deptId"
filterable
@change="deptChange"
placeholder="请选择"
class="div-inp"
>
</el-option>
</el-select>
</div>
<div style="margin-left: 26px" class="div-lab">
<div style="margin-right: 20px" class="label">置业顾问:</div>
<el-select
v-model="accountId"
filterable
@change="repChange"
placeholder="请选择"
class="div-inp"
>
<el-option
v-for="item in repList"
:key="item.accountId"
:label="item.name"
:value="item.accountId"
<el-option
v-for="item in options"
:key="item.deptId"
:label="item.name"
:value="item.deptId"
>
</el-option>
</el-select>
</div>
<div style="margin-left: 26px" class="div-lab">
<div style="margin-right: 20px" class="label">置业顾问:</div>
<el-select
v-model="accountId"
filterable
@change="repChange"
placeholder="请选择"
class="div-inp"
>
</el-option>
</el-select>
</div>
<div style="margin-left: 20px">
<el-button type="primary" size="small" @click="screen()"
>查询</el-button
<el-option
v-for="item in repList"
:key="item.accountId"
:label="item.name"
:value="item.accountId"
>
</el-option>
</el-select>
</div>
<div style="margin-left: 20px">
<el-button type="primary" size="small" @click="screen()"
>查询</el-button
>
<el-button type="primary" size="small" @click="reset()"
>清空</el-button
>
</div>
<div
style="margin-left: auto; margin-right: 10px"
v-if="sta_rec_downLoad"
>
<el-button type="primary" size="small" @click="reset()">清空</el-button>
</div>
<div style="margin-left: auto;margin-right:10px;" v-if="sta_rec_downLoad">
<el-button @click="downLoad">导出</el-button>
</div>
</div>
</div>
</div>
<!-- 表格 -->
<div class="cen-tab">
<el-table :data="tableData" style="width: 100%">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="batchId" label="序号" align="center">
<template slot-scope="scope">
{{
@@ -102,7 +112,12 @@
}}
</template>
</el-table-column>
<el-table-column width='90px' prop="accountName" label="日期" align="center">
<el-table-column
width="90px"
prop="accountName"
label="日期"
align="center"
>
<template slot-scope="scope">
{{
scope.$index == tableData.length - 1
@@ -111,18 +126,30 @@
}}
</template>
</el-table-column>
<el-table-column prop="receptionCount" label="接待量" align="center" sortable>
<template slot-scope="{row}">
{{row.receptionCount}}次
</template>
<el-table-column
prop="receptionCount"
label="接待量"
align="center"
sortable
>
<template slot-scope="{ row }"> {{ row.receptionCount }}次 </template>
</el-table-column>
<el-table-column prop="accountNum" label="接待顾问" align="center" sortable width="100">

<el-table-column
prop="accountNum"
label="接待顾问"
align="center"
sortable
width="100"
>
</el-table-column>
<el-table-column prop="activeCustomer" label="有效接待" align="center" sortable width="100">
<template slot-scope="{row}">
{{row.activeCustomer}}次
</template>
<el-table-column
prop="activeCustomer"
label="有效接待"
align="center"
sortable
width="100"
>
<template slot-scope="{ row }"> {{ row.activeCustomer }}次 </template>
</el-table-column>
<el-table-column
prop="prohibitedCustomer"
@@ -132,7 +159,13 @@
width="120"
>
</el-table-column>
<el-table-column prop="sumDuration" label="接待时长(分)" align="center" sortable width="120">
<el-table-column
prop="sumDuration"
label="接待时长(分)"
align="center"
sortable
width="120"
>
<template slot-scope="{ row }">
{{ Math.floor(row.sumDuration / 60) }}分钟
</template>
@@ -144,14 +177,16 @@
width="150"
sortable
>
<template slot-scope="{row}">
{{row.prohibitedZb}}%
</template>
<template slot-scope="{ row }"> {{ row.prohibitedZb }}% </template>
</el-table-column>
<el-table-column prop="fraction" label="平均执行率" align="center" sortable width="110">
<template slot-scope="{row}">
{{row.fraction}}%
</template>
<el-table-column
prop="fraction"
label="平均执行率"
align="center"
sortable
width="110"
>
<template slot-scope="{ row }"> {{ row.fraction }}% </template>
</el-table-column>
<el-table-column
v-for="(item, idx) in tablist"
@@ -162,9 +197,7 @@
sortable
width="100"
>
<template slot-scope="{row}">
{{row[item.props]}}%
</template>
<template slot-scope="{ row }"> {{ row[item.props] }}% </template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
@@ -192,12 +225,7 @@
</div>
</div>

<el-dialog
title="详情"
:visible.sync="dialogVisible"
width="80%"

>
<el-dialog title="详情" :visible.sync="dialogVisible" width="80%">
<div class="cen-tab">
<el-table
max-height="300"
@@ -271,14 +299,13 @@
</el-pagination>
</div>
</div>

</el-dialog>
</div>
</template>

<script>
import { mapGetters } from "vuex";
import { exportMethodPost} from "@/util/util";
import { exportMethodPost } from "@/util/util";
export default {
data() {
return {
@@ -315,52 +342,54 @@ export default {
teamAllLeve2: [],
statDate: "",
dialogVisible: false,
houseList:[],
role:''
houseList: [],
role: "",
};
},
computed: {
...mapGetters(["permissions"]),
},
created() {

this.sta_rec_downLoad = this.permissions["sta_rec_downLoad"];
},
mounted() {
this.role=localStorage.getItem("orgType");
if(this.role==3){
this.role = localStorage.getItem("orgType");
if (this.role == 3) {
this.houseId = localStorage.getItem("houseId");
this.tabtimetap(4);
this.deptFindList();
}else{
this.zkhousePage()
} else {
this.zkhousePage();
}
},
methods: {
downLoad(){
downLoad() {
let obj = {
houseId: this.houseId,
statDateStart: this.statDateStart,
statDateEnd: this.statDateEnd,
// current: this.current,
// size: this.size,
deptId: this.deptId,
accountId: this.accountId,
dateType: this.dateType == 7 ? null : this.dateType,
type:1
houseId: this.houseId,
statDateStart: this.statDateStart,
statDateEnd: this.statDateEnd,
type: 1,
current: 1,
size: 1,
deptId: this.deptId,
accountId: this.accountId,
dateType: this.dateType == 7 ? null : this.dateType,
};
exportMethodPost('autoSR/cusStageStatistics/receptionStatisticsExport','接待统计',obj)
exportMethodPost(
"autoSR/cusStageStatistics/receptionStatisticsExport",
"接待统计",
obj
);
},
houseChange(){
this.customtime=[];
this.TimetoAhoose=4;
this.statDateStart= '';
this.deptId=''
this.accountId=''
this.statDateEnd= '';
this.tabtimetap(4);
houseChange() {
this.customtime = [];
this.TimetoAhoose = 4;
this.statDateStart = "";
this.deptId = "";
this.accountId = "";
this.statDateEnd = "";
this.tabtimetap(4);
this.deptFindList();

},
zkhousePage() {
this.$api.api
@@ -370,8 +399,8 @@ export default {
.then((res) => {
this.houseList = res.data;
this.houseId = res.data[0].id;
this.tabtimetap(4);
this.deptFindList();
this.tabtimetap(4);
this.deptFindList();
});
},
toDetail(row) {
@@ -390,7 +419,7 @@ export default {
size: this.size,
deptId: this.deptId,
accountId: this.accountId,
type:2
type: 2,
})
.then((res) => {
this.detailData = res.data.records;
@@ -419,27 +448,27 @@ export default {
},
deptFindList() {
// 获取团队
this.$api.http.overviewfindList({
this.$api.http
.overviewfindList({
houseId: this.houseId,
})
.then((res) => {
let userinfo=JSON.parse(sessionStorage.getItem("zk-userInfo"))
if(userinfo.content.deptType==1){
this.options.push(...res.data);
this.deptId= this.options[0].deptId
}else{
this.options = [
let userinfo = JSON.parse(sessionStorage.getItem("zk-userInfo"));
if (userinfo.content.deptType == 1) {
this.options.push(...res.data);
this.deptId = this.options[0].deptId;
} else {
this.options = [
{
name: "全部",
deptId: "",
},
];
this.options.push(...res.data);
this.deptId=''
this.deptId = "";
}
this.receptionStatisticsAllAccount();
this.accountRank();

});
},
deptChange() {
@@ -474,7 +503,7 @@ export default {
deptId: this.deptId,
accountId: this.accountId,
dateType: this.dateType == 7 ? null : this.dateType,
type:1
type: 1,
})
.then((res) => {
this.tableData = res.data.records;
@@ -547,7 +576,7 @@ export default {
this.statDateStart = "";
this.statDateEnd = "";
this.dateType = index;
this.customtime=[];
this.customtime = [];
this.init();
},
dealData(arr) {
@@ -604,13 +633,13 @@ export default {
// min-width: 100px;
text-align: right;
}
.titel-text {
height: 100%;
font-size: 16px;
font-weight: 600;
color: #32363d;
text-indent: 30px;
}
.titel-text {
height: 100%;
font-size: 16px;
font-weight: 600;
color: #32363d;
text-indent: 30px;
}
.toptimeqhuan {
height: 30px;
background: #ffffff;


+ 20
- 16
src/views/Statistics/TheTeamCompared.vue 파일 보기

@@ -117,7 +117,7 @@
</div>
<div
v-if="teamobj1.list.length != 0"
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in teamobj1.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -132,7 +132,6 @@
</div>
<div
class="nulllist"
style="height: 300px"
v-if="teamobj1.list.length == 0"
>
<div class="imgboxc">
@@ -159,7 +158,7 @@
</div>
<div
v-if="teamobj2.list.length != 0"
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in teamobj2.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -174,7 +173,6 @@
</div>
<div
class="nulllist"
style="height: 300px"
v-if="teamobj2.list.length == 0"
>
<div class="imgboxc">
@@ -218,7 +216,7 @@
</div>
<div
v-if="teamobj3.list.length != 0"
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in teamobj3.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -233,7 +231,6 @@
</div>
<div
class="nulllist"
style="height: 300px"
v-if="teamobj3.list.length == 0"
>
<div class="imgboxc">
@@ -249,9 +246,9 @@
<div
id="main"
v-if="isshowcd2 == true"
style="height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
></div>
<div class="nulllist" style="height: 300px" v-if="isshowcd2 == false">
<div class="nulllist" v-if="isshowcd2 == false">
<div class="imgboxc">
<img class="imgboxc-img" src="/img/nullnull.png" alt="" />
<div class="nulltext">暂无数据</div>
@@ -293,7 +290,7 @@
</div>
<div
v-if="teamobj5.list.length != 0"
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in teamobj5.list" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -308,7 +305,6 @@
</div>
<div
class="nulllist"
style="height: 300px"
v-if="teamobj5.list.length == 0"
>
<div class="imgboxc">
@@ -324,9 +320,9 @@
<div
v-if="isshowcd == true"
id="main2"
style="height: 350px; width: 94%; margin: 0 auto"
style="width: 94%; margin: 0 auto"
></div>
<div class="nulllist" style="height: 300px" v-if="isshowcd == false">
<div class="nulllist" v-if="isshowcd == false">
<div class="imgboxc">
<img class="imgboxc-img" src="/img/nullnull.png" alt="" />
<div class="nulltext">暂无数据</div>
@@ -926,7 +922,6 @@ tbody {
display: block;
// width: 100%;
// overflow-x: auto;
// overflow-y: auto;
height: 220px;
}
tbody tr {
@@ -993,12 +988,11 @@ tbody tr {

.app-box-san {
width: 100%;
height: 400px;
min-height: 400px;
display: flex;
margin-top: 15px;
.zuo {
flex: 1;
height: 100%;
margin-right: 15px;
background: #ffffff;
border-radius: 4px;
@@ -1025,7 +1019,6 @@ tbody tr {
}
}
.you {
height: 100%;
flex: 1;
background: #ffffff;
border-radius: 4px;
@@ -1050,6 +1043,13 @@ tbody tr {
align-items: center;
}
}

#main {
height: calc(400px - 55px);
}
#main2 {
height: calc(400px - 55px);
}
}
}

@@ -1114,4 +1114,8 @@ tbody tr {
font-size: 16px;
color: #32363d;
}

.nulllist {
flex: 1;
}
</style>

+ 2
- 2
src/views/Statistics/TrendAnalysis.vue 파일 보기

@@ -786,13 +786,13 @@ export default {
};

if (this.timeType == -1) {
pamaet.timeType = null;
pamaet.timeType = -1;
} else {
pamaet.timeType = this.timeType;
}
if (this.checked == true) {
pamaet.showStatus = 1;
pamaet.timeType = null;
pamaet.timeType = -1;
} else {
pamaet.showStatus = 0;
}


+ 4
- 6
src/views/Statistics/index.vue 파일 보기

@@ -478,13 +478,11 @@ export default {

.box-forhtml {
width: 100%;
height: 400px;
min-height: 400px;
background: #ffffff;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.04);
border-radius: 4px;
padding-top: 20px;
padding-left: 30px;
padding-right: 30px;
padding: 20px 30px;
margin-top: 20px;
}
.box-forhtml-flex {
@@ -494,11 +492,11 @@ export default {
}
.box-forhtml-flex .left {
width: 50%;
height: 320px;
min-height: 320px;
}
.box-forhtml-flex .right {
width: 50%;
height: 330px;
min-height: 330px;
display: flex;
justify-content: center;
}


+ 5
- 5
src/views/houseData/analyse.vue 파일 보기

@@ -115,7 +115,7 @@
<div class="title">
<div class="text1">目标分析</div>
</div>
<div style="height: 350px; width: 94%; margin: 0 auto">
<div style="min-height: 350px;padding: 0 0 20px 0;width: 94%; margin: 0 auto">
<div id="data1" style="min-height: 350px"></div>
</div>
</div>
@@ -144,7 +144,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="min-height: 350px;padding: 0 0 20px 0; width: 94%; margin: 0 auto;"
>
<div class="jinbox" v-for="(item, i) in objList" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -164,7 +164,7 @@
<div class="title">
<div class="text1">对比上月分析</div>
</div>
<div style="height: 350px; width: 94%; margin: 0 auto">
<div style="min-height: 350px;padding: 0 0 20px 0;width: 94%; margin: 0 auto">
<div id="data2" style="min-height: 350px"></div>
</div>
</div>
@@ -200,7 +200,7 @@
</div>
</div>
<div
style="overflow-y: auto; height: 350px; width: 94%; margin: 0 auto"
style="min-height: 350px;padding: 0 0 20px 0;width: 94%; margin: 0 auto"
>
<div class="jinbox" v-for="(item, i) in objList1" :key="i">
<div class="jinboxtit">{{ item.name }}</div>
@@ -312,7 +312,7 @@

<el-dialog title="趋势图" :visible.sync="dialogVisible">
<div class="houseSize">项目: {{houseName||''}} 运营:{{operationStaffName||'暂无'}}</div>
<div style="height: 350px; width: 94%; margin: 0 auto">
<div style="min-height: 350px;padding: 0 0 20px 0;width: 94%; margin: 0 auto">
<div id="line" style="min-height: 350px"></div>
</div>
<!-- <div slot="footer" class="dialog-footer">


+ 393
- 5
src/views/inspection/ProhibitedList.vue 파일 보기

@@ -1,16 +1,404 @@
<template>
<div>
违禁记录
</div>
<div class="box-center">
<!-- 头 -->
<div class="app-top">
<div class="app-titel" v-if="orgType != 3">
<div
class="label"
style="color: #32363d; font-weight: 400; font-size: 16px"
>
项目选择:
</div>
<div style="margin-left: 8px">
<el-select
v-model="searchForm.projectId"
@change="houseChange"
placeholder="请选择"
filterable
>
<el-option
v-for="item in houseList"
:key="item.id"
:label="item.propertyName"
:value="item.id"
>
</el-option>
</el-select>
</div>
</div>

<!-- 选择时间 -->
<div class="app-titel" style="margin-top: 1em">
<div class="label">接待时间:</div>
<div class="toptimeqhuan">
<div
v-for="(data, index) in timeToAhouseList"
:key="index"
:class="{ tophove: TimetoAhoose == data.id }"
@click="tabtimetap(data.id)"
>
{{ data.title }}
</div>
</div>
<div style="margin-left: 26px">
<el-date-picker
@change="confirmtime"
v-model="customtime"
type="daterange"
range-separator="-"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd"
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker>
</div>
</div>

<!-- 违禁标识 -->
<div class="app-titel" style="margin-top: 1em">
<div class="div-lab">
<div class="label">违禁标识:</div>
<el-select
clearable
filterable
v-model="searchForm.tag"
placeholder="请选择"
class="div-inp"
>
<el-option
v-for="item in prohibitedSignsList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>

<div class="div-lab">
<div class="label">处理状态:</div>
<el-select
clearable
filterable
v-model="searchForm.status"
placeholder="请选择"
class="div-inp"
>
<el-option
v-for="item in processingStatusList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>

<div class="div-lab">
<div class="label">置业顾问:</div>
<div>
<el-input
maxlength="10"
clearable
v-model="searchForm.name"
></el-input>
</div>
</div>
</div>

<!-- 筛选 -->
<div class="app-titel" style="margin-top: 1em; padding-left: 100px">
<el-button type="primary">筛选</el-button>
<el-link style="margin-left: 1em" :underline="false" type="primary"
>清空筛选条件</el-link
>
</div>
</div>

<!-- 表格 -->
<div class="cen-tab">
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column prop="batchId" label="序号" width="70" align="center">
<template slot-scope="scope">
<span> {{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="houseName" label="接待编号" align="center">
</el-table-column>
<el-table-column
prop="accountNum"
label="接待开始时间"
align="center"
>
</el-table-column>
<el-table-column
prop="receptionCount"
label="顾问"
align="center"
>
</el-table-column>
<el-table-column
prop="activeCustomer"
label="客户"
align="center">
</el-table-column>
<el-table-column
prop="prohibitedCustomer"
label="违禁命中"
align="center"
width="140"
>
</el-table-column>
<el-table-column
prop="sumDuration"
label="处理状态"
align="center"
width="100"
>
<template slot-scope="scope">
{{ scope.row.sumDuration }}
</template>
</el-table-column>
<el-table-column
prop="fraction"
label="处理人"
align="center"
width="110"
>
</el-table-column>
<el-table-column
prop="prohibitedZb"
label="违禁标识"
align="center"
width="100"
>
</el-table-column>
<el-table-column
prop="addtodigestCount"
label="无效原因"
align="center"
width="140"
></el-table-column>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="{ row }">
<el-button type="text">查看</el-button>
<el-button type="text">无效</el-button>
<el-button type="text">有效</el-button>
</template>
</el-table-column>
</el-table>
<div style="display: flex; justify-content: flex-end; margin-top: 10px">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[10, 30, 50]"
:page-size="pagesize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</div>
</div>
</div>
</template>

<script>
export default {
data() {
return {
houseList: [], // 可切换的项目列表
orgType: localStorage.getItem("orgType"), // 组织类型
prohibitedSignsList: [
// 违禁标识
{
label: "全部",
value: 0,
},
{
label: "有效违禁",
value: 1,
},
{
label: "无效违禁",
value: 2,
},
],
processingStatusList: [
// 违禁处理状态
{
label: "全部",
value: "",
},
{
label: "待处理",
value: "1",
},
{
label: "已处理",
value: "2",
},
],

}
searchForm: {
projectId: "",
tag: "", // 选中违禁标识id (暂时使用)
status: "", // 处理状态筛选id (暂时使用)
name: "", // 置业顾问名称 (暂时使用)
},

timeToAhouseList: [
// 筛选时间数组
{
title: "近7天",
id: 4,
},
{
title: "近15天",
id: 5,
},
{
title: "近30天",
id: 6,
},
],

TimetoAhoose: 4, // 选中时间的下表

customtime: [], // 自定义时间选择数据

tableData: [], // 表格数据
};
},

created() {
this.zkhousePage();

if (this.$route.query.date) {
this.time = this.$route.query.date.split(",");
this.searchForm.staDate = this.time[0];
this.searchForm.endDate = this.time[1];
console.log("时间");
}
},

methods: {
// 重置入参
resetParams() {
// this.searchForm
},

// 获取可以选择的项目
zkhousePage() {
this.$api.api
.findHouseByUser({
orgType: this.orgType,
})
.then((res) => {
// console.log(res)
this.houseList = res.data;
if (this.orgType == 3) {
this.searchForm.projectId = localStorage.getItem("houseId");
} else {
this.searchForm.projectId = res.data[0].id;
}
this.houseChange();
});
},

// 项目选择改变的时候
houseChange() {},

// 固定类型时间选择
tabtimetap(index) {},

// 自定义时间选择
confirmtime() {},
},
};
</script>

<style lang="" scoped >
<style lang="scss" scoped>
.box-center {
width: 100%;
padding: 15px;
min-width: 1000px;
padding-bottom: 100px;

.app-top {
width: 100%;
background: #ffffff;
box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.04);
border-radius: 4px;
padding-top: 15px;
padding-bottom: 15px;

.app-titel {
width: 100%;
display: flex;
align-items: center;
flex-wrap: wrap;

.label {
font-size: 14px;
font-weight: 400;
color: #32363d;
line-height: 32px;
margin-left: 15px;
min-width: 100px;
text-align: right;
}

.toptimeqhuan {
height: 30px;
background: #ffffff;
display: flex;
align-items: center;

div {
padding-left: 20px;
padding-right: 20px;
text-align: center;
line-height: 30px;
font-size: 14px;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
.btn {
padding-left: 20px;
padding-right: 20px;
text-align: center;
font-size: 14px;
margin-right: 15px;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
}

.div-lab {
display: flex;
margin: 5px;
}
}
}

.cen-tab {
width: 100%;
padding: 15px;
background: #ffffff;
margin-top: 15px;
}

.tophove {
color: #ffffff;
background: #409eff;
border-color: #409eff;
}

.div-inp {
width: 250px;
}
}
</style>

+ 3
- 2
vue.config.js 파일 보기

@@ -10,8 +10,9 @@
// const url = 'http://62.234.122.43:9999' //正式
// const url = 'http://81.70.55.170:9999' // 新测试服务器IP
// const url = 'http://192.168.31.89:9999' //sh
// const url = 'https://zanyong.hfju.com' // 正式域名
const url = 'http://81.70.55.170:9999' // 新测试
const url = 'https://zanyong.hfju.com' // 正式域名
// const url = 'http://81.70.55.170:9999' // 新测试
// const url = 'http://82.156.35.22:9999' // 新正式ip
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const productionGzipExtensions = ['js', 'css']
module.exports = {


불러오는 중...
취소
저장