Browse Source

Merge branch 'dev' of http://git.echepei.com/caojunjie/Smart_platform_ui into dev

QuKatie 3 years ago
parent
commit
6eb06dbef9

+ 68 - 0
src/views/saleLeads/config/customerContact.json

@@ -0,0 +1,68 @@
+{
+  "stripe": true,
+  "searchShow": true,
+  "border": true,
+  "index": true,
+  "viewBtn": false,
+  "editBtn": false,
+  "addBtn": false,
+  "delBtn": false,
+  "align": "center",
+  "menuWidth": 120,
+  "refreshBtn": false,
+  "showSummary": true,
+  "summaryText": "合计",
+  "sumColumnList": [
+  ],
+  "column": [
+    {
+      "label": "日期",
+      "prop": "date",
+      "index": 1,
+      "width": 200,
+      "overHidden": true
+    },
+    {
+      "label": "内容",
+      "prop": "content",
+      "index": 2,
+      "width": 200,
+      "overHidden": true
+    },
+    {
+      "label": "客户联系人",
+      "prop": "attn",
+      "index": 3,
+      "width": 120,
+      "overHidden": true
+    },
+    {
+      "label": "联系方式",
+      "prop": "contact",
+      "index": 4,
+      "width": 120,
+      "overHidden": true
+    },
+    {
+      "label": "是否满足客户需求",
+      "prop": "satisfy",
+      "index": 5,
+      "width": 140,
+      "overHidden": true
+    },
+    {
+      "label": "人员",
+      "prop": "createUser",
+      "index": 6,
+      "width": 100,
+      "overHidden": true
+    },
+    {
+      "label": "创建时间",
+      "prop": "createTime",
+      "index": 6,
+      "width": 200,
+      "overHidden": true
+    }
+  ]
+}

+ 72 - 0
src/views/saleLeads/config/mainList.json

@@ -0,0 +1,72 @@
+{
+  "stripe": true,
+  "height": "auto",
+  "searchShow": true,
+  "border": true,
+  "index": true,
+  "viewBtn": false,
+  "editBtn": false,
+  "delBtn": false,
+  "addBtn": false,
+  "align": "center",
+  "menuWidth": "70",
+  "searchIcon": true,
+  "searchIndex": 2,
+  "selection": true,
+  "tip": false,
+  "searchSpan": 8,
+  "showSummary": true,
+  "summaryText": "合计",
+  "sumColumnList": [],
+  "column": [
+    {
+      "label": "客户名称",
+      "prop": "corpName",
+      "search": true,
+      "index": 1,
+      "minWidth": 80,
+      "overHidden": true
+    },
+    {
+      "label": "业务日期",
+      "prop": "b",
+      "type": "date",
+      "overHidden": true,
+      "minWidth": 200,
+      "format": "yyyy-MM-dd",
+      "valueFormat": "yyyy-MM-dd",
+      "unlinkPanels": true,
+      "searchRange": true,
+      "search": true
+    },
+    {
+      "label": "状态",
+      "prop": "state",
+      "overHidden": true,
+      "minWidth": 120,
+      "search": true,
+      "type": "select",
+      "dicData": [
+        {"label": "沟通中", "value": 0},
+        {"label": "成交", "value": 1},
+        {"label": "未成交", "value": 2}
+      ]
+    },
+    {
+      "label": "承揽人",
+      "prop": "createUser",
+      "search": true,
+      "index": 1,
+      "minWidth": 80,
+      "overHidden": true
+    },
+    {
+      "label": "对接人",
+      "prop": "oppositePerson",
+      "search": true,
+      "index": 1,
+      "minWidth": 80,
+      "overHidden": true
+    }
+  ]
+}

+ 488 - 0
src/views/saleLeads/detail.vue

