Quellcode durchsuchen

feature: 项目管理

ZZH-wl vor 3 Jahren
Ursprung
Commit
ed3db9c55a

+ 27 - 0
src/api/proj/business.js

@@ -0,0 +1,27 @@
+import micro_request from '@/utils/micro_request'
+
+const basePath = process.env.VUE_APP_ParentPath
+export default {
+  // 获取列表
+  getList(query) {
+    return micro_request.postRequest(basePath, 'Business', 'GetList', query)
+  },
+  getEntityById(query) {
+    return micro_request.postRequest(basePath, 'Business', 'GetEntityById', query)
+  },
+  doAdd(query) {
+    return micro_request.postRequest(basePath, 'Business', 'Create', query)
+  },
+  doEdit(query) {
+    return micro_request.postRequest(basePath, 'Business', 'UpdateById', query)
+  },
+  doDelete(query) {
+    return micro_request.postRequest(basePath, 'Business', 'DeleteByIds', query)
+  },
+  businessGradation(query) {
+    return micro_request.postRequest(basePath, 'Business', 'BusinessGradation', query)
+  },
+  businessTransfer(query) {
+    return micro_request.postRequest(basePath, 'Business', 'BusinessTransfer', query)
+  },
+}

+ 241 - 0
src/views/proj/business/components/BusinessEdit.vue

