소스 검색

客户管理

wucl 2 년 전
부모
커밋
811855f951
6개의 변경된 파일721개의 추가작업 그리고 2개의 파일을 삭제
  1. 26 0
      src/api/modules/customer.js
  2. 11 0
      src/api/modules/districts.js
  3. 5 1
      src/router/urlMap.js
  4. 366 0
      src/views/market/customer/detail.vue
  5. 312 0
      src/views/market/customer/list.vue
  6. 1 1
      src/views/staff/list.vue

+ 26 - 0
src/api/modules/customer.js

@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+import { fileDown } from '../../utils/file'
+import md5 from 'js-md5'
+/*
+* 用户
+*/
+export default {
+  list(params) {
+    return request.get(`customer`, { params: params })
+  },
+  detail(params) {
+    return request.get(`customer/${params}`)
+  },
+  simpleAll() {
+    return request.get(`customer/simpleAll`)
+  },
+  add(params) {
+    return request.post(`customer`, params)
+  },
+  edit(params) {
+    return request.put(`customer`, params)
+  },
+   delete(params) {
+     return request.delete(`customer/${params}`)
+   },
+}

+ 11 - 0
src/api/modules/districts.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+import { fileDown } from '../../utils/file'
+import md5 from 'js-md5'
+/*
+* 用户
+*/
+export default {
+  tree() {
+    return request.get(`districts/tree`)
+  },
+}

+ 5 - 1
src/router/urlMap.js

@@ -34,6 +34,8 @@ import _views_log_detail from '@/views/log/edit'
 import _views_item_plan from '@/views/item/plan'
 import _view_index_logs from '@/views/log/logIndex'
 import _view_index_rate from '@/views/item/itemIndex'