@@ -0,0 +1,488 @@
+<template>
+  <div class="borderless" v-loading="pageLoading">
+    <div class="customer-head">
+      <div class="customer-back">
+        <el-button
+          type="danger"
+          style="border: none;background: none;color: red"
+          icon="el-icon-arrow-left"
+          @click="backToList"
+          :loading="btnLoading"
+        >返回列表</el-button>
+      </div>
+      <div class="add-customer-btn">
+        <el-button
+          type="primary"
+          size="small"
+          class="el-button--small-yh"
+          @click.stop="openEdit"
+        >编 辑</el-button>
+        <el-button
+          type="success"
+          :disabled="!form.id"
+          size="small"
+          @click="copyDoc"
+          :loading="btnLoading"
+        >复制单据</el-button>
+        <el-button
+          type="primary"
+          @click="editCustomer"
+          size="small"
+          :loading="btnLoading"
+        >保存数据</el-button>
+      </div>
+    </div>
+    <div class="customer-main">
+      <containerTitle title="基础信息"/>
+      <basic-container :showBtn="true">
+        <avue-form
+          ref="form"
+          class="trading-form"
+          v-model="form"
+          :option="option"
+        >
+          <template slot="corpId">
+            <crop-select
+              v-model="form.corpId"
+              @getCorpData="getKHData"
+              corpType="KH"
+            />
+          </template>
+          <template slot="createUser">
+            <el-select
+              v-model="form.createUser"
+              filterable
+              clearable
+              size="small"
+            >
+              <el-option
+                v-for="(item,index) in userList"
+                :key="index"
+                :label="item.realName"
+                :value="item.realName"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="oppositePerson">
+            <el-select
+              v-model="form.oppositePerson"
+              filterable
+              clearable
+              size="small"
+            >
+              <el-option
+                v-for="(item,index) in userList"
+                :key="index"
+                :label="item.realName"
+                :value="item.realName"
+              ></el-option>
+            </el-select>
+          </template>
+        </avue-form>
+      </basic-container>
+      <containerTitle title="沟通记录"/>
+      <basic-container>
+        <avue-crud
+          ref="crud"
+          :data="dataList"
+          :option="tableOption"
+          :cell-style="cellStyle"
+          @saveColumn="saveColumn"
+          @resetColumn="resetColumn"
+        >
+          <template slot="menuLeft">
+            <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="small"
+              @click.stop="newDetails"
+            >录入明细</el-button>
+            <el-button
+              type="info"
+              icon="el-icon-printer"
+              size="small"
+            >报 表</el-button>
+          </template>
+          <template slot="menu" slot-scope="{ row, index }">
+            <el-button
+              size="small"
+              icon="el-icon-edit"
+              type="text"
+              @click="rowCell(row, index)"
+            >{{ row.$cellEdit ? "保存" : "修改" }}</el-button>
+            <el-button
+              size="small"
+              icon="el-icon-delete"
+              type="text"
+              @click="rowDel(row, index)"
+            >删除</el-button>
+          </template>
+          <template slot="date" slot-scope="{ row, index }">
+            <el-date-picker
+              v-if="row.$cellEdit"
+              v-model="row.date"
+              type="date"
+              placeholder="选择日期"
+              size="small"
+              style="width: 100%"
+            ></el-date-picker>
+            <span v-else>{{row.date}}</span>
+          </template>
+          <template slot="content" slot-scope="{ row, index }">
+            <el-input
+              v-if="row.$cellEdit"
+              v-model="row.content"
+              size="small"
+              placeholder="输入内容"
+            />
+            <span v-else>{{row.content}}</span>
+          </template>
+          <template slot="attn" slot-scope="{ row, index }">
+            <el-input
+              v-if="row.$cellEdit"
+              v-model="row.attn"
+              size="small"
+              placeholder="输入客户联系人"
+            />
+            <span v-else>{{row.attn}}</span>
+          </template>
+          <template slot="contact" slot-scope="{ row, index }">
+            <el-input
+              v-if="row.$cellEdit"
+              v-model="row.contact"
+              size="small"
+              placeholder="输入联系方式"
+            />
+            <span v-else>{{row.contact}}</span>
+          </template>
+          <template slot="satisfy" slot-scope="{ row, index }">
+            <el-switch
+              v-model="row.satisfy"
+              :disabled="!row.$cellEdit"
+              :inactive-value="0"
+              :active-value="1"
+            ></el-switch>
+          </template>
+        </avue-crud>
+      </basic-container>
+    </div>
+  </div>
+</template>
+
+<script>
+import tableOption from "./config/customerContact.json";
+import {
+  isDiscount,
+  isPercentage,
+  micrometerFormat,
+  IntegerFormat
+} from "@/util/validate";
+import { gainUser } from "@/api/basicData/customerInquiry";
+import {getUserInfo} from "@/api/system/user";
+import {getDeptTree} from "@/api/system/dept";
+import { getCurrentDate } from "@/util/date";
+
+export default {
+  name: "detail",
+  data() {
+    const validateRemark = (rule, value, callback) => {
+      if (this.form.state == 2 && !this.form.orderRemark) {
+        callback(new Error('备注不能为空'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      pageLoading: false,
+      btnLoading: false,
+      form: {},
+      option: {
+        menuBtn: false,
+        labelWidth: 100,
+        column: [
+          {
+            label: "客户名称",
+            prop: "corpId",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "change"
+              }
+            ],
+            span: 8,
+            slot: true,
+          },
+          {
+            label: "客户联系人",
+            prop: "corpr",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "blur"
+              }
+            ],
+            span: 8,
+            slot: true,
+          },
+          {
+            label: "客户电话",
+            prop: "corpTel",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "blur"
+              }
+            ],
+            span: 8,
+            slot: true,
+            type: 'number',
+            controls: false,
+            mock: {
+              type: 'number',
+              precision: 0,
+            },
+          },
+          {
+            label: "业务内容",
+            prop: "businessContent",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "blur"
+              }
+            ],
+            span: 8,
+            slot: true,
+          },
+          {
+            label: "业务日期",
+            prop: "b",
+            span: 8,
+            type: "date",
+            format: "yyyy-MM-dd",
+            valueFormat: "yyyy-MM-dd 00:00:00",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "承揽人",
+            prop: "createUser",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "change"
+              }
+            ],
+            span: 8,
+            slot: true,
+          },
+          {
+            label: "对接人",
+            prop: "oppositePerson",
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "change"
+              }
+            ],
+            span: 8,
+            slot: true,
+          },
+          {
+            label: "状态",
+            prop: "state",
+            span: 8,
+            type: 'select',
+            dicData: [
+              {label: '沟通中', value: 0},
+              {label: '成交', value: 1},
+              {label: '未成交', value: 2},
+            ],
+            rules: [
+              {
+                required: true,
+                message: " ",
+                trigger: "change"
+              }
+            ],
+          },
+          {
+            label: "备注",
+            prop: "orderRemark",
+            type: "textarea",
+            minRows: 2,
+            span: 24,
+            rules: [
+              {validator: validateRemark, trigger: 'blur'}
+            ]
+          },
+        ],
+      },
+      dataList: [],
+      tableOption: {},
+      goodsoptions: [],
+      unitOption: [],
+      selectionList: [],
+      search: {},
+      treeStyle: "height:" + (window.innerHeight - 315) + "px",
+      goodsOption: {},
+      loading: false,
+      switchDialog: false, // 报表弹窗控制
+      userList: [],
+      dic: [],
+      loginUser: '', // 登录人
+    }
+  },
+  async created() {
+    this.$set(this.form, 'b', getCurrentDate()); // 默认当前日期
+    this.tableOption = await this.getColumnData(
+      this.getColumnName(102),
+      tableOption
+    );
+    gainUser().then(res => {
+      this.userList = res.data.data;
+    });
+    getUserInfo().then(res => {
+      this.$set(this.form, 'createUser', res.data.data.realName);
+      this.$set(this.form, 'oppositePerson', res.data.data.realName);
+      this.loginUser = res.data.data.realName;
+    })
+    getDeptTree().then(res => {
+      this.dic = res.data.data
+    })
+    this.getWorkDicts('unit').then(res => {
+      this.unitOption = res.data.data;
+    })
+  },
+  filters: {
+    IntegerFormat(num) {
+      return IntegerFormat(num);
+    },
+    decimalFormat(num) {
+      return num ? Number(num).toFixed(2) : "0.00";
+    }
+  },
+  methods: {
+    //返回列表
+    backToList() {
+      this.$emit("goBack");
+    },
+    // 编辑按钮触发
+    openEdit() {},
+    // 复制
+    copyDoc() {
+      this.$emit("copyOrder", this.form.id);
+    },
+    //修改提交触发
+    editCustomer(status) {
+      this.$refs["form"].validate((valid, done) => {
+        done();
+        if (valid) {
+          // this.btnLoading = true;
+          // typeSave(this.form).then(res => {
+          //   this.$message({type: "success", message: this.form.id ? "修改成功!" : "新增成功!"});
+          //   this.queryData(res.data.data.id);
+          // }).finally(() => {
+          //   this.btnLoading = false;
+          // })
+        } else {
+          return false
+        }
+      })
+    },
+    cellStyle() {
+      return "padding:0;height:40px;";
+    },
+    async saveColumn() {
+      const inSave = await this.saveColumnData(
+        this.getColumnName(102),
+        this.tableOption
+      );
+      if (inSave) {
+        this.$message.success("保存成功");
+        //关闭窗口
+        this.$refs.crud.$refs.dialogColumn.columnBox = false;
+        this.$nextTick(() => {
+          this.$refs.crud.doLayout()
+        })
+      }
+    },
+    async resetColumn() {
+      this.tableOption = tableOption;
+      const inSave = await this.delColumnData(
+        this.getColumnName(102),
+        tableOption
+      );
+      if (inSave) {
+        this.$nextTick(() => {
+          this.$refs.crud.doLayout()
+        })
+        this.$message.success("重置成功");
+        //关闭窗口
+        setTimeout(() => {
+          this.$refs.crud.$refs.dialogColumn.columnBox = false;
+        }, 1000);
+      }
+    },
+    //录入明细
+    newDetails() {
+      this.$refs["form"].validate((valid, done) => {
+        done()
+        if (valid) {
+          this.dataList.push({
+            createTime: getCurrentDate('date'),
+            createUser: this.loginUser,
+            $cellEdit: true,
+          })
+        }
+      })
+    },
+    rowCell(row, index) {
+      if (row.$cellEdit == true) {
+        this.$set(row, "$cellEdit", false);
+      } else {
+        this.$set(row, "$cellEdit", true);
+      }
+    },
+    rowDel(row, index) {
+      this.$confirm("确定删除数据?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        if (row.id) {
+          // removeGoods(row.id).then(res => {
+          //   this.$message({
+          //     type: 'success',
+          //     message: '删除成功!'
+          //   })
+          //   this.dataList.splice(row.$index, 1);
+          // })
+        } else {
+          this.$message({
+            type: "success",
+            message: "删除成功!"
+          });
+          this.dataList.splice(row.$index, 1);
+        }
+      });
+    },
+    getKHData(row) {},
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 249 - 0
src/views/saleLeads/index.vue