@@ -0,0 +1,241 @@
+<template>
+  <el-dialog append-to-body :title="title" :visible.sync="dialogFormVisible" @close="close">
+    <el-form ref="form" label-width="120px" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="项目标题" prop="nboName">
+            <el-input v-model="form.nboName" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="关联客户" prop="custName">
+            <el-input v-model="form.custName" readonly @focus="handleSelectCustomer" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="获取日期" prop="title">
+            <el-date-picker v-model="form.value1" placeholder="选择日期" style="width: 100%" type="datetime" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="项目来源" prop="nboSource">
+            <el-input v-model="form.nboSource" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="主要联系人" prop="contactName">
+            <el-input v-model="form.contactName" readonly @focus="handleSelectContact" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="职位" prop="contactPostion">
+            <el-input v-model="form.contactPostion" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="联系电话" prop="contactTelephone">
+            <el-input v-model="form.contactTelephone" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="负责人员" prop="makerName">
+            <el-input v-model="form.makerName" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="销售模式" prop="salesModel">
+            <el-input v-model="form.salesModel" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="经销商名称" prop="distributorName">
+            <el-input v-model="form.distributorName" readonly @focus="handleSelectDistributor" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="经销商负责人" prop="title">
+            <el-input v-model="form.title" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="经销商联系方式" prop="title">
+            <el-input v-model="form.title" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="备注信息" prop="remark">
+            <el-input v-model="form.remark" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!--      <el-row :gutter="20">-->
+      <!--        <el-col :span="24">-->
+      <!--          <div style="margin: -10px 0 10px 120px">-->
+      <!--            <el-checkbox v-model="form.checked">创建跟进任务</el-checkbox>-->
+      <!--          </div>-->
+      <!--        </el-col>-->
+      <!--      </el-row>-->
+      <!--      <el-row :gutter="20">-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="开始时间" prop="title">-->
+      <!--            <el-date-picker v-model="form.value1" placeholder="选择时间" style="width: 100%" type="datetime" />-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="结束时间" prop="title">-->
+      <!--            <el-date-picker v-model="form.value1" placeholder="选择时间" style="width: 100%" type="datetime" />-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="负责人员" prop="title">-->
+      <!--            <el-input v-model="form.title" />-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="跟进内容" prop="followContent">-->
+      <!--            <el-input v-model="form.followContent" />-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="任务提醒" prop="title">-->
+      <!--            <el-input v-model="form.title" />-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--        <el-col :span="12">-->
+      <!--          <el-form-item label="提醒方式" prop="title">-->
+      <!--            <el-checkbox v-model="form.checked">系统消息</el-checkbox>-->
+      <!--          </el-form-item>-->
+      <!--        </el-col>-->
+      <!--      </el-row>-->
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="产品(含版本)" prop="title">
+            <el-button size="mini" type="primary" @click="handleSelectProduct">添加产品</el-button>
+
+            <el-table>
+              <el-table-column align="center" label="产品名称" prop="custCode" />
+              <el-table-column align="center" label="产品类别" prop="custName" />
+              <el-table-column align="center" label="单位" prop="abbrName" />
+              <el-table-column align="center" label="价格" prop="custLocation" />
+              <el-table-column align="center" label="数量" prop="custIndustry" />
+              <el-table-column align="center" label="操作" width="80">
+                <template #default="{ row }">
+                  <el-button type="text">删除{{ row }}</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="save">提 交</el-button>
+      <el-button @click="close">重 置</el-button>
+    </div>
+    <!-- 选择客户弹窗 -->
+    <select-customer ref="selectCustomer" @save="selectCustomer" />
+    <!-- 选择客户弹窗 -->
+    <select-contact ref="selectContact" :query-params="queryContact" @save="selectContact" />
+    <!-- 选择经销商弹窗 -->
+    <select-distributor ref="selectDistributor" @save="selectDistributor" />
+    <!-- 选择产品弹窗 -->
+    <select-product ref="selectProduct" @save="selectProduct" />
+  </el-dialog>
+</template>
+
+<script>
+  import businessApi from '@/api/proj/business'
+  import SelectContact from '@/components/select/SelectContact'
+  import SelectCustomer from '@/components/select/SelectCustomer'
+  import SelectDistributor from '@/components/select/SelectDistributor'
+  import SelectProduct from '@/components/select/SelectProduct'
+
+  export default {
+    name: 'BusinessEdit',
+    components: { SelectContact, SelectProduct, SelectDistributor, SelectCustomer },
+    data() {
+      return {
+        form: {
+          title: '',
+          custId: undefined,
+          custName: undefined,
+          contactName: undefined,
+          distributorName: undefined,
+        },
+        rules: {
+          title: [{ required: true, trigger: 'blur', message: '请输入标题' }],
+        },
+        title: '',
+        dialogFormVisible: false,
+        queryContact: {},
+      }
+    },
+    created() {},
+    methods: {
+      handleSelectCustomer() {
+        this.$refs.selectCustomer.open()
+      },
+      handleSelectContact() {
+        if (!this.queryContact.custId) {
+          this.$message.warning('请选择联系人')
+        }
+        this.$refs.selectContact.open()
+      },
+      handleSelectDistributor() {
+        this.$refs.selectDistributor.open()
+      },
+      handleSelectProduct() {
+        this.$refs.selectProduct.open()
+      },
+      selectCustomer(val) {
+        if (val && val.length > 0) {
+          this.queryContact.custId = val[0].id
+        }
+        this.form.custName = val.map((item) => item.custName).join()
+        console.log(this.form.custName)
+        console.log(val)
+      },
+      selectContact(val) {
+        this.form.contactName = val.map((item) => item.cuctName).join()
+        console.log(this.form.contactName)
+
+        console.log(val)
+      },
+      selectDistributor(val) {
+        this.form.distributorName = val.map((item) => item.distName).join()
+        console.log(this.form.distributorName)
+
+        console.log(val)
+      },
+      selectProduct(val) {
+        console.log(val)
+      },
+      showEdit(row) {
+        if (!row) {
+          this.title = '添加'
+        } else {
+          this.title = '编辑'
+          this.form = Object.assign({}, row)
+        }
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const { msg } = await businessApi.doEdit(this.form)
+            this.$baseMessage(msg, 'success')
+            this.$emit('fetch-data')
+            this.close()
+          } else {
+            return false
+          }
+        })
+      },
+    },
+  }
+</script>

+ 66 - 0
src/views/proj/business/components/Transfer.vue

