Browse Source

feat: 甲方客户

zh 2 năm trước cách đây
mục cha
commit
82507c90ff

+ 47 - 0
src/api/basic_data/partya.js

@@ -0,0 +1,47 @@
+import request, { postBlob, handleImport, getBlob } from '@/utils/request'
+export function getFirstPartyCustomerManagementList(params) {
+  return request({
+    url: `/config/firstPartyCustomerManagement/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+export function exportFirstPartyCustomerManagement(data, name) {
+  return postBlob({
+    url: '/config/firstPartyCustomerManagement/export',
+    data,
+    name
+  })
+}
+
+export function editFirstPartyCustomerManagement(params) {
+  return request({
+    url: `/config/firstPartyCustomerManagement/edit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function addFirstPartyCustomerManagement(params) {
+  return request({
+    url: `/config/firstPartyCustomerManagement/add`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function getFirstPartyCustomerManagementDetail(params) {
+  return request({
+    url: `/config/firstPartyCustomerManagement/detail`,
+    method: 'post',
+    params
+  })
+}
+
+export function delFirstPartyCustomerManagement(params) {
+  return request({
+    url: `/config/firstPartyCustomerManagement/del`,
+    method: 'post',
+    params
+  })
+}

+ 10 - 0
src/views/basic_data/partya.vue

@@ -0,0 +1,10 @@
+<template>
+  <div>
+    <keep-alive>
+      <router-view /> </keep-alive>
+  </div>
+</template>
+
+<script>
+export default {}
+</script>

+ 585 - 0
src/views/basic_data/partya/partyaForm.vue

@@ -0,0 +1,585 @@
+<template>
+  <div>
+    <h3>甲方客户信息</h3>
+    <el-divider />
+    <el-form :disabled="isDetail">
+      <div class="diy-table-1">
+        <el-row :gutter="0">
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*甲方客户名称</div>
+            <div class="value">
+              <el-input v-model="formData.name" placeholder="请输入甲方客户名称" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*上级客户</div>
+            <div class="value">
+              <el-input v-model="formData.parentName" placeholder="请输入上级客户" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*客户规模</div>
+            <div class="value">
+              <el-select
+                v-model="formData.scale"
+                placeholder="请选择客户规模"
+                clearable
+                filterable
+                class="my-width"
+              >
+                <el-option v-for="item in scaleTypeList" :key="item.value" :label="item.label" :value="item.label" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*客户类型</div>
+            <div class="value">
+              <el-select
+                v-model="formData.type"
+                placeholder="请选择客户类型"
+                clearable
+                filterable
+                class="my-width"
+              >
+                <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.label" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*行业大类</div>
+            <div class="value">
+              <el-select
+                v-model="formData.tradeParentId"
+                placeholder="请选择行业大类"
+                clearable
+                filterable
+                class="my-width"
+                @change="handleTradeParent"
+              >
+                <el-option v-for="item in tradeParentList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*行业小类</div>
+            <div class="value">
+              <el-select v-model="formData.tradeId" placeholder="请选择行业小类" clearable filterable class="my-width">
+                <el-option v-for="item in tradeList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*客户地址</div>
+            <div class="value">
+              <el-select
+                v-model="formData.provinceRegionId"
+                placeholder="请选择省"
+                class="my-width"
+                @change="changeProvince"
+              >
+                <el-option v-for="item in provinceList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+              <el-select v-model="formData.cityRegionId" placeholder="请选择市" class="my-width" @change="changeCity">
+                <el-option v-for="item in cityList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+              <el-select v-model="formData.areaId" placeholder="请选择区" class="my-width">
+                <el-option v-for="item in areaList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            <!-- <el-select v-model="formData.streetId" placeholder="请选择街道" class="my-width" @change="changeStreet">
+              <el-option v-for="item in streetList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select> -->
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="16" :lg="16" class="item">
+            <div class="label">*详细地址</div>
+            <div class="value">
+              <el-input v-model="formData.address" placeholder="请输入详细地址" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*客户关系</div>
+            <div class="value">
+              <el-select v-model="formData.rela" placeholder="请选择客户关系" clearable filterable class="my-width">
+                <el-option v-for="item in relaTypeList" :key="item.value" :label="item.label" :value="item.label" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*客户来源</div>
+            <div class="value">
+              <el-select v-model="formData.resource" placeholder="请选择客户来源" clearable filterable class="my-width">
+                <el-option v-for="item in resourceTypeList" :key="item.value" :label="item.label" :value="item.label" />
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label" />
+            <div class="value" />
+          </el-col>
+        </el-row>
+      </div>
+      <h3>联系人信息</h3>
+      <el-divider />
+      <div class="diy-table-1">
+        <el-row :gutter="0">
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">*联系人名称</div>
+            <div class="value">
+              <el-input v-model="formData.linkName" placeholder="请输入联系人名称" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">联系人职务</div>
+            <div class="value">
+              <el-input v-model="formData.linkJob" placeholder="请输入联系人职务" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">联系人部门</div>
+            <div class="value">
+              <el-input v-model="formData.linkDepartment" placeholder="请输入联系人部门" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">微信</div>
+            <div class="value"><el-input v-model="formData.weXin" placeholder="请输入微信" size="mini" clearable /></div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">联系人角色</div>
+            <div class="value">
+              <el-input v-model="formData.linkRole" placeholder="请输入联系人角色" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">邮箱</div>
+            <div class="value">
+              <el-input v-model="formData.email" type="email" placeholder="请输入邮箱" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label">QQ</div>
+            <div class="value"><el-input v-model="formData.qq" placeholder="请输入QQ" size="mini" clearable /></div>
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label" />
+            <div class="value" />
+          </el-col>
+          <el-col :xs="24" :sm="8" :lg="8" class="item">
+            <div class="label" />
+            <div class="value" />
+          </el-col>
+        </el-row>
+      </div>
+    </el-form>
+
+    <div v-if="!isDetail" style="margin: 20px 0">
+      <el-button type="primary" size="small" @click="onSbumit">保存</el-button>
+      <el-button size="small" @click="onReset">重置</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { findElem } from '@/utils/util'
+import { getRegion } from '@/api/sales'
+import { getTradeConfigList } from '@/api/basic_data/sectorAllocation'
+import {
+  editFirstPartyCustomerManagement,
+  addFirstPartyCustomerManagement,
+  getFirstPartyCustomerManagementDetail
+} from '@/api/basic_data/partya'
+export default {
+  props: {
+    detailId: {
+      type: String,
+      default: ''
+    },
+    isDetail: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      formData: {
+        address: '',
+        areaId: '',
+        cityRegionId: '',
+        email: '',
+        linkDepartment: '',
+        linkJob: '',
+        linkName: '',
+        linkRole: '',
+        name: '',
+        parentName: '',
+        provinceRegionId: '',
+        qq: '',
+        rela: '',
+        resource: '',
+        scale: '',
+        tradeId: '',
+        tradeParentId: '',
+        type: '',
+        weXin: ''
+      },
+      provinceList: [],
+      cityList: [],
+      areaList: [],
+      streetList: [],
+      typeList: [
+        {
+          label: '客户',
+          value: 1
+        },
+        {
+          label: '供应商',
+          value: 2
+        },
+        {
+          label: '竞争对手',
+          value: 3
+        },
+        {
+          label: '投资者',
+          value: 4
+        },
+        {
+          label: '关系伙伴',
+          value: 5
+        },
+        {
+          label: '新闻界',
+          value: 6
+        },
+        {
+          label: '设计院',
+          value: 7
+        }, {
+          label: '工程商',
+          value: 8
+        }, {
+          label: '直签工程商',
+          value: 9
+        }
+      ],
+      scaleTypeList: [
+        {
+          label: '战略客户',
+          value: 1
+        }, {
+          label: '中央、国企',
+          value: 2
+        }, {
+          label: '省部级科研院所',
+          value: 3
+        }, {
+          label: '地市级以上会展及文体场馆',
+          value: 4
+        }, {
+          label: '地市级以上政府机构',
+          value: 5
+        }, {
+          label: '博物馆',
+          value: 6
+        }, {
+          label: '三甲医院',
+          value: 7
+        }, {
+          label: '985/211/双一流大学及附属学习哦啊',
+          value: 8
+        }
+      ],
+      relaTypeList: [
+        {
+          label: '战略联盟',
+          value: 1
+        }, {
+          label: '合作伙伴',
+          value: 2
+        }, {
+          label: '供应关系',
+          value: 3
+        }, {
+          label: '买卖关系',
+          value: 4
+        }
+      ],
+      resourceTypeList: [
+        {
+          label: '客户推荐',
+          value: 1
+        },
+        {
+          label: '供应商推荐',
+          value: 2
+        },
+        {
+          label: '会展',
+          value: 3
+        },
+        {
+          label: '外出拜访',
+          value: 4
+        },
+        {
+          label: '招投标网站',
+          value: 5
+        },
+        {
+          label: '设计院推广',
+          value: 6
+        },
+        {
+          label: '其他',
+          value: 7
+        }
+      ],
+      tradeParentList: [],
+      tradeList: []
+    }
+  },
+  created() {
+    if (this.detailId) {
+      this.getDetail()
+    }
+    this.getRegion()
+    this.getTradeConfigList()
+  },
+  methods: {
+    // 获取省市区街道
+    getRegion(level = 0, id = 0) {
+      getRegion({ pid: id }).then(res => {
+        if (level === 0) {
+          this.provinceList = res.data
+        } else if (level === 1) {
+          this.cityList = res.data
+        } else if (level === 2) {
+          this.areaList = res.data
+        } else if (level === 3) {
+          this.streetList = res.data
+        }
+      })
+    },
+    handleArea(value, type) {
+      this.formData[type] = this[type + 'List'].find(k => k.id === value).name
+    },
+    // 切换省
+    changeProvince(value) {
+      this.formData.cityRegionId = ''
+      this.formData.areaId = ''
+      this.formData.streetId = ''
+      this.cityList = []
+      this.areaList = []
+      this.streetList = []
+      this.getRegion(1, value)
+      this.handleArea(value, 'province')
+    },
+
+    // 切换市
+    changeCity(value) {
+      this.formData.areaId = ''
+      this.formData.streetId = ''
+      this.areaList = []
+      this.streetList = []
+      this.getRegion(2, value)
+      this.handleArea(value, 'city')
+    },
+
+    // 切换区
+    changeArea(value) {
+      this.areaValue = value
+      this.formData.streetId = ''
+      this.streetList = []
+      this.getRegion(3, value)
+      this.handleArea(value, 'area')
+    },
+
+    // 切换街道
+    changeStreet(value) {
+      this.getRegion(3, this.areaValue)
+      this.handleArea(value, 'street')
+    },
+
+    // 初始化省市区街道
+    initRegion(level, item, id = 0) {
+      const { province, city, area, street } = item
+      let nextId = null
+      getRegion({ pid: id }).then(res => {
+        if (level === 0) {
+          this.provinceList = res.data
+          nextId = this.formData.provinceRegionId = this.provinceList[findElem(this.provinceList, 'name', province)].id
+        } else if (level === 1) {
+          this.cityList = res.data
+          nextId = this.formData.cityRegionId = this.cityList[findElem(this.cityList, 'name', city)].id
+        } else if (level === 2) {
+          this.areaList = res.data
+          nextId = this.formData.areaId = this.areaList[findElem(this.areaList, 'name', area)].id
+        } else if (level === 3) {
+          this.streetList = res.data
+          nextId = this.formData.streetId = this.streetList[findElem(this.streetList, 'name', street)].id
+        }
+        if (level < 3) {
+          level = level + 1
+          this.initRegion(level, item, nextId)
+        }
+      })
+    },
+    handleTradeParent(e) {
+      if (e) {
+        this.getTradeConfigList(e)
+        return
+      }
+      this.tradeId = ''
+    },
+    getTradeConfigList(parentId = '') {
+      getTradeConfigList({
+        pageNum: 1,
+        pageSize: -1,
+        parentId: parentId
+      }).then(res => {
+        if (parentId) {
+          this.tradeList = res.data.records
+          return
+        }
+        this.tradeParentList = res.data.records
+      })
+    },
+    getDetail() {
+      getFirstPartyCustomerManagementDetail({ id: this.detailId }).then(res => {
+        this.formData = {
+          ...res.data
+        }
+      })
+    },
+    onReset() {
+      this.formData = {
+        address: '',
+        areaId: '',
+        cityRegionId: '',
+        email: '',
+        linkDepartment: '',
+        linkJob: '',
+        linkName: '',
+        linkRole: '',
+        name: '',
+        parentName: '',
+        provinceRegionId: '',
+        qq: '',
+        rela: '',
+        resource: '',
+        scale: '',
+        tradeId: '',
+        tradeParentId: '',
+        type: '',
+        weXin: ''
+      }
+    },
+    onSbumit() {
+      const {
+        address,
+        areaId,
+        cityRegionId,
+        linkName,
+        name,
+        parentName,
+        provinceRegionId,
+        rela,
+        resource,
+        scale,
+        tradeId,
+        tradeParentId,
+        type
+      } = this.formData
+      if (!name) {
+        this.$errorMsg('甲方客户名称不能为空')
+        return
+      }
+      if (!parentName) {
+        this.$errorMsg('上级客户称不能为空')
+        return
+      }
+      if (!scale) {
+        this.$errorMsg('客户规模不能为空')
+        return
+      }
+      if (!type) {
+        this.$errorMsg('客户类型不能为空')
+        return
+      }
+      if (!tradeParentId) {
+        this.$errorMsg('行业大类不能为空')
+        return
+      }
+      if (!tradeId) {
+        this.$errorMsg('行业小类不能为空')
+        return
+      }
+      if (!cityRegionId || !areaId || !provinceRegionId) {
+        this.$errorMsg('客户地址不能为空')
+        return
+      }
+      if (!address) {
+        this.$errorMsg('详细地址称不能为空')
+        return
+      }
+      if (!rela) {
+        this.$errorMsg('客户关系不能为空')
+        return
+      }
+      if (!resource) {
+        this.$errorMsg('客户来源不能为空')
+        return
+      }
+      if (!linkName) {
+        this.$errorMsg('联系人名称不能为空')
+        return
+      }
+      const params = {
+        ...this.formData,
+        provinceRegionId: '' + this.formData.provinceRegionId,
+        areaId: '' + this.formData.areaId,
+        cityRegionId: '' + this.formData.cityRegionId
+
+      }
+      if (this.detailId) {
+        editFirstPartyCustomerManagement(params).then(res => {
+          this.$successMsg('编辑成功')
+          this.$emit('updateList')
+        })
+      } else {
+        addFirstPartyCustomerManagement(params).then(res => {
+          this.$successMsg('新增成功')
+          this.$emit('updateList')
+        })
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.diy-table-1 .item .label {
+  width: 150px;
+}
+::v-deep .el-radio {
+  margin-right: 120px;
+}
+.flex-box {
+  display: flex;
+  align-items: center;
+  margin: 5px 20px;
+  &-title {
+    width: 100px;
+  }
+}
+::v-deep .my-input > input {
+  padding-left: 10px !important;
+  border: 1px solid #dcdfe6 !important;
+}
+.mg-b {
+  margin: 10px 0;
+}
+.my-width {
+  width: 100%;
+}
+</style>

+ 165 - 0
src/views/basic_data/partya/partyaList.vue

@@ -0,0 +1,165 @@
+<template>
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :operation="operation()"
+    :options-evens-group="optionsEvensGroup"
+    :column-parsing="columnParsing"
+    :table-attributes="tableAttributes"
+    :table-events="tableEvents"
+  >
+    <Popu v-if="visible">
+      <el-page-header slot="head" :content="content" @back="handleClose" />
+      <PartyaForm :detail-id="detailId" :is-detail="isDetail" @updateList="handleClose" />
+    </Popu>
+  </template-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import add_callback_mixin from '@/components/template/add_callback_mixin.js'
+import Popu from '@/components/template/popu.vue'
+
+import PartyaForm from './partyaForm.vue'
+import {
+  getFirstPartyCustomerManagementList,
+  exportFirstPartyCustomerManagement,
+  delFirstPartyCustomerManagement
+} from '@/api/basic_data/partya'
+
+export default {
+  components: { TemplatePage, Popu, PartyaForm },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+      optionsEvensGroup: [
+        [
+          [
+            {
+              name: '新增',
+              click: this.addOn(() => {
+                this.content = '新增'
+                this.visible = true
+              })
+            }
+          ]
+        ],
+        [
+          [
+            {
+              name: '批量删除',
+              click: async() => {
+                if (this.recordSelected.length === 0) {
+                  this.$message.error('请选择需要删除的数据')
+                  return
+                }
+                const ids = this.recordSelected.map(v => {
+                  return v.id
+                })
+                const idList = ids.toString()
+                await delFirstPartyCustomerManagement({ idList })
+                this.$refs.pageRef.refreshList()
+                this.$message.success('批量删除成功')
+              }
+            }
+          ]
+        ]
+      ],
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+
+      detailId: '',
+      content: '',
+      isDetail: false
+
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getFirstPartyCustomerManagementList(...p)
+    },
+    // 列表导出函数
+    exportList: exportFirstPartyCustomerManagement,
+    // 表格列解析渲染数据更改
+    columnParsing(_item, defaultData) {
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    operation() {
+      return (_h, { row, index, column }) => {
+        return (
+          <div class='operation-btns'>
+            <el-button
+              size='mini'
+              type='text'
+              onClick={() => {
+                this.content = '编辑'
+                this.visible = true
+                this.detailId = row.id
+              }}
+            >
+              编辑
+            </el-button>
+            <el-button
+              size='mini'
+              type='text'
+              onClick={() => {
+                this.content = '详情'
+                this.visible = true
+                this.isDetail = true
+                this.detailId = row.id
+              }}
+            >
+              详情
+            </el-button>
+            {
+              <el-popconfirm
+                title='确定删除吗?'
+                onOnConfirm={() => {
+                  delFirstPartyCustomerManagement({ idList: row.id }).then(res => {
+                    this.$refs.pageRef.refreshList()
+
+                    this.$successMsg('删除成功')
+                  })
+                }}
+              >
+                <el-button slot='reference' type='text' size='mini'>
+                  删除
+                </el-button>
+              </el-popconfirm>
+            }
+          </div>
+        )
+      }
+    },
+    handleClose() {
+      this.addOff(() => {
+        this.detailId = ''
+        this.isDetail = false
+        this.visible = false
+        this.$refs.pageRef.refreshList()
+      })()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>