@@ -0,0 +1,249 @@
+<template>
+  <div>
+    <basic-container v-show="show" class="page-crad">
+      <avue-crud
+        ref="crud"
+        :option="option"
+        :data="dataList"
+        v-model="form"
+        :page.sync="page"
+        :search.sync="search"
+        :table-loading="loading"
+        :cell-style="cellStyle"
+        @selection-change="selectionChange"
+        @search-change="searchChange"
+        @current-change="currentChange"
+        @size-change="sizeChange"
+        @refresh-change="refreshChange"
+        @on-load="onLoad"
+        @search-criteria-switch="searchCriteriaSwitch"
+        @saveColumn="saveColumn"
+        @resetColumn="resetColumn"
+      >
+        <template slot="menuLeft">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="small"
+            @click.stop="newAdd()"
+          >创建单据</el-button>
+          <el-button
+            type="success"
+            size="small"
+            icon="el-icon-plus"
+            @click.stop="copyDoc()"
+            :disabled="selection.length != 1"
+          >复制单据</el-button>
+        </template>
+        <template slot-scope="scope" slot="menu">
+          <el-button
+            type="text"
+            icon="el-icon-delete"
+            size="small"
+            @click.stop="rowDel(scope.row, scope.index)"
+            :disabled="scope.row.status == 3"
+          >删除
+          </el-button>
+        </template>
+        <template slot="corpNameSearch">
+          <crop-select
+            v-model="search.corpId"
+            corpType="KH"
+          ></crop-select>
+        </template>
+        <template slot="createUserSearch">
+          <el-select
+            v-model="search.createUser"
+            filterable
+            clearable
+            placeholder="请选择 承揽人"
+          >
+            <el-option
+              v-for="(item, index) in contractorOption"
+              :key="index"
+              :value="item.realName"
+              :label="item.realName"
+            ></el-option>
+          </el-select>
+        </template>
+        <template slot="oppositePersonSearch">
+          <el-select
+            v-model="search.oppositePerson"
+            filterable
+            clearable
+            placeholder="请选择 承揽人"
+          >
+            <el-option
+              v-for="(item, index) in oppositePersonOption"
+              :key="index"
+              :value="item.realName"
+              :label="item.realName"
+            ></el-option>
+          </el-select>
+        </template>
+      </avue-crud>
+    </basic-container>
+    <detail-page
+      @goBack="goBack"
+      @copyOrder="copyOrder"
+      :detailData="detailData"
+      v-if="!show"
+    />
+  </div>
+</template>
+
+<script>
+import option from "./config/mainList.json";
+import detailPage from "./detail";
+import { gainUser } from "@/api/basicData/customerInquiry";
+
+export default {
+  name: "index",
+  components: {
+    detailPage,
+  },
+  data() {
+    return {
+      option: {},
+      dataList: [],
+      form: {},
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0,
+        pageSizes: [10, 50, 100, 200, 300, 400, 500]
+      },
+      search: {},
+      show: true,
+      loading: false,
+      selection: [],
+      detailData: {},
+      contractorOption: [],
+      oppositePersonOption: [],
+    }
+  },
+  async created() {
+    this.option = await this.getColumnData(this.getColumnName(101), option);
+    gainUser().then(res => {
+      this.contractorOption = res.data.data;
+      this.oppositePersonOption = res.data.data;
+    })
+  },
+  methods: {
+    searchCriteriaSwitch(type) {
+      // if (type){
+      //   this.option.height =  this.option.height - 90
+      // }else {
+      //   this.option.height =  this.option.height + 90
+      // }
+      // this.$refs.crud.getTableHeight()
+    },
+    newAdd() {
+      this.show = false;
+    },
+    onLoad(page, params) {
+      // 重置掉展开
+      this.dataList.forEach(item => {
+        this.$refs.crud.toggleRowExpansion(item, false)
+      })
+      let queryParams = Object.assign({}, params, {
+        size: page.pageSize,
+        current: page.currentPage,
+      })
+      // this.loading = true;
+      // getSalesList(queryParams).then(res => {
+      //   this.dataList = res.data.data.records;
+      //   this.page.total = res.data.data.total;
+      //   this.option.height = window.innerHeight - 240;
+      //   this.$nextTick(() => {
+      //     this.$refs.crud.doLayout()
+      //   })
+      // }).finally(() => {
+      //   this.loading = false;
+      // })
+    },
+    async saveColumn() {
+      const inSave = await this.saveColumnData(
+        this.getColumnName(101),
+        this.option
+      );
+      if (inSave) {
+        this.$message.success("保存成功");
+        //关闭窗口
+        this.$refs.crud.$refs.dialogColumn.columnBox = false;
+        this.$nextTick(() => {
+          this.$refs.crud.doLayout()
+        })
+      }
+    },
+    async resetColumn() {
+      this.option = option;
+      const inSave = await this.delColumnData(this.getColumnName(101), option);
+      if (inSave) {
+        this.$nextTick(() => {
+          this.$refs.crud.doLayout()
+        })
+        this.$message.success("重置成功");
+        this.$refs.crud.$refs.dialogColumn.columnBox = false;
+      }
+    },
+    //点击搜索按钮触发
+    searchChange(params, done) {
+      this.onLoad(this.page, params);
+      done();
+    },
+    currentChange(val) {
+      this.page.currentPage = val;
+    },
+    sizeChange(val) {
+      this.page.currentPage = 1;
+      this.page.pageSize = val;
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.search);
+    },
+    cellStyle() {
+      return "padding:0;height:40px;";
+    },
+    copyDoc() {},
+    selectionChange(list) {
+      this.selection = list;
+    },
+    goBack() {
+      if (this.$route.query.id) {
+        this.$router.$avueRouter.closeTag(this.$route.fullPath);
+        this.$router.push({
+          path: "/dealer/sales/index"
+        });
+      }
+      this.detailData = this.$options.data().detailData;
+      this.show = true;
+      this.onLoad(this.page, this.search);
+    },
+    copyOrder(id) {
+      this.show = true;
+      this.detailData = {
+        id: id,
+        status: "copy"
+      };
+      this.$nextTick(() => {
+        this.show = false;
+      });
+    },
+    contractorRemoteMethod(name) {
+      gainUser({realName: name}).then(res => {
+        this.contractorOption = res.data.data;
+      })
+    },
+    oppositePersonRemoteMethod(name) {
+      gainUser({realName: name}).then(res => {
+        this.oppositePerson = res.data.data;
+      })
+    },
+  },
+}
+</script>
+
+<style scoped>
+
+</style>