+import _views_market_customer from '@/views/market/customer/list'
+import _views_market_customer_add from '@/views/market/customer/detail'
 
 export default {
   _views_set_menu,
@@ -56,5 +58,7 @@ export default {
   _views_log_detail,
   _views_item_plan,
   _view_index_logs,
-  _view_index_rate
+  _view_index_rate,
+  _views_market_customer,
+  _views_market_customer_add
 }

+ 366 - 0
src/views/market/customer/detail.vue

@@ -0,0 +1,366 @@
+<template>
+  <div class="app-container">
+    <div class="title-container">
+      <breadcrumb id="breadcrumb-container" class="breadcrumb-container"/>
+    </div>
+    <y-detail-page-layout @save="handleCreate" :edit-status="true" v-loading="vLoading" element-loading-text="处理中。。。">
+      <div style="padding-top: 30px;">
+        <el-tabs v-model="activeName">
+          <el-tab-pane label="客户信息" name="first">
+            <el-form ref="postForm" :model="postForm" class="form-container">
+              <div class="createPost-main-container">
+                <div class="postInfo-container">
+                  <div style="margin-bottom: 30px">
+                    <h3 class="title">
+                      <div class="avatar-wrapper icon-title">基</div>
+                      <div class="icon-info">基本信息</div>
+                    </h3>
+                  </div>
+                  <el-row>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="客户名称:"
+                        prop="name"
+                        :rules="{required: true, message: '请输入员工姓名', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.name" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="省市县:"
+                        prop="province"
+                        :rules="{required: true, message: '请选择省份', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-cascader
+                          filterable
+                          v-model="postForm.value"
+                          :options="districtsOptions"
+                          :props="{ expandTrigger: 'hover' }"
+                          @change="handleChange"
+                          style="width: 100%"></el-cascader>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="市:"
+                        prop="city"
+                        :rules="{required: true, message: '请选择市', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-select
+                          v-model="postForm.city"
+                          placeholder=""
+                          clearable
+                          filterable
+                          class="filter-item"
+                          style="width: 100%"
+                        >
+                          <el-option v-for="(item, index) in AllEnum['市级']" :key="index" :label="item" :value="item"/>
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="区/县:"
+                        prop="county"
+                        :rules="{required: true, message: '请选择区/县', trigger: 'blur'}"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-select
+                          v-model="postForm.county"
+                          placeholder=""
+                          clearable
+                          filterable
+                          class="filter-item"
+                          style="width: 100%"
+                        >
+                          <el-option v-for="(item, index) in AllEnum['区/县级']" :key="index" :label="item" :value="item"/>
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="部门:"
+                        prop="department"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.department" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="职位:"
+                        prop="position"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.position" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="科室:"
+                        prop="section"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.section" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item label="联系电话:"
+                                    prop="mobile"
+                                    :rules="[{required: true, message: '请输入联系电话', trigger: 'blur'},]"
+                                    label-width="120px" class="postInfo-container-item">
+                        <el-input v-model="postForm.mobile" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="微信号:"
+                        prop="wechatNo"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.wechatNo" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="QQ号:"
+                        prop="qq"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.qq" class="filter-item"/>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item label="客户等级:" label-width="120px" class="postInfo-container-item">
+                        <el-select
+                          v-model="postForm.level"
+                          placeholder=""
+                          clearable
+                          filterable
+                          class="filter-item"
+                          style="width: 100%"
+                        >
+                          <el-option v-for="(item, index) in AllEnum['客户等级']" :key="index" :label="item" :value="item"/>
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="12" :lg="6" :span="6">
+                      <el-form-item
+                        label="客户地址:"
+                        prop="address"
+                        label-width="120px"
+                        class="postInfo-container-item"
+                      >
+                        <el-input v-model="postForm.address" class="filter-item" style="width: 480px"/>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                </div>
+              </div>
+            </el-form>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </y-detail-page-layout>
+  </div>
+</template>
+<script>
+  import Breadcrumb from '@/components/Breadcrumb'
+  import YDetailPageLayout from '@/components/YDetailPageLayout'
+
+  export default {
+    name: 'customerDetail',
+    components: {
+      Breadcrumb,
+      YDetailPageLayout
+    },
+    data() {
+      return {
+        type: 'detail',
+        postForm: {
+        },
+        dataId: this.$route.query.id,
+        activeName: 'first',
+        vLoading: false,
+        AllEnum:[],
+        listQuery:{},
+        disable: false,
+        districtsOptions:[]
+      }
+    },
+    created() {
+      this.getAllEnum();
+      this.getDistrictsOptions();
+      this.getDetail();
+    },
+    methods: {
+      handleChange(value) {
+        console.log(value);
+      },
+      getDistrictsOptions(){
+        const that = this;
+        that.$api.districts.tree().then(data => {
+          if (data.code === 200) {
+            that.districtsOptions = data.data
+          } else {
+            this.$message({
+              type: 'error',
+              message: data.msg
+            })
+          }
+        })
+      },
+      getAllEnum() {
+        const that = this;
+        that.$api.globalConfig.getAllEnum().then(data => {
+          if (data.code === 200) {
+            that.AllEnum = data.data
+          } else {
+            this.$message({
+              type: 'error',
+              message: data.msg
+            })
+          }
+        })
+      },
+      getDetail() {
+        if (this.dataId) {
+          this.$api.customer.detail(this.dataId).then(res => {
+            this.postForm = res.data;
+            this.userPosts = res.data.userPosts.map(item => {
+              return item.id
+            })
+          });
+        }
+      },
+      handleCreate() {
+        // if (!this.postForm.userType) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请选择员工类型',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        // if (!this.postForm.name) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请输入姓名',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        // if (!this.postForm.sex) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请选择性别',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        // if (!this.postForm.idNo) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请输入身份证号',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        // if (this.postForm.remark && this.postForm.remark.length>200) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '备注信息长度应不超过200字符',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        // this.postForm.userPosts = this.userPosts;
+        // if (!this.postForm.userPosts || !this.postForm.userPosts.length) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请选择岗-部门',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        //
+        // if (!this.postForm.hireDate) {
+        //   this.$notify({
+        //     title: '错误',
+        //     message: '请选择入职日期',
+        //     type: 'error',
+        //     duration: 2000
+        //   });
+        //   return
+        // }
+        this.vLoading = true;
+
+        this.$refs.postForm.validate(valid => {
+          if (valid) {
+            if (this.dataId) {
+              this.$api.customer.edit(Object.assign({}, this.postForm)).then(res => {
+                if (res.code === 200) {
+                  this.$notify({
+                    title: '成功',
+                    message: '保存成功',
+                    type: 'success',
+                    duration: 2000
+                  });
+                  const back = this.$route.query.back;
+                  if (back) {
+                    this.$router.push(back)
+                  }
+                  this.initData();
+                  this.vLoading = false
+                }
+              }).catch(() => {
+                this.vLoading = false
+              })
+            } else {
+              this.$api.customer.add(Object.assign({}, this.postForm)).then(res => {
+                if (res.code === 200) {
+                  this.$notify({
+                    title: '成功',
+                    message: '新增成功',
+                    type: 'success',
+                    duration: 2000
+                  });
+                  const back = this.$route.query.back;
+                  if (back) {
+                    this.$router.push(back)
+                  }
+                  this.initData();
+                  this.vLoading = false
+                }
+              }).catch(() => {
+                this.vLoading = false
+              })
+            }
+          }
+        })
+      },
+    }
+  }
+</script>
+<style lang="scss" scoped>
+
+</style>

+ 312 - 0
src/views/market/customer/list.vue

@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+    <div class="title-container">
+      <breadcrumb id="breadcrumb-container" class="breadcrumb-container"/>
+    </div>
+
+    <y-page-list-layout :page-list="pageData" :page-para="listQuery" :get-page-list="getList">
+      <template slot="left">
+        <PermissionButton
+          menu-code="_views_market_customer_add"
+          class-name="filter-item"
+          type="primary"
+          name
+          size="mini"
+          :page-jump="true"
+          round
+          style="float: left"
+        />
+        <el-input
+          v-model="name"
+          placeholder="客户名称"
+          clearable
+          style="margin-left: 20px;width: 320px;float: left;">
+        </el-input>
+        <el-select clearable style="margin-left: 20px;width: 200px;float: left;" v-model="listQuery.resignState" placeholder="客户等级">
+          <el-option v-for="(item, index) in AllEnum['客户等级']" :key="index" :label="item" :value="item"/>
+        </el-select>
+        <el-button
+          class="filter-item"
+          style="margin-left: 10px;float: left;"
+          type="primary"
+          @click="searchList"
+          round
+        >搜索
+        </el-button>
+        <el-button
+          class="filter-item"
+          style="float: left;"
+          round
+          type="warning"
+          @click="resetSearch()"
+        >重置
+        </el-button>
+      </template>
+      <parentTable
+        v-loading="listLoading"
+        :data="pageData.records"
+        slot="table"
+        style="width: 100%;"
+      >
+        <el-table-column label="客户名称" align="center">
+          <template slot-scope="{row}">
+            <span>{{ row.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="市" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.city }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="区/县" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.county }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="部门" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.department }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="职位" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.position }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="科室" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.section }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="联系电话" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.mobile }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="微信号" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.wechatNo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="QQ号" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.qq }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="客户等级" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.level }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="客户地址" align="center" width="120">
+          <template slot-scope="{row}">
+            <span>{{ row.address }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center">
+          <template slot-scope="{row}">
+            <PermissionButton
+              menu-code="_views_market_customer_detail"
+              class-name="filter-item"
+              name=""
+              type="primary"
+              :page-jump="true"
+              :page-query="{id: row.id}"
+              round
+              size="mini"
+            />
+            <PermissionButton
+              menu-code="_views_market_customer_remove"
+              class-name="filter-item"
+              name=""
+              type="danger"
+              round
+              size="mini"
+              @click="deleteInfo(row.id)"
+            />
+          </template>
+        </el-table-column>
+      </parentTable>
+    </y-page-list-layout>
+  </div>
+</template>
+<script>
+  import YPageListLayout from '@/components/YPageListLayout'
+  import Breadcrumb from '@/components/Breadcrumb'
+  import PermissionButton from '@/components/PermissionButton/PermissionButton'
+
+  export default {
+    name: 'ViewsStaffList',
+    components: {
+      Breadcrumb,
+      YPageListLayout,
+      PermissionButton,
+    },
+    filters: {
+      statusFilter(status) {
+        const statusMap = {
+          published: 'success',
+          draft: 'info',
+          deleted: 'danger',
+        }
+        return statusMap[status]
+      },
+    },
+    data() {
+      return {
+        isDisable:false,
+        tableKey: 0,
+        pageData: { records: [] },
+        total: 20,
+        listLoading: true,
+        listQuery: {
+          page: 1,
+          size: 10,
+          descs: 'id',
+        },
+        listQueryKey: 'keyword',
+        importLoading: false,
+        name:null,
+        city:null,
+        county:null
+      }
+    },
+    created() {
+      const that = this;
+      that.getAllEnum();
+      that.getList();
+    },
+    methods: {
+      getAllEnum() {
+        const that = this;
+        that.$api.globalConfig.getAllEnum().then(data => {
+          if (data.code === 200) {
+            that.AllEnum = data.data
+          } else {
+            this.$message({
+              type: 'error',
+              message: data.msg
+            })
+          }
+        })
+      },
+      resetSearch() {
+        this.listQuery = {
+          current: 1,
+          size: 10,
+          descs: 'id',
+        }
+        this.getList()
+      },
+      removeHandle(row) {
+        // console.log(data)
+        const that = this
+        that
+          .$confirm('确认删除当前记录吗?', '警告', {
+            confirmButtonText: '确认',
+            cancelButtonText: '取消',
+            type: 'warning',
+          })
+          .then(async () => {
+            this.$api.customer.delete(row.id).then((res) => {
+              if (res.code === 200) {
+                this.$message({
+                  type: 'success',
+                  message: '删除成功',
+                })
+                this.getList()
+              }
+            })
+          })
+          .catch((err) => {
+            console.error(err)
+          })
+      },
+      searchList() {
+        // 重置分页
+        this.listQuery.page = 1
+        this.listQuery.size = 10
+        this.getList()
+      },
+      getList() {
+        const that = this
+        this.listLoading = true
+        // console.log(that.listQuery)
+        const key = {}
+        key[this.listQueryKey] = this.listQuery.description
+        this.$api.customer
+          .list(Object.assign({}, that.listQuery, key))
+          .then((res) => {
+            that.pageData = res.data
+            setTimeout(() => {
+              that.listLoading = false
+            }, 200)
+          })
+          .catch(() => {
+            that.listLoading = false
+          })
+      },
+      deleteInfo(id) {
+        const that = this
+        that.$confirm('请确认是否删除该数据?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+          center: true
+        }).then(() => {
+          that.$api.customer.delete(id).then(data => {
+            that.loading = false
+            if (data.code === 200) {
+              that.getList()
+            } else {
+              this.$message({
+                type: 'error',
+                message: data.msg
+              })
+            }
+          })
+        }).catch(() => {
+        })
+      }
+    },
+  }
+</script>
+<style lang="scss" scoped>
+  .right {
+    flex: 1;
+
+    .title {
+      font-size: 16px;
+      font-weight: 500;
+      color: rgba(51, 51, 51, 1);
+      line-height: 35px;
+      margin-bottom: 8px;
+    }
+
+    .menu-2-box {
+      display: flex;
+      flex-wrap: wrap;
+      width: 100%;
+    }
+
+    .menu-2-item {
+      display: flex;
+      align-items: center;
+      color: #656565;
+      font-size: 12px;
+      width: 230px;
+      height: 101px;
+      background: rgb(255, 185, 129);
+      border-radius: 3px;
+      padding-left: 20px;
+      margin-right: 10px;
+      margin-bottom: 10px;
+      cursor: pointer;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+
+      .text {
+        margin-left: 16px;
+      }
+    }
+  }
+</style>

+ 1 - 1
src/views/staff/list.vue

@@ -236,7 +236,7 @@
       searchList() {
         // 重置分页
         this.listQuery.page = 1
-        this.listQuery.size = 20
+        this.listQuery.size = 10
         this.getList()
       },
       getList() {