index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. <template>
  2. <div>
  3. <basicLayout
  4. ref="list"
  5. formPath="salerPrivatecustomer"
  6. tableName="salerPrivatecustomerTable"
  7. idName="sa_customersid"
  8. :apiId="{query:20221012164402,del:''}"
  9. :autoQuery="false"
  10. :isExport="false"
  11. :specialKey="[{key:'leader',value:'name'},{key:'tag_sys',value:null},{key:'industry',value:null}]"
  12. :detailPath="{path:'/customerDetail',param:{tabIndex:tabIndex,portrait:''}}"
  13. >
  14. <template #titleRight>
  15. <el-button type="primary" size="small" @click="onExport" plain>导 出</el-button>
  16. </template>
  17. <template #custom>
  18. <div class="mt-10">
  19. <label class="search__label">范围:</label>
  20. <el-select class="inline-16" v-model="value" size="small" placeholder="请选择数据分类" @change="selectChange" >
  21. <!-- <el-option
  22. v-for="item in editableTabs"
  23. :key="item.index"
  24. :label="item.title"
  25. :value="item.name">
  26. </el-option> -->
  27. <el-option
  28. v-for="item in editableTabs"
  29. :key="item.index"
  30. :label="item.templetname"
  31. :value="item.templetid"
  32. ></el-option>
  33. </el-select>
  34. </div>
  35. <div class="mt-10">
  36. <label class="search__label">客户类型:</label>
  37. <el-select class="inline-16" v-model="selectParam.type" size="small" placeholder="请选择" @change="selectChange" clearable>
  38. <el-option
  39. v-for="item in option.typeData"
  40. :key="item.value"
  41. :label="item.value"
  42. :value="item.value">
  43. </el-option>
  44. </el-select>
  45. </div>
  46. <div class="mt-10">
  47. <label class="search__label">客户分类:</label>
  48. <el-select class="inline-16" v-model="selectParam.customergrade" size="small" placeholder="请选择" @change="selectChange" clearable>
  49. <el-option
  50. v-for="item in option.customerClassification"
  51. :key="item.value"
  52. :label="item.value"
  53. :value="item.value">
  54. </el-option>
  55. </el-select>
  56. </div>
  57. <div class="mt-10">
  58. <label class="search__label">客户等级:</label>
  59. <el-select class="inline-16" v-model="selectParam.grade" size="small" placeholder="请选择" @change="selectChange" clearable>
  60. <el-option
  61. v-for="item in option.customerGrade"
  62. :key="item.value"
  63. :label="item.value"
  64. :value="item.value">
  65. </el-option>
  66. </el-select>
  67. </div>
  68. <div class="mt-10">
  69. <label class="search__label">所属行业:</label>
  70. <el-select class="inline-16" v-model="selectParam.industry" size="small" placeholder="请选择" @change="selectChange" clearable>
  71. <el-option
  72. v-for="item in option.industryData"
  73. :key="item.value"
  74. :label="item.value"
  75. :value="item.value">
  76. </el-option>
  77. </el-select>
  78. </div>
  79. <div class="mt-10">
  80. <label class="search__label">合作状态:</label>
  81. <el-select class="inline-16" v-model="selectParam.status" size="small" placeholder="请选择" @change="selectChange" clearable>
  82. <el-option
  83. v-for="item in option.status"
  84. :key="item.value"
  85. :label="item.value"
  86. :value="item.value">
  87. </el-option>
  88. </el-select>
  89. </div>
  90. <div class="mt-10">
  91. <label class="search__label">成交状态:</label>
  92. <el-select class="inline-16" v-model="selectParam.tradingstatus" size="small" placeholder="请选择" @change="selectChange" clearable>
  93. <el-option
  94. v-for="item in option.tradingstatus"
  95. :key="item.value"
  96. :label="item.value"
  97. :value="item.value">
  98. </el-option>
  99. </el-select>
  100. </div>
  101. <div class="mt-10">
  102. <label class="search__label">标签:</label>
  103. <el-select class="inline-16" v-model="selectParam.tag" size="small" placeholder="请选择" @change="selectChange" clearable>
  104. <el-option
  105. v-for="item in option.tagData"
  106. :key="item.tag"
  107. :label="item.tag"
  108. :value="item.tag">
  109. </el-option>
  110. </el-select>
  111. </div>
  112. <div class="mt-10">
  113. <label class="search__label">部门:</label>
  114. <el-cascader class="inline-16" ref="selectdep" size="small" v-model="depment" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}" @change="selectDep" clearable></el-cascader>
  115. </div>
  116. <div class="mt-10">
  117. <label class="search__label" >创建时间:</label>
  118. <el-date-picker
  119. style="margin-right: 24px !important;"
  120. size="small"
  121. @change="selectChange"
  122. value-format="yyyy-MM-dd"
  123. v-model="dateSelect"
  124. type="daterange"
  125. range-separator="至"
  126. start-placeholder="开始日期"
  127. end-placeholder="结束日期"
  128. clearable>
  129. </el-date-picker>
  130. </div>
  131. </template>
  132. <template v-slot:tbList="scope">
  133. <div v-if="scope.data.column.columnname === 'isleader'">
  134. <span v-if="scope.data.column.data['leader'].length !== 0">已分配</span>
  135. <span v-else>未分配</span>
  136. </div>
  137. <div v-else-if="scope.data.column.columnname === 'tag'">
  138. <div v-for="item in scope.data.column.data.tag_sys" :key="item.index" style="float: left;margin-left: 5px;margin-bottom: 5px">
  139. <el-tag color="#3874F6" size="mini" type="primary" effect="dark">
  140. <span>{{item}}</span>
  141. </el-tag>
  142. </div>
  143. <div v-for="item in scope.data.column.data.tag" :key="item.index" style="float: left;margin-left: 5px;margin-bottom: 5px">
  144. <el-tag color="#FA8C16" size="mini" type="warning" effect="dark">
  145. <span>{{item}}</span>
  146. </el-tag>
  147. </div>
  148. </div>
  149. <div v-else-if="scope.data.column.columnname === 'industry'">
  150. <span v-if="JSON.stringify(scope.data.column.data.industry) !== '[]' && scope.data.column.data.industry">
  151. <div v-for="item in scope.data.column.data.industry" :key="item.index" style="float: left;margin-left: 5px;margin-bottom: 5px">
  152. <el-tag size="mini" effect="dark">
  153. <span>{{item}}</span>
  154. </el-tag>
  155. </div>
  156. </span>
  157. <div v-else>
  158. {{'--'}}
  159. </div>
  160. </div>
  161. <div v-else-if="scope.data.column.columnname === 'tradingstatus'">
  162. <span style="color:#3874f6" v-if="scope.data.column.data[[scope.data.column.columnname]] == '未成交'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  163. <span style="color:#fa8c16" v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '已成交'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  164. <span style="color:#333333" v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '多次成交'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  165. </div>
  166. <div v-else-if="scope.data.column.columnname === 'status'">
  167. <span style="color:#3874f6" v-if="scope.data.column.data[[scope.data.column.columnname]] == '潜在'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  168. <span style="color:#52c41a" v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '合作中'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  169. <span style="color:#999999" v-else-if="scope.data.column.data[[scope.data.column.columnname]] == '已终止'">{{scope.data.column.data[[scope.data.column.columnname]]}}</span>
  170. </div>
  171. <div v-else-if="scope.data.column.columnname === 'leader'">
  172. <span>{{scope.data.column.data['leader'][0]?scope.data.column.data['leader'][0].name:'--'}}</span>
  173. </div>
  174. <div v-else-if="scope.data.column.columnname === 'depname'">
  175. <span>{{scope.data.column.data['leader'][0]?scope.data.column.data['leader'][0].depname?scope.data.column.data['leader'][0].depname:'--':'--'}}</span>
  176. </div>
  177. <div v-else>
  178. {{scope.data.column.data[[scope.data.column.columnname]]?scope.data.column.data[[scope.data.column.columnname]]:'--'}}
  179. </div>
  180. </template>
  181. </basicLayout>
  182. </div>
  183. </template>
  184. <script>
  185. export default {
  186. name: "index",
  187. data() {
  188. return {
  189. value:'',
  190. sys_enterpriseid:'',
  191. editableTabsValue: "我负责的",
  192. editableTabs: [
  193. ],
  194. tabIndex:"1",
  195. options:[],
  196. listData:[],
  197. option:{
  198. typeData:[],
  199. customerClassification:[],
  200. customerGrade:[],
  201. industryData:[],
  202. tagData:[],
  203. status:[
  204. {
  205. value:'潜在'
  206. },
  207. {
  208. value:'合作中'
  209. },
  210. {
  211. value:'已终止'
  212. }
  213. ],
  214. tradingstatus:[
  215. {
  216. value:'未成交'
  217. },
  218. {
  219. value:'已成交'
  220. },
  221. {
  222. value:'多次成交'
  223. }
  224. ]
  225. },
  226. selectParam: {
  227. status:'',
  228. type:'',
  229. grade:'',
  230. customergrade:'',
  231. industry:'',
  232. startdate:'',
  233. enddate:'',
  234. tradingstatus:'',
  235. tag:'',
  236. departmentid:''
  237. },
  238. depmentParam:{
  239. "id": 20230620102004,
  240. "content": {
  241. }
  242. },
  243. depment:'',
  244. deplist:[],
  245. dateSelect:''
  246. }
  247. },
  248. mounted() {
  249. this.typeList()
  250. this.gradeList()
  251. this.queryCustomerGrade()
  252. this.industryList()
  253. this.tagList()
  254. },
  255. methods:{
  256. list (param) {
  257. param.content.isend = 0
  258. param.content.type = this.value
  259. param.content.isExport = 0
  260. },
  261. queryData(id){
  262. this.$refs['list'].param.content.type = id
  263. this.$refs['list'].param.content.isExport = false
  264. this.$refs.list.param.content.deleted = 0
  265. this.$refs.list.param.content.isend = 0
  266. this.$refs.list.param.content.nocache = true
  267. this.$refs['list'].listData()
  268. // this.$store.dispatch('sendDataToForm',)
  269. },
  270. handleCommand(command){
  271. this.tabIndex = command.name
  272. this.editableTabsValue = command.title
  273. this.selectChange()
  274. /*this.$refs['list'].param.content.type = command.name
  275. this.$refs['list'].param.content.isExport = 0
  276. this.$refs['list'].listData()*/
  277. // this.$store.dispatch('sendDataToForm',)
  278. },
  279. /*客户类型列表*/
  280. async typeList(){
  281. const siteid = JSON.parse(sessionStorage.getItem('active_account')).siteid
  282. const res = await this.$api.requested({
  283. "classname": "sysmanage.develop.optiontype.optiontype",
  284. "method": "optiontypeselect",
  285. "content": {
  286. "pageNumber": 1,
  287. "pageSize": 20,
  288. "typename": "customertypemx",
  289. "parameter": {
  290. "siteid": siteid
  291. }
  292. }
  293. })
  294. this.option.typeData = res.data
  295. console.log("客户类型",res.data)
  296. console.log(this.option.typeData)
  297. },
  298. /*客户分类*/
  299. async gradeList(){
  300. const siteid = JSON.parse(sessionStorage.getItem('active_account')).siteid
  301. const res = await this.$api.requested({
  302. "classname": "sysmanage.develop.optiontype.optiontype",
  303. "method": "optiontypeselect",
  304. "content": {
  305. "pageNumber": 1,
  306. "pageSize": 20,
  307. "typename": "customergrade",
  308. "parameter": {
  309. "siteid": siteid
  310. }
  311. }
  312. })
  313. console.log("客户等级",res.data)
  314. /*for (var i=0;i<res.data.length; i++){
  315. if (res.data[i].remarks !== ''){
  316. this.options.gradeData[i] = res.data[i].value + "——" + res.data[i].remarks
  317. }else{
  318. this.options.gradeData[i] = res.data[i].value
  319. }
  320. }*/
  321. this.option.customerClassification = res.data
  322. console.log("处理后客户等级",this.options.customerClassification)
  323. },
  324. /*客户等级*/
  325. queryCustomerGrade(){
  326. this.$store.dispatch('optiontypeselect','agentgrade').then(res=>{
  327. this.option.customerGrade = res.data
  328. })
  329. },
  330. /*行业列表*/
  331. async industryList(){
  332. const siteid = JSON.parse(sessionStorage.getItem('active_account')).siteid
  333. const res = await this.$api.requested({
  334. "classname": "sysmanage.develop.optiontype.optiontype",
  335. "method": "optiontypeselect",
  336. "content": {
  337. "pageNumber": 1,
  338. "pageSize": 20,
  339. "typename": "industry",
  340. "parameter": {
  341. "siteid": siteid
  342. }
  343. }
  344. })
  345. this.option.industryData = res.data
  346. },
  347. /*标签列表*/
  348. async tagList(){
  349. const res = await this.$api.requested({
  350. "id":20221013104401,
  351. "content":{
  352. "isExport":1,
  353. "pageNumber":1,
  354. "pageSize":100,
  355. "sys_systemtagid":2,
  356. "where":{
  357. "condition":""
  358. }
  359. }
  360. })
  361. this.option.tagData = this.unique(res.data)
  362. },
  363. /*去重*/
  364. unique(arr) {
  365. const res = new Map();
  366. return arr.filter((arr) => !res.has(arr.tag) && res.set(arr.tag, 1));
  367. },
  368. selectChange(){
  369. this.tabIndex = this.value
  370. if (this.dateSelect !== '' && this.dateSelect !== null){
  371. this.selectParam.startdate = this.dateSelect[0]
  372. this.selectParam.enddate = this.dateSelect[1]
  373. }else {
  374. this.selectParam.startdate = ''
  375. this.selectParam.enddate = ''
  376. }
  377. this.$refs.list.param.content.type = this.tabIndex
  378. this.$refs.list.param.content.where = Object.assign({},this.$refs.list.param.content.where,this.selectParam)
  379. this.$refs.list.param.content.phonenumber = 1
  380. this.$refs['list'].listData()
  381. },
  382. async queryUserInfo() {
  383. let res = await this.$api.requested({
  384. "classname": "common.usercenter.usercenter",
  385. "method": "queryUserMsg",
  386. "content": {
  387. }
  388. })
  389. console.log(res.data);
  390. this.userInfo = {
  391. isAuth : res.data.hr.isleader,
  392. userid: res.data.hr.userid
  393. }
  394. console.log(this.userInfo,'user')
  395. window.sessionStorage.setItem('userInfo',JSON.stringify(this.userInfo))
  396. console.log(JSON.parse(window.sessionStorage.getItem('userInfo')));
  397. },
  398. async querytemplet () {
  399. const res = await this.$api.requested({
  400. "classname": "sysmanage.develop.querytemplet.querytemplet",
  401. "method":"query",
  402. "content": {}
  403. })
  404. this.editableTabs = res.data
  405. for (let i=0;i<res.data.length;i++){
  406. if (res.data[i].templetname == '站点全部'){
  407. this.value = res.data[i].templetid
  408. break
  409. }else {
  410. this.value = res.data[0].templetid
  411. }
  412. }
  413. this.queryData(this.value)
  414. },
  415. async onExport(){
  416. const res = await this.$api.requested({
  417. "id": 20221012164402,
  418. "content": {
  419. "type":this.value,
  420. "pageNumber": 1,
  421. "pageSize": 20,
  422. "deleted":0,
  423. "isend":0,
  424. "isAll":1,
  425. "isExport":1,//0:不导出,1:导出
  426. "where": {
  427. "condition": "",
  428. "startdate": "",
  429. "enddate": ""
  430. }
  431. },
  432. })
  433. window.open(res.data,'_self')
  434. },
  435. /*可选部门*/
  436. async departmentrtment() {
  437. const res = await this.$api.requested(this.depmentParam)
  438. this.deplist = this.createMenu(res.data.dep)
  439. },
  440. createMenu (array) {
  441. var that = this
  442. let arr = []
  443. function convertToElementTree(node) {
  444. // 新节点
  445. if (node.subdep.length === 0){
  446. var elNode = {
  447. label: node["depname"],
  448. parentid:node['parentid'],
  449. parentname:node['parentname'],
  450. departmentid:node["departmentid"],
  451. value:node["departmentid"],
  452. remarks:node["remarks"],
  453. isused:node["isused"],
  454. changedate:node['changedate'],
  455. changeby:node['changeby'],
  456. createdate:node['createdate'],
  457. createby:node['createby'],
  458. depno:node['depno'],
  459. disabled:that.pageOnlyRead,
  460. }
  461. }else {
  462. var elNode = {
  463. label: node["depname"],
  464. parentid:node['parentid'],
  465. parentname:node['parentname'],
  466. departmentid:node["departmentid"],
  467. value:node["departmentid"],
  468. remarks:node["remarks"],
  469. isused:node["isused"],
  470. changedate:node['changedate'],
  471. changeby:node['changeby'],
  472. createdate:node['createdate'],
  473. createby:node['createby'],
  474. depno:node['depno'],
  475. disabled:that.pageOnlyRead,
  476. children: []
  477. }
  478. }
  479. if (node.subdep && node.subdep.length > 0) {
  480. // 如果存在子节点
  481. for (var index = 0; index < node.subdep.length; index++) {
  482. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  483. elNode.children.push(convertToElementTree(node.subdep[index]));
  484. }
  485. }
  486. return elNode;
  487. }
  488. array.forEach((element) => {
  489. arr.push(convertToElementTree(element))
  490. });
  491. return arr
  492. },
  493. selectDep(val) {
  494. this.selectParam.departmentid = val[val.length -1]
  495. this.selectChange()
  496. },
  497. },
  498. created() {
  499. this.queryUserInfo()
  500. this.querytemplet()
  501. this.departmentrtment()
  502. },
  503. }
  504. </script>
  505. <style scoped>
  506. .el-dropdown-link {
  507. cursor: pointer;
  508. color: #151515;
  509. font-size: 16px;
  510. }
  511. .el-divider--vertical{
  512. margin: 0 16px;
  513. }
  514. .el-icon-arrow-down {
  515. font-size: 16px;
  516. }
  517. .s_panel {
  518. margin-bottom:10px
  519. }
  520. </style>