@@ -0,0 +1,66 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px" @close="close">
+    <el-form ref="form" label-width="80px" :model="form" :rules="rules">
+      <el-form-item label="接收对象" prop="userName">
+        <el-input
+          v-model="form.userName"
+          placeholder="选择人员"
+          readonly
+          suffix-icon="el-icon-user-solid"
+          @focus="selectUser" />
+      </el-form-item>
+      <el-form-item label="备注信息" prop="remark">
+        <el-input
+          v-model="form.remark"
+          maxlength="300"
+          placeholder="请输入备注信息"
+          rows="5"
+          show-word-limit
+          type="textarea" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="save">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import businessApi from '@/api/proj/business'
+
+  export default {
+    name: 'Transfer',
+    data() {
+      return {
+        form: {},
+        rules: {
+          userName: [{ required: true, message: '不能为空', trigger: 'blur' }],
+        },
+        title: '转移项目',
+        dialogFormVisible: false,
+      }
+    },
+    methods: {
+      selectUser() {},
+      open() {
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const { msg } = await businessApi.businessTransfer(this.form)
+            this.$baseMessage(msg, 'success')
+            this.$emit('fetch-data')
+            this.close()
+          }
+        })
+      },
+    },
+  }
+</script>

+ 232 - 0
src/views/proj/business/index.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="business-container">
+    <vab-query-form>
+      <vab-query-form-top-panel>
+        <el-form ref="queryForm" :inline="true" :model="queryForm" @submit.native.prevent>
+          <el-form-item prop="nboName">
+            <el-input v-model="queryForm.nboName" clearable placeholder="商机标题" @keyup.enter.native="queryData" />
+          </el-form-item>
+
+          <el-form-item prop="custName">
+            <el-input
+              v-model="queryForm.custName"
+              clearable
+              placeholder="客户名称"
+              size="small"
+              @keyup.enter.native="queryData" />
+          </el-form-item>
+
+          <el-form-item prop="nboType">
+            <el-select v-model="queryForm.nboType" clearable placeholder="商机类别">
+              <el-option v-for="dict in nboTypeOptions" :key="dict.key" :label="dict.value" :value="dict.key" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="saleName">
+            <el-input
+              v-model="queryForm.saleName"
+              clearable
+              placeholder="归属人员"
+              size="small"
+              @keyup.enter.native="queryData" />
+          </el-form-item>
+
+          <el-form-item>
+            <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
+            <el-button icon="el-icon-refresh" type="primary" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </vab-query-form-top-panel>
+
+      <vab-query-form-left-panel :span="12">
+        <el-button icon="el-icon-plus" type="primary" @click="handleEdit">新增项目</el-button>
+        <el-button icon="el-icon-refresh" type="primary" @click="handleTransfer">转移项目</el-button>
+        <el-button icon="el-icon-plus" type="primary" @click="handleEdit">创建任务</el-button>
+        <el-button icon="el-icon-plus" type="primary" @click="handleEdit">创建工单</el-button>
+        <el-button icon="el-icon-plus" type="primary" @click="handleEdit">创建合同</el-button>
+        <!--        <el-button icon="el-icon-delete" type="danger" @click="handleDelete">删除</el-button>-->
+      </vab-query-form-left-panel>
+      <vab-query-form-right-panel :span="12">
+        <table-tool :check-list.sync="checkList" :columns="columns" />
+      </vab-query-form-right-panel>
+    </vab-query-form>
+
+    <el-table v-loading="listLoading" :data="list" :height="height" @selection-change="setSelectRows">
+      <el-table-column align="center" show-overflow-tooltip type="selection" />
+      <el-table-column
+        v-for="(item, index) in finallyColumns"
+        :key="index"
+        align="center"
+        :label="item.label"
+        :prop="item.prop"
+        show-overflow-tooltip
+        :sortable="item.sortable"
+        :width="item.width" />
+
+      <el-table-column align="center" label="操作" width="120">
+        <template #default="{ row }">
+          <el-button type="text" @click="handleEdit(row)">跟进</el-button>
+          <el-button type="text" @click="handleEdit(row)">编辑</el-button>
+          <!--          <el-button type="text" @click="handleDelete(row)">删除</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      background
+      :current-page="queryForm.pageNo"
+      :layout="layout"
+      :page-size="queryForm.pageSize"
+      :total="total"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange" />
+    <edit ref="edit" @fetch-data="fetchData" />
+    <transfer ref="transfer" @fetch-data="fetchData" />
+  </div>
+</template>
+
+<script>
+  import businessApi from '@/api/proj/business'
+  import Edit from './components/BusinessEdit'
+  import Transfer from './components/Transfer'
+  import TableTool from '@/components/table/TableTool'
+
+  export default {
+    name: 'Business',
+    components: { Edit, Transfer, TableTool },
+    data() {
+      return {
+        height: this.$baseTableHeight(2),
+        checkList: [],
+        columns: [
+          {
+            label: '商机标题',
+            width: 'auto',
+            prop: 'nboName',
+            sortable: true,
+            disableCheck: true,
+          },
+          {
+            label: '关联客户',
+            width: 'auto',
+            prop: 'custName',
+          },
+          {
+            label: '审批状态',
+            width: 'auto',
+            prop: 'approStatus',
+          },
+          {
+            label: '商机状态',
+            width: 'auto',
+            prop: 'nboPhase',
+          },
+          {
+            label: '商机类别',
+            width: 'auto',
+            prop: 'nboType',
+          },
+          {
+            label: '商机金额',
+            width: 'auto',
+            prop: 'nboBudget',
+          },
+          {
+            label: '最后跟进时间',
+            width: 'auto',
+            prop: 'finalFollowTime',
+          },
+          {
+            label: '下次跟进时间',
+            width: 'auto',
+            prop: 'nextFollowTime',
+          },
+        ],
+        list: [],
+        listLoading: true,
+        layout: 'total, sizes, prev, pager, next, jumper',
+        total: 0,
+        selectRows: '',
+        queryForm: {
+          pageNo: 1,
+          pageSize: 10,
+          nboName: undefined,
+          custName: undefined,
+          nboType: undefined,
+          saleName: undefined,
+        },
+        nboTypeOptions: [],
+      }
+    },
+    computed: {
+      finallyColumns() {
+        return this.columns.filter((item) => this.checkList.includes(item.label))
+      },
+    },
+    created() {
+      this.fetchData()
+      this.getDicts('proj-nbo-type').then((response) => {
+        this.nboTypeOptions = response.data.values || []
+      })
+    },
+    methods: {
+      setSelectRows(val) {
+        this.selectRows = val
+      },
+      handleTransfer(row) {
+        this.$refs['transfer'].open(row)
+      },
+      handleEdit(row) {
+        if (row.id) {
+          this.$refs['edit'].showEdit(row)
+        } else {
+          this.$refs['edit'].showEdit()
+        }
+      },
+      handleDelete(row) {
+        if (row.id) {
+          this.$baseConfirm('你确定要删除当前项吗', null, async () => {
+            const { msg } = await businessApi.doDelete({ ids: [row.id] })
+            this.$baseMessage(msg, 'success')
+            await this.fetchData()
+          })
+        } else {
+          if (this.selectRows.length > 0) {
+            const ids = this.selectRows.map((item) => item.id)
+            this.$baseConfirm('你确定要删除选中项吗', null, async () => {
+              const { msg } = await businessApi.doDelete({ ids })
+              this.$baseMessage(msg, 'success')
+              await this.fetchData()
+            })
+          } else {
+            this.$baseMessage('未选中任何行', 'error')
+            return false
+          }
+        }
+      },
+      handleSizeChange(val) {
+        this.queryForm.pageSize = val
+        this.fetchData()
+      },
+      handleCurrentChange(val) {
+        this.queryForm.pageNo = val
+        this.fetchData()
+      },
+      queryData() {
+        this.queryForm.pageNo = 1
+        this.fetchData()
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.resetForm('queryForm')
+        this.fetchData()
+      },
+      async fetchData() {
+        this.listLoading = true
+        const { data } = await businessApi.getList(this.queryForm)
+        const { list, total } = data
+        this.list = list
+        this.total = total
+        this.listLoading = false
+      },
+    },
+  }
+